.github/000077500000000000000000000000001516072260400124215ustar00rootroot00000000000000.github/workflows/000077500000000000000000000000001516072260400144565ustar00rootroot00000000000000.github/workflows/build.yml000066400000000000000000000025701516072260400163040ustar00rootroot00000000000000# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions name: build on: schedule: - cron: '0 0 1 * *' push: branches: [ master ] pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest strategy: matrix: node-version: ['lts/*'] #php-versions: ['8.0', '8.1'] php-versions: ['8.1'] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - run: npm i -g grunt-cli - run: npm install - run: grunt - uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-versions }} coverage: xdebug - name: tests run: | composer install --no-progress --ignore-platform-reqs XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-text .gitignore000066400000000000000000000006601516072260400130530ustar00rootroot00000000000000cache/ vendor/ build/ *.diff *.err *.orig *.log *.rej *.swo *.swp *.zip *.vi *~ *.sass-cache .DS_Store ._* Thumbs.db .cache node_modules /config.ini /git-test /git-test2 /bower_components .idea/workspace.xml .idea/tasks.xml .idea/profiles_settings.xml .idea/inspectionProfiles/Project_Default.xml .idea/inspectionProfiles/profiles_settings.xml node_modules/.yarn-integrity /public/prod /src/twig/layout.twig .phpunit.result.cache .ncurc.json000066400000000000000000000001541516072260400131440ustar00rootroot00000000000000{ "reject": [ "jquery", "bootswatch", "bootstrap", "codemirror" ] } .npmrc000066400000000000000000000001051516072260400121750ustar00rootroot00000000000000https://registry.npmjs.org/= registry=https://registry.npmjs.org/ .vscode/000077500000000000000000000000001516072260400124225ustar00rootroot00000000000000.vscode/launch.json000066400000000000000000000012231516072260400145650ustar00rootroot00000000000000{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "outputCapture": "std", "type": "node", "request": "launch", "name": "npm run watch", "args": [ "run", "watch" ], "skipFiles": [ "/**" ], "cwd": "${workspaceRoot}", "program": "/usr/bin/npm" } ] }Dockerfile000066400000000000000000000025371516072260400130620ustar00rootroot00000000000000#docker login #docker build -t patrikx3/p3x-gitlist . ##docker tag IMAGE_ID patrikx3/p3x-gitlist:latest #docker push patrikx3/p3x-gitlist:latest #docker tag IMAGE_ID patrikx3/p3x-gitlist:2019.10.525 #docker push patrikx3/p3x-gitlist #docker images #docker rmi -f IMAGE_ID FROM ubuntu:latest MAINTAINER patrikx3/p3x-gitlist - Patrik Laszlo ENV COMPOSER_PROCESS_TIMEOUT=3600 ENV DEBIAN_FRONTEND=noninteractive #ENV P3XRS_DOCKER_HOME=/settings RUN apt-get -y update RUN apt-get -y install git RUN apt-get -y install php --allow-unauthenticated RUN apt-get -y install php-fpm --allow-unauthenticated RUN apt-get -y install nginx RUN apt-get -y install curl RUN apt-get -y install git RUN apt-get -y install composer #RUN apt-get install -y build-essential # node RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - RUN apt-get -y install nodejs RUN node -v ADD ./build/p3x-gitlist /gitlist RUN mkdir -p /run/php RUN echo "cgi.fix_pathinfo = 0;" >> /etc/php/7.4/fpm/php.ini RUN echo "max_input_vars = 10000;" >> /etc/php/7.4/fpm/php.ini RUN echo "max_execution_time = 10000;" >> /etc/php/7.4/fpm/php.ini RUN echo "date.timezone = Europe/Budapest;" >> /etc/php/7.4/fpm/php.ini RUN sed -i 's/;daemonize = yes/daemonize = no/g' /etc/php/7.4/fpm/php-fpm.conf RUN chown -R www-data:www-data /gitlist RUN chown -R www-data:www-data /var/git EXPOSE 12345 #CMD p3x-redis Gruntfile.js000077500000000000000000000062731516072260400133710ustar00rootroot00000000000000const fsExtra = require('fs-extra'); const path = require('path'); module.exports = function (grunt) { const prodDir = JSON.parse(require('fs').readFileSync('./package.json')).corifeus["prod-dir"] grunt.loadNpmTasks('grunt-contrib-less'); const builder = require(`corifeus-builder`); const gruntUtil = builder.utils; const loader = new builder.loader(grunt); const lessConfig = require('./src/browser/grunt/less').lessSettings(grunt) loader.js({ replacer: { type: 'p3x', node: false, }, config: { clean: { generated: [ `public/${prodDir}/css`, `public/${prodDir}/twemoji`, `public/${prodDir}/webpack`, ], css: [ ] /* themes: [ themeDir ], fonts: [ 'public/fonts' ] */ }, copy: { tweomji: { files: [ { cwd: 'node_modules/twemoji/2/svg', expand: true, src: [ '**', ], dest: `./public/${prodDir}/twemoji/svg` }, ] }, }, less: { development: lessConfig, }, watch: { less: { files: ['src/browser/less/*.*'], tasks: ['clean:css', 'less'], options: { atBegin: true, //spawn: false, }, }, } } }); grunt.registerTask('wait-empty', async function() { const done = this.async() setTimeout(() => { const deleteMe = path.resolve(`${process.cwd()}/public/prod/webpack`) console.log(deleteMe) fsExtra.emptyDirSync(deleteMe) done() }, 5000) }) grunt.registerTask('build', async function() { const done = this.async() const cwd = process.cwd() try { await gruntUtil.spawn({ grunt: grunt, gruntThis: this, }, { cmd: `${cwd}/node_modules/.bin/webpack${gruntUtil.commandAddon}`, args: [ '--mode=production', ] }); done() } catch(e) { done(e) } }) // grunt.registerTask('default', ['clean', 'less', 'copy', 'cory-npm', 'cory-replace', 'build']); grunt.registerTask('default', ['cory-npm', 'cory-replace', 'wait-empty', 'clean', 'less', 'copy', 'build']); grunt.registerTask('default-less', [ 'cory-npm', 'clean', 'less', 'copy','cory-replace']); }; INSTALL.md000066400000000000000000000104661516072260400125200ustar00rootroot00000000000000[//]: #@corifeus-header # 🤖 P3X Gitlist - A decorated enhanced elegant, feature rich and modern private git ui repository viewer [//]: #@corifeus-header:end # GitList Installation * Download GitList from [https://github.com/patrikx3/gitlist/releases](https://github.com/patrikx3/gitlist/releases/) and decompress to your `/var/www/gitlist` folder, or anywhere else you want to place GitList. * Rename the `config.example.ini-example` file to `config.ini`. * Open up the `config.ini` and configure your installation. You'll have to provide where your repositories are located and the base GitList URL. * Create the cache folder and give read/write permissions to your web server user: ```bash cd /var/www/gitlist mkdir -p cache chmod 777 cache ``` That's it, installation complete! ## Webserver configuration Apache is the "default" webserver for GitList. You will find the configuration inside the `.htaccess` file. However, nginx and lighttpd are also supported. To make it to be more secure: All `PHP` files will be in the `root` and only `index.php`, `images`, `icons`, `svg`, `css`, `js`bundle files will be in the `public` subdir. ### nginx server.conf ```conf server { server_name MYSERVER; access_log /var/log/nginx/MYSERVER.access.log combined; error_log /var/log/nginx/MYSERVER.error.log error; root /var/www/DIR/public; index index.php; # auth_basic "Restricted"; # auth_basic_user_file .htpasswd; location = /robots.txt { allow all; log_not_found off; access_log off; } location ~* ^/index.php.*$ { fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # if you're using php7.2-fpm via socket fastcgi_pass unix:/var/run/php7.2-fpm.sock; include snippets/fastcgi-php.conf;; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass $php_listener; } location ~ /\.ht { deny all; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { add_header Vary "Accept-Encoding"; expires max; try_files $uri @gitlist; tcp_nodelay off; tcp_nopush on; } # location ~* \.(git|svn|patch|htaccess|log|route|plist|inc|json|pl|po|sh|ini|sample|kdev4)$ { # deny all; # } } ``` ### lighthttpd I do not use `lighthttpd`, but you know what I mean. Make sure only, the `gitlist/public` folder should be enabled. ```txt # GitList is located in /var/www/gitlist/ server.document-root = "/var/www" url.rewrite-once = ( "^/gitlist/web/.+" => "$0", "^/gitlist/favicon\.ico$" => "$0", "^/gitlist(/[^\?]*)(\?.*)?" => "/gitlist/index.php$1$2" ) ``` ### hiawatha I do not use `hiawatha`, but you know what I mean. Make sure only, the `gitlist/public` folder should be enabled. ```txt UrlToolkit { ToolkitID = gitlist RequestURI isfile Return # If you have example.com/gitlist/ ; Otherwise remove "/gitlist" below Match ^/gitlist/.* Rewrite /gitlist/index.php Match ^/gitlist/.*\.ini DenyAccess } ``` [//]: #@corifeus-footer --- 🙏 This is an open-source project. Star this repository, if you like it, or even donate to maintain the servers and the development. Thank you so much! Possible, this server, rarely, is down, please, hang on for 15-30 minutes and the server will be back up. All my domains ([patrikx3.com](https://patrikx3.com) and [corifeus.com](https://corifeus.com)) could have minor errors, since I am developing in my free time. However, it is usually stable. **Note about versioning:** Versions are cut in Major.Minor.Patch schema. Major is always the current year. Minor is either 4 (January - June) or 10 (July - December). Patch is incremental by every build. If there is a breaking change, it should be noted in the readme. --- [**P3X-GITLIST**](https://corifeus.com/gitlist) Build v2024.4.105 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [//]: #@corifeus-footer:end LICENSE000066400000000000000000000051741516072260400120750ustar00rootroot00000000000000MIT License Copyright (c) 2019 Patrik Laszlo / patrikx3 / https://patrikx3.com and contributors 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. ------------------------------------------------------------------------------ Copyright (c) 2012-2015, Klaus Silveira and contributors All rights reserved. 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 name of GitList 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 HOLDER 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. README.md000066400000000000000000000140321516072260400123400ustar00rootroot00000000000000[//]: #@corifeus-header [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://paypal.me/patrikx3) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Corifeus @ Facebook](https://img.shields.io/badge/Facebook-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [![Uptime Robot ratio (30 days)](https://img.shields.io/uptimerobot/ratio/m780749701-41bcade28c1ea8154eda7cca.svg)](https://stats.uptimerobot.com/9ggnzcWrw) # 🤖 P3X Gitlist - A decorated enhanced elegant, feature rich and modern private git ui repository viewer v2024.4.105 **Bugs are evident™ - MATRIX️** # Description [//]: #@corifeus-header:end P3X Enhanced GitList is a fork of the klaussilveira Gitlist. What is different about is, that it requires/uses the latest PHP version, works with sub-modules. With big git repos/commits, it works with 64Mb memory (some Twig templates are removed and moved to the client and web workers - eg. huge diffs). You will love it to work it on OpenWrt. Provides multiple themes with dark mode - 11 light and 5 dark. Code editor with syntax highlighting, editable files. All changes in the original fork are synced with the enhanced version. 100% responsive with Bootstrap 3. Latest Fontawesome for icons. The markdown engine uses Emojis with Twitter's Emojis. Besides, the commits and logs are parsed as Markdown and Emojis. **Works on PHP 8.1** **It works on CodeMirror 5** ## Beware If you use other, than UTF-8 encoded files, you could get incorrect results, as it does not do converting, it only works with UTF-8. # Live demo [https://gitlist.patrikx3.com/](https://gitlist.patrikx3.com/) [Screenshots](artifacts/screenshots.md) # Releases [https://github.com/patrikx3/gitlist/releases](https://github.com/patrikx3/gitlist/releases) ### NGINX gitlist.patrikx3.com configs This is a complete config that uses NGINX, LETSENCRYPT (using https://acme.sh) and the **git-http-backend**. This parse only the `public/index.php` file, no other PHP files, so that they are editable in `Decorated P3X GitList` as in the live demo. [gitlist.patrikx3.com.conf](artifacts/gitlist.patrikx3.com.conf) ## FYI [Change log](change-log.md) [TODO](todo.md) [Change breaking code](change-break.md) # Development To make it easier to develop Gitter and GitList, we unified the two code into one. ## Requirements By now `composer` is not enough. We are using `webpack`, `less`, `grunt` ... For the build on your workstation (less, Bootstrap themes, and webpack): * ```NodeJs``` >= 12 * https://nodejs.org/en/download/package-manager/ * ```Grunt``` (npm install -g npm grunt-cli) * `Composer` In order to run GitList on your server, you'll need: * ```git``` * ```Apache``` with ```mod_rewrite``` enabled or ```nginx``` - preferred * ```PHP``` >= 7.1 ## So, by hand If you have Composer in your path, things get easier. But you know the drill. If want to get the project dependencies, and build everything: ```bash # ubuntu # https://github.com/nodesource/distributions/blob/master/README.md#debinstall curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - sudo apt-get install -y nodejs git clone https://github.com/patrikx3/gitlist.git curl -s http://getcomposer.org/installer | php php composer.phar install # i use Node latest usually and NPM sudo npm install -g npm grunt-cli npm install # create some simple GIT repos # create a test config.ini ./scripts/init.sh # if you do not want to create a release # just work on it # now the js and css is built on the fly # in the ./public folder npm run watch # you might need the zip program # to create release sudo apt install -y zip # if you have bash and want to create a full release # and strip all unneeded files, # optimize the packagist vendor folder # you might need zip from linux # and the zip is in the ./build/p3x-gitlist-a.b.c.zip file ./scripts/release.sh ``` # Old info [Original install information, although some new info is included](INSTALL.md) - here. https://github.com/klaussilveira/gitlist ### Last merge from `klaussilveira` #### Gitlist https://github.com/klaussilveira/gitlist/commits/master Sept 7, 2021 #### Gitter https://github.com/klaussilveira/gitter/commits/master Sept 7, 2021 # URL links [P3X Gitlist playground](https://www.patrikx3.com/en/front/playground/17/p3x-gitlist#PG17) [Corifeus P3X Gitlist](https://corifeus.com/gitlist/) [AlternativeTo Gitlist](https://alternativeto.net/software/p3x-gitlist/) [Github.io Gitlist](https://patrikx3.github.io/gitlist/) [Git Wiki Kernel Web Interfaces](https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools#Web_Interfaces) [//]: https://betapage.co/startup/p3x-gitlist [//]: #@corifeus-footer --- 🙏 This is an open-source project. Star this repository, if you like it, or even donate to maintain the servers and the development. Thank you so much! Possible, this server, rarely, is down, please, hang on for 15-30 minutes and the server will be back up. All my domains ([patrikx3.com](https://patrikx3.com) and [corifeus.com](https://corifeus.com)) could have minor errors, since I am developing in my free time. However, it is usually stable. **Note about versioning:** Versions are cut in Major.Minor.Patch schema. Major is always the current year. Minor is either 4 (January - June) or 10 (July - December). Patch is incremental by every build. If there is a breaking change, it should be noted in the readme. --- [**P3X-GITLIST**](https://corifeus.com/gitlist) Build v2024.4.105 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [//]: #@corifeus-footer:end _config.yml000066400000000000000000000000321516072260400132030ustar00rootroot00000000000000theme: jekyll-theme-slate artifacts/000077500000000000000000000000001516072260400130415ustar00rootroot00000000000000artifacts/config.ini000066400000000000000000000045571516072260400150220ustar00rootroot00000000000000[git] client = '/usr/bin/git' ; Your git executable path default_branch = 'master' ; Default branch when HEAD is detached repositories[] = '../git-test' ; Path to your repositories ; If you wish to add more repositories, just add a new line ; WINDOWS USERS ;client = '"C:\Program Files (x86)\Git\bin\git.exe"' ; Your git executable path ;repositories[] = 'C:\Path\to\Repos\' ; Path to your repositories ; You can hide repositories from GitList, just copy this for each repository you want to hide ; hidden[] = '/home/git/repositories/BetaTest' strip_dot_git = false ; Remove usual bare repo .git extension from displayed name [app] debug = false cache = false title = "" enable_editing = false ; big files can block the browser in code mirror, so there is a limit codemirror_full_limit = 48 ; if fixed_navbar = true -> the navbar is fixed ; if fixed_navbar = false -> the navbar is scrolling with the rest of the page fixed_navbar = true ; if repo_paging is 0, paging is disabled repo_paging = 10 [clone_button] ; ssh remote show_ssh_remote = true ; display remote URL for SSH ssh_user = 'git' ; user to use for cloning via SSH ssh_user_dynamic = false ; when enabled, ssh_user is set to $_SERVER['PHP_AUTH_USER'] ; if cloning via GIT ; we cannot find out the subdir ; so we have to add this git clone subdir ; eg ssh_clone_subdir = '/var/git/repository/' ssh_clone_subdir = '/var/git/repository/' ; http remote show_http_remote = true ; display remote URL for HTTP use_https = true ; generate URL with https:// ; if git_http_subdir is: ; true = it calculates to actual route/nested path by itself for the http clone button git_http_subdir_calculated = true ; if git_http_subdir_calculated is false, then as the path is used as git_http_subdir variable git_http_subdir = '/git-http-subdir' ; has to end with trailing slash http_user = '' ; user to use for cloning via HTTP (default: none) http_user_dynamic = false ; when enabled, http_user is set to $_SERVER['PHP_AUTH_USER'] ; If you need to specify custom filetypes for certain extensions, do this here [filetypes] ; extension = type ; dist = xml ; If you need to set file types as binary or not, do this here [binary_filetypes] ; extension = true ; svh = false ; map = true ; set the timezone [date] timezone = Europe/Budapest format = 'Y.m.d. H:i:s' ; custom avatar service [avatar] ; url = '//gravatar.com/avatar/' ; query[] = 'd=identicon' artifacts/config.windows.ini000066400000000000000000000045561516072260400165120ustar00rootroot00000000000000[git] ;client = '/usr/bin/git' ; Your git executable path default_branch = 'master' ; Default branch when HEAD is detached ;repositories[] = '../git-test' ; Path to your repositories ; If you wish to add more repositories, just add a new line ; WINDOWS USERS client = 'C:\Program Files\Git\bin\git.exe' ; Your git executable path repositories[] = 'C:\Users\patrikx3\Projects\patrikx3\gitlist-workspace\gitlist\git-test' ; Path to your repositories ; You can hide repositories from GitList, just copy this for each repository you want to hide ; hidden[] = '/home/git/repositories/BetaTest' strip_dot_git = false ; Remove usual bare repo .git extension from displayed name [app] debug = false cache = false title = "P3X Gitlist Windows" ; big files can block the browser in code mirror, so there is a limit codemirror_full_limit = 48 ; if fixed_navbar = true -> the navbar is fixed ; if fixed_navbar = false -> the navbar is scrolling with the rest of the page fixed_navbar = true ; if repo_paging is 0, paging is disabled repo_paging = 10 [clone_button] ; ssh remote show_ssh_remote = true ; display remote URL for SSH ssh_user = 'git' ; user to use for cloning via SSH ssh_user_dynamic = false ; when enabled, ssh_user is set to $_SERVER['PHP_AUTH_USER'] ; if cloning via GIT ; we cannot find out the subdir ; so we have to add this git clone subdir ; eg ssh_clone_subdir = '/var/git/repository/' ssh_clone_subdir = '' ; http remote show_http_remote = true ; display remote URL for HTTP use_https = true ; generate URL with https:// ; true = it calculates to actual route/nested path by itself for the http clone button git_http_subdir_calculated = true ; if git_http_subdir_calculated is false, then as the path is used as git_http_subdir variable git_http_subdir = '/git-http-subdir' ; has to end with trailing slash http_user = '' ; user to use for cloning via HTTP (default: none) http_user_dynamic = false ; when enabled, http_user is set to $_SERVER['PHP_AUTH_USER'] ; If you need to specify custom filetypes for certain extensions, do this here [filetypes] ; extension = type ; dist = xml ; If you need to set file types as binary or not, do this here [binary_filetypes] ; extension = true ; svh = false ; map = true ; set the timezone [date] timezone = Europe/Budapest format = 'Y.m.d. H:i:s' ; custom avatar service [avatar] ; url = '//gravatar.com/avatar/' ; query[] = 'd=identicon' artifacts/gitlist.patrikx3.com.conf000066400000000000000000000060041516072260400177100ustar00rootroot00000000000000server { listen 80 ; listen [::]:80 ; server_name gitlist.patrikx3.com; error_log /var/log/nginx/gitlist.patrikx3.com-error.log; access_log /var/log/nginx/gitlist.patrikx3.com-access.log combined; root /var/www/gitlist.patrikx3.com/public; location ~ /.well-known { auth_basic off; auth_pam off; allow all; root /var/www/acme-challenge; } location = /robots.txt { allow all; log_not_found off; access_log off; } return 301 https://$host$request_uri; } server { ssl on; listen 443 ssl http2; listen [::]:443 ssl http2; server_name gitlist.patrikx3.com; error_log /var/log/nginx/gitlist.patrikx3.com-error.log; access_log /var/log/nginx/gitlist.patrikx3.com-access.log combined; root /var/www/gitlist.patrikx3.com/public; ssl_certificate /root/acme/ssl/patrikx3.com/fullchain.cer; ssl_certificate_key /root/acme/ssl/patrikx3.com/patrikx3.com.key; # it uses the built in Linux security called PAM, # but you could use a # auth_basic on; # auth_basic_user_file /etc/nginx/.htpasswd; auth_pam "Restricted"; auth_pam_service_name "nginx"; limit_req zone=default_limit burst=1000; limit_conn default_limit_conn 100; location ~ /.well-known { auth_basic off; auth_pam off; allow all; root /var/www/acme-challenge; } location = /robots.txt { allow all; log_not_found off; access_log off; } set $x_frame_options_policy 'self'; add_header Strict-Transport-Security "max-age=31536000; " always; add_header X-Frame-Options "ALLOW-FROM gitlist.patrikx3.com"; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header Content-Security-Policy "frame-ancestors $x_frame_options_policy"; index index.php; location / { autoindex on; set $redirect_url $uri; try_files $uri $uri/ /index.php$is_args$query_string; } location = /index.php { include snippets/fastcgi-php.conf; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_pass unix:/var/run/php/php8.0-fpm-git.sock; } # static repo files for cloning over https location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ { root /my/git/repos; } # requests that need to go to git-http-backend location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ { proxy_read_timeout 900; fastcgi_read_timeout 900; uwsgi_read_timeout 900; client_max_body_size 20G; root /my/git/repos; fastcgi_pass unix:/var/run/fcgiwrap-git.socket; fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; fastcgi_param PATH_INFO $uri; fastcgi_param GIT_PROJECT_ROOT $document_root; fastcgi_param GIT_HTTP_EXPORT_ALL ""; fastcgi_param REMOTE_USER $remote_user; include fastcgi_params; } } artifacts/php-7.2-ubuntu.md000066400000000000000000000031611516072260400157770ustar00rootroot00000000000000[//]: #@corifeus-header # 🤖 P3X Gitlist - A decorated enhanced elegant, feature rich and modern private git ui repository viewer [//]: #@corifeus-header:end # Install PHP 7.2 on Ubuntu before Bionic ```bash sudo add-apt-repository ppa:ondrej/php # enter (empty) sudo apt update sudo apt install -y php7.2 sudo apt upgrade -y ``` [//]: #@corifeus-footer --- 🙏 This is an open-source project. Star this repository, if you like it, or even donate to maintain the servers and the development. Thank you so much! Possible, this server, rarely, is down, please, hang on for 15-30 minutes and the server will be back up. All my domains ([patrikx3.com](https://patrikx3.com) and [corifeus.com](https://corifeus.com)) could have minor errors, since I am developing in my free time. However, it is usually stable. **Note about versioning:** Versions are cut in Major.Minor.Patch schema. Major is always the current year. Minor is either 4 (January - June) or 10 (July - December). Patch is incremental by every build. If there is a breaking change, it should be noted in the readme. --- [**P3X-GITLIST**](https://corifeus.com/gitlist) Build v2024.4.105 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [//]: #@corifeus-footer:end artifacts/screenshots.md000066400000000000000000000041441516072260400157260ustar00rootroot00000000000000[//]: #@corifeus-header # 🤖 P3X Gitlist - A decorated enhanced elegant, feature rich and modern private git ui repository viewer [//]: #@corifeus-header:end ![Screenshot 1](https://cdn.corifeus.com/git/gitlist/artifacts/screenshots/p3x-gitlist-1.jpeg) ![Screenshot 2](https://cdn.corifeus.com/git/gitlist/artifacts/screenshots/p3x-gitlist-2.jpeg) ![Screenshot 3](https://cdn.corifeus.com/git/gitlist/artifacts/screenshots/p3x-gitlist-3.jpeg) ![Screenshot 4](https://cdn.corifeus.com/git/gitlist/artifacts/screenshots/p3x-gitlist-4.jpeg) ![Screenshot 5](https://cdn.corifeus.com/git/gitlist/artifacts/screenshots/p3x-gitlist-5.jpeg) ![Screenshot 6](https://cdn.corifeus.com/git/gitlist/artifacts/screenshots/p3x-gitlist-6.jpeg) ![Screenshot 7](https://cdn.corifeus.com/git/gitlist/artifacts/screenshots/p3x-gitlist-7.jpeg) [//]: #@corifeus-footer --- 🙏 This is an open-source project. Star this repository, if you like it, or even donate to maintain the servers and the development. Thank you so much! Possible, this server, rarely, is down, please, hang on for 15-30 minutes and the server will be back up. All my domains ([patrikx3.com](https://patrikx3.com) and [corifeus.com](https://corifeus.com)) could have minor errors, since I am developing in my free time. However, it is usually stable. **Note about versioning:** Versions are cut in Major.Minor.Patch schema. Major is always the current year. Minor is either 4 (January - June) or 10 (July - December). Patch is incremental by every build. If there is a breaking change, it should be noted in the readme. --- [**P3X-GITLIST**](https://corifeus.com/gitlist) Build v2024.4.105 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [//]: #@corifeus-footer:end artifacts/screenshots/000077500000000000000000000000001516072260400154015ustar00rootroot00000000000000artifacts/screenshots/p3x-gitlist-1.jpeg000066400000000000000000007572201516072260400206120ustar00rootroot00000000000000JFIF``XExifMM*1>QQQgnome-screenshotC     C    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(@>(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( +-nR1os+3>YGee$w'q%ap0odvV9+Ef{-ѷ%}ǨNksj2i]~+ɠ2LnEx\l--tW!+< ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((|2Z=BJCE}וfT2w躷Ax8z7uYSMqsnj5ÚΙZe}l9`a"hȼ}o|E2C8l3o@:Gp:o>-&˲-b,sI꾇0oX[.Oxk> +)wrJj>]:kt?k7+'^1WwhwծNK+W1  _Xiz4?C,#q. W=c%}}Sk1נ!m+1⿠ʆiAWWT3;+EaJFd ʻo~ƺ>#n--QsÂ~鮉Յ6as袯hZ'L{Fe1wcZgFώ_||!ik~//b|d!-;ׁtFy*S75fQBf 3 +/0j:ټ%L'crz > XS?FkX<+]DnoWXMhxY R"oV$W̲FHQᕆ#"Zex;ԥ:NV_[ mx?Zmo -d:bͼn yO+ +Jl)Da%+8SZj;lPS]|?w.`Ԛ-2ڝ6$Ueax wwXi\QE1x7!^gZΖ+H˔Ld]^óŠ( '/WG[+v q9Fv,'H}+#mwe;i<˟jb|M<=Z1?Mr==|5]7\m;V^AҾT"мA˦j  ᔎAUKJ+RJ_EWAQEQEQEQEQEQEQZaZ&%׌G5=)\'ğG :lko&8u=G885!Gxc6QOߴׇ4&K/ xV(*+1 FI8ua/7\_L/^s99]K[Z5-R%J񗉼n,{RҐ;,YN:ױ~.q?ט]?T&2 b0S-ȑ9ϊf^Q.Ae!<,90vG>[_V/'џT`8V8j߼\᣺Z3{b±¥ځ9[<`-6Gr*d`pAJGm_Xjs7) .^Ou@v_U;O@I8TQ9vxx֗0U~wdf2u?|K"Ͳc-6G.,o䴼sʥYuUj̷2e8mG5Zy _W+dOO[4xͱ^hDV!y;tϭplk.S̰_tgYE|SzzDTQEzGEi_߲-ĶyFǔdW~i5vk7}fhTg#+ҫEzX[Um\ΡRzJϏtho?Goy^Gf@a0r+wDğ,Zc_xǚ>}oz;M8F $y$':c PιSROI_±_\uۨǚCO`ϡk_ ;C) ֌[d#<25[|VӼE-ze\d3IHPPE|u\z> U:+XNk^:.u{R5+,9cEQF_c9$׈<yw5IeQ3X8;zer:؞_l|UkefҺrzft~~.4}]oQMƬlY-HأbO'#VH<<5VJsU{>6/ z񾟧"fȑ0 c+a!<½,+e%[\?3g&q˾$k:u}{?g'y@kذ꧹S^| ~*/F&`l~OrA;wO>O2ꋣnd-4ls(_COEy⦭ %Ë[9tXav%m\x*q=ZnGmy?x˩p{ ُYmn ڿǹ'(n1PvG)9)n¾~^jnmtŶ 7[C4w(|Q_W!+wtbz ( |6v;pPRytW>}kxZ-ZG𥔭n&-)H9H;T81q4|K\U<NuߤFfl몝8P,tG5J+Y_G텯3 VYt˓Le$d劃#^+&|K> ?B,1#85 S{ڰI=WڽؾrJuC,݈=qGg5l%s\\<݌yo-u}k_5l)-OHu'*q8ȩU*NJIXN nϿ>'~zNJf |6ѯ}KIkY'ytĥJn^BFGNj0in/ghvR,sW߶Eͯ)N̑V9<'wSxFi' ŏ^湰<z]N3N1K]O!aI?QϪ?$F>l|q Q=kk/EPb7O\WW_Mw^ъ*Te80Ra-7qkZKw^c4cgFF*H@hO|B[k+Aq;+̇$jzA~'-^,]H݋E^xI^_X4۵<ʜgA۞Z-'.ޕ59]GopZD Y0VUOO#U9t?i1 $F2GpAU/ ]>귚F [JP?zzO Qݖu23<@uV8kғRXNW+}"~ڿ8Ku^ #7/$韺+_/>Fkz{g%Yfi7F0q_P9oxn%eհW,@kVGs{qqsYY}pMqWymkxMPh{khO$$5+ςx=~ͨ6epnPZ9.34Q W&k_}w3nFG>$}.׾ω쨣kkmBX|gL``c'boSOY>m]w֩ >:`WJjRF.l|a' WoKdMޞ$>MyסPyߵ h:j:qxF4 BѹkY?i("&ᾊO~f_ jV\zĶq}8=ct=ywh㟷NkFzOٯ_:Ԛ؍)Y$[߷nyg{㟌O{l-tm fdb(1" 7w>15x~Kw2iU233ryXZӯ:0vJ5tFf{z8nmoJקK}o$[*Oԯ־To.,FXeR+Ђ}Miit]JgLq(pu=q?Hx#KeQM`OԚ5*ƳUKMZtEVrg|r? X'-ƥxU,Fv,ʠq'6!nq-`+_픟~=tam5ȯC:F%8|ڮuA.7.nsUlMI;>To~=G_rC.i Ɨ;pdg; 23\|7qhCuc #W)b8p ~7V m{FKCqq˼۞ K 8'|+GKG`:(W5?!Za(8#мY@ǎO 槪%>+0DWhr WC{XŚ"^cJ3GMAkڿnߋW h3;^lu~Yⵌ#TxGb{ƚȵ/Xcq vy9z{gSSRK幵hTpqo[-⯂zi~'XL^{t FFG"| g-/ z<:U#־{-]qڶPȼG20K?#zWЋN?vupmn~g2_WF'eiMZK gɈK6bv5|R~"|5u4d2L[$YenOOoZxu#=Ԇ9d]i˳bπߊ Zغ7  k ?y {svJ^VHgp\|SG NF}~x#[|/$u[5ǀm <|OJ-gޕ Z|7ZS 8`\{ ~-_|+.4'%Rbkk`۪3Ĺ,E'uaQIgi%k[2`9d@} *Y'V/mtn^|c  22ӚtZ^Ş{m;ns9~~Wb:#jFU,҄GǠUJj %%'mDaF98F:s}B$qC wbp@{ {O_ cֵ / ".NAY??m nM7ĭSTբ;&~dXu\o#|)K<)}Ug+".p7mj޶-[4hwmeX%U;Y=TvZMJ'|4+/ C)C\ _5~AJ"Jo>k5&aVP8^⏄~b?xF?*M`n%Lm-;V%ʡ7mmg?gO~xm#źqimk=g+Dڧ"6p8\:t 6pWp?e},b#\361 01M<⯋>'fմsp%ߒ)QjΝyNs#Iь! _WfiCKЯ /̍Ƽ[!gᯊm'ZZj|:,Qᨩ.'1UR *:((((>~,|s\hxi!([ֿf˘I4#Eybpzȵ?oF-sU)e6uUS>$Yyik⯈qub mz>xgo{/j^!h,s9wMME|o\XΥ8Քte s8U|}[O _ R4M4<ct/oi )cvB>Aċ8aظ*/$7c+~ |Կּ?_ّIq+(#' r@$Ϥh~χ:G%L#p˜1uX{37|If/f/xo\[蛃GkE pT|6V?gHisAfVүMCn~$'D"mJI_k,^S~:>RW#l4,T8BRy | _Gz].U,4yLq&8e(ı &k[K>w诮<'⾱5RxɷխH V\xrXnZeڕ,sF~d$n`:05ts˕ŧLrǙI4rQVt.[-49G M$1說 'WAZDKy\‰D$+?iF}Q[^&O,xA4gR&g% P2GJūM5tCMhŠ( (((( Rh[?Q5N6k*xtvౕD1Xir.]Q춗q_[жo󊚼 N!ׯA&܍{W9EW'u'ba+FWޏ}|S|[RC12E gzWԕ△_ښIIE-fɎtpqЎr>4c5p^K}2+l%$iT|>OSxs\fkkμ-G>'tomP2 R=$q<_V?ݷUkk^.o xI.\`| ;΋[.9Vz:Ex9^U'un̲v#Tﴕ{ǧ{tWx#O'P0"X`B+n״ĭeʼnnb|:YnLQ2RT;0@5ZƟ 4 4"~788 {kP( U[?~_x#熓vlO󎾶io_ #59ga< wq6D$C,,OCnb|vLNKiUѯC:22T%nkϽh⦞ڞx?w)V@9vxx~Rr2ta؊k_amrh9$\u->wo[Ƶ%:| x#QFs׷AI^g䏉s ^**KE}|wMN_O_ F<4]_pFm? ck2朝ܺ-Ey_ŭoM>KGgmȌ$sa_΋_v)J(k$N[xw/Ikc2Yv-Am#C_ +ahEAY91dػ3ORMjE-r}&MR=PLwaU2_=YUcS>|EpS[E+7v%cc-:iUs_Si7c?ƓGc_YF*/@h#+iZ3K#{d2 c&MqasD{oFE{W,?ִ{kW$_Yc|##p+Fx[ꊡ3%jrG\1NGyiFiKh#e0A_acBqtg62J'?O2ό4]'5"(mqm wAܓ 2$¾G/xP5{i كLICmn9K ZWHX zI-\' kSci%n@m!}@Pڮ#|9s+>WӴT`U&}6Ƥd=9<*<4bzZrVߙb |Kw/)SozMooDpx(8 elpq:Э?j{I/<+|;#&@JrbJ7Ӥ'Pt1I8)\I1+רRtyaNѭN5y:/To>9M%pBJ0.Ċ?!@k?k^6'ij_Po;k)R+`FIȬ5mJ+{"DfdU^lL~boů'_]K\㱓BaK.CC>!1g VgbjNU)*\Z(}Vm{k!U)T`Wyt;[{;-3$L&1dtΛr!K uȯ6?O}F=#V`NЮ 7vH2BǑC>o??ǎfYp?yWݒIJTr l/u v_vQMW~/Oos_|H 毱~#+GOVG5tQ{zԾ_w~^%f^V(S?`8.KSoO8[?Pc?~χ_;?xB^(H1\HC$+E7)x7BrY LA _opЯ|!{l,:pI&2n۱ۯQ^P7,|. f)V7ax5GTR%pݷO>oM_76V7w:V]c(HǨ=Wo,OҘw/Y2iQ\zI[-*,1;8i| >hK.="GE_ҼAo|CZ9a'/Ec &XvNJZqdUhՅ(;8<)ԬE|14c x밃/oA.<~ ٤cL SğWŝR ;K׭Cv{}?u?g[{ǟ5 5bB$>Q@g*N>;K'^+_[|i?Ck6Õ,ʞЊ i릡xG,$FK=C0naBTT$v%T=M}+4?PVQ彟sʅe3Z (?+οC>.;6 gKH/W&_F& yyl;dp|Iym]G+#;!('v~P1K㍏?6$MmmpvyX,ڊ=Bgb黨]4rCſi~0GIcZ -Zkd22y̍ҼO %\v)akǿb_ßPKGcc˦,q32H D'+gjumє9??H3'}kF~H5Ko㸹1y #!WgJ߆?cީ5ZoW n3WZ:Fԓ?2x-9+RkR䖸gBK$57U:n;;RJV\xvk{{sA2 #Ikg*rʯz~`淍u6M܀~@?Z&*? kx,y dF%*%r:K` õsoCn`_"_~?~Tm_fٜt9x7⧋~iu&Vɼ}FAܸl3\yTrӨ'u ʥ5>(`B((((|'#V_ŬZ7~c U#?7}*F޸?x[#AN|Xˊg+{pl+?sLZorJ^h#__0m\*nfpl>j:#keVe ʯWQF+L ܂?>)nѵ;V%Ν{&;r Հ d$>[SQNtւWop~/ 3YoNВu +>*xS=]̗VɧEkp1f ~WW]o7_ӵ?: YOn &u->$j :70A[;s0O\*FNM/Uԍ;J*)go"ƶW,%ʲliglxO Y#F-f6xG\E/?=njdbI\31I5/ HW7?mGïW׈ޗZU|?_0>o \ۍ-s1Q[W5(/.@O:/jxM f7)#vJ?}w|۷N{$Tiq7[L5HAӂ7h? |E;vsP=Z,rUr8߃Z2Mz,($YJn :>|2}@~q,k7qίk89lP9'G>,ػ^:C̱bXz>U^K>*|lԵMAsAWJ0.6Ƕ ޵Q^HϚ6߷δyex:%9Q+R9ƛEzG~_|@3XN#e8i?Ah*ooJWJ˧iJyv1[&#KyRX2#Akc4<{RWZ4]>ڣ =$$׏<#s Ɵ+߹c s|Cֽn#QcE$htUŠ( (((((clEIL;oS㐣W>#KJTkF{ebpq]_޺iw ,M? 4فtmֽ +Xr7_g \4u.?P䝣^+ޏG[>E-^K NYXXz=WQ'|0~5xN8gx̅B:ϣkVU2H2vt=9WcTj*_=n?{[ZQ{Iuk]>U4VI5 j\s?y`")ДwLOڵϏ5)Cv= L󙦒gWiev,by$E(1U)J_kc-RH#-͔*Gk{ſsŚc1vДGbEqSq|jJQEQ$wuw6ksܓBO#k4S➗^4|Z*%W.3~c?xkZ5ײy-@vʸ(EXNNZngǞ&HenݱnlgOc\yq-į*{4xk:eEhOM{uOxŚgY$t% O\m<5+V徆ׅ|m=燵car_FFGߍ|A㏎s$kͨLAE01+k`?q;_xzik{fv>RƤxd9] } 2}_j/ϏMT((((((((((|rjtI;?y \>9 5s0TFo;px}xbpq]_޺gy nFDZtI;'ׯCf)DZ솮QW:{>O?Gq%g;GGtky%υ~{&'#o k_|+U-QX~nZr.~}\F7٦X#.j}ٗ6֯!1ø嶯A3Gӕ} }K'Srbnʚp; @i5 @k"I g Th3_^xLܧ'v.$ڛEyEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^OlA Ubj4tJ/XlUlXq٧fggq).gajLYhlc51jThSSKb8غnŒBEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEs424? ׍_/[?]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  M425tQ[?iw @'G,  MxjV]G? @'^7Eڕ/6w424? ׍Gn0ͥ{',  MtQ[?iwQ^9Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W˟M|Pqa Mwjf=H 9 yS4>tVU{!gkG;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G(r~OE~"__OVH;=ޣE~ù?g'["w'D+z$P-uoQ?ܟ?@W;w{G+ȿk??^%ׂuV]፾Y&e9Wa=}hoDȏ4%ϧDvƀ4W%ϧD-'}?#chFKIOG"ZOGǜ^>ƏDȏ49-'}?#i?h sEz7"ZOG?"? :^M>PG:Ȓor'c8<ڀ ( ( ( +O.mjY|J#HxlPrr>ԼqR=|3v[5 eZRd!ցW덜_?k;k84?HۛMFoJ8ku/1ϨkR&0R7E  # xQ@Š(CO ˇkQE ( ( '7^?~oh(>o٢:+sVwǯψ_l&KYOCc?q56GPHڣY'5l_e{xλi l' 0Sa?¸?:֭z?}Y)b'Ooc^,|+&u創8sӚnAc'Whj쮿`c+;N.לǭk]#mKS`uZ+u UAl[ƻ?|Q`&Yd$k,p$n@_r_/eLY_Y(Oى pXµ{rv:߉>jρQ46׊ľza Ofmiﳝ7Pބs^yuω/WT(uA#W=x?gkZ5&|s '*d- JoߊK_gfѶI]N"9}C.nPF֤]~I xV0H8#9Yšx6S^5q[y,1T3>"\7f471#rեi(7t}ETQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEw?K+n5?ۏ[]QAa^3|qo╷^jV7 yC4dR3dg#jkRK(` I ([~iiմ=B?>Q\INC)V̿eؗK\V"2a ˇkO aEP ((#~lW?j?I袊h/n-B&!bʑЏZVKDf4ZI"<1ls^E-nj5omY.+glR>wτ|9pRE 8)鯘kCGo9Md#@As]`U>"k-Γ jK]/>CGlelgq^EJZrm̷pZO2y{My*88޽hAg O-kwWzwk3-#NĽrx6HcZetmFcu̮FT{~Kx=Jƥu. .1!3:⽆)-7y 'w<mriswGx^[Ş@?-E>jxsr/kaf`X1;3zg((aEPEPe߉> ~5cd Cs RF8A_v7 wNJNoyn[N5 K]wHM)`Yzc)υ|CV~%ᴿ8tl#$nE$8cjُXV2j>v:nG>LH`2;*?O4+t= ĉMiS+`8 z(r?W_\?\(QEQEW?j6+5{{@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEw?K+n5?ۏ[]QAaEPEPEPEPEPEPEPEPEPEP!\?\u?PK (Q@Q@~7?½JcQ>7?½Jǖcύo|nz-ǿG=ߖ *( [>7?{-TP<|ns~[+Ԩ,yo=ߖ ?WQ@X{-cύoRs~[(ǿ^EcQ>7?½Jǖcύo|nz-ǿG=ߖ *( [>7?{-TP<|ns~[+Ԩ,yo=ߖ ?WQ@X{-cύoRs~[(ǿ^EcQ>7?½Jǖcύo|nz-ǿG=ߖ *( [>7?{-TP<|ns~[+Ԩ,yo=ߖ ?WQ@X{-cύoR$-Dh4=KMThg@GfWڽܶFIDQE ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (M"Fs Ԛ#p;$UFxG{WxkvXUkjد~Wxޤ+:|;#_QbԊ=֊(>((((((((((((((((((((((((((((((((((+)ªS_~,5][OJs>E}q~?d^Qvc,S>cբ'A8n_@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W?ߍ>[I[N`,dK (`T PWMlO"-a6dm; A۷~cEnxĶW>mf B[)Vܓyv*(((((((((((((((((((((((((((((((((((((4/ $*.oc+ N\vx (( /2h?jZ(iclhԜvi7_[Mgyn)#1AhQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@hwF /gV`/ V8SgEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@XM{ïؓ+(N匀2Kл#Ug 3Yԩ jv49vW_=ſԜm!J婍N|tC V9~~[5NėzttNհ:̧)ÃXuښ9iمQLAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^WSF _ +*o^yyGqQE|EPEPEPEPEPEPEPEPEPEPEPE꿳ۿ#6ZX,fsq]B{HdpH .F7:<  ot'()KK6s<3]cƚ:N]jvq$pBxº |[Stjw\U_g)y:rkS;6j[ע_#꥜ɜmu9?CO>քw,"91ߥ-2oGgV<7xOTLִ˽#Qe ` ixNJ| ocq/:,ZKfgJ9ᗧírٞ5C2Ml(29? :VaqjVͶkKrFpO#@(Kss$?h%Υ 5%@,`OOH sRZ2cl$y齀ڿukhx=#HSComq:KgťkK2&Bs>>#|y^xB947*|p@'vA }hb[Eox']{ˣxLH#Uw8VS+zǏ|M%>+(HnM@j:c5|!ƋimcP]YH&A(Dn֥c;_ j5,#O2IV3^Tw$ Wy (~"DFjڞs8 k:/8Œa<%7bgؤcv9G[ \hZ-.qg4Sge ^=kW_|SkXOG@Y]Bݡ2 8qEzoo ŧq}$|27>bxP{q"RQWg鷚YOv2V7FIᕆ>WƏ'߱m'|iiKtvY=;I'֟7NjM9`ךIǍV)$5>R$C RJ.q-"hmX pAQ[>+WKsqj3b^ݝeQ'c|=_ xFhe2Wfwd|q ӗfn^*?hV/( Z\W=9H)F${[H{$O2Dձ =?|UĶIh!wEqr#xʊ3K.x%? 'Mˍ?NY^jV  >eCt8cyT$GtC{e55@!L@pb_et֨խNQVHQEQEQEWF >--f=QA!EPEPEPEPEPEPEPEPEPEPEPEPEP__NO3?Ӎ~"Ls@JWȿQ Ú+n4va+PHXg}uE|]y59.go7VE,i"0+)H ~]nI⧈-x+Je WV[ !!rĮ^ /oO3ÿm@5?~?<\>eh.^= Y _P2UR\w%4WdsVQ{r8M?`Q.컪|=!𾷣푷/h6'qVr\Ɖk__LKmmIVGBLLcg~o¾7j_OߎzUQ򮦷G=1d`F;xvK/ x/Qk\DUK({"˷qנQUU-=w~~4u3cliן𐴉zvbDpmI$>1xS;2}fʧ@ m%&z-|E~jU.9|7ſ9|7o [rjz޹MΡT?2B0O䠴Z|+߈>E4Ovօ ι +2 /ؗiVzQg ʸ #źZ]6&RJ>^D>?|^qhOo/[u\rZ[Da~w Ci~6?5 BZHVW x*HʖԔE4ᯡ,o>O%_oPPNT%8`YK& #'>Q^L=5(aB"˔ ANOJz +u{c$f.ټ:=VWZŹW-y99897ŷ_ |kºuݔgڮLx+m`AzwJ/t㫍 Lԗ$*KE+~'%"p);`m8j2xy6w}SE}q7[5ƹ/Ym.e 0PQe@_ZDײަ%xDq!5Ң!jSVm/sJMQtNMz=50x>|RW#mI4MFkvf`Wq\g2kn#Ot}ռMi -Iv͜OJߊx Z?=ƞ1m[{\HƱbZABגRo{%GUUj]ߥE}5 nm [lm]ل(؆Tn 5,t7ĺk]K4_h1 &rFkGu+5b4j롗ESQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+8eE~>W(_C+QMoIu- Vu$בBϵzs|xǚ#km{p0f..98^QDC}ﴭltg{x~fXX}W{OB FGY8q/a뮛=xMAzkuc3kUA>'r_oGa;\W'O?Ó:oA~|T)j>!> {+J(ɐp?nZ*i%އOZr_?5袊Wߟ_?f[▁.9t;  q| ۘ0TN"5r 7Ɵs๤Kmkdh"'QʎW8*}fkؔim??>%/x31ZKYVW a{G!|?7^/,/ioFdDM5HYX8#ŮINZYbuuۢm7_>x#G|G#u#.^I9*/lŗM7Bi;N Ru;~i$>-* ( ( ( ( ( ( ( ( ( ( _}Eέ_)q"u+ ( ( ( ( ( ( ( ( ( ( (B7:2ELԛWv>f;7A{5/ZΡᜃmOe>˨,ll-bX-XF@ iWJ4`ُOs?}_? ,xkWZMZ|jVq)2n6ھ;C n?ѫRi-# Z Ԥ#gOmmlĺyk:$* K A x c'?/nH]P铐WͿcy^g۞3W{X¢j\RSN׵Ϳ.UNR+.0x-I<( -%b&>ZiN}U*wKRUZ[$G/ꟲ»WAU5k]s+<'Rx_ޅo=式g}űrTm ZWK } ?Xi@>dEԦӕ##UJ_c8ɫɫJ0BWI<m~ մ\x+K5 x ^KUW @tQ#/ߴƼ[$6761*(ѶHenخXc%R6ҽ۹<$iOvw>>K w? ѬIZ+ 3 WB4MD̖,j[͔d<ʸ;/,4XxA+xZX2}Ͼk O;:me۫ӴC(٧u fgŒ 5)NHjtIF?S_ς_ ;&0VHe xu#oCof/-uӬQҜl~ӢOBWWǢ+ ( ( ( ( ( ( ( ( ( ( 򿊟0[תo^^WSF _ ̿ߪ=,#+Ϧ ( ( ( ( ( ( ( ( ( ( |0q*41¢I>S+%/|-h>)N ;]:ͻ9B%@=7g>0to&#nE~.Wh -<a|cKYq nr#"Ţ9ψ']ZL02)ب5ػ/u}Boik<%dQN  B+~p 5}*J{nVm~ޟ< +}gW֚n]J6oy@ _}oL57 {A:"i9<HO7VTW0|6: GoIL}09+NPZ__q*ΪC>:~ڵX_t϶$]e=>Ʊkž g|]Gͬ3!, "9nX_,+5+X|oՇYyEy-F</iV5[hزÿIz8kk{[K~kjK$*̊ye#_ߦ|Ol ;8)3p6uzbp|&cO?.5^H8N\3C8pOQ+(x+ƚfsjT%*׶i 1SJJ9[n:iYzY/?3(߄> }1~ƺ_s_[L=IVH-X]śn@("x@o[VǘU¬#$`ܣi~Dex*gs+?hm#cY~߂eGd0hz`cs^oY\4y]($((((((((((((((+/fBlj((f_df_d>¿Ϣn/3? >$\xKK*>*zyo)6T)ǹV|Zkrco+E?zWl}Zhj/ؖ&kKyp IM+ 0>n[n[Bm~ձ7|c{3wpn \}YMr߱D?w\,HɱΰU#FկT.ʿ Y%M w )u?Η3nQ zd?c?|TYfW s1rkĿ,⎃.8D+$W3_qMHz^fm0. F{*ZsKOH藣HWO^_Yjߩ->&3poZt;#T`$qK#:cWZ5n7AqGּGOmW߅'{: ^{FR&V=n{=ZWU9.?3gFkoo:3|φ#:ʹYhIm,*Α:/kk_w^wUƛ]/:%olEbg>6Yx[ľ"8ȑ#2++c#y iwX`XtkxI%(X"۸J#^;yg` lQ{z/V#MU~Lo~+H~TFg0d  *WNs;CmfLU^hiԈ$eYbr݆Nyi2Kmn!cK"^ŏkK}H6IVG_Uu?K}.9"t@ʓ{GLW;KG?;}޸F _]*ͮ  cIr2A2&~>\ӸO}*kx~(=v[ࣗOqE`-Q}.͍}Eۺ{'$:(=H5wZw+XhYZLiL\B7i֪ZQ9"2sEsڍW ʥ4Gmz_ď1uEY\v0xw_Vyi@nA6ߢWM|Bվ*SnT$(HUpҽfg֛i"Z{b]7_D‹Y#1x?;? nNE~KW/| c.\EEޑ#`?!_5*&J M?Dw_ ψ4--z5yϋ` @EPHQEQEQEQEQEQEQEQEQEQEQEQEQEWLs_u3{q8ҔQEp7[W~"F>!;M]~oZG>ϨYXY;}u? |I~:,(&DPP m sI'H?`ռSz~ǥjus%_.&`ϖ kuM >~;$0/O<#W`v"ı"7I`0Kqg>T}[H]l|5+B(((((((((((((((((((((((3dC$̚0KU9f8$&Ot_?ilz$h}24qZm 8̙>_ŏ&&]F`bO+lz?ۋWur/bshVHΧ8-}9G?cj^4DŽFբmKI7-3=G +=ITxTE4dӴ{yL |$mPuFYw n[~Z+'t_He{Q慚Fg_hx#VJ~:Z eȍ"GrKB$_mT).ϣ_v^Χ3٫??> x/\K?oL5 ;e˾ Rx!E^84]2-y#Р#uh׃uؾ+|O$Gϙcg<㸮c74?>"MOBqڳ+e^!1v>7|+Gsj| OBT|C"#2 K 5JXw{t\c*iioO%hg%盎s3]6zѷ*csKu dIӼ 4{XԣHڣj\ y~$g GW_W xuZ-B?x 5 B8Aa$x`qAɮ[uw4{^枓3ߵ/Ӯted-ĖPq\+Ox3Tw-g" WIwH=pE}/طƃO>5xZӭK-BuYС;Ub$-fmk\nNLqE'(\VU"N~$ռյN( (((((((((((((((((((((((bjO^!n9/լˆ[e_p9(J_鿲^xFo->ci5G|?__]| i_ĉ5忌SOQJs =(Os 53{vKk.c!#uC=~zt_(Esq,u_\ յ(-h:푌J.Xz[A(ץ'Z+`tJ>('_S<>8֭^Dѥ<@R[=+9IE]''d{o?ǛAy}?Pskn~=|;7~¦ 3͌3ʍnGz:^ռky}50sfL)a˼5nѓRW1aVo#ƜMOdžq{^|?UX*!nj>_χxƶ~u M8ݢCrd ɸ6G5^5gMJKO%C2?-῀u'cXy[:Bb|qM]['An%_$clvm|v*uթJ$}*8~؟߅IyCVcYҦ7Η8g瓂; Io/?|z4WPs%2E}g$k,lцXdkO3x>-0Dr{۷?4 T1ң^X*.Vg Z1'UFT} {wO WO Eƃ6=.)^A1#x=+_۳&Cʰ$~8)y;۾Z7/a-K[&7p7cv$Þa]u*iǍEI]3+C 𖫦p$V$|!V#؝f?eڂ/m׉TV`F 1TR^vpjFKf> Xg8mom#.ﵧ8Wusռ_LЭtI|Uy#}?g!axŗ3Mtɏd䑁goְ^hU;wQJMj_lzeŸݎgɩrĪW|K5/x'd;Iu?Cs?"i ;Ch4s[B4(8D Z! S%ktAx+Ӕp8M/+5#,U=oef^#OTC%ċ H:1ٞ.ScSފ9ѯqkZ]Msʠ )Xi)k m[X:\׽6`ll ߦ//?gq?5G퉡.xCľ!5m[/H%$ڄG#>cfmrOxN"Y,)Cv*H.I^4޶] %Wx_Ejr_F߷.#{'_S 4hс< ,n'5M>_ *ǀd?ooh~1^hΟZ&MqGqRTⴧJT-W5gR5>ߖve'u`kxO->:jO:/>5\_kdt:[\d. dk3_jdXVD[˞\V #υ6iK"g̖NhI?_zƳ{KԵ[m7NC$wQD3rhyb|U]/fHW̾wy0XuKls83/i!#;Yy7`i=' A%L>)V&_>%~}z*((W/E*N]xᎷֱM_E=g>ѕqסVxG/Wq^HF@6 G"FU(jﯧtM7,O"wg%,6f{ț$?|c_|Rpxvk$EH x wG;U{bԩI?tRMU=};zI>5ץ~|1>3|P b@'eaLy s{׼{kV.XavV{aC(#'s=|:ĝ%3=iL~Ydݨf3W_G3>$wI?cf>>(x x徸d=rlV ڱ2k`(6;ek=9$-o|Z@"< Sk?i?ُ; +OաEH7;Ur(mgXTCo!T2ĐYsQEɷ~-tt]T^m5-'h^[ؿi&S⧃|;7~]?hxknO- tl+8睦~8ōO"J :Kd{̒4OީŶm+{gZa(7[ozjy+yo 5𭯏~on۝Jm ?7j-?QC|j <_6kRZI)芬e9<RݹKgk?|<5 U5 4U|pt<x /o߄F~-tF6 #%FB2+j7}N4ޖ!X(x?WR5 -ջk$9VR8*y#u} t~ZO]s'geUȶ{yI=Ok|ӣx^\yb@@vPy`NOg_K" };S$+U@ *z^yES_eoQ-/zEjeԭ-_ Q +`u޽SZ_xgzmfH!w'$A={ mnߴX/?bJBxUPN$O?\"`Ui^7^6ey#y=A7%RD{yCAF,/&mB(q#7B۵cƺ WTPl1J#@ [̑0r |E(~40oX~,x_?O~o?E,=M/.-$V80j$g*fl&}a1h>5\xD$1$ٍ@nvl?_>I9c&oVqv;%gj=&o֣-VG ,cI k?c/>)\xC?xmIO!w~z%FqWLㆅu߈CiXͦfoi#`HwA!Z>=xԬ-4Ųt"9 d|q׊j)1G_cRxSuS4bImCBvSxc_.QT]E(Zg~$|YO4Ȯ /VUS _Z|\<t#p귚lvqsmn]$+Z+.U콏OEWM>?~0q+ `ock"&3-PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_m I?џzÿK1ZSEOEWQEQEQEQEQEQEQEQEQEQEQE>䶚96!! WXqx0^w@\謪Reiӫ:Nv>:̺-n1u4HO_;^wxTXmX'l+\c+謩hwu4QZR(9((((|&|Up$UQ|2d~ ψ>h&u[cp~WtQ\z?Wu+}bk^߂QEsQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@y_O-7T+#z__EgQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Qv,>𥟈n]Ʊp"4AR0y/M|C5Cs z[$}i6d@sz(S~(<wjc>̤??VZtx{MV`ȟTĨV\p^qϭ|9EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE?gW!]5G_EPPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWF >--f=QA!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPZ>K1Yգ4C?>TQE}AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^WSF _ +*o^yyGqQE|EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP]5rxeY"'eV9b((((((((((((((((((((((((((+|[#@Zj_Lkl#p_f]QA!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPSYܵ 2:>桢vwBF{gջoE>f7E&}}- }>)cȳ>q\3eQWտ*ZVX~3Ϯz5o>Tia?랩Ey_-M[}ϽUX~Q^W SV{??jjg|?G>Wտ*ZQϮz5o>Tia?랩Ey_-M[}ϽUX~Q^W SV{??jjg|?G>Wտ*ZQϮz5o>Tia?랩Ey_-M[}ϽUX~Q^W SV{??jjg|?G>Wտ*ZQϮz5o>Tia?랩Ey_-M[}ϽUX~Q^W SV{??jjg|?G>Wտ*ZQϮz5o>Tia?랩Ey_-M[}ϽUX~Q^W SV{??jjg|?G>Wտ*ZQϮz5o>Tia?랩Ey_-M[}ϽUX~Q^W SV{??jjg|?G>Wտ*ZQϮz5o>Tia?랩Ey_-M[}ϽUX~Q^W SV{??jjg|?G>Wտ*ZQϮz5o>Tia?랩Ey_-M[}ϽUX~Q^W SV{??jjg|?G>Wտ*ZQϮzqWXYDHOM.[Xeۻ؞sqPxGEp+=@((((((((((((((((((((((((((((((((((((7Iq éP}gK rwK n? ¼sѿ-!Q n? ¼[C'~yFIG%O7 ( n? Kto4P='~?+h.z7%O7 ?-!W@\oKto[C9?(I^sEsѿ-!Q n? ¼[C'~yFIG%O7 ( n? Kto4P='~?+h.z7%O7 ?-!W@\oKto[C9?(I^sEsѿ-!Q n? ¼[C'~yFIG%O7 ( n? Kto4P='~?+h.z7%O7 ?-!W@\oKto[C9?(J^sEsռm؆icaw5Ɩ,I'$4P (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Kp(:+~X7W_ŀj _&([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=h{\K8J+{\K-,pWw-[s}/@X([s}/G _&Q] _&Al?McAl?Mk Ewk??4?4 a=h % a=jɵp\@Xh.-䵙JH AEPEPEP]W#-l+?((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ynZEe>-]p-rŠ(AEPEP]5r?gP4uQEQ@Q@Q@{Tu=Ӯ ˇkO aEP ((? ٨:((]tܷ݆6]N~BT? ,[n.bK+M#r aU=۴aNJ }wcx$Fj)m籙Vh^,TFihO=?OR;\X.-na*vQC8("tP?)S_~~_1_⿏&c[ %˿fs'1ֺ=;oo'Ty#]MmS#d۸9+ۿR*.㸸ލnˑd CKgA$Y3o4_s?k=)Kɿ[;~h._%z|oVX)A*A"GW~5o_oQ4/1L۠EyG[%)Wí+ґ7QY˾7U־3|@?,-Jxb#t*.pǑ\S^4۽FEiG(5'푠xԳo%=]҃~׮|W,joÍ O߆~²}"&VE' lMKi|63*?>=E>eqa>3]DѶ>N E/#&KyqkF̀ m޽E_|1A]j!~Y'#n:R:An7~,a>K[QAyۢ\LI{5}./aQZko;⿂ *AB5 y ]u 'Q1<Ҿܾ?6x2;1Y1n#I@q ?S+VM|+UkiJz~6gͿ6\Ѽ=z$io.-~VTHٰ-r;+_k_'ѭ!fYMrfDr¾mYŗ [8:_+vLW~!xľmGצ6 GF8|E/]6vVluHXSx;I+MO^zO~3ixQ,s2.{5~U'F(ex_Y"Sm]iZ]^[Miso ]OdTo,8Wf1#,sԀI')wEƭ>y}ѷ@ϥA_J~_(HG ۯ/pю<F\kn5k'j>Vjo}ܞ {M}îxW_xI_=KIYPv"Ag88<in [~́K$"&G<[wo7ԮijD D4QTu$cwN3Srڹ-PZjt5Xo)e_hA>ۇ֯|b~_;yW4ƱGGT!dO,J;Xt~2|9kCiwͥ˷=3t5<5kQk՟h~6qwS[>Isps YEE$U7úu%_\7<6#*^GQxUz#ݤ~jifZ|iWuKR/42DxXrIx$ԭ[?ԘNIth~4nU }+r~&էۻXp\bTM|[\@;3q 㗌2 "laqT_bN}_7<ފ(a^ ><(/1[9+22I03w:{7~kXbL(E6c퓼C_Qhʊ F<G=+~!x=k;sIn@ FzgG\G"B { 'oE'm#B52&Ou}jMMsGv>sTݐ7mY|'Lڶ4-4y4vF!=sE]sKM:9-2Ĩ<I'_ml<?)z.s};U;C?z ߕnO"lԯ ]"ƋT|[2Wy?F#*QI6Zo |:4:,bIeA2'[l,Emg23:>$jDf8K^魾$i;Ndm mqSoA/sn89tg]#F/iYT ")?5) (AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP!\?\u?PK (Q@Q@uW__@EQEZeHu[)$V#70}BI/>^ ͣ]} ?h/7~1__xw\ѕX .őYYxuu +}֧k.bQ( !.ˑ # -"H﹥ZrWۙ_M{Wz|1KRk7N-\_?ֿ?-xWIlsM/ZgW3?hsWU;/Jk~/G3Zjvs;;4,˲8 qg|#_q.++i}pһB8۟j脓B]wZZ=[_IAhiUъ:YpA5 =/@@熴iH#%:?ytꠞkjߵE/ om"Z2ݫW,J3Wfo;T)Eq -HPHP22sR+yڥO䮎AwuM#CcǸJaӌNGuk sk*:]g~&| toQ75~54nИg تpq^%(rS|U⇐wQF]23h28'[Uݹ]^|̪]|[C%{_N~? Ax#Wϊu}CGIHťm!OyTM|P2+!]V:,~OI'S=;S~?,|?2ik?~%lAm55; xr@. dV_[x:9_ Hs*g޷Oi}K0v~;SNv!tV徣ЂU?` ??,_ + âZ\G Ao(Ǯ>8''OYO/MFUeR} 'w`; x._?={޺KEFxB9 2.@=+4k~.G5ڎ!JیClފӗD Q@¾ҷ;OocfauB{i%w d8[%x+:Ɓ;Om]9 ?:* o&w$(7S=|EP0OZJUĄ},U?B_$Y OA cۋW>0Gg\vsy4>S7~?ug|ku5W3H䌐{j)SZ7+6->H[F~?3Ɵ nmaslh^є&m|n`4,~_5φ6Y]# `C>_|B6 I хw:G$lﴰ8@5ߵ}uoj>/) Ĵ 9EERq)Pmʢi:U*5NoypžCY"e"GM;[=ȧ]‰/اυ"ja{Imc)n׉gq'agi#[9R$\Gȫ%.ZQۛZ}Fp5't\H q^Hi/>faiiy e>QL52`>oLxZBլ;de#VBM;R_y?$9^7N߄VW2{_[TU"; I"'Vv{ڃHc=ĮGeg?iWŏ_߆Y 7_|uC5P4L:+YI 9)|u=kZğۛx1CqTR@Av T]u_VT:2ī/?ZQ#4؜b? L[.hMyhǞ.mq5-Fg bAl3W>,|ouM"K+xVȒ 6Ȫj˕ƍM3^d}9R_'G/x1fyk/ishqa8c$W-$să,˩'q'ڟciiN:pE`W?υwG|;4\2(8hՌ3B[H8#VQW_s5viJ;? Ko zLb]sN̬(B0^sZ;oŖP4v䚕|3%(u[Tt-/%Yจu ֝W|&ez,~h]7`cH)>i5Σ%nM8G$iXO?X6UjP0]d\}5cSx|Oc[M&6):lFř;Hcbmεsh7ٕb=[]ߐxy_w~_\\kDzɒV8ߴ)89^/Wk~_q<:k濱޾ykbߴ9J Co@75&\&IvE,jrf~Ӟ4Ѿ!|vo?y\F>SǽDHprP:TkK/Fҩ.~~?||;gŏ_>eX461F$r7UToy[ fv;~XD!}I s q3_Nۨå][UgXw.n 2=%1 褯Otzէo~{#7 }sjCn?"k~̟!][eۜAY~^g4 #x7G̗#F. jV4P1QŘ͎8*7-k83[G_C5(_ Vg>|e-CZ?5 O$!AՇJ>MkOJ)?}uɸx:Z>8x'__-[E4$y$["U`GM|Nzת9~)B{(C>T|,.OW/Ӭ$nOY&+bI9'kꯊ|)ƾunQKf}وҲ9#?|D.[b}Q@V5}Z/Xn>eF?xz|~W"ѯ#$۪;Jڽ M"Ơw$W~їH z Ӵo;C\w3~'yQs ~TSp>Li6Rlu%Ӂ(8W>O| "~yXd vXzg7M'$/%r{7?&ճ%&`|n'סkn_MI\PۘݼL6qS/%*?o&EiLYu*?R*» _,M"<؞O'?tqp ԤѼIˑ*GV,-sEb&aG*PPKF>#ị++@EuW>,w 2[tmj6\8x4x Tv$9=MLwO^N#jPVa}BL1y37RO$jb*NEU((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((> ˇkO aEP ((? ٨:(({⟀> X7nnebU%y0۔!<xMR[/?f'o(Gb]6ؐڌ *1ϊW&~.Qª4r &z*]om^iu (Q@Q@Q@Q@)TO/\} @"XՄwR8' `N$0^z`֧9κֱ&p"Ig!: ѓmϪ%+_]ϫ?j+G!iFOj`ij1-qN*mսY}V@)((((((((((((((((((+o?O|'2|\ѵfCt,쮮%Eq޾9%VqQ@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((CO ˇkQE ( ( ٫ 1A_r3O@(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((.eBo$&;s4QE ( ( r;FYNC 6us agn Ij,prP3N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (N8oƹ (Nמ:2@m}8@wi%&E(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+GAFGG/BZm!c%`5PXQEQEQEQEQEQEQEQEQEQEVMԡh\#MBʹ13;Zw2 M q|z {kHlXcEEq^K](aEPEPEPEPEPEPUo}Jx,r=TPjmMnqQՍM q|z ſ0]?~KA'kmi k1,h(((((((((((((((,PЌ ->H-dR@x=s_8J'A wrOߴOcnԳdSkҸ3|5u[2-\p)q[(?j3ſ |`~n|Eկnm fok'9`x|!qo-A+?Ҩ,|?镵|ZW yI<Tү"ZZ/D;}Z,zׁ|'<+m/RiX3(U5axgök/j+Yݻ*I>޵[k ~|U4YnPSY688>#h_ =Zx+ B]=/'!cG(YcM'L:~Z'W~ɟ fx}yeMvb TU6ڇu,M:KCs `9I2x?a45YtmB[خl#nzzxƇ߳ ǂouM2);yRrK6k^9oY;zկ82YeO` })~ ~̺_:f.ɧ03 x\7W#FsAiZ#k6 oa6e0< pßCyė3oW.ΣKԎ(WF >--e^o%O^o%AEP0>z|ci 32ͩgO*v3 @æ[qL[Oߴ]B%0ʺB)Sv~ޟ|vt7qt8E}e|tXE"y_]~ '[}O~ t zX+d +UE> x_/~*dҼGrCp RZ C 'r+ǏJMi::HcU*۽ӎ[LrƆkj^j Anelov3 oxž+-f.u &a ۰c?)ڽ |) IMTAd}ۻoGngd?jkMKmne H_v3W5_"l^z=^ Y$z I' o`KoZ>. +wBM,Cq `;Pzx kM_mR.MvKW捭Mjr]?+_۲¿Q-c/5A(zU~4>kſ5'|i4In 66p W⺗/'W^~+Oz7uo X>xF۶ B©++dK_x]Sx/GPх H?D'.=:}>X;cJr)[ eΧDʬT0nQ_ to_~[/ juŒ̫bI_/wzx}o~ ov&&$ Vh1݀ Ww_g~<ķZmZ;!U$=ś\7V׻V_2tOυ_>&]h^OvF{o> 82^xo!:b ^V{KK$R"X2ڬ{c_6IY=YztvҊ7O|=O?|y>7[>(io4nLFSvU9R#/cT;<mjGSKgU8M鸀{MP_\e| ;cI` G@!hIxGhaevىk?>1@k?[\=w __& !y6o׷Z]ԳnVLIXI?\Ϗ\6u_B @9v8 S_u~Zg tk5+C.8EBXJmÚwI^HZj Mq*6eKxqξ='}i\kZo]w\0,r@ Jhw>Πd[2 O_Q{~'_!޷Jھ?(aS+>>Ꮘ.NK bג72sSV>F/_&չI~'4W^ ◊|'𶝩N9 F}#'$?=Mh f4;FoP_|Hh\6¨hO|>!> P9<4Agc ,w3l)a{Vg? ĞrVel *A\ke/(=ߙw ^5"Bx >m{B)@ 29B? [mªr VA|Oy6]S+jM^Ps.7,HಲHp3*2RWF\EU> ˇkO aEP (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( k h(,+W^k~$?Lv d tʯ?~6>"x]ӵmJ(ۻXԅv2f}8EgZ#dӵ/"qA,q88}[M|jv(^v}ݳ@_ʿ8 6*PRwYb=vgi4&-ïx[R!4{Ը[Bpŕr~xٸ!FnjbvQk%rdNݞbAھ9>㷈48:M KOE ;t^Pc llѯ+R*rq cbi(isoqs5ռL,o&px4 (g?/G_iIԴRyBowl9)7kik֚=ފ'_CkhgG<,햩.\5żQd @6觨j'VޖF+Yy}?SXl +YMk?5nIe0!{\LT}5*N2zOk?c;H|Q6rU"Uzte T׏*V,reڲ%Rm9Rj2y-mޟ+5+ WZ-~wOw=;ohjw&5I"1'Eɬ6R(͠O21vqtCVC?߁|e/隅D7D%6:YH t狨h&2m]6SKyX6 RAt5|T3xc V c]d/ҹ hՏҿΏ46GcJ@]H97[߶W›[6;Lno Z--[/BZ.տ^o%wEPPW]Jׂ5eҹox{YI${R G"[Qj5"teU9S]oN^kIy}u**Yv8U$?i٣'W_W|k} l%Աj]Տ5 5¯Wlb|E0&F2+}kU5w{yԓ{- ~K?|/h, PˋѝJ.^dT_3| Kŷ$_j|aQG  p}[;K:͡>K״VOmP.~`@\Fju".no[V%Z1_ /O{i R+K+ץ|ݞ|L,Q\˯-_sxеq{D׵_PCʩv\2N1_2_tl"}Z'Յ_TmM|f?g}} 3 \)#KO?gv"V=@xSPea&or[Ꮞt?ZkQڥvHϜM$֞OAnu!鍧L[voAgTRo䷟-/\.k~៵[0ltQ~+"3R' hVW΃RjZeUϖf&o1פ~_/-IMB-6+3i.yc;YreI=m]*-_'G?lIgh&(xSV5Z,660ș@ˏ¿<-Yw,ͽQFFL H m[gKW6ߡӿm~kȯfuO-}+~F(ujh~jxC\XoL3 28#t~~ף=REſ" kXZAU ҒSuN /Uߵޮ2y8ԴUW$_hJPeJ_=w?rw?f>ljDhZEM:`r1v pv=?hZ]kwؼWcn)>h)l?&}u/X4Hͨ"\Y)x3/F_=QT'/#?>㻝Z rٸgr2=}spwc;㇈>=(GKik M2b śj#P+`GPs_s~\ /"n?2 zaѐ|1_A~Ο~ w/ 7C{Rԣ +KkM5_4?X 񏍼 xG@?XK1Po$ q{,/gmQ!gc݂ԨCl|}<o[(H9M*璠O%L)k%򎿊?Ү]1텗mS3oo}GWe?|2׵soq QU_pd ql:aIokh\Vx@9r2*G5QsiuPm4B%+=.xDžmF\y DԱp?oڸO<*TDn:޶#_̟ |Yƞ%-_ϰfm$`zc 'Cl!X+k`Ԉ Fp܌IZFKY]DJ//O(.j߮[2\j_&̞(-o4GF.ݓwַ~ ~^u?I6eOx$[9bMc4>xHcթ[&)-_?4M e]aaH;Na KH O"@r?gm<?Gi}Ƴ@KKbt+3%IN r1--z5yϋ` @o k kQE (((((((wB-Toj߁/7p?OS((((((((((((((((+!Aj!AjKGEpOWשh QE{_lm4;%k+qckpʀ` Dps^)E{7w??c(CRlx(|zeO}bBZ<#=kQEQEQEQEQEQEQEQEr?W_\?\(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWG_ \V.RZj}r@(,((((((((((+|[#@Zj?]%u*X(#P&hB-wu K}h yc?ҽAEP0(((((((|[#@Z_ \+֮B t8JˤրrCϮAʂOA((((((((((((((((+!Aj K{|f;?g^"'+k<;tZ-Bb(4 ( ( ( ( ( ( ( ( ( ( (9m?Z+IumZ5fol+QE ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( Ub8#E%k-F0eRO:6UQ@'Wo*N獷UsP3x-Q [r:6TuIib%ePEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPES[$;uVdtbQ]|5A }_O@r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'r\'>(>>\'rkCe-I³fB:aHֱ(QEQEQEWGkez+5G9EP (i~ լZdGEn9k$E]]7$wyT~gWڟ`趰ۿ_2C {9_<kX-bk|77;I=y+? ?U`}߭yGğ@ԭ&VqߎRloO-hǿx;Y.]z];Q8xeGfSєaZ?f$ A|G#Ϧ0 62ac)#xdhVGRU#"EPEPEPEP^+b/>ڍm\FXHAXw9cx|hm\y֨nc@B v.maaok0BR4Qz@_؟m^i~ څێ{c(}kDQ[ Ge!YfO {Ə_RƯ8F4WB ?>|ѻ#VS0AmmBa c$I[ԕ=I$( ( ( ( r#Hʪ'қ_c~? 5s VHA^|wʯ z@?_QM{+9|z]ف}v7F>h* G{ i.f܂G{*x݅um>>!u _r}Fׇ]oQ'eNv䃞N궥:}ͅwVw1SC(ʺ~5Q^G|o.t2M֝4$'+yeQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_N?})]h4ʶ.. Ϫ*qܲȠ bk5{|9L7]v`b5=OpA?)`Eo62.ꡂ~J+ڨ'c賷K:Earɿ?d|!XӦoxiOsef{ozȯ:lѴr*0* @tWֿC<9z$dׅPEPEPEPEPB&֠Y\9o"3wkZK_?=<jF K<rG\?axWZ ߓNgĿuz2d_Q[Gu8#A<-~Hy|R}u|Kd_ ȇ׃Vo4놁*ٔPQ@Q@Q@Q@w > 6 x7W`SݛOe' ^mi>u:§:ePX_?  a/.~i!9\Lg3/߰ۧ%%EUH{1o{/x/:&jzmB(a^w''$$ՠ!Կd#nD!?\ׄ|X]C:r&YM{H +ڴPEΗy=Z@9` r"@h|?)`Eo62.ꡂ~J*~? An>;tӮV,{Hyu:f1VkQAǨ\J46EWFYXdz+cuDd4A ?> f8&<*((((zmZKҬ5 ᶷB?\5BFcv o=B>&֠Y\9o"3wh[e 5Ip/LpA,}vК_?=<jF K<rG^E|G^ ?%/q.V?$.gĿuz2d_Q[Gu8#A?|Hy|R}u|Kd_ ȇ|u0ռ;.:vʸe!@Q@Q@Q@V<OtyNBT>O>$ͯf6C X-fSFIG|x^%kx3FC~nk>=>x>ú,^]7ߚCs݉t_{a: yƼ[e%׾&Aan9?I@O<_bQ@慨xgV[9B{ ~|HELj1] cxϩ,*((((?k 1.dtC/gx P?.h9: 'p\qk88QUQchkS[FFcB :[K\iRR?55TP?طZscqb_pBn؅EʀGp z?mo%tX<Z%\n`;nQ@Q@Q@Q@Ogeq^CkiWS8(aBNOaPWmÑxV߫!NY{24|#_PR5HHD,Wi_}6O?2\M+|1^E|oῈ* ]᥏w$=|k~7MToڵ&C| 8~VO-x÷lzuF)oCAEv>|#nX} y7(\pqڸ((((hE߈5k-2-zQ@~⧉!|=dWMI#|@F8'-2W̐!/~}{?:g Kvؚ5 죢zO@Jy-Emg?w^Q'5+I|h㔳s5K}+(| ^NmGQٔe=pkOio :C_鳌͌Xu H9ԕeaEQEQEQEW| KObr6e8Gs:>ƏUǙjQ>/_Znk6FC KDQ<;¿?ۨnAq QqZZd>B0Y\/:([_#|]ƒvܡPMƾSthݑԫ)V W|Ms| v|Dm< c$?+z$|uEPEPEPEPNDiUT1U$Skog]&nd>]ώ9U!P/ >)oy>g2KQSл0"?pO_F߲'Ahd 5ҳ{[hc<_7[Ӯ?pzM9$._tKNOZ-*#$,{sT~kqSO1ּji|){wf8fڟb]?"#|4¿͢ŭ.WE;3D k|򷺞;zw귚m-o{g3 uGV*4R((((;oڛ6.uk>Lg37M'vEpgɁyg~Wg=chgD"r{rI%'O ;p$&z}u5.FTH+|ygq]kw0XfB <c_.\4 jz){|#ɑs( ( ( ( ( (?bV> .FV%oUAe@ S#ּucmO3* Jd#!0{n_K;SmReq]K#7CWQ@O_-!'gnu܊~<~ Co.L ҟ8j;y3cPGM46EWFYXdz(_|_|w֕'5گQ =((((Zk]/JP.ˆ ;s  `;졽4ne8yH%z]}.῁G[ +6$CБn  } @Ik''0']Hig.H+#/[ߗ+\AB[q_I@ οZLk2*;c}'4^ir,}`>A_:}jԗmp;c\{2؊¢((?4/sApR(((+gD1JHl2$,eqU3׮|+yq$7 Wryu222%}  /{_noOB7z|KA /{_n`Btz|K_п 羅g_*i"+rxUc)BpPp ^Wz|KDbx4=.-;P"Y-m7,<1Ӹ((+Ꮚ_A:#$;G]s1`9oxʏƀ> =/ 7G0_Ŀc?>% Q /xh_r`BtK?_п ޟ熅o( =/ 7G0_Ŀc?>% Q /xh_r`BtK?_п ޟ熅o( =/ 7_t|/r?y@}pc9Vƾ<4/9_s|,þ"yr#UGp((jM&=_M|50:!NNLs_4K?k/@UԮ$%o#2(n8 0w:skoOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?~5?½÷^I!Kw$ Y^WrăQӢ_п }?J½#W~J2]E$*Z( (<;yZVmXK( ,8*| /{_n>1wwcK.3®:a_'z|K/_п1羅<4/9G7Ŀ?%}  /{_noOB7z|K/_п1羅<4/9G7Ŀ?%} և`>tsnܿo<8>% Ukp ѿ bɴpNicEDPT`NXd2=iQEW?!_N&c*l?5|Oվ$Q?e4c9n #,XaaPK?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7?N"Ag;H+Tc?U|/՞$O4أIm 4T9cy4QES]Ddu 0UAkƌUFK1ր>׵&fцnd6k;7,y`Bu^x44c hf P<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?zfsྵ$k/.㵴6S4cZ]QC^ /xh_rM5ύ濤lcYB@eݖ9h4Q@Q@5Ě.Ky-f_Tu*ߡ5߰_ĭ} jz^6Ki.oDE,A_VN- ?'0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@0_Ŀc?%}  /xh_roOB7K?/_п1ޟ熅o(<4/9@fk/z?nB$H Eu_ĩ,+"C/ Me7ky;FT, )ٰk%} ׯ~o>|FþM6X᲎[yH3!F`lU?ޟ熅o( =/ 7G0_Ŀc?>% Q /xh_r`BtK?_п ޟ熅o( =/ 7G0_Ŀc?>% Q /xh_r`Bu?N"Ag;H+Tc?Uޟ熅o+eڳğ#I&sYI-f ,r6o?Ɗ((,X` =+~;m{Rm&mifCh&pNpgcFw`%_k߷\Fts m| 羅 =/ 7G7Ŀ?>% P /{_n`Btz|K_п 羅 =/ 7G7Ŀ?>% P /{_n`Btz|K_п }c0|/M+U;W]\jӠTTI_1hw6 todKT(²0ʶ:S^@Q@y|YWxv]Fo.[I'b/Nk+οh|%WmF36Υwn=>4 =/ 7G0_Ŀc?>% Q /xh_r`BtK?_п ޟ熅o( =/ 7G0_Ŀc?>% Q /xh_r`BtK?_п ޟ熅o(W fB̢((>)~~2OHG.]w ŀ+z_?DEIXknć#P/ /{_n`Btz|K_п 羅 =/ 7G7Ŀ?>% P /{_n`Btz|K_п 羅 =/ 7G7Ŀ?>% P߲o=SxIW Ȣ_d+ޫ?dߏ_ǫiqv9;tQEW-G߈|:v,&l}?u5T=s/M>Ia MFعQ?羅 =/ 7G7Ŀ?>% P /{_n`Btz|K_п 羅 =/ 7G7Ŀ?>% P /{_n`Btz|K_п 羅_<=OLg*20cޟ熅o+o2wYO3PYc (~QEQE࿵MSvGƦ_d)܉k`BueU#hArjĄfEN}| /xh_r`BtK?_п ޟ熅o( =/ 7G0_Ŀc?>% Q /xh_r`BtK?_п ޟ熅o( =/ 7]W؏>Wih7O;ù@RX(dS\ѮkO;[x- V]cS_KPEPT5Ě.Ky-f_Tu*ߡ5~A[oAukiam%舥~\hDgt羅O+'r_п 羅 =/ 7G7Ŀ?>% P /{_n`Btz|K_п 羅 =/ 7G7Ŀ?>% P /{_n_ y'PI-ܐ1ey]@GN+/oOB7_*o? ]+Ew UTrFh(ڃƏqiZQMb;i.t*Өw0_Ŀc{_:-W.c  Յ| /xh_r`BtK?_п ޟ熅o( =/ 7G0_Ŀc?>% Q /xh_r`BtK?_п ޟ熅o( =/ 7Z|vڴ1fɻrNhN<4/9WǍiTF71&;8;s(EBQ:"0earPEP_߷a~+iZ+=5L? pt.t5?vIǖ((пʕWGh_eJ((((WGkezr(AEPW4ZAլ+ dd+VBS?W~`>4xYe0!o0OU=Ǹ z ~E|9~$ZZ\$mStO:5լ1x×ēC>>N=M}CEy,wxE񕩏`w^Q#k5ˍba_{_z5ρfċsw9-sL@TWW_+u7߇Ps|4aR> 4hϊc 6vJ]"=#>;[̿4K6+yѷd^R ~f`"4~l.4YϡY̻$.X}Hn#f9,$ZmQ@Q@Q@Q@} vKfyyQJe&Fm_RXu WǔvъS~Q_5 X8^vG[07jp ?>} 5uq#- 2Wi ciiZvVO)Ɗ2X@)|e=σ~MGֶQ9Uk9Ww_wĿ$/#mɥXHAi_vcy +>#jy]:8+?xKLڼ(((((((((((((((((((bώ|G?'DeVmu‚}'U_3Q@W;\}kkoё/@OEb h~mM+^K* 9ϵALT'GX@Y$>$~nmjuoZHN?;ql- 1!tC/y-@k/|aAJ4Nlz=2ExmPEPEPEPEPw ZT,"2$oxIQo|⯢+Cu ֺy6Z Żtoc;3oc%6^<S9?xO܂z@a^IkX|'3mQ@Y`( +/ʞߗ[@C@36"֥mn#|O2O7OGOE}HH>n;0? Ȫf'{GALV堹Qٗ=Gf#H tW͞ xb"k3 ~h+Լ3M'E=]0Ēo}]*0v8>5念犴"=E絷`|Bl/rtSO8 !ѡ`T\ O5Ɨ~|OEԣuDV9H#kt9.+ Nqp^}|KI J%i\۩ǟpr3Ѐ{WE~OZg;ahKy%U؂+^+ ~^&#;-;nnXR)qC wV=Gynǻ^ >R>k ȎiX`'oj|w4d*ھF?@Fc{Hߪߪ:OGz_ wsuu;%g.$((((/ً[ֿh-ϓ#g ڦ\a !OE'k%RJ1Z9Ɯ\= y⫉^MZ=h^Ftɛk,lV ScUIg|+:N*u,O$ƀ;I+[$TAhO&ǡA$ULj~/[ˣ鰷4ćM]k|9xQEQEQEQE-v7֥q6溷^ATa[zZTү& W!rpq@Wǟ o,<7hOL@H*}v _=屝*x>Z,DAqفpEu597> : d-ʎ̹;0BAC߷wAox; ^dMqxo}'Ey%aN1u#!bg!#~Xe5pTj? Ic4؟s3KBcYݸyaW?U_5Cڵ֩MjOMsp*QEQEQEQE{/<{}VVOk`n8?$f'_1JFF$n+`z}+?q6h- );y$59 @TWxoW tyYۭi" dǪ~؟ tmL-Ydf1P ;[B<FxsuU@YAY|F<1m/49L'I^#S)${ ( ( ( ( !oh?.vLy~ w5Oe{qCuic:k֍B.*$DO)׽i}NJ.&;ya킜h׫#Ş*<wY[M6#,`v'^#ۓῇm*{ݢwkv9 ^>rqԒ{EQEQEQEU#Vuk=Jv. :ЁT߁4ύlbo[#Oq__~%_!ּ=|֗+s$_S}~k ^+1$nmO+ӏS@P^K'];Qp|ejcX&/|W|H?m2X<%mB@M|r3Y0>%ԣxtq3z*g>H]噎I'&)@2M+7!vĊ:o:<.<F)yH3iтtj>)<g>g2TaS""?O_)Y}hQEQEQEQE7 -qGq)HC=}Iaԁ_S7WF*rN>9E|_|-cox}zlݪ${ 5n](֭NJc7DI]&=ꚥjYZM< (b}Wöl\vOqϻHq&@Ndbum4y 9 + t4E|bG{Z/2=~˧C'aٙc;WEQEQEQEhWF(rЃM?Of_V 0$cH5Xq0|gzgk2| mkANm,G:2kO+Xmi\hÇC5W;}h +SO%24Jn+> ~mf–W~##h͵%s3(8|`> Ye@b\M܀+}Z^o5+gg3f?RMnF$Z ]7kvHT~g$-@Q@Q@Q@Q@w >!i^$ "[˛u8n$O9@=O~*>?g>h-Xz+#݂Q~֟ 5]dGmo4}z|p|vEd}oo¶:OGz\ Y4Q}ATHF 3 |yyquw<7S9YrNK1jتɯh+<|Q#СQS+yn xG` W>>#7Ι3u-eJ~LhiʐDHh 3P9$¼Gğw¿ۻíͭN-I §=_'|x>ZԻ-¤oCcA݉Inj/}W:'i!P`+o|f!" {*$((пʕWGh_eJ((((WGkezr(AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP2|xt\:4 ~$Gۊa9#b0T ~ |i~<ɖu8uՏ;n"q =_~^ {IF?&  ό~ "EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEꟲǂa~џ&͆}fY M?ھx?ᗁ(5YuU" ?<{W?x JiGg_7Yר-"xKugowl?^_3^o]esӣq?b ;l9RЭ(>9 Ow2DH*ߗ_pk/иNgleS.~qgoFbV$zTF/1 m_6lɖ8{?Q} bx$xFD%Y`AyըʄdztkFy2(s(((((((((((((((((((((((((td~mkQpV'!FNx||"ź*ķ jw9؃XJ2UqtW?* {%5[gHF{ d>~_:oLj`]iJ ceew qզԪ;m|iE9ѣvGRX`M<((((tq*"v8UQO~;OiֺΡ-T S iҝgh#aE^lҊpb_Z F<aVr /-Xiw=.4٣> Gfm,kٓw^rWvG,}(+'>g< 𾣌B}l3f|O|J47 $O:"aQME: 袊:B(((((((((+o3CE$wRMA8d䮔ʬb3R4'+au=DM*L\asEΞ62^Ҧ艼S[ 5-VC,37 (*՞ ) ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((O \t~'F\?Tr ( ( ( 1 w\t~F\?Wh(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE}#ߴއ$4~O/SX<Eiq{FG|}f_>>5{F|;ZO*5x|l2)$j >RGV[e~Op>@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE~ |^ u1%\ {?:_ %Ud]ɶc0FW~^.k㕝ZŲxo^ZdBf ҿGL乣%'?5 $?so%O<%> [>erO߽-_2W|BN [ll \{~_Z/~ M}6lʟu5aO7i-5987SVeyR]>ׯg<k.|(Gg>ZM7=>WGڿkO݌:ۏIݗPB8nߞkjlkVd^*gܼcuh:u^rh׌k?CBPUz}>k[d9aJ08*<`5wN~Ⱥ7 7V&4]+jp60{_~<;Φ%hZxSϖh_ÿ'_~<;տ}f#+owIƨq|WtjVVYf_~<;?_ÿ'տh2>Yq|WtjwIƨoa?̏h_ÿ'_~<;>[X}f#+owIƨq|WtjVVYf_~<;?_ÿ'տh2>Yq|WtjwIƨoa?̏h_ÿ'_~<;>[X}f#+owIƨq|WtjVVYf_~<;?_ÿ'տh2>Yq|WtjwIƨoa?̏h_ÿ'_~<;>[X}f#+owIƨq|WtjVVYf_~<;?_ÿ'տh2>Yq|WtjwIƨoa?̏h_ÿ'_~<;>[X}f#+owIƨq|WtjVVYf_~<;?_ÿ'տh2>Yq|WtjwIƨoa?̏h_ÿ'_~<;>[X}f#+owIƨq|WtjVVYf_~<;?_ÿ'տh2>Ya>ǯ=כfT.H0{3 5/W߫[.e2>AC 9T^:P7YZeGgck+#E n+ (>~Nω {q;dԔ=I'Umfa,*͌8SW;wU0u9sjKc+owIƨpWtj~[Y?̏h?ÿ'_~|;>[X}f#+owIƨpWtjVVYf_~|;??ÿ'տh2= <'Qo3A 7\c (9~W#Ꮖ<.A3Fr6,0j(EWZQEs5m*].B;]"0R=ȏڛc|u%Я^i0 OvFOx_U78|8l2Ҙȟ8VܑcekNjoeRʪ+owIƨpWtjVV{Yf_~|;??ÿ'տh2>YpWtjwIƨoa?̏h?ÿ'_~|;>[X}f#ȢyHFG!Ud=~?pG`?׆~(xcX4$}vnYުBk2\k؅4u( +;?|~<|= 6}aP*e$-Zw? uúַ3/9Wߴ5/_xRM3Sh.Z7Yj<k_ÿ'dҍRSrI,_Sø+LJ:O5G;xwUVd|E}M??/Qj4,_Sø+LJ:O5G;xwT}ZG4W/Q??V>G7;xwTø+LJ:O5Gի+d|E}M??/Qj4,_Sø+LJ:O5G;xwT}ZG4W/Q??V>G7;xwU>$i5Y#tٞO~Uv-qU-i;r,U{"7UeT/(yI56d`^rWڣ~hKS━`TD[pQǙmN`6wibX%{sH[RP8 ;~pϨ]Muu473;I,1gv'%I$&T>ʗ՜/kWZ޵\{{s#K5^IK3I'VOT((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((O \t~'F\?Tr ( ( ( 1 w\t~F\?Wh(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE:9)ъ:)wCOƿn.|=g4e1ĿA*L\'ֱmc+h/=wb=@UoH'wcq%X~`*((((((((((((((((((*ޓkzheo y݂Ȫ_< 5)28 lqϱ1?J?oRG}hl<;hz|WpǼP?e?,|ׄc>t:yV(MWeQEQEQEQEQEQEQEQEQEQEQEQEQEQEQElx;SxCŚ6|6 k՜:׆tnЉck E ?*wֿf~Z< pپg!$rc="`a%>Dq7/wN|a%_ݭ9㗄ǁYGOkX >֥?} 5-q0;57j-džt@oГXL=+Iӥ%sO{|K)X 6}_¾ID|Ev| +XE9@zNUV]K{?mBҚO2+]NmwC3I>?|E(*YIXzRwqW>W vxk)f2~GQ7?ߊ4QS~+ϿO;G?|EY>GQ7?ߊ4QS~+ϿO;G?|EY>GQ7?ߊ4QS~+ϿO;G?|EY>GQ7?ߊ4QS~+ϿO;G?|EY>GQ7?ߊ4QS~+ϿO;G?|EY>GQ7?ߊ4QS~+ϿO;_W~@h>$#[.2#$C d縯ʺ_F=͍׺U]Vܐ|La*>va+V^0WۜXT(VVމXn+yVh&Pȇ!*jvgϦ (;xĺe@%VbSd(?|Wo v(_mȿ t :+Ymnx(d^R=(WÕ1R`|#>|Wo vxk+5V=_};2?ÿ'h5ը*>|Wo vxk(oaj?ʏÿ'=_};2f>[}Zo u;cUG=vپk>LW34$$n^qՋ UV|"Q(9¾p?i c|6<82k:̄FEFqek=cXyW1XYq3mHFYW7EO_5|ȴ;Uz]I;vgbXdv2dg~vGǾ+ϷO;G<{xwd}f3G>?|EY>GQ7<{xwdǾ+ϷO;_,Gk3QT}M>?4Qj!x1=PKkGGA#l @@k:d$RYN#\?dûΫ*4-؍Σ mПWsnz?|EY>GQ7?ߊ4QS~+ϿO;G?|EY>GQ7?ߊ4QS~+ϿO;Yνi>_kd zbkc2:>[}ZHHH$K31$$((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?4/sApR(((+5scAp^(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWwƻ"FY1kǞ)aFa?ڳJw41xA:%@'@jψv+n8r9Ѥa 쿋DqXz[yI'xWQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWHk|fg|:.-fm?]?_WO_ؿE9#64h|B%?Eoe?.Spߎgwv[Ҽ_ iٸr~tEea)gTVݚoNSZɱsrXZ}y?+p((((((((((((((((((((((|-KV %Ot}O=̍ѩTy=͈ѕzQumx3zطrӖwl}0SluK& qn 匩8#8*G}+O#_~xtz=<; .+ϜQIݞ!k*(Š(((} -&Úƕujt6 ã+p G ˭j;`R(c?h|Os渃2Qy/7<qx+:K}#<* _4x7goxUrF8U\N;2U)Sܬ[8iTmv?Ŀ)9m5b)牭m/ÏM>cĿU>}A.%a4s^'/ťkS1,dئE~Y C QC֐;dʵ Ooh5}B=Ȩ?V)׉/|?gxFJ8+ y}Wzu((((((((((((((((6qk:l;у)tPW*o?#|&Ph歼w:ߩ~?n_Ԁ7SD`+R5_,ڱv_5TB43:Kޥ%GO?u۟ ZmH،k/Zφq̸-|џsJƞo SҘ[Nʄ(yC{iǗ5φ.dŞ@|>FõJ\U}$c,agP`Gti+>=xO{tOt$ 1JDw?K4SQfzQEzAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP[~v]Qltc4Kn=Yv6SWZ[Fe8^ξOnMU3`=ìvWpFϝڜw>8<=JUg𧲶_15hZ|1q>s8c?\umWMtv$ vW4r\HPowg'3UOiS;I|w ,nz{">^wQ%k%}UzЏq_to><ȑګKi'}|y˜zԥ_Yl~V[O^0ٜIۙQUOVRUV)+S@((O u[iE/+ӷSӆUՍ xe  bq2wo߲WyQ kQFAas_Fׇ>xB+kx<ۙ1˱8MP)*~d瑻!Sߠ{Ğ$W>]2oУ]:< w_((((((K[[J-t{}+ֿh /G .6x_On|'ݿ_z.'lÔ@2_6ė.sėn Q¨~_rUZVjT?{:x>_cE(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEApRO \QEQEQEcAp^1 w@QE(((((((((((((((((((^/~ʭ e>k_;ϟW{)Y_x|i|Bd^Y[ꐡ=< REx/W_֞01 V:(Ֆ>i(((((((((((((((((('5m4ڬgo1WпX/#w٭.uY_5(y2f|Ak!}3 x/ňy:[PV~-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@`<]^*ď0)= 61C|ֿkZS q.G*lPt6?ר5zi?[=4MҞ-zoo*iO=77\ÿ3or~-oo&fM7G4瞛~SſM Q<Ϳ5zi?[=4MҞ-zoo*iO=77Gb?6! hko4Jxy?<[sj*/4ƱKhIJrFrMc5zi ),ık{&B cJxySy~] j\ܪ[fM7G3_禛SſM Q )߆⫛1xumNK'Ϯ˪@ݥ35蠨>JxD346#{OHz?ď#?瞜?U暮wj_=Id9$Aڶy[Prx?i=y^<;gKjGUm'{EkIk#'5<;B+%)T?VNVKDQPXQEQEQEQEQEQEQEw|~%|X\n8#*~Pݟ-gv-N5Kt5n "HX1_O_H]\JK#uwbK$ݟ=vmWU?tQEQEQEQEQEW|G&^0~aOď,@&kᬗ-|qԟZˣ{JçK/gq&c,%Ov=]Z9KMmdAH/|Z>!.|KmC#zE`aYgLlm[gPí~m^(Oh(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((O \t~'F\?Tr ( ( ( 1 w\t~F\?Wh(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE}+!*: ϟ6m)U_?T _Q|AiEԭ5$9 ؙE~oM7XuegếaV̖2o`ЯDi骻aI̿8+#M}։tR+ٴq9UoSC]/9ᯛJעO[9~,?_UNMv_ '紿/OhbQE~z~QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEOc{>{ݴ+$Ycz:7ߎ<oK\瘤#zu_j~ ՓP 3/ ø"d:9nUj|/x }}?t-BZJ$he1ֺsS6-U-x#o6 QӞmE}rO*@ukh#TCNq,4H^/Isn.Wˈ{7ӊ]ׯM˨jW/wu)AA_)q^)PKoKϫm?#gqxpy^k}z[]1,4Q_EPEPEPEPEPEPEPEPEPEP_g=#.шI1C?WU]Ɵo첳JfEacȫiO7keFmGC!ϡeyy$fG%ziQEQEQEQEQE>8i8ԼB$='7)r\GO <>^7gͬ,xz"@ig{Mvφ#qs̓@~T}3_*ڥƵ_ݿss#K#{ʿE?(_*~'/yG݇bQ_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@+пʕPEPEPEP]?뜮 Q@(((((((((((((((((((i  鵴`kX%c ~,_ƿ۟K&=i'`5uȋ5~HQ]¹o b3Y6Ƹ((((((((((((((((+/<1|zkg(P +&G,kO2TpG'>xh?ޏd}3(7M~FWWi|W_G2^R}~+z(((((((((((((((((+'ߋyc0OY!nܬ5z z? w O)sW'A(sB(hoї-}sv/oDnĪp?jGoۼFO{IHrA>^32xu= Wqu } ׇj`jsḲOK$W_h׆jWL>`rq֝ }1Ta^I'Q\HQEQEQEQEQEQEQEQEQR}qO<0T5,O@^ٱ--ԖEAz~W&ᆅ/W33L&WX/>sac{ >#׋F}GMV%((:B(((((((((((((((((R Gtc,m}##ʋfڿ*; huC(՘s&B=u_)XEG'ca |@G0(((((Yfnc͖C&~붼kmigqƽY#[? rv{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+{=;KWwo_LzZG[ZBabEUU-pS[-|V~cfXj=ޞK (3*jMX_BRHۡ|{*]6$oi5y7Ư:(,LnW 0r|?e/0ªazz[vϸ\eJJk[q,wo&fM;_`/k{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+K$i%"(bNֽGşNio]&hωZM#NrGlGw@Z0cx\WAϩK4ikk!׳p\z}X\j]FȬ-{zYy3 &s+fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?y],wo&fM;Gi@{+^ hogӿ4`/?h^ ֦ y>]LG'aUhm=L<48X> -X*ÑKcǠ|4\M$I,YݎKrI$lSMy39\ڢ!eQ_Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@+пʕPEPEPEP]?뜮 Q@(((((((((((((((((((躽χ R+aGF Q@?P-"S}lNjd__L,>܁IoЄȯ#xdhR+ GPhQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE9U` 3$|~jZdEqiOS*o)1 y4~l7:ջΘaIJA5O #Vդp-EH>ۮTPEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@L~>.{HZuEY>boQ~mƘZFlu/ݰ_x|Jּ_dV7I1[~(X~5ퟅ^oG*_uXg{y%F[ @#WC !߆bqaTIElx|QիF.Owc?xS)Y)֯ ҂oek !߆gӿUtW٧K?Y?q,zwo*i=;7^WE٧K !߆gӿUtQD?q,zwo*i=;7^WE٧K !߆gӿUtQD?q,zwo*i=;7^WE٧K !߆gӿUtQD?q,zwo*i=;7^WE٧K !߆gӿUtQD?q,zwo*i=;7^WE٧K !߆gӿUtQD?q,zwo*i=;7^WE٧K !߆gӿUtQD?q,zwo*i=;7^WE٧K !߆gӿUtQD?q,zwo*i=;7^WE٧K !߆gӿUtQD?q,zwo*<=wGx'77R%ُ-L).s4cRwu*A k՝*đ_5+].!Fu.א2O{4}<~/Ѻ>*RHM4E B3Ò?cHxy(?"_x`Oi=;7G4?瞝~+%W@TgӿTHxy(?"_x`Oi=;7G4?瞝~+%W@TgӿTHxy(?"_x`Oi=;7G4?瞝~+%W@eBn)\dNOEy5qUZrZF*1]QEtQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@+пʕPEPEPEP]?뜮 Q@(((((((((((((((((((($>¯&XX-ۭ|Ux+BXagtCk$?hKALChF4,f?*炿:&>3BD(((((((((((((((3 QHii#>.VLp% >$5 _ GrnBc#~i׶ <?ŏ:0lھW昼nxY_<+fpPBףǏ]Gfld҂?%#5~#OU.I~ k +*qg(rE>;-z|B|rkj߂O:|L!]+^3'Sr4Q_UTuO>ЊWDQEsEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP~^MobmA82؇snw4[ɘMҩ͓QII^x&/-X&kOmYT϶|ϣ ⧍#5 %nc_€9J( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (:?#B*W9]+(((? #]+9]?9(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@&)[iǮZc]Cz;gF}QEQ^!ǎP heF-\GpYޠ >>#oܘdX=ć)q@j¿ۢMMNn5 ;^#P :[K\iRR?55؟]Džgĺ4Ct? _RĀw*g?+ot> 1m|XQ [#H2q|@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ig@Wwj1;nv 3fW?&6<{?le>Lcꢀ>_|K\[Šٯ}6?_V_Q>>x^ 7[dM #F\(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((пʕWGh_eJ((((WGkezr(AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_>o{%;~jn_1 я¿+_3G$ǑqmǞբ\?~k]Ƈ^鷉']^px+?ګ.Q:xU~QEQEQEQEQEQEQEQEQEQEQEQEQEQEW~> s~dPꋨv+\(|FG+cownuYO)(F1*G(.tt^ҭtc|@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@?Wg"4i4H7kwO c?yoc?|?sh#O{tVU;HaWm /xh_r.þ"gq(}Dφ?*U/oOB7z|K ￈\g7yO>-ƫqy%.U@ *Gn_ޟ熅o+ƏsjM^K[B+#I% PwO c?￈\ /xh_roOB7w>1G;'|1Wbz|K_п ]}Dφ?*QA U_ޟ熅o(<4/9@?3 þ"gq*7Ŀ?>% PwO c?￈\ /xh_roOB7w>1G;'|1Wbz|K_п ]}Dφ?*QA U_ޟ熅o(<4/9@?3 þ"gq*7Ŀ?>% PwO c?￈\ /xh_roOB7w>1G;'|1Wbz|K_п ]}Dφ?*QA U_ޟ熅o(<4/9@?3 þ"gq*7Ŀ?>% PwO c?￈\ /xh_roOB7w>1G;'|1Wbz|K_п ]}Dφ?*QA U_ޟ熅o(<4/9@?3 þ"gq*7Ŀ?>% PwO c?￈\ /xh_roOB7w>1G;'|1Wbz|K_п ]}Dφ?*QA U_ޟ熅o(<4/9@?3 þ"gq*7Ŀ?>% PwO c?￈\ /xh_roOB7w>1G;'|1Wbz|K_п ]}Dφ?*W__gO2˨_34K'eRB?>% V'lo }JKHQ{ â(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((O \t~'F\?Tr ( ( ( 1 w\t~F\?Wh(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEƟ~kɲ/iZqT\/0?zπ6~5x';gg ƀ>x+''O{"tvvߖSvM|_Vm|t폻 _QEQEQEQEQEQEQEQEQEQEQEQEQEQEW7G_O86T47Y#p]NCЃOͯω>G Tw>㍹5?mݺ51}d8~'­{mbY充Ѥ|$i/:,$,O\v co pxSC=Vk?% =Uef0kj(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((пʕWGh_eJ((((WGkezr(AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP?ďO'm|_xBQumN=Ykbc?(_jhgMPҥ-N"?^6.s#Pw]HU :( ( +i<[i:ȊsDf s_>l->%w~#NM7IY'Ǜ'קzsCbmὁur.ּk׉lngx;Ua,Ị?q@W}o~_xJ{ L`̆Lah((((?٣?9`]'ÖgHY1+q\@E~|9]}_ڗo2mFwr@Sٙk?OZݡOnՖ_|'7Fh/$^s|&n5'Le͓!R}~<5}֛ϧ47QVR2=S((g4/Z`dEEXWĐ|?e,o}eV(Ϝ@nq޿?> !$mmX#O-)H~Bzx+a#S{͉Ljƿ~G˶#Ҧ9DZ1U ߇|KKBӧӛOD\,?$qۯ`Ȋ+to<ןG:7 D[[Ynb縙qgbpԓھF`yȕ|[A7τ'RFU^TʹcٖmOgi5giu^p"܌((iO:/SqiAgtOaIpGlj7?ZZiuo / GuW7|q㧈|i Wny2uqa u2IZ+to<ןG:7 Dѿ?dG^%ߌ2x#?>"F`yȔã~0JwOu"QC'?:(/ٯ~B`мgEkq'3kD 'q\YwO7F{]3ÞLѴ(=I'$I5`5hzi4Jc;<ȣJÌg@Q@|<-|c~*z/D_q wd<7dUoxz~ei-9ɍ8Wۿߌ2x#?to<ן@Q_nã~0J?ѿ?dG^%u_GǞ>cƟADq26=_޼c I_Lk/’y,T'=6F$~ +{ OcVxK/9/eXDQ.]ֿ'x |HW,[X.nK+8`? h((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((O \t~'F\?Tr ( ( ( 1 w\t~F\?Wh(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEl7Ś]xJuSaiW̉îFTdw=sWWҊ/}|+ύ__KǫJ(zƯ |Hwh^,x{TԡHA+lV e ̤t>;G"0et8*G E|~V?»o*E;mfՈ #Qd>͸zUQEUI1 u4>1 u55=_G=__Q@l>1 u4>1 u55=_G=__Q@_Oo*5ϯ]/(EBoz=^PIm$YdBND(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((O \t~'F\?Tr ( ( ( 1 w\t~F\?Wh(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEt$x?lKMZ}Y9K { ~!xwQG{- g?13{%~]Q@qEg,M@816}goq^=[ }{o{Q>Gy*Z;]W%|¹X-cB(I5EQEQEQEQE߳OsُXԴy3yOM郘/\ F~wWGT'<{>k߳hfjRmܶzUvDԊI?D><Y/.H[Oyc 5`Rȭ~|jZޱ\M{}s#M=ĆI%v9ffߍud$IA *ѭGՓ56OWK2A+1gdkvC'C&oDgZ<1,%wAV>)qpĒs]jn-dtGaQ*{g滝gc3sso)2o";֦#yO&" p{t5Oh y9{*[(Z>Yс9#/֐)HV@́Y^OZO!blT/X 8Aܿz<'j#tBX +,F, 3)1P]Y6+C|zn}ROx@Sb2 ;A8ڀ+x_E-mX#T)s]4ojZM-خؗˎ= O d\nj57:jV]\įP#G4x$n `֮ /1i |=݆Ƒ^6W 2r4iďKyxd†@qXr.~ 0a?4%I?s>^:.ssRXE|I674c#31 gz4}s/(cUAr3@'DYYM<7א4'0J '=8)ew{q{l`tLƁI=+=sv0|4rm+d0 O8(}wAƎGl! -*Is9x H pŨ|sqm<Cu(s ev*\)׊|%oRkGY1h sxtg5xk(⺞)WHAny: -;/:fsC-$y{$qّ8MxZnO]hwZVq"c܈V) ռ9VoomNy-7%ݣ+v3hk^zYt/[K psTY:oגE} rNFpq֮-\&F,ϧ-m*. an]0,+*Kuc8Nv <9qk+ִITf /&A0Mg".u9+KI!J}IflP8uhZ ]A?VKCIo[k0 4 _ 5+a\Đq7WJNCӥfUQ1xPk7խ|`wV@.xxzS֚Դ#<%ٿ93ЖHelg#>1 a h/qjѲBtAT5,QCz r8m#4խmV[kOU`ޅx3 ЬMQޱ #O^iBfS4{-Ee}ў3CU-o i̿qӏR& ۬WvFaVb rU9@ "Ŧ&7tfATxn:c皡ee>tʭ3Ϋl_bh"vfY2ɎHװA*A#hjz GO 5S^y rp* (W]\9W_ȏC^%]4纈::@4VrIIxʔ^ЖKY݉$$TQZEPEPEPEPEPEPEPEPW7ә&S$]d=CEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75'&FM=GEI紟ѣi?Q@}o'hDOtPh{I}>75Q^c׆S+KY7S A(US${H3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}{ g__π/@!Q_^™W%3/KPTW׿|@?L +T)"_*S> DU|E}5㯅2Eu̮fES1  ~qtWiO>i>߱@]}}`bϬPEvaX?أ6[G,Q*6h#+>?JO:R[;A,J.JV r@3?JO:+e5\dV #hZ)"I# T l t:t s,7"J6'd'VS%VFAsK}U<`vIr<@γ@m ENED vJ= lՖқo.,2gGQJ4ZFk2F'rz c/1_ {56η" MٌmrHrrp)i0Wh\A+2:j 4g\L<')/希:p+<3S[PzgC)ʑ}kO &UިQY&2NUsOkUba_^sb'bQ+p9`A9EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP!GIΫljW5w':ѩ_8i|Y!C9d1mO'3@ֿ_HIey5*֝\Zryw8tlg~'IҴ>!K[Ǻ2y8 ;t/i_<vk 8vF7oh &}@.>غ5@.>غ5@.>غ5@.>غ5@.>غ5@.>غ5@.>غ5@.>ڇ5@,2R:Mo53Y4hKehƧ3W 4Uw xJZ |֬*JۯEW+?UVԻ_EW+?UQK??_EW+?UQK??_EW+?UQK??_EW+?UQK??_EW+?UQK??_EW+?UQK??_EW+?UQK??_EW+?UQK??_EW+?UQK??_EW⪵u:]Y2Dycq^YږFeMLj-˧Vi[gE@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEu/`F [F ,Wdh fUVspjneqJv65z~,P7fQ%@?)#UcMd^hm¡acmTt'5ҍcC+5O.C6Ձɍe 6G'?Ҳcӯִ]^n^7d`  j)L:fp̤eF3t==j|}̱\G@Os8Z\:wi#!̷(v-׶*NOo0>h0E?_{Ŋ$Yc6mI;*pG#Q]jz`@![[ sG8t'Wt3}& #*#:zUSiSoB C  <+{1M̨G+zqjmCfcSq>-Cm u޻m"HD*֒[ϖ68pyJZOo$6 Gq4=-|:b,?ǀG<k^^Yæg`u@z ĀItz fyn7<} lK \kٽ$ !{Y0T#lIkoM!^- [IJ0ԭ<1iZY15 9I']ók:Ϫ#X|.WN ѐ$c'̶Nʓ%ui.6w'ndO$PK?3qZ\[Ϧ:Iv\#B>躆vHs>"okvE-EԱǦy>P sy"QuL1 һC3>O_66wE"%b7t1ψ!rMkxB!d+Ei_(Oտ_KCQ_دaEVEPEP]'cr]Mr SZӾȽq_M%rcg(R]ݗSJWV9MÖd2Imq#(J>lg`@)ǦMߵ#Kȣ}lbןIAaZJKd$d J{~ؼ=*5Zk6UJYՙ&m$;Cm$`sq׷Jl6}yzVV3iCl7-d}C%w`^dqԭo?odsA M5'wo=j N3HGܳ㹌b7%vaZaEVAEPEPYzЬwEKe EOR+ ( ( ( {ᆚ߇t i{>;wy`RNNWy{?-/ :[bE_H H`#ڏ5M;g"Qb9# #x_LO&@v -lb 1Bdn%"k nKbI2:-. QEQEQEQEQEQEQEQEEE4#+Nѱp 覲kUqok#Lx\)g(< @펋^^@e%~`dmr}*}k:=đm~rs.#VcB|?om>W[d]j%3277NBbO}#m:a>|9ąmwf s^ ?-p]nٷo=3h>yGr2F#_ڒX궺-:UYr(eݐF1յ;AumbMjIVV)rMĦ1uO/懻>|Kǝ`/H[6O0\5 ۱r9^^W֭nt:63ƾd[UGxx.ES(((((((KAЯI[i:d>maA8u,O`I\> .Hg[ ˂%|,4?"EݳڤpT۷^ P&u+xm3@ mXWA| x7w=Vxʣ *?_V /ea{} [dpXcH5vMmkN}/WnnI)9DQpybA*Ik}.qMko o5FQ՜\m}#?oѦ^@~а1;v1׊|o n-^AʑWiM 9 38$gWZjxb.4tMfyLvlFggsG;N=A__7wWӏTqp` >.h4yIF3sӭ}uB {kHY͸VJ_j:ϊ^5mvk͚ϐ6/#ǭ8'yF{MYmGSC5ZB[a~f2aqYAxC˻$36ur7xT5;2X\8ln*!\jU\qm ƪa"Xfԗ^>M %6p/4-KWi||qȬTMS,rwX½ė~q㨭u;n$ʋ,~f֣e߆{ -- P3gsJ_}lyQLAEPEPEPEP[&jr̖P&!"` ':OoQX?ӧDQ ':OoQX?ӧDQ ':OoQX?ӧDQ ':OuX\4cE*`ING$?E`ING$?E`ING$?E`ING$?E`ING$?__k&^]@W]W6?F5o?i$V7Ҵ/ lInk? *QNKe\N6} +_C !dk_oKތ>_+_C !dh}>_+_C !dh}>_m_Yc Xe5? M{O&E5'u3Un1\_MLMTM|=A'G&AV<>"Z?V&A_C }_Uf !dh24{z_̾Uf !dh24{z_̾Uf !dh24{z_̾Uf !dh24{z_̾Ufg/_/j&Awz<5ս]^@k18((znwj0]Bs t R:EQEQEQEQEQEQEQEQETZ}]Y\mp,.Q#r8$TP]Fv<Y09QEQEQEQEQEQEQEQEY̛;ש?Sk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEQ^kG;z?;׫Pk^Q@;ף;zEfOfaM׌UjռW?ePzz=Su=w:ot)%tuصuL$/'=iaSR2 FmLpFFnztiMՌvrčg/ڗp`sxk[9442#l!099t]R/u+c> xfՊas1^֗1ǩ](ғD]+u*([q#=+Y~ld+dF{ {{T0T[hZwNT,Trsi+ov_D$ӭn"zdeM@ۢ3=a֜&6:mI=nr'kĒY\̓4#nԒY2+Str7ח3Yvťq>Tz҇9{4 j kun 7ʅ#??{'ڸ ܽEޡcZZ2^^5lk/Cm~QEB ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( W?eVz*5,ePyja@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@VEa@)<`~5E^8$T,]mG]m]$Wp,Tnteɇ]S|b]\xfK}[77lw"H?ת$JR>QUú},}#rx8BĮ[u*gEti9g\ )<3NFi[/Ym=1>庰]Nf4N. X|ep=:U<8n<ped82̑g\4:֗Q[7,/!ψq̧8֬A[KoZ)eQ u?ilt/&fx24,]Fv2Ig@(8k0q'SAԊvs[? 6j.-f)Ki9b:YkycQeSM  ۾fP'{XtWKsf_I/zK)pJ[[EC u%08Kӵ'?X*94d*Qt|Be#B8ۍy"Ȼu֧ԨM?Țtg.D ˑ |!ݿ%1(P]Νbn +l%TaJ-i ljQ"e~Amxf̭{~63xotsWG&bt/$Kh)%Y [3$AR[9|{XH嶞&xvb?{ڮ[j Z5.ޤwpwFцPzMׂQQ]&6G4'( %IVFש=bs=ţ,@H]::TO_ uRm>%EkkZ$@rgV*. 0*prb{ւxG)[9XZI-Y,&OμxU:TsLJME͇ M7sˎG^5jF@vtS.1j: ֏ov_s$$RFa&+ z6y#pɨ4T_ _%/,N@sSU`T2(ѠAqnW4{%۾  WI c[x2iݗΝ"BL6@ ~U]):N娮|7lwmU[}wdd})DkojcȰw&WEK8^o9+;yo("=qƤ$yT?ۥ尾Io9T.4-F."KUw◍de9 ɡkc 0 A u֟&q>a&"oz*5;cߴzat1[Q]5=ޗo4W79Ud'Cz]wt^UYX?{ s\H98x9J+ׂUo4:̐HHǾkm/%[nm̈́ P?(ɴo϶VqQ"UVWuֽVh֟ ۴+*ųNxj4Iw-*@(p)mW98&9Z+_\4tk8b229vkxZ8KVH5lk M ]sWcwᨖ g-%08r@רQ/neidubW%aBslе1Ev7luH[iXbbJ#$đӃӵsФ|vӸڝHS֒w*1}u WC/G7w 3"ڻ7Ĩڰ/s\`V#Ep3XEh A0#]ǀ.ג=mXqQqrWQđj~l2I>SyRn:!prp^iku)-{֯%7' j:]OfJnNKe&"Io]b+OXWJ<0=}W# F? J4oOJk]}PdZZȅ#շN8N ڀP?tFG%7' L3KC}Cm-ź*fm9[Ƹ3ЩhԌqh(FM7w%s΍C Tư jx[DX+4'8b~ˇݻ9ݻ9i\ɞ[K9O":0XT(+d:W F? J4oOs}CΎ-Jhn.UnN[)AusYmMŝKǒ2Fqu|?l>3rQ"dc9f×ks,eyVW q 3ךâDcfYW|{YYy 00rsZơI( W2W\g{P*得yu=Mې:sqSHcW~YP#3(i4Y$N۴`p3j!jF EmgQZ1Z3ۋpA3|=hZDL,J:QG ,{NݷK60U8ǹ Z/El6xўOY#v'zLҮah#ծU#BqB1ljWmlaQ] z%$6%ֆ\\)si?nf&9T]62h [7?m~_'vzr +~âN )c,aH\aKai7A"w0sR.4=J$[b0L++0c2J@H#l 'eFH?)8 *}ͽx$OAϵOqj6 o3iɗN=4EixT-$B\P_iWr\\+#ʒ2=:#Ғ+~|bׅ 躔Wj21D4pߥx0K@PV UQ}Q@7n'N{,b;/x@4hs ТF;כN2:&-ailͣAr R8 \s4w<5giIjM-pnZ2 3$!=9ɯ0w>QEQEQEQEQEQEQEQEQEQEQEQEQEQEQElOXdo<MX4t4׿y{Im^dqpk)U91}Pnubs-$0U 19 ֣l g,H H1\j63ih?md`Miŧ5bmgR=ON 0]",нV ў;-u-:]:HaddR8-Eig9k t^b6x)*~i/t{TXdO(H$  c^Q@FN&o-s#庎8Rݬ>e21P @=+Zt$󄼀H!+C*ay0HUu{iu-j7Milʡ-ڸjsn&-Ÿ뎙+[ˉn$*d=liպiV/-., ŁFpy @eeI4jbм[ >ԬnoZDH6?L6HQ@q\ I Eš0ɱpr24[{-[4/ykR`d1ccɮBw0eY&?xZPf0I>A8'k:=K=1^'6W$p\I5 I)EضANu:e<8KK[xlrݸ|G9IV[}nȚO,A#8PX(vjKd 3[ CH\]Zk605pԉ |K?+ThJU) GjC(<>C*JZ5\um(CBzg@ > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( > I}I}( CD̡=XUuJ.__ bmvxsHKo4h%$g'~:Ide$*#¾A@>9deԈdc"<Ҽ;_O֭R[[YR x s7?qpqߚ~׳ەd=HQH?e/Ѭ[ >- ͻ]\!JhqUokĤҰfO?;I+iy;zKS񑶊edT2q(0pzx^Ωm,:a q:0zĞR/iej~Q1#̍0z_ޝSUMP61*F0 I_[S~I^_y>[$[K4~g2a bqi c ˦ A{#*0 ِ`@ 1YxK?Mab]+ Qkk7KcQ_!SRœ`S ZN<̂DHK-# GXW]KOkKmeisbO5R(EPEPEPEPEPEPEPEPEPEPEPEP-CWbb'gGiAq+E # s1ۃpfXIuI$1V,i, oosΤ~#up8 쬬4ԍÈ9 nB cw q){/-Fc.r~PEַD=Г62x#:zd:y|6{3!;d=X`#tmRk=H8 ө5E܂{dCsBv*w 9k+ݖp$`:S gLI%2N\`瑂qc'.pI--军e[z Iwc,&1gjH{i9Ѡbz==i_ZK_)2BpPg83XYjgvp̫1ÜTnжi2l@\1r=*_k &~\2ϪZ}ֻqu aK}hЇ?788&5du-FM?qfF-`qӞ"+7Z mu!ձ RA#pRCxIS9sJAw-H,j}s4<<Η׈q'IW:xdyY]kwnVW#=Egilm3TI F)͂k?'PMs H"T_.0Y>nmI$7r#07 O6%TfY`Tsi!vXd3 ~TA,jL'#YO2Ⱦ^ѽy]=qO>c\츺h΁. cI57y +'eC#'9 皯}=p BIڀ7n&x͝3SnI=TLt6h5$$RrÂyШy2$䌂ڴ--ӚKpZD.0CIXۥ@dR1'$K̸P߇UvC~ΩSKTRi@Y1yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74r=d|O*74yY?@(~|O=d\Y?G74=?RiHiرGJ <]mnP俖S)Tך? [b HDe&g# 47? ok$q @0lw]wJʶKY:OZ۟" <}M,W=B[&QEQEQEQEQEQEQEQEQEQEQEQEQEQEVDžI_X'ɭ[ ^K}2W폐XTx@YHlWœʒW P0ϓq+ٶ<={tj~щfy{ր9?FPL.-c3c;FG5BX TYOb8"q+u]0[uÌvoS1b'7SdLzGaۑwSK㿒Νfey8 cB4,ճKZ>~#{wݵwcϿ@u֓246(IjwW"ǁ>djH$1f'Xfcfw+8y*ϣ^Kl ^_ px]rx MpV;yH򧞙FO6^fky6ZWbPԌs@:<{\[Ddr3}G'Deplwfr8V􋛨d~=ݵ y$`w]N/ $]Hwbɠ&nay$q۫,hwFy-4hvfy16 ] #WՃA5şٖf坸\c9$leݥf ~i3$'--Omt.Ѥ@,p`ztM$ c,#)0_ `1Aֺ(4Rɭn-cD.z zcjVirSM7 U;dzfZ`˫)@z9&ӤX ̥J=b2[6ZpdWE*yލj5ijKk3Dxǁ.pqhM&ςv(-p $j; 5G rz}EluI#~a;\1Ӄ\~!7'RԌR3ڗQ|2R/,糁%a>N9ph尀MkĆ'hGv8<۫,<7w?(c=#7 EX#H_=#€+V>?(#H_ U7 >?(c=#7 EX#H_=#€+V>?(#H_ U7 >?(c=#7 EX#H_=#€+V>?(#H_ U7 >?(c=#7 EX#H_=#€+V>?(#H_ U7 >?(c=#7 EX#H_=#€+V>?(#H_Xi%LƮN2 ªՏ7 >?(c=#7 V."B 3w:|=ozGdo^!zzTdo}Pppr:ҳbIbrIj7 >?(c=#7 RE<NPH 'zGdo^FGzGW}QF@do}Pz*zGdo^FGzGW}QF@do}Pz*zGdo^FGzGW}QF@do}Pz*zGdo^FGzGW}QF@do}Pz*zGdo^FGzGW}QF@do}Pz*zGdo^FGzGW}QF@do}Pz*zGdo^FGzGW}QF@do}Pz*zGdo^FGzGW}QF@do}Pz*zGdo^FGzGW}QF@do}Pz*zGdo^FGzGW}QF@do}Pz*zGdo^)@6]#H_=#€'dKdG2yp)dc=#7 zRT[,]; A@m/ZB?ξcš7RԴ2$i]GFp>yV֯"V$ƍ@O|@xVWoI Η\)9lz֞ Fyb%H;p  d3CnL.v}.^yUmsS߮:x{-Cyoe?" n~SaqsWcq5;i($UfuX—1(T䜃F+WIx1{g{ 9$,`GBG`3h((((((((((((((:}V,)s8&G3ʎVv #$@TVh*T~l[w7FHTܷ==OJpg&1} 8 +tUh&^/> nKÓu h.؟ó[^Oo%>|H'~57ؚFmx2G2$#|gc]$\i_5a((o-7c$'sTm,>%D XLm|v 'h>Ht"۫vd sEŴXs6F=> +zBݫټ@C8`8zUƁ09.b[eSEknJ6BI8l@֫^og\-Ž <; ˏ :Wn?7]P`Ox|';=]Kldīppgg{xK@Mwc݌g<']3FodԗdB`|F $5KK6쯒kkbTg@Hd|;W!EPZ, o+MŬw3bA[7Z ꓭ*TX RNጓxWQC|-ߗ4J;69av`C3ȏ;a^ju j[&Yy<%$T$p8I=뜢 ((((((((((((((yJI!OB*{[ tlp$mp`}=OEtR:vh9*޿ͬYj1u%}|nC1F=(Kulmk6;c9#l:풥om MFWk~2Jq\gb#V$= 4a8Bv -:gΐcXK\5ܫq{<Y$g9h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (7֬..\}[?h[8_7du*pT})(yko5^qGyW,}qU ko4}z(yko5^qGyW,}qU ko4}z(yko5^qGyW,}qU ko4}z(yko5^qGyW,}qU ko4}z(yko5^qGyW,}qQ73$`^GL ko4}[]6Nem* qGy-Ρ+l̈dm*;@>?h[8_񨥊H%hNH# 2,}qUv2K|& \=>\'yko5%_Eiwng Z\۵:gtEeqGyE[[v>g'Rkϻ6w1GqGyFM"H@B RMcyopύeX>?i66sy7V.3T*q4\ ssG9u@[8_m<ƙqm=dU)V PH*"O m<ƏKk;)km4JąT%YXRG9 ?h[8_񤹲(.fx=֣aw.#rQ ~?h[8_ 'y!ȑ#6+[G dXtHAqP?h[8_?>7wmv4ko4}io48dymciU0A ?h[8_P>?jcm<ƏEX[8_m<ƫ@>?h[8_P>?jcm<ƏEX[8_m<ƫ@>?h[8_P>?jcm<ƏEX[8_m<ƫ@>?h[8_P>?jcm<ƏEX[8_m<ƫ@>?h[8_P>?jcm<ƏEX[8_m<ƫ@>?h[8_P>?jcm<ƏEX[8_m<ƫ@>?h[8_P>?jcm<ƏEX[8_m<ƫ@>?h[8_P>?jcm<ƏEX[8_m<Ƈnmѐ=*X[8_m<ƫ@>?h[8_񨣆YwqRIڣqGyW,}qU d2FT +믂I4?o䯑GJ|c]lv +Srp;s@fOi7&C>e);z#^WFF6UKt뚠V}*wOw7WR[oa G8sW5L$ҞM7WO;#`\ Bm=!xZ퍾vyA[zpxڤb{'`I`4drwII7FƏ}G>KLlc.Is+Grlα DV*cIjQL(b ( ( ( ( ( ( ( ( ( ( ( ( ( (4?kioubCz&B8**g9,Kgjŵ.-drq۽X- j0!qtwpYipǫ\De!B?7OocU.;Dq+Klv͜36F>\Y\g{EsDzΡBR,1l#sgBxI-MoY 0IE;.ȯsg8:UV2\@аA zRgP6?c7ݳ9ۻgWڋQűǘĶ]:c,hdV˶ECzŗTI`,h!n9Qҟsjvgtgn"|teMtsz@5[[fRY`` u>-7\|%[fKO` _^>qhԬ99R6ةY2\$]]yp  Q>~lq8_ƦKMNٸsw;#1Ȯx#}`|y(I-ab,2DhYʒ2T\\7sԝI.Az@SY귶 m6uT GOS\A@Kh81+~UtzV;\t괲<Ҽf8OZeQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@D3M>}@(hH՗@ہm*:bXfG}O!5JmsQ6nV;33;k{qe}SE&KP%) v,r߻ \DcLI,EeUʒYwsglꗧ. ŹO&q i$$yqORB =ր:=:K+;X| Vd*iqjY$?g)u,w^G!k]oPe0HWa9 ( tz\+~b!G Aq؞E>OğaD 28?NJF-d]s\IfpA*PurLS $d0!l>I3zbaŐFϏN1̽Dd5\${sڭj#EM;I_ƽ+:>mJ܋">NǪ8x+k,ou]:8/w-DA=!A31ޒz^iEI>q&.n늎6Š(AEPEPEPEPEPEPEPEPEPEPEPEPEPIX䑺* U5H夌t1*$c*χfK}~i$XXޮYE0jZCtfa`BpO>B-K9fh㈱Pq#Ҫ]]5l.2G:WU=ZL~ohڳNID! xޡRg_CgQc1]ZY"ߗ'<=zUYtȮ~yZC#F/=S.fӥMLxU@[;~n ՜6څWlQb0#by] -&ДM& I dUMеFo;;3WNU ?%k}JZ8|0ESοxch3UѮtU-1=?Z%0G<$2}2Q[It_0d3Ӷh.#Z{g,;ՔT=sKt] ;c0\ vBF,$ ;=溺"Gj{iF;Z+O8v uKK_$U ߀ܶͼ,F?6?KE)im`nIϰ֋)moV)Fv'<(?E1|߶ٟ=)L Gu2f~llQzfi m H "?Y] ;{[-?,n|OF4]A޳m0n42]ǯ-8cymaas7 ﰞI TI::g9$k2XL1B'{ G!Mztٯ"ʋ,O`_5EK6,mS o,䪓FI䞵Còfc'R $xCJ#c'*>Xy"XHRO 6e"+CKrXd,x)߯J-d1pV8\=8&P-k<HvLw+j+{6Q #.܅3N1kI[L66qF` #,IZ:zn#[yi=ϳP!*yS5ōݣ"Z $z֍75we$s\vo;Add6j>a\4)R7,{Ҏ9 P ŝ@.I9˛;6Ua%B^kcK}} 5XB=>Kgqw ]SʔJv:dj?7]P߇TvB?ΥD=I}dGThOhOIEG}dG}dGThOhOIEG}dG}dGThOhOIEG}dG}dGThOhOIEG}dG}dGThOhOIEG}dG}dGThOhOIEG}dG}dGThOhOIEG}dG}dGThOhOIEG}dG}dGThOhOIEG}dG}dGThOhOIEG}dG}dGThOhOZkӵ+F8eT6ًS2OJ[*8l /Z{Ez"Z"J-F(m¶cfwLmG9c>+ZMVWM5w+JCT$-]B!JCO,ٛ|~\M<xǽA4N 1],ȓ0*]ٹ&px9/#kYjMf3O3Yxd#&b1- C dzW}yŎom-,gH4Է wyQێ2zt ="KQIdpF#VESQEQEQEQEQEQEQEQEQSZKy oo'LG9mHvTϵ s_Ҁ9+~[^Ib-9c.Nrn1swoxnn`0[ Ic% qEmri-T9B|QhPT, A=@WQ趦Su-Tm9F^JAHov8L^Vп0Sa@WJS^[\;ChYg*s0z油Ҵ]oNGh"+9*z60^'KlR;?)ܴMi )8U mWG !!F:pEb[Y&e 2v%dI>fo [ 6-ш䳀}I`Pii'y7ܺ +XԊ {4,mn8+ƨZ-09 F=h巓O5ImI(I6*H\cgy-d|i~ƒlҘ'8~[!xmtq4Ie[tGtxviI F#_-Tw}gEmkXZkCcU*q@i%m(Kf +rWnfuk]6=MhL7ZGHI )4AwqN2wu d-EuDmN1F\޴L91p^GTh@2 Euoc{%#m*G TiU%G6qXH@Ddz6d!EYUSSDP8 7@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@+E+kLn,G̓gwVV6o)x.#o@g>m+3]w n'g.۴㞵3x6妷ϕ!}kFE2p%x9+4KgW = gfoDUZ s#'*eA}(5qF.xv3VZȖbhH8 9\gnyQ[.M?Q 1–-Tt"[+so.Z/-NAڀ2JJSҒtG~iP k:M핼6nLIO\K@_v3M8׾};Jt&H-;9u%Joqr2i<H T]*3[h\TcWE_hQEQEQEQEQEQEQEQEQEMkwqe8y!Hϸyi3M'EoEdjZڜwf1m}x?,כM{YTqbQ@sYHcö2+CNĥ|%:M$v<Ž>P:j59{H|{][=9izSb!\|` % YuNi [jYv>:R6ѵ]4Em%~8:(#̷yBMqI1'֒K:\Q]41&8~Q@4c}nfE+~4}4 pg3q֩@I~u0 l_oȣgqV\]Pj\"A"2e:(CQb[*&,dNԗw]MDɂB" 3=8zEk˩Z^; x-Z;XÓŻc ŝճ\[L! /ː8=Ϣ4d7fQ$F5f܁v 쀹9}jYuĆť[IbZa;8mszzǢ6%oe}%qe9̪v}Tvi,aIGd@VzAs&_[9M>*><)K(m"X{#ZEt+G{6Kk'c˒*+cf` -nb]TTݾcqTTQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@2kVj!O;SF&nFρ8ǣ}Ef@\ҙa@ TKO)#mn[M92$ Ea`g%=ycrYbt0nKvS"Hg]Nӷ=5EiͭI/F!@*#'#2{9>[Gef- { $tk :FF[qxg1%иR rF:+eefm93609<{(JJSҒ.\T.P<~6\j*+Eӥr_G| 0܏>R&]YͻB2Bk=G=A sa(r?QW n[{vM14v|G8Sr?Q e:؋UL ]ۀB9*_G| 0܏Q@/#P Ea(r?QE_G| 0܏Q@/#P Ea(r?QE_G| 0܏Q@/#P Ea(r?QE_G| 0܏U}Cu]F]}}ր((r?U4k6f-;#OԾIU2%BS;xǭf(r?U2OX5 &v:H+c̤@/#P Ri.~ݣVur?QZMP2]W,z(>ÚQ!4_G| 0܏oOPeYb.pcުP R[Mgs%l3\TTa(r?QVm6fl 1 _G| 0܏vK̅304n㾚͢xCx!v[ Ur?QR闰X{5Qcwq֤FIo RB˜}H 8_G| 0܏fOXYĒyId3};ѵ`^[\28C FͤAq[0B"$*H? &. # 8ڀ)a(r?U W1fPC pA :N h3*K9 _G| 0܏$CpF26B9Ҧol$x^U܊n}h/#_ѯt-taU7<Hj(٬Cmˌ({(/#^-PXǶj_G| 0܏yUܭQaԌs:uℵszv _G| 0܏cxextb= Ea(r?QE_G| 0܏Q@/#P Ea(r?QE_G| 0܏Q@/#P Ea(r?QE_G| 0܏Q@/#P Ea(r?QE_G| 0܏Q@/#P Ea(r?QE_G| 0܏Q@/#P Ea(r?QE_G| 0܏Q@/#P Ea(r?QE_G| 0܏Q@/#P Ea(r?QE_G| 0܏Q@/#^FR[,?:PzԊ@/#P SAk5Ȕ›̏Qhr?Q0܏a("ǐT:(]P߇TvB?νCK@Fפ4M:VH0lHuXZla"[&(  B@'h{7iy%ỒuI'y@#P+I޴Z[,Mp ln;cU;G>³7WF*r}hM%C^6fT&#(N9`1{ۻ wu5(2\Π OG IIc,w#+B)6 4[U2PP.0rqֹ襒 Hh^~5%զ\+{u hm,uyQ$^h>xE0of pb O#^ڦ{ˈW9YG8C{۫MfWpZEhZmSWu[s;;p8?)u&b. ޹K{ۻ@hC7!]\uKE.%_$+P5_BZ}g9|V2oڲ4A$Y1:H[bjAjnf6CtXhonfAl#tc.In!Pj٬!m*_ryϨegV3 HKd}y:[۹ nfm!*Aڀ:飲:mKb!Hl@_c@Ҩ݋F!ي<^_$Bgs{wѺK&e$N5I~ul=ӫI;89:gC>ד(h,8=9%xXdUR2CՖDYFޠއG8H{ .&.ňQs⤙MCQp6[ݶÞⱼ<'o+vs8mDb}N#iFFqp.w8:%0HS ';tf|k%$ ׽sbo \J%QʶOS5$uSym<əQ fH<9Z9<^a?,jV$YbA}?quqy/s<Ɍo}MjByˍo;^Pֵla%üPI+ #Ä,NJv V{)ҤbFܡ 2o^ R9'-$b3b{VfHYkܩ#k|k )R7ps[oҫHblln>{&D!#ylCΆGDGc@NBӒO@ 3_ٟeTŝffH*30*# #칚 AAE, 4HGvXa8M93Nybp? ݼ/ 7S}BuY#WTd] 3Q?*-^_Vg%;9#EQyo UcCwsmX`#px2:EfV7 +qCڀ%Կ)w]B5V˻f9$i((((((((((((((((((((((((((((((((bd5,>h.$mڠ:'ӡ-\-щ|AnN@냎}MubEQ$ Opfr0aY7Wus4 *\o*qTvBuwrߏ:RWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏEhe(~?V}أ+YPWbg@_}2ߏE[ǐd=:0=)I@ :WX>Mm4=:;dң3T¼tY֯se }*Gib+kO}Y *1YO97;CaHG}-3[nФoBF+"t$u+ٟG[羽;;v#Wc\,j*+E,r3z@zGro440,q`;~x#:h,P#N%&iW+%ڴSTM/NP=vKbu #Li㯵t&Xj:Fi-|FCc Qz_-mK8;"mO L/i4I!(P>0F;|AlU)ڒu mEq=M.a6K[j6B4WpTG8Y5kzw:UJ[lL}̸N+km4'Hk[sB,H`57 ENՏ3IOM{7iy_&I'\hc62*;l9sfOg=PI4{u/Hqr;CqZ\O-ެ2Iz`PpHPj]j?V{o< (0 |?l>3rQ"dc9f×ks,eyVW q 3ךdچbͦ%N:5[CۢKKk wob>y̲:``犵gۍC4P LeB';y'OJ[A.̑}h^cl+HA hg.g$0p\h2)vh09{ knIFs@NK>my`CHH 2{fRrׂ(%lR2T3Z^.vs)qfPHS @ND:q DdEOt-I&8¡-"8Nskth.lFw2>[ZI+ 9,[Z3#p Ҁ_Tz[ZOO+M"(Fe\U4}B&U{fVi#>g.3=P$p 6qqheL"aB9 m.^"TM@T"%{Pyu=Mې:sqSHcW~YP#F[ 9fBOs[~nU kK-Bgl`QqE˓EHﱫ-ͻM fW98`n: POFN\ݖeI4jbм[ >ԬnoZDH6?L6H=0#= R{qnH1oQW=>b@< Rh؇:b2}oϫiMB@\Z **A:Ha53Bxe*CF8<-b:Bi+.ǯxM>Wsqf*k r8_昴V vpOl=ZSwaIq)\ʹܚ:S>OL6Wq$GF\19 =*fV9g66Hc+~j5zekr.|Y%Te\/z4wqT&O (m4F~ckooewffXE9ԫc 8iqYjw *4qFђ J8&:$rH;❤Z5s)IdUrs`m r2;>:Ce<^լtM<0r?b[DJ8'jasg_@5gI]0cSp[=jA *Tm*ߗM_#+Vխi "TYy*A# ѹ,cKH<|K(n9Qnmtv#.ҡs1 qcJԺkJ;yl KcN0sgo?u:-;H](!T2Ou?Imig5֬'*, Il1ǿj%--n䐮 U@9iiirIʸۆ v͡iMBK!KoIwn9ww0 ;H<O´[IمeJ~>BT/&tINrxお]@c['x\NU]ŗvjV_y VA }8h_j-,V7O+<\r8uY.l-cK.FI"B CG$4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE5[ru3C;SyvΡ45tZ[[wUB&7&hYNլRfY$)d||tdeMj6jl@+7Υ>⥸j*eVn}Owi~xeژ4eČ`cۥG{IےXNOn8I#m<՚k{t" ,OR:ҳF-ġܴwZKsyi `UՓ*r1IJ=Vq(ء*A#ߚ rK+oM>/;=Ɖڼ+%L姖&_)8<<Ϧ dm8LNJg9\sVk605pԉ |K?+Th[ }Nvm$Ww'Jӕ d]IFTֺfti\u,L, 0{%v ӭ۽Ϟ,l)|ۊ_b%0tĬ}Ix}$P:*G@V{hyZ6g"3c$ Ox}$Qx}$P:*G@諟gOgOS}I?}I?Nx}$Qx}$P:*G@諟gOgOS}I?}I?Nx}$Qx}$P:*G@諟gOgOS}I?}I?Nx}$Qx}$P:*G@諟gOgOS}I?}I?Nx}$Qx}$Ph VXdx_"W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > E\<>C(<>C(IŹIbvLՏ'?'?€)W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > E\<>C(<>C(sI}I} tUϳ'?'?€)W> > RMq=+O4P]Ajx}$Qx}$P:*G@諟gOgOS}I?}I?Nx}$Qx}$P:*G@Ue$rV > aL z sI}I} G%Z&e*]POf[[Al!ϒf T]?0#Q\ݿzCxPܴYI8"[H# XuRO-^<A{^.KMp /ua˱EusYXiIejs܅ASh:^9.7R[ʌ\ր0hMJY-~Gg\zu |&HлOlSHn`RN^0>okqw! fp7 zTU&GKKyaFm^]2 gڀ1讳^5g.Wc#9ڨ mm%ei(2$c$zP J-nծV M֔!=3ȮOiRalcdbf(9)u KwR[9 $:q@j1Yiqia~PT5LѬ `F7#7E :S_[VԐ[G6lmT .TgMVM卥Ma(F1=k+ZH 8銱eIgn k{{O5u'c ##g@xc+=7st$Npg NV#AqYtPZD6e7);d8##C{Ig ;`cY4Pwmlkt$s4!@I $zzҾ4SAle& qg6ћYkY" zdˆVyQOn. 6qM`@'d]pRCxIS9sJAw-H,j}s( ZB5,Ԑq4_j͍k?? EXdN6;W3 8\]h`$k$'88 դ]ljg_r % :>mm]ekřfA69e@/XcaA!FNII=.5[ʬjc(gEi,60"gclXZ $!9gA߽R.\js\$,~{Ȯ$UMW?!V'׮e_Col*#g䞄Jˢ4U>i~pXBf'ɥg $yY hrs$dV]bKXs峐7+qwX+ĨL'pT85Za{&{J$ddr1j:6|1[9e#9XqM((((((((((((((((((((((((((((((+RMzKyȶYC%¡8< f IjH1&q%"sFG=~QYP̰:mF"!bsÐ2i7_Jk &?Z΢45E`V!Rn*mTx)" k.&u&5=ʷ cU ]HmO"Hn;.|fX1T(O>o'hFNfF& #V <笟ѣϛz}ϣ^Kl ^_ px@<笟ѣϛz}hZr R5f&IKRpANf&7$TFw#~2z>o'hFN纅֨.vGUYZkvY&W&H#!МgF>o'kF} I&iHYeW&HѱF1C$gGƢguzh74yY?Z'@76A5t4nva~rt;!;9j{% |O=d^muBfQ?ȫyb}桿ӤX̥JGB(74yY?W4W»p K Q: Vuna](I)Y?G74EmW;p+E?sM7$, }sӃfY?G75nK0Ĥ[v%C eN@9}{QiZM3 N>ڀ*yY?G75s5N&Y$ݜ",1NN8nF&䘶Ыנ' |O=dk᛫H-n&#Go,2A;wfyK"\eyMs~Gϛz}<笟Ѩ"ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ϛz}<笟Ѩ <笟ѣϛz}ЖkyV|p>zMfyY?G75'74yY?Q@yY?G75m% ZFH8bc*I=d|OtP|O=dGE9摔=+4@̚Ղ@d7a"`וaivOu;;u$=N:O%ȵ}OPhc .nY?\scu0&(.#;Rֵ]e}SShSAqTiM]X; G.m^5n{[KiNą*q}wM;CK4ᐖZg cՉ8WQSen^7_)} Z5oj-Ќ<)t[Z[k룪j^B\LJ#<}pz׌M꿯%_.\Ck۩"Z)%b2*8t/$[i(eՇ" ZLN̬7q^5E;_u鯎qh֖ :dMǀ =k:WA&۽9mzIAx}^pܬl6vq"KkW}V ('Vy "oC([<{U:(Š( ((((((((综YSPQ@ޙh";8oq$LiOR2:0?ަ}bM:3.`!"O-ǃt :Mz&dpmo%ǥs4Q@%|MbF2G&l.{.)^[o>AbPGwrTP}go>O~#{wݵwcϿ\Ɵ,[̑djH$1f'Xfcfw+8y*.ᐭvSO=33YZmll#Hųb ǩ:q5LkqP `׭z&hUslп/^qG;Q@WbIj{p| NGrc(R9".F3Pr噂ą%vwHzƨW ,` =HYw7嶇c~iImſ+H#E$I@Y'?9ZتYI ВxsU$s JUv8Ĺi[F[/h_Ez Ei%©y#Y8$5K-ƋXH eqmEۂ$lh^OPHa$6gcwC-ԗ>|1M-Ņ-p9e|n+#v>3$-r '%zgtk@jλ5-Jv8jd9t1LV(-"e>!c[m;Xۿm9;ud^[%[[[<F2rIU _%0'`3)do :+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(zGdobFGzGX+QFV( do}U(8C?PUۏ :@m/մ[.8<4ڃ–\]Afw ##9ʼB?νI֬Aі=wJxu5z$"p8q=hz:Y\Z_quox#*HRF@3^[#qiHQJHm-;['{Kg%A@VEgJ孤C+UX+^Z#` O$pO9g|36I[=]ܬrAo6j-n'?ެ1"Q1ѼQ4Nܔu-r`CL<] >m,Ħv7a Z4YkEY@O-"<:]v㜜~мEkkU$W+NNXpqzVN61ATV{EKgO$9]${f.a[^a|8+dgLֺxuK[ȴ6Xm\ ,ܰ;S{]a-S{ > .9X@Ö,ߧqBѴmKi%gFdn08[<[~s Ʌmn.0 3VLH*2==;Zw~o=>)亍Pg-[.o'=ES((((((((G"v!UGROjmOgw5wVDe (R}g\nې0xqqU4j[y ME,k)*N0FHԖ'E]/΂0mniL6ѦGˍ<xmB ՜]yrE;Ċ|*U[0t}쯬oZ>uԒ:r_@I? íkFbeY[ Gڠ߭d>MF+HYINgW#@_KG+; 猌4{VUf2I2zSXKg-i#h;ܧ$cyx IQ^ m9!S r=*:hd#t#$s֯KڔmH[@F 6Gzzh[Gp.V@6EH9l@gד{f>ϟ>@R.prI M&ѵ[y# ̨ !_Oƺ*IwoX0%$q3Mn^I(fe2S˜㟠铊fwdڄhH%v\d'jU}uuڜitF=;w/wۏ=d c )5MR+ecf@8} , ᴺU[I$;0~+=W(~o(pvs* ؐCr&ݏn?>jinuyѕcQOS }::shmD1xc8vX2C/T-6[+=G-4  3JM^5x.b04 %JRB[X r<(Vf`'}.ɼPms 6'T[XE[1LAPTNGs4B;f;xQRޣ]H­6ک=Ɇ 9'|4^3zM%!tl@ݷ'i=1ۮjK +}b1p)Cn}mv?*c%"^ ܭ`9I9M}ygjS]L.#$`@0ĒG̀&/%Ak$vaߥ0C'y7Jmmqe$Zg/ՌH`ܱ9yǯJYnµj["{M>X '5di$nڀ&~7ۖhbUb<6s9TwY$K/\`˴ ^2 g?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<ƏEW[8_m<ƀ,QU?h[8_ U>?h_m<Ə}?R2FT tOSu`u{!?$l̤uXtSѴK gH𡾽i,w ٿ糨?h75 jP#tsA*t ȬuVwY2IF{qyihk'R"ID .->VP'\![?BlcY]%{iI dH8۷s*ŦjRiw7K68;Qm^x{/ 9Hb7: =BwS^o?q>9'O m-c<Lе{}J6?nn>\Z(#77:lM3ml%v˂N ouM7JωM\ZZ<e 0MoKr}bw .[r"cpBq`YúZZt6Ҍl֮%q!qNZxj6+kmD3y8X04xZu-[A7jiqk)by ?+`}/__j^ִhMSHIkg1gVbF_jڭ:cҲ((((((((((IIV,dlmхM#stm3W1/& Aj(-AoLsB]ch̗)dv9' Iiak6Hw sgh094my\#uewb.fr2h?-S>2ӇtF.Oֹ(/{[Fd؇Pd`CI,JK#ڀ0RVcv0Hϯ#Wcw )zKFR,cqt5RNӴO3δ7\˱#+n>cG(9p/F[h8PWo 0HsJT(!c+?xU-nFy{bDuĭ,Q6sxFIs@ՕΡ+l̈dm*;[տO jk}:5dyJ.رvE9LbKJM"2:GevZ录Eqlcqq1-D 03z{(,4212PgvFހ9̶")*OO9Ǿ1]L^5Mct$Yb2r8FO9ⲋM*nVن+X@9#`[Y]NPemI_dq ڣ'dk[F{BnOSʼ<v8R}Gl J?y.@-cvvֳf8,<2L;ERUs'kx^\ǥJK_@-m )QkVk -)%qH%mI,xlrhH&C$NX !IA&[ygg2sZ\_ٶyI>df=kRSmwkm啵ᳲV}@ͥ͜MռK } !(;FGyVח69V93t?VolNљ#F9y<.-s ʽRE*4֗7mXǮlkz2\"y07#;*+2E5Ž/,0;;GQ}q@쬌U)`SXͬP]=kh1<- w'#Mutn̺ͳF7ɓ#=r6WV{>m4W͌3ֈln xmg*R:WIhtiu ePAŒlȗ>X $rLőI&rˁZ[! ew(qQmkqy0 g 1upa.Ḳtmݿbc1Yn{ JerC KDаv d[<0$p#E%..a$a<0 y<1zTQHPI6$ݲPAV ڒ: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( Nk]>,S݌bRe-#ݶw"pX}8-rVΗhVKt"ݜ#=i__[ؘnc; RxC8\_iihVkKc0.ʡW;v`g&lՠMTkUs3eXgހ9TI#vX]I 3NHo-ƥ6,tx=Lp=y_B\$Z40,f\r:q@_qOi"U`Alp~nawd`# zmH̃q9㨮Nx$왽10Vb#gO'f^gu FZ2\y ̮ I=@%)I@ :WKk+Iӯ4 #QK%tKz;9$zwu!=šw74++$l4KFdw]^)RX2B)DOM<M kYM6$ޱ=yU|]i^IKN[,o&IݱԨ<@M<MDOѰv5e^G3_Ȳ\+#.vH2zbxS axhൊf@B"1sk;țyI|<生ɠ dvfJU:Z4vdhyslqҬw}rY0$vHXa!$pIM<MDO-CZ8Xr}h eTDOM<MGEIM<MDOtTDOM<MGEIM<MDOtTDOM<MGEIM<MDOtTDOM<MGEIM<MDOtTDOM<MGEIM<MDOtTDOM<MGRC4ӤлG*0ee8 M<MDO5JIΪF$E O]oPXVaW۸a GnOțyI|<生ɠ 7qH\d85;TzRy)?G74[RJ*Ջ^N`kF_"o'h&R&/Z^\7?/|-=eYyMz+{j74y)?@uB8;>b,?p#u$\9gd|s8DOM<M\үⱒυnr Ґ:/.ݷ8DOM<MXTI`,h!n9Qҟsjvgtgn"|teMT&R&"o'hk7qz'{ţRdHF{bmd˧_EpIuv]*c(\cVw74y)?@F03%@[̧EwOzXTf`ƨ2€;ʡ&R&"o'h . mDb Z@qTyGSmr?_Jo74y)?@SVW:r*.` ##4S)bm[Gܪ R&R&"o'hkFQtkykQQTg<*>Ԓ_zr:Ȥa@Uu74y)?@Fv7744xCe]Ao"WVBU74y)?@˨]eif.%w n,3TZxc3\'P[T生ɣțyI|>\M,|< *aޣiC,>E% }T生ɣțyI|g@a؄"qmw=>ƒ6ʰo74y)?@.md[t5M<MDO?ZA Ӵ}x ǩ$k"UUPȄTQrz(>j74y)?@#"-;5]Pj+ :톁kKgB\<|uAڀ8+#JRg<FW8~Sr(wm&qdM!7evEEv:4gmn[ k/$2+fF#*;hWv۷/9V6b49붦rrWCqIm#pM|,Bsв8޴ vӬ[^;-\e@:Sz_1e]xFkox\n\^ X$y: V.,<5s6!mr#wWg#q9qTVgCZpY'XTy%l]m*k`ۻ PpN1AVϢh]鷖D2yst CO-&qnѶ89Nhz+} *( ( ( ( ( ( ( ( ( ( XZuYx'tM~:+z lͶ1M͵ %StHi Onb@x@V60]5ż4G|^[+1uSIX䑺* U5H夌t1*$c(ssymӳLqXUSUm쮮i m( +SObKϳ,E/Ny#z鷑\F6!;N_\{PZ+GI{t%1nmA USgt-EѶzPV\wG+ۣ[Tcz~VK+`ymHd4d+}C@QVΗ,>vam͎V!BYx-] p*Fr9PeaCqhnʹFay,Fyc~Ҥ[i 5deNVh>߭RFFJ i-tClpVE8TOw3УkF`G-29Nx5LmfF<1l ݈3U&[m=nHqUmB;X- ӆ60*pA8=; 4U+KikoeTMp1ϧ>}M D I=9ހ3譖#:u-r?/G'*pyTwzDi[Js9(*tY5{!2#IysrH QE4}us䫖HSsJsay? U*=Bv8fuMG^Ak3i~mqqvѶ39h׵%!P]M (v3Ўsv-3gQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@UXndKoh]y <Z+^Mn*5IJ|UԬΆhXnT *+KUѮtT3ۣ"Y]O% rFo@QSKiT"p3My4<@b)Ndt T7vqk<%2@3׶; 2&\r)6wVlum4 JIK :Wn?7]PcjV厅jho[ FzxK@DҚy*",T`=,SQf`$2*WV=7]tah"]^!ImrTS~+-nj:>[;fiHxr{fLtI!"$U_*"O xkh;wGP; >{s˘v?5l ڑ 3u~p_^P {=+^!mOQF5א4oxB@v*sYZV%dpU j7eI$*MioO;_QE1Q@Q@Q@Q@Q@Q@Q@Q@( zQ@,7vxIY%"wsl$^l|`H``*''5QG@:jm5W2M$sƹ( O̖H*%ٰ\4x`"67}럢;""f{E՚pL"!L>_N Z:=̔Emg0xR!{l~:P#k nߛCeug o/'X3Wx!r~5NU ?%k}JZ8|0ESοxckS-C!RbT40{I4NyKlzv`WO }%3gzSj9ǠRPZ-k?pR7@p`qKˆ֝YR feI<`s2ܭZ, wmc nc-Kuw[PYwq7LT^}B{v̬-!99矐VF|0_4ޫ͍g/!K^LKbVΑ@G.ſJǢ:jjfMdr0.GIO`/P gZx&\I;2UQ@?)?c@׷/=I!`c`aTecc j`rH-ٮf4 SNk;K卢I$\*r֧5$6zAy .u#urP΅qmo] 6RVl Ӄk֙++*3MIhR[k: ٞI` \5sZ+WNZg FMV ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 7ER\[zQ:[ % m@~'n?EQ { "yy'1q1g8(a]tE寘|:pz{{svmx[’lrWhsj^5v/.'Ve.G .5l}X(cd8k75we$s\vo;Add6j>a\4)R7,{Ҹz|R2Y+:XZ1lmta,r Z%完J%py2qǵg^jwwq"BJF ϽTWuJo*`Zh%V/jOC'?Ʃcoꖫu:ݻk{9$BG(!G!P\]Ikyo-gQy \D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#js||tPϴC'?ƏC'?Ʃ@>>E\D>#hD>#jbixTO񪴧%(^ejֱ- u|^'tG~iP k:M핼6nLIO@>)ަeRگ-f+ <\I5< ZY [M;!PQiDCWlOzKy -$!#( H(SMnnvR8e$"!tukHծnnCřq`Sl w?j/Q4omuisd-u!+zcj ^i$־Tg66tZiÙv2>\:=w-C[IZ[ͺHӎ gUFcb{Ӝ}Z&^]ݛul^M9dRxLnSs9ƨ֗66_`i3hJͷbQϵ3?O#Mg6=_WWwe`,-f{[Za"V<r&]X"RAO8-#QkM 7-dQVV7xPuA+[H'1B|1ûh٫w5 [߷X~O%d-n)c&7 9㚍<6|U'3 4``q W7^m6 m9ln8Ew D&\~ٌ~9M[6-lkh{icmۋWDR4]ǽqxPIo_~+%aEU((((((((*֟<k5ŸUmKcϨ;Z\(lvjzݼ\ȒMrL`nMp >ŦEo,3kT' A 役5uSQ˱7"A a8EZMns%B\n2.w1;RMzٓG;Խ€ cwg=9Z+NSNͭS3yy͌ucڳ)wID%lywm=? E.e+Ye1@,X,rOQ￳u(o<3$݌G_ƬYإڣS,X*HNޘmZA%p3@Ҥ>al,}NG9?`Gkj^L\mɹaFG$ %lP=ɺ Tǎ[}Vlzṹio4q$48',[qk++Edv~2+xcj YuNi [jYv>:R6ѵ]4Em%~8ᵒki K&IM3 9Z_^̊^TaAꢢ/>=ѓ?^)಍J푥14o<quk`c-e 1UiֺoڭVvE<u,GpERM,~\pg!dv<cަR][٭ ؾƠRp{(r {4Kb1xR=ɹF:~BkyVk c "|F\0XiکAgq܇WB EǰT FX,-M,i|gld@v -m$񟔶*T+`1Jm*о>SXiw6Igw7đ1AI :YjKu, #4jpqvqjMJ)-m*变3qۀ1@};;XmdEQG. );:YTO"9Rc8cIzSӯet nǖX`yQ\EnC*ȎS/pxzb:=݅_--6aۖGew֍Bmm|XBW$> QYHD6ZrKRYx{$=Rź0*V+{exnm%E岶28#OZ#Z=/~+ס^Ԯ[Ex-VCBS3ך'jESQEQEQEQEQEQEQEQEQE1dW$/bR$RrN<}*׆ Y@bTgmoVNԭtڝ>eo<}"M )LKu݁ӿQbł2܆H%Ӭ썤LC30w=N? Գh$:pek4Msl\seޞjLtdV_IR I`>kHft0`b*K{ynH W5cVQKJunj` UDgA t :zŽӮh@*H-< s<:'D d7̐,b660x@A2HRd9#?5vVֲK26sD3B+W Pm` ,[pqFg%EvsYj7,0Y$$L˖<: Oi vUva9<b9ky.Xb1ndbXo, IXbΒ@)4jw mH\2{dUыb 5Ha)1 T\yY$\ dzv:eޢ dF/"8 ѯe|33N\<*ѫ"C 9FC8+7Ls< XQ6> ~tcŷ; T۝)iX-%U y$kmƒI||0?Zɍ)ub2sOڇ~slߝ˻nqnwc*1d]/˗,vl1qDzKo( 2 C=֗}e<0\(dp8tzt ¿\n*# v-2s?957tEtfqg1އ"}{kc,T4HqaӮ8ߑ(Ϡ$}5[zI %HA] 0=ݵŎ\+ʍpm$@y09[KIqI<jsj"lţcÆSGJǎC "( ? mI ,NЕ2i]롍qA26(7'O7#Q'dgZZ|!fg6~zԧoIX,.mmf7 Owpzth-"ܩx#;~5խm;I E\DOo:A]%厙,\C!WKkQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ZN I='M[[ vKupGQNwK]FGw^m%Ǝ̢_5Kë\$j# QmcBZ_^Yw d#U1ө@ڥ]Ѵ -beI@H޹,y"F E#Tqڀ$/l`ki!I-gTi<3f73a|& c ?* _}{$3]hp=I $R 6rtQe(~?P H8;E{u2C 'Doj _}nQtZr oN$Ngi$dv%j,_}{$;/&X[b0_+FWb%734+n?;zS^܂'PB `u_}2ߏ&YJ)9K~ua;卮'Ep%8x_}2ߏkk,'Z{3; ͹ekeW,@~?Qؠ?7]ǐd=:0=(KH:WX>Mm4=:;dң3T€<&i{ oBD;n!+v#xB0IY#A#UK3I4Wc|>tMfH,Whfx`+6zŬ/RuC22?0(CPK{n"d22\9ϵ2_k6v|Zʚ9Xrx {;w ͹xG rPN- vy}wl7mPw/lq8E,X@=w:&im6Բg+p(/uHnKtYpfL c/$usLrwfբ+!ciw@VΗ`nԁVR؀T w皏*88f6@dN7;zh*ָӬ[M,z d J rIǯJmhmh>+屐(->2讆k%O$"U;2<NWO`Y!J1 j+z]xig`<¾H:g=J+[K#0޻& 2#fW#ӌR|N`q^hWUd~rH=(&]Pd}vy*C` czj;*{c.n7Gt 1l`ps@V8Ke2e!Av$qLєmK &[`gwP5Y[_^J~oc c$t+-M尖ݮ⶚[M ~4]cō+Db2&,eHqՋy \BF@O\(((((((((((((((((((((((((((((((*݂X5,h"6@ \JEn\]<\qMIuC` vV_Zw/nF21݀IZɢfNOzqj6 o3iɗN=4EixT-$B\P_iWr\\+#ʒ2=:#Ғ+|5x{BJXeZiAʌAVSG5å-w=3Z\]XK|׷3Gg|.j}rv7S+L/?1m#8*ӳWVgi4Ag}U.UXLpsT;h0iVVn#87c#9#5QI++]?oW*m`mb펠d{-0#UEu`nAxGHOՕ?k{&tO1k\eH9^Fp+U=w0Zlz\a\Z"Ж<[H6Q۰I9=i.#}!i{Ab.f)(62כQT}_oG&\jRi<:xmneBe dOY~"i:>Xo}/uJ֍ mUF@`14R?#;ڥeQeH$Db%193KMq5v0峌yF:[C^ ״ Jk g`e,lU,@'\=[zkIJ8<EPEPEPEPEPEPEPSZ cw2-lHc=Fj(XIZI  Ǟp3QoXkVBʒT#C:@ErPA1V_w)olq12=8~(K@\}#͂qŬ7=cf+mZŢ:GLcfLu)L`AS;wؓλ6o\ͽ$+h?0@^!Y:\=Ĥfj>nwZUmgNi6-#88rP߇av"6F*O̽>5G3Z?eD`ە8\a*r ڒ:[^:ܤ~FTIc)K{ioy5111n\$`n +:6m_2S$R eIJѓτ hRt#P88R8N=(4^u3#y98<TZ-K8"}8V-06{~op~3MKvWz6t" )l"`'qVEԽkrYFn.aΊ {k3Q&ME&y%Te\Un\;M}W7B #N##Z:qZ-ܑ̰ `gh⹺(SGY}b*Wӵ'u{VTGaݎ7Eo2Z,p[1!=$*]KVOO){xL:I8:7Etke=եaq`~b`TviIxCO2+ nžy1MrPe]\ɱ[N&B 9֧5,qYNd0"9|L'U29*1dqq[1 > 4]G@ԤKW`zFAPgOgOIEGx}$Qx}$TPgOgOIEGx}$Qx}$TPgOgOIEGx}$Qx}$TPgOgOIEGx}$Qx}$TPgOgOIEGx}$Qx}$TPgOgOIEGx}$Qx}$TPgOgOIEGx}$Qx}$TPgOgOIEGx}$Qx}$TPgOgOIEGx}$Qx}$TPgOgOIEGx}$Qx}$TPgOgOYm8ƅ=p**I}I}( >  j+[kJОPo'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(?'?'?¤#<>C(<>C*J(Ƒ3(|VUj?R u:OCorIga$In"l#ƼB?κ_'FӬ"il"xRk]G܍#Im\ ߉w7Z^o#\}}n <]'ԵKK,3$*O@Xֵ5zRl4?NY^{ɰv.n`Ki),luRA}DmA헆|{j {i FI<@oF!Ϋͩ5I$0h Fx$?Oo4..Whs7$.ѓTj:<0Ej)t,KTs^zW_]ypY܋4Dhbx^r2zMB=?RPL{dy@!P>ms֨^[Gmivy\PDG\#'i̒ݥWYW (<r'G_>՗mf-6N+YxU Bo YhFpsH]Ep01/zUMkVMA.*Y7M?N,W T~m$(zhy((((((((toʏ[ik Gnkwo'= (#$~61`Ջ.@M[|G@:u|OX w"B Q۠ 49tAo^ydRp؍8GҰXKoEH)$gj_>acuC(lpARArH`I6g,ש'u7HI00 {Es~T{TKk{kts'l#%'z@k( ^vuF!c `3WEwĭ((]n-€>cy&{J$ddtXդ5K':6粲ҒR7"5 1܃Ttr\>nO 9AnV2Zp;BO) y>Єa:diiK%ۢh#㋔|NdriW_r i  Iث6֨E\CovZcp “C:pr8N70y$pq9qF 1jq'mfYn%(`z "HhCFAH}ji-|MC8;ֽagyj]۲;+2F sϵQ,BKuP#mepHISk73+$AT,Ap/>=iZ3!9.1Bl ՓyԵa7mq 8>Nxk8tj&ŶԇVNH%IzVw_I &hO#jO+wd\a" s{4ZS:^ǧ^"ĝ%\rxA㑓UQeu Y^Tg'#D 8g{k{|5Ru$+c#8sƫ6 y37|d@5τ4q Q|ygG$aɷc$ Ȏ270dw€* <ؕSLOd cSQγ`Ha@1PEwE0Pg>`"{Fw`Vuơ<5s;:ܻPs3U$%6V\a \6 j x"R(A c'I'jݸ!?6w7kXnIM'S 1ӴۋɣԒD>UJ ڲon6!cR!X"BVW#\[DQmxQH<@{5]Cdݹ@ @9¬kmmԗI32āٸ#6ZY,-oH3 ޖMRIiDsN^#Pԗ2$9d0elsޤi2OCt"0(=1ұu-\jm$i#eɻ9)j*-Nn2[~zlI YM/Y8;1~Ql:=67IK1 # s=yW=eMazP܄;ytϽOeYCb%h- y ,j+yw iplXM3:jQ\B*2:3)#AZ/i+4^r\9{[/Gt5q¢9=Sހ_tz텕&o ܖ+JGhm7V#23&+`c+x93kW3}3$A,A@ sȧ70ʆx<.9u Shjm䌐\)ڬImV#vՊ,MQQQgnome-screenshotC     C    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?@((((((qQ<{U3xE5\5: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( @Ȍk5Ճ?5W5Ņ[yk 5_ vk۹dYԟWcz^"i&3J+}|t|'%hB0{:}:W]ZkVZ\żrH i.eI݋HXy'=uw4l`?_?9WAzf*X<G*;Z^Ͽ5%G5ykoso: *x5:n(5%u(IJ4S#0$((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((('sp#S75<)7F6+珌D~ Qqub1Z_3LDpXOK|_i|ME-Bs?oo[_ xHuPGkqv`.: ߷y#>|?l7o}IͣKs [cUO׬?秨.{|vU#pAf_-e..! pY~ϭz_}iuvK{m}Î眃q],+OO*k4K纶5~!#PN, ?__[x/ƶ2_xrxƚƁ,yh\czVbTz߂5MHٖi}GWO7)/wbwEfYwOj_}vg,9h +Ǽk}^ yhdVSֽ/MԖei+FT5fF ) ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (nZ\ toNc_sX}Ve!SяO6#O Mժ~#4 仿$f`i|ME'~?_fKY]fv9$&KY]fv9$e~Yf19V˷!pRoVD/+?ūy4ocD 2%<`zJu7V5[Ib Tɽ?7]F7Y8d[ zRJ]--ϖ>gK_A*sbk+`;*@#n3ר~J3GPeV̎z)czO5TjVu6lMjocjt%FTrp;C-Đ4LQpU1x-G»뮶oe9v.iYֽںoy>X/> jڽw{@m \sQ^לx}}5ҟe.V:BѿT?f}ž2鐯eG^͊}sdW}ǥg*%m{߈W~-.#~i}G 񥾱eʹ42 )_ Wc-ׁu%i}De9µF?/Yq"%jugf~id֪^y}zkOMm2IvܢGMI]β'+4OES$>2XӼ:څͺ4M R?:iUP\a%G? G_ePVk0Y|Ca&7ǠWӾ׬|QduawWnt#l kS]"m T^>>?c{2LX&o Kyq,xz[}IO &Uȯ^6x'Q'#٥Ou9tAz-ui]=~ikLj!!l*=GN@*xNJOne'䃄@A}e pE>V6K.5O'3ր>x gT֮T},p[j{cO x4ȭu!Q29q/cu]SkO=1gd2Nր=>'x:rXp W c>W΃l?a5CkiI1'rq4AY}q:4?&oIVky<ڦmiV,Q42GhG[Nel61?wfHPEv|;2pp5ω5 5[?\ ꋞ~)|[|z9 vyRAw>7xpA\[C=2>U=*mS=<2gsz*7uP;d4uA|@SK}ewVsZ"EuBq#F⾘<3z\?rԞ֢X~*|d5,-LK4sv6ڠ ]{ǟšbi8N&5V\ A#@SWɟ}\\BEcVe\\vg,v4lwp{=/ sS6R{'jzy z|%Ɲz] _$܋ƟgĀHxc?#i uyg۳m:j( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (2l`WX J^ڄؑZX[*8O]ٯ4.EO! "( ƥ'ѵ [dpq6V+bA5R1Hݔn` ^q{Nj38]3VՓŠ27:dy]6Oxv&d$W2x_'E~0o::h;RG]UjHmNUmQ ,;dה#_CZ?VSm-b+ś{#gǗ>j:ZHHSj6 P1h /4KmZy5gx6q*P۝qzgwU6ʡe3]G@w[dW4Yx·*l9`:I_Y|@𭇈41.T,kHꧽr(|uC{m7v.C=ԪЕSPQ^g^_vҢ8'q#Zݏ) n 7U1m((((((( s\%b4r Nw:םkxCǫ߈xn|pIт1ᵼ @|v;xCXlb߁3 v{V|!l=J |N?s:o~/Ǿ5[茍 lYW Wt/o1khݾ&oSԤr`kx \m,npJ 0! 0nZ+sMG"kۗ1YZg'22pz9 ?ux+CKB`θ[{~0XZnfVW|pAʜ1\FFj:OOG=J[D [7bIUP[&=ފ_)|1Rw4'Db! UZ课,x5O Y$'`uiv-ˏ"Mp Q^E?emCYu.=ĚI0mI*U'?>7tM-CC l,jIy$(%|g^ֽHy1i0I:+<IGRDfeh~Mm<%a.k1_0C8__>7k1Hq$E?ːk6SOWqqף]Uu?>AoJ4;aguq*eBz~.|%CmSK%AՔwvtM\ֵe/Y dwi`11"7INas*y[:|)E2z(t:է1};K$Nq}޽ɯu?g_V/QxyT G~~:7~<7xG[ukW}E =8 ׻>K xBbCfOEc<O8Z7T>=q4jC_֟W~WھoW2~G^htɤ<ُ`+S(-k|]AgaxhcN*Z# g^wmX(+'Pc WQt)5{vS"[ӽ{O5NJ|6tW+QdT׉JOkJ$c4O 9wxσŌڦfi\]ԓaں:I"ΕPv͎{fdeѱO|!iEͭY;]Si{0P~?Jdi KkV,pn$a=Fæ|S͓ύ%OI\ %S)Q>>zACJG}c.#/$QYjpCwVP[Eqo*$HUԌpEK_0]Jᯉ[_aU_lz ?I>9]ß_XWտSwcGkŌH(~Abawz펟uklJzx ON_xFw+)@9RGG@Pʿ*~~ЗCce y*_'~%# ΤPۣ>󆾒__6.5r46/Rxo(#w|Yz/گHg?߶҈/<9׷׈~ǟG#Z+x%KCjAM'_Կ6o7z/t;i/q +H} _'8lo^(|K7mkUAL6=k5^ҼUkỽ^u˦Ŭ,K $ LG x{k^. ~*IˤV򴐫\@ރ>Új!t#/'N vHY*2g#&z>{nw#F{ xA#OqTW#O*iigZ<90]&[p8 _~:IrlWW[69;GzMS;?-@ZKIޛ*κo)n)]&#vw=ZT;E}U)-/$Xݞ14~7i(YU>Ѹʜ؟m ۓK`3d8< UHK)뀍2yj}?Wl+~H{4{;Xkx(Q <0P$ax<:U+{(/]Ʒ\XF ܮ =Aא]|oE~DF]&j .p qО/kW~on]:eD8*c+chRxoeo{w$"i9.sI$NEVW}_gW"еs[8W'x21a?"j{.l1/$XI-m Er}'x.Gd;jlS}cöpiFgZM:1K QEE ̺kQM@=_`iY6r .Ite`?m&)Llv1Bw?e?II^^i rHN @MИ'okpi'k,q5M7? xl~*?G}>- 2a&oE8 1|}NZlm?Xw `Mv;#öEݧ H:gkdb?? ѭ?!k|@ 8q:к~gڭVr"cAamwxr>뙖<.ߝ{G 2^e ":{y@yg%?uQPUFCb=桐= |O7WkRѕuN<M?5zMj;kHR W=<1"@º>&޻mڽ-`IЩ t(jS$['#T~5 j_F,,ogL~Y1je4o:RhW<$YM1M)_vR̅PUB)B4?VQs#+oxHմ]R>&7$Pn~o[4feYk~xS['F0³(+˼_@j_}C%j0׈"G[*3 ziB;ȖYehsYضO\g@aȋ %ORT K\ X| x5;HߕiD8 QPo[͖7U[EO5\o}|-wq$&ჵ،\>K7~k:vDF-E\}W| fӿFZ(|uOuڱڳOր9o؟IfaDC'o| c uLoMrԒ"A5MxwtcNl%iwx.{"qVȘ}yWEPEPEPEPEP^3\F jH_60P_CI?+'!aEdҿCS\b5ZEgK$ E$rI=;7 71)>h~?SקD)^PJWAxM;fKKhnDҙ8-*n|VM' *-=n}O~<ի_jZƥW(w8cVml6..moO)i{? |l M3XȮ1ta`ֺ#|q E:]2cO\i$OU|OZ襠dUx c!#!'AcTR:|Qڣ# ~`'یkk'Bj6E/OgFm.L41JK ʵoV[GPYX-!2'5xX޷]CY?2#4n~rʒzFEx߇t_Xh$>3𴓙Ϝ d*(Î+%Cִ x R"8*3cxG#"MH;H,88<|@6 nM.̼֤ƱǹH 's@XE_|X퐎Ɉ.HΣYIݾTӵi,ﭜ420={eq'IoxK].;GO?#(tH?)gq@>͟g~l4ɗnO^PEPEPEPEPEPEPEP2bUz? Aezd{a@Z5ůhMiP?OQk9{55GwNhKu/k Դۘ?|3Nb]O>[㒄N}GĞԼ#i:>"~DAk|O +%n_3ێZ??U,|'>?xFRӮ`iڴ\c㒄*sVK:>VXK ྄%&̞y?NK|in6sN03чa /Ý~xjKmR,rW:c}Y? ]XZ^syq~\& ;vєxGD~K fyUUjknUφ |/bDdσ,>iHVR:Jކ__N(S#WVU˚Rն,0-V8QE?(񖫫eŵգ[K#8c"6Hhc {׿QEQE|SZoxO7V֤ϒ6,zBO'Ixfa[=־MRMc·jLk[&ܾsv4"p!o&W|_Ǎ_WlUr 2gV%r ?7^EyĖ?dw[II9Ha?VFw 4RE9h4뚷mS# ۲vpt%NT3($x&ռ=.|BoH/s<㿔_SQ@oZ'}B_~\^[#L /^[>y~2|Nl9M}&yeXcC8+ʔ F~j(+Wt=^6kyp,|<2{Aׂ~1.Yl<hۓd 5= >'x/m?-H*0GVVpipZZ–"Q**SQ@1xq>žmw9!y2dUOqO |eëkM3۟!ӞuPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPU[Ҧ2Pc!@/T` uPQKk ã r:}eҥ ( ( grN*;x1M(alq1FQ? uPEPEPEPEPEPEPEPEPEPEPUNNְ㤦0[jQEQEQE^:c,V+u#XBA: P0ib8X^>(((((((((((F]BJФe@s/,. k9tYtIi}VQ;}:}yf%Sr׆7ɟ¸1*X^Χ=9䘕ý:]/o~ *ͪ7Dyo;dwfjGM:9[2ۼdOz{_ |`dfqާz9~Ocg?:P\~],7f[k^D#(5Q#'MvN"Ki "ޟݽB (QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE֫'QV яJ=cZ-IEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a??u_hW7UW~a?EU7U-QUu_h TU_W~a?(v(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?5kidmgnv2d9ӯ[G'3r[[ ɦNӐOOMMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MMz%MT2_&x'6>$ҥ$Y`Dק|)v@J?T?{}G*'~/k8U:O^i I?3N?4©O&:(SMtΊ?T?{}G*'~/k8;x~wjd_1B;p0Oo_hykOs9+1 %vL*-->Ӫ]Iհ ߸A50³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P³4³5P_`nϘgq'Ҧ;\mog%vV6P1eOv(wRy?Tȡam?cPw*'~/hSMvtP I??T?{}]©O&U:O^igEqtN?5@g*'~/hSMvtP I?F[ck}y~@:(3zX6R3oqxq>e ޟk((((((#On޸?Vz((((((((?2yR0Qlr,d2=iQEQEQEQEQEQEQEQP[n0ONp⦠((d1:Ɗ2Y C"K`@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE\Ÿn?MCOPgEPEeH#y$u4(I=>PkjF.-êBFGqZtQYKD:{kXObjEP^-/a3kkť&m{:N((((((((owBq$qȬ9՚(((ws Y۾gɩe]:0ʲq@((((((((((*NUu+MJ6->,EQEQEQEQEu/A5KF5]O{E i:*( (Zֵa&T.Ӭi.$qF,O@]5.s{NAoxBdi~^7c'oZf<6MČrTgYm3?-ExM:+d_ay}CEC%ӌ687Gݸ<QExF/ vuxF/ vtQEQEQEQEQEQE|)-|7@? o@Q@2$pf>d׀xn J?OKG C `N9WBR U#w|w'U#̞fԻ t$/̬I[A۽ƃ\_ ܑL$>O.tKǚ{>Ļ|g5V[48:_-rc.$o 7|NR2#H؏\+k|/hXh$ ʉ*r^!0]xWfgE*mNrNjjMjiz֟BfӯAeAʓO5[-&4{{4vڭq*c2y5m|7<#wԝ!Pn}'@=oڳ~êߌ߶mryI{>W]ZU.g/GLUjM{mK3E9'.ݬ9GFMQ%nJ3Aaקz~f7Gkz Zi|Zu7צ3]6k~}mqZʲ.}2ה9?o@ΣukO:F ;@4P@\~$7&/RhKI[m ls [Z>1CT7w}]O K3U< ?? UsXfxDm,-S$(/ y8GeTQpxg<#axeo/p,C 1I-5/-J__Gx:QU}xvQ stH|{ᛋo. "[kz˭%}R;cd'X/=sڅFd̥AxjW=jkNkV^e&,g;~^SKkeiw$Cn5% ſwSJ(fq'? մ+CNQ:2@sQ{EMʵYZMAXiW)$W.|K#0o1sy k+_>"%uMMbR1 gqZ3]MY>izΟ@fӯKYEԚ$ m$2RkO kxÞew!\0b2+c%[;WNR+uv+f竧3$JxIi-o-Ln܆\GZ LHr'zjy_: - 4m]LEw3V, }I/nϦ7u&}sxtٚG,PSTzWm b_kݞ=n;=@VY2 jzsMs3[)i.XgZ񟀺]?ܽ;%9\)q۟ZaԞ1%rxl[mJ;5p;v=T[h Y?u};[o5Js>~|gj%4 z_W 3Riz杮Beouཬ"Rk>E/_2j+KA+9$* x2m?we3x 0#8#_ J]|IF39$1俈8 _[Y_iI#ӯ\t*YTYĚ$KZJcK3ʟl-u 4=^9hH]eYNAӫ_:P̴t!9F3F{uON (Š((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((TJ>Ȼq_M%uor ];:( /ۃ7?jW%rMyeneUo2$m;}Ii̾7keAGhe?rU<xG 4_'׭(L Ձ3ԌS5qahW"5}. Rc;@7 ą$ ύ,5 x F^F?eyWxOi+|5]JVKNU{>e.p#ov(Z_gF״׋K#LuM_)QEV]o#KSTƷ׃3%i%yC ܏rneͱ7|Qg=qK{[ӴHenXf_i>Ķ7j::ZZ4RĂ>7Ԟ OĿ &:|r0|'&9/ŠQmG~xI1]:)ʏpqZcy[q}ԫkb ~5_> #mݳS[.iM `b0,5||,~Į663ʩeDA #2~1}O}~#xSB]K> hWF.c,xtZ> >m_:ܲʏHlF/6םͿ?(|9yγKom`>\ABI%K|:J{ãƖ#;V6B.dñ;ghCLԹN}=OHY.R,TOg2ʙF$f;_gZrz`#˒y]KA>7">:O< 1$UEԤOA_OhMt+1ڶ2*&G7?@n"wW3yPBrpGӟwگl@.˱U-632t=+V6[A:tGlܤM)Pn䎞㫛_(B<-:?"j##>Tk}W !$&V*j_M'`OQ!6_SW_'i~ѵ {wbāGBA:+ISOΏ] 5 JSԡE0"4msM_i:e'ܹf_6|>>|=LY/ouX$ՙp899^yi?muEfjmaDH 9*@$I\܍ɓ|}#m.[ˈ-bw=KcO=Z,|mmoo[#@M|gV~{76%g1$o!c=T9#L~ |D|:/2"~O2=Cg?g9й$~֧"/門X xhJZc6-ʰmCsX !-?g!A|n4dDz6C2q q^1'5]; K֚E1l'\(` Z%&%W"Mqvշ'V>ۢx无WZj~%kS<,UxR:.Bj$ڲJwǴ M^w}R[Щ|]\3%I,NF2/-<mj56 NKVVk93 k?m\mu6<**T $rjԞzݴ:hzޯcZO\ M@/44mju->)RĊOmkߊ^0׏4ڡ/CSͿ8۳vs fGo{[Ʒq).?:X՛'?uV9 9^L_+?[<9h$\q+u ly*KK4Ynn/$8DE%<sY^<ՖLjt4fmP%, ۜߵxIyfQekK!? =2k?cZ/o\l.g4%t,T~8Rt;.HOeo$vuw % mŏXIo+f]N7M g>|G ᄿ j'? x8&J`Vt!bN@{ ᮉWwz. _I伃PL+k6˴~矰O|nZ-ys۳2_&rCZrΤc'w)B]ퟌ>-|CMoD,pS:DgF͇\v"0r+oEKB_>ny7.7y}7dz=o6]:i͓vvQ#lsv)#q_ƾ[?mnIj&$T>h8fM|@k>2xK~_ëj^`k* cF\(ا~ _K_W'xb2j7qB7ǾgB{[H,[g;"@5PEP+__%,AR]vMPּ=խK {H pOC+?gM/KУ߱n\P[پ xYj.a6z>iҢlCMq)$:>݀~uQVm ZS tx:/&ILdvW!f_>R AN9EvgGPҴVVS|n$b gFx|$!Iׅ4𞡢kE_?߳ ge%xb$ك/IGǯ)?P-oR(ermg{|/_?l"2^bw'}k;7=/F%չ-oy7OQݫIs-UW; Ooo|/p;.ng99>_Nl|Ҿg?z/4]q. qv.G`K;F s?½? Z/I+ h g@xǀ%xƙkxZ_ڜI 3_|Gɠ7RpgD_8܆5(GȻԔJCVj1c) v O W#C|.Z& ap?A]megGmž2^1W?W̞ uƉgpۚxDȧؓnFq֎Z˳f㩉R/D[Im3U9pFFFyzgޥﵖ#~/^ԯ"O뺭|M7Yw"d亝=H5|-&o}=]oí4$+y͂1vsGFz۹?zOIK_VqjV\ٌ=} B]þ&A^ ~N7`p{{N2^wNss sZLG7 C϶?{q,cc Yi:ķvRQ_0(skK㖳??6ȵM۷tjϷS~N>Bw?׌ʼ:|w*ZO&yd覽%>Դ?loّxFBk,&Bf1ya1lmZ]IwK.};^/ ]Ad+. q򕮫TDN\F 럁wsx/[,~d_=`AzO 5mc"5ũG„2r39iu&[>mI?Nui셽-wϮ+?f ^Hn4 sS")|ߓ "7~$iQZ޼o_8¸yɍ2[9Tov+d؃wHA ri$wś,y#FyZ~1ܘgQmW~Cv$''k{.`*FQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEG?W!Eۏo+S}+S"}7EW_πoG\aæ|߿u@*Lp}ʨz&MJl4Ț [X`gvЪV`I qr ָ~|="𦞞0ps;399<@Q@x??iGѴE:tS(KĽ//'|6w;}tDٯnV[e/T=&OؗUnuwvk{2} +: ޒBTZx>7Oe/>Q4~pzGGoxş%Ɩ$y|͖ #${a`wR5 ]d>+过? >,ǧ;%sv&>@03_xῌޖkbMm;12y ZZ{29y6ۣ\g=vyfgIL}6?yt[:l:b0@$+xO>+|@V )->  U'$+~3/_ u_4d*-" ">n\uc(g(\qdEׁ??> }m鿅iA텿ڼ+';76:ɯ9f]!#O=q])VV sǦ%T4MmEq?f[xr\4n+bP#sp >zKS7Z/鲺ܐir41 vS^|u*˽{ö>khlg!ɬ\“K?יFUt%ߢ}?{8VQǡ׍3l_ů^[ ֓,Tq+l>WںcI-OmN0+/kzw)3W`hmKFGOj7:C^?+hVLʚQ{ߎ}=3-ƍڠ/xb 3&GBz=t[ .! m c(Uzm7^DLokwgQ!6_SShz?; ̖:maN${=z9zO߁!{~W]w]sۥZ#3$C*H t9<3ްu#I#ki5oC~ş <%Fys{s}2y9 #u 9'k|'G拣x.;=#OYm8eyrfbr y z߇e6?wjxZ+/,  @~.,[ZWA@eFolwNCgr^Mit?˱+t[?_Olt_F Cz=]%<9jUEٯ{u׈_:V^m(:c|u=# $WX"_=qOFΝv%øû$q^%?G¯yyUIdX-JV^OWOS?g6Mh}E_Dfψ|{=?P9HQDxi@d$n9WFr 拌iکl_yj6ƛki*kurRW >x%֯,7wq!O{'Gt>6jZV;f&X$T{ 4IyI}͸ap>ꌜ/'F3OiK"2mm?W=5kA%᱃qɃm~1{ ղDyw@?@kG5I^*&[h.IY7. `nۜ/?:Ņ_w/l#-mE.ެT㞇 ”Z*2'i.67(us>n4O']w(%Ɨst$  5o_ݹҙk1kp-8c\1P|i ᮏ//o ggݎi)sNrk|h˖Єz)п׵~՟n:VF|U[_d;t|>qv ;޻ofj[k|+;7.zzi{nD$u7%s~ɂ\ؿSֿ&a__w^#>m}~uc]3qUG;וq,k7󽳍ֺۧ\.+}9y_ǁh[^w5?Ǐ"~=z|i=_=v֔==yMx{?bձ>_yWv܌9F}kI3v:b) OڇjpDC^g*/_}ZOon>Op CB]^fۘ6{%'.1_5Γ)??ػKEz`?c~vHrraf;:m]>@Ճy;x޾O{E iEKMR{"э@Q@Q@}Mv_ ]3hKoǨ0 DT@~ >=/푮|HFP.x" i4qu8gHͤT2yhM'M W۟ oķv561Ly(]8+اn>&kꖷAڴ]Y8ݐ0¾((3?1xWx볮3?1xWx볠((((((#On޸?Vz(((((((((((( kGQcVvyYvlgq\tE[QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEG?W!Eۏo+S}+S"}7EQEQEQEQEWK#Li~ @οtSE: ( ( ( ( ( ( ( (8ϋ ׼uCxsw |J5rܼsڸ߳ZW9OjJ+((OrOr;:+((OrOr;:+((Or%ߍVyHݿ,_xq/vVBko¾:,^MJo)$' ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ($($ Z+Ꮟ&xG5^j#;=1p訮fRBSq5 q}릠(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((O )|l񗈾) cTs}](u UHbI+?49P1MصbVR>(qɷwۣ\*cJ0˻IY>ڵv|F/Ė)Y*U%]sdp}ƼFn՚ѝԪFH;QE?z?l"xE*ޏ / QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|f?_;c\wo#:oC_OGEQ_Q@]owo" ќ2:G?w= Bi..%y&;"I'O|_E~¿Y7/U߁oT3+J7+u>%FOnsW7]XoC~FX (Pao-7FE_"i|vdbqp z1c?w+~K#˯ZRa}#~oC~|3I٨;}T`pkh*ݻz1ҍ(lQE?z?l"xE*ޏ / QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|f?_;c\wo#:oC_OGEQ_Q@tUeq}[FIJ.Ӏr=|g>xOhZ)e$0DuQ۵|Epppi94m'>*Xmai6<] |nO\YIHAp 1ǵ|Ex|4pɨɵӔR~I+߿p+ q`dU} iD2*_*?@h\(S\~./ s>/o.Zx^Y"Tx[_?P<1uiTqe++=gS攣9.gwi58_tkX7,\i1#wmEԩ&W쬾㾝?g۷wwQY,~&'*?_b EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\wo#:v5VR[85Qhކ`c[ZR^L+񠢊((((ao-7FE_!#L~a+ZA Jz1_ ՛$~ʏS??E/ .??L@Ŀ(+^Ykϵ\?܏ʏS??E/ .??L@Ŀ(+^?Z}?_3_|K"Ue>\?܏ʏS??E/ .??L@Ŀ(+^?Z}?_3_n PԵ_ kV6K5{ Fc$XP̘2qk+Uѕt:xzѬݎwkM_k\cwG$ǿ訠wkM_k9Iq4M@;{&=atK{gv?b .\SQ g)n;z袀 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( *Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň?,?*Ň@Q@Q@Q@Q@Q@Q@m.4;i%G;$Ǿ+O|T/ ֽSǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ E`xMdm$`g_ VQEQEQEQEQEQEdxOE_k^<'" C5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sď x^k>(tB\q{r5kSO1.?Gڿ4&%[,9gv'$y$澏,>eٖl3Tgwï/o.]~mσy?kVxOտ]~m?w|:9>?[?u??Vw|:9 O?hσynah[ wï/o.)?>?պS}owï/o.m^%|"O}Im3Mb,-D X̟6!+ֹO75<[C]ѳDȸ`2YЩ |'6V;oO3X2w´Kz}=E|qxv}+TMIȲk \MP|e>n i|wljߊ^[-ZM}J?jF6<I*2hX JpPqn[߮xu"ԣm;kwU{~"t/4>rM#5xo2=7"X?RXun[q>@{. ~xߊ4mGOi;bބg=*ڏaKINOʹr&nTӂG]qSeM7R*z5cXYqJvu^{Dxd0b>6ѿosӯ>$|[e }>Y@6)Ac9V-~xW^j&%b21b6~r5JQ\lޫ}F]B(7-mgtW+ɼT|`4|E)p$_H@9ǥuUTӷUӟGQ^֭G|N/uK.SrZ(y_/yk>&uM>22QS q]NUоI*7$OG8]s#‘拏Ͼ!ܟvw BKiZ}WpQgO605uZn8zSvt}CJuԂ/ ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((W}_E_!kZK??8ϿH(Sz -M#ǖg+m7Nt]>ώ?Vu=3V] GT|¼?u#{2z6w ~.x?}ށ&G# u's@|){t}]x f++_dy@,^ca߳yl`KO47Q }xי ሠqQ٧_|GFXNuj鯴~uQEGS?U=S=jeQ+#ş/1Z?z((((((/ ֽdxOE_k^ ?H&_65kܫLO$r4N ( +Һp#J:I?b PN;< ះ_n0?f?Ztk:ƹkNey& Wir'W:.i3pGoHAbA8gҼY6j _7^CM:gk#NU⧳],Zyݞe|Sx:};YV8SmgA?B#e-Qص z|rFxl|X-ߌV+qowfu sN2 vXتTY&23x)J:jZWߕWb~ծ'EVmaV<?@k˵0?oI]yisK_%M_cK¬+উy>Iw aHEvAlۜ}ޕJ'&FM#IQV*+Qko| G];Vcl,OPA:W+~ɋH~5#v[f2Z![;}ר_|3O -l` ydp'ƻV@$cֿqqmtSmv:x)NPy7k]5Ny ?gN))-[ЩY?iOm^hz]SIo&I|cd6qWG'u<{]q`W_7E}W,39 <]C[:$NK1 |##kյ+.|=uU#b@Čƽk&h F<ӥFQժ-WQEwQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@0B0C5} /\_}AEWҟ6}xn+ [?MruG O]?+?moxs]hWKsh vae\{p;`|Exˣ l0qr.< !O]%i@f݇9=L5yWqFl65@$=#ôW#ɢT̴k8N44Օ+bh*Qe`#*(L>i6CW*4K`Q_,~׬ȿukEPEPEPEPEPEPG_f#/3ZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEou|Kk*=LA.GrF898o"0Kp!^c٣ᗎ5)u _6rJImF=Y]|8R7[|i5VE=S}/Я/c?'NQ gw<7_x'?7~OQBHП;=G1yǨX/D_?G"} "3;BT?Oʝc,a?{#wThz+ S?*wz hߴE=S7wxoL^Lv(A@r@_c?'NWx#ᯅmG\ynq?mxo@/֝r_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP%?[ ?U@A=n?'~ W[Er_cʏzOe]m}*>q?uP}kGju$F8Ϯ++'n?? ( ( ( ( ( (9 Ӭ Ӡ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((  'n?? ( ( ( ( ( (9 Ӭ Ӡ+26Z7Zt7[r<ÞQ A?|/kM#QԵΛi}@%V,$#֦G|=4hvڝv GK[TW9?׉d]W%[񮎀 6co{]3ʢGRrzʹ}GOYm"^U[ lWY?:5 6D}$a9*ޭc 7WLqsJ :zպ|B=wŞ"Ht;H]B qu 7 RE,2‘."I!5,HU@I= YyQ\4?~\ (~!xV[m5c!oMe!:Mo#QSՠU8";*kyes ˾+yzaJOxvIu(_M0E@3(ҍ 5. yf奕ªIR}nM2Du5 Nvq RI2)Nf ^%ׅtVu;Sffv@B'C^&ЙNKذ$ۜ:¿+㵙5]+å_sqAHK1OjO PX#W|; Wb=3/AwL'Ns͸vsMܣ)G\zFQR uz~eDAyL֭W~? _:U\q%7e&1*4lZ1ڳwqۡ>M\٢ Owx7F7vZvV_帖1'yo¿AkګOGֿV*be6/u_4|8oQY]j[iuy$\DBvL`+ُ:/q|Uu-/E1CCНݿ4iGMsk(M~v/%7xIԌ2REJgڜY7:y]oAI(Ӎ_;-.k>// g~$oai.Ɏh݂gac8e,5?}g5em;VUR5̅z$PzQ<O_YM9]ckC[xb 32k^/P|;@c89+*Q[z54X'rxP_,cMePB#A9Ծ _\x~}; khsy%RC(VmOԬY`ESD >=KMs UUl6퐉}ȿvO1ۚ-{ 7-o6?no9‘eK(.ew5Aε5~`29#88no9‘e}Q׊-;XBd3π:FNFÌrk=9;wcnէ}=G7HyO fhmMOIeh10с?{OHnZM=֐?u푑5~0mx7jGx[-l4FݰI{@'φ~QQ7kP3K ,g e(9FsE+ok~ۗk@ɼ0: >-o1G{AÿφVkm7VY$bm22p;u5k{;4mJ'S|.gY蔯) >GyHѬYz`Nk ~ ̳oe%2;%W5S8*&/I_E]Wu/I_E]Wu?u)hާc3k׿g\Vhe+=K0Q^3%?u'gGo=ơ,处Un oKzWe'?enXT(4!?@uo~m$Y#GDSd4$Y=Qmfw|IB|xwJ-YW2~$Q,(ޛ$I(ĝq<ډg}K}@,Jf- 7p|`dnl S%` ~*Gtj~%GJn*Mi~a~IsTt-Sk?rYGF/N=}OeKj 2o6{W"KAxdڼLJ,Y%9AGڤp7G($7! $sUHԙXd2꒐GZ/8e:4q5d;8aX6}Ki._G͚~ sM~ k} T{[<R C!.@fcH~GԾ<~ZkZdPs|ge HA?4_&OG"{*}͎#IgooW%{#G=oLfUUy ̿#97m$98~cl 5F@Z d:.NV7Xsa|>#&g}yw0a$lp.gI95C_OiI%ݭ13$2!a@xſ 'XHiv)?vPr5bYu$ f.JT6qox;z MV=it;{yrX&ͣ?6=|/?wWW^gIs38Cv +>5vzŝK὎-NJ̷6m!*̸ۑF3|*|uvJ㨧V}W$k[Ժ)G_;K 4?魥铴7rBNLxD^3*?Q?~j=Spأ)ڒJwO#g=G߈1ͯh]:$9"I*nfwZ|'dw(e"{my;.@ n$.q#L~SΟnZ97I7:kjKgo(WeHQUvԃ9%R2S/oC? a ^|/ i068Ͻ}>/<+Ǥ m}2O,c;9ff?{qWuB.$ԡ]",eX IZxj5.4ݢhŗ4MON[hfLЌf^x@}Qu؄vf@nt9⓺7=9T.>xTN|Moo}ĐCgѼm[ ៈ\xsY,y+$y\va/{;},E?f]_:Z({<;OKjTėP͏`kSj1WlRQ\vGCEyυ?ho~6բ4[})3-2"'s]mOy{qdy""I$iRZ/Z~jtSNI'r/zMdY"$v)$u~օ)8mA/g6a $9=LOZתdF&Fx㟁~_^i$&y5bz|KŸ"7f!"]*S{[>^vs.uqT3^AjѤHvX /ڛJ/ [z C5FF*ʭc+/iZnl,J8f Bq]O%xg=ZΩmvIr9Rx=vܥ5ױQHA  3GÖZ\ZzﺵD:69#J66s>7xWvä}LsernS~Hvw4W 5CVERt>*})-{Sn:"g7Ē#&i%wF2{oC٨!| >;QW>!\&U/|n9aNp8e5k Ʊ]B|A2#21%IǽoW k=)be*Ƭ9[WZGiE0׉m8hϣնc\tԭ.Zqmjuԩ Q$\߂~#g->-H HGeϸM7%okYZ(xˑN.륵NQSRV}ntW迴_k1iV^){_ˍehzsj*QFʬ\oXTRg$(xOuj+gڦe,rp=+ XK%n`XWheX!* )ѫWqo\sN$YWy6>xtK),uPn,;2;|!5Z:txUc*GXڊUQ\ߍ#xkՔw^#-$F&:E?uǦ%CXCb2h#x刣NJMtU s^Ӽ3ϩjװiqp}9=ϧzOڏuuhi?T&vMJTW=Ro4φ~MF[YL7|yhT-3є؀k9aFPj=ҔuܢS[j]ѢY\y*v N\Ej?Z?5lSǒUWARԌy]MvUir)+otQ^s͇Ÿܽ[kW6.'0`S*tZj*s8#Ѩ6%{J}=#բ ŏ |5X$a*JæB -|b5+m~okOs.^:+G_֭,n҄rHVnSC>uE4>I%ј`HPO@*PzlLkҒVnwvO oU;xD5M~t1bJ2Rך*v}xƈkψ=ZZx;Q0L#"atVRMZQvk(/◉! Y~]ȯAJn^QX~o|9Lԯ5 [TWfidbX[N*2qNu; RVo`nK4ϥ3š r Mԏd`y1VQ)y}u5a#brOֻ*`<:iYtrGٻ4zQ\pQEQEO!]s$-BEPEPEPEPEPEP9#Zu#ZtWU?fv'I?1ϰyi1o3}*(ZJ3[uǣх|*k~>a{$,kkprĦw)<R}-)b_|F4ό_/v2 c-mE69 C_ڭ>yj-!F 1J} h(=߱OϢx/㾡NI2HYvdп`+}7ŗmw?PеEƯrI?6uuSMũ-КRN/fxo?ٗGχ.+<bhۿ]7\ZeJS׊tvݧkwy A`ne ϴQSeʢM*˫V#?f7m^~WIeXt%z} lo_<7<9-s-Ŀh.3]Kd`(9I'hM۩-'o +}oS:WJH$R$\dQ(+2't|τ45aSYD$Yj~z7Z_ qtc5gvg.׎++Ng{VO7 #/}->ÿe9oMTQR-~~/c/|gKB-Kmg_&w"Cþ &GgAunBk( #bA+%˝n|-'q MG2P;^<~~)/nͿRuӜ #$rIDZU}_+-/-ڗ@~뺛4[Zܹ9crm<+Q{B[[o5/x~ VV%IYmϹBy8")E$[&{վo\{'_dxUT zz:_Kw:Oÿziݙ4O1v0p72kZ(z*+dx,?Zz׉|WĒ󸪮N-y$b'+/; '%Q+Y?qWkܨS_'wW{ک}T;7.sxu?7_So|>y>ncsmǥ{s ~ |='VXOb.~`̌sƤ[8mNITo@uo| ѼcO=sOukwqo DA4,@, 78⽃߱^sBsYY^խD𲜡#qUQoW>M]uƷ-}ٹ}kkrJjP[|XŸ8ϫ5}.y/O\RM.O=.oH`2fd} |uMtQ~&t>K2َpBX@=׿Q\]%oߙ}3?e!__e٘M|sߥq?c's៍~x^=%7.7XHyru8b~"=7SF:|d:--[=RGݾ3|)Mo_.ow1 VGV2a1hR#qn2S[¿3Kc&'G;76߽zW sc_$Yo߰yj1g3}sʢ$%$魚(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@WcYph`">®I(GvdJrS+;Pְ6EHxVp9U{w#7Kqk$VXF4e^)F!'Z8'&Oq5'/ĉh'K8yRNX^ᗊaw_@g͌+9#h_GHg'5y9gxdLJd0z\4ҫ⏇\l-B;coms1VD rI$jVU*U~$iϥ1JtaNJkkM[}S^xw6_w,(\F-08; q^_* Zi4 *D#SFS漌iYe^MBM6-w~Hi^|'r[ꗚWّW+g<@^K1fdmznYN7qSV!O ,. SGuIn$J3mYZnk> i5[OA.$VX@7ܧ fQPU!ʣ=nkiJssrҵھIR#ٍ͢(A䪈T2c ;o6o ;IJ6IG924q$riICaj~0=Ehlcsc&]KtM>L̎GMpF"ח~_j/{t\G^s{=CZucLe@dze4iho#`mb%Y!,+T~ |I| њI5o$\=Fs|uK㗄=ms'*mZhZ8r9(tFgvsJPk~5핥wğ #Bo5-8e.A澞lf([55ekXsϹxO?o4rڵ>5׆CM6 q gns|w÷?e/xfbgo&]<%]%EVf_We2^49I#0ǜ1e/OzkW/$ o >6&*mX^9CB+tHi>a!BdݸTWٚkJO.}T(UXJ4Ri$kvH)ԫ ?u:o4Nյ+huIV:$M.dx`5|qgD? >*|P-W\0BҭifEPX+ @|NT ʿt. tMnlxE6-3.7X}?|8TֹR[Or:Dx.A;Ň y8=?%?TQ  j+GZOr5,[ԹiY6컴nio3Em soxxVFtW"'~6yHm~\ukF75^Dogh1ĺ޳|L~9׵0Ҫhzy[@{t$u_{?=Fm 8oHIYua֔S.U&?LM#ǗrODג]:Y/ όZulI*K$02H+~w?:ۈݜ漓_o7۽vR)Tn \f_~znAJ]Kna}GbMV&3X;VjJnm[M A?hw{k?>sMo$.l:* ӭ~xkhufi@.>\Xײx ,妡i-|gn+5Zg/ ?hO/I"T[`0{W>2Nێw~ltx5* ^kbi kO^谥"[V%Qssުxv>2MKkW9 *?wmlVh/Hvis<3H"110>9 VR?Fn/(?*g|l +uC fT:`leܺ+XA#XƤהB?тC~mZܲoIG`ҙ~?C|a^:'Ƈ4uΩj%%!PUBV#$7O=o)G._K⥘BhK⿲_t<]-4}I4g3vU<"8\VΡgvQzDu dmr@|?QV?d+u9i._dnk֩RRM篩œcK_h- 0-3,ԼGC1ry PNI GN;.,a屒09JȵsǺ,eX>GPBَct:,T&-I{  ! gso$bCGm.?\%2YPN:i3W~6| ?4.Q[v6)A3Mջ~Vտ_)TN)[ʝ_ӵ ۠LXwP01өMM:4KknZ#Y9@m]//ƷyȓǸe(=s^EojK~tu@E6yT?F9te(TQRmI?yi֖}I2F$׻&wkXm?5[ouWg*gXT2}Evz=ZAcl%'' k|AT z? G="}2k٣9N$WZF6_+TEzZrE$`W1(,0p{WיҚ]ֱ?ŖpgIqT=I+¾\E7ԮMy?w-'O_'EƅlR*F_~8#$^_'_VZkؕKTz4SrL^Km_'xy#B߻ڬ۰@C~h 43iϸif>c a']2rVjz7nSå(=lWgzŝ]:Cѯ,E/-h1܏fzUOSV,;a(<G5'Ɠxu[Zz6 %TSk['@xvPW\C Iɸb?tjBNOٯzT]n\><%GջM;6+EmxLtX[Gew% \)Vd.<}o~>miv*0F` ПξS(OάW:s_.Ik<[g>mN_*oWN ,#*O=5's_|H#"Wۺǁ lyW5O:t$h|x- ^Iq"~k_ >Xg9}YCҥ:ַ&?RVY˛Ϥ?[?_~}S\e`s^i<7_Zfh ~f$Opf|FXIvi:lv[{G*G8-Anc+W"M>]@_L KhUw9:n&[Dq|eE*z+ٿ.[gjQ Iґ\qw:[|MK va7z|ø4~Wz橬ż/Y$,n9f90q~6k࿉l3kIY}sWaތ]ջ?;jPuU%xI]y_E3kx>2s :t!{[up.hO i|k.𥴷VxO1[LiOi> .$X춭1&͞a{1b^SwOnSɞ3ѓ%[Ov(=((3ğB:&h7u_xuŮpC2<``nXg5 R4HB[8JTP8 S[:¢3$џCԴRU `(W/*u{qq>)p  8ϭuTU\Rɔy|z7ئI@FҤO(ds?  <vuCjm}xa 9'eZbԩʝ8(ZNxGu&˵KnEqk ~\:g;dP4XQ"(UEyǠQEBvp0$( X^>mǂSd0o,qE@*¨QׁNo%qeXjJ(((( 4C#b)T76p^([#A `?:@"E *REQEQEQEEqk {'99"*UP SUTz}39 E;G V=-@5%Cqgox. p HԪT0 Z)W! ^qWeƀ灸+9)tDp(᷊wG(>,[p NF >jj)݈B#Jψ^+_}A>)b_[IF ? Vj*RT֏ʵ7R[iƵ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע9xO'd ViWM<M/b3^f[}JO+ƮuS ƻ#E7R1O[j{>=W8I6V}W~xfTyY7P[2ۼ ɞ9i׆x㦩?^-0èxV ˶/:X8UǸt8 ?7*!g`fl\/zs`v]ټq#m>ٽR|_^![o cQkHG4m,@җ8 t ߎZO|qZO-[=BDx T ,[4n}կun~G*i׳vzt}EyC_h5.Gujٯ?.pT6=T\^xW]4pپV@=1x$|eN)dޯk/+k[{j;]z}7Ϣ'5[iVVZ,/K|GcQޫkߛ浵mO=Uuǚu=|=:_Z?%6^)]3?OM;H23]b/|KZnEDrR::_i5x_2l? +vs#4K;dB!Tpå}kO2c,tfL"]wP#X$WfӔUdSpԌiҫ*uVΗN~ןhs<#1 yJG ʶ0G/'~}RDyKIᇡW [F;Ǡ]SR6W<}׆tc&mխ&yҸ'JWSيМjH+ϊ Ǻ \z{b)EW'&G?_b#ş/1ZQEQEQEQEQEQE?_z/ ֽῶM[mj׹W -kK''ڼ;n 9ǭuagxsI9u(Twq^4hx B6{u@8oľ,𞶺OMKRYOΛknl_6XrpG3K|Zmۿb݌gkE;>5_OQ;ʷ69-'y'zxlT!*>ͫz=C˯|p'gfc/~*7" 4rNg+?\?b;RG"ܷLR7]?gFoXx/񞭧|}mmx k|hmZm'Tէ牴g[&9ˑAc'qZԌ*拌j6K[M}/9N>Y^-^Wo]Z]m e %(ȯ'`}%uh6^[Hw61OJRFqdR]4a E9GX2Wnף^x\ok50ǧWAvclWH 9$🉖o4f[ N3Aڼ3YsROĺ>MR4[tP)۸ G3QQ2\ξWZ2]h4-34ndC-3c#,'cR־ .miYbK+Hk10WH$gj,_7/X0dK+{),Jܤ:RF0|MƧ:Uyk{NWRPi:|mߞݬyG߄~.7 ZW[L<+{Udcx+/wߊ0|}u}^ݠeG12br8T{*BЮ%26O@O]:rOZU֮UI|Za8;G #'Nekѻ/2U:u);|R(ؿ?SmO5>9O_𐲷!ɿ[f mҲ*PE=-Mj:ͭ%W4xGu_1iuI#(9rxkwUjo_,d/ ?+1 F=~)]ƝMhϾR?0vg<! xY~$}vvѻ)Q+*u*ӣMJ-_K륝Uթ^|r.KMn9cw9'\҉+;??~ UύΥ_Yie ijIg$w  ᏷i]~[Hw61OJ15#YBW暒kKtFZsܐqzlٝuQ^ Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@0B0C5} /\_}AEWҟ6}xo+k[rUwؠ*Mϼ?+m #@ś |8ZV8AG ۠=| Mկ[s\X\5*An.fyy摷<1fbzOS^406XR魿<|eS]o.s {f%@|mجO|*t{殛2ƭJ05%u=+. oRM8Xv%`8$cG>(ҵk0M3w/gFqɟarZm#g g2Ǎu%P$eOy.iif1ff'$ziME'riɴOTu{TO_[w?e(Dg_ VdxE+^ ( ( ( ( ( (2<'" C5Y~נ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((n ^x\Y$I!%XH$c r}'ψfY 541$3F"x`Q_?eJ[aԴ˴:M$Y=p#ˀ;We9<7FtٮSSQU~}Q_tý~kmý~km??q~_yO;QVG;QVG Q_tý~kmý~km???q~_yO;QVG;QVG Un*Ѽ;I C$yob{M}uAU#ת+|vG4ڌ6PaA zAo&oC {EZQ=*( ȿukG?_b((((((#/3Z?_z((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((g_ VdxE+^ ( ( ( ( ( (2<'" C5Y~נ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( ȿukG?_b((((((4KY;A/v0s=sV?8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k9OOc>8k8CRn-$Ksۡ :s\W9O!]QEQEQEQEQEQEs- B5Y- B5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@$-B9O!]QEQEQEQEQEQEs- B5Y- B5@Q@yE`9 )7 r2{WşM@vڭqe+Xd&[@v(Rg`zBsUsJ+Ⱦ/| '>#o mcfPT}D[5/}= (((Ow(|oD 60]d;|о`(@'Z( )*9.f (;@?&{ &ݑ5_i?how^(JHX)c99;{W4}IoE"lZC )+h?iZfKey]YsHjOYm)c< L{]Eo%]_N isg ä2Pw 8nԣT?viQEQHX. Ҿ,xW|}R-3UӢYYGj0H9=}M Yᔻ&J(,HQEQER 2p)h#xNx^6qZIkn Il1@e9Qi6՛I%oyƙ]xͥfoIo=+ђ֨(zW|M=_>dGQWv9aڢRQWe.M$z9SG%ɫ65rggρzGxPnR7ڀ]ҾA:V.2qﱜd(]E`!(Z( )( =E-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEfx@WG\? qЅttQEQEQEQEQEQExo@/֝fxo@/֝'Oxo]'s`Yd"&I2áGj7$Jޔc^_Y~F](νźLjCuIy:y/Yd ׁ)vg]{Uy=/lR3cpPcs1_o|O5o,tbU]p";b?|gmA'^m7D0Ń2W=NXgj#ԒkH[v`zW;ob&w/V6wEw&kiv v^A~ҍJaZ&_ K:BȡϦTW>6K_u p* Argc7}ơa+ `cTTmQqo+z=EWj?`AyWjMwQă|xb 3 xW/oφqDL0i77M<~s;n> A Eճ+A.dW<9vRo𲴶vֱO&>]O+^2#=W9g)oOS ]N1$qU_.r|Nnx/KR졚Lei$䞽k?6G di>M݋i6|6z= 3}+>Gvg*~q־V'=t#JH y,8Np2? &rSv  --N+!u_mß$_ u^t[Ʊk>ɭNKD:^gEf&Ot!=k~:}gEK{y'е?x_>8|dD~&Դ/ KMu󕺒8'Hsc}o<| KY_M_$7GjFb-XM'$8J+N\ӌSr_2Td֞Sοi1~zǃ~!|2k:]܇YH]IU][={g1 /⟉)iۋ-nU-4 &C@ }oN``0#,HMtn)%^`Ҧ;%+.t+~_ݏ&|)&Z])sH(<(W*R >'h:1&"֧e]M2qB9(1f|b~~ -F^g5UmQ&fgAWnbi&)ؓ'g7|5ko/vձ4Nzh =x{Ş"::֕ʰ݄}I<(xC C{xr&}f]:Mݲ{# r 1n;uᯟW×^0|~WMeCr+El~5Q^)땻ySe;+s?c>%~>&Wx1E,.Y` dS>7]z$FSqj/ $#Ȑr21'W'pFA R8#y^;v?g%mfYL[Bv0BsUIm=#7>'uO ^&4h^]\s,h/ [yqzo4;9|3𶇨}KŬWˉ2PO= b|kc:ơ+gzEupIϤ>1rB.Yg#y~73܃ھ{?$𭦧GZؼ جUX Wek|>џ2-̖P^22; t Oj'';-C/k^"e&0WbLgkʤlR NoueğjO| 5xjݮtǿr[T! rɦ?띷K\OGWvc<Qd,8;WmOvU-U7<${r\ֲ۷rW 0K>.Yt' bs^xY{*x`8`?1'zͪnןފNS|7ɶ_ǂh|YusV癭"XW)#Vګ=<{#s#:syVei8ܪQxw?}, ea;: a(m':roZw\-Iodhrźzy~?4 `g.^2]ۉro;RW>8\$Ւ&#'ܬH'87Ji]k 5n-彄ɒ\$^̊~7CeaFpZ槬ն˿ޣo["Elj4a7ZxťH$O˒ pkqyE:Pǂe6m:Tor1 &sC|=x_ޘv겤хv#vr@ud߇=V};Ķ* SJR';AV\E[ޜY;~Qu$g񍫣.[7 P0>y/|Keo_ hlA%"*i6+y᛿x;Nj1H֑d vTw(R~%76mh[%auY~{'I~騾uwm=|"?Ge}OZW*xĚ犵eG ĝ:f7ſ%av|G7x#[4#+AN_39Pf}BD޲,[rp>>*PSo܏o 3m`K%bX~-CdˋEgyeڿ]~$x?b~ z|Sitv.Lsj7R*w&x~S_%o7#Hp;O㵿#]I+_cFG~7{ z4g7Ӊ# @ R;o(ot?+AyAcA3)irn!ѣ[a qɹRs)FRP[>oMԵS][G$r6fj7GuUi md2xg ]t^xKq,1uVZf.9*T 1 P?^0uM3YhlPqa$f (@/._Eh,I{c%ߛ amFxK cu~ i~Qbh c*2?ލ{鿲.YU$."Ʒ)Mw}{czEm[( sgP̲,@tFIlWokڲG-Q4%ꬿ3on uGnRLzeH %VRFAkblaFқZܨ&&\ҍfh(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +˾?TԾfhVp-,hǫ: #5_|9a˭'u364Ż2cW >Ak9&}~gLW%Oe94m>} Ey^{w[jP֗i! ܠ2v95Z%J{j5مxþ8{L$e8 Pk~7i>0|:N#iy&a8a[aT6N&CW^+m6j0-ժsLRWlhC2\D$n+`z{2Š׼[V4}kY5B鸌Ӵh(ѵ{^8i,nReSJIr[B9}MJ*ku{s CtHz< ҼsvMAj9V%Kb}i(ɮdSIYEV+MZ;omd'HXğeES!@} )NO-Df:J*+ko-XA$+PGQRlV{x5JVQo,Fv[I:}{.!6ZW4Jd{;襓*5[ :J-kxz\姉G$}mo72kl:Zdz;6Dμ9#;\5tn 隅o弖,i*N#uw73GooiX*"4ӳ@j蚊ÿ׆>:U|ؒ)qk~Iִ~/4mFŤ,me$U8I+*qn]>:g[5Be-^g.j_/ N(䓏2ZSoSb_Mm-֯qy `"l!O=2kOhio.5aW/=WBѻ/Su+}آ,!?tY̊IȸݹS;9r |3ek,l$͚Kiϖc8*-,}l7SJ:_C/'ƍ}szbH&8<jiVzt:-$EnƵa凪ok~W3UMkm~GI4zݧ5 ]Fm%*pJ#zK{L {FEӪ/8T>+S6澅+|YO|Hx'7_K#[̑0S`W??|K/[ZRxww+mtk1pIc#קO/NX9+wۥ]uL|iFVl":uyGQ\֡3MXxDV)"B t0\Gu M 4R$lXUM&JdSQY?hcf]jˁUvf?&.dqϳ봜Qfi}͚(ZGﭬ|E?1E\*RmJE`jWL,4{9FcdTh>Xε@}8w}7Y9r} z+7C.kf[-ZN-LVִͮ;]:N s,H@I)FK= V&xfFJ-s0+0|nkxoN5HmnḜkn+A^ [kjxz**QgN){:*Xvu^ڱ Mk*Ȅr+g^m& ЩlڳT'ʓf:Z)E1 c;=sXw>Ş#aӞO%n侉b.:r϶jcKH1ճzj:ȊC)#֝RPQEQEO!]s$-BEPEPEPEPEPEP9#Zu#ZtWgG>Bo4_ MSJl>Zl:澏3[z5`u7>L2_o[V31%U |r@lWR̷{xuD\Xi|_^ u}' KSK/Kџ~ ?>G%Ǐ)ԞJ=k%(8[Gv %;ꏋ>~ h f[PHk$^G$x84_؇/|G]neo/H.K>|2 *:*ԚUԇ>q?g`z5mxVn/bTE&" qy"s^<!O>lRa7`C0*A:*TWFer}RO&Iؗm˰`h,:{o|'K>b]ꚛ)Q#vI719%={u%+?h~ϞfKK͛ʱ\ʟf5tTJ*J̸cx6~ EZkqaBTp`3Wk i{Ek*Huba,6lmEiM~~ Uzvw>S|aZ⍝;DyNIE#C_GQEL}-߹R_pW?7_?>([Ү|S{(&|āP$_[k(^칖kGtC{=DcucUHР R79}k, k[h\ƨJU(]] ~/y+~7>rg/G^/?-͔z|wāP%_[;_'⇉|Cc['ERnm7߅ %O1 m:֝*]X^:JT㝌 r>iW-/xGFamOq۔ry(Ж)t꟱G\qoYѼk/G&fYfwTNg?7¿mkeafY$$wYrne>\_`i5%Yex:<3h:?hu+i-.#7#S{բQRM=IOΟO>6Ou4'P+` b&xWz׌wư+stkm#퐒2_OܔUEv2I;?ߩߴ{sfG}% !\ {yx?>4X<1x~!ҭSȳԵA/" (od&+^w)g?ُYosQ oj?&{[kx2vP0s_ǟ/|^>#V^kk(w',TllIl6+ )Z[En݄i}_s!>9x_~%/vUo΍O<`9W=M~‰`o -38w?Lg8Lg hu%+g~t|-g]𚻛5bI”;y9985o쭩3!O|D[T- 'jPm~IͻIqM[>qO_ .s}I^ɭiMڱH]LaMQz_|JG ijtIv̱+*@]5I앾FMTu/ ?Uۛ+NLYtwiitSцrʟ3|+X^!ӛOuM?P7Hu s!&oxG\{hBBxA$Oxg/?« }>mR[m6W=j,s=+H*'.Vȉ$+5g^Р'Lr lX 3SoWuZmTsʤĒ0 $3bR%(rtܨs;9~;=LJo<<R-cPQP0֓7|KvjMɤ;2&68'X߲=cw]͍ޥg-ĒKH J0]a:׮QUwyKkeuj/ٿ>"|2״;&5 I$_6a#`N#ny"Qcȶ~~K ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( /± n&ּuk lrɦOxE׵iI~S>]GP q|Q~%4ռS|7:wW',J.o_ ng%%]/+zrQ˻Ӿ/? ~J;]^ȇ*fp2z[$QKfY||d__a}w5_/([Tdp4X͖}:i Xą"eh ^fmjVZjcJ;?!~ 0J;qE2eTn|_\Pӵ4C%[k@xBTw/OOOK8߼``lu|x6}>o/[K ]˓z]?)t- B<&~mow#Yi<,FA q䒞c r|ʇNiYgX￶T)r6gXc}AqqGdaCs*1Ap:λ+▊5Mf2=aKN> Φ8U&.YKxKm4}9΢;v~|/ƛk75\$2ۣsu^\Ο\(,纹t:M[ɗݷ#<})j3J"Jrzk'0L<\#ʵukO.G^%? |L|E'Ś~_mt}Vr8eZN7RϏn_NO6]uG aߜs{bN>k|QxB묘P\H!2{ 4NRJ6+kߩT'Z<|;j}6d;/7d]mFܨ!1`_4_zεM6/mǖ'+'@氾2kVIVVMBDvW9e P{KᎷgTHN C\,x@䁊 _k>no~{_Kzrr_3tk6fVt8hIvpkѾ~iQ+T?2V3mcʁ yx&mBjƒ-&ˉw;/|;noIw֑wi{rʒ"l+X2sie{ontao[+_k8w_ YtB\ Cges_JW͟ψ穗['.^ֿO+ׂ!dxH_솰kx"X"6#q[ ;gt|;0ƞ E^@ ޲uZxD:SCmwuW.{n|6o wW\ V\pD; Jkً\~^Xm_嵆ź漷m-5k/ik5J}׫|fmς:t}VE2>ٵ_ǂ>jH"sqo^([k2}k)b+iIqݿƳWWT_}g»OiO.9d>66n[Wm\O#3Mj%ZU>[Q_xnxO_Ejْ;[uDSobqڲ:9jȹdd) ͎ա+|\ޗM^BYRmxZFe6r ST/0|Z/|O7e$Y@S&I JοֱJ-?O^*0Ν뾾vo#sOT<[e{n;_'nĸn{W|@Oí'Wυv |C̃e .sJxZĹ"O"ƱdAcޜf?i/~$ּ#q!Ú6yZj#1##m^)9Irkk[]'(΍zQNﻝ}6GQi_Ih<'H&V! {/gbB-6nTAo/,uo7YPғ[F7 bGIVE?w궚wv̲*i pGC<"n|ms=>GSփM]Ni\}\ Gr7'l{"mOY*[^h8SXNEk7-_~4i| yHKv]=?O-12 <+5ߋק~5=#T]7]{lT=H\ܯJv\yVK9pwR/of7e,H~x.euUGcXvZ;x )w~ ZӐ{cU/5 H9˟ dXv;V|2?\43c#Ϩv±7՚ܪ?+ZYs7sbAޡiT{i# |y=O׋4 ] <0K:As GLB(#n6VZDr8egϨUQU@ =+ǿj_x ܺdk}\G`p Av:G4[o-lgw:ơ{ ywk|]:n#2Ϊ_ cN8FyiTR]go̱?ٷG,uXꗲ#]]GW*'H\oqq>j.%GӟzLی(Yr$Ow߁tJft..9T ܃~㏋_>$$E߿ش%Rr\4Xƽk-m}Z[ogrm3>!:FHr1wy>U\x3Go~[8a]K{_']2ZbaG%%GF[[4UTѵ F JK>>7y_f}|\췫K=׍OiHn%^4f2wg]Z;^jFʭ'k*뾋zӾij5kkXW޷>?ɦ鿴!YXvQ'Us@䍼1X6jWZEy ^DArON>E.=+۵xGĐkZ%ͮ~c}>6+27QԄՌ|O_z}m^W[SJSIsE/vtͭu9X|'qj,4-kOnc]RphI9+= ~~dWՖM i#s~NO 7d*8$r+.Kվ꺩Eg,FC@?<:BjrrVwob=zn1w۽G?oHc!կ~M(#ҐGBp&k?MZ4%A&\Ęܤpjk; m x\lY˜ܤL|u?\ĉ 9l|c#q p{fii~ngtIyyW-/s?_ Ň#ھ]'uo;n5~?O>5ZKk(4aHUxXռ1aX^.Vz:8'A' Qfo]JqU %[wWՙŒ$ԣy[ע菠`#mDP=S袾TVAEP0(3ğB:W7)sxwMnPmYMg*q,.GأEl_A[UZQv^dpm]$ D4=Z!\?x{:|NsM"1pH5EO/%>Hs^^Q|Em}7GZiq9|BW״tn"Z%`R= W%9$+97Ӳ_<7u"d62R) 5|ٹN~ƻZ+'Omzs W mb+[hlp*z(e$9}{oQhjҵ3qqh펛7WO[Ҡ5 Nӭ\Z# EijY.gGW{G\{i:VCm#!ng gyW>.#[>_M{] -[28Ԑ}cEwQӧ 5-oU'+ӝv߉!tx{@ek;`9c1.֠Ѯ=Yi޿u%DӾI@rO'֕]w+in#i:i:]y-B$62}Ex?Aֵ(uCDӯWdWw6,k =kOW澢卹mwJ͙=&йcncgϵ3R𾍭_YjEnI$0%N@?os(?os+V:<3?os(?os(V:3?os(?os(V:3?os(?os(V:3?os+ؿg~񦛢xU_5)1y]p璹#p9$s¿)SsCz9ZEW˟LdxE+^Ak (T$hъ*5nCS-Q_,~׬ȿukEPEPEPEPEPEPG_f#/3ZQEyω7 xMhc]nCSH=kJtVqK"sT)d= |F>Zfu)b50A9o>8xǾ6ռ=B/myB-eo$1w)$z|yw=Kao ݍE!ϖۧsF=`hFnnqy\r{5xI7uY, CĞ5e_[Gp-$rñ:O|x_OT0[Ey~$(x~_|ί'|+5\3͸PǦ~:rWkWt]8(+ɴ~ǽ\/ďkOdKgt[s_[gۥE*Ӈ5m-(x|C{M>3$yEQI>"|qƇ? VGO>Qdr^GLG :sM(.ݵ*QM+.|js$t>P*] ~F 4o~._j |=C9|FtŌ;z -`.˗wumvϡIB3W|+;龞]{A^9nx~:!Ƈ&kSh,d׮7 yէ#x>DžOz~-d;hٕ )^Mg[[ 㨨Fwg{m諒O ͫoM^ZxAjsK)>kQ哏c2投 (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((W}_E_!kZK??8ϿH(Sp|io |6h޲s[3B˘v9ҽ'J>!7"~$Yd9#erו|5ςz-ƏgXjze^:]%Qppzg=cMFD%m@-rINF'?0RSaԩ_>/gN0jvțŞa25۲ ZU2 g*Fr~ -_ᯊ4 nɽ<2!WxDcz<)|@Hʿ^TxLzno4Q[\9рi*G5:RSS}o'Z%w/c*(z{ʧǺ L*;QE~"~dxE+^" X6;4ޫF޾6Wa0>J|-O_k4Z8 ?vgvU\䎕|/fX%֞5pIl!;nztKFQ7#'m_k5R!Pj>K^?0W|a|!jIhʰ GZQdZ+.jrE1yj?$]  z[ols!H8<ֿEqr嶭< {S^g>YɻKOR.XR焔b^^wFև_^|ChKg1he#]H קj>|iV6@{i;6ϵt?~|<: 7mpҵ.6V$ jiΥ:N 6~u5S:jKt^g_:%Wž /c_|χ~/_|@uڤ7X#rv)}nLC]FO3Eam&L#\fj38|L${m^Ǚ^ Mmɮz˹cWVڻ|]1~]]|ܶ`1cVnl`7،*0'R:%0JN%=cnp:t? jMWLվ.x_ƞ)v9ȰH;p~s7+hMOcu/|yh/z ͏3by@ݛq )MsZSVVW}7|+җþ-- VXYx# B03-qZP{Jyܹ壺g_ STy}ת{_w:==5 0@X?3ϴyX<냏W|mOߋM.jέ,6elz G u&ozß|Aյ+CmdvtM$ ă= 1)ƴe4$bv^8v)F {NjC( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>``Ikj $_E&s䂊(>l.7/hz u{iK[y^bzl5 |Wѯ|HXmr~*@dE;ztq^=ψ>#{}-5{&yddNAl3TNs%Öct^4pu6URkAB44/;~T[_璫q5gKH|ʟCY_/)3{_GKj#~AEeJI?x{m ʒqdwr]xϋ~wZe)SҼǓL:;}f!6=ohþ'I67Ze՝ORu+Bfg3f>j}Tn>ZV|S?U=S=hJ(?i2q 3&M!IbZ7 a#56zw6X]o(Ȍ0T|'jR^9aiql.mp?$ 5]ϑتt/1?HH?\w~+ϑ诮?HH/1?0?\w~+ϑ诮?HH/1?0?\w~+ϑ诮?HH/1?0?\w~+ϑmtEiE%QY(kw7Mn-<3%暁|p $E{PaW|^Ox:|[ioOX\3F*^JQEQEQEQ^EPԾ;k^ҟm9jYi ᥖ889b+c&~ejp}Q\թG2*į~(<_ߊ~`D&_Y]_|y}(V_5xτYC׉'獯|1n>FR#.T2?01}b q|I⿍>w~4ȵY"Mm9'c7 T4GߜZF:|^).H&zO^|V.kx6#F-=+NMA)\1\?h/?tKƾK8=A,G$WI'7^/]WF(fGE/*eڹ/c+/S}U$( ӂId -72{=ZYߵ֫ wzwOŚD/m42gX!a0bɯ0o'j/o, /)X <p>~Lme4Yw\H K;,;W|_/i"0f˖"`Xާ*A^m$㭖}Wgmcͦ]||ӵ? kW& sc1f\Ĩ?KE7_  j6׆"VM^o&L-2 dV ??#w_3wu+Osq,DRI5 ğb_>]3AJt~&^=JO&߄`48kkimL(Q:|Sޟ <-cr9.edOʿώ_/B^_'ZW ehkCn6[HpAOxx?GM39$z($ /?weLbdv$&I; EfVVwKGu_2//xz0>1xJEĊ.- &㌐ÑWkf~њ?hz/KD 6:*I'8ii?[n? j3uP($cƬ s߷~JWG8"FA"[nџʛ8^owhf}vu=.@hɨ/-|W*y Ɍ C("_־]nygğmܓjpi63g$I%L6 OCҷ>,|O{^?x\Ԍ<:O+x]*/ ’RH̠H~O_lk%=GH"k xO- V c"'Ş:!4}/M.N|v{X߰ ů%G.#O_Wbq] [w_éWl9[bQ9ύQ߇: 9^WSeȞT;;2}ҼFy_쿬Η0Mmc{cC)f 9;zW8OX<8Ww|yG]v^whg)6I%~:W|퇇Ajv+>}͔3Pw_zWq$ m#TPYu4M'|FCi"=wyMֲQT)(wu'į5o;zSOvY,H\9ixC7τ׌"x/Wȿ՗?Nd?$WzWHO" 1]-ɫYIJkzĄD}cw{RZvz_k/eflVrIah? | GKNh@ ڽwY|sGy/q I rx kRh>3Y)saFNDHxu/?i_ؗFi`VeiثTeUfd=J2yr9LTTJW;T-ݽ|Sci:|3\Wokit@'s#lde[ ?j_gA_TdyYn$ln J"'K+ia w76?<JwC50/+>=~u(3Q=?bN[o+3w>ҟm9jYi ᥖ889b+~__xoϭ濯֮zZ/>CxJO]7#_ZS+fbReW=)wK'Oo '.Bڃ,\{nOè ahjNFҶQR/ŅGN[&ύ3~'>6xʼnIO$.#y FWI_!i/h)\Wzk领DՎBV1zU$1/|(Bدfx .v>yGjrZ/%~ jRM^ _'I-'&eTѭ&a; WU\g]1JE K2_36;|hw`x`^ D,C`vzUe) ]ʀr~_>xRs]kӵh. ̪#8 7tۃҸpF~'khuh ]Ew~?? r)R2(YN;c3Ʒd_^uqeoDRFc$Y@"8^n[Oҥc~.>okq]RunDcxӲzZߢw9<~/ƺS_杯K$啘#VH ~>+𾏭۩H5+8o#VDkO)Xկ%{" gMS̒_5qJ3vQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@>/[|Wѵ-Namcblu'ܜ5緺 x]?Efy4HĦP JX{FSvWvqBNR쿯-|i{RͩmT{A55ZS7NF´Jn?ykZ:rPU}ֿU"駪IŠ+/|S#!]jӭ d.v (8ݭI+;*+e8<[&ɨ4d` (ծ")=Us*گQ\@Q^o*>#ƕcyP56ogr2y䑷kV+ླǰѵ?j PN6pxN_ZҾcSrmGFzu}E"u *FA0BJZ((J:PE%-Q@W'uÙ|7y6Eĉ M 8޴NUdvT(#JZ( ( ( (3Whl<@8 ˞ă^Eg(2't|c_#)鷷mX뗚iTyw@ Loď9ua4F øH#V!Nk[s>h_T?[^EC_iOk珴lPT 07[8'S_UQED}(-TUFٙwd}Ԯhk>d>O/iM6^N.nHPNv*n$쿵>>xKEGW f&` Pv  |/*[߿ ngv!??j_h[Ti] u/@w?٢Lya#W}WE+HFRK>f~ w߅Jߧ7u[{s͑33z?~C/%NEe+~.k{p_֭V>[fcm彟teTG}hxݵb)F9>1~ԺF^C֤O)H"F Q?ѫ*Tm^ww|O*x_è!n..d;|b/'0+?b>5I׾,uB9>r . 8د'_}YEi{-?ț{i)E*2:c>~|g'xᧆm|{=v_7<,RbC0eu ˸V\g5 uY_H3A=W xokm_̮oyi}!/fΉmgң$kqIRAq cf| c;nL-5H$qݷd}E\9O"1Qa*|:oǯ_4|Co~A?t}@ OYI?(W$ֿt/ 5.%޲Y܎FFu,OʤҔR{EGKOkv޷>INt^BFeC֭ #—Pq z[[>% cR.!$õ$@\dhKI[v nz xǟXִxrgum,7FA`C6m$ /6š'd<;k2v`\dkaI)'{*~|ko7]PTngRʦnTN߻].߹R_qKƟ4MF)ڠ@l}suQ|f'ùĚtZmԭ应I6Fʣ+d 5i_(gODm;FodNiqpW*9eXQE- Rܓۿ`4@O;_-䱍SRcY`2V'gZ?  r|..v۝},^:ഒ zc޽:6&;/쓡|?5?VsxPj4_Ř!r7' cw8#ӯcKƾ> |@4_GTxl@k`yjA+*2&M%hCq[6Oh/:};?0QoFfCL+)eex xGNQgo([գb1AS?fV?? Z uzh @Q죹5/|o/@յgJ5Ӷ߼{ә9ڷj)EEwg'¿b# /_Wӷ?"jq#*sz½ |%0Pm-n!ܭDU*H8 Eu4TRK4b85Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@u- M֚ݵ >̅`Y M̻r=+{N_L7at~igU;G;A={OCyKwIm:Տ!y^ g5| >:~޽o'y.j{6z:Oٯ6٪^LQg>S8PW>SE6v8U[OլuxK{fd Mumf8?Q֝z=ՅN8҃LG'mi_ľ3zYb=Lz_4׎HYp I89xǃ̶5ug%T(#q[˃sz|Jֿwmtx ү>Dtm7C>;5mIWT2p;@kڬ~#iן c4h8*nd Eb"G}[++i-?\jHu(p|M˫nK~[^5GCGc3Wu^&xW|_JiڤX\`6NFXrp͐^>:wJۤW8Tek~ݼUf?W־*xռ8ͷGңZ(' co'$qZ\?ߏ<%<1o{~.BvTy?vnU_MF-VݣIr?ֶgbb6[Kwxτ>W^Fo5)m_kvg,mSO k7چ46r]<@˶BO 19}k/xSqm]ص4|J$P@k|y{jnP-6 $p;U71nէ 5: 3[)T}ky.T]h/>ƺFi&VHY>m=ă=v$gVe 6ԵjVuq}5gPSr>yWxr_Ά֑z'bJ}L}V[(?q"={sZb:RY&79gY^>-'c?gkqi*.ۛ*Õ ȇ +js[wIJ_̗`ڴb֧rW¥%K[]z?l?ZƓkyĺ͛mYK0Eϡ5oo~4}SL+]4:3uAk>%[{SHG)Vr3gABN,6cR~UgE{sGu$:^(֕[}?Q\O:R5ލjKV{ԂI}_qGۏ#EHpebX*9@zN##enHe8 m]*ƪ:\_#3MjY1>]_{Th>R] ^'RYGAuniӎ Z{5쎏?K|BS~K-&+&LN~cy!߈ ~%o[b&B2WqzƟ05}ONq8cσ%r$гlc`\EqUxIWr0#T:*:X8Nujpع[_gN|3W)g3(IԉWwd˷3Oϋ$" ąd+>ȃ[襯~a=a*W;$:Ni}Ujߛ!v}I$vQJTmE?Z?KMAt'`# v=s5>4_\^\[ڄi̲~\)=y{{[x5G/޹NrUeAzswQ]\nT]Z/g.gڼ)c|߳/kFEugin&b˧܁GMM\GhwCWAڳZ{OrBRA9I>#í&v:}[P߿DI]wwy}b>6K-?$w X˛έ}ʯߓnoVukg_<.}}/=GėzG#X0ѼR?66 Nۏ=ϭ|ω~ |mKJ.&eHn '-ls#9_ |>*x^p,_.zU@%J\Wij嵣m?GO& p?9)za)Ƥ{_gmt:qUTt%ߙZ׶sȣXcHaTW~_/>-wgw/P{⻿xOE]Lԅ"_7]ݚ3÷Zg:eW*,F?A yZpxSd}jSV|- ^|/xbŒzω Yu)oG+HNqՁQ8Ym/ޣ6e OQ$tzi~.^B֏j3BF9}+Hs?O9ѧK 􅅼{A0I`20`csF\O7- k]/MZ-eB^KKCxsA?-z[:;u prA"wb Dsgw: HPY 9W+?jEZJXbwO[t3%GUoSgunm H \+՟N (Š(  'n?? ( ( ( ( ( (9 Ӭ Ӡ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((C |)GCWطųv7uv%(W*7vz꧊R%:.ɴsTЫ.j~i3? |1Λms'*y˹s#1QEa:'9՛B)ǒ ˲<!k  mE\[$-&?OV?a}[sub*%Iv!x~Eһ+u(*mYД5w!|"(mĚRo&u0zA#U /tFM!0.i&RI`dֻ*V"a/kSJS Wvڽ= >B"Eo|¾z}u6pM<a@yIB0[cڧ¿ k0Mƚ#hnCpH8]e~ڧ33>ʟ/'*]=Ns?<=úr\Lg+c,ǧG|5爼QN53[ا'A`rxlHkmWs>ncO^Ӿ޺oCw#a%ʳE2MA#{V'f߇"ԴsI9*v8M8ڏk B\)C/"tp <GqOu?ᆡ=xt6h'|^Ε" /EM@_r}IO&(bRmݳz4$s??[Z}O io:I<2N9cğ=kEյ}?z/c7"y/lXWҺJ+?mSs>nko駡~ʟ#ʹ_Ki=}B|<;{(xތaA9Em~ŦZ6h2m"wşF9''(:v1\A@֒ dYF|ۈOwSX֛wVnއxOhuVN@Yo`My|7e<;ae$pyK1裌訬}5׹hwo/NEVfEPEPg? qЅtux@WG@Q@Q@Q@Q@Q@Q@ oЍig oЍiEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPg? qЅtux@WG@Q@Q@Q@Q@Q@Q@ oЍig oЍiEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPg? qЅtux@WG@Q@Q@Q@Q@Q@Q@ oЍi_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4="zWG?ҿ"?T_hOJ_@P'ϯD=+}#OEA>ƏDȏ4OğB:OJ_ZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE+|W_ھWqG_­fT<'" C5@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽg%Sh35EdfT?u_ k@ٺU?ƏW?*ZPGnAO7UJֽ˪z|_ھo3_ƺ*g_ VQEQEQEQEQEQEdxOE_k^<'" C5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@K|-NmX"$HN5f {u< '_m{RJm<;dLVY6 JX2{+Yugh`ZUw}=E~f\|g?[ghCק?{#X0/?Lk9' lrO?_Gg q$m?I?3Gh`vܿ23>3-4\|g?[ghWqNTWo5f}uS>"ԥX-hcXLRdUJ .M_ Zj gTQE|,~׬ȿukEPEPEPEPEPEPG_f#/3ZQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE'X> hUf`I%.P F`Ikj/l>{ +O +~~>.gA6[w6i+Sy8Ue:D,\j~k8Z̭j?2JOιKUȪ>WǛErQ@Wͭ!sʮ:AXz{f\wGQ_,~׬ȿukEPEPEPEPEPEPG_f#/3ZQE`xWß Y]Ͱe݉¢ITbb؛QMBvOJ]#.kVaZ+Ez6َIsu~8X|`LZuAiܬ u[buFBgʘE(JrT[=s;RQeѫ}.Zo|;RnIskmpֲ4dHX0auU7|2 ԦK5tAu hq.<7vBL(F#NH8qrvUuu66oVHcŚŏMnGUV@Yd|1 }oS 5;'ӪOCJ+f^n0+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>``Ikj $_E&s䂊(>l/+xx#òk!iƙ-,0|g״x굓Ro 49A{#naGб&j;o~o|?.ms~צ +9:ҰMeQsjqGoAgrGvL+18ՔXq}_T( ْ1,~ᡟ6XS,WD[ ^gszW^"=nHխ$l1Ma  +T?cJ='VMGz-;& yȼ8ܽ W_ ix}Mi$Ⱥ<̆6g 3=)2 xhciN!VSz( z{ʧǺ L*;QE~"~dxE+^|w6q G͝g]8´qjf4a:QJQ~z_m7%oFU?K\gč6w5ipv{N=k^KWia7LsbW_Z~ ޛu[Xd Y@Vapk:4Qҍ*M*T{tjV~mYAEWzEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPP"/5|-_tB0C5~6~qQE͟J~oIuq5!ٝ8ècd|nLRv6xz5>?2#c 9X>"kE&϶^jHg8d$kŎ,dRwi0 SoZfj>$.jz[W3FOԏUC!>!B#m&U~K۲Q!Oʞcំ.?٧54%.[݌vO=B@2A}""Bd(#+<ykVxum%xc1өkLiIlՑTj\x\uk͟ko-vb́d*}|oʹ>JV*5rCD~QEI?zg_ VQEQEQEQEQEQEdxOE_k^<'" C5@s_onKn8 ^G#ȮJQ $ٟ=;i/v]6qo'R 08W w$~Xmo.&77֞R2p ]qj'J<*RRW|]o@+ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>gwFX)k4L3_ξV p񇄴gPuawDb3 fb|Q-(tۍ81$T^G }\.eCEѬ|nsUU/Q_C|M&A M#k`>s+>?0'_n?`O=/+>?0'_n?`O=/+>?0'_n?`O=/+>E%͝︹b}Yȯ?>&wq_b?~#/uX^̈́񕶅n]pN1ψΰGE RRs(.?M2֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?P_'?>֧]A~(˳H?e}N?qjeϤ?PM>[oy^f>o38=W63vFnP>a]UQEQEQEQEQEQEs- B5Y- B5@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@$-B9O!]QEQEQEQEQEQEs- B5Y- B5@Q@Q@_ u/ן6R60y5>NeC|Ѫ r1gvy1UEfm<;EF8f<0Hl&[Dup׆x)]?MD-`ݷ%<3Ɗ(+_O_@6Cj[{Ao#4-ei}Ѿɿ\j((((+'jWY@9ճ"pa@lu#JO6457}#PSO|SbѴ~Nan?{zE\+)(Sm?5Zomw2,V4R@T6IdjQX~z_4IIԡI$f6d9t^}Rj,t?MFlZ&2Ù7#/:5't̏]) ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((('n?? ((((((m_:m_:+7ÿxgË }CǾ!%KXي! N r*$>?*2f5HADiKtS'Y 5mms$:Er' Ӹ ^*?Wvu),v 'N¯_Jm&uWDdunH8a ڬg'WMJird_Oz>4|f𶩩[eW쨞I*2^_7iWwRң~ "KV B>O+zG'KAF_, U}`'?"J[)/?ש ׬~ڏcod2#M̃a^n|aG> V:$$hb6#k?.4ĿWE6p;kfI)5@{H'?hi zgSTo,l v#heGL g5m v>'?4 yof C"w#?z> f?GUf,'C5 l}H## GQzNYκ\f/ "ixUrAFU-5ӵayRm{>,^͏m%P79SZOSNg?owMm7G؉2^~k[A/u]X+%UV#(ryǎ/|ESJ~{-ׯQڔKvQwO x v;Hv,@`aKdj_xuNO'N-dp2DhZbko@Hsdvu[&6)-h9m a$;ڥx(?>KWT7[⺹U,E:ke(9'R'~'ǭ7wks[ mD ,OR+ü/֟'3JxWǶq,M|;Ӵ + 9mNRv=4%hZ+_CemD|D_6EKD}8cfzW,~$o7 :{^^iw4wH+$) n ͺ1D\TmgBBͭ'٣gEd$#5f|P>+~Ēx.ol78#u/K^B)Ԋ_~ӟΒ2tM.$U,H  ~^9{k\ql5=BEzo;,ҥA_bc´o0[&+VjO17=kQT8-FN5'OįڻGjO|=\g l6Xey$P:׫xw#ubNGm:(ڲA+2Xc wCx߇lxIP;[ld }>8/MoK5k{ʿdo*;>+%WZ77$[Jh>UpOxoM|v<7{ Kk{TFO*FMVCE%d+mm?.Iڰ!Qui7|nfAr33k-U} :+Enz&I5|^:jm]+M>_TNJV?> ~~+|o]7N}p|MF%HYW Y@V;9V,e|H95>+о%xfF>;i!F`7hqN _&~.YMo̗%6UW>" wz t{s?u*yS{^ߥLύ1xeվ%xN_֡k*xrQt 8wJ|=ΓV/ |_Z&(-Tef,Jz,M [I-dTeaGc*+zePN5ƅ9UW]NTZ((((4o cK3 @L{]Hr,h@9C *T5fR*PwL(7x|}.(m?66s\KZi- oK92 1xiUٿzTF/ ~zEW!Q\?ſzOG1ysq'gaoOAs# Vʬ inw׵[}̑U>aʏ|W_o GI ᑇb#q]5uhÞI5O^楋Z\m=M]wWJAEWQEQEQEQEQEQETisN 6F=FIcƚ? J / W\SޯN.ih_fKT[4oEQ@TisN 6F=FIOE`xƚ? J / W\S޷ S՚"H0* ( ($($@ Ex4ߴf {PӾx&_Ϫ\]-a `l'Ҷ~~^2(TQYDΠdlqp@85K\vWjw AE=ݯgkEyύ oI'uOm[i+ov=C #' 'kD)Z^%BǦsiS׭8&w!У' ѴZV_3誗ڵKma~kK X1ŏ4VBu;op!4(wlU:R+\)$I5FxƚcxO˛TKhvG8GS~Eݶ^Uj$۫~j{ 9uG:މ?[tۇ$N>tl Ak*kQB\:5^<ߗ@ɯjZMχO-6@ڧqfCn eVQ7(߷kތJ_~:hW ^QkxZ}:&܊ep 88 od4vDR\0t >-x?~xKEF-fCcTw'z?_>_ f$O?n&R-Æ*$2'jz9M[?%IEy<>'|3H|rjNWR қXݔ Er-e+ܛ⍯xsTHsۼp2BhaxΊ7VZܷiJi#Z)ִx+5n.pyʩZ(|z.o+Zv\E0,Q8qWRT\ߖ&/WXi+lMQ ޯ8 :3a*dOwGTO#ǩ_[ZJNSЈ=f~8⏎>1̾.qpH@aIf`Wx{5߈x Zu! rh)XeUuxc pqӕ5{u%-y5k~FKsiޏyuAJlO8 U'xgxV5{m ϖ̤++HƢqpn ;>#~z5Ï|-'4K$u- ٧V۵ԶX r/zּ㫿֕Cx,i-!Qs~''QO$r1J cw?'ű8|KO5m#m!-;C\^:Wt/?Ǣ7{+_t|=wįZNj|i`zwnCr$\ $ap+ώ8|u]P:\ 97qeAOB]yZJ|U߃|Srݤ{ϫXU(p 8$ɲDz'q꺄2\M/,<)}bԴn8x)VIJ|IV8ѤeUU$8zMk ?;Ohu&B7p gֱZ܊Ti?ޗs;7xx|A/ AzzS«9  W[~|+l6m66-Ec"QN5QT}6oدoᏉ9tI`\+E 6Y\Ox"'<;QjpjCїQ|Q_dQ[9sIOӿfh{5VOuAAUtWamXXf؀d :` ~ lthӵj.0J8}Ei7_s*mƿPOƞ$A/;kXWvmKS>UT݇'}ȧP((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((5XTs9XXBvߊGJ7L+^ǚ\1,}In7J垥|:/H?o*a–:CKKUv|ygcrt_OeEc_U:w֧NQV}[wKѫUjF\򓿺ZIi|>%g qAYk@λeLepA^1J-׈,fk(AC3&K81QZͶ/"MǗs"U\!jd_h[kK%QB308L9^?kA4u잝mcJm%NO[_ѾZb'n"o=C]Ƀkl5@Iq\}?+;\xÞ!-qkbI8#wUY>_Qi꛰Eo%~xkD[4}5^[&wh #L&Io@+0n?/=G5UŽWYDk{iyS]Cza@OH8`Y5ou6nKcfAiioױK⟀|__3xA=Rm5{-j23)r׌|hʹVk 4c>rO_/~/3 $}N1<`qS|`/𜰂ko&˳gq^څ,U:2E橆R1\r3gΣ|x^ķu_^·caQ?)98٧Ǟ*ğ0xa-E\FAn>ixCԭCi5226r{cbb֭Oޥb.Hd^Yp߈=C4J_5d&wѻ] |9xV?hdMO*~c @M"~xjwV^8MՓ'ێX,@5􎗪Z5o2=,0?)BϦ+5?C:~~asHvӭ*kJq_kE浽-8eN4|OWn}mz_? 4M^i|ׄ|V'ݸoq_ QF]J=RxGCuJ|gz^/W*xuɲ:v(ˁ׵~;o% B:oK }AJE{/vFJΖOރ|&z|mǂ]ifC4¡7$5­Zg3Oyn8,1Q L_KAu;sRWhTc?ٺM#Ŗ8ּU=_~$d2 8_}S+Pt2_I$jmepIp3mB0سu{>m ā~4k"Ӧ[Nէo}[6p8+GSRpRIsIji$K{8j8:9n:_ke_ n3⯊n6;ˢlR̢"Hq´%aZ̚kl9")~Ͽ|\/..ഐAq{H-R#AlqZ?ĻTsSS 픹fRN2'U(뙻Q?c-GĺRCCgdC0ׂ~!|jC_jz&jr6/mUc?&[+GUz5qMūhl=4aiҕZ񦽯xc¿ ŮKa%x+eWdXO0_gLhO4>׼J>8>~^ak~ȣ)a{6RB-UQ+/M{/yKz<4 {=wI.x$:F56P0rOO90#Zo=| <&5=_X k&HiP wYKJ)AmluSj5g^n3[rګyuq>'j?xƬjqǨlA 0tb8U][m]Z͵k Y]^L*wE'9W_ُ☭hV5z۳znlzdq>>ɢ7'}b ۓʆU>X F*ΝV믖 -eR+c4jɧZ[O7]'g3;-kÚ\ӗNEc!.s ]QeJն,] a|a28$32OZ 2 1#ט~źޣ|0[+ FKkf$mqv׳MYǚ{YץfuirKloeX"y$m1S_3xoZo xB,,9|s= c7tMB3'%>^ ƿ umwݸtܫGXMg0E{[]yVEvNW{-Ums_~,xgB|M}xO.eʹەG:ObIƞ0h?~/-<-%v0U a`?j7]{ٟ3RKFq"jğvS얍mSPսSZt/'[Y2HLC؂ ^7W޵۴@dnn;Y~!x7_%]DX:"74l+iݚO4g|G/M\=˴$#}' TZI⏂?<)O[>"f=fc48bN0NF2 w>/H#Gǿ8_'^~|ThYEncʔ90j);ӝso=_;_zg_k WC$~|#' X7A$כVo`xAdnM3#0^rGW~%_hkO]<9mcӥ;w 8r|2i-ݡݸ8l$\'pH{7B\vQN鿴F޺ VVj7R[=_WO|[F u-[@gXGk,2xTg+,g ۞:5? | 'IԴ;O.HQs?mׄ/]a[%#l{o!:Tߑ;K4wi({:\泻=mXu/K5y4KʻoX &0?0;7xWnYy\Kp.'i |Lf -~>סgu nagg܌s#?f~o.uzSP3ٴ*Gԃ^|u&u54w}<)L}+T5ʣ;~5^OUm/xF^g]WIXWrZo/qeDb=^t5O+1tTlfr FUXh1lFc ހ2kƍPKފoM^0RZeeݍ2y]k_ u-utb}iUsҽ*I!5 gCzp00G+JK&R-egP~ےd$n3'ᦹKmq3rO?tLJ_ ktQwj_,퐭XG`X\?/ _ƶ|.SE)vK@#̺ {T@#&8*ʪW~T{m1?c*W:6M゚;_<{7w7O}wH;wR팻,0d*zdzײKƟ}#YM g"j#Y Ň9#pϽq_,sHlԮ@hzר|9ᇅfT%-7I#QMy*Jx(VW7>Z/cЅ8ƺ1MKu=:N_jj,w7y:O'񭛋xUQ8#R4w1$Ȳ*Az)ą+Ŝ-Sx'AwGcNѫbX42~6"G YY4Wq1̟ЌϬkZ9mCþGsjZKg99ZoCH.mhQ c=ُVcܞMzRY[kw˦丬]Vӽ%__.Gt1!,򰃏OѯBu-d } ѰpGם/lr; b\)]Kko "b2y }q+ZRX[bW>Y|G<3gC;'b<s,plm3ù"\#)º]aF6*pX¼w?C0c5ޣ_tzѶU%r~6nodKa:CسP2->*H]?Ja7FMxk?,47xz+6t$g zpt*ѩtҽNyߊ*ھJV{⧈,kOPXFyB_8=+<Z~ׅ`2[v)5-V2Ӟs+ X 0I*=GЄ.k1JN"sW^W2x>E,n7"b+¼'[W?o`x j&dފ8EZ<S)HHʈ3RMWӵK=bp^m"u*=[xK?tlxdAFF,y<àE7$K\a$K(σI|`_9e?y\9I[QuoRVF[x,|UsAU&Z?kp_DZ,Nw^k#·_.$Qk, l+`} sU֙o;K*Zqx)`;]1NFJw{ҩmVdm'fGEuoȳC"IYH U?_W}U ~_|@ + jIl9 JUr5v:SP. ǻ8?\pi-Yg*TM/#-Τ=ޣ4ҟ ''5CƇ㿅>"价ռue;O7F~:.{.2Ol:c+©/~/|.}}NLQCk_'xkD=v>c (T((3ğB:"f/V#&B2A+?Kᕿo{9&qϺzldWoEtO^w^O;uox/i?e_.ҵ}cKkMޛҥ̓$ecwzmCygg=yOE"dqjJOѲP>m-'\$n5>LO}:&KtU~&Jxv- &dBRv+/f?׳xJffV<4p+д]OA6omD_TRr[hMޖG8QQw4赽;xĖZ_P|c81x}|OH5 W>"U\>N8=NHPՌ({57k[ )|'.i6:v=wKvctRrW zc]NIN!pgk_ M?~(д+fD1f0!A^h |+oiQ%j2ZW嘞]b{L +kE*o+QѥnHɵoEH7-7W7z*A =QH~)i=uSi r8.taWkEBUIKdBn;ߪ|QI|[lso-{kX!nX 21U8 i3xJnީ-jDB NI9s=qUy#-5w<=*n5_qLgWh̰y4wh\1Aoz|iZEXn2 7v:`Z*c^"Y'u*4')F|߲&qn~5u折 ˨)f1¾Ҽ-X֫8S'I$I|Joqqz A1HpKà֊XҟrmoC8GKǃ}MKe,̫ ,<{O_Lld[=>'`  ٢wo{y8Kkk|:4=CKiKi"u*H$?ßwJդd;ܹUQՏj騡T_8Jmj_~iSgq{.1bL #&|(j\[G^ }[Y z8gz8{77k[ȏϽ\|'.>*[xoFohlr0]ڛKov{q.w/_9RN:%wU0SNjU}*[kZ]ޟ{hFF0TW/ԴPK^$hJ`IP X߲]Gzu!]+N|Nzcrq޽Š'ϟW?*=ocu]iW:x Ɖt",NebX|S5|l~PNlw Ͽ?/wYH`C<'VeVi_g"(ҊMu\o`x"+}%@H55[|f%ż-Z=*ȭCVy= C xf3䝣>df}++\F5J6ݟ5ݖZ^Xq*W\Wz]v x#fc$"{ !Q݈g^&O+xT$xtW)rs՞#qP[gxSNʴ?b.B$\C[~4? O-Q⫹$7oD2?J+Y.WR8ccOCZ}Z[7 clp;w@׬}w[|asbۭc  ǵ{5<]zPpK۷ڦisԂo߿> x'g//&tsq"m`@ Tsy߱w."-xO0WS\d1cs_oMS&ε`wcfq+?eƅkbQhLRrNddq2)8?;)mZecs>2燼Y{s}m/󂄞}ꊏۙw?"IS*>o3OiBɝ+ }s(:u5)xN;ǻ_xnmi8ී8}EiKJs3^\!vq]77R5 ;7}ơ:8.tᆗA/.m<|n`UQj(5%)|[4)Ǘ? }?c eOVIDyCiGY53S/fm>U+[YDCW]?8WQsr+w?O~*Zj"O-@jl+H yro-uճ y¿UOn3+:xE(rBm/ӷҦV\oT"P@` Z(#ΚJ#u_ k.ٯK%2xgkC|1.KiovmVf*qp=9&g..ޞG'({Okȹ (ΰ((3ğB:QQQgnome-screenshotC     C    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?vȟj?(o֬({vȟj?(o֬({vȟj?(o֬({vȟj?(o֬({vȟj?(o֬3@ӷDQ G;O`Q@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQ G;O`@ӷDQX4PEPEPEPEh&u1Ocȓ =Ӄ¾Ԟÿ$gR(ΣGFWV4(ER$an_ށMY]ڼA]Ƀ}J|6.2Ծ#kedUxkHWܞÿ$gR(ԨӇՍ 朴I8t"vpSf F9 O$X};Fs-υghP)ǣ`|\'ixRWӮlx^^VÂC|`>9^{[ MMa&PHuFsl'徵!,3^w^c5ifQJ춾3L˂>Yۗ3L˅9wn^W{V~afO:AlgxfEKTKwyw}B<3mO妯]j?PGB|YxM.$CE9 ++. Oڏb1۟ߟ~/bCN^Gfu^W%ǻU_/xYZDj0ȰQ]3( #JGš]ρ,@kw\6 z`㩯*ƿ~:FW+S3/ `G~IrxNt1~A;F`rn-_aSKAigwM\jl,:]Io'mlV|^:|/woPbx9qѽpx9Q')kkkQ˸.ZB[>]W|Nwxðb.c]G~zKcic{J5lrlNIx|Bӣ%~dZ`4+c[ۯb%Z%bBʸ <'2JgM[.bOP|3TdcIV$U/㟎<1jt:NiklN,FIJ|r#BSQ1hx_Yv.&߳meGYuKRٶ] /%dm@,R`1)PcxO]Ǣs-s4sp*3q@['Ʃd_xKQףIs a-oV5<-k @hv-w?FYl KH,O37ol'm̈#^UvG%=2A/)G xWxKsp"ʙ+63A@2j=+;Tu g1iwE,L:#T]=+w>!ڼ{ݝӃ_S/~?tUSm^2&:f |8|{g/Zot۩5?vԼb7}eS p>&Ϋ_zfa3Asgp^'Aס̯ӯNF|'>?|4 bj n=咎]X0Uj?Ϳ WUljrjpIaOd(cO?/Wo|B uUb H]ň V|xėiŋwVhv3zP4&e[{ڱIg*LUƿ'-FX.$f,ij3$I QR[Kyq<8Igbp&}B+kXdG (Yݏ9$ o |cfV?u hdRh,[O"7_|$C %!+ U>Aa>LHVi<9s/M|kK( <>=I||:FOmս㟢C#9=.E'-'b[]D WuHeᇛk}cH6!i> :|HY'ky Ωu#{ GE ~T?;~_ 4?'m[,x̰K0bX"#񯙫(nSksY]33ڼ 'Ľ~kYF=&XRv2@0F8P1 5ׂ-y{Xd(ls->H.o"h.eh&*}WDO_xW=(?ֿg/k6ڭIimnfX%1,p@l~7[CO1f|J׆wcݎ3^W 2\MQF#HS@ E~5x.xrMaI/~^.)MY Hb6MrTW]/+^Mo !kw._Nt d(v'Ҿ~i ~jɦZ_K!sm&ćB u^hnRNlh.-.1 pFU :+>~?>0Z%焼p4POGOO Z=՜4HKʄH_K~όLk~O+H+G]Wp@|qm>`%#Y'x>1S%<5xvLݣY@QIzo|+͝SO+o_x״XϸX*LWvu!v|PwTYQHnm8 T:7}k{ƿ k;Gg %26l&+7Fz(a?c>'cԴr.kS u= I'?4h ֚&тĢ_~ο(X k oaanޠJS+q0Xo˨D7KxmHbQH0/>6nx?\4kGx5 ?Nx"dP'A є?:bK=41]&6bs@M?g߉? l|v%վϸ2'95Q]Gxmܖƭ9ǘ49'rR+c-]1F,fjd?GcL=vݻ\n*x}լ72%LRHR =/$ǿD $D⣮kgZwO2}Hdo|m\Z<*|1S?+Me?L$PQEh>|Uhe汩Nq4PIgQ^ֿg&PcXWxσit{I58qY6ɞGʀ2C;;EhյM1 {;BIa8uP%p ??x_^irGr|7;ƯI}y~tQSXiwIkwo#C4!WԐ A@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W~?Oj-z ťh6,^)0HDQ̒р2W# E}~߱›{frkj3/fa3ZOhZMüvZUU$d1?nُ|9kRu+mKNk_U'uq+&DA$xW'➩[QD-=S2-! 8<QEQ_m1~ ''yoOZx;Y-v"fy:?*((((((((߉V:oįx_rE3OYGL`f7wjs -m7[X@S,py:" /lmOM5s 6Z p÷~|NռWukm';ۋh~E[ xD妝]`oԡ\y2q˨<QEQEQEQEQEQEQEQEQEQEQEQENzewVg!W|x#7:,:f rܼ'8uPq$r/Ua_Y'gMk[Exa=}O^ 8GJMYi6ݽ;Oqk~,n,Wʽ-կW<7oz Mx7u0Hwi Onk4}fڥIejHgᑇ }6/(uxZL,wt߯?{xUH#{߄^xb Oz>}RRnq$3p 5Eው\Ȁ } ۦGU?5gTҪ2|_ןٺihwܤ5ˏ>?+0TvkCl'MM_iK_[ͣR-1_oGO?ђW~t`?%|b|P^;_?m_c:[{D|hN=ۚ࢟2h˨FwG$ZVnB2G(?_s4x 4\ g |@^ n &_9HK2@ ھg-z/h/B ֩B8,R$r2 Mk?4zXt[i&H2ƾ;t7B/|eBOe(v~i1xuŬzޝiv`g%0N ~pPٿN~x W`x[ޟvP<_;[?fx__cFMh4qy+lq5LO.o,QoM8F#. |3v#v>o֥c /o\Hj"?uՇ]_㦷D|QMmgjq/$ݙzZ?S8T%oO4@Չ k;2| ogv4H$=Aʰ&.?(xM} _.\$S^Md 8m,?h+j]NL'mݟso|[|RG5}{?m?S7ş*2z=ȏ6)OjGrQE~PzMU$~:xڅ7֛|tXQx«g=,(8 0x2F@?,ح,:S|)~?ĺL~ ռ3s$^e'PGk#{E~6 rrc* ц;\v+ؑn?C6|@5HioEٱoizʷѿiO?Meki02H\O451_p$OK~}˰|;Z =F;Y]\̗.1ϴF }sXI/iv HF|d*q98Eg}{tY_S!x-Ԁ_h#s*dG>:~q>>5#W;,5 v<~_/|D`6q[o2ΠU rQo:?2ak1Y»cwy#v]380@+/;6RNC.} W^?xGŤҫ%]:bD7^#T𯞾2~%]o iEs=FJ3U ;w6w1%>O%I?ܺ}EA$,ŝK1'ր?VaO'Tn4^M=!2wd$ a@n'c|_i/xZgۢ:|- O]z55n%rFHI`I1~35ZQElq#~ܯw0Z}O~hztwf5 ċvi nS ީ\4.u <(:z?>ߴ?FI1yksae!/Q$m]1oC+ SKeB| _x-.mxcQ%;d$'Cck$Vb,`+_ړA췬Z.,:LJdԬr01ȇ&91ܐFpmx1@c~|/^dk5W7z\9Y0ܞ_Ohs~Z:s_|tX@FZŽ7g5Uj䳴ŏrXI9Oūm@S;OCxd~NcZB9C"U/_:8dRtk{ZpG; 4)ur"CY<|oi[w}x M9+, Ow,8_њ>P KMlߏO]&{>HdbG' -6ڄHLI8ܠj#1>Bjv扃~# ~/xcz68u8$IE.2+KPӤY좜AJgoG`m} M{Z&$wU Gb@IQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEq[Pz~sQCl rIX~c_Bݼy <6jҘŠ X Ԯ wgjgMM**TA";=sN 7V\G% H9FG^'4sDUM|k8xM-IuMaXocRJXFi_¿-|?^6XՄu7s! *({U)&>7<5iuKKɮR7v6n|3Db }0fTcھ?ht¿)şJ ?x⯂;k0EI&c,(SE/ .?5~fxgH{ikgiw7ۭ<%eY|pae? rtX5 g $eHϱ?|vE]ҭ;=VM$Af[dOݑ3k߅UF~]Vt8+xTm˒}ֻ#FK_Ƨ_]5ĒԻ1,OM}G !~|w'eqېuMGf `C#b v|!_߱S} 洅5w![.&B~p]~ |A֕:nVqsЌ6WW+KQO'~j)d"u?{kƚO˟5yO%yd2ĊYnH#[Ƹ?'H!w?{l|Q?_? 8#ĺiux?g?Z.&њ8.2@p@\۞3'ß?c~㞗yxVM3pL$@p.dg%TPo)ͥ{ 6P\_H~Z_M[|M^Ae3ihqgP߹* ?eګİ \ KtZV͌' 8 ~6|Ծ|bռݾrUʩTp9_ON*_oi::M7X:g*;ן<gK{ɯm#akW<8p d^}گo?gh2|;?#k[/WyvgIBq2]~[OO M+>%hMgfDiaiu XH 9+5ė_Q<^Y5Kvn_v|~? IL7b<9<3$Jm3ᯇ71􈡤U|ʹAGoG~7ngɭ<0k%N+98~[<K[Bu='h˛'~7)z w?he=+=|UB]c׊mnnFF Fp>| /4k_dKЭfhMF%#gfb@jோ?d/k>r,Tk*UY+#'R'gs㯅/bXjJYPXVWVMJzW zZY~ɨ75]HpHxS#P8eu9>6xKcG_މ+hsusEq(e!+Cm` _e+Ydicu%ccTwbz| =cM$H #@9UE|GM֩]8iTE>U* mghdhfVV :hѿᙾ0(nfoJ2DZv1 98{jڣ_|ExV.\v%8߀ P>φfRGi4F =kOf ׍(>QO%@Q@Q@#R@柦Woikyn3?v#c.i4օr%8;5>Mf6K[\Z<_nG&x>iYگt܌$d8[|IϨf:kIKy}a_ hu?MZhgvay#q3,khٞ=ZM%5w۠U@(uQ|{sk?~/Ļ59='Y ~Cb#,.7ym.ӡ{r]#MY[[IoDOKyњ)cl)!= }9ёx xd_.\m\}cIͣ^^+51/>{#%UX=b;%rh#B__֟E~?{xNKx^ܾĽ݌c&uAtwZ:\[pVx3FA⾿Riƃ>FOy|BK(9 _/ㆅ;&i ,92Y6)<@88U'b޾O(zCW^>׼]mok7r^\Ef'\??ׄ-:SZ^|?sBIדQ@POvF4|)zᦳ[}CImw=Ie x5Aηx3\/pZXȪv`1w5 hW^)ЭTGogDcʌ1` mS ͓O_HvA }Ss{e.tGm5ĆIzt$ ~k_w-;zHh-X+gjoB$e|bo^$]kƺڵjRCbpN2p2IDm?~tk³ɨMjZķRaNrpzI4EL~Ӝج:[kfF|ìdV$ωu?Mtk4[NK[N9~#ӼUS$nMCWԮSF9'@&t)okmcC .nJHS9h$Sgww>5V؄tgva$`#moP+< Ŀ x,q/Ҹm~w?Gÿ4Iu+vb6<bk\&jo i|=ïE\A-~QKxZhmX=2d ?Z'Le]]@̻IfRGc8ӏ*X)?ǎ?h:?Gx~Kἆm.xg"Pu#lNr=޿7oX _E{'PO~u?ÿ_ˋRKikF;k!݌P]$=+Ͼ |h??Zxw1@ pḉ)#*p@ 'Q<39|+>ZOnAQy 'ݏC@{?m?Sſfzď]Z0ʹܱMt"4UAEXl˺VWKuuiv-畕J\a\ױܾ0з?w񇀼MROOO VWP\W*=2Ҿ|`oyuGx񝇉QcX_G cY$$8ɡ?ٿ?xCK-1dyc ڲvc95|yK4 COt)thF٘ۑ4x6r_k:L_FGZ@zmcϡ |A24&QQkXA J-aS?ݯbIV o◆/iZ&+hK^,4 #f .~ŷ}֗w%wQ<7uʞG~u^ߋO_5PꚼyFHT f aGRk=/Ś>!xrVC^ysFЈÄfW$oӟ/~4%<9xRj\ rI"9de)b6BIEw)$n*ÐA_[|9|eN G`k.vdN'ր>gcRm,']1 MܟMs__MُcOoP,zw`q[<݁`8ϔ]_xZðώin$\O_>Ԥҵ&&9VR0xe#* -bg/n2}L{ǨOٿP`,7i~RCsbb,^{/+Uky>mcvRVeϨ!ǽ|_|CƗgE`\ Y8WT>$2^Ic>YFWBDC c?Î($~,fT?3t ,I'L~~ #Xӯ4ۏG%ytY#-mujĴEd.\~W+ןCm_( |P+O  V }cJ Q 0J뿉Zqc:[k pǟ,E\xG?mmJut6m͆lRLFFPJdl淾0N*|Nօ[ Ŵx#?mۏ;uǗ7bP|B'񎮲[1{]*?&݈*%w침?j/Wn_ش _Wnj<i==ŭʩ/+i!\t5e{qAwk4V,MxNU z⎗,;_QFh@D.n|GygqMku0HfB <cPi}8Q֯.#R,v $.II>@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}^W|ȞWN. @28=|'E=HW”P,QQ:os;n/)vtI$o3hV7Ҿߎ_h2K=:\sM2 F'8_ i棣6V%񶙣T=d˱M}K/Exö:涋Q HS,P aN@??Di69PYkի#Ls[I7/|ٓ??:TmL6%jKeW'^os-43!e>t{kV$Yh?+ z(QoMV_N:/_N^æޛ>׷ (]9c.DžUnɯ~<3#x牼A[Ρ> ڤdem<)b7.^7E?` wծ>y|$4R_'\Ԏ,tlGKo984[qeC^wK]ٯ]xණ{2_,ZcHKђWI +j귺L[ˋ9{yZ2GAόSh'MyxZo 1JXǐ04WWi$s$RiQE|?㯅zFOmXbU鑐J>  Fpk(((((+s;x{65kF{`+(Gtm+%oG\Z;) ڐGown?7IY.F_,ϹPM3"8 %N $~fSd9WS4_&7tC|^4? Oq>'&NJ+ &`k+ڥI ArRlc{ʤ!l3sRuz#fo'@XO~2Fc!x0P{kW ]_Og~^>֡ hz*YeTu$oTr9? 6_ijٳNhE?wb߳}zm(/ orxo׮MXv+H *v͸B9+7:Mvqc_AG0]xrdPd>/_uޡuzڒDIv+ޟtfxfem-aQ1E]A^ k3~&PEP\Kk1Mۦ4x4[5v_EO8cG*`+zxZj%d b%Jr]d uWIQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ixs~'6}[}n&QF$=+(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((("5&w_X\Ikw nX BҒبP]:|T7#G1B\GQF<:18F2]ۻ)QZEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3xsw__v@ Ü J?_?f%}E|%r1C7>(9|eȕm9 ;/Dco}"WݴP_/3x((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+;W_n<g>kϫxr'e F(_?O&XZ?he?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- M24B?/Q]ߥ w,- Maxǁ~^^"?{=}'fXDf9gQ[ϭ_࡞d)" Fu aր7?/j?GOЮm74ݟ)qdWWjI('| :<1_'B;EM_)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWQ3t8[WG{L]?NEPEPEPEPEPEPEPEd_?/ TӤ!; q +#~~[=׋< i1l4{gݹ4((#~jI('| :<1_'B;EM_)UkZuj {;d/$ǽ^WUTӑ%XWX1Qp82m+b7T xN B]"cɍ>֏[i2LJ>vwyx?<5a;D^M%uبr5跖2cZE ,3 pOFtA= -rior_+#ܓr0 >¸|Uë7FA,V6֪R5#*scSSk=~?oCxG>Sh޷1(Qq3) x(M!$)#x<J+| _Sӧ%T.GrqM-vkcV~Nr/BUr>QI[ug4?Mp5W qI|Iw[}'Exxπ&Muu/W7!Hv8q[^ |k%յ.CE2/q-onEx~*WjUX#q׮*/k2+yjzO&Bh 䞀q [_K{|T|"%,Vqf#;:9뙱}WOQ~";U0HV ~S]_-OWZD4+Y8݁ANEz]?1yQHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_4Gm_KQ3t8[PEQ@z?럴o%/odFUy69tP,2@]]?^%#;žf*tS~R/#B +oن;]fUvKZx4ahc[8=3? ~O xOOmCVop>"$jg/۱Kwh>˯xfK q ?~އ z=%꓆tʍ+cF ?$/ړ ۮ~_ ikh|Qanūfi":ez`J` W߷}Ejx_/6mȬ KȧBGnp(((gGt[>5ӣԭVt 4mu<6Px!H_T|-E<#|q{c!od;IHx35ׄ^&;>dᣙ̒:+R?bg(?hChosPXnH۲I߂|k? W&M~G BR E7PJ\B$rYt gn!v5Rt;sobK2Q@Q@F'͏#~EP\O9?uWxcOvE:tS{WV v؍;}jW;|@URDMމF jI5{ŋS,هB'@o%6j,-Us zټ sEix# 9iFRL\/~I/4ƭu '? bc5?Oh?I{X>?#iWOv % \w/zk_[QK syLf7M"z&Zi6;u $'2N+ſh颺|Y]ee;0A*Ωǿ$~X$L ^b>xC[~? C=8vv6 {/|T}WFg٧>k_p9CR !}B{Yr&͵AoG?0KwgWxNK?~k4_j OOO,yH#0 8oګD# ޽c?#X_n8/< X_]iIAvn'ti `vVLq"=聽b/oCi<[/[gKQ)fXcwzO6:om 1Idt33]]@auX1;Mzmp ^x=u _VWu.$/ REo/IuEtߴɐX\{v}OZ}.◅Oxtְ4V{ndRȧ=_Z񦗩,{ϰjsF#Gw($qꑹE`xIt? XXw:A"V~X0@v((C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( =&o j^hɛڀ?(+GĿyxK¶_l/%ߖFQ$xٿ6|Po5Ī[9R+FA#{|-?kKZq`$I"^vxrē?ž YtN<$Wh9ES0 ~W߷Wik{𯃠"Fb3=Ԡ$m]q1yQ_|qzi}c2F_F#F}q~߳'2jڌļdxSԡ[okڛ )џ ]arbU}6WTOv u ܝ(((Xd?GWu1t@;[YA*SoO]͆X{"$-]Yv%c=7Rѵ k>kih.m1ʲ9R#}e Z|VZ?kV?y Ǹb{ٛ gh>1ӼIWPӦ.`4o>E9B А2Qxg͵Ե%B졏b)ƟTmY쾞l 7ύHoZHw˟l|~BQ_lGd]ve maxsn6 r? M@Q@F'͏#~EP\O9?uWxcOvE:tS((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?f?p(-"((((((((麕ލ]Me}k*ͻ)YXr GV;O_kX|m ^<cvT@Ԝe$\]PEP?jIc5{{_QEWxcOvxwlC Ϻbzހ:U\_W1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@etetQ\__1g|7G_1g|7@|7OӅ{_1g|7^;^|'Wy_Skdl#(]py(£7,3rx WҟO#VHD=ޝ];{;(r~OE|E})?oN?ܟG@5_Jù?h'[ӿ"w'D+zw$PtWҟO#VHD=ޝ];{;(r~OE|E})?oN?ܟG@5_Jù?h'[ӿ"w'D+zw$PtWҟO#VHD=ޝ];{;(r~OE|E})?oN?ܟG@Iok"i??gXx{[7_>o3Lj}gwh(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((!P=@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u@u_Ls_JPEPE d?j2Nn^kksqPm/m^}ϯJ+OE~BQGQ?'l8ɿSO?q E'D&O׺+?O?`\?MڟtW%ӏ?^J(Q?'$p7j~_QOIN?o{!(DE~BQGQ?'l8ɿSO?q E'D&O׺+?O?`\?MڟtW%ӏ?^J(Q?'$p7j~_QOIN?o{!(DE~BQGQ?'l8ɿSO?q E'D&O׺+?O?`\?MڟtW%ӏ?^J(Q?'$p7j~_QOIN?o{!(DE~BQGQ?'l8ɿSO?q E'D&O׺+?O?`\?MڟtW%ӏ?^J(Q?'$p7j~_QOIN?o{H`;'J+ISOSŠ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((6?H1UO_Y?*آ((((((((((((((((((((((((((((( &g?q+''澔(Ȧom__W?P/mWG?&GqۿR>B+T(((((((((((((((((((((((((((((((K;$t¸H`;'J+wSO?0 + ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( !W=~ld?clb(((((((((((((((((((((((((((((ۯ''澔f#R (  2}}_ @C_P9_+nH (#P((((((((((ه>'Y bQ]_3̬_Lsc)`(K]1 I6bς펧Kwq\\Bc, 0t,R4KnS$>:ĿtrKMn,RQp ddxr0T%~VhqZVX5QErQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xv?NWwIc].*g&QEr!EPEPEPEPEPEPEPEPEPEPE|o>(]Nmf1G!©d5[u>{}ZXͱ6-p[[9 kg -1?$}>ƽ6GbNwn-l}WXjVvImQi^2m}-GNxO޵kÔe 8Y׌Ҕ] ((((((((((((((((((((((((((((((((> ~ɬ5 m |0*zkwū~ZHV9pQyA >K.?ntvXRҽA+;Š((((((((((((((((((((6?H1UO_Y?*آ(((e/W"[zBu1zLJod10HI(GPppN S?'GxFԴl|0$77o'¡'̛]7)4W-7.~&oy[/ % \dG#:?i [SEK=VRmsXYPYp6U%w({EKz+fej> /|[Ou-&ou:gj" xG[p9 L e;Qc~\*+gY3TV5qU5ud,͎GPkԾ~¾9>>9*i\HvmB%4-iJv|E8+ 6׹n|Y.T]_}GtFRn*Y>6.DžQ_fLh֗<t.ʿʦfo-ﴟF0]OB„;)`;MGqe3V!d^e O;`.ޘ_Q^˵WNJ?iH|S';G Ps| v+t\u_7/!a_[>\E2"ڭźvtoOW^zxωokZW<)VI,b)cEs=̥ʷ>[o EkZw-IW϶(Pvc¨OLWZzD6:XA\]ICNrn=~?߇^>f&/e+:3Ēdevf[|uumR{i"2Fc;v4KokW3QEtw ^5|xة+ r2RJKf9EŴAE}3~ľ+7>t]* 6ZKf(c׵v~(j KGNjWXGdѻAR71^x G+ihd2Lc# 4D`v^&guKȤT$pyZ?' {ƛYcF#O k:|%v`@*+>w>$^!333r0ƪY#88';in|E}$w-G,Oo xOvz[o=u4dedH鹔g$]IÞ(|Mq &BېG\ӧ V#Omfq!ߍxֽ?⯍mXC<1+"LBoNQc{_[9YR;=?+SZ]_"Sk?(H#~0|7hu@ Uѣ* c}7$ğhx7&wsWWґQ_GEPEPEPEPEPEPEPEPEPEP_^?|'ϟ5U"zwF%_W.> 8sBI?_aVm~V~Z*w_yŸڿ>oQ[(GhYCk_gʿyo;_ǟ~ٟ:>˧W+"DFa,[9}~ |"x7,,f7Bꄨ_rZEBn0S>1Vix,3m >\.z! ; \x_E-b= pjGxo5K^e +'km\OUЍIG&XHsX}jYSiݻ;|O_xOY4$%G`ss_F?. rm's62W8<`pzį~k3CcAmnHp$'_UʗiԖ;m^O N,UE*kU'[M;߂txOunxKYd =1'LSm+|@JMJxwT!mu# mݐv7+dK*4BUc{^n]9 Δ'oyڽ5?5//^ɩGʑ r0?*_4]sLL~ E+뛼i3@8yheS.H›m]u䓽[ٌiWxhRem[VG_'ğ [sC<\&&q \-Bd7ῆ|b~"{e,h%Pr5,:ѣV#n]_}t\qӔғq2m~JմW wN_H'Y?b3ؕW~/|ToxoKcm[d/˰UU;7LG[ۧ%bҕmvo:jf)ƌmU-W/C⾁h1i+b]QJ׋o}/7]CT͠1YIn0`H3؟xOtU;76b4"BȭR!GCڮY%|Wz׺{mus %$ZZI;mv=c/'_բ$ S#gn t]UZp@5ksk0HldU 4Ax/Pq,mnB•l<*5]vVoӳe0,x_fR]{}NG_(x]Gi~*_akxm&q2'ZZƟ"Nu'ğ JvL1 He8 ҖG(MuWٻ{^ܷsx45~k|Vܡ F -|Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@y/Yu=Ko4J#bu##>j|_\5:8t?R",5$]zeg/oWQӴ}7'd&^JB~| ,˷&n{uBN^\LeV`眞y{7hʥZ{B4VyeXœ+no}֭{wg^䰒V`rry﯁c?.׍y`s$R֯_MUi-UHϷ俳?ƭgF^k6v6$1uRsnkԼW"^smS_~y8<=*^*yEϵ۹c+TReuM}Q\Y|:n-@3[XſSP{ ~5S*Tދ՞ԤQ_+x~2~:{x?hHeogo)##,ܐp1L>%|H|aYVžԛb߈9ːv`GBqSu*&;rs؇/沷{yO)^\VX',q w/8GmWq?>Ȭ3ʖP@#gqpdPx#NrI7Fa5cB쭢iQQ_}7W<̺.oEi$h/yc *R@d'?jvY[/9i՝OxLž2u)4kM_OQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEMCI-@?%{ObOljZw.ǩ,y&O._CO+wħlk QW'_yUK+F){^Oz.پcS0M˿>QqӢ74G߰t)Bw>UA +OQ?K ¼B5KۛPUa866M7g?Win1ޡ"Ũ[*&Qٗ AkGOя˩GImGs|Hw{dkʎs$wZ"1Z]?΢xFoờs]5</+ݏ ?$w sU8%oF?ZvNR~K>2<U-]V_OR/@4bylǟUI|hxvL4ٍ/{ӚNi鶺}vVѬP¢."2:V* Jy3ϛ#9v&Q橊?~m~b2xy$v3@quSpz@+' |55 Ga-?KnبNPz`W~5|ZMZ?(2TJpErK2:u]REv:&cwvz}#Ex?atiE[Y_k/?;GQ_,?~v#|;q,}nS⽷ĴN2n$L cf+,t(,U*Nm_GL[iMUq_$a5K林Qz$V*!P`qwtrc1L"$ۯ{}E|3HgDo/HlO (;W$=[tD k7I8KB8u#R|vi=W*7 v^VlꨢT((((((((((((((((((((((*i4^n}mc3e~lE|Q`j_|;yfյ+o ^* =l;|т7Ny KIdidnK$ƿF˸?xb^!ZJ+u|6;ZtxjzWfG#6 %' %?aa\(m&) =IRz䞕WUr0/or'}}O)SŬmקCPԡu@V+*a-[:Ia+jZjX +;ʭpqn$ ۱#<'%WM.ZKW>]ğ^MN=KZl;ꚄmcgO4QFIzxJѥtQސ)|>Z;E՟cRR%(x3gv7_ĺ(lfZS`tA?f~_<-[_xxRP%BMFl8!s}=Om3QխX`i:LRE}c(xQx$R~k<*K=irܶe\BU݌H6}Tō'Ox Vk1pvrDg*_ +7TZl:d4Yc)bq_7oڈhObfv1}6: /f5.Jqu/}okhμV3UW<$ۮKE1׼Odu[%BeEď!ٕQª }kʼ?J(rN5{I_e9+V ztPXZۣwQnUt #85~O|qN|Iuo ɣBtvʍn #!,^9;)Қ{+Sq8['QQZ%XtWvKkeG3JU)˞{GK+gWܟ _iϪ7ĝ i3YfZg#=GL3gp/- G$BTWB)W3HԌ+Ic>)S%ϳMMEWzEPEPEPEPEPEPEPEPEPEPEPEP_Y?*'͏,~lQEQEQE9}m+M|#kW7? ~#xv6ԡMEm")c }2OAQQ(Z[sCԪmߖ_}~'Ѯdtb6 T "Fw░Vef2/M~c|SmKCRXԶ,7Hފ$5vxlYn4KQN|7XFI8Bz}ړN*S^ܺ~&W;C׵φN6#W)c$ 6ie/@]jў7_Í u/xO#-x#_M˱|vv{ ,DL;h?fSnok'ޭi م{ ~'|/}/&m' 1agX7L^Y@ѥ\WӖү?i?Qkp&ϯ~Ww~'~:jCZGKۭ@ y%ap+*\VvS_[4QUޓI}-#7+>(74ڥ /2* P sFnYpXzw^"&G^>cS" վqm>) GW, c9z 5[ϊSpτ5*irv@8Yca$`KO{|at :dZ rc%@MlGgֳʛRm_orZ$GǞ$y+%rdQIǗLr>ek˿u`{crkm8sƑjR=}&akpEv@Y1=W}!~8h5Νk DaK0_Anǩ'|q[|PF &WOExS?($<;go}?3²]i6?$zgOʾ׌O3v&= :p2ȱb`YG(;oy[K~F_TKۍGQiى,IMS懨xgXu[9NV p kiNsC$ǿD !?&k^<-}[=?OhmІHY _;8K{a@?l:/ЪɬU;*;Gɠ+~2#3 |#2_ma}JEMJJDnH_ 4hx|;_#ӵ:{T{`鸝 r8W՟\fhW?K:?7QU'K܌oJovoggtҭ~8xN8]!e`> O?]Oߵ?Ưk|3{-;1yG9Z sGf7ҞŢHڌ@XvHڪ~Nn/A98*V?9> |rnj.j^4Þ,+oy&@U J__u_~#ԴJKc/,xf\DH# y_P4K+.SX@nlb' n =K{O53,"M N4ҵ5nn..)敏~oķw棡~l7Z<|+rI+p9#Ҿ?f_Wt#i mƢyE 郌dL#{;:OooB4D]#uRi3J/wƐJ-mr/-ܥb9 ն"ܴ{~c <{ߏ})2%ƅ>>517(tn $uW_L 'XxD>Yz!LWk:2⾹[ Jm'lOۓ]%Ѵi7p,K^f2d"q䍿.EPEPEPLs_JWNO3?Ӎ})@Q@|ھ_!W(L/|EWQEQEQEQEQEQEQEQEQEQEW׿O?nk* 3|ȞD>/{IgQE>|ھ_!W(L/|_j~0RlU{B8Wu3_"YS*JoP^vv&z<\'yëYba[= )z+$6٫'\m5/k '\@$ ,p=k*tcE)%߽׍sXzSGdߴZkJ4QE~|QEQEQEQEQEQEQEQEQEQEQEwIc]qxv?NW/BaO~AEW!QEQEQEQEQEQEQEQEQEQEx$'To+_y7@/"Ӵn+9,X̎0~n>3/ P[M6Qm6&HBK NKOks]=/S%$pA8/x<Ƥ#RkkvOXJ w̷n~$Z7VMM]= x!F:ҽO?m69Rν HªTp3ܓq^E~}k^08^AY7ϵt}='{zpu0ٙTu%Wv?"2:V*FAѨՍUZq*qq}O?aj ךzQN]U_Di-DG5n, #'>\dN0@ԃݾ kZ.4 @A@W]l,v^:[5Su,c_$u]gP*G S#Q?oO JHMT")1r:xKeg@(ڹ>,/(bNXӖgv,{=&d45?7"]~t:kb'a|}k~fl Rc=oeU=i j]'~-\Ѣ{Va$j0x08y|Y?=LFuqS!F*I䓁z~]\.ZPrFgjyu FYjN%^j[SbM-? K6|缵g]BZ1? |&Ut@+^/s"KDUuhjk$¿ )^F*\5ԟG ~,:F3^g෌@ɿkK{"4\ ufxHڟ8H|]fO65?7ec v?u`}[)kf7 Yo _s&Z–QM:UG`"ZۻI~at2׼x#D-kȗ 9OF?6|ۋŸi\4>;O-/[^i>5|9v>ZRo?W_"_? ,іz|಺O6a#G?"k?n}SoA(3!Pg>m~,x^GdsI`_v7 }9 #&N3[fڭ EQ1c~ ]|5;mwf3 ls4Z|#?睶!7^'_E:W-dexI'R:p g<e97]Bx6$*T\Il}ֽq85EǭUo{Uj._]])u^W3`He# zi]>[xmPqW9$wGAQNJ(Š(((((((((((((((((((((|_\5y|Uw&8%D\D@ 2a۞?R<9`?oWhP||W_xQMm(Iv F < 2x.ux~c #!ߴ/]5ů[ಿOe9b9+hC0^xb#.jZ-/{=c⿇%>>`N߳#y AGo٧ ~-M=Z}5*3?/8'oQ sk,eQJtz+yrz^3$Xf.6O٦~3;3.8(00z .Iqi.sӎykhVǸIYrw|TK]71@5o"/k/ȯל?fD+Vz^}p#Y!B+l [c(Џ4͑Wv۩~W߶^5;$ Y1ݲdyx;Q_dҡ߆ovIi T5rpC5gU\n2W 9FV_#V|&ٸ1&'Uy\!\:'GM;Ru=#tPmˬdx9^*Sou>{Eڻ9b+帜6oԣ'.㫺}osȩ<qQ\ֵCQ\OG|xd=Z }y" cB?JOkǎ>6k>h9P+obhz:VRHm탙P@,cG^VL,88NwwNݺS2rxe*qIwWLڊhφ3Qq,&:.3_\/I?'tц}k./K1_x>yIݨm~-ԊnN=Š(>((((((((((((((((((((((6ze"[iEg?g[#&٤5Eq~𯗫g,SpS{|T~`΄y:â=Jiq!Ӯ. sgctGǏ|Hlo[6rZQK' :+2 _#lU2}k_? ~$%P:p|7νC|gQbeRZ]Kʮ*p>ө['???王+o0h!Ih1Vg 9)~$~ξ*-;oe6.6[OC'5|'{ry:v(Q^7,/T%>ǫΦ2K9rt_W&|3ޟ.dnF9jo7o>hvq&=@ #Г_amWv(7IoSabpQqjKͧ{_?xƭ[źMѦpGN"?#Xmm(cUQQ'Q,T1mX뵪~^Qo kZ֧'A*$J,>Sk7B[FQkoDy<IFGkX>j`|'OM,TpA#̑ar`2;u;ߌ mPM"F{@G[_.~*x= YeMVV?,eIQ_1#z?++ܣ:O:rFR嵹e{[Cǫc\/5 os__|I g>J[n(?I i6h7|ҽ/Q_}5hV'7@ އ$v,GjowCB1؊xդv%X:3O.QYoMtgG>R~?@5҉+CO$J$%_z)׹H (\((((((((((((((((((((((>|{[[ #uSٔ Wi}o$Kuk:f v`Tz4x_] }Kxؖm嶢z݇!6ZmiF"Wj >;VYc2WD#g1^YēZ[oю {ʹߦ߀QEyǏ?>i4b6`hDA' ׌5T)ƭXӜSvo3jJPv?|FYak׶LO2~ڇYi:YhVKVO?6^QAqrtZSnak:l ƌ݁!p3Xg)CPkt#S#1)F}S+6?e^#.:ތԘQXz5̟?gOs>>mXjqEW̑,<k!{՝RKto%JQ+S3%yQvsi]GrXjW,jŦRѿwO:wɭBs< [4miH$ I^U~45};M߇4ۥ-1<JQxIf&w]Omg‘F '|׵]ɽ@!H|)Mǭ3h si *,F$6J \k wYүr eս3ve#C k#J߽NJRξúj)9eetKkO;X>(x.}LFkzޣW?C_LE}k ż4 9YH _ |tϦК- j:ޣ-sر#r _SS:4im^Aљ)#"-*XzU/cVMVzǵRxэ_kM$Ի?驻EWɟJQEQEQEQEQEQEQEQEQEQEQEQECqz!PQ@Q@Q@=~^-m񕅅xK> ~tKسK@n Nyj^*ͧh>ى{B |ELE{?Vxfı_No_(B?3n.Tg9+'ǯ~οG|7gb[_+TI!&7#gڊgd/K#:׼YCoI{q®X @$z7w-;EҼL-ڌ<|n*Z+5魚rnjot=s]/T@|_׊uaG,&`xy=+I4SXi.e{9ek$Sb  į|# j/k6.Z)FS+ }s7x[^xৃ&|@|aqssK?a; P@gO|S-.P{VI"r!ݘ|rxwL=֚W_̵4d_.NNɯ ~J$V-Vt?o}+Z8uo"VXb31 I>QE(E(JNM߳A ~-;yue])hGu=|[mok7oyq®$ fbԟsTUKޒi}QcʶϨ|y}GE:͌Z{Z\Ȏ=Hf+q׊?>1妝{o-ŪG$a㏚w|}^V\G~Ӟ)Ik~)46B<2ą $sЊT>𭦉i?>CPP0O9AoJ񍍪XO*_5w`wp޺oZ~)Zl.K"b-ĩfV誓sQ7_k޹\jk˧/${:*/߇ 9wh&OmTaVB3N9$_QD}-{4X}_o$? bFK;WVƍ h~+ QI㻘#Qcȶs=ϥ~>~~?h3~kxv7Oeٙ ןοwf_x:UݓXI D#gG$C1B+T((((((((((+f:G;fTX6:4^gY|ι^Eqc0t%owՅT֍zO_ݿG? x|%E|v}Ϙ_qo7wOǝ#eׇa}gmQ]_/_\<7㉢2~G/=hZ~] (((t|[m7* (i=^ڢk2%ħfCE$oV]ֵLVVfUl#bY9$QIE'tڳaESQEQEQEQEQEQEQEQEQEQEQEwIc]qxv?NW/BaO~AEW!QEQEQEQEQEQEQEQEQEQE|A|GNO!,L]CH''<*]qCjF-0ð-A+`<}E} XO:孲_G&G~{Q_<{aEPT&DV>sJ[jka4ERZM6XnBEOi jT`Nݬ++(C ( ( ( (2FAQf 8TBҥW%մ7(9 2ZgtH(KE־Š(0((((((((((((((((((((((((((((k KhnQNBp?:cc55>E;XVWR|O'PT.i#C>h&72鹟hۜ5Emk Q ,qUQRјc1Ӆ8rB WmlX,u*KswnDQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEլ7żRHPF x Wį؃Ae2;WTW̱Ytqpb!|φm`\c?~9gf!پ~~{Zk:!]fry6UK0#N;⾀|WfxnY=쒿s~jav (X(;x1M(`QY鶚x"`D1*qY^ERTv6m⹏92覛Z 1Ʊċj0>5FƟEb>N~)K+Ҵ=2&k-$''s<֍zٖ9c*\WܬyBP+= (((((((((((((((((((((((( ɪ mSnTsMqb8TkeT|𤋮xyQm ɺ¿}zIUaGY.0FvxfE}9E?0fUUlKzzTp* ɻ (Ӽwe@55qYZV1vEo] Q (mX%mQEQEQEQEQEQEQEQEQEQEQEQEQECqz!PQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@_NO3?Ӎ})_59?GN75QE d?jȦom_W¿8o2>sWWґQ_GEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_$^vE:Wa_˸ ?EQ\HQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWCi?ʿIc !4e@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE~9?GN75|3{q8ҔQEW?P/mO쿴˟<7y~lW8,ʖ#+A^WZw<\WFi?8误߿>(aZ?/WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϐ߿>(',WsOGϣ"?+x?z,ѳgƩnN38z~ ZsͿ\)B2%Q\EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^kqw@d};_6WS"nϔ{82kҨܟ?G;w{G+J(w'D+z$QoQR;=ޣù?g'[">kr~OEOVH(ܟ?G;w{G+J(w'D+z$QoQR;=ޣù?g'[">kr~OEOVH(ܟ?G;w{G+J(w'D+z$QoQR;=ޣù?g'[">kr~OEOVH(ܟ?G;w{G+J(w'D+z$QoQR;=ޣù?g'[">kr~OEOVH(ܟ?G;w{G+J(w'D+z$QoQR;=ޣù?g'[">kr~OEOVH(ܟ?G;w{G+J(w'D+z$QoQR;=ޣù?g'[">kr~OEOVH(ܟ?G;w{G+J(w'D+z$QoQR;=ޣù?g'[">kr~OEOVH(ܟ?G;w{G+J(qÿ <xOzwVf$i_瑙]O\0+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()"70_:_kϏz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ5B>?Ь(_Ϗz/(} Ȣ6VE|`CuQjQEGRGR TQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE]jQjQEGRGR TQEQEQEQEW~"MX"u=:xֻw]9ia:jn΂;.ZЭ_GnL]Oރ^~XҢķZDwPG լ _a CiFrZ!wיG{}kEr Y{%VZA$P?)Oz떵?cRTNN3z5=5Q&ѫ? (xN~yOPKH <ҳe9(E]YIE6FKE-|AYjv2!Kd*Wr0N#ޮ(+4(I)E0*J (7Dcn$kznp~=(hzʅ7QŻtJ{hHMm; 泫O]>C.A $GJE-|AYjv2!Kd*Wr0N#޲sokoSNxr_](,(637Hз(z+º֩ ݫq[)Q^-w}sq ,Up_ g*sYPKxSUN!Q=bt_ IV  Vx¾ՌiN_JĽdk^-gDj"k_Nιo_Z:5@Eq"^h+ >N02]; EyW=ZC =\,1#Np׊ [maĐʂDaЩW[ hxWw"?3߷w c88^]gBj:kO]BNι*]l>=h{;[֥/& ^*ӒKKv8,> u$Ӣ/^>85boہ%c?i~@&%Vc)LR[7s֒7(gKZӎ U厫.гJ$KjąQHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP7Z~֯U7Z~֯PEPTu/gJTu/gJEPEP_0[lL(b6E,Loz95o_%񽽱-~ȱ wqs뽿Hk8,J(ƓkOOG}Oj*;o[NnOM=iO∭aNc$8nܓ;{zM#9XVK]vYXFG\$Vƽ&+G^"寗Ṣ*Ef5mIjk|y㯅c٭35cpI=yƋKi^[La[HN3쳥î~ϣN Mv*q|7|V^N>/𼓙Q t$e#=k\,qxtkZMkX)K㬼M? 6V͢_I.lH~S(~G#z0 UNm]Vɮi9BĴwMgٮg{hzIRSx^\%>MZ:R\:w=춟S\'o-xf+RVvV e]ӒHu/h h s#87 j>iW}5(U{S9n5F3[䯢vIj<թ{GSKK-|Kj~<ͣv =L77a!vtݸqzWA^ҴWe~Rc>]qv&/pʿ{2Iji%7|hَ < SJo;IELV._^pI^ {%R񅯆f;mǑϽo_j?g{hzIRSxUl#=z7%>MZbrkYm]=/b7/=Eԅs<0hJcr룮G^!@<nڝf,4kp1֭ESRB饤oj^<#lߊRWW? Z<+鎎h7#;fۏsֻYsx5.ж #ߚwc~m{*і~(݂zę.ck/N;pڽCY۾ypg-ej뚀~!qى'$pGAҽoױbk5Dב<5*kN-F/ihҺ}%F3_u;j_[ߑv=|ICTUk HG/p?Nqi6>nxh8kοio}M/oOѩƒl e>˩w1mzÝ?~? gs6n[yCY 6dyv`@r m/Jq6#X+"8~>Zlgy{/& ca?Mmo >.6{+ykm_U0^*_ }_zZ֒Zum E2S;+f;OƋlQ1 +u~q+3Ծ/xRtCc?AƔ7`/$t?.Jw1it݆k9鼮V1"51hE xVνB(>[乭 `Y$$8&na'OU_~ QZ>uhV<@ gDg['M-,390? RVm_6qwI.3<+e_ڕ_h?@/ssԟ3vaj?멜M;j_~3Fsu7.q4^PH ;cH|YMcU-md1 U$dzqZ|B?7k9ѤuGx_⧋uoirjY-\zCů0~7٭&]yc20Fl dU{!cP+KxAr;#{֭Zqok7ͫvhu]MdPNxVRBҮ oY:B9y#ڻ@`xw O*\m~._/ryox⦫k⨼+K85vǛ,ܬd M/>կm|ᠼٗ b|IVW##8#>į?Ư \|LwO Xn&LcgF RrJ2[M,&RKu f/n-$aAFf`9 m{~_Gd usß/ִ_ͣ{۵v"GY00Wk2:mBy/$7 q5b(dn SVehZ+|:l֜QM. WNW+a뽿<]+HֵM)C#0 ־XlN785]-pt}J7Cqx24[UVP+g\;<ƾ*p|aj4NWMXࡇ4'ΟK9+^*Ҽi&UoOVRtVYA+׿hkћ}-? =m?0B1O8&$t췰}3>Щ6cnqb…* zm4 T˥xo}音6KPIu$D5wWi^_nν ̎A1 ײhҴ]2Iaog 'ڠ  x/\MjF2:*yi;N\ɧ/-thΖF Vi>im?7vk'kqg $FT/yvX6zO>C.쥴LPׯxo{kKkn= ?ټPmRC2GSx"y*2CF\ݫ][VR5HDV(c!;g+lqKbcpb@cz?㥅+˦\%;x]|/3^WU;dE$0 t(u֣t;\2cwN:،uԍ95$vt]4198{'k>{;ivR=kO&E9qͼ>>`޵:|NWx89 .O S3Z<3㯁ُ i7AD^(nldwd=^%М%A2Vmy;z%Bc)䤝4]X՛ח[ Zvmu߆5Tl#hE*BR7>;]_4{ J RW`JWffXjږ+`BwړgF<ĴlH@\ŇZ_,x[>lE}rM)lLnLHcZ{85 YmU)$3 tu=A+ +[ywMn+kTI=@`2a}J_2Zjj>ף%nU_S+=G¿2W>Zlu21B(hpbQ@#}KE <lߊRW wRUC0AznJ~ibkh2靠gWK>ӗs>_?$P܄Rxos^i3יHe6t(4+'qh6? ^_6iZisoBcb<iت+Xom䷸9JRe`zT}4WEfRojjP[?.JWGMX(0~VkP,*wQ,y?Z455TEUT`:*m/y5sfo~Ai`H>ۆ?U_7[BF什8Ud'Ot=b_A{nH&D$t8#J@هI`^7vrih3nE})ok vE0F(*pcsޑ15M]KQg3 _dj֕Z֥mai#H"M'd+o[?/&Ol#@6 gЂ Э}C&ŭR d& s~8u鲸c&5M M5Դ]Ac$@'X ZH#ٓhYBҽ1 ^-w-;I3g'g%KX^ #gt-v0n-[DOSGh:n42iַs@4g8:zVqk~D%z;5UjLeZ9̲[ s=}jV6<&MA~|n/5$xP; I\ s^i3& K(^!VmftҢJ*+X(((((y-"x$RYOPA'~\]𕀓9dO0_ҽ飉6# )VzF~;2O[ıQXJNMN1QV ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((-?W-?W(:^zl^-נϥPI<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o(6MDͿ@ I<4y6M2'oI<4)DͿG'o7Z~֯U=>6O3rc֮PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEM{#_ؖu|}_n\9z О*OwkJMSJ+n#ß q<9~oef#Ϻ(|{@5ǿ\?q٘>袾<9~n#ß q_xfb;/_ǿ\?|{@5}+n#ß q<9~oef#Ϻ(|{@5ǿ\?q٘>袾<9~n#ß q_xfb;/_ǿ\?|{@5}+n#ß q<9~oef#Ϻ(|{@5ǿ\?q٘>袾<9~n#ß q_xfb;/qxwYHt{RB+II׉~_?fOO-x'to\n$YR97(Z1 _tQ__[G>4O :W|+KHfm̗摀Žּ %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4Ww= ~K %rB߂?|`oytEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEEdKZUwCD#{{ 9+qx*|`oytܾ0зq#_?[G]/-#o?.?\h{7G= ~K+; %rB߂?Ɗ|`oytܾ0зq#_?[G]/-#o?.?\h{7G= ~K+; %rB߂?Ɗ|`oytܾ0зq#_?[G]/-#o?.?\h{7G= ~K+; %^|@Kj1Av:vI5HBqMuWοGOٓ. iW޹$zR$$C09 {7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4W5߳sXjگڼt _*hWj5',y'Jn/ğ']'ү r6Hx!HHȇva^sǠTWw= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.n~o I톟iͩG&mqDdLc9P袿/>0Q>*|?o MrMxxй[ $3~_/-#o?.{7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_/-#o?.{7@4Ww= ~K %rB߂?|`oytE~Gܾ0з?_?[G]~_#ό?jN,t=?fƂhh߿̖L\cNs>(E?D_dOz_?%]ϑ@@((((((((((OIҾQɷoo#$O++l;ng3O(3 ( ( ( ( ( ( ( ( ( ( (=+eQcfW _'!'K"?yj|Bw((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+/+l;v"ɷoo#( ( ( ( ( ( ( ( ( ( ( ?f_6)?G?u~̿m ?S* &-# &-#(((((((( &g?q6ɷoo#Irə=nkͿ_mH(:(((((((((((((((Fx;,$o?S:qcf _5'!_[K%5((((((((((((5{{_opz(+_dOzE?Do%YPL( ( W?5/wƼw)hQ72v sܚW<"^0赯qUѧek<\εJ*>?2'xJ@t y乂塎Y@ ggo+Kw?^s_CJ[#ե'*qQE{[xJԋOXTO,Er_weBㅥ*vjʄ䯷x '߳]g|?ǻ ?GOĶI q0T5JReك(kR .>]jz͕f+iZP ) U Ju wuO6澇kinfNx97VWS }1NkV 4Oc;dR0#yaiR%ΪJFTE,pFI>SKy KD㪺*eQE0?Q>$O++l;OIҾQɷoo#~?>+0UR'z7WT~,~ m-mR=Bb&-k xNm;V cn9 (` ~%|8o'b1 HJ叽T1^&p\=ZveތIrϒ?aEG(jWGGwT,7ZnسXlrA |3꟱67z{?# fݡVMk̤*q_m*NMn>BÚUŌŃ+֫F 2O Ϩŧǧ]7U\d=(xT5m6K"뵀8x7_WXCԣ[oALIacEmh dt ST泳d_U P-{y^)Q VG*GPGcL(J>٤dUW2|(Iȫ_(g/ھk?yj (=߲Ǎ%G5/ 뉹,XeʧFp#8F}_?mZ忀4z 5FwId",tUA6+M:?i`Cw?vPw*0J[Ļ;-xs,:4D&FF?bikV=oS^4*IY>oƻo_%>'^ٵgB|>t"_itcB8_:ehV?U=+\(-!Ay $,69  yQEWxğ\xG%Ci\+EUU&DNO>ί/ؼW#W?[U%.KdqEGmv*+~˟~:πW{i/ j4]nfe}qxB;ӦoyxLneQl~[$`_O׷4W2(tO&kKgT^1=>Kx`c+4F<3xb t&w+g8?b FjMݞmqslI-3TǠNu?_-jB;QEo]xZ_LJ5h4ݻ-=w?<3xvGүYeypmwVu5auݨɂY$uj͏.kI"G?+0?:?Pd6:_4'yl[h<?̓&>϶xi+ 9#=gi3|n<7g|?zUu)YTV#O*/ sWJU}%4F9=s_ƍ#"v8 $J{>?\O6V?hZzj^մ&.ne33(m4 2I=WNRNNP-#VSھy\C}n`(:Zܾ't0jWm4H=h# ((#~jI(o?m޽IgC3j(P>(իfgY鶖F;W<k *#:!Jn(@pfRY <}? 1‘DQTD*0أ 4Xjvr!:sO;E4z|eIT;+C؆rF &|붷W+O.e۷ yox_Ce{ɱ†e$V=~vkZ6XCq;ʖg˅Ywg^%խ4SMdv6pRF=NyAx-%][[OM:K!X ")fʸ\y*VޝlOPîYT|_RÐĞ<1I,UI@/؅~J:f5}?Tvwnґ[O[gC_/hx-uI'pI'=_3/O e6NA|U}+(i+Eon?'P|[ez3J 9hNC B'ud_r߯shĞ$Ӧѧeig ꜐Fyfğwmq=:L[RHI~@S1WIn/ūݽm0 HUw ۱*g=׍K 7TGK[}:2\%Kw ڽ8F)8=sJU('ʕﶽy~Zh'OJGn$[[]G?2xh3 Y9m6Wn?0J=r?ٟ:ۢk$!cFvq\ ~+> ?mN 5G7^vхkN^J/M9zQE`fkuDGoE*O8,4 ʊ.U~ E ,Žʚ4Cͼ|rxSkw^蚶qawmuh-ٛYm͜uG5~wSC,N<Հ= eO_N_3~4L֮#R ¢YW @Bϸ̿15ºEԺחeU,B8$Rρv>+u_E~¯%'B0zn5_?G,+-NuH,wynȌ}-~ PE_|蘆zZjn[lPo]{(O;riGl&ő2]MYKZهɤK?B?mKKO~w[\fR(H}NY_^%t?~2/Mkq. I &o+i s\w&G׼IYN0FN+XғRIY)5__x?ܾ&?xve9`k`g 9@Ym׺ is`nkկ⳿(%pDH ?3@4%m>~Ŀ~5:E4D`<֑PxͿ㷅AmBOkuU4FWK9"WK_vs=(JkM_֟moz/Kzvu5*8]e8W?P/U>$EiY#kkYHcNҼ D*@k=4GQ??+_ZJ.+-^ۚ%SQ=¿~9~w*hw|G=FWi8nTF!2*63N@V8+>%|dgoZAmuM;}.j*>W[і5N٤dUP/oO3ÿm_5ҟQ<ψ_u|@Q@گ瀼9exǺ)Kk8e"Rň:*KƁjƋpX(*pda^_V/4=V[YFS|m\drg>_~n5-Qw`K2ʝ\rq8뗾񶁫P {r0$V\~ Wo>+x?a$qxs '6?b:1BE]J)/Rεx# jۨfG꣢n>}!EcE\_ۃL`o׽~eۿUo~<ɤx;L[OHOl8#F.8kd>05/ c}K-I[.uہR+ȿq?]tHx}~~T*w+_Q}_9饧42;nHqh˱<&?_EVK&3E׭cȡ]MkWkfm[~ ax[Mo>"l5.xv,B]bBFƛ+LhC:%6:W%_m?Cվ(>RbY.7R`X# 5_JFjWAs]H矺c9ֶR*;+=~~g=a'-#7 ~vI>׌;;KGxYE|3e')C~Yqc$ZhvRۿ?{ۥhT7ែQg K 'Q4O>3ZH/WD'}7e!PF7kW=>IƄeI'{jVk~X֌sI? aҼ_Y[Z5òˁlK-<[eiqCqo" nVp*y ?Z{On7g1V$LŖCҹ/%_ou/""6M'C鸍L")=2F!=JU[m,c?Ӧw^zG?'n_̗K/%lcq'\7ۏ^/~M<;}VJm.Ey"p Q|Km/ۿⶻdK=JTFe? ~6_jNv÷%ߪvt8E:;|? ;g@gxNg)x@T+}5[mo0}ӁW%܏#CJ'\Ѣ:߇c';'UY_ 5-,W]ז3MSƜRTUHCN{rNi/nzߛϖkn$i&vI噉$j(im)(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+/+l;v"ɷoo#( 7 Nx vԼutԱ56p|# ~le^7>+oi "R, .p fc:⏂ờOI:>|3q v#'𖵢Xe|`'+e§N|%sYIOoƺno<3Jbմ& mq('i` ?Emf Kc$1ZI[oN.WZ7Uߟ%{fЯdex `YLn9ڦ5-6FԮy-/mex'vR+ea؂#ڿC?/|H-k}dSO'WN>-"x-X(&)Դ{ϼUQ@w_Ǿ͐5GX;kc2DZ)<Ҿx_&D* Yq_h?K7mƝ})VT>eʲGL|I\NY}M,?4na~sxCIDSX{}>fOzt>񝱶V_Iy t$c /ٷUlK F1%$ʭy{G]kP-cki$p:pf/wT5{LѼAU̷ ?vm I޼Jג_r׭_u~?i_'=3H5iOaK,K0TfI]UqoOϋtbIjI c8]>;^ Q$c[03!XFv#9ݒXbII~̱~_>"{~!4; >;϶ ! 0@30uwuA+Wqkr] *THsZ9_2<>0y4Ohd@1 sʲ`IU `X58/+XJڅ˼ݐ[.7 |=/=OƈyϷn?=D8RW-N($+اU 2ɷ(OI8+l;+l;(~'q(/diBeSTNJ|WXx%gK юDqD@N7c> }aށvTdy)q_DH?gSO?ů[C ܚbU%+%.|ݬ?TV+}g f4IB_aslP*XÜ2ƯD~-6k/~h 7wNnl*1,{zWßix/źƉiuq-6fQ$wmXQ $dMBmHxWk7*тp3*{A d.Q=(Oh N]7H88Uͯy^aD>?ҟ=&/Рe5uQ[bvä <7]Ǎ5/u sPek"U@|/}þ'񖝥ĒxKF*]b; bxVx;3ԂH3EfmgկXmgE)teYX^` u& j]aUT I^ko-< 㻹.|;촾.CWs~4> Z mU߼|S>w ž)oi6m kcwxƞdH'(rə=nkͿ_mH+f#o+l;(o~Jj?+ xz?O 'Amb7Fъ:S}Z~FM_=.+r*֢c?eByyd5{Jgf!G_L3 Ly !mi @I_xSݵڛcڤU x mPT?u=U:40+\,U>yoa ьmQڋu]]x7jclCOWos[??KkM[?ً #O6zTv5A?i Kzok=/Ε ڟ';ewHm+**}+_ڏG,ۢ)|-7^-px o*#c$ouV/97_=e*:ur& "Ns$"ioo%ą5 Z,-,mUԕ*=~iI.ia?4cM3`KK}&o"xď"m ַJuX3Iv:)Ajt&ӭݡ'YPHg=3?67M%~9[8D1"`u%=t^>KBd%%䑘**QMwٜROw)]Z߁߇</Zn+z֖ф']pH{E~:<3ٓ:dž46 jw yuq6Tff#k_g?7׊ѿsIo9*C m6xJ]ne{C:mF `ēXrKݾIliTgAx'PIil&PTlQ6V*#<ז8^Ӣ,l3(*YgQCvퟳ>(|D26{ck(i*,q%>ӇOk,/ߓ͵t@|XUR^QѨ&fmjsi߷oKZOe:xM?5|K:e{V8dF ;X9תZⶇZQ6i\,a-:oInu]B- E%F`cҾXe ,n6q]SR)S}i5߻ޏ!+٫dWM|WVhh+W?뭷SRntk]Hp '|&q I?l?ľ1Ŧ.7mm# x:h4_)_ٯw_Oןî>:φE *exrX";#p1a-M|}N+# vyWi4+]=Sv8ٯj(+k=Y8 [ӱnTrX4i"VV$JE$ߥO KM/]4z-sRIKPLA4K3]fL$fo-A4OѱGԆVzҺ/W~"e [FoIQ8R!ۃCod Y-???2Yp|QAOY2k ޖ(Kf#U.~2d;*K M:*Oºwk.n|lz->IUioE)B_K8/Qϋ 3Iݷ']Ȃ+)9$`֭~ӟW;ji#۳]v]X o?5|L𿇴P`4d(kVzGeE}.;${3iU8W %VO2nt54x,_zω% ~b*+R``cTe8!I,^?->]=G! bȓ(s )FWYZx7sȱE:<T2I'?죧MUs \r׮}ȷ|e8jQY»#meT_Sރy_)W~^/կxJ>6}=[ZV I.i.X|:*>g%o('7^?=~lok ( ޾o?mz9w>>F+nbo͸ ) ~Fv]k~'.*i;s ڦmi67z?+uU_'?SA-M,|72My,f=A<_O_S|4uC6'lp 㢷B-uN9Zw ~3k_ư4{[ H]۵=s\)´:J+Wk]?ͩfF# ׊ BЃkpa8F\fKh4v>gif-チrxS֯${O gN\6qNuxMSB{+|΅*n[+='7Դ6%ܶkY?3{?=sޭ{hY=>D#d  r9 E?д"aIǗG5YkxR5 m%=H< ~>) XEchѿk,KzkxzR~t))5(4 (?Q>$O++l;OIҾQɷoo#~?>+0^hkeo}6/i'uM1jے A kGldAJ`ʼ,wqrN8&OÍ6[xKmcR"p3RrI+آ>?mh xDM4ۏ$Ea}gbǤE,q"I˞y]6_oBksּ7Kx|EIZ.nSx#a @?rP<;['NmU<&J7x̉ma+soț.^N;w(k2IJ ڟ`b\b}(52Trg|zbv)_P?W%ռcky>+!a1ɮOw; | 'g.$Hk{OYg$`is~EMyyq^Oww<7S4Yv9fby$I'֡?V:Oiԗݘ܃:g^=E=][? j/|#SO>,H茶W<^QeU)̭P O>/톓{He@ DzDu8WQCo I.=z/_~wso|/tB#5۽H G5=*-} Mo2 |SmĒGk0GS]x/#MAcڠm @ 0:WrzG|ZƯv7;&O_/ώkEls$aap+jey-ewoB2Ky;]( (N((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((_mH+ &-?#+'[̾6>)o#?2KYag1NK 8tPP/{?7tx&]jWZ>IU"BwG$ q̿NR/naY.0!*HXpqtP~<(;+bKa#Gqb$-g8.| \j2ipG{$r[И?vOG|kEQE{j/x_~׾i<nhe7ţbġKSxP3O`Z.U{gO_Xi'/.[4+ 9Ap'0k|  3ڷZCFuT{WƴU]̛+WS|/?[}c %t#|f+T {W˔T^J( eoQbqW_'&='H?_mH+:\_mH+: ( K6>ۢ됛x!~PrIkhֈM'Q|] Rgu62Fy_5`㿏j~6Ʊ$Y=ۃG'8&Wkcc/I wmHe7|+sp]6z捥O&\|^t]#],h4kP@OJh%dSmŠ( (( &g?q6ɷoo#Irə=nkͿ_mH(:(|)+G׬)o4oaI1028 UQR[I)&w_UϊWyĘt˦8ɺoS//Ҭ.4_[ȥOشR=BHP(i5fRmjni..&s$Jŝ؜$I={?K|!7F񟂦$Ķi~JC;K2)pp U 3KԮ4]NPwi2O ]X2Uhv\qzi.²NIo$KxW|Au0Kmcn`(\ W"^i֞0}ojla-u{K3La%6ҾDcȶ\sA>*x_OYV3cm&ҡ #y-<w|QT ((r$NK,*w '!O΀?\k>+٫dWM|WVhh+_o]&FJycid(x#v AE~MVߴoo(]EQt pK /Hk7Կ~Y@??|U8Ⱦ mNg3j:_[Ff}iCŸ1!}8'jj /N@5+ $YtP^W 5_kri6E]($=NaNyԜuBiKF}4mïk>]It87O[Cy=dےmtTm-ԤcLKv+˨i=M[1/K; &_ ?kM?F+S튟i>!<}Gv;6?6Fv dᔆ#8$/9uz|&˗3xֿws|#$ޕ9sϸ{,K_]G,| p_ G W5E(S[/z./fzGߏ_K=6RkX ZTRG瓞kS5⏅iJ.4O+%2aϔ"בR\rRA)_G|ʸ<{!3Ќ؊ K^I >~,%t|yE[mBRI>!|D_j'N._>%0T`*P(IEYۓ (#~jI(o?m޽IgC3j(P>((((((((((D?$?t_mH+I<`;'JG &-Y/S:( Š(((((((((((J>٤dUW2|(Iȫ_(g/ھk?yj ( ( ( ( ( ( ( ( ( ( ( ( (?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( &-ݯ_mH(:(((((((((((OٗMGzO_@/#>lɷoo#qɷoo#((((((((rə=nkͿ_mH+f#o+l;(((((((((((((((r$NK,*w '!O΀?\k>+٫dWM|WVhh((((((((((('7^?=~lok ( _?wzogn6nݽ?1֕YњM٢9S40/?  x#1_E]ژί?: x#1G0/? ]jc?: x#1G0/? ]jc?: x#1G0/? ]jc?: x#1G0/? ]jc?: x#1G0/? ]jc?: x#1G0/? ]jc?: x#1G0/? ]jc?: x#1G0/? ]jc?: x#1G0/? ]jc?: x#1G0/? ]jc?Э//Fy$ӭb $hK'g}+Ͽh߂l/VOSSM"XȑKr>Ey;:7 7?DOu"W۴R:7 7?DOu"W۴P_߃2xto9YگC$ C+^|9c=:W?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~JvOu"WΟfO^ 9#mF! Gمy0OEQ@|{%¿65ޣqGk{h$J8@ą$ Ou"Q?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~JvOu"Q?C':+(/to"FgȔã~Jv٧F "zo}?3.#ٳˊ t }5H,ѳn/uݷzgQ@Ux {;G5w/,^žQ^W ]K?W|)zx {;G5w/,^žQ^W ]K?W|)zx {;G5w/,^žQ^W ]K?W|)zx {;G5w/,^žQ^W ]K?W|)zx {;G5w/,^žQ^W ]K?W|)zx {;G5w/,^žQ^W ]K?W|)zx {;G5w/,^žQ^W ]K?W|)zx {;G5w/,^žQ^W ]K?b/{чׁCїĖd@Ey4*ŽQ 5?TWM|(_# ;?9@Ey4*ŽQ 5?TWM|(_# ;?9@Ey4*ŽQ 5?TWM|(_# ;?9@Ey4*ŽQ 5?TWM|(_# ;?9@Ey4*ŽQ 5?TWM|(_# ;?9@Ey4*ŽQ 5?TWM|(_# ;?9@Ey4*ŽQ 5?TWM|(t lOzdz?ڌ7~F7lwllgӎ:Z(5?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJkGg(?E_Q+ᦾWGvriUJ隝j:u})qouk"ѺGGRC+ Z(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((kvnk۳k- 8O,բ*爣Mi?6xjcN $Q\,բ*Y^D?Ug7ލ>R% Z' aOQ7ރX/Q\,բ*Y^D?U\>R% Z' aOQ7ރX/Q\,բ*Y^D?U\>R% Z' aOQ7ރX/Q\,բ*Y^D?U\>R% Z' aOQ7ރX/Q\,բ*Y^D?U\>R% Z' aOQ7ރX/Q\,բ*Y^D?U\>R% Z' aOQ7ރX/Q\,բ*Y^D?U\>R%[NԬ8.;'I`p? fXh|c<˫V($(1d>W\_=u#.V.Q\.]¯?Cv ?pxoUG0sVuW! ;xs]<C?mo*#{9+:+?9k.\ß6=}G.{ ξ?pxov =_sg?g_Er<C?mo ;xs]¯?򳯢\ß6?9k.aWY\.GaCv ?pxoUG0sVuW! ;xs]<C?mo*#{9+:+?9k.TXFQ($(+ |Wu~Yq?|_a@Jw_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥"W_O֥!hTv?F?շһ Ԣ(((((((((((((#~lW?j?I:(((((((((((((((((((((((((((?f_6)?GzUy&='HJ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((D_&W;±虫OK1?xD(?@ ( ( ( ( ( ( ( ( ( ( ( (>x?ZUnW jG`uDJ y^S{чD)QEQEQEQ^O qPFsmij% K,0N=+(zJP{R[=PQEQE?շһ VJ<3 ;ohR(+ ĺ&}wVlX.C#adp@4q]^W֟ so?;[tNMܫ7EW0̗Fb4xo~tݏjŻ8یzѡzƻ4,c4c&hvnqG~Ƈ5Z;[_x/{.|L(cf_f>`o[vWPFNr_Q6QR\Bm"rQ=*:)fQE1?{#Dz^\?4vR^S$DB2.;<4CMyRwrW#]@ZM 4QEWc<#9x[ŌNw86fq=$Z0ZIlŠ ncy$qff':j]CM/f%f92~Z(IW_F'ƿlh((.൵KbPp9$ִSp_Oo?j ,y:>svh:?x_Yv_h}]F_8~U_WEox*Iou u7ƒ"Gyhpn|?53i otMR%C2PJdGր2(\ԿdOx%\UokԒϓ!PbY eU+z7R[0?o^Ѽ ZۛDP*F.KXqN bxzj^-v"R_-r3)Bz}Ak{t9( (/ xZ^ V#jPN; F.MEn)('3hV?gSiu}RW{Œgp9^SYJJ覜taE~ /fm_ΗWjq!Fy 1rvDJ*+밼/bO_jK_~/,px偩-vr1}uonf'&)$R)VVzI)+;-㴐e&u0@b b\F.\zno7،^ipW>6ݫ\= ,TǾ+K٦1a|dyדO (N(((~bѭnbHA$F{WE 15cF1ZUvUjiok7tIi<ъRGJiٚFJqR(Ek~G>$|7־}Zd:dqxt=XRPJi&E:|L̢+((((+ο#+ξ'?;˿QE|QEP__\OWm~Yq?|_a@QEBA?lG/[4X @cviڕޏ[_X\e{m"ͻ'Sea A+ZSsRΤy⿯?UcCx[~@kSO6yϑݓnk`o;.)7'Z5~d8вWr砯@ih}&=Z^J ڬ H#qݣb{^X *oVeyyiYj+ !5)ʜ!+}ݞ֥H\u/Ꮇ@|Z5 |H\r24N3I}e~ſwA?i\ApzC5Y&i^O/¿*\=rP=_Zֵ}_Pyn嘟Ě|е5 T{/ue-+|v`?d~4 kאZ^RM/]B")`Ld`Ai*Nx&مJzΖV{}qk t^9-MĖ:%ʅpQ]jW:4[t.Ӎu~Q\WUV!_@VERJKD_wK~Jpm}:ܧ/4ƵW6o iqQ.q%[n# T?dxrTM{I-E$^WbY2vAO|+Ԯuo_.if#ҾB޷ :$Z5;#JtrV[_utNgR$nyW?Oo/?1𮯵leX( i{/_<x|^xoUNSk7vYKl|}~FxEfav(\/V![h\ <P"up!GK{yyI޶ޗ>}g_~_,VFRcBrNJ^duExCtO]71ASh[Pkq46F7p[`H} h~a_Q0q<ھ1'+YyYřy&SRV׵*'DK*O'sޱaX2DFA^#w/~Z`4ũrJBj~ ?f+I.!ye ,}ZM{GU|GyIYt:I+hJU5sN+'R߂mDm*t˒O`<œOCw[O{KA$2Ip5hZAi599X{|S5;Լ+p~.t&^F`ڢ^Dk_&.>( l]mЍqov B4EP_߷wK{xUIUmZ[`1FO_Z_#?3>o^<]m6ӓHx-` m, Q^a2o_x_rcT8c>$>5ֳ7V'Ul1=Z_XW9X|xᦅ}= ];Q6$%_q9WI)Ud&q9'fM+s'ជu-/Ke-4n6ƅ^W6~߳gȼa|{Zi5q̎o֒4_.~<[!+]7菘?dcσ5:_͹5T{W9>c_+ O}+QDgp\gf=C3χK 64/u! 0#Ү6l?=DݥÑLdJRVN^kScQEӌS?g'š"yCgI2x;g񎹭 5Fnt|"M.+p5 [^ԯindY䳳M}Y$s 5)k.%+ܕPsQ.oaxWl#tt|'C Z]O(G'|sw"_TF,7~VڵU Ku^7r|KI\|Υ:"_KVVɯ<*(¿IW_F'ƿlh(?W fWN-ƕዤk=oΝXa;y"0el0 pA/=|ArZxmjKozrɜQ|CxMw[UВMj4@?;~u }þ9_=Z55͏PL(kn>omqJמuYmg3;aP̑ +}?x6hvogj#Le%<>FJ'P_i xw (#V ?""i2 p~WxPe\}w{{s|,SmTۙ4Oٍr|S삇F;WgI$.6}yt"YK3 3$+> q{^H[:tͨ](ʹ*ƽ' Go~ ,d5k6[ݒ6ӂN5ړzݜz^:z^(#gmOaOPwK 3潴;ƒѺǾ+'o_𶦥o{l1E}I?]-CIH`l!>>Ʋ?nOŏ~=de;kXd%rL'">ú׋?nIdׯh,D.Q(Ã3ڢhIj^/t/Ghޭ-!)xkĚ]DӞSʮH#qU8q_c-ƐAys([n`љ#wr G7,qZ{>:6lYodT2$;y$nH9 zҾiM 5_^[sۈI]ʪ~P65Q=cmo=˦y5iv>cb#߉Ykk障zu󼻁@OxZ ~> ux5hD0<2}ֽ9֮?~$C]֑Apƾ&U%C]q q{9S?ઐqR4ɠ٪"Y`pd;G}#^>\o i<Z,$gi.6>yŒqaO> ,ujMߍі¾% <<{_pǓF{']Aw _0ێ >U5m˙;K_;-?Cؾz?c⧍̆+FKs5O~cCx{ƿ $'-0\ê_Y=E]̌pQG^qxgCgMͶX;i,7^[.?k= weOGFA q!+ЇHGN^dQ 75z~' z#^uO[Ü ܖc@k|I"3Gߊ?-<7m`&HHr3hoӲ>²iY^:eO+ V#_pvwd rcVSRO~4*J+n?t_vq b='ƏҼct.&=i}2FMg7s|+yoϊ_DԛRI{}:VS\h)T)ZO%Vy|I\LeHRLܖf,RQ.di'G9gf$OrIxBZT߭NrV^O_Oo_eYzM"2 S+_)DqvCi4fv`'|Ee(7~VM+s$Ϫ>Óv'R]hicql>!n]u_| zŸ7WT.㵉@Kȱ{x!69o־/]x [FVi5YmK)+FWaׇ;4][2ݪn#VR<ȧ{$ m~0q]|X>ӭ~7|cmW,Dtke=7:UAf/=_>u?-rv2x-woj1h$WAmA AX}=|+~'|5.O׭繱Ѯu(ESmx9$Er99Ru:-SJ*5U>6?b{>}\5?W]6-.hUm?p^i&-*$ ӿh5L1}Ht`>n,/ںٯS?-%h&:SG|=Hzr|EU,O?ێꜿG_ >0j?obv}.ݦ@yïj[߱OOFi$~n.ivmWfPA@pqf?.mX< +G>U(vs~מ< -?uD߳{+(}Q^]V>wz?_d|Gc _ %>J $"pE|]1z- F+;sHOk0ڡF!X +WTr|v٭m?tnOwOO|I/m[US[kaBؠ 0:HkjIn!k`ӆӒv$eZxG¿ľ/flfSć9u|;>V~(m#πhFN7)v$7aB^"5׭xW~:Nb&E(|'hQ"_=Uu+ځ-f,;HSiir|v61iKp~J{ SzZ{;5}ZQz(3 (?OٗMGzO^^k2ɷ(OI8Ҩ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?k?':wc3Wɕg$N&j2F O< +o>Zlv{f'd< 7մ ao QGk^*Y9Ft?"NMUs/>}N8<`k돎!e"̛ͮdNVH#zό^~?m}|r_{umcg?xS^j1~xe^Bp 53F]r캅ŎRC(>>=y ?ef["|!_ 6~#uhݶչTѱ #<`+7x{R0xǷYv3º_[V>.ĻM&&2Zv,LStYMY&YO3ҞkΧc+ԺM]8 x#Qlv_[] xY!,ϟĞ:-m _G>!ؾMxol7=W}Ԗd?"n jBkj^N)]ꕕK]^C>"|!>-Yl}@5M —>fx_Ch p<6#v24- 斏m>Ufnb f?/ Zʤ<䊿“\.ǜ_þ2/Sm>?$LdUfvȥmVV >O(֭|{qpB|`N?iFIM)P'ڽ<&OO5ڔa5%%_1xyʗn2]N? SևxGFF`Vzn?kV~sWgx?j_QE};DYɿx?ZUnW XҟLGu~tEa_EV} [7[חU83~=wK+\[3\(&k__5mGﴛy&ereŒ_;Ф*]O' T^Μ6bV>,4s%/"16w`M?n8$c]Jnb$QJ)^ d-5q(a ?iI+מ#4Y6V8U\j V0߱֐K}Qg"0q_"o7H[JۦDH}JHg-W4,~ӾBe~HH8bpN1m:K4k~leC$B#8M2u^>ɧh\3 VT vxSܑW~:?=7x;Zέ6" /+zdh!:ETNn-U7m|Jfݟow}o|+?šޗo 0NW l6*)aA[*Q!POǍ ߵ(QӵK]lL}1"(Wjeeo~Lu#Q2g5 ?~[kdM+G]ŷn 4c[ξgtWo?P]ivk ~,ǟWtPU}PӒ1 'W[Fx_Ὲ%M/ hz6D,Oe1Hq?y[J3\KZ>~ڭNiWKIOO_\x^&O6.&qlRT99 @^+_\|*׾)GiI{]fȚMp(+ Z M/.'ς]kl((~=xShor6Wm=w3YeY # _>Wr(+ ES\ =\X s65 pI]_?`?Ŀ|e|}>XMvY$B%K(/I'~jQVӹRGz֟?lk⿉mMŗ1ksoo4Ԩ/(~UɯPg G^ <=nP;OYnN `O%$e_ۓ}kcxxS^Ax8UԻ$~; |-߆5 HE> .kI(0 Ss=kZ*d'ͫ 5Z8 D#Þ OWHWa1\~[< d9Z1E -j+~Øf톮yu9رY,rUWĒ_v^_j>_;6 d!˃$O*j(j@m`O< {?h'5ƍqIv3F`crosKIn}kટ'Ŀ %oEg}B+Mv9<´QI+7EvI}/7 9eF|XtC7o۴cLJ>~ԑ) icEjm]0\ (>Ze(sACMv/O8] x|+llm|Op-*d=C6*K>sĿ<_/=q= ]!b|PeP5d^=qJьQ[_E;Te&8n^S"sI=?~h' ߴGmsߤa q!+$~PTz_ QKDʬ⬽7W]l=[ޒw~h~I>3|;=Oz\ٳĒ4E$io4ҶkNUog/YOhSMsq1+]1eBd KhZ٤f}9z5rǢV_)l]mЍqov B4EP_q~_+4>;]:+m[TF%UAh^9XKo# c>]ro×">V 3 } ?xIݤ CƯ}rIv+H' |gE4D&w]<~n]1eBd*9J:9okgʣދ ]{Y|+IG pF~dAlpN+;Qonk)Oyawyn<Վ7|sܡsHJZ?#> G 4w{ e8;I.:SSD ?S'ce.\ƥlŌBKЎ2W~OW-,f<8ڬP鶷yo1_Uv5&ex_ fSpIsqn EfVgW'i~+8?|! FF E`aW<n斔U%Ӳ[GL]:]%3 j_M߅~wK=`Ks}@|=EyGumWK}\Ws 2H'՝_m*xkQ{\]|Ws)-eA˽Ԑ7xⶇ;ž!oa OkߙV ۝¾7ZP_-/9sT ( +5{{_OopzlkNƀ ( 뚇u=[INY)$R)ea (~9|C>/|,.}%/OLԋ J )q?نGEyktB)lAtG6>)NeȺ$C)F]JUwsKn6FOh|֗fn #P6gMyǁq|7f_ 3iZ֝(ʞєAS5ߴ獿ij~++k8=*2Z[p72bK1,I=@Z((Ǟ=OSW_WMqhDcƬYA0+aGzOYzk|9X7Q5GG ~rQU)6굧;UbTW-8굽n{5O¾6fk޾ڍ}: E˳w *qƏx3 /ums3=27x <"Tv鸯#o_ScǟrML,bT*>(A;qvSkƟ/Ɠ= ixlc&%${O1 meES_TTrM_ V-|75UI_}O^u~Լiֽ᩵Tim4Z!F*v5[,>#xVhmdiX*"bxMstVeYWfr'Ilܟ} c}Uh-u'Ӵ7t;R)Y[b^%}_| >(Axt8~ˬhw˩ƃ ;!ܘd_ X(Zmy6yyg5 ?3J}kW"x5;'֥XƛKZ=+GGQ/׋*W_fIOi0fGUfر?9hJ[~-੽]WH ^*e?|Q_HWZ"nV3'jn>ÚOZ=doſԈ_ gKOH.M_ȵeTbPXa~S_EYJ]{-!vI}ڟ&o/ xH5ִ}Juܐ  P/c5i3yVHr3 EZ_jI~e/kM3ů :$ڦ{B`H A!|}/Gwr&N#r6Q 0~r[8P1_,QYrHhoIߚZW>OIYxSy-4裻]4pn@?tW? ]'Gﯮa׬fAqFgf<* $"NՕnJfz>>>8i:ѣD𞯧H]:\iWC7?y \ʞxzG'yȾ*xQZ5M?7H.6(\ Ub;6sG&溤c,?34}gX+clۤDTDs+ſbߎs_ΏOWoipʪwv򑺱AC |yES)OU$גc9[k՟eY~>u5 vԐMsa=+~7]|.|KA_N'_/*2Lpe$G؟Sxo9^$A%Α{I - :|g|+㏄?.M_b"=Lbh ! +F3$|EgN*Wܩ'-moL_OZ"zWu(u$7Os{n#ߥxm{ᧄ5-Dx%y$WQ*2s+ŨNQ\^ÉI?Hh=-|7<3?Ex[bp3J;{|YCk~&e~ ij($<:*e:qJQR嫍QEDQ@'&='HJ5اUTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE⟵;±虫sV?5|_i#i'oȞ?QEIjM5[&Lc_I%mcL~Hbr7q_$U?V$i,/n,adL_M?S,&*҄g>l$Xc0=xm$uK=A\Fg,mGhC8%8no? Kʞ\WE|dns{JlUx Sd\CV8+7ϭ|;XE.Ek'QYTS!.%y$I_;VxL[_#9ǫK2`1/Eӵy9_ko_, >{ZQ۾q9ÿ[k9'X\kĞ4Rlo=NWp?|EV44>SwM?&W3*utk4i'{Ή oY/,툒 7O8<RcNm`ab 'xۏڼYK MS9)$%Mt0IUug8]Z/uWgxN_Z ={< =T(8oa{V喧/|%ռVzIV}^aڀes1@ͼ`@+xgtNITMKVۿg__drK V*uq2~Dqٵ= ΍>Xa[810H, 4Yb;rI+̭ʵL=G{(+ϕ.DC~7xZ}m-v,F$$}~>yoMv,*v:7Fp85hi)¤nե'fy"TiW ʥd=:_ɞxkL^$O2V5o$d>pkfWoFkVtp#d.7@\WQBΟ5()ET]wSӥKNjz_ە9v_o 7ƼUPvv'ym<|Ezm[o[.YUZ+%7QrK+KwlW~4קD/t6 F :;%W)sI˹ҧƚ(4>x?ZUnW jGI8qҾJuMQ '4_0$I#ǣנۧR?O|3/{Nt1DrvIOR}Mx{ tKFE̺JgdX& z?BAuMVNj:R'hfV$ DkΥeUUb}5_ ~9|5Ѵ cQف!~,Oʤ6H!du,FbZwMZ>NlϠU-)x^Nufǰ.M7¶?~ SҴ:,7/9gf$ tk+`9U9rdgND}g _:~p!Ec AE:e׊,ukT 2$<1v-@Lμ%G>G}4a+.o~gy?f_ҵ{٥m*M+HJ_^Zӏ`t.c`y)#_QW[Nr={Y6UyߏҳbڌWKx&nI>!N>+Þ&[e#pbV+UW\ץT5R._/_ Ş.Mz17?399xEViJ]88/zWl(5 ssOso~Q_|QEWg?__\OPQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ [}+_>Om?F5(((((((((((((+5{{_OopzlkNƀ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?OٗMGzO^^k2ɷ(OI8Ҩ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?k?':wc3Wɕg$N&j2F O< +((((((((((((go#(k/7ۯZKY_JwS}Κ(u>((((((((((+ο#+ξ'?;˿QE|QEP_Xυ>7O|j>l3kcJ(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ZDoL_?ᖾ6j:(ogk)Kj?!O9xne_Э3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/??x 7_%3|`Q'/?~(~-/K<)xcfӦ}~1Wvt3WW GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@37%7r GuQ@}<闚/zvi=i26XdKHр*AA4Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@CNz+ }/OԮSFPN2@ϸZ]o5 ͱO:.Y%웋EII&}OZ]o4µ k+P_r=xρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rxρZ]o4µ k(P_rx>y)/'m#*FFAsGLo7kiK+&8UO+Rb1rc'jRr˯S=#)(?D~]Ÿ #MG)Б?E_ן#H n??OZ(Xϵ_{BGSqW-WfS9yn[6#+ZEWpQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ts\o6TwMhJ*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hVGC*Ci?P4fi?P4iZ?YiZ?V@hṊ>T&޻TQEV5֞.A굻X~";րpG"?Q8?h}*Z(/<#cxG| pG"?Vw}CMK2%L/kVXAqJ*{}ƏG?>VԞGړѫ?mOYSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpeOG?>G#ojOFI{j}Õ?}ƭ='QVT~x4?aԞG9YSjړѨRz5ڟpe+ 2#cY_gy+~ZQʟXuqe4>OQx"EX}/ȣ4E>km[Ճ/jޠ(EzwnVN|5 (((k ' WBh| *BLQ)8x=3s+\$B~: eAZ֬6_\OˆEsu DF dOޥ.~*د4́ìf*s1ke.Xv;XG+MZ.n|A"6A  < - ]+R lMFy5_ OEiZ&22H6X~g5\U" R9JtڒVG6JNQI5QEs?Ɠ:׊uͤ6wpʨَ޾*F(Ri$m:I]2kd:ij62m:`OW/1|gL5l_HɟUUO\$_wW&OK!Ǽ}]^T1QՇ;VOo@hAie-1N aA<=jVv< )y$($__-?lgo/ÿ:hʧd)&ӞVGҎ/a)ZJY&VqU?AaQnfcIXGմ5.O{yUN FRۂk⏌No C^W&#(+wt$r*rQs,DN*}}7EyO%ֱ]gDHIv)(Z)( A +3R6̰sr"!;Xet =A%I7dHI'rIAqҗTA0ϧIEc-ƴ\RN]$ns[Oa)F[2+y 1䑂ROJR`3Y]Ayv\d|Ft><1uGejMx =k;4ҵiugL̨~^8?:˚~E/wԫ#ڻo) :{{Rڦ{V6ewvRA+\0phV4iL0t'^{E\kLӦ6:~Dի{o",sz )eЏA VkÛ#׾٧̖mknyzgG^,xg}ڷ?_ս@Q@a>Zܬ?ޝk@QEQEQEV7x!{#V#H[4P|l-ePO98}u x{W/$P[_ x{W[Y>l+ZՓ]ˉpܯ.~*د45ߵ/OO/&%CJE%xM^/ ^:@Xɫa__9}c= |a|xٷ%dWFWHԘ}s3_v'7p3UGj/3P~/OjYNwlavOdpd۪~rE´OZKTu8p>/O!^uHɼ|Q[TIkkοi7?+jI-|Q#7#l7_0+ K&uc ʯJHG⿍e׃tM\ cqMێW3x[pҵ[OUNU׻4vWXצ "&@ȇ)ȯ&\EB}>T-{Zn[{_mEWʝP qlQnv7d8TՑ˭bzP֣O.9d݇'|l߮](v!լ#bf,NO!6Mo͢llL\D8r<`Ձx'i} %~-髨" F|aGa?ho|cx/>"nc.%ťdY79§Τa_5).ZNWz-5~uRqՋvcvI_OoCgWi>)!NI8 u Ҽ/<g{Aįa˸rc? 1QA⾟NO\ /|RFN+X~1nvǠo8jֻqNߢ.ucxRT\;s^qݡ uL/C=jOIs#-Ⲽl4mMrNNMyw6Vj.ygK5{h7j@e̲ͥ/@Q_=ۿ,?lNG;=:s_KmEk|^N8g ~!&Kook,,۶ߖ+/K/G^|~5QnofDH% brAmMM 8;Xq_࿁ soέەuH!{,fe>ZA.,jKX۫<"gn+j$#[M~gn&yUb58֚X^&5}GN _l_]w'y`I.Ѓ.Wz+]mU%̶%cq? xn&s:BZdwC?!kV>"R]q6uýݼ2̓r00Hȯρ_>"h?w=/̃q@ѕ[ I:ʛjwI=O#g2i&ӌ +{iݨk՟;9duN^?|-i5oU A4ٶy񼟽zv+T]6} T(߃sxR xQ 'Lf0̦F[zs?j71Ki|^Cjqg/y8=JT+W5I'iPVTdD]c? ?m{\'Q@kM;EEVA3I_~a%|(|7h%ʒBpH,Js~_ 5M/◈|&\+F߅y`÷jK ׵6xu-I$r/)>JT'5߹ᰵ1X55ikwջK2ZWu l}ԙ(ѱO~^3Pu$?l>|HX_g63zc'û_ CIk, OBOzGz[eƚ ]#sFff$= *ur}V=ta9Օ՛K^gsV|@{qxsW v1XNA21_]|J=O_muPiTvtv|N~˺/߂߈8f}$΀M.\?c6׼Q-gN.PQN7.Όi*qpO;Zh<ޭI~.4*$ceK#аܱBrk5þd~[Ǖ.dQ*dn 609G~ 0|CxoA.1ڸIqQwv*OO FiRkmne:_%~KEgGMOS^?i5KO | u^#_^B]bC&ʯ MVu" ذڏ·:m47^:Vڥ+,%HB9.:e(QȧV>j\hK=O}+ê^&<>IwTOkoz yV`g}ڷ(?ޝk[/ӿ?hj( ( ( |yxOºmvX*`2q޺j(eo[ M4eb 1*ׇn>-gC|-IokiйWQ@iq&lqWmN{]Y>l+\ ڗMIZ|'|%.g[u?Kmwޤ.2k|#W⿂?c>RTm>[}BQ#i_>bB#kXo11Z ٻ5x;eUe-`/%_u~h:~? ~ξ"-ןlwo˰B6zć)&cq>!K&h/ m90x$qCZիN8zBVRdWnvݣ U{?/kwâ_i X *q!RX/9%cjql3_dizeiXB[ĸHE > O`zX4^?{Mf,.^<)aIEOYISyKO$I#(T%)'w~W?߇'|Puuc]eH-W]'8- x?1?E/c O`zX5K>IRi8iʛRS7GHu+TJJ? ?nڬ a~+Ykgh'?U:2m;zufTIQg5y!&GmSI%'au?Y|F#|AO5 9WS-ۉ'@|;@ oRk" |>?c z]֘naDq㨯)f5եBo?i&{NQmhJSMu_J_6nTU|c|#c/xF^3Ԧ#dy_m{[ME| \OYE?wD]p ⾡ij ,6V{;}t^~0|W,>{oo4r2#SxQ/?j/ x{ xSú%ǑxFw_L{ +:tW7*wyMSTӸWsI_όeKTתBq` z8#5y/ݦC5fk[9[# GYhJ*t}Sf89bc'(GVktC?5?XydgƲ$H^4㌜ s+^"%ܟof^jf V5$&H~|k񦣡ֲsu,ۇk>-_}*-6;eK;~G<08iQԽ-͜x\Qzs7m;_y;ԟ/Ui^,ѝ$%Q1/ eT#&?ɤ^|0uN5V[r`;.OSA_X[O 7Rqo{uljVzU%NRߖkg߳]G]75m2ZnXn6\y9~?×s}]nlov'P@b; GWQW 58Stt5aa+^ '!w{e[m=ļ c ʧgִ~Ϟ9(+|_kKmJ/fhE+, *XK1epqyZ Z`ڶlvvc? > |KԼMfk2|7b::4WLƤQ'[ Ww{v[P{ j>ӭo++ dpĺ1[I]4uE6v,C"IO?ۥy?GmF f;!DPA:̌ΣR&=:80 VMޗ]6FG]: kJ2 VVrTWCߏkcEռ*{\D-; ACU-G7kt߆u W˓V"t &k+3p1O*.д[_- rF!GEs_uo7WhyNA^Eac}[XxHmc[_?fj‹;O;U}WST|̹+I#/gʼnG~6|9eH݆X6W/ª5 (cS]*ugo즭it1| z#_`kBViI'/|-zA{)T Ve<2Od>>|r s_/R\oU'GS'@ FMμ~y+g_(ox w/Xٰǖ1b<3ok6It2X?y=2(><;#_QbG_^;^д-JsOM:n#ff0'^_6oPEPX~";ַ+_QEQEQE4u/G|׏i#3[tP ɹt as:(A3s\~L+@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Ǵ\t7_/W=@Q@Q@<3m[Ճ/jޠ(EzwnVN|5 ((((*7w? ʧo]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z(((x~UC)R#82z.{t$@kxcKU[jQRL6К}&׎,UӴ)!5)FQVXʌ~Gw~XZwJ(mBv`ttx~L+W*7w? EEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPW_/W=] {KUPEPEP yV`g}ڷ(?ޝk[/ӿ?hj( ( (  v)1"3 'q0z&xk[Fmd+F=_xhM6Db4̒ ׍G|=u:iW~$+ n ך5/ K} [Dp Ls߈*|j!!`r8N{}=A3s\~L+@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Ǵ\t7_/W=@Q@Q@<3m[Ճ/jޠ(EzwnVN|5 ((((*7w? ʧo]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z((((F`Y {Vuk]'SxW{a\9#Mn?&oO h((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+=p*((džͫz|3m[QEVN|5}5Q@Q@Q@W-wϿ6vÓ,Erq[B,ԪNz7¿M}:}KUoxTo>gy[)t~L+W*7w? EEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPW_/W=] {KUPEPEP yV`g}ڷ(?ޝk[/ӿ?hj( ( ( !+}M\Id#8I9=(?nֿ^ ]f2Ēo}kZh:aejŚo5yfx,@ {oY[i|=հ1PA3s\~L+@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Ǵ\t7_/W=@Q@Q@<3m[Ճ/jޠ(EzwnVN|5 ((((*7w? ʧo]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z(((+RӤXH0p4Q^+\״=FJQ, N]mjLK.=>QUO jS7fAZ+l常 %/$0UE$x-ygS&_mKIdxXv%2|lbxS}UV]XC{j5Dl08<+'|]:jw6؛6k;' C5`ҴLepdlM9%z,.&u+S,/v*%)$;(u_Qڏm~ƞn?.~W،iʬ׶]tZzT]L+j[{V1I"%da5oI6+5 md1g=I< MլuQs[[TMm*șFT>4x;C^ bmIuD7?/zi_|!kSkQt/&T Y%~^8{ Y|ΫUPvq͵量f|絴=b|ASieticK(9$GqZ(O9׎u,s\67r^=~oy+oEJQV$ m$1- ΀ngӊ{;\ܚi㵅E$G`u$h {}+\u)eV_RH9.Qin+QEf0(WvhljWht-bP !r2X|(hp\6%եr^ Yr;H-,^?թɵU/3[ݺ[x\6Ъ+GG~(^͢Cψ$wrT9OY^w9.3!}WRM;Q{J-n:hx@An;Wq A5oq)4$7$e`{:Nq{\F`Y {TVp^F^h@pZ6 3QgkĚDwZWvs[s:vW+CwySGmoi* <Pzņln4{p uRFyr_3To_^qikVRXqd0 ze:?o h!PΨ3jW`Ԏ :*]I%Wgk.mB9d=F`I8M|'n',kQHK)oHAʒ90pi]|G/*Q_*MS}3xFnڽW)~DZ^[&;I!p__? |Q"mOՔZߑE p$RŔ6 3NJo|8xgU<{^ڍ%k+&L+"/Qɯ{:ʲ\:`gK/[;KKLԩ6ezu݂cc~5xzvjkG$~Ubk#NsNQiot\ڢKxgH$&8 Aޡ&=T_[\LqWr;Qfz(mG^]\]$Q )ȲƮeYNAPEPPAan2U~+SH'5 m$ <8?ʣx~ſG[}7RQy>;tF6RNWSaUT"SQk7Z䒺0Gv}çzp%d\dUWc ò|Y5kL_m$T\ @A X|pOWݸ2O}+{=< YԠ8No%RiՂ$QEE~Oڏ?WCkx/%3,c22^kq*BiGRqI^ۤ*Tu{?I诃~{O"asisj?Ζ" !n[\64?^VaSN.U_!B;+^)ʐFHh 31u$6 WNx:$M|ii1m-nQEŠü׆G>]vkؒ\m-9TŢV`h9|M 6uw`4,h2p2O"+F Q_-M?__6Wz6^\\q{s4o+R~},mXm'A&ãPG?A~jwuib|՘^ۣkgפ6vsɟMH 8iP}QT5{LuM68'X>byb/TtsN~ӦjqZL}2D(Y+0 *ku{s c/5ā~xOEVA!5{ TG͕M봜U*sqsQv]z J/45H5+HRͧA3 {vkRak^cSNOeJM~E{ncVIv-E^P,-a +sr [^4Sm4;QX@X_^v &ى,zhKQs OV@~5'7?~GcXB[8DQ=c\׼4,4O om űmԫXDq\ؙkHsbaNsEWmuKeݾC ⥒T2:/Vc+OF髏o^Vڼ);M}ͷW17`68־S@#EY=D+sr|U ZňܓMWjosTPApαM2Gֳ|Y_j amiːmbFcis%\[V)bTd8U:˲F]kM^xr9JIl%%-S (/xSz(St>.(Q9 ҦOd6Y8TEf'_5ϋZ.|)2.Lg2OJb”'u#b <ӛ۲[Q]ǢTuk%6m`edEt`!_{XZf"n>xs0`}Qa$a־U 8W2S}睄ż\8܋}y^^[quk>SOԒ4{]l'uL~4ρ ,> |9𶙩ɫ[K,u(P]8{^Uv߯k~үQ-kzu;)MfI]cA՜ƪ^knP7' TOGJݴ:\ܽES5?Eeo"fڲ]L>եuUV A]^u{ӭ+XK3Q'eeZ۟A*qאqEWj |2n %1Q@VT*->6avtLm'4Kr\wfTuk%6m`n>!WILf!hJWŏ<xʶ>E5t`*r<+i ϩ_[i:DS,K)x]%lw][ݖ#]1]θMI.ZRۨl2@dK1 dWwc|vx^^\ s-8MYJ0n ؊Ӝ)WE{_zU7=A IV-r km4"; 98j✕tܥQT-bE {32Us"Mլ> Ͷd\d*W2n굝 eZqmk;N/EPu3B_Rm4oS@7[:[QWe*kۭŝ7ve@~qV) +H$yRcR$TTGKė+6u_l?|tvXxjbEG7 VjϫuMROes %@dTvz֟\Mok}ms<' sX |..m%qe۬!1f>G?6XJӔuZ_aW:5(Rut3+*Ś5.CZt(\9Z=5%-QLd6GXQv8zYw4=bXk:} r8I;6I;6kQE'NM2v֟yy5p̷eir,u3THlKc:/|a0|esPk+Δ;ygFWvQYxJPk;9/9Y1knzMEDP4bcȌ Š4yu_.f1YڽxwF]@ȎUQ&\ +0}OZa&kAԧ{&־AE7qyhic(b_iap߂%&[<+#gg\&>iIwkO3NJ/Zi;+omKᴷ BR[ beI^k⮇g&mn6ny3vD~xR -Ί85RwvTW>+`74u;"4Wpargįr| glu+aWVѸkerʟJY8%m.sK4 *2nM]vS+؟ #-1 \xOli>Sxڠf1Q3W?0{I{ \t^GEQE`Wßj%>ge`;1 rEL2a);$oQ_g7L]_j_`<Xfhb7Gy(f:LѾ6YԛlzHF@.5U`>9ڍdսy%Mwc*+[-fdG$g*FA"Եk-Ͽ8neX>$ ns.rOL,5 u k*ȹʓW(NM5tTKu LЬѴɌ0? GФDԵ[9eV"-FhrI]9$٧EAg{o[Ŭ\vX\:Ў $#8hwV ^KgmZ]ş2V0pr`W>ͺß)mN][6Ŗ= f P9shʤz͇VWwt }Yq o.@&aO kZ$}:kHmی_lkONu'h"X"m"+J<ҕ$8tU9+IuoS6W3;{r|Uud_ |q1}KCgh$z8ެR~N;RyOֳ]Կ:޶1S)]NI}NF>4F5̪J1JoQY3CԆ6èROA^{(l?;k?-B% $QeQ=/2ycVTNRqfiЅ)ײ_,~3jh׶aZe|1V?iOO5y^HmDc%Ug#0^qKg!;N[+?_TWsD"O[,ʌ4]N7641SK޻r@p`TeZy90%mVO8fT' CrVOw(?+5_##|ڑb92z o.h]4:/N(nV38/ FF7ھ2f(Idߡ'0ͫ*/GocǞo=:UӵTTI#++T2C|uS#5YL:nm%-N0rE] U#(8]ԑd+\.Uם6Q䂝8w;jJqWviOj+limfYT0%I{_!KcmWUfiKCtCjڢ&Ң+øn%g>4 4*TM~+Wp%w}/%hؾ*س;׋+1{-~_83 <´8)e-9SLtӴ{ڈ9y$ov<=O_~?f߉K>:&b4w/HZ6nx1BN7\, \;;jR۴~XkM:yzCW'dtOg9<Ǩ/#fj&}/'oOVtMRO>d6%KcRA d[{⿇~&xᾯ]4Imf6=o9_?$2pyթQ-IS+6ʹg{߶(r>f Ejwk?nI4S6?*}LdAmS .|HHhX<ql? ⊙mlW'wtktI4JWI[m=: jU7 (X_Rφ~GiM_u25̠>W~cο ?_ |a#GN+7$kiI? }W~Ɵ+=sԾ8}[5߉6^?|1a} (TB 3!U'h`]8QOCU~ G᫟w-civkLz3 _~Оm^ /ZNa.#@T.ą݀J/"X}Υq~"7 ˪\Cc)Q(2iF8FZt"jfw_ a|Qq@ш&C]  9m8Yc/ /]ԾPx2X~Z]C}k ͼ5ȲG"R2 3'_h?>I5߽H6Gq6qW,꺔+§4%rN+h8kXƽ(QMYps x)2a#xj]`)2Fm$$~ >>|}dx$|r ĢUpV;qpStE5tem+wڗ5Zk >K7 ?VfF ?hXe|:gzLɯ_wm?MڧK_9&?ׯc646[֕G Ԓw喈p*Vaִ>wx$pYJ\bO_=ľY}F\Nj7i,~S[!yϭ~?W7? owuocpAPNv5ga1Κ[ѻ}ԨӅٟ/~.n_оx@Huhk]<,37fs36B.? .p]S.˧RPne޾6M~Ϝbd50,mHSM*uMn+|{t1LQl0dvm僱bK{O)Fn}nƼLYu|tjd&Km&U7z?!W|jtZV+İ>rN#ھG9ħ-o?MkoUIQbK#aʳyAr97ᮇ>R;uȢiC3 q<61I}aGo2'Ptk7XrGӡ"*?2iy5OdžmIy` 00w9G&[G,!MF\KJPˮ[9yz/i+7Ő&IԮb*ޤ+1U|/3gcTmOڻz/<˯ zt: RP_jlY^IB!Ux 8mx"B<-Oҩ5pWJ~ֿt9e/KvNqkxʶ"pi(SPOus~w6yl?l9g Z?zO}im@u]ĝXb`^ݦ%C}kk7I>>%oPcWb'tF&ɪoޅ<"wՒVMw4ǫݢ>+# +M+ qkۨl+@I¿"#=obn+M6 SPY4)|Ļ%HcӚaዛ7CY%ZuWRʵ ;dWRV%mKy6Ato _Dοf?_x_—Zޟy>#G,V8Dc9'Pùթuʗ"]ytBU[ex?Y8V>7xoCNFFo>;D~4`{_? <7{Ě4:tڝ2lubq) 53/ڻ xW_#9u1.dIfR߽qe\Ec~ĚψVwzXA̐e1Un5ɣ19>XIQ KI:j.SF59syͮiRC:q8Lt 9r48Zܭ:٣%(n_R+?~]Ķ~-̖ۜMol,j`Fw%/ B,Zint rmc~c$, 6>7|>&_S t' % lW~=Vt捶}f_kC7k. ڝԑV$ e9?2J&&M*N7K(?j[vަU)FeR?Ư~ƷQhu;ID>o-흤d%mNh42;66UED*Ns|UY4G\Ewl+¬8 k+lMU^ }!B7+S#Fi˖ ug[U+Odo;0iCKVԴm^x_% n9xR[R1w?M= E1+ c"aSBA$3wR5c}uuizbh]:\|ΎfP2׌?Ms^,f FiՄW~%{ $ʼ|]O(tjQ+ҭ _buy7H"22y>[nsВ5K7Tޮ?7JO& Ib8#"5˱ٷr~ϻl"5vQTzIkUn mD[q3H@"3X2A_+l-rUEQur?uS;Yu'---~t\97 ʿE !ρVUxOJjec?/z&; ai-ӏUD,AZU|nK> LAS@+ڒq#)KtC\O>?O5MJZ|K?ZNkM OΞ!x_ʾ3) 8ԭ_ϓ_A_|(~)nAkyj!D bYz o U$EIk_\|'X \Wj*F:t8>KVU2Qn>.χd;AO/D\ɻ)15݌,dv߈~%x7Uήf]7Rʜ۸I6 ;Wu}Ze^&kcl"8d6i]z>!~ Rj$L .2-ۏJ=ᯌiMi xm+OzOKS^P͖`pWo+=L/KTRIyY 8+IwyWO`A_?fx {-1#kjm=´̹6@*ǚ6i>σO8N(JJ/t)U 7jQ_&д'½6)-*nB7)g~WG Gc=>c;׃_w·jZƹubvְ8tU=FAo_?V׼5 :%9yDPwr;Ja~ŗU#-ooՖuß\C]I!nD.O_7P^ڽw>G-؜Z7wn,-j^ ww2iW.~i*;z^5HX5χ th ɚ7d b5ps[LYcG{C&Ȟ`?c/;}m.,5X}V$pA$¶3-m^ߙ x(ˬm7ndo'xuZXɵI6JT 8"W~ώFYդZM$襜89y'5}ཬ~' +U.Ee, :{W%K˭R;i3[\J kL#O:Si6p/O:5zi+zh=ʾ(gVԟ&U|&ڵпm>[Bԁ/Bdı6niZjbT䒒uܖ+3$K\g[]7O{[QA's]RQNOd|sNE_t( D~d/iM&kݾ|1=E𦟵 $`vdOj>+x㷉mVIB}H?\nF8zq C J4i"|Ko?K˭GM=4{Lk`_6}?{iTɺ@TҸMASJ4p{z)ahasxƄS6m /[]g?ğ^[I 1YD#w|sm6+o*;R?mVN5ҧَa5UҢoᦾ5֩}iiYȎ;X@2<';v/'|I>kV}>#dB8UϠ2=W%f41MՖ l40˩ƞ# R?gg6sn~,Z~[X˴S&vnN@;UO~"w»+˰XѧylC9}i F㏋m~|ܫ};Hj?sݲM7t/$MGFK&3Uf +.27Tv蕶'~}r }M_,8n7sᯩ?ܩz#ɿ_G(($(:'k=('ĝsNmWEjP)$&:X5 Q2ꫩ1ir2$]q^c4xUY5ͦ,3D&ݎ sf~ 5>|XRY4=2`WbXVkm|3 Qb^Z +jodwMOY UBHGp TܹdכLcëVDx^,g~.ҢiRTܮ$(o\?) ujμK*oe]F8ОIUaʮN?B'L='o5kZԬN顶-1wd'r>g#SV71$B\x/mZ3zwXZXztkSV4uX%<=zJ燽{>״{hzwZ[Ik/pJck_ڃ1ྷ Ma;9-!wvtF;1_|Ͽ뵗E^gW Rsn1v- J*A9F2~?mpڻ/^;c>)ΏK{8 "g*3\o& 7ԲP|s-"o)ĺSWʞ^/F劤7;OgjM:ŭN\Ѹ-?NᡅcF*mT8eTRIx8'|(o{{-*kF9d$m*AU?ٟk־&|е39o+Ot2>z>$Ӥ^*l$ b#*p@?|<5JXPMO^[S~Nh[Mx>VK5)mCx6 +b='qs < ~~(<0 H%A8뎽Io_aOٯi[_SsQu>++>-aȟm_lWL?s_- ?͞.A">g!kwwi/ m_hs {OA.z//FE]s n-Z&{mF!XIM`GagHeoV%Yk럋W eurBx[^~K6UmǗQa*⫫ԓYX $gğI߷7+|;r2B^e A?), VF|Ia? _'@L5e3_8KflAʐA t(ePI߮3L6+$Jե}uW??4oCgG;GSQv8~Cq]Ÿg2o5!%HldB* )g=D WlvR$Az{[fVt;X_aJS+0t+1].N+M'{$nw~9u_GFچs9xn?y]YJ#zjVZ^@:S_)Ko j>.ƽG_CM?kKV )Cu  V*2 zBۢo{zcii FItMn׌߇Ie\J{ rE|x7Ru\YԵcnD03XT?TI|l>$/uۈ(G<юχ4wMM%U}O皵ًإ_ }Y_||O>'x2V4=GQ\;n+7A@}2|1\@Gh<׎վ!VZ2[6/7؜%9l-{_?a?sឫCGlڄNoQ8o`sʶ*G8X~-_kֳ\I]9(J:d wP9U ow$?|͵?~&`D2kV (asF]MB 4 4?.]~ `>W*0PxGZnX~#g&ь)[Bl5_ ɷ;v eB.GׯZbp;[em#e{w;oƻO xo~SmxFqd1ˆͽ@-ZG1|(%vd7П\ FGuB#DR>9iW[U⥆jIyݝ/A)t):K(ԾO1ltڱ⾨l (p0ㅣQh[nτe?/jp쯄e?/jp7(/ri_QEF|'? 쯄?]WݕS>oYKҙ(F^Gv6qq)Tip@o_[e2k`"@QP]o(}R[m6y#vgs]g+Vdum8 6LPwQ,1֫joF5$亽%SRj'j'%GGn# [Xlma;{xQc*"c_흭xkQS];OL$%glI‚xCSF=;$+kv u? lm.\>iwvv򌤱*$~5U07tmssNM9Fݷ#S6uƫs_+?^!YϚ(2.(GJ]KDAE|{ gN#ev;dWu?sj׹Y^×; *;i-DmB=WE.Z{:nwm>|V" {:Nw֟{GWt}2(GR>5>ῇ+?o_\]y]L9=l=AWHBkv9#7Sԗ/+ב泩S*7Uo#go O_4h5]i,$v?ta|]|U4Egݭw^'KV~%\],cI%C:3>:g +k3J[;) _+7evq`pqXK'nͳGJ3[/ Zu|ҟ2Fr UPpX\7/#źqd|C:|[K+"BQ[)K<*i*N_!xŖ9}&5鯶t N?vds]{I:J,V4(pPn7O$>8xgH.cZ<<EZJM%ӌJ2ojzGC?|OuxjMQlȞ[:99k}kοn>""|u%W8r:ƈ9Rn־nmSdϡ_Ǫ[&T0$F: 1`06n:h^cʛKM7z' /kNMCN30cMp{v ڽƳMB36-efDWFQAd,_K~_MūWT?S 7ԣzoqf@?-Kxc?qf@䃑}?T Q_Gg7ӿ_a^¾mt9čL?k%2q3/mDA5Ѳ:2=A8;ʾ%'B2Qv|I> >W|GuxK[6h 85ƭoc_zmq Q788 )8}W~ԝ6#*3c?ccGz>=E2QH2&HNR8|  CׄtmCNiDτ sW֩*pSqF=89ߩ5O?!ω.]C2.IetN͎}', O#@:ҡVub88;~VZU)>~/m/>"l3e2-ƩyrP Óv;ׄz<+^oKZ`39v,8Rqq+4xi^e%@ 68$+d ҼWšKo,-乳4ۙCԱN1s+F;ty'q=N߭mNMG/hZQM,ב#XdFUPH9G5Oū_jP-cGi:Ƭ %a}>/:T~kW.s]~#{SE"( >`OR''$Lw[P< ety؏e[T}瓋5(Ѻ_y#x|7<+ukK[csxҳ͌1zG W[7|I\u^tH$mX<=Wֵ+C˨ i^>7C->[}[Zo_}Б]=vgIZjtԩ8hoC3bqFT\\L܂xLl_F~(x8|ZKx~9ZsG 졐v >ٯjς hW _oI6ChIڅl ڃǺZΆ-Jm-f>KI"E}T1# \]Jl/睅>&6uzzsfJ|3/4ekWr0Ű#k3xsKb_ѩ;`w' ^~ Ծ^3ike+B /-''xoᯂ>#"KaA>eW@n=OVNkI,{FIonmo/th93Iవ6nQ}+B߃~1~#ERa(`[${5,GR(FQ٣iJ3CfQLhRcdZ |\|{wu]5o8_N`Ipsv20$kox̖WO8 !IWg#+&x7ZnC5M&ѩVx7|ItVz}O_E~izg5+=cVGLIpg$_!2~RǷ_ >QBɵ۟#$/_m;*ǏH>EWPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z(((?b߱m{ 0 oH+~-G$'[=Qm FFK+ui_>bB#k\XcƬwj_k/¤K%O_u%~d_>;̿ q~>$ -ןlwo˰@6zRB~.:mO:%mn蓼K44qM^| 5|e֞{_R լBVRdWn{a/d]|&?#3'(>72oskb^Zk(\5Oi C߄oz;Zjkԝw%gs!?yⶵ|M nɭt*ᧅO.x.r7`pM|a9f :sjUeu]+´$6#_? ~W<y|tvPhH"hYVUq Ŝ?OuMj/P% fbF@Z:+5(JhMuf}ОѼrq{=rT–tpuC&b^ZkY~NiQn1 FiŤ9)sI?+2Ǿ9/Ϗ:D,vMj(DʌnRg57*ie@Bԫ2c@l_/ykfb^ZQbʫbꡘ;ah!O/k<.cVjs*)5/+N[}J"G4m'P 0 qF{?g_ ~߳?exwQ侒ͪj.TR21ly!?l_/ykfF')8&^ͭ:|9+>|J⷇4 xR#i\,"Qv+ࣿ|kஃEխ|A jl+mpL=851E/-c Cb}X5-shf\ F\<9{7IΟ7? 8tKk"BːH8 Et Cb}X4ؿ_?xUxO)RU%м{OQ+{6z7$?^x Qc R!ъVvcI2yRD$jmu>h!1=8tW,%RV|WE$s>{I_d?mxŷ- Yؑ*!G$brG$e|X$|1xd]v*D*J&g!7$ xb^Zkaa3<ú r%gm-'*~;J'iAu=~,-TCľ2W뎣3-g<~5CJx&OJ֮o&VtI 21ܠd}+l_/ykfb^ZJtp1Q^6jwNrnI7hݶBR$>㗁t_\oz-ncoUef1#ʬ~?z znOuHFu=N4R7YX 8`9:Wؿ_??/3\8Q0xN<ۥ(J-RIK0o?o on5-ċh m]@Ty09,_??/3G1E/-cיd kWΰPcF1[F+Wm[շwtJ+Gh!t~*϶{;Z^/5[Z0Vܾp)oEW'eh_VT>**/_"KKIϘ%>gu mi'Ֆ,#WԖA8r8>;sV>_U-BO6J&2سzEoЖf\QtYC>YJ-6gd.mdJoroՎ{wR?]_~?O~"k~ԅy<-2GȹTc(9.!?l_/ykf)eT1Xz9D9%x^Zu'QźoOC!?l_/ykf?(_k7/7?ڿX{A񞗯yI2$fΤDN7n]4=¿۝N_bI]Į ی_"!?l_/ykfBWV'<ҊkrTGnˤnZr%$߹+>Xaf_|=gwkY$ZC$h{QC G~߲-z8^/fH]u ;Nx>l!?l_/ykfqK _9{G8RKII{F_RuO:mV?lK]஍kD #' +d/|?]A|IAlY.K 9?l_/ykfb^Z-0겴8TNK~[Rk d֡W5(P$wrONYhƏ|}C_6%bdypUw *ؿ_??/3^l]< ME$TSJ[Nsr[vٕe YtOtxkU5{eҵKYlnHYsۂy~|&ac[Ѿxz{woo%AsnU :\1E/-c Cb}X5e~_ѫy 7YQINRm5XcGS[Ul~|6n>eur +12m,bf!X~{?:Vn}[>XE =~ Cb}X4ؿ_?Nqe:X|5*4Fj*n}[lt:mf}]h#dkM_6 ΰ#q`s(! 7ŀbH~&5oi |q4o^\^Ϊ\@`QOb^Zk衈{Jxٖ&J5e ~ms(JQ'[VqP?_a6J'ߕ-$ӻ3q']3uO;S専u#2 .=kȿl_/ykfb^Z&_bМpҧ꼙)fۡgQ8› yv95&\K8';6'ߋm ,:Vumbqyh!ex&I˚<џ4%בMuz1|d?7gNo4yGrcM}) C@'/¼g*W9]7OyjRrZ~g_n7kAqP DzF T x{[9._K^۩g|G-鶾o&WZK.n.Fc20#`Y|eM|;>ٞ&U93__xuuNv)(ESRQRwi5k Jj{_,~߳]Mn[|âe[_i>%0O[A^gT"5P0Vᔆ S(WmտҩF#xZ;5m|}{vALWÞ7#CҽV;-B=K rc ,hH XWQKQU79-m/*uUz%9+{i}[|MΟm<7xIk}uVĞg$٢)Ϳu[5i7Q%%n뾛|eo?~r>sαCp'$ "Rti>Ƹ:ѕ In3 ~?H֑ioz=5EbbGLb$xeui^~/5mgZ&YmJ[# xչ:!H*6:-n= ezeΰݬ=NE^*Nd+GwM"]Lf/X_H)3*7".G9Jhhꎪ烊vU>/~_cQ[{Rݭ"TYj/BI[Br%ou>%f/i}km:9k;vO%wO7Y5ZY|BQU{CeF1$ui<7o, sֽomP{IInoy 217٬Wo5|Rg)#9_?FZ8~0@F̌0Nxh 7NIqY_J-8Gm>B4|FPnO3jG"HCJRҫN |O[tE>[7wQV A p:Ǐg?5 \R͏pXa_6N1\o~UU GP1d.8hrF@^ hR䚻v_z5ѤR䨛nWq}UCr>LHmjq!+ V}fۏ:gb>; Ā;wu*RN{˨K F{|M;~Ο Sk~/<=ɨWmpBcB#qQCNm7}|ǁSt6mG~|m㩼;wa A#%H6=Aq_TQYTu)Ԕ[ַ♍\ҫ(9okYv~?hC[]ͣxZȏO!,224@`'Y΅CI׾E̱}6Ȼ+<<4P4XkKwս-]w}[n߿_4[;m졆T;YcPFGzWͿ ğWshh]_^bgpz)_TQ[VB# 7dF*iͻEZxF+@nPc@U>ZXA>s|zCZOhIuQȲ aGn 'TMZ//Ԫ1j&|[g}o\Xpu${_S6:>YxIԵ=<0hU !2k甕gk~ *mkJ[W|ouVZ]?Nn#uxXdU%w+.O%}具Ÿ pKku ,H>E$ "Yd}.O從8ON1Q5Oo{y\Ľ-E}ST;\L1,fs3Ik>#~ֲ~x\_Ek+ַ-IFݭz+nZߪg_Z}&-JdVԵfe*.{澸M?Zwu(C̲,m+4;:zUP'ߑ˂#:q]Vύ- TpaU&Y\W.`i䰞Hw` %`74WU|kN5TfFv00N5'Z׷gt_#FO,-za+ϒ )͍T31Q|a_xwzˬ6t <'=MmQUC  \KvBadܧӢcω|}g^#zNAwn]eDWTQZaRT5aau{տP| 3`xF5tga[]VY2C &T:W+,N)SmrcRpwVvC?ڷ%_^16?0pS_F KgGᖓKI%i.s|vESGUiIVݴ^VH>4kX1h}.JUrqrJoM~Wh9rIw]^W}ߌ6c)漗^MB&0՚8A>?)7k4?iiAΛ=Beg bKk;U[KvXHMX{35rX+*1zg ),.pR(/o(Qu)֫VSY/ߵ? [{ {{MiSc q޼4{Ze&7Z|dGa_A]u^OX%_w%LLq2wqM%_w(;O7|uY_Ŭ^^֥[(`hFN2r+{cwTM&d_ɣJzMdյO;|Eռ4=B-]3o66RIK.Ê򯉾-,/Ʉ@OxԾ!͢|5/s%~?wߧ5&kU曨G{ayA=˹$H +u5yn׆©jrrw!3i}&O+_9oI$XH$}_/Ñ)YZI5H.a`JG)zh7Rt^Im=4OAJJZw}~؟O|7[MyMAqsH,7t g}GETp2OQj;yD(Ol+  "xGU޵4Jd 2̤2qѓ(Jx_ *_i^i1a2j?qx?|hd]jr|v&ۢuSsON,'RN}6e.o !6J1Sg6_O_Ɵ/_-|ZC.?kxC%C+>Ԣ1HWqn2oV= N%i;5c|3YjN"ρl̶\,dKX Tn' x4-Z-}vD*ScBRܥ-0a*SM,G _g|uhowWj|S1a峇8޽袮4%9ENU%+OojQi? 3us"O-A1>0Jz u%7vbpU% -Tϯ;| ~3k:sEqmqtI Ø2ǂk鿂,ݯ Ѽ5%{{6$wz-Ĝm.zTW/XgxU{6 NڻvmYӛ]ϊ&-wI$^A+Gw/tN]bkM(T6هTn3+:+XxJkMyjw #mE5WԿ'-|I鷲|oBAPpyڨ+Q"Q]3LF*W>F~%~ "/6>(Q Zަ&`q!5uԮ`ޛteqyPڹnNۅ}%EqC(u%.]gO-QeRm[J3hτgw]cGi.짛;h2 $~ |/cVV:ZrP5U3,Y@8tyZf+[Kjib2֮;Zگ;|3ه⮭Ǐdzխ ~kKӣ"B:*Frs~8nBJ}BK9 KA<[UPRK~%a8_hwϽߕu|sG<. Zc!bŶͼF2@߆k-KEӼ{X|=6t/%f` ck2B_gQ\ٱqR'_u{|O MVխdVYEohT TQ^Q@j_V⿂e۪l]ńeY2'c+/MMefPa]+-2 8ө(OOGc*PVp)k3?fvx|=ȿ'/v0 3O|/ao]񮎿jGouq Ex6FCEtUQJ]bVN^ xwu4ռ~gɞ,Oj=χl:eB2FL!#q8C?g|qkO߈YVQJ&фIAcr]bŠ) ֊H(]b*T䕗5Z1~'|qGÝF=3P@b-BJ2!V\F9[[qc 4uBYԼM73ߩ⾿y|]IT9C{5gS+ʭ+V~zg揚eكVg<ާ`8soKev b$ ]QO lo[V3JD91냂VQ^ߝ. {~oEWxoCÒ;uFżZN=ZfٯXyk>>Z6F v*EeON39Ok1HԩRSy+6q_|`kR]GTFy ~ӟo}7Z]bЬ<."6:fҾ5*n5UU9BiZ񶫳hOo|YOBt[fW'i*vۺ 3Szׅ5mcbi#Ѱ!YUҺz+J8JTiKU+}iҕ{wt#_};/䲚H1b XVgu/ƚ=ï\ auyX7m ŜnqkԮ'k̪LUFz z/4 /Su BKKV5Ewӣ T(u+,=:4/u+[W|MWti~xoUۺ VF+CAQ͟J `Nǀ˨єi6W^࿵'ii~*]" F̠T$YƝu+C/n.T:ez->K{Z.!k[-pCC#!TgMxj}o][.!Qʱ=IҼTiSĹNhI'ْK<Ҕ<gz4-ILNe?A#ִc|:<3gwSF!;؈}$_~_?h_ |*sio@НDnO zFؠKb1SIZ)rϻcjcdH߮oy \_#>=Yt|IjT֫kGren[?k~0v+U,'7g1nan2:W>Cb,$(M2Rkߔn]GR}m~%H*o7 ŸĿ ^X_Z4u6H$O Y 95?7Pk+kCȈ&w\" {ibl0*D ӶkK.XyJ4^ДQE~ZvQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Ǵ\t7_/W=@Q@Q@<3m[Ճ/jޠ(EzwnVN|5 ((((*7w? ʧo]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z(((((A3s\~L+@W9ƖwYKtc`⪦":7Kou1thՅ Jws(NHFeF_> J-F!ic%܅W \.]xGvyY > 0-G]͏^?#%G!4[]8FזN-Qk/6_2=$4/%geǖ>i=#_ujʺż*ݳL">_|Na1 9E+۽mVv>3LZҩ(E&Pm{Z=Sϋx ye\jo\mؾ|U/'g?O}w"Ip `\$=zUK jmwj~_ӣ7J{meS(Oڃ㏆t$%CeK[H;cr2I_;w?Y k?.<= w-t?4%'yvIasm{$۷}>e|h֯<3i^c.z߰1U;2agoP׵İҬ"3\\I*@9$$&Z~qT19^=[{oE|~)Isy Ư$1݈|u*T3^4x G]9xHUJ*! Xf8jQMiV8JTm4mXo:;FKyXA:u_υ:go4t6˪r 睹_o'7@j^;Uoa\&0 c$q@<~9{w\N?ٌiԗݭ{kim[>Lc .&ʰj1Zv`r goqYסRĦ齷[5gQ&=V4^lCǗ Sໟ:2^$]eNAy* d_kz}7>obj!RMr krqm9;'fo+[>iڅ_YO՝K43ےD` =?էE_r~7,ܬpbX/@ 쭈=Gew;8Z~Ҭo>IֿkO Tr];î_iCNn\d_8Ѿ$xONv/tȤVH Ύ."N~OfX|u T864ӷ{4#Ij >5x-f[fex|ۑ *9!>ޟ_\|G*}|Cv-4E/+/;N&p:i/v/V8:m/v [ZMEx4+j>xf :n'8 (Սh*3աZj?_QEQ\^xwFO…wI4˂I>pk/=OK&ۖ:g⭌&y،6ܞInI]Q^.xމuZݤޱa.TQr ǵĺg?kzv]-=ĝ$rIsZQROӕcj8^ڔ|:+7N .5 Ct!8yt l/߈QوKd~T-?y[l,s,4nD~8a*IEIZ&I&Տ,>4L:BkL/"6\F7͸+tżipxCOÉKp\$ 2 +u|<*=V7} 1 7 $ލ??7/4qxS&F J"O\)n@cӡ?B|)ak67Sd NQБk j(רwk^w]ס ҕW궺}U/?Ýgz$Ksof8FOaڻJ/+%&v🆤7.#"DR>9iW[8ahYyݟH~ASᦟh4Hϛ~HŀHd^Pkm[@QFTE `?_׬-h~2S`H`w7P eV8J*U^~F K=~j+=[;?|Ë5ŵoI8` 8DMtGy\#o 1KaJtȎ{#FA0“TcTSpov,gciarڿ2k>.iyl>+;Ú׼?f/$Zrc f k|?x|/+jiHm|c۽w_և*KI%G!FZm[ϧϮf|A^_Uh~jmhrĘ_*x_G|Y4MT t+^i7S_ivw7iq4)$&* S<~G?lC\x+s T 8se7 *xhՖi#+b!ZZm%O$_n|i~"-' g'k+#hdP$lYH X74_&VG̩=V馚ORJ+ғ` IG%[);ESֽ;g-E6^f}R[ngpiRMփU ʥZxQ^a9eX|U.3u-Rs0UzҰ~Syj^FmĨ 3#RpHʕnddx$W6:i86ZOѴ=wtxgQİҬ"3Op!TpI 9$:ZOu+1Aqx~ kwb/;qʨ>ZBoW&܍Y(TomִWk]@|skxɎ-/ c!A*Y+7fŏk- ZE۱W4A R[jtTju`;KB)V+;nrO# ޥk6j e۸Fhb 3r>5jV}kR{ @x*yxﶾ{SƞQtgW'y>rXl#iܪ{g:^6ᯇ-5ӛW[ 0!v) kOz]Rt5 (n.t -m+I$Aҿ:?ik]Eq#'ſ:l 25]vp{ +HgNj5 aExu!>P|%#Ϲ>w':ˁ~sh/ګM)iӴ[xS Mf ,UI8y^6a*ZER0ѧ:t]G_"koO O)_:/ ,F(#5//ů(&it$,l8$4n2pApH GF8M;w0 L(6M;w-Oc}[xB_GX^嫣|lc xzo M춱ȁ+36hO8W'Vkw eJP+5m,n#+翀~&|B/>xBYIs%q nHbz^#6%t57I+~'ZSӫMN]h(֢h诒oڳ{G| ^K o&P$nL2kViDڞ|Xܘ`{VlvuOa<3?Sٺ)koC1Ve:\-$jBBkJZ8Q7! JEWAL?]#nk}S4J&Tso+υiI.7̸ ÚfY9p)GrƛZ~Ӛƛke9-ŝI<3.p2vy!] /"o?I`K/y{,69Җmt(WWǀ~-jڶN>0eQHһ]y?qf&3¬SqJ|w5*8Ԅ[5My-wZ%M6{ʼng O`qٮKD=| -K6q3U4{i-ŮRPs5?x>"| _>?|yW3%}_qIJe08(STe4ն|qL7/^&b0y"]Ң+c(&>xjZ]WD\v ) {WpiᾹ%.G'(&7Օ+{:Цd>Ѣ!+Ě'/Ư>d+[fZFeaoW G۬I=s?#!Jk-5(wRiXOWĚuk?˟iMZm$Q1S԰ O(|+;H7w/5gTcmK3mRl݀]]${|4ܝ%Σ9m{>n}ZF_Y}v>Ԯ;'u4_=-K6d|P+1۵v59*Ɩ0x3_/|?7Xk&!E j)!~ |OV}EK_KwDV"SҖ"OG~n}Z>XAsuIkI^5g%:t'41 ]e̷M$"br)rf3 _6ҍXFXJNVڒb1TCx{IizN[\qCRÕrf$V'-*'N-Wc8Jp]%M:#&{3 (>GMS?x{KChl-n-4ǹ g5e&aSWISpNֽ.X^M[N).~ͺχfef䏳X`GpW޺ ڦ^[5żsInL CA8Һ*M5kݷ*uV(d+C_ ?xúv5<;ckokxPeÿ OVD{u˂ Ay4AG} d4sb<6W,1`W?b~? ,|}xO4ri6+4Qep LB ۆ 0<;+):<Ͷ~@d䖌W&slONj|$Щb)Ŵy\/%QieXCoyatY%GB`H k5፟,7MN+ 6Rr0pF́qRqMWrvOݗhEC_Cܨ>/B7'4^ msIΙc)Yc#Fw}h$g3~>)D_xL]>[inWDY6CzWS3zWiN*M. 5MwWFXȞLxqCxy.RTL~#?S44|A O]vCm d2#`U0»[wږ,+#~N91y&Xhb Nƛ䥥ӺVɯV0\Ͼ4;#de5niTl yffsr5_?)=]EեM*FGFiTsȋ5|%\f*8Z))I]rm%fp_vM'H:5׊_'iZJ"{+X UbJLWAiэݷ쿬=|ˏpa5򷎾4|AGojt04\2:p&Qƾ5 %G'a),EZ眪bl~KWO}aԔ3Ime:߈<)l=73̵Vh %N@VAkpX45w$d|ImRgXֲE 8Av5]cs~MrY7%A_KM%wwz3is=ϴhĿ"xv EXV;9̲ǒo=}>9|JSHTEkfB\^4Y&?G+ Vn)+v뮝B5#(sQ^K-r5xm4)/pg yUvzi/.4xoº/bX4-5kHXfI*0N ʾc<+փR][vV z3+-kM8f.tL +͆ ri -ʪ0J>O ]es'x6~Ǥ[ϝy ">;a5N_ ~O,x5Ky bZbyF?v*˰lfOTbQ)m)^M&rԜQS~O(#+^;~Vľ'ԣ4;ebuEPO,8~nəErKpP̳<.j5jB ҔvΤ!).E/Mn_7_WF6ѵ }EM+WZOUG|MM'YE/c&I6_\"UG o?>[Teo?Pbpds@3~{ Ӯ*jRPqWQq{jꚪjsM4#P*(\ܪ]Ā go (5# -UL@kdA%wj:&*_۬D2_;U2s ,<\>\Λӷ61I˗-_ ?l?t U)啿:&\sZލ},,`{UFYjN'k ]55?ox_@|;N#B+yi޸ aM{yk5̳f177 r\YOnN^u((4^]riԛ;]k?~5iwz|Ei;9q%bre`<`kxaiXK@UP2I'6{:jOiJ>x_6))ft 82LBk?=Ʊ$^t c/PÁKg ףWacTr#̪Jd=oz[rV#]?+zR./RjI/ݟk{X @$l{?ih16e k>}םٛ7%Ҽ#G5;\˶̓쪣Mz|jf5t-ֻk_y--w)> ,x7τV~4,3\,&U +J?fҿ+Zp`n.9JJ.M]I]p4'{0 ?ie+uh:&to[]hB@85=]mZGKz`VJXzy kx.P_<;7_O[ڧ55]]^Xd(!V.Waȑ8 Oҩ]?/c4M*ݙ]՘lc| ㇏i/^)ZR[PKYc\1vjYc3jSm޺7[aCZ+|O]kuM}+>|v$CCJ)[dFU%W%:ױxXOLYlN2*9bzu,D+Aԍ켚GN7VsW(j<5FmXIl|ʈۂ\Fqu>k ~(ZfW3|_ƾo!c,ѴOfiחAs kV``qYT0vɴZV1aiNPm]ڌ^+X\ßZ/O'.LB.FGX~0kN*QwL8Ԋ(W>.MA}ŀi e9Vz+0W*toD}]^eC|R>;hzE|1{ /AԯlPhluBV1z/߶'LD 0U0$Ư5)8Iyxjn3io=_yo_|@sR/ :k-6뮮?OK%ӟUUF7`gO~x-5~As+tϥnBVrJoc5K W۶+%tx|U|7T-Di("!~1 ÷JҮbMK^ o"#Tg(C;I9<4«y=5^{/9%/y]֚C+9B'}| ko42#t'NFkž&~7v?<;4wr$!ׇP$<394Ƭ{[uqz4ZrekZd>_||H{sa5斲\5aY!7@>>|[?ikܳGTːw^JX^iﰨ|EOcN^fj(D(|4ֵRC% IڠX8ʭXQQ#թ麵]WUkjuIJt_1K@-?½{/ftx治A}cͶGS KFm75KN:EJ-=M_\jOKP|mzk74~Wasʽ!?2,|֜]Txs|+Wy [HѮy!;ͤ0' IXJk3WU`TVVV 20\_hxTo=ˎ5RKSwsڣ;矴ƭ4K>'6[!c6צx?Y^5koXu-?wYx$}+q>$%yXI(n/od Rk/x fԬ 0##Wۜ v3ba>IZjzO6M٢,/.6i`(3 | ⯉:^._dgl78b?WM|U,=G$$vbqpmD>cW{g/|UUf-.o6Vc“=J_NUPR&齷תeatqqnj44N~&~kxwNwhfe«!*eW/5=~I%ԞCo+H(vH? ?_N|U`O?HaI̽j8Su|# ʝ'U3RvvZ+ߌC*>'..< kcÞź/Ť۱W3+;W˾3}YObB {" fqדS M骋vLJar2N)i(>5o7qivtD$ziEsI:+7N .5 Ct!8yt l/߈QوKd~T-?y[l 9$;4&Tm4mXJ)f ($䟴_qjeS/nOw*%nĎBQ޻Zֳ":|ZVun\Ŗݛ/'@>>S^^'";nc1(އ{_nW¢?xC*o4tOW|f# ]xm-"HV,~c(<n&*%ۭ-X]55V{u>D?l &m#@Do2yVR Ys_Txkzw?kzMi so:dv>1t Ui208SoniƝgI|MmKP-a[j ~fU KGkjOH5//=y|b?JAYQoUҲ2iUt-VMҲ'IjZ< ];A󢾷2y)XJB3p>o5ThF3+'Nhuee-#j+O~_|/K7ywMޓ &{?Z7?EY Gvb . Fpx*A: hן|٦cpRW]ҹ^7D:XϮR$X6wl$GꟵ 2xZxzvh`29$9M\} 3pm웷yrmdݽl( m 㧁&E`mdlpx ::r_o-c^%׎eEFO*!nOJxjN:* |3_o5_kϢ^5 !Irru$|lKῆ>WA Ivܜ_g| ㏉Z~^ XWqpĐTnz~s(bdԟ߷y9noONɩfV +ƾ4[Qx:U~l0|rX W?mCϨ7;6dSyv{=뺶.J~oGPSnOdoִWϿkKo^4-ׁ|qvZ;. c_AVkG6ib(fL(:8|BբOZKL")mZF=ߍ{ 7+X ¸kuO%Ӽ:%z$0dn`Oy[znm/VS6R.&iXڊ/4oӼG]*?2)19!fR#f XOxᡚ,+,#85SJ?m'鯮mlU}i4W_lRZ~ڎ+G)!,jI  ſ|P_Gox"}< <|۱s~\*0w~ysS̰ի{ mMeAx?|e4MID%>kn<|rφ>u?xvkkY !n OB|\~*x_^(Y7n˨aVq"$+x>|4-2!ԥBѓ!0=E|rNt+ɾ%4+i zЅe#*ǑWRõ^&܏cadQdoW>sO^I< ]xam,FBKs+c@>7| ?m'M LQ4w`;qf,U*u [zʣӕ{w[WOͤ&}-ْ>ECqU뿦;TygYx5Ǹԣ<n 3xmJNƺơy2C$UEbI$ҫxGIF:SwGZ*PG_M? %#_j[ʊ(/$ j챫Oj9RzW:.hv" :[Gt8࠿4;}[^կy-,4p,  >_9NfӭApտ߳6>x %,y`| u ?uϋ<{nwiFd KA_`||CKO s& -\7|MuIJqXTzVR䨶~v}VJ*:ܯϗU%[+x6TĶֲg ނt;GҭlK[6$5Cت޵ퟣS70EMhm'yݻ O7Y|.#D'nfs^YL Z^o̽vf;Ӿ|?|+]:3HyCY<Zz'#, 9k'O /a_|r⺘7>̑1c޽ ~Kc"-RUQw:VU>#tUoӵI'p?wD\/A=׈|1b_-)g |FU 'Wi$orh}_D,Γm(6'?Vjxl[QU>:|E&j~o6geR F6xk>00V  "VMWC%xnQ]e>9 .DʾY:Zό/l.<.Ҽ Mjڭtoy%|^":q&{+v]g<'ouKxOcpKQ:6^V|[񆟫x ?rKw$Q~̑Xa͐3s۬\UD 3W~ȗj?Ie_ -qn}\ 묥K<-7oiɶ+Guxʎ:x:MzҍԚD־:x QZ|UKӬ,HP- y??at2ťzįJI*/h!\ s?«_ #V[=Kz֟ C$Rmk?^ o *FZĮ{!\S{U=e |W8FyMeN#޿>TMwA~\J1riVr*,ѡ`ACT9xP Ic} }Fo-#g]+e[~5|JI]/u{:0EɹGjpM[\DMƒ~;VtWw[>Я_<ϒܶ^ϡN/ d 1&*h,}W^S*o_V;63xts+?ċj/[HӮ/ű}_*6}q3_Gtv}f]RRMgEEx_KHi!ɠd aVy`s~FV6Eu"&űm+{ԱJ+c9" W?@: OXv }o<#V?hO4?Yeoױ!*#T^9k?ࠟ4hmᛸu~U[}>E6 3˓9u\oUѢ, -1GRE;ͦWTR5vH͏"g!/v$d1@sG#rׇ_#]= NIPEeU$pYY3# n^~ӵk]Kzi+ugw NT1Vr6My9RiZ 5箖s|Aq~>Sc%͚rv$P~ Go'\#ƞ=H VgK,Oʾ|-}R&ᣒWi6تS_0ZC#Ѭ5YmqvjZt UIYr$Ahw'kl@ݯ< 5PՆ~8 WʟL~׋tRx9dž1gM{oϏc[mrUH+{Ye!0s ny ]k mq+ϵ7ٕwOz%S1TOBW6c.oGk_yk=3}OmElN'𧋬no%,M3$muxe2\76B筯KK?jZm]^Kgoqo me#ЂG]-tߊg [D>R Fq&W(:^isB2M7SJ\8G彺VZck 1BPġQ P8 r|ym[v ,]duS^_aJ+AT+SSZN{W?l)?KxV9[Hy^YcjV]Swv~t1Tq.j#t|; x-h˓$ʧIn 6bj(¨ %Q,I>)w:YY {/>v5+]sKuUx'UqAO-?h]{ȵ^K۫6Ã͎"TS-Q̢|ʵ B&2[y?o-H͕]rfP|['UQƾ&KlROZPK8٥-`]Yċ gƯG?-hF!~}_m$U>mk麅#PBWO2|W{9!(Z/Zatз#\3 oioOҏiip>ɎĿqͼC#TP~eHLHgו HO^%H+C|(Oxb:8 be /# ߌ-y/ _ ~ƪ>+R[fvQlq;5G=jVixQxsd:,!^_6ffHÜ ԟ¥#5j-Zd>ԴmcMn,h&UсVSA"#ON,Rͽ`=1 S=y]."In*FIbNG985ʿ<_~%>eڽǓ5E¨ñw|*yb# ץJUBZ^ˮ/?Du1=0mMti kKT<}J)š*tYc&9%u|6ϋtt~h[]q''+rFw~TUJgk?K"~qn߈Ǔ^% d̘e{ -̰Cd~D׌:m? /-d'{k(gE`R$P ۓMkK/-0+|/MN,"|L9὇ xk!gyX#v(A=ca+c_6o׬>J<%%~(ih*z  c$o_O'';ŷok^-^Gn$+w23Q_C"S ?kFWM"uO"a1 dq\H}No>Z>eZ+< 寁=<3G[&n"PA PT47Y#pYNAҽ:3]=!R I菉>-F>ץq_oW?#A˿?#hWguK7hnR)Fd({+:mτ|Gׯss}ZG$nD\8,޵Om +rjtFBl¾S>0i^ u0Þ"^u'`<@ucc85͍SXRSi6o8Qftdr'jj~_W9|%<1m\XXQ,JHo^Wޯ~ }IeKh%eH`L0Ti gEv*E)$ a 2Fzo 隹ncPA yRkIVSJtVtκlҍ޻~rKdi/7M_)~,?4oANZ{ 7o#]̀ zHh5wO=?i=fh!y@DdlVOU̾wgNWV3sV{=JOO7+O K\?)|/t>-!X.VwN ,QF>qr~~8]|7 8Djf#Bx! U2>W5N\ 9Im(gOa[ Sɘ[qqn3Rɖcý7>z=yhG/?(q_l >:sy-饋1)߻/'J&/I1MW%pH@%+q{淥Z"xu&<; dߋ`"%|}Aφ?,?oxI^+9_U}qS0u+aeJ34Gcu9эJ I%V۫;)ontavGU>(؅>ۙOE})6 em5M0csl$׈@x:d su$q()djgAv6ŝVڍG,RfNv67郌[SjeShU)Fo[ڻ9F<{|ُ |eYhh募X~]:,f|EeM|o_Gc,_Y0O0qH-Wޱz xԇW-G5SOX7t|GUOګOg}Ux/-z~H+ۋN}qW|;s/L2K28B8ga}ϴɾ?R>㗇-7m ..{Aǂn,RKldmZ/uK,|EZ_iװʰ=NRZ. IĥK SRNF|}*\O^!Efk V>!_GZ?GƏ:i)#WmJm_@״w"6rY_9hv<)^JeY@yNDlgoH_&4K }nפ {xX.rA12k2|_-I7|蕶Nlw+'ͯ }Q <#7J׼\bQT,jMğg1[(ɹuFY[Cgw&Tտ&Yঞ byK<7vO)cC>ԵkzT/4܈%!aHWߞֹe, E/}.&4:&iX>񕭕IG8U7K?ïS:=խ32fbvBO`=+')x2\״Ik1#@8nr+)?<7ou♧ڶ- ĀU@2 +7Z*ͫZ+~kxt\Zn<ߥneXR0Aij t˙VTI_N}:-xz2~o<;?PG+Z g6|Od?Y?ξ߯&rm6|Ⱥozޜ( [ &_aKɼWƘAJFrb#τ?I`K/%I? eo_?‚jY}W5+^!:ه|EGxf2M~6_SG$09*Z^.C N} \$5%zk$ƿ_-z%gH77Z5M_4M}T# S8*'/*EWW2͖Yn%~'xWJVzaqɜUH|R+̻pGT|~oS3*skUv>H`?iyֶ?~!ww`^]ʹ2B?Os펹o~ڒkҮ4xYtﴏ)< .BOY>~2?PIs'e{Ψ^;+}Z_N.Ka=-JN1~qn?z9՜voG>Ň|/xJm.+;h`,qU)4)!,}VUYd'ٮbeݎYNz/>>$&kz֨u+ (Ո ",Ccg~ ׼9VYu=R &Yn\pT$ql`gO![1 P휓dms(ʒPzXA^QLU1<'7;H;rP>i.dr}BA^QLU/w?s^\*J8 9׼S<XmܥM Bj?/"x`軣?"_?<]6&MNy5u qA1!K yNkY1AEjwY˨MhⓤbF,8̇ ԔɩWRmuI((nqՓk#/óׇɥbIkț\Ug?i>-6j6$dhßX:_&kH5Kd%(F|=XHMr)=>Ď^yXZ}>A~֣k{;Qb*WpUB w~n\k[9K1VXq_b0*rRv-k^=2ٟZx %;Ǟ05*Lӭ{t[y!mcRE=\WWTo^[ 4I#KԌAGjj ?*^3j̄xv8{[F Њ_xW/ O^HXչ]F),+!=Oa_q=L^[΢]Nbeli`@p<+43ձXcSR73ME-]I\FQwAEWÝ!_?N:/Z:t_?K3$w _qUKG|zUޗGšN711}:}_Q>_gTմgrjctspj8S~j?5&#ς>{N!h@Aw>Ř副x𧈾xKů,n!Iß%s!sL<onM~OU)4﵈;a>MW_g/^_gMKOq-^kG""ă߼1_c,vg[䝔yew'jg>"Qk7BF՚5L~U~Qo6ws]FfKЄ33 w k k.PTv:aH_zy\yrb/rR4QE~LwQ@c]_F+wc8qsy+¿,'VȦw!Ԗ6ĥ^[%pF3YIuzaNp]e$={){+'e8 :DdI"ld"D[$s3+`:w++8;vxPǨIȯzB~(f\W1"kǿm N|Iw=ĭ-ɸ%Bw5So3Շ_ATCE;3oEK^gcO]+5tOy+7RAO%Y1"ƊBھ?? )ڵw&JM%Iy(+ $_D5}~mG|!|YF[ s4nrN {ags:)2p|m)_K[[2C?lo'ߴ; |;񥦻m桦"Dp3 үE}ڏ?e_Z̗ibqpI%xvy׭eП:L&ovt= E[ig{u'4Y%c6*\[P\ \|%,Xz. JnM[IE8iJ?rsc %꾨'O3s>1ԭ|=w_Lj2K$7R؁Iw/vs~О _x{V5FEcķl'b,Q\dqy_m_WQ}X”4}͏&7J3? M\٤vm# т$ TA>?~_Lj;M5'1յVUr#;J bqN,ʼ/YUIomU4QSRvާx kDZ> W\[Ū BmdfsrAZត'mDU#ۀb@+x(/#MYmu?6vy*Ҽ #o=rj^pe%m(M%178p~32r^E[6i(N9˚r%dۍNȸNqͧ~4QE~RwWg߁ׯ\y~.m3GT?~q\cz^[Uyi/~Ij)l|l-<) _¿j w:/$QqHí~P`ھwgq< 5 /zOYf:H@O3L)7#}_OŹ`U9]X?Z ( 1&g/k(_,ھ?/.&?G%e¾Oj~"2i~\Dwyꦯ|UǏ(\W vW ;H`PIF +LPӍ}-_g\Qe|]Z)^4o}WD9)ѝJQRe|5;E8E,}ɮK}"[Qφ>pFsx%fK"]-g:=©dBqybLlj4D#R\ß.$CJy e2\#_M9& kw}Ωjv'K-]4_6*Q!$9v Յ~#jrKhb0B6`bD~ w/,IZGta29B„$gqԏL/3ortceK-`y&M`=2sҾ׉\ۆ*FqN4g8S kFj6ZP?Z4OqwbKF ;FHq\`_&;h v74h7:B-rd3`q3hks USWo ͻ f@;DN o#k~ KO> K!ico0Ƹ|dy }_S `#مW I_J2^-y{]i^jUg-#W5Zvl(E^ ^vj0^. Zݚ==HITvgO'7Q_t~W}ȗ$RӌJ柴&?@ èޅ3W;+PUϩ#Q(%2/q>u ٔ~,q-S=֜yfu/ 6 gea 1tA}'$44)g&QV̼o&X?t/+߈__׬_M=eFN9Th[T|C)|m}_| u}5){13=L` R* (N˛+5# );.џ{\uOjzeJA Mv5Fq{ O\h_5}_|Rÿ(.g퓝i-bz`}m}ΟǞElmU6O^&_RSOK>w+NQ~[$w5?#6>>Z-Q$iAzV~G.5$Z0q<+2Hf:#¹~J߉91Jeo mA9 s^FXr)+`=bmSlѢ ap? ~~k6Wz޹d$ H|w?4׋&,N0TJ{2;)iä54L:nZ/~/ Mjv6Q q1P1+WxWSy4[_xt]#[Cډ]XmdfMR r]ޛVx]2%𮡧!(oAp7) 9 W~ k|c'F$MgwgQ{+T\%ek%G7${Zr뮍/z_-WV]2G4p_,m9ַk'<?mKjӶ%)Ϛ$wWԕ*|<*cn^^e{v< @E%ͻ;BvgWW_l)yC? [±Giy}i/˖9n:n=Z-L=Hk[^kBOi[^ _?Ҿu0n}"cz*K_L{#*ciKm_b۱q~H (2>1[SxQ+]6Np\!ZHу7d=aBvQWgߴ6sN~^9R_@31zW~m6p%K 00@Wο9ź꼾+sUѩ'#{Ue,MUTt_qt,ee?e|¾}|S]*F뺽d"Ar  =|k|S_g?i?[P[CҾ.c'I*XZo^Wfax+g~?mpڸMYO/sXj^4}InX"62֨ݺ-W}WVrCsm"e\2RqVw|V%J1mSL?hNXmDMKwR~ؚw=*'x{ZS} ?Vg(JAous\K b?$oao׮ahi[C%K!{D??3_ORm)ԮՇ;A i_9z /q1 Վ^EcNJjTvsєifժMXC𭟊?gӣMBF$n2GKэe~l(zl/)W7ڝK_iRXDHW-P.s8iɲ{o?)oMӫJwzNk2>nUD[ oEߙ(3b"œݜ=غ4*BGiOm|h1׌ 7zcx+ͦƆI>ID1˩9V G֕_i?m#ӭ5hgw x`]91R-irֽ9s8PpO6;<Q\ YlۢD15 xhTom<|Ҡ6\?#wT g/<-~Y&PVB~_ _-v, Iq/ԟʱM E=W=EpFz8tTR%cͅ|NJyƪҴC4ן mOFXvɴkGekae [c U@|]$/Э+ /I+O.|9B_XD1\[WŴb~}k:~RרRW$ 23MJ;u \,ƻz/i/2yFĶY?R O6Oq_@|G:W˟Pow=2BN^.ojHA8,Udq^7?onuktk8m^^7 *AAVW̭T+Rխ.enX0?nkvKmyTUJf5៳ut/ /Uss x;U"{0kB^ukOOIҭ$oW+t RyS' jkZMҤu-!Ξ[5@.1ՃQSvVnn*g]NVJVVJukcW*D|+/ekz?_xİA _uG__xlG:Ю} dvGOZ 5 x~ #u iSM & cpzWԇԪF έe}4>Z|# Η?L`vHMb(Hi {?D_\ 5lo/ͦ@7jLc.*:JY Tݺ9_Z4/O?|3i~ ҬXIf1GU6iy-\ "s!#qe~=xc&ekiv1X\Nʯ6ʰP9#"e? yq{ufXbwڿxp|Y uW:*j7~etyyjrM>eՒGܚuN+[G9Qr_>~<  hLth`TY[p}ܑk9%ƆM*Zi}Fk~ӟ_>1k#z b-8Ec!yA+R|S~]YUjrCIg t"j;~өN.s.dQ^:qN hziB8ҦX%Z-Q$2<1W_m/P\Ʈ-ʼ$Hz>?O?O6hLwuj;|~V7>Z.k.y.fGfpQ@5-߀?g YɨM\;/fGcִ?|o32[ͨUygH5R -jZ8|E)%I_ߴw/|H+]4k;o]Jܬp9P:qfyeY@Op?\_xWP[]j?ٲ uI%u;Ts鞯 }6_NK9/#dHɺW9+Ey?6SܵZhY?향W;^k̴{Cƾ8j߁4Z,,?*;TEwg_ojZu]X^BwQ4C ʺ0*GWQx\oxob,Y5/ {۽~^Ӯa/immtIy&>HU$cNoԧMbWf&ңRjnM+bm^Ǿ.FJ|[a|YI$ʰAO_|Sr4wds5xi]XiCoqp tB{o a"x;hwxt S+Nv}_|𭟂ࡾ*t (hacƒ`+k/xW)4Z,37v+ٯ\|Ouk:γa.{Z )doM}֣VA=|B|"%'ΞNAskhh춗חWRB׵o?-?GӾ-l!Q*E_nM6wO-F2o*cH=]7DCⷁtb=wO|аHb ЊZ1Emu{kmWS75USrQj;ٟde;xO #G*̬q?+H=W^ ߵOs˻&tgIm[lʪ 3)8GǞ4~x7W./iq)3w$Wn0UWzdZ=߼ҲM-z̟/_s|M Ծ!x>5ۗo=oTCRe,.!VBW~>O?5{լL#uF&@ܡ __6> htk{#$ni}4Ywckw"E%[C9M=;/Ǟ,?i/{9|2?3}vJo-|YWek$Ri.vȑbZsqhr]w7"Y#sp<1gu W՟/?$Zukl,lmY%fJ6T1l8եO-qe$מmjw.U%$g5OZΚf40xX8?n^uv_RpBlH#K87K {_'[3ַԚA $`Hձ߭yG%^.GH+ ,.5`UZv>E:u{K[{96 ~LiƺN&,ʾֿ\$M|sE?0OG=S"мK6=SŶ9tc2*!t`7*$s6߶u޽dৎK +t+"V}k!^iz?r/ :g5 <_TX5_Y+f]>uX'j#,p1y#^u'Z|ꚌݺqC:TU#J0VMuw4>v`?ѕObRPO:?*WTmqßM=ZE]gMH9h'?=kk{9_񲏩Mzl|DFkJ ~kVZqM:oVG \YHu_gh|mmt}z6_iO EXc2:T̯kSYu9+~gSO|;[wl˟c'<=Am"c "N3+ klssۿc-fR0음}^:El-5mcQHePb BA!P@j,ƢU9JWmWSQj5U7(I-vg?7k_O x[:F̿i!RT 3g{0 K@s]h6ʟ/s SQVj;m^4K,TQVUizno #5aHi r mO7k Z4y-",A@|w9fUW[j%zAȈ;3c9 _|#ՍEc}cu:&bPU F`8WHYSVhYj9AY{Ju7n_ G;8Te](IW\޵g+/+m COd`Kr?|I1oStj4Q[V@ OUjxN$SK*Ыdzr7""IK^]Ǵ\t7_/W=@Q@Q@<3m[Ճ/jޠ(EzwnVN|5 ((((*7w? ʧo]V4;?:jZGJ )4JJ?o>|^_KMq'ʓJcyşmWMKJAp`r N}*P4+*d|nl a^~ L,]kN5\%O}l?Cw_xZwZ9<;¶CwQ]ф"ۊ{i 1INj5toxVYS?63\)Tt(8SVS JM$-ͭk^Qۧ}\#$ldև_ٛM]uo xm,uEF^Is4a dz^E`u?hnW9 {eJQQ.Z0Q^JWVo2dhrFT\?o<cưlz1,>Uʜ%%9E6} %FrگN^wZ0]2bB~ F;;עQD¥ qsp+CSU>6xZִpbY.ȈS$1ݓA^Ei 7)S(FZ0[7 Z~,r 3$P@mѲF=SETj8F\&Fax#'Ï xwÖ a#ɷsobK19$Yg/uh ٻo=yz5JJ1qVmn݌凣(2j;hc#ŞҼqCA-ܻ&YUW%fn8:ɮŠNj]z:TW̴9g,KO٤qu£@UU~>8 R15m ᑁ 8Պ((Eo(ѥ)F)9o|Q j5O9p|Ǧ3sKCG~3ɧ?t%O fTpNj;u5QQz>r.^Ve=enm[N>! K 1$"(G> ZGE`ViuO2'R2 ТV嶆V8fP7~b[y.313I[Qio{k`pֿ[v`?OqZ Gx'#+(R*¢JTA¤SO<<[T`.HLEEq).?GzOj3x=AɯZEC٫-v[PT(;eW4]Z{+ho,5D#YOׄ߰[Pk,˶x'wGWQUWF\Z{x)[L1½~-t[6!XBijv&zZ+h0J1VH8AY.~ſ|iKxYlnm6q%9=O~u2IOr./k^rXtB~4җ{#-:G|'xzZIɹ=qaӱڷYV[ @>} 1̎bf 18,Gbt)TwS֦fH&mRzooCɾ? >WueG}y3I#fBde@8$g4QN*tcN)/!ѡKJ1Q]?f_oRU /{y΄op7g/Ꭽxb7!m^_%ã rUXx}(]5/OlG¸+rZ9P! |gԋיR*¤SO )GCQqnjW2Fmo5j*KEgJ* ԢeG G hE> 4?7۵OT,yv#l??0>+#U4~x>Q/cjZat^\ ۈL0z ( p`^BJӊVjS~|ZrnFX"m54QD)"vttݕ285 Ynd1 HVSv5:3o[Ԟ]sc{4Q쁰p+(׷WĤJg'OOxOBѭ abY7YEaqQF qP]0xVR^Lm6Kdrz-[`> O? v^&vtYuldgh8j(#~4җ{#,-:1ᯆ,xt^*4*ma;N[kᇆ|ExP>qm _DTƾb~6/;q!+ō)4hVմd^p+$D)"ɜ #8rjEjpHM]>=5Ix<.!XBavv}6Gmm `*; Ɩ ((߲ - 5o$bxZ mzUM[&t`z 0}@]3<pR1~H Up+5*Mɭb$Z]e A|/[izEڮmmc뀣?PρO>쿴tkݟh^-d_XaOoQ[8EǑ6Pm{[ n6,ةK{5إc(TRUcEF*/> _Fj,s=+!BOU{S .zv9*`pVdWx?0}mc (('ڥ((߲HҎƚ$# 3]FWm}eC<nzqEa]Z3XS6"v26:x/|On ~o#@t#~vqڽ6U)´y*E5MZ4ǒTfx׀d?uhuM/jPxu1ʮJBG{-TңNM=ӿ||tgL)j"شsDP! yq]M8^5t)Jp\l|ոo ^m;7:}aȯw{vng qƣ EE,=PQFt0|55IyI>֝NۃRY1פZN*[)U~ڥum"0xoJvsz}\٭n z3ZTU%%f?`7wfuղ :?W$~[_|%dkA)Vs)7Ļc''8槄ї=:i?$:X- sҥ$#(e 7Gj772s-l뚶^E]ZUl5JQ$??~ ;k4>&P;4Kq{WqE!qQ]iӅSItZ? 36<]hmc6j?'ːȟ"8FÒ~`}(!U#NnQMxῆ~)h-xGtA ԆF#*A"Z)1qc#R.WO</cp&>!'ԮJH3׹h=t-/MK=>]B >p|55Is?t_xé%[>;~UeeC7Ekÿ57Q#ۙdS!J*Q[RJ߽s|?0xpK$gbK;3+[o}h+sžZ_[MtRF2p8+h*e('Rk+}Ǜ+i-O.Kyeܒd.fsT_C a+O "Jſ`c03TTVQJ EᒌU8:s>|OχMa2jeW53࿄6rxK@4˺I@9,G8aӗ<)*x,-Jt%p?no $7Y>El,sR}_Iח\~ξԾ0E'S}CV ;v'Q$r~b[sQZ::9i~˫3ӯZAF'O揠\*ZljEyH˞T"gXN4iƜ6JU 0ҍkH +Ssi?ړ¿ރ+BTkXWG)]YSq,$0= ^0 4NcGtSi p0_r߅~"Zx:? :ńWi$RnvLqŕjqߎ:}}ׯ?=7COu[ >Q$X(2Hn&^sǯo ttOqr?W/|=gD#.mt;8њXo&.F3Jp0)Rw5kߒh }ok=f&>(w qK_ZCƞ6Ӽ _Iwhz}ƥr[^GGT,B@2E|#?)j;;?;j^wY.De $n6d*0TNk1kͰ7Rin-z駻ԚN ӭυ1_CM_kZtM %Aao:渝'1%Ϳ?"oj,E~1M&x ?7_MXl<1p5蓱Փn7>[3izG_鶩ggX K訷@j bH'𷍦E(ɧ27|;W_x ?7G3$nׅ,ӂ%'9`kUF_q⏋5)>MV/$:_o AEz_(73HM7_LAH-dr:ywNbN1Ko7gc;DM\aø 5e]=4e=hh|)COjz;O[E(`oXrGJzG;~O4g٬o7Hҿ%1˻I}y w7t1M&y|}Ok[^^׶wZouR,B*o33fMۄ\ۍ@> |s{xk34Kdd`cݓ3OS_Y1M&x ?7], >*VJO_2cB=bGǿटw?~,[zw67F2627)^M4Qo?V|BUmks:4 dbHӟf?Iݟo7g\_Ùm'CKNk)aMN/|* h>:UyvVZ]QDt{q_K1M&x ?7^$>'9k~&'|z;B׎?|kgu3$n w7u?< @j :_ZY]y\Gxq> ɩo1v_~P:W۟x ?7G3$nM,ӝX %x ?7G3$n7oȮLOؗZڭos>FZD$ؿo/g-gY3i/睹=} w7t1M&{؎0fa14SkMziӱp_ZY]yρoOsßqxO,CK/!싗Qso7gc;DM|#I*R[٥exrZy4޾е?_ZY]}- w7t1M&sh7V:_ZY]-x,.c;DM?&?vn 5rb}?-x,.RٳO>,zGuѶ8ʐq_b1M&x ?7[Q8/ R5`Q5Vz5̽;k /Ÿ^r[^͑_KiVZE|eeeo cq"* {o7gc;DMs)bj_ޗ"+SWOoмeŞ ٷno$iA>v,|ܒOZu~ʿ_1v=V\ĹՖ;}9N3ھc;DM?&?vni /ab.M ;NCoikXHA_Q1M&x ?7]pmsW淥(V8O= ^8 ?Kw%x ?7G3$n׏[4:_ZY]yWOۋc#~7?!z>ZRO0Ķ ] o7gc;DMp8|?f=_#J<.y'޾е[o7gc;DM+f*հU)6uSm[m{T)YI}?-x,.KWlO/̚ҟY W$> ?f?Iݟo7g<%,."Ʒ+ХJե$G'ÿ+gi i}۰xn5h`2 = {?_%xKRψ|#Rɻ(-̱W22A"c;DM?&?vn1\QbbgR;I׻VFױ1^+.)z|*~Ϳ|*Ooۢ< vy <\O?-d$:oZ?6DC#r+|(GMk"GoZ\1tTв<OS^iph0TGNqnʛrrm=墾 uW4MS 0 c{<'E_Ln#3V8EyOi'o>A` dcqyKヺWu+Pҥ7u~h '|M>Gh#Llr0Nbu'Z4 'DE֠-!XE@76:sZ(FyjFzƴ9*4OTGo Z1PCoV~?Ѽ٨H5L6(VP'w:O[%̣b7p7g(JR)2jѧ^c90? "u~UI1-Qrp^SM]CVUּ1jX%{!Y'޽~FhTkUpkÒfyg?ه]AufE[d!|WxzwKSMpm,߼`373hOFd*X\={*i[k$qx36.->LZ9]! kˬ?`σ67p wn53&V\)3ןJ2}L:o4]/HtT b8_@׫Q]I$ԔUǛI:|- 7y}14QQ p~H}]ӣNRwy~uaq bkxXHzW 3C_+ 0$:qmi08JsJ-)a߂Pʒ'0e?ڷmݨB((߲H֎ 7/~iK]Yl&mq%9=Ops]~; /[Le,H:23gwTG i.Fpai.W9#N=CÚ\ 2w k1pQ> |%e}J1v%31$tV:=?iy}Zm))h O)e/? ZB躔=͵"vd` B&+!i]@HV[af*@׹Q\S;?g6hp}C_@ '2>{&μ.c|gVhӭZMyRGTx 7xP|?K[F3 ttVGrY'o28Ki h DyyBPuQg|;yMae-W*YDFP8<zfz_KZS.˞=A'Jԝ:m4ZJ/[i<) /x{D65w-~ez ^17'ſktxzH vHH=z}ƠnU~PW?mᯅMDFKH ;,<^D0uNa;_NLJOR q|jVӢΒHh9]eaA 7Cwx[>isu-DF~{աJXz|5 JJ\Gyc𗇭my\4Kq{T>?<2Ԛ_ C21^g8a]/gW/kh?^ArvqVi%+@{:OZҢ%do[$:&o3Pn`F.!A< x?U zkWQXTѬV ^3i֧5'o~ WžўE$Ǻg_Fr=ʊ+XB4,:pJi%hp>"C g+WdW /]D!䓴9\c?~բ,xԮ$T#S# +h%~Tӗ{+ajT.W ~ 3MwF]v9Lw)EB7c{gEtT`0ev#JhZ`8JJn)꯽?OqZ Gx'#++$zVg; ##* ^Eb]Oj๻Sʯt?{+~ > GCᅏޮ'x*ľZL0OPrk֨F+8})ХF 7ZxBS^Z0\?=ŕ̶sʌkgu/ q4IhM&Ìp:cze?hnW1 R7{+Jz~[KOaۤ͹6?[b@t UժK\Ҷ%(ւ] |_D;mO2얚׮ Kc<E\)”y`)҅SItZQZp_qYmNxWlW`7:H63$ڻ+9ӅX]yT pTG)m pƻcB*8`TQVhy_/OI?ښMqr0lr=!BOU{,mTGI9Ό[}\W9_'|E/ŪJ'һckJT ױEmN:*Ԣ8z8tF )I~G hZ7umPTyyv;\?(+B,t’^'o'5i; %^Y4ۉ-F=ID`=\^EEZ4ZR^juq1%y^uһpTG$=Jj(NN)/"RF<%c|i|%ֽ>៳9v%brXI9 0xR<< vO4o,WyUČ@$rǭzrT#`0JnjRt{OhVacvnf(U\$2I5?f_5PϪ0{ysF~6xQFXN)ԡJ=H']O؟u(.b`i\qLٶ5jT*v TEGX8j8eF +X( ("i?ʹn_z ( (,xg}ڷ?_ս@Q@a>Zܬ?ޝk@QEQEQEQEQEU?&oO h((((((((((((((((M=w|l)q+Һ[.EVϏ<3gq-Lj'I+#-AViHfe` )LqV1^WFQX (W֝g}^K.Id| )99֭N&(c (gZRy2-|ONzttin\)(kmVwr˷eY' NNOKq6(Š((jVzM{u9\Hr{d43Gs sC"$B AA>(0((ìX}m%c/l)zu\u\tiQE1Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@OMta]/YqW)&I(0((((((((Z杣yic݌g#8+hVDP\9W}M:(kmVwr˷eY' NNOz(c (M4v𼲺jYrI=>vz{/!ݷ̷d\dfwQLaEPESִNY vd0̮郃GTo nt4U]7T-V f$ Yd*g(5f0)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEgi$uK+YH>` >J2m-4QEHGT45}Fk0~iΟk kM =yW.QEŠ((((((l,1E:ji/6keP RyW,rKD((_z(( _6oPEPX~";ַ+_QEQEQEQEQEO jS7fAZ_ּ*=sڰVUoX\B 5x 7WDW[rQUǧƼ¬Ѧ+_o3+TB]I%~nmjow"_IOxm.omJT AxY2{d׵~_ 3n~g'ٵm)1zapÜdj|DwVdIJG[k+~1R:ljHWUڈ=v ^ w{;]YgNhJsn.+>hڗ?t/OѴּeN`YTd/3e*x5m7sE67 g۞U x U:%f4nB{#H } 7Ah~-q{ 9[O/ >q*IV.HؽV:#E)rms)/=_F'' %VAuV;YNvsAJ~߀Wj:fӬKmIs"N9$r>y1)mWxua5>G{i Z:{3ڛߺ-v0G] TVT~-˯X:ؼF(M{XIÙu|ˢ_|C|=.OsmARG| Ox-ƗoeZڨEy\T@YYp85i k+ľ&UEid.D#Gzᯇ;4+#GV}B#cehrČ'|=Zq֔̔wӫk҆*9\k}k#W)֝Oa]Sb@D\1UQ?i2OxFB呖o!W3p #H8o UMcgCbr$qHO+uO^ ~xNͦmj--1ENsܓ[*{\LΣ8$ݝ:qU.tUtSnϖ[]O6uH|CqsOkͧ %TWc7mJ N20r>,)KZԦ4:Kqc|a G^=YKt\ 2t}Qm|_3}ռEKUڴթsr5~աRK'jKD]z5?ǏڊR~\u[CwB1| ,)8UQdIekH^8~?u=2h mH}VR88X~=/WP=O88#wK_ t l/PMBWභUGr\I }q8#EZ^o׷'o}cU"_Y[<^gVkz wL4wv{Iæo5/{A ߸}9Gz2Ҭ`I`'+!EN-+5Pk]~&xGm#6WcD_+c <kٗ0^Qjl+m~鶨|ipUmR0_lG(DQU¼%*{}_e<爩V%*qW3W_1QE{Ӆ%-|gkx[}ֽ?|/ CfZ%,%߳3֭|yEuivS G;H6Ӕ?v?? wx]VĮ d.Te ΕlGPNN2_U:O]wHi+'PG>&&j-x3d`>3t~xZ|KZxú~ek%ꎥ[5E}cBTt594tOˊr`N#?#=z&w?޾[I4l{f(3_kT`1YnZ3,JuhϘe_ ,%Jtz/?c_]wR 53=Ŀ9$߇~?UUK&TNI5QZopTY=dψ< )*oz?C_e Hi1ߓj(%Ϧi~$ ڋhڬ`,퍬/4T{?[ZhH- JgTTb95`Wk*49nZ=OiRmۮG܏k8<?rOsimh2̑(W>&j>?{WrWdf,ݑYvgڦg׼}t-Xf r$vRXUfwW=c[/7m^?dğ:NbjiYbYYW@8{TP)heI 7x/w3Fc +*=__|#߀|4ׯguvo$7 ( 8ֳ˪jQ"e5ӵS,2 ^ {oMڷ_SAhd}jckҢhɶmP[o-Z|3Cď|n-0eʜ|?>_x$O~p AS_ e*ttuӧM|v+OF&7ڷ6}4M~ )6?*|[Gi$ה|P/<2ͨĐ녔mRHck(oپڍٯB"4TMCիOZ J)'}D]om8Ī'ncZ>ܜ Y+_j^*w[c\ w(X#/<xWQ w2Zѷǐx0 qNk}U|6YztFԥmoOfն Z豬m{0"wM_[\iupF&p\WĿ Z㏈ΡI~f@_pB01SyJWeedֆ$ޮ%rGn'p%:`ƭoc_zmq Q788 +RKk3 ZNhקםz~C% f8sTA0ϧ_u|U}X2{Q< Sw>MV>5pMtl# g_`۱3?^0R >8|U1ZU$ey q rqCĿ%j #ᝌ'$uK;dH"v"T)Z-#s2K FԵ7W[3H'ĻfaOZd+u.+{8G^JGSWkn -sMus4/W_?hχ |QcڵI4PYrȥTe[3J6V哎ݸ*SZqwz]yMfI]cA՜Q%,iq Hk_?l>/" אxh'M#M.̡31'|FbVt.-vrbg*JQ廾ݾg5#0K1 2I8W [㇃> iV:bjlIB?ioY/"{ SGTAdw[#R畗^LE:qn*u[Jj>dھ\xn"MʒqT߆.Y6M5`T{uBVNަZB䓷kQ[$0Aq4r}qT4hXiAot89ͯGw^8InMpٱm\D7ec#3pr#W~ѿW>5N}uӶͱX3ҠUk_nTwYO*C 0UQI^O*|RCAu9<]_H剶8˵>>|zCdzOd3kiazjY;;9b 0ף#j>cvou6^)=(cMEUIWxzugtݑVXFVVwM^ݖAy Wyn\T֋2-{xGk4y+8(=A_qM4v,ws OaZq?XSRV[M]ͰXϭ)ǖPm5hc^@Zhfp]Anl*[_˶r~/^Ϥir572X?(5K AϠVhK6XXA=Ep2Keǝ,D56WFVSG4ny| Meu[Og n[Kv[h8^95fMvh''YES?ړ;s7(E{4QE}AEPsEk 4 H740UQIT4Xʟy-nRF_Rq_ xnQ>3xjះ$UӬdnfX ݘ@Œ>*~)s2VѼcl;o:3QE`^$qE悿[7nG2ׄhSWVrV+O)1 2X=kg{|0Nw-]y$5b 9% "a_A0X|3B;6g0ݙwd(s[҄;$wnf#0ThӜ`ܪ4Ot蚵Ѷ4ˑ{wj6|(*rV\pY/nC |7R^Xx[cT>XnĖu*yqjTJN;6yUto6|5;ZY[OXle#z7~o>y2ZK1 IteiE,TfGPWӶo/ 纺-iFY?iMs֧ xjAe0LvySҺ۟uZ.G%Hd#%}O.zmY3^sፇ/40>p0gi$?V'rTlŪ_b]s~9QtnGiYگ ggojH}7oUZUuOݔ0GVc&]FxݷB~4 ԼC]AMAc]:PNӹ Fw}9[*DY'lH陰>tqR'*qp߷{҆2RRXnVU>i3Fibduw$fy0MD)LSb_K:s7klG(]pެB9>j<-WI/5zY4ۨtx盬S[Ζe^R=uL|E<+·ںkh~Pr 񅞝 zƣjVs"Ȼ#! nKB`plZ߰}~~,Z]jrG6LR4Jg[)Qun[ў8~cT4nmrϵ<*Wo5u/I_5#k&xQ%N"yKP@I$s 4W~j$7+3Fџ܇ 0P9k9{us"'2}mݎ.KfR6\R^^[qunm7l_@Bm.bG1RpRW躷ocN2;ԫ{F$m}եxKUΛY>%N+B. |ywZC ,2,\]#ٯğ>^%TMMխ1bv |v݊飊<=xVwM}jJa;]Y5ec?uK4?O?G;~9_7/|Wtx^%%S[mh9fhf+k|ǂ/XKKɯ_>e "0nj\g=|| lDaUPivў]Beiv-GTW?/Sg+]Uۋ[y, ȹ={ۛڕǎ9mro [^[V!/tm2džoVY>qWNyk},ҚtUӵvzXI/~ƚƞyuC&}65_4I?q}=R9<. _f_>wT?iI.#$ޣ -1Zҭ>޺#j5~B$tnՕ}KΟitxt9m"ÿIe?J#{\#DFwb7@C' mt$]V7 D~"3vMe<]Y֕4wmkgs ӯ<>vW}>VVr 6YR/Vc?;}aO}C‘G{n>uq-r 7*v8_6Avu"3<[RΥTeϪ:(W:(Gv}Swi? kxÍ-Ʊ}/tf+u9灒H8P~O,Gj~!mGI!qu G#)AЊi{mknO? bqх\=q޶V_KޑKuE"2r5'pI='bc𧊿j_r×|=uyr?!Cu~^)k;I\4DIN:O_Z6E,86ƽB[[[ޛ4vmb$Qvm|g %s񦓤|i|=>tY@ 3*܂Q[#HYWF7+) "koE v=mAq aG' }_ ~Wnh:cM#1gS5́(ԭw*qצlq嵥n(Zz7/ ].ݮ/na^ E8t{Mci4FPNgY@&м~#P {M7F``vơ~\3Ĝ/~w oˍ^w"X啜VRxv"?Sxzw 9*/Rz}5 i;jTd=j滦鶋uwZڳlYQ z'Z~~#N4K{ %uuam |f$d Bg? ^{Ʒ~Ӧx~cv$z;3̫h鍫g JrM}?tb3 |qrWv۾,#ywyokh&iU#x- & =A_OOm;ǚu 4kY/#)EPxN}ROnn^@fG;`R:WRw}?# RSi㵅E$݂ROJgXka}m|fdM|CqOګoi򗽊հd1d#1%'!G rA~Z-_ .?xFho Ǖp Ў+HjՔ*w[W[9zҩ*[[W8o&<_|IWǟk޽?,櫫xg3m99`leԜ 徊s(:9US[V(?x53:u_^:%:c$NWtqu$ /JJ/ $[O>(L+ij ~z7m崒,~fnYԨBU%WkUr-S3}u:FOqn{yY"`B:?o?+P񇈵VKdDvۀ9]eͧ|@x@=ZGf AP aA$^e,^&GKܕwi>[+="Bʈ% uVԴ]cO&x&P"0!$Rw'{hK W)T7#?Jt,hd+ Mw tmPY>xmrVn,{V?ě[jO| oQC £ ޤu$WJNqD-kF4d U\Et%Ltlgӊt,1*"1Ԛ>8Ѿ'Lƅce 7!sݘ`+Ik.5+ᧅKkI<Ǩ.Edz1P--^]uⱲBpI袟^]>ӼUMmaX^/XmG9Z'i;Ih*a7YYeQ}`2A>.|Hoc?M] %AWr89RN '$EEkӵNCu&-Nn5>2>t.:WoߜuV|OG(} %J@dq9,zk!k1N5hUQ\q<F5F>ިCM*B(RמhϏJשigt.63xFNIS׹Q0n*t^ߎ+s^?䴿ɱdp($ű{~nT῀ߵ///|׺s/ۦ6*B _U*)βtdwrʪZP泽ݽVfDbuk [K1mSÛL# morΊ=79>'`Ϋ^F&70*sgiSQt0qݷdm[VXaԥvJ-mW4wH*AR=Ar)CI8||jE ]D\f̿Ģqz}H&5ZOi+]TT1aZnWM=>'.T5xF ξ: h eoĞ![=2Yfn#yPDx1w~؟"btN7a2f21W^ B8Meݾ<3)G˫o[/}C) dʺϊ_.x_ i~Fe&`̥Up ; $U- c~{x/ů?⾝]5!ENGEO/v *odFSqz}~^m.g7Iٵ[]^omㆍVEsIl\( *FA [?¿kLHURv'HZz XmfUиdu=#+l咨ݯ|V}N䚪ݯ|\}wsoJO(Qjekޮw[r \9/Zo#k\^{rŶ\M sD!'ҟg~)|_t}kA uiCU;R>1GףN5ս4geM .hɻ7neݏH#*"1ԚoOC/ZSqR[\exhv }ɯ\tcJǙԷ*}uṇ 4R4ەmZo]b5 ׬V)#kRRNoǨh)ctH$FU\18A; W[?7/{xztS'ԘwH;A9$TU#]PAE6wNۭDp(I['t}+YIK߱vnɟM|sxRÿ-M k+jڄ/X?q}=R9<. _bT:Xx'ɽݼъX+ԣkVիW-t茗W[bҸQ^C27úgLcOIq?0)&UAleq ៍^/|hVWcF 2);#k޺YPٻ~:޴4?n޺c/ U. jH#xnQYS O}oyouȞ96?*ex>xMM.vyH܂~;6'Qv%t/۷ 13+F6z[<|8onm#C#u[>GV#- Fkƿlލ _nʖy@<2k>~~|eH}K,[˹&,fTfYWe\UOm|<9ݒw`$vJtn I&6 =AjJBPho izV{yŒM݋;ۣ/niZ'?'TZ-qd3#tqpWO[0JueZ<-^Mlvi2ig$q.'T-_N7|A:\f'Cqm֥__YbGxƮP;2T⼿S{FÞӵkKyyiU$рI3 Uz T;FI[[ծes:'x2V4=GQ\;n+7A@}2tφzo :j9yD!*RTOS·J2}[F|6WRIФ^ފmE>ypҼ?1|_#e}NZΙq&wp昢#(܂kŴI^MqױF[V7 eROJJ׃3SD쓤~I|#ZAR/WS[V$7RUP=uڇ쓭G[+u᷒Y̊zO,ᕉ*b䭷y8,4qz_ͥm~QT]I5Pvws0]};SM]QLey [i6Ms Okk> ~͚'9kqf:Ƕ!$RAS45xI5eZȳXڙ</lV|Ud6\vVf\wd*biF%kW}vO֚Qz*MF\ڭ7SJl,1*"1w&_~ZA7K-RL͚cy^{vmU 1&xI+Kg}N4Rߙ_y|?Y6pxQ~3ݿC?a xWKs}xcƚ|f[ IoIJIRFz&>*^\Iv׏Vicpѭ ?{gu#V$qQ~T}E|şxTI|)i#*ᛃO55~?kӞ*dIb6&4]ojO㆕!"7R8W3HY|k|ajZY&9IXq^MOj_$ag2SDO~qXڴ𳨠-71G:ʛJz/{>׿k/Z,~+u-š=V3¾tgE+d`5g~%ƗcJ#I.+^Un#?TEem0B8AU_C#UZhC?\urKVk7tRю25.VMt("I ks_3?e?_`9?4&YVVAwAI>NcZpIkiYQH"t\YuS=t> ,IU^71qҽ[oMՒ8-GZE2HTaTHqbx`nCHp-#`˅vNy7>)|3n6+7'n0 7^^QT^oU#aqu\MMȹƖx R;s(ܟUl?]i/k~#?]nmHQH{_/:|y=ׁ|C-OtZN!rcVL*S?#Q5ꆆ>Yb ]ߎߙ,eymo/f+|m{y!hH(ZGs `g\g^x7(|3㛻yk)$$!ђHʁUdG}q|(f*l<=r.Yz=B3} cW L#⩖b?0n?(\c^Ez'qU6xXկQM_}W5v>>1^O>2Eh$rN_%⯍^?]w{g&򑱅

!ўcmzֽ$Z6UJQUVac=]o1qͥA~|;Ȏ3pb5R|s[B{.' 2I$YTiEYx/ƿ?v7qvǾcxg▅xš[OxeMFO+#̅ t ]/ 2ߊuMKܛw{*Oa^GfxYM Ρqk=@,#y1?g_ %h òM.~%F7o.WSl{b &W@d=F ;Da0 BRPA,oMs^*<'5c&FYQddQ@Yo/=d<;s,+%Aw ?i֧j \iwQ=@cp   ֚E16ݻ4S5iw]xe>ūj,o}!@Z$Hy$`I$W~{*񖛧Xޅ5݌}#H eBt :v='d8&GSý} Gv_ OV6o Hc|Jݜs@~Z_ &fcN-幌#r# ]}| >I5~)$QX韴$z X K'_ mN|@E*{r;+PAR2ik'?ψp7HdlBE@: >е-gTfm%)aQwlI‚p&ɺִ˝4'Ή߷#v7gQ@-cu|:VY|=q1yvX;@#|%>k1,Ű&}&>\+3+_,}arlۼFwض2}ɯkkQ?(}K(-@vfk!%30Z5~eA@I$Hd?<1k1x::֑#Bd*댫# 8 ":z~3|r_ îxg[A1f$AI?\,<5_jڥv:m/qss1E ~X~^"#n4 TmQǧԃzLʭHۀ=/RX{Rx Gn W4:Z:eU(ǻ1Q{"m_<;Ş*ռU{evZ[1(a0X`|ocOJ_<-Au^Kis$-DDrP6 \H$Ws_*u.?ҾĽl绻;k[xYfh,O@$C෈l?=F>k0إydasJ[+}u4WB$6%]T;[ #//X.mG*0eaw?~_5kx綋CC"K-$rBK_jzMbWLȹ'F)1}\џ~93NJ_|UoOwv Ā䁞$FEqZ/;Xh'mHOK ^r>@q_?Z{|De8&ѣlDnʉ y|Ad.-KѵIx>v*})c@E| P7zS]-nsG-4Y'r{4k|#.-|Wsnh7Bgm$ARs\@~ xg5[)+u6t"w9J_nKw^*—/xE7-C#|_wuxw"H|l{n5|T%f ]6D9M;XAkkoex/aIa d)/ԪǍt>|K݋-L\T 8I :ymO?ŧ&(#'- R`̐p|^qO}XQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@?l~.x.y{$)9og9fm2xcFkKYn-aZAOoV= VwWBI|3R"kѴdx7Moj 284aPH s{+)% Sx-;Vibs~J2)YmXo@200AǨW߶4[6{A;\$9+POׁ(نc,wN6*[k18\6 TӾ e崂[khd׃x DWg\23?sVG37b2rن7ᾯYխX6 (RW'7,&*jIUjՍN.qpN 9?]/Qwc~kk>/|Ҿ2[זK` N yss ̒]ެ p6E=|yOk&}x7 B D8ێ )N<^/ Β\]VGJ g~m{lm/A[RZ9,u 4hh0 8^5it > cITG6E$G!YWq1|Y+:έ^Ggg,r ub>Q5ؗFԦ-, "I=ӎ}ku/^ѼIV~bY l)9S9sM7sZgeTq8bk÷{t߶SկC V|>b9m[da{;ms*kYf 07|}W_x?jwie5j|H `}Wuq %P8ԩyK8S#+EvQ_"{EPP4_a ɨ=IZɢ.ooMGzMWIOۊ򓏆g_5s~3|$O,oq%|UMf>-WMz$[\uM9)H?fB}Ӯڇl⽋Q?fz`~XX?ûWZQ5+xeGP;;T`x[w2qe`Aco ݷ? >+eneYkۊwY~-n5G4+ z2J|:*WFY |l뗗 ijz i#k{I^hv~дOAaGioP?|gkݻ]|0х}Ne#i*+KRlipĊ2xI&&hiXK@UP2I'_u7-o\nd"iG//ZmJp#t oux7A4;Klb[\ĩnII$@1TA:iŻ!ɔFVyCt4 CNhMy"I<鱈4>I>8|Zn}ܹ u3޿F+%C |E}V)#UeGO@z_j_߷?~ͯ~׉|d|N<'|7>s)~̳Xֽm7ⵖ[x֯i6\gIFU"WŸúMƧR +v Pe AkC;%V[NGv"GE"bYyGI;H+om96Y`(1'hi/~4n vRIPP.Gmր>k?ߊ:V[%3 'pTP=|h]IHeOPF:fڬkiԼOx) dŒv,~8-5_o(f?[^OyD'Gl\1]P@`Gj?gtW3tXr-W#pH<|_3l.?p-¾cQW" kl.|.Ig}'Nm_z6Z=j@fNO_~_~_?뾓6߱hhzf-tȅ|sr7ܬ@ ǞJq? .>'t+MC{8F3 n8 [C1(HP` k^=J>&Gj2 oi> jizEFkڑO8I M|8oMo l 2#vcպtc࿂jڊ㾥g5G D B+?`j48W/K}vC_m$amcavv0[đƊ0?টc?íXOE/f 2EG!dz4l}@Sxghޒ}}6 F?i.?\?/?)oi{ۈdOHϡϥ}^wGɼP[TIk+h7+jI-|Ώu;XFVP#,FH5QO?|U/úߴ7/c%) $ zM5w #kJ_xS^;8~@,G=>-:ou=2-SL\9#f|VouSwFI>e,<%_`+ >umh@+z~ x3V +sր>'wz߾4ZU\dCiE}+^-#-lg*ĚČ0 Gb;kh"?)bឥu-_J_hqI׷xD_6E5xO$R& ,rlEۇxxWY~%Wxf׈-C IY@db#z5O[/^I-5kTgx?W~wU_jm2[-3?4}36r[iDy$dFO?18zW =L~.=7;=ڌ]m U*\QzÞ<rVc-WaB?M|1-g>tj7FHǦrqkӧk/. 7dQCe&~̌cMyo?$]1 bn҆M{OQc| Q: oB_c4X#¨NX'u1kkTk?J_Q?gGPմ+mF YTM"فn9m|j>5]W >% h'S`o'҉i(|uJ.MIuu4vٴ+TQi$^2 sG^+}~:֛+a&[ 6h# dwwaa*{չ ʵ?Ҽ5Y~"$Vt '8{Ȟuc _&owT )sobˠN%Gz B iV{ieXUՆCk(*Uh;В#dѭG>QPn?_|;V O$_svR3p}@W=P_mC?%Ǘ+>p#gڹ2é{59X=>%k_+{|yhy̞yMלLyN|#h6y@"[eӊ|qAuKV "2Pk)ykr&̓ZoTQz|5ٟ24oo4o_uSƯ}r1]9&U]`6?i<iy|{0o`s_W׷ETHݮvV]?/[A]|+`+?l5 o k?l5 o ha׏?f %𞟯_m55k,jC[&ۊÿ|9e_JViHMʋ0#12k'OM^)6nt|'t붶u$sF>\@pxK:/'aOEZ 1$$־w(:41/x7:>"΅Tp6ʮW7qkq ќU +WVxC ];N _y^^AOuu2[@,HUFKz9:>\w\[FOZgpO3u5?qCp7ΐV8N'~?><|c.M2$kp=Q3}iaL|e I>S,peܓc_cMeS^Zlp<& cv k}Zƿ}_ MK{rƒ;sר^+g RaCZŸtFbu[zH0A*UA,Ba1@=wZKx_xs?i˪^k8TZd߂+AÞ2sS6WkZk{  Bv`CK}Jx u]q@?Jj6? Ӡ"V<˶?ݍ[<ڬqpz+~F>V H]4ww?^h d6̼^"O?4n,8Gӯ?ٗݾ+#x)e21^9 7_k&BY|9t[U^7Fsnr`]o'-Jst=0?鬀Wƿ7=M x}&^ 5?<ѝ,E12pTW_Lf󹯻k/&~3V߄?ߌiFncE,m~Ձ <l?NӃP?>Y;>OEs$ o"̏UYHOJ%s{2ѾIX Ik?&烯<'2X\^Dжj#,Cz yocD߈k?dُ0+i^?/|>mۄ.{>'Fk^cᶤj;|9$94cX,?z6:}M=Ä(eG^}JkO-<3{I@eQ.o?'}96~Sv,ZdS9AO#>QFxN ֟x&UrDFvޕ~|p|4k?)8i^q_4-?~ n"3\ d '(pXoڞVM2Muip'CN N8z :2᥽"d*cƲ g*JW╗ųOpE;K:%G]4I'+Vy ؽ4_M_Im+6^)5=Rӵilb :r2ȟJ7Ƌ%."yH`K$Q@$㟳ٝuΥs~}Ƨ*;,idj7'$^\ߋ^o}?o?*A un'$ |@p-?OP˖v膽Cm)ke[ȃ\_ #^QssCKj|A֏x/6c+{6iǙ [/2ɷ9pN3P|J;ﯝ>ZKV?oR,'췥•>)#QE]k/t*ɜwj'񵯁fO\L˨X>n%򶯩 E'x`˷[lJNo};y3?nud V"~G &mu¾ xgZ歧[^$,|HR MRwпg[/?MX ||nټG>.XĸJB$f`2_M}} _<@?|}D~G_t|;ooky$|1WcĻq]XgM5iň nC9G@ ko |;k %|`/@孴t{m=gyoSE?cO_lN6P%4Cʪ¾&Jȿ' ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?_O ^wЍ}tvJOMWΩxGO9#@ox/E#EmV'X74b9eA@Q@Q@/3]3Dm7#v[ézojنϐ=7v|.mSt\co[Kf?#B[4|I$f'cjν'ntV; ,A#"^kRU=P"Zv>sտb OxizDK(~˾wêkZ'tS_vd@Ϲ;b癕jn7o N|6|+mj]SLdxB;$=wpNnxi:+cZ7Gx;R𗅠{_QܲdBѮ0ͻ+S".ܻ_:;*Uc ;WiEḵ(֨k"8$ћM?xP&kV * 6Aq޹?t/}%eYf;Fr$ƻ+8У,*G/5%H,)|7cZ+"ѕO=ѕJPe5{;¼/7ͨ$f`\ A ߃Ӟ+(Wy˺j4ǒn?b?Gt-R:Cg! GI>YGcaݍ2I'1<SlQ]XJ8It# <>J 3>)~>&EŜeA$u'a xP0# ч-5Jfh3:vM6p xc=Dvv}t}3eq]WZ\MGV8Q5d( g▊v[~"jUS5X X:PGc? 3>!Y6_t]ŊkCI==M{x^4aVFI7΂,lc429^~~i~ $M$15Q@x 샤(u߇0Ig/t)k)'P||)cT59uxUG}pH%w`R@8'$cUMNֵ6j:Q\E2"rӕ<E|?ÿ4|GOkFmXbZ(?+Wr|ImYMui]N[4bK9eYU`,Sm"MC6k(7ú |9$}Vq4d3>~׵MO|K-VO6L&E"68 jzo[Pq뜝N3 |eởhU̬nь" (_~w"jWVʶS.z 5_ F?h$ॺ>}rx}rx?/uMJ Ygӡ+KoDۈܣo5=P^?^?xŚ]j>%P' Jҟ,$JGǩ<~uP/sXZW`h@lHNs\`xŚo5MhPSm?ppzn>/x-#}S( ("?)_^i/<H $L~_}ce}_ ?)Lnmv]68(mnĝwI$s5e:6~C˶ؗB௑mchVc5=gk^#CO[zY'ؘn6/qs1gOic͵g~l9%Aۦ1hB'{Y5~ʖ5=/|8omKm2VԯؒYH$o:ԧխޫgյY\3Ork毈''kN(ǖ (BGo>&״-dh4Y-J$ia6SCEyo|ExThahLms"`2d9$?\ee&⏌==/iDc_GQ@Y[/ _LII$fcOV$\كIuO xO[x?f 9# W@:j/,[7?xMK}s0R}|=P?9'WMZ dWjaOGEtK9 Zh#ע14hʁWh>^0|9|\յ;K-ͼ7qk-W%y߳«Y~x:I];hY|Mw +$R$ᐆVQ־gGOok#iKH|3{Crv2V 袾߅o1za鑳2Yio 9brxJ/ x7Zֵ#Ǟ72 }s\@o%pDj[|Hamk6l&<761 xO55mϋ|qkT]j//cee)+ba!s0q,j0#O6)W(#W|?Ky[`\LA*Ty/mK+x.#hfd#YOH ˲>1xV(xÞz\c:^^ c` Ú>3+CQu;ZkIfYݙ f$I99AMc,Km_i'<KcK픲l㵍 cP aTg|Yk W2}F0,R(˞8"߰o|{-7]růˆ޾8 5_ F?h$ॺ>}rx 7vƯ{jtOq1נQ@x7dؾ&7W*Cү1 (p0R+hG_^jXb2C.G e&o> $k Y#a3E r>d`xV-վ$|D&Zjrvt?e@fb1ܚ2<FO 4&( ,-l[`]|C| .52.'.]M,gEg#wÝ[zLi:s$20TOֻJ(?uOo|gN [9Lj|e9Z*i֛u^XDOo:XA+{xg<Gt{iYz.ς!^6ͼͺg ,N NwwiZ\$A{tA61uV9x7>"]x(_S [=M{?7{s9P* ~򘠍z|ďj(-~5eFWU zc5jx^"fx^Fpr3_@Q@ _ WZڟ=>i+0K >²`!FOzƓi7e"U d8~~MFgPbIO'lW3+[ڿ1ҵH3IVʎQ@:N;Ӽ9EkuuЉP_(+cxUּw5 ǭxR@GC H%{^Eq?>> gԑ3qj@'IDaE=FEb~Οt}u$r_\4:p,h1L(+g/ ~^t__j6}"}&Xr0Hc zT)\ZcYm!J~|DV⏏lHHzu6%e,S5Pb'.->&CeܽfbiJ(քdQpԼ%ox"֥iy6wu3*\#cwb$P2xnQ@1~Wjְщ& \Q(Tc9vww~0?~|l\|Mkj#4:}պ@\)0c$+(?uOo|g^:c~5ך)6^fݞ\I(.:Wd^=%!n>}jsA\92koIFj|ioQoY7(w +J(PT`(S<#g쏣}|SF@AE6Ų7,ǚM='-ψ>34]>#:.uk5ͅUp.A\r9{Wg-w/Ю5CҮbmXݙ 1q(_oVڟxVG >"s8cnFOATW h5֌&,!f$l=Tc!H"$9©~(Zh|i YO \+pw2>R&O?w;RH乶[6fv0HpO5}QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{U^!k.?_OukX?x GGH[UtA@Q@Q@Q@'sZ CY/mדksu$EQX08zw_[gD8/q+5haRNRuu%.dL`t޾n멈3Mm@,TqN'/N{%=UsbN?|W,6zfk̍fy =z`?#خgi#/tncRYP}[ajGV)[s;_GsBJmoʯc+К2 c|?5ֻk}>"*W<CZll2ϢRNßS>-i7gfP )dv߭u`rN>Jw%{/3 F:p=>VO(jC]y(1'+,_S81ܝ~EqQY87J#\ǟǫxΌ)h5 란3+蟅4thw1Z F7!=pAtc2:KnwWtqՙQEyϋ&q]ROiwop2ٔzכ֍ J.]jСMԞ+g)_x?]CpQP,x,\sE}[cUrDխ̭ګRUQ^yQEW3_x~]oŚݦ63ePO/ZG_~+^g5$i-?-ʫnTKEJ&ߋ5Kd<恰O>qh袊(C- zOmjiI,o?~>|S"_ε_GIQ!AAkޯ5FPmU-oyjs'Z`q'(/߇xv-$ A8ΊkO2xj0&м?s:'*~U|->_֥=m [躥chB@44Q^!~ӼIhZ%|wi<#K%w\/98 W|#௎7sSVM͋w}Mݣtđ8r#9 +>!ўcmzֽ$Z6UJQUVac=^@|Sςj2׭[Y+ gvDq,8dgkp|8k9uocLp\JOLI}q(*Zk}7W1\9QUr4QEy?3 |MoZעUJui\*4,9lgh袼C෈l?=F>k0إydasJ+nO}#ľ K Lj+h6z3Tִk>X.mG*0eawj(+~ xOzE3 Vu׼OZE<˫ڹ=DzI+Ňb_#Y$?3nqf>|Mm5jƑv}ޠ N<+j ( +<d:.0b-@Fd*6?:_\gemM=Ä$QfcI4f?kڼׇoaf9/xz{Xu˝ߥw~>㝅DŽu̅6؞AFA=+>7x mÚot+J+UH@A W%qrptW~[b<\ ku߱:tQEQEQEQEQEQEQEs:֑ókZl.p@´NufWodI#[x0hẅ\3Bk q==KXsWÖmM$68\ KO9c4ܕi-za,M(r][vwS袊:B(G47zγs=6)mw0Q‚NK^y){sugxro-Zz8,N"((((_~-xEK+ᦇ"̖9IgrC4rZdf @ExG?7SďN2}~آ~-1n׶PEh|16k^-VK}*yp*\属٠K( Rм_SK{/ by"0:ῆ^[Niqun]ePI(_O|[&F g#+ĩ|Ѷ=]UWx hעVw:e}9( /㗄de fHɉ㌼rswWGýidgOc!ﴏ IPG]OCnm)uڂ]Oow@8@$h(."I!5.HUT I,A|U-7Osޱ kۥQG @Er -xO/^~ I Idob9A +53Mz+jgM:y`}:1ץEyůV/,ʂ}~B>*'K^>#InnU]{r:Z+o¿/ 5?(̶0IJXՎHV:ד۟ a/ ˏt(+m[>5떺杻c# 5PEPEy w_kZGocgo$4] 뵽 z,<:pI'^ wj7X|>uMdqu'iȫu$qֻo| %ՙwuls'FxzQ@Wj: A!eV,U82;DKh&9P:`~֞oej.T9o ij}(#Gp(ix<#,O찊gx7%v'aW]Քuj)=ȟfƺ {Ì0WFQ?kd6=g,"Ukmq}*ƞ> hIORfddTT|E<&yN,y3ҝ|t 7sE/.G:j챶q/KkI'#ǛKqY_~}i^^1Zw⧅[ddsgn#"# =+O?~ ihb@$=|;گ]|SUݬWR4m(P| rz漜)xS4/E;q\pݥ=h8/k9mv׸ y0|@_aSE}|pV> -7;Zw ldA Ԭ<7ʶPH Gȣ zy0j&7ǂ)%}̟&?~6xC<kP 3Tzk{?i:k6 |Kg,^gúu^Z\=+2Fd?"`WwF, ofڼW"l&0aV${Z8|N W44{RUoC7~Xď:234>B=OPI_`W˟}|) Mcai|]BrB@`#p8=K j: [X}'J6qPҏ_mNinܼc~(j3zcK4y>խxvSr?mX-8AEqWξP> NھњOȤU 8TVљ-'iV+%k/E?>?}>n|o/NrHծm:/mC6Mq^(_M?m?,gk>~_ &_1kMabnDbù1M^+Ohw>%kh\O7.[aue+i#vF m~n-s+ ĻY[yk끚> S\ V]KRE{M,1$!񦮦[33  =:-/D=sڵ^yEWt-;GXi[?8*@6~{w?mIXW'O^/ş4,3\@6̎>Ef;hdi(R#T I6]i("fMGKk[&s=T]Ǧ^ܿmϊ fzti߈YQѼ͵H1!t o3;?̾ $wZacKQ좼 B O>uq_B~~m<W'|?g۫ߎt/|-2ff зу־.vOįWV&-$m띌Gѕ*+ugxK`v(8pr1`?[xċQnoI.$"Ҁ< qQ<j-LexI n\:_o \xiPk<_2Gt`?2#؃~tԟ+w%a}=PK7 I#f?~W'cm(Gi _^y#(yP\``)@_PxoLWV{h;˴2(>TBG *^ |,o%ynX,|huۓxF> x 8tc̟'Te``tC^6F2A/`Ot¯}/ |EӼ Śo8rXVp 99|㖛GRR]jKy䳆u2D *;G{K#IX,yRހ{PCRNJ#f]0]:1D<@M  zãZ[i];E,G|_V? uO麯fy#Œ-8Z?ug\Gx,BܲOP{e62iGLk;s?f6f%||ݼc'=Ğ4wχVڞ'Cdc4N.z1]mF-aȼCi[9;5\Pĺjϊi?inwb7Uٌhn=>$||UtxC,3anbB&x^<WΫSJPѤr:d ;tIpH'~?~Ǟn}3u;{w-eFUAp{6qn[]X{jkam=(h'+|fl, p8+ ݎQDA䐑\b_ȋ?覯t{ zԶVkK)}H]g's^ .5$WvO2zF;{ɽSG'"Lh(+.; zub@n5 F;;+u,*/5]^"𷎼9 z^.Y&6dudޣ>"l%xk$խQ :1U'o{9FmujUh.xvis H9^Ov9l Y#uoM&C:37ۄXpϦ+| t9u+vl+wuzئ>:G h$c985sQ xqy$Ӻ}gMH#BMK=5W~:-F}za)w~dd`3—Q'R/H.xtfe}vzׄ Q: oB_c4X#¨Nߎྐྵ s(]}w}l=|G֔Gj!xr^U-o;?3H;|u?$}^(M V.JKuUO q_އj}wIqt &@Mֶ5xn̚o+eon 4`̰*X|-]mu_ON1q}/gG?L_ ?>vm A[L3TV5uuD}'FCqHsҼZ!+nROhWA s _?R =1^Pppj4{_]}zTjԯyNoߙh| J 7V׷8aW,Nk_#=Q_[p?>(^j P3'vz*)-sQmm잩y/jWvZy_͞'im-U`ɻ$?k*ޡ|=yxM5{땹y2G {YF-iq\o$Qy7nO(s "|^x-gv n3ʩW~_kIC|7e;v-/䣔qc{]~!x{ ~7QO(g.`R`:W߰ǟOuOOK5rV! -ԓ\kqO+s4 &eE_nE4Nxp6nlˋt> ' z|{߉Zυ=wK6RPê9VS3ҟ/𝇆m> =[Ej6pO$ԒOZ[ܣwؼ!t'{s:Q*.:+@ֺ_2++_=Ă8/ $3~_mculǾq_>6ڧ*+IOX'@ȧPpUA}τ~ .?xkMҮ#1?eEّ@0pAP 3:=jڦtdrJpk?!,(ϓZYqdJ ;^ԼS+.ku\}VQ~sLn~&|C.4hnV ?ٺ>x[H6[;&xZxN{ ^MqoiwnjpN+lo:OQ_5Ϫi ̂hP67m PƸ'ū~\kd/ϑi*3>y/d _/-omO?3RҴZ}?| &umaCQD#8ϱ_.o_|ihxI.ykMR;Ek咟{~ xOx/_~j-'l82`! ۻق0Z< ¾!+s=nTNЫ8mv3ߴ_zZ7YgjR+HNKI\5i.ճxYV줆o7z'<ȯOe%GPq2+WFu6OZ>rzaY#us`G7m}_ 0#¶>*Iី&h8}: n8tfV>'^!a]2O'U-ci%{?ݯ3t1Ӽ3@OwyL7щ7v7Vsg¿(~\wz|W61D. c^~`c>H>pEIx$Z?rPZ; ea5Y_?PC=bH2:!A@H#X,$ 5>B]߉6Zև[Mb[{WA3GzixGE( k}>( &dxʨ*@6xĶZ0Y"@)K¿kh>2T iq`d' g'&b>(U .uQi+p7L~Hc|F]=Rj:A@Џ1·P>P'Mc7鑰GtfU'v@s>x:iShZk5 '򡅈Vg$t6~'j??fV{KIHCE,{ v;^2fm@FZ7I; 8}3h׺uuִ;ư!5*#K )2x5=jI3_Zg1w>7Ur+imK##Zx!R(HvjM|A9}̈́8𞗮_AUn5Kxw$R/ր>/4|%Yim5c;]N0Uȗ>E|:F;Z++xdA̲YnߑW8/_}j O$2|Yoe[jN0|mዏx~m* wS^DvVٞ;yΟړ~ӟx[5=A,Q. &}ɯ6Gml,[{;XaN`ῷwoҨhM?K/a|{%|Av % q>2q4aXX$Y0. ''~_q_Cŏ~A}|) 3OtT5i݋3Oa_QG> ׶5@OZ/oO^m0݄c1NmQ> W>n]Λy}_[n/c2de0FFJu#xVk~݋_-Ψi$. DXQ*(UzP/|'k?>;4,bmw,h1k1 Z}VXߴ3n|CaCb]ާ]cD\8HFY_|UQQ^wԬ1ܡWhTEbg@?Ztos{߲NpM)yTYz%🆬m;:(ϻ9f>)3 ݪDPwcҀ>च? [(K,E@=} EIoki7]6:sK"A% 3sW|04}0?~淊xk/OᎁM1t-b$yo?s,p2I_5Rq@h>]}I?-?־L|maun\ijvN2)S؝޾j{CRÿ$FkA,VX |MSß {?\:=6{-J.D~a6O<zȲ++(eadN#/ Oz-Slဒrcو$ ee>|H𯇇ټ9;j -\E_s|P:t; <4N#Vc_=~u o>9k_xY'[9/ہZGvT"@#l);J%iNVT$me;Ք휁Ϩ:}Wo"4Vܒ*kSH3 K:"Pn#1ݙ'kKxJmFX"k2B 坎9ԯ/twWZj54iVPc|mnb.5˝R(.d;h$˻G}iZhQn..%8HH3 +owϋ54? qs[Ӯqo.\V?v67|/Ízپ {㷺F!?+#бZ7Wwno洆K ~}|f|Uwen'% >U.m.cY&ܒ#U 4b7V׬=+6-/%cѓ:~ktlɂB\K,+;Mzƫ{gfa_ ;fFio;on%0!?{oY%p*ofگ?lI#5@GqZCڀ?Jk?ܾį356?%ƥ5BǮf?3Zcs\ܯ |dpW D=Χqk.ya@C澈?h~8\QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEῴOňl >]¶:^W6͹Kzާ+_B׿#@.^(]jk<ǻ~_ȣפ((@!+Y#Wqgk0[8ca*6OPJŞ2|ửoT #23!Bu`Q7ϋvì$wV/X,g>lk|7x_I![nܖR#`Fkkr4JTdonFtqx7:tb6nֿuykIYEXI;PcjW_> ΡrErSbPzt?> K]jPq #Mf܍1wOM6"KB}wUe԰ѹj~!G:N_-5>;{ d\v)avJcmyo=Qȭ_]D_:Jk~p&4$( dq^-'?yG}M- ϔF[gSztN*?2imю4X:)n٦?kmOUJ 0Q_F^+|d!/,x͡@[xPsOEOெ>[4[i$vtu =s+0͓EXf\ u%&OC/a wZ+5z^Bm1#r<<+!u8ҿ@+hH}%椺I?#f`^]ĸrͧd UOK4]6K2]/TW~0O) vvmծgX)bGǠ13|߱/W'?<&/0u>˵uvUv;|?_4m':>{|ˉ1˱'^3RDX>:K9vU~&3^quEn o7۳~6EsڹqFu%:m}ug9RQW0#B'5]j6,T@-@\^~C}Z+>$Ķ謦^$Ia#Yn?h 4aouӽb;q} 3Rԭ4}>++hi.$q"3I#.5}GZҨw\|p;d/XJ>]N[4bK9eYU`,bjSV~)m1VĬ Ah0XOPFgPGtCt&! JĞO5:7 >3OESm"~1xteޙk6ͽb9uHF:zַK_~>eK !΀$ǵ UF0`oiz-I-iM9#@ x{~Ǻ_SSy_5Uͽ4Ik'~H@< m,}\{9#KL1!jzo[Pq뜝N3 |eởhU̬nь" oO;k_5/`Zn5]_Mek++M[x)_ zwo^/T#Aqk4@Rp>9<0aEԼwx>:iŻ!ɔFVyCt4 CNhMy"I<鱈5Ju J񿊼fK &H !]NpN8V~Z?U&-^#V%\Ǒ< P_xUH,_OYվݣEA)^7þ=?MWWYZ}J}V bx@MWvǂuox6;=kVqxPOcg]U?\Z$G1Oy''ύkωuMPfOH˅"]f,`䟥tCKj|A֏x/6c+{6iǙ [/2ɷ9pN3WꟄ0m?u'2ǯ fkFq4Rmͻ<[9AӸg|bOq;R>e{Kp%w 1رl׏8xDŽeoy<9pvʁA\yا_>?/uMJ Ygӡ+KoDۈܣo5=|U LF cSGƟ#^|-H0u'\ֿ\k'xC5GIJ4jDiZS儉H'΀;mxg_}A6c,6sn~p=yX,?jzVZ}/qqs3mHPK3MyLӬxoZĞ ?;Q"yDF$pGk?cx⯎<_#+65VZ#4ykHt{]5\ni*}㏌^ giv>)>]m4eq OG/lt-NI,-j"?$II5wcoOźjږs-%K-n-×  kߴ'Ý?ZoZWt#W|썃P{W/L*?h}oZ K8"s(;NSFokP|_ t+u Iz+>/2xMalHc~_]2&'4_boy[q^?/}5llG*C#"$^gx;Bӝdkv5*GkM$|tCj_نD{,݋.jCd7<9O)n $Le'uwW&S// x7m8s d "=ybעVo|;ajtR[+Cyȅw)eX@/1WW:?਺x?tw5=Ebmp?oJ=12ioRJ6*,p9$+_%Oߍe񶡨7]-иb%*q8$ @$PxWD𾏣o]>@޾Z_35I*h! [GG.gnyǭ|[|?7|d7IE֧ Ρ" *0jEA }vZ3\KMbFcqtw#T54)h"?)?b$f0WD_6E5|+RË;LJr~SEߵНFyF"3*熺aB/K{E%gtiocJ)8_X_Z.j0V.m,Y9t ޞĨ_VAYum*m:,Kʺ`{ r?>i4}/Uu ;Zb16s3?l_#A#|zm/Z n)o8g>+]|/˕Jnm\ }⽳{oz[i$FĒ DI'/HXW^ | f!l*g O$uQa9*`*5;/'dcS_/_]toqAuKV "2Pk' l|i9jڦs,}$%eߙ#U'k͝ⴶf)dyL׋8IIn6տJ|Uu_w:O_5x_-鲹L[x>jSUn3ڬ}g'5Fe^ 5 M]vޝa0:jo7{vEWzA^1eɯ|F[K^^yݿ k24wv,ы%H4x Wx;|]ojO)sx?/.]˨GY#1`gL|k <T[`]m@w1n sһ@[xLVѯWlge#X4c}oXZLʺ0X ~kRѥiˈT0`~#^7|7ǺL E)tj9+о Ϟ YxVQqzKN_:pd N2I (~?~뮝/ '-FY`%=דf!Z7K_G6Ƌy2&+&CA۟zVRi^(o6nNܑ?}AN6|xB(]4-e HF{gz`+3 OR-@|X'G5Y[/ _LII$fcOV$\كIuO xO[x?f 9# Pڋv~ >!jW(t[XnhQ/VvO_%[[vQ!Z 1H^ߪv^9'WMZ dWjaOGEtK9 Zh#ע14hʁ@k/&~3Vݵs宭]֩nmύ+\n(Aldg><y{:|M=1j  X&Id|zt~:osjyom W&]= V}/ BE"O eak~~t&f?䴇7D9''j( `(]t85}aOZ־$xoAok5> X=t/fl7?j-䁒8gKyfz&3DbZDtA/%˜UG I[[W6Px÷" *U>^FvjOODͷu+s .3A8 O&烯<'2X\^Dжj#,Cz yocD߈k䯵|Mx]4M+Z|! a#@X#(`FlR*08PF7o$;񥍴=݌2u6T8 @Q x^fm&Qdj7?@$,}z?ÿ_S^5 +EN[S05cqeyoեm LD`C+) ZvO'׆4]nj~̶V,g;G׆f4~w_4}60B\EUd?%m\g6 oԦekk2]Bc\^vpNv>(xÞz\c:^^ c` Ú O$2|Yoe[jN ?~ͯ}/ E}>egVvaXPeQ.o?'}96~Sv,ZdS9AO#MSLִۭ?P&{y^G$0CHϨ$/)ҴojNQ^۟Qs.uҾ[)#k<<۫pɁd{~ 2ItId#c~PGZ{Y~̚s1E\ e ǁk|9ܛxűʁV/Mm(m${P h1ռGi -E!S5c=AWW~ڿξ-{P,!݇Yԡ*?B!ca[]fLJT>p?OSfc_ O/^ ؜ُܫWFpqh/ _R5fAQ"SFbuaoxzizƳUy# X$F@$]|'_۫S~jSj~Ԯ<,6׷D 8r+9 {E#r=| E]oZ߰J%='h:?*Dtk'6u% p*ǀeiv:g*|Bl}e$  ևzz2|hɮl-݊&?H{+/KSh KKrp c‘E _G_bCFX&I&2@>~1޼SSm"~*u .g7(gOg~-l>IDxwA!TucO&#/z?]kZulx3-F⻯gei z^^i&+vBliOޅO[-uh-:3 u_3蟲JҾ;Gq,*Gj0/ ρ4>)ϧik 6(@$9]~F|SGO!u), Fyd___ Z?Ͷ'mYQcgBhL|+Wׄ~!چoxa )[i 3VxO۴ *IO̐Q-'X|O4;|D]#o}8ND^>/.qc=5jRgI\ddrhW4~\+}#H]]8H$RHY^'~,|;<VCeYc(lAV:Vw/WǏ+[ujGᕀ<POC*~Ͽ4Ϳ{˝B%KY_8(¨zw94ǃbSH}MYQoj*cc$KWdž3qAܱͥ@wh$f ~NxWK!m&hffP7`v<2ſ ?SŞ>Qm:=UK! Ԭ?fxMŦuʎUeZYlhc$keQğ wgFle9'& ' @?Tm.>wۋhT OCֽc_͖hVa؅ c+9x_k>%7f݃Q&D}x#G=j(<}zk&MAcd*J#|Sτ:{hgj>:|3F^8 p8S~<|IX֐Ư\hhRRְc"q ޸5zjPZt7êPړK^~Һn\:h#rZnևCz#Wěd`F"eGU0ˁG]x㗆t(>on?$y х{n"uVxJxFNôez7Xl*;_ ;A{GQ]SfF_1tdP|3gֱjM6 l`y ֡ gܩ~$uu[mJm1k2[qDO,aannRy»c"y\8+{/C,R){G&Qh|SGx^0 L$@8.DLfxQ32ao{8*1)%׌cœ2[OM)%+VO(jC]y(1'+&]}9n ^yҨU Q+^u:+Q*1q->I+Z8rqhº'J'oč;⧄-=ZbsQO~xU7_Yi].WGRN=b :䡖Vz7}(={*6TN$⬥~<^ M2MռQ"4'f-s GmPI8־pGԯ5cp8Ds sRXߥ}_3ܟ)xgtz"2rnzki ѥ:Ke{߁5k{=os3*xےkvL|!`{?Wbi{TtdQEsQ@~Uukv[HAveA>Կ !i|AyHԑk*rS_#LJ|;=ƺ5\.̏ny C %!aPpO5J%v4׿hxV5Y\}4!4 |Gw#s]O-=%Ax~ͤt$o5x#2,I* xk/OᎁM1t-b$yo?s,p2I@4Q^yAK_?[.l,_웻ܾ#O4▅J=z]'ѵI$drO7gd|Ã\kh)mZӎ/|#˨H N WK/1[;5#y|տ_w]љ\Lum<1b(o7T40BOkz???_ j&`/tZڭ亖}w-^Y$bIۦxӺ+-{X׊'k,xbRO( P.T;5jZ,4i.%=4R߀/w!5u6mFYnh`v=UPnQbkO2xj0&м?s:'*~U|->_֥=m [躥chB@5|ckggsش)(D33h[_n0T=̽#̈쭳=7v @?3 |MoZעUJui\*4,9lgk/?_+ h\Ou1@dI1Ҁ8WCM[Zk#d è5gng.m iVִ {II61ߥ| u-t 4k@ 鳙>vOįWV&-$m띌Gѕ*(wMԭ5>+h.m*Â9U qQ<jOdaE҇շ*O'8;mZ8TBG *^ |,o%ynX,|h}Ey>>>];,Yls%g ڬ^@yuo oPP8Dl7kF#(2ǂ A_tkWKm88R Gt襈(?%z׌/'OL‚@75U?Wl*\'jVvuO%)h `G+/o-?GWWi6-1ZY3OJ#¿㹏<9V4DsF2qSX?>>|?C:ok1,Ű&}&>\+3+{ WSZi+:[!mj5mj<'Oxe5`w$$?Z:>8x?K ZՕ!e)7I7x mÚot+J+UH@A W%qrquwO$2?f-F|1.}hg5G o؝wtj>mgM"V;5I')8A  }_iKOxVK$GVJr=."|wkk?A΅n2R:9y_|%}wFq@<;j+˼EO|/>xOա{I>8 7>zU:ݻƲ#* 8=z+'+|fl, p8+ ݎQDA䐑\ba1ҕ*rMN*nӚ^Eq <.nK#Hb]cX4ۍCQw< MgSZOeR KM?Մ&.Q^fߴÕlşM=wV$n1CZc3}LNՋ bIէ(k2!^KM;vhҢ}t[m4S.pg.Oq^{^a]kmr$88^3MI5dmƞ2U'/\U徛{oI%;gN#W!w__'Bg͡8'wn<_?{O{^oLY*zBou$I^]78T$I'mֶ>|@VݵR-1'ϖ+aį ]xr]~-QG9 a*jD:qrW^gMEp?RM#U3>ZůOTm;W᰽\&T|F0<үX?fK{Yބ}b/7:6|Q3z ޳M ec>pp;מCJx^Y!}&V+ׅ.|=c0XbIزty lXcXB"0%*_K/d=[]-%.9NċYgl8),y0qֺ6ے[sw K ?95kxPFM6M>iwI< S Z|P}Wqu76]'OQZU>֓l:嶰[!(g|g4WCkH'Ÿ ڢh{ڵQ;Bᶩ~ ~%heH!8U,I%p8SQ^[~ ;)Kֶ2e$3yԐ@9FEz|3-),gr:Sd@>ؿ>9!m> []]^x@XC9+:K !w4.GXZ-t׻~\HFI3{EyWjO 5[G)0M{pä;6(k~*o M2)|MuoDYA^WCxoÞ+^xOf(,kUW#gi#GݙrI=>?Na%m uzMxAִ=BTocZx_PG i\Gύ;k1- 2yH3 k-' CoZ\X B@Iɠdem&t#:3*;A qֹ_,4ƚQ *ߎ?KqڀӿlQIwYc^k+%?/WtW|C<?z/H[m-A\£HrÖ{fxbJ]9;w;g7k?_+ h\Ou1@dI1Ҋ+'ž&_R/O%oHB| - 8_4R@V G +@㯈^eV[6?QU¼)v|AB׬z;f%XF^cf~>x[5=A,Q. &}ɠJ>/xMod]P2Kn\FuUM?K/a|{%|Av % q>2q4aXX$Y0. UFx4Ok\xV2yDp xr>Ez]~i|XWᏄš`4NL+3^\س1 $[@p_/ 㻚+$7yB _ Iͦ"[q:؟Vm=ڼo'; :Yk9o/K{l|LN&>K$<_{}xvXWrJ?*>~~7KsmM~;N{{8$%r ]|'k?>;4,bmw,h1k1 Z}VXߴ3n|Ca?E."I!5.HUT I,A|U-7Osޱ kۥQG \Ztos{߲NpM)yTYz%🆬m;:(ϻ9f>,/?M{:Ɯ[s)$/$FFA}j3RIl1,W ?hIO-=%Ax~ͤt$o5x#2,I* ;~ўĭ2k]T:iCh#юG.5U_  t iik!##yfcOj)9Bx'5Ĵ]6' -xp3km Xz<q|vI{g9$az޾gG;!nErO lŷ=6DGk6??g_X][6Z|ڝ T'iCwdV dN?g;K]Jo;{&vU$',u QEs?~%_WYhzl| n_ #c;QYR7|UN}#RFݮ#ܪ!M|m?ڷk-s\2=* ((aA<׳j?o(=ſ $>02, &-+*cV9![8^Ln-3C7.>J,o>kkzac䟘m 5޲,X`zP+ⷄ/x|k^-u;vx c;dFkYO<+oNڂKeF x%b;>0x;Ƈ=ryO"<$H՘2p0;eEPu?-EiЭŵ %U 5⦑guEl-"[wpGc3q2O_ w_kZGocgo$4] 뵽 v& |7뺓Zvi-̈r䝪xsxA> k9i_SK/ޟP ~ƈ;=O$OZ@= AGS5|2|]? j׷Z֡yMHf*1*Ꮅ֡|:ׇ.tKi%FBPbI$I5>':O h&O-=U ab @? /}/p-|!@X@I< O|T𽷈+ì;C/̧ +ـ4^4x/Ɨ3牬˹t]"{#lt_Ej"е{SXmQ ~#yyjL"3,Jw!w'?Z~sDu ?Rk TBĎA(Ȭl溕 1g$U?e5k6~ixSN/M&S+F20p\V_I4X-hF}N'ɠ I$g!(' 2Ow|Qt|0Ev^"$o$K}Ov8W@Hϥ} _To+_ ?O_-C\Դq!ɨhq?_,׸xGZt85jzޗ7 wc2ʄ#w:7:VamiHc!$r)T~?P-Y*yIC@O}Wm/_ L~$Х8PN qr0ARoA?>v|+!FʹF C)5X>'x௄%6ퟜ?*Ss+ʌ\O 1^,0HK*pz Q]~gۗt☦sftԦ]ؿ!_ i_ |f SRDAdʑ^_;>op(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((G͏o1dʾOo_Wňl- >]¶:^W͹KzާB I$*Iȯ$w0k/w_.JGSXma $}=QEQE|jߴWD/xa@tˏ&/t럁& Yd+n8RN."b&ij6,rs~0ʾsXYEpcۥD9яz"Lƍv7un|BM7$[zW쇩YKg9a3Zc E|q>}g2SW<澃SKKy5]C25Ę죩nԐa[4,#sk;zY}iSFu,RZߥ 4>72l.A[E{kgڔ]S-cjMgh?s)f ($+yW:>ɲR} ;}?>狯 <7HU R- ԼO 2C7}ݩ[bO>k |/MRh^9V!׸׷U:4 IA|ny])C'O?οwŋ׬wNu]KKfḢP ŘQm XW]M$f *ހ~>ϋkk?j˦M-ȗi?a봫A_`Zk7jjז:yuѕ1^'ɰxUXԊd'v<4icx\]˿/?_l" /kXyW(_hÌn練|t&~݊L,^%e&G_5xWmWCʺI\A8+꿉>o^ M{g$q8Le3 5J3 YMFS^wۥ`9уj/yWX45eɎvF~?*V$YxrU.2zw5]/sH8wJwTt;/u,m#y$rN+ UiW7Kwveu)9^_'ԹQ/ 3Gڿ<}q&9v;!`WsK׼ӦjVzg'Ivg8qʻ3LSqOkK:* ի$K/% K?'RGk,fc@OAq_/&5 xv=7U$FuIJHRqZp9Ҍ_#6~R7ߪ>Y$ ]Eyxr^_M*6c!@TxzxṊv32>(:(_h9zK[Q{^D E]oZ߰J%v򓏆g_?' ?n(kfI?Y|)K\H$})_5~͟s6|['l|+I춸3:$[ sS~P]7{죴~ 6ְmw_?fƣijV1Ďw&1 w"^1&eKIt˘ɉ㑶Fo~u,}1k_V%]\ .ڳ;.[i~%1>խ pGB.@3i>O!ơT~ .wqDa xۈFTWњi70Y[FOqp#eMM4C$HEydO@|/ojOA7o:[Z޸!5[Dy=6"/]Y?lMJ}*^_-1^^ᣈ1 F  nchw.!R5ԒI>b4yЂ{pO\WП~gz/~e?yLO]Vn|#_4ck~ľ1IY$\Lr@L{[ЕToZ 7F>3}o?k{]χoZΧ4tzQ޾N?|zW ~~ޟv?Kҿ@hᯏugxK`v(8pr1`?[xċQnoI.$"ҽxV|7 u2 vB)`8Y&iźjDycD=K9Uh&||p3-$*9rp돘g~W_KRGq⫨揙ߣ$P"ՠ?oO;k_5z_/JߎߴXNmOg|Jԓ1ZN#"#>o?*A un'$ |@p-?OP˖v膽Cm)ke[ȃ\_ #^QssCKj|A֏x/6c+{6iǙ [/2ɷ9pN3P5ZoJMIuI-[\*[V4|Z |?.u$e`k(#K3z V5^ 4j^'lO~isNnF;?tگox3X🌭/'<٢.P( 0 O#u]Sn^|Hd{N9Yĸ^$Hc~|uJ?i8_1 ~(}+6iTԾ3˂ gWŧHh>$uu{٬ֻGUYe1޹-Sx^L}IFR Y%^}2?߀uT{SĶ7~^kHyR2Kfx^@+_u? %igtO36 q Iqi#4}?ihF2G{W۾8zcަm!#I\7z`-$QEQ0y='yk ]h "u׭eS.ʲ<3|N7ZݔWeyR2A ߟ|WcoqݼS,2tu9 dP߃5?Ciw~<־M3Ʀ;!((C9 T08PŏE|Z-oo>_k CtYU~geԩJ}ޓ k!|t94~П~#g%ͬ>]{bLw'¬{W?&'O~-d,%}k]cOecjV=˼/4}x/|6 kX;EB{q]Wo??V?ZJ;MڧK@>33~m&k.F MySx ǂ-a "Ie@$BIEo^e_ ](H=җ ._!#q(迏?fKNOLT!{n?!>ko|}!хROYK`g(p Ǣ8,h޷=MFn.ñ{Q_J׋~-K[?%&# 1;‘تyk#mjطGg]Keo-!Fqx5> M^9'Կ37 'g=d>_~u/ xÐǥBcnGPHޭ0 }-WfK{ Z"0#c,LriLM/mx_~ ͽܖu0^I#zđSN;Sˡjvu[CUa-nޟxžOjXnF@PǽySp uYϝZ4Q1霜{Kþ MPI_#;b3.FX^[=(LuEb۴c^ym <+mu6@T~[ E0yw ]|A pZ{?i_!*1җck8/|QoC5m QxVUH&v`tێy[_7fMWCOIds0 z?x[Z5$7_rOZw6l֝7*q˹Cdo7Km/]]M6m$JUZDI$W~̟C<-\WxF߶NmIVͲ&H]EfJyj^G5nero$ j_I<]Ip2'=H${x@`Wɾ*],"ay\>Xr=Q޾PUtYb3ua* Z$/O= G'8U"~fč&ok 81˨q=_Q%POqϥ\7̾pq^N|VO>gZǟZ8_s'ngu>?>(^j P3'vzxh]@Ũjpi?Zkx^Z܉{s$֛{k^3Mvvg̿ mT\W{@W`r8<w:O_5x_-鲹L[QU!=%R7k}C*z>_>(s +M{7BZz+M{7BZ?s}u٧:|'`kMZdbe +I⵸a'_jw?WҕRF7HGL &}WM[ ~!yt:]FB:яPN xkFlŴVi@0w |I=I$?g(ί },MNw3U 㢹coyi2\ZFC4g*`{5!JFx^ o.#PkO XmOۓUWvNN);Cş ]xX֛u\Fch~ʋ#a28l?NӃWWi]L#K,0UDQĞNh'x'OW7r]=!9 <ѓ֙$'`L$]Mth h3'u9 ߦ㏏(E sq̤ 2uTLo_Zof~~|jEO3}w$>?gEg׺V>22 C ݷ(}Cu3qo7Siܿ>DqDz \'5?<|Bԯ%XPVn84ј_E|); J$nPCX@b]ր2>&ƞ;oꗚ&.3VY)~ )P|}猾Tghy"֫bvÃ-Am-R5;H~m\}1*z0'Ҷ?ڥ{mt.ou;H- r=}7cyxVv$o\A"dߑϕtqM% / ('>ewot"^ Ft=0LW|B AI8Ж{_] V@(׍6ќƸۜz(n/>GҜ]L?4pk !n;xu Shu?:g/ nO5gi?qu)5UB?+mkK !w4i:y:6mg(H,wy᎝ៀ/ľ({BavL艼 erx2_t{hb4,LɁj; 0t*6<>X̯$MYpz;Wů~O:,G\[DH3#UAVRҼ_ e\żҴY(ʏmƾ$ſ/_**yPzM7' J|Q]JMhVo[4`ґô=I5'J9{8t;5ḱcn2+)}@6?Z5y dNYv 05?.%X֑>cpQr{P-N~(~5ƭpq.-̇/(kFX"7_147wes'O4:i`ov8qRp1 ̖4-7H!"Fǡ^[7(;/c< 羅ka#KH!ۍ 6e_6xz^}uU-iܓPXQJ@ZxV߲5m3i7ڌ'V1!c ?3JzYZ.4t2E0X||UxW -K Y,ηYBor }+oȗ>EC|;1鷱(\2# 8/_}j O$2|Yoe[jN ?~ͯ~'cm(s+waLj54hvh-̣T >kvm_g/}%4k3'P>tmMmbH!:"( =WiJ{~ ׽C@h_}}_<?<??j?H?@k|m3Kk>l$oj ~۱oKOm14d=(*"E J]oڷwWbK_5Oxö! Q/fm8I MX5/wzw iOqsp#5fbz|Q_WGE{Rz#O r^RP!ɟ^vtSڬ>1k0@!)r7f;|}[HkM' k WGa$4QUPp|'pgeT'_~8ǥ|oBwu⟂:W,izpge˱qI_N|!<:PoSHAjkk>k^Suh >r>]7}@?' ?n+?8N>׵W | y?;>~&34H6Y<1;IJǾ>x3L]kZtzm 6y䁓C+޼/E=3Lio|?z,5 1 wҼeul,zg&a<Υ Q x7pI dՇoO?k}'W:TuM~aGTHf8ѱعk|%<x{Z^黾ekpH¶8 gEPP4_a ɨ=IZɢ.ooMGzMWC~p pIw9d1~x>4xkod|Gr{y6v} u$W=JNߌzΎڥ4rYjpC%8H㢄|sn־2Nr)W_9ʴ4FoB-쏈lN^d^:Oޏgi_8 {[t#5UP`_~_?뾓6>"xUuKfƗu-&&y\vqWwυ?|/I4"xRiZ^gLnUK#5|_h]mh!X8 0xgzNi]>K–f8 &Ff~dy%?cɠ7 k ?YZ-т lvXFhċRHM a&%@/#։x2Hò"8g y%?ݻzqF u2M4QwT O`|5-'rI#uۋ CadA5~5+?h .+*a$ [k' e~K'?7|IfP~K((=\DwA,,>=ڳKc$Uٟ?u|m2x;t ?<~~__kVՌnkUL_"|vxaȓSG3y%O3,1Uk`E^ 3Ryj'ϼɷWv_WӟQO4ŏ@?h~8\M_ " ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#y?ʾ -{]B5m)=_j:#@ox/E#EmV'X74b9eA@Q@Q@s=UO {R +I-YVA )Tv]:8ԃN(J霷zo GiS\Z$({V,ryUQ²+~0Xr7h1}j3~['*^| Go `4!?}EzHd1bH$*>GF&uCT? 6'b*j*ei.uJPN+|Nkek%(ע~ EnNmD_:Jk~p&4$( dq^-'?yG}M- ϔF[gh[ 0xzG⭁b%V cW -^̻f`ېQ9wQ^}zq5ZrΪtF*ՒyW(z-t{-/Oȱ`=Ŷrx%31c$> 5ˆqx7)P忟sjZU`>|#7|C0??.u] @e|ݛj/sV،֪3QN 4s->Muog3l&U0YXu~&3_AQ18{<=WdUl.zMi"<@^'Y595QYbw+\Ҏ6QEt#r=->='h:?*Dtk'6u% p*ǀeiv:g*|Bl}e$  ևzzj(߃iiksŒokYhdsּ'V9x7>"]x(_S [=M}7Ey>^u{3zZ3kZnAXpFK 8W~|,> 7|I%Ş/&I3;bk I|Qa?j_SFS?2#nO#+ߨ&74SƩkr> f]EJ pNIǡCĚ Νmjmt eD *x'8#Z߰~)^i^, \O,֍u RrQztW hOۢ zx_#&GQs^Ey? !3è\jP,@vɭ^}sºiŤshʲ8(YX] :7 >3OESm"ٔPot sKmIm4Hi.'g}+=7jZmMY;tDmאp:_f |-0>%՘j9;/- g8w>,_OYվݣEA)[P̾.|;i>#Du}5'ԭ7ەm-~\0xPk!xPcŬH;Kt}xExįz_4~&k4m4XPѐaO.լo#_a2K;obUy+(;H4XmmaX  pME/ E}>egVvaXPM;ß \`$VWP]p :Ҿ<7xUּw5 ǭxR@GC H%{^*@8>-{KU5OW9n&o2" cz=PY%퇋9ZiKIlC"uܤb2#iQ@8h^Ox7JVPnPd$]/k/ GX񿍤nİc(S d"onmC߁&Z7:,4i4Sꦻo_ ~$F/0<3}iK]C'd8* Gmkgľ& 3j:ЈbOoc_Aq p#mjW>?w剭#k;9+iz޹ỽ;D x%PGeX p>;j:55]L)ERn0澧 54)EWQL]98Ϳ |3g-_:F~@x;c53ᆋ[:ʨ a`$АA]ExbeZ87kv켶=J>~ͺ^6sw*,qK $Lx `.z=mA:ۧNt/&oqC ;: ǧ<bĂO=)~"|.U:u-.dTOx'n-19j+WXom4?gxJ|;x]M''zFI `~κuűć_%и+c@j+U)OYZׯr>EH(|,,i^v1I6&%cm#gxFxzmY_*mPwv遌wZ+8){M_r){Kr>|3Lյ+?$o~a"6$`R$bI<&κGǮ"l5 eYU8Rx'ܞk誆aZXN{/>,-STut8|)c湫jQ̳D!;~dW~ 6vo hM3^E:y&y#-/{Y5w5%'־<Oß)kqwumVo> ܚ袹*g+Iӥ 1妬(sP&xVÞ&!մk5rHV0 2 o@:i  c##FCJbpJ/>V^\^Sλa$d䓌O@C_h#.u}:k-<\Ș In}?cYIx/uKa:rFXeWP9燾xV~!t{@DpEI=YՉ$s`ůi)kS3#ٮH*FpHPΚge?lä_\of8Dr'k-7Mk hmbX`GjUUVhoc_i~099h$F^W-%E1VUڼ%S#⾆t&}BV5M1Z"d{U(Ͽ&׌4k-umoNKso pZqEb c#8 ^{7g_^WbZby$/@3Cy <.8d!uQ"j 䜝'U(|7}Lz^Xhzdl̖Zm[¥X@$+R!xZ*ɧ ͌keC",j-:+3M} Ep~*[s{x64WZKYJJؠofx%Yѿg?[_Ş(.$i59eVU_3W /GAiO h"ռ9kmt=DXv7 _T@cM)_j@m̗aX%W18|!ūk^+XΪĘ0j5O JP~xNVCYcwfBY$NNh%?/WuOwvk@;e,i-8cyXU=+n0eởhU̬nь" wM|A&鬭ey>iܫo1kdտ`k7ď^( -W|hV/n<S^-T xkiDD(#l1#ڻJ(C&s _>#z*uB14|xGƾ^)׈A7Y9%W9)*Q<PW?~>=G֥6OmJm{p$O*?rHc^kM!$e9*CѼ;T,aX8{@#8PC'UҮJ8d(2=ce IS*,T+ZIkݨ?e 5 b4wH4Q2 ̉1Ꞔ0m?̢>aKuo-ZE֧0[<,^6 nxsч8t?k:^jWDmɹ n]cЂ>Es| |1.M%};HKX^HGb'$ 袀<{g_#V5}knpYMHaΞbL,ppǡ滯%yZB)$0`U89Qںz(M'I/|pa6EkqsɉQ<1>> W⫏_x>gIw*q7c⽞~9|Ҿ<|5\YZ[R<ȤG zzS}~?m%\,]MwwF@ӹɯI>w5So7mmg$1fo%r{C~zg&-dťj7V%S_GQ@4&A46 >%G(ª;W/}_//5+[iM3gefwI\n:c((dgγmPVIh n>|5~"J h{${WoE^8~!xNL{;ɿ,dc%/rpI`_n<#GV4o֞ Rb5 vsMn@O¿7>k[}SSUA>l;WaNI>4~?>mxChٴ-:+%))f?2<``i0lĂ- To,Āb+O9^EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{U^!k.?_OukX?x GGH[UtA@Q@Q@Q@Q@Q@W?h[LpWSyS\yf]c%#Nx#z |¯շK}\F&?}E|w-kt3ɍf̓퍡#_@95k:U>}1p}N2?WF7-EZ~ 2'NQ몱^ ?P5v_dw uk~ /.d8%tjg(IM۴t>O[⏈1YGYw)o0K鑜x=N+-wR:6j/888ߵKc=啲RJNI5۱ T%R /Q_"ߴŽsKԴ[zRH&G!هN;[EѱƺY+x6M&MiQ̨*PNﺲ=+%ԫ`^@N~mc宍gȍel;1vPqߊOKZylfM庆\mEr"xgmIxn xC @}0>xCWY{Ķ2tH6PMGCᎵX<=_j^Mɓ82xaҀ=Ҋ+#Ӟ m/4Y"yW" /1c+ɾӾ[ Ϩh~+KAd7@!$2F9Y~*|fo]0mr 0g?Ap+🉬i]:iڵ7UTakQY>)^[+m#IM]4'8I >e6ggCð$|=r(&B9ڀ>D -&bUn-:)FU##~*|fo]0mr 0g?Ap(|'k/xWFd:ve v,jv;Xq\o1찴12m-p*+yj?*u'úF>]Ggki i,Wd4EQ@Q߁NJkK¿H_˩귐lȭ,bM}EGqqO< 1wF dO@zVjW֞Y}7~Цq{@Ey/>ci7еZ7+ ץEztӯYӦ{{]DhF*~QFFGh(_>*jw̩; l% ۸'kh?~%vj.c ^OV(  ~ìiտ+u}*m@$f (SԑJ +#WZ垇<Ӭu]YvVB#veX 8NOh^k/~=xƾ<%<.TCA+~0C|QEQEQEQEQEQEQETk] JԯVJA!A,p:)94Չn|N~)i3 ĒL4f7FFAA#|u[ymAҵ++_i>- wZ vgPTVPZsm4w 9`FC)AEK@Q@W>2=?]f`&>\`rz`g+oڏWϧŮ}3^vQ ɕy?y !Gx4VOu ɃQݻ#Wۜ 8kPEPEPEPE)e]nzTt%?0'8~*|fo]0mr 0g?Ap(|'k/xWFd:ve v,jv;XqZQ\KB~'i>wzE[+t%K Kjz.q}]ccnInd TW)ύ ڛjhsG #cn@ǦG5TQ^G O(AƟ&w9uAs0sS-k^uy_"|6'i$zW!㯊ZSn54{hyfEݲ(oGiyj)QHtf:r5cn2ծ˭x&J4Q=؁@E2%XPAVdGQ^s[W?NougX  (hgi_xw^ 5 2M>[x9=g~ K¯˭[ܾFv * o H/z F%\GUvCʚhzƱc.R X̳\#$%znkDG6+qtG;|f׃}j[d^쑰 3dWc@Q@?kU]ڥ/g(W AGS4=Cg|?4>%ѳ(b*y +_ÿ?Ss- C JF^! AGS4j|~Ե+7W:|+=YUf,y7 % noQO:lrB"(,@?*p hvU׆$Ӵ]>1-эإcz Zկtz֘ΣrKpS½Vx;s Y:<70-#=(;_OÍwz>-V pw: A8#=Ɗ_3z֡K魦%dBrAֽj +ᾛ kZ9CO~gsJW^-g;M,Vs,_9 /C֣j?z;98 X}Ӽg2v:l"K;q@WϺ^񥏅SUlİK}CKdUzqc5Q^Sg]3So ۽5epcRw79{xƶ>ƫgai b-gNc t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWDjz?|3tl?ӯb8$Sێ~lj3j7Iq#3$k꟏w6?(!h0n-iu9Fb.a'-i-k Yc80kGh Dѡ^?am=t;`Fp{dgOnKobnTJg_wXzr+[חJyv?^ӯ-mNۦv:F#ASqz[i:}mimM4*"> _/.hO{ewumy%Ŏ$71&NEzqM|)ۘm]?\yUMfQcS۽\lUj8>|E ?᎓lpڅhσќȹ{X?hOc:!xa&e^5G@ }+ѿeC-<1|$ݜOB½^aha`+FWT0kҍj%}FFw˨ŭOO2+OwX|%5YEq0-#9lYoLդW%Otk?_ :E+,z|r\K; \ԭ'7[>U>B4ݝD}u{:%jyl>2{z3Gq r,R(d*FAu>GĞNmlZ\[ T q9'\NJ t03P'29We.F+=i3"dktϢ|g_iV F-Fmv+xIKUoQ)w+w (N(/oxgTռ]XƱkّ!WHa@D3 * 潟Q{^D E]oZ߰J%9|P?]N|O{I E/*0_B|?Ս[cB1@ҹg,?W/X[B~ЊzPP’Kee^BH."yXKpd}Oگ+WRԒ¿8ke ;O#ۯ kv> /^HSq.@Q _c~οo W*?*7}6&zM_E@H|\OͮdD&#l $@}CyEѭt 8mtXH%]cW_"O|.% =;E1tu$/lr;>u>Z7&*.t Qݔvh?g;0xk\2k`'.;mO3ҿA+>^ռO>x~ 34fM29.c%CJq__P {H#U& 0*H<8?ࠟV1 9}Z>j]Ʊ:T̹ ֏&}/I"C9oKD u_KYg6+hZitN|b9ᑇz7hf*\s|=Pna!Gzg߄~{P2yn$ Qڀ,PO릟xB:ʒHj+p]7\[ʓ̂H千+ ^5DɾЧ%ΧauX%Di#r`PAzx{FҬ",lm㵷$*O' K#+OmwֵIo "y{:t,pW~躍:=նmȤ20Lro,|ToO iHѬf𽫕%iX1⸟4~~$Юy|QOfbӣ`2WlxMr;la@յ=#S$fcmmq$y`{с}CJWO5Pq;f@rP;WYg?+U7Dz5 Ū~(>f 9~F2>\~wvڗ|O#z}h>!NUj\H_|':-LJɼ#K~<0KV9G|2 Uw-#dT@Y('?~ w$()Ѽa% 8؞S6=*~ў^$.EIbU#r ;O Gׇ,5PTm$wAAEr>| Akoyr\ɸ&7PgឍwM\y\ 1T_,w}{f/6@aۀrvh*ދ7kMk O!}=?&oyXNTYIdu?3}M|~2_Қl|—ibAŽKpOo?bw{:m"c dyzP;<+?Knf5?:vS gUL,Kc-sgO ǡk<0E{mD " :1־@Hۡ.*x|3FKٛ`^Gq_,j^D'Bwv:դqʒm.H +`@yR:}EexSĶ^2𾏯dK8oن D ՠ◄w_lS([j g }m3]rDͣSomXZhX_1~¾k㴚g%1I DMp:zWAku[~$ xV9?1VH݀k*1 D@z\:t[ dtr{o:ZG "{Wc>lqn;PW54.C$v'W緹xO n3&!N0c2kz)4Atbhc##r Ek_i=[[TqUҩN;k{'hO,#Ӵ6㸊X7)T{ xgYH60[QI0\+a@}eύh74ע7F9g1 b{I>bpXw; ڏ7+Ri%tא*CVt֗[m6un/$医Z:,F?+-o-NSݵ[сO \x#',4#,كBȷ$FTv5Z}roV}wf_ZN:u_6-ӵ[c4OD_h+WpʑBi',N9GzU%֯ki,S\F^?ڗkkj]72g#}Aoi.*Ž yF}{wnXZ'%dޓS:ލyYM6͂\]4#95_ _IwۙeO) ! =k> .Tur哴$f~DUa(}[?'+)jo{U{l3Jh|A-;º\tvQgRBO'x_ڼZFeG!Tu9ּ:ǎok eg m&} YQH m9÷a"sEl|;mvv#TI9n^GznkS*kiס}#{O?;|>ֶE#~5H{!d|2QYYL`״R]C"^hPsþ(ΈZcLzħ ǾT`u[7 Rhrk!]7L=ã2=3kr_nHLhი#pw+c`O\h- -u%q^s 87J(ruK렣̝&BU=|w~/~t&MQ-Ż[O4W?CIV)=7Iu_Z}[+kAxce<*Ӭ|r4?{؟i&m>%bC.~$_▄τ={M-i&kFȫ-=YgPcd'[ kO6XEOPGs[o_('xSAq>ݴ ?a?;uݽMs ws+>-rB*08 +GTt#7~<7 ?pXa8hdNNwfQ~fu#zlUo7ou?O<,YjdvdY_<U|=cM]X~ ;iZZ=cnxN8UW|1  mˑ c;^7㟘 1?> Gk˃3B1$I_):d>7xKIAPVБ}#(>φϊ5= LC^31FO+ʬnwvl6IJDrq_:xhO)utN м$fe<guzj_]Jxّt) Pho Dv+o#j<D7u3.hBnQ7 k&uY4o:nZ? ݤ[>Z$05q7/RZ/-I,WH+°޹kd>O|ac'׵>ssy"HêdLo±5WO%&j˦-&(QA 5|W;|Pk>{'4i#!U6cҾY{BmAcgUhLޡ 7&#:`BAhAZ귖tLAseU|q^_/Ŀ?GjK&yEY'VLHQ_Tq'B}_{_/~^{W_P {H#U& 0*H<8?ࠟ( ;ܾd WOOO-Hj??+Vw4F*~~5WEcM_Dm"{qDY3@_ߝ~;ԙ|Gmjf&8O+\Jt:$`xLrmQ޿kCLW+M g=#wQKm_L><3kv]JsdF]rvF_;ї#Ш%'v:_/gn(k'v|AFפvJ|m=¿<3w>>gگ|O _%EHc9^wzoL9u#]:(-&ee@ Će>k:nRM3j~)fX(uF i}̰Fڣ]r-[TZi0١;?wlqDsާ?Qh l ?Ff 'CfaSGb36;n{_~QFx_׉?/X,*DrέOjهUπ M嗗w'M ۞6oư?mW\y?ПO9hgw{uK[5k]^t JC0 ka57KY?P4_a ɨ=IZ*u wssxqqoU6z¾{7῁? 6XivF3Vc'$_w۩П ë('{;y a xV;Q'Lg#퓭iӴO#lK{R7c8xb9+~R#>qXNr@Aku~5-C·іJhI"XFNXl$'+ (>]ּ ݺ?Mgi'n @8$g \oKD uFg/cLhq蓯,w4k3JJdHo7'ūfSZLJn}E-~\{>д 3Mi֚Nl ec @HTP$;߇|PoK35x|.߷{W/)~֟s5ɩXDh`O;a2hC.,Lng_ Lۿ&.1i[g$w \m oH> /cxAx/tfWz~<>"~̾Ե`YdҬ2#zA'A=?hψ<4K_ >O..QEfl`eCP[#hl9__~*'þ K[n:gb;~]? o|gqk 3.{UxҿKfo)VA"?^;pe?7j ꩿOռE%dtn)؁^C7~ xY-c+(OQ$K=Cր>Bxk&j ,qN~X;(k7WaEC4_4k 7W:;)#~i,_xRIGgkkH;EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP~_!Űw  Gc_[6I.VV]2myy?ʾ -{]B4]Φ+@H{+_:?zGڠ((>Xߊω8nK .HHҩ&}@_ROt;[Y-a*c ,~tMB2G@A ^lb? >u8/5N+-n1'G@}+f^^(EF_4NzTछmJߺݞ_*kRx2yr]2t}Ex._ ukhJܕ"5_\߶~B 9*:&jSjq Q%QzFAw<;~žK_YS*шcEkV-֔99noKGzjRuZsk'6׶q.߲g/2{q"Gx>Wuq1 ( ?g |X6*u @{gŖchR[VڭZi;~gF3Vsnx_G=ͯ:|=^8ki#oVRTuwG3k}ڦjpv$dGֽIl6OӭAPBTQ 鯊`:9IUeIo:8+EE;+WԵ$lFY;BkS\dҴ7PO/M}eM?xP&kV * 6Aq޹?t/}%eYf;Fr$ƹrmfcmV]߯C'-6E#)Ǩy/xrW-AO&:$Q^P$י~ƾ(Ѵ?:cڣ:ur1_*12[_~&3G1+ S{iZM;5*xb#kDկBTi3h$ARԼY?g5>ho*#| AT~NlYtrU@ǷJ&~;OZVR sDIF۔5M2ZnB+ @X E|cAot|L<9y#H.y[y ">@??OJѼ}9Ex"#n}E̻qoJ/t/WNsFiSlש|J𭔑Ԟmܞm8id2pdrr~x> KSVfwqp4U <@o|S[E8ԭ&,P-d]O'5]\\j9_&F_Pk&~񾙪1G] L 9 ISE |1 _j |$qeق8)~+/~x^Bid1\wJ;of+^>+Ŗ` +̍AUU 䎸'#xRy-^DdY۾2F7.FGQG |2aj_M)kX|UΙ⿊?59YMKu V٘5I)x7Xt)#mr)@]# E5[gZtϳ?+Z?Weơq{]iQֲ*Vv!K?I">hP߆_ .~ ̪-9 HnN=OE??|&5]9Uλo?zi9f?:^_j30I'E(gb 2}j:7 >3OE#xv¿x~ 2;*W?L x-wפ7Rq$I""Q$S~|>>/4guRbۈ%3ӊ|y+h>&:滭|?j~o'Օ$r@x/b]8Q*} }o+~ʰqףT-^oSz|wkϏ|jìxuڮ182k+WIho Yw ndrJ' &ac u}cbW|Dtϋj-[a:ϨYbk8hi|}sibү,hcXH6mPVRB:xxgCxYa+#ni?$5jZ tO'qFLzV?^/ .Pۥᕒ<WO$1;xkKk{ \ dhŴ g՘Z? w\>hqf'%KIk@ɷkg+WIho Yw ndrJ'[|XWNoޞ }BD$ Ƿs@:ɾ1_KH>2|7<g\ZX8t9 T.Ў:jZmݢ]ObKujTK e#zn# dKòK~H7µk+jq$ٴ:?_[Kே`zOkD9q_V4k ȋ-FK! TaL=elhٿ;7Gcwx6 ةKMbcD Qpk_*f|'&}%˘dvޚ1Gks|bU=0$F}+o|9X /˜g ^/^% ʪʞJ q=zoMgDU/"󭮭dzGk'Rg ƚ}[j}GвHѺj/mz4~"Mt#<#˻x[?c?FGi S+V'}?8 #|-mbr3,6PMp?S_Ohnu7Pk,K,n?[lFvwĞ >"xgmZ#Udg 1 kQDU:(&/VO"=6D2Gc*yȑ&SIN-m~zk~/*ͽ{e? Ǎ XּId.#vq4lg ?Aw._5fVdb *;_ط@Q[_Zsn}#s"y  @?aO^x_uA{yViYƾ{K~|u`miRX$p}e2Gܑ\gU3Wu>&{Vt;|)ߞʱ C?el|MW/5oH+-YA|Uk{|/.,t(8}s,}ɮ ]fߴ/lGut}<\}X{taqNˑko.NjmVô?Oڏ^> +{@ΤUcWn>ưlW;HW9 &2=Fg?Z֭5/^Qg סxw={j}:?*HAA؁N? G ~*ݴv=mE<-j*V~qe?9 =.^ /. IdypF=Ͽgc>'E ,QG%ڢFUvk|SX0B`|`߇g.]_E%rǵcz멎nVN[X8j߸ڏ#U<jj>jk_t_i7WznaIis21 X~\hzMݠ񿊮oIW?,bDe@s'1Uؼ&>Ӗp\4^GeuWo;[XcEW:5A5?g7>oC$$KlOq$:3In.$0НnS،W|; /$^%V0k9xf# <>Rm>> wk)a $2M{̰g)> y|pUmygǏ΃[ < VG ~G4{N8?y 9hdA+˭*x =:Щ9Q%G(V jpӬ+ܪS0+,NK4_6S#ק?> 55AޥۺܐWqsVc"Cޝj8mcV,H27fjI;Д}}v/o6V^+TOD|:Ox/ ?Tcj^\n3sw'RZҬ s3ꬡkZh ޱVbXu bf-H5=sLuUо!xOA;i'dJ({[I=קu1 J\Mmu8sP_hz{214QŊ@{e~5_ ',-mU% #tbSn+jq(QcpyOf.`h>eەv.~Xz=5]Š(Š+^f&k W2;ocuPfE@&?M_.J(o<]02Dɣ - I!c즶> z[%icmJn貁ʸM}_?m5Ķϊ|[2̷حf;Emgʃ3`?n|uMc,YoƁ0`-9't)\'Mm|"Ҽ1N%6ّ넆=NbOa@pCVږqd$Lǫ?%;/9Gi}XvQ Th#_v麵n'm=%d_Ib^PZ˪xKš8Krq@_U|=cM]נh2a< yWl;}WG[h-Eqis*2yu9l;}#8;J`[/'_}ww> $lj MJ5PbalG5/?sBFP{4GI}eZ-|-_ SH7|'nO־5{?7:ZY@pƊY@5jMĶ_jtE&p# d^{~^2Ewy]\PD.Et u/gՁy 6{qQv77@tkR?V? /]m{C/MԬQǁI¼MظZNOkac{Y EUz'_<ľ3ѵMs^*C4Iސ=$M{_ $~ r! \;85ׇ>Gu_[Hkk]yV07{1 ׉ 3!\}X8Kھb}FW>>_X]C{esqw,6 #e`pGZڀ  &ac ԭ^Ok&[ml$e3=+ncM];ſ"kzz'[Y !l[@2z?&}/I"-KM?{鲿*ܔVե,Q]OGL+Kyg5CAj²:ֺ? |ů|AP5mh#T%qc16{ 2I^g㯂8w<=m6кvwiaB4X$|oG}W| >:qooOa?$XZݲZa%+ڐqо&tKM>UvyfnIhqŽL_%gW4Wrq$I VR|eo }Km;]!~ۯZⳌSY4a+e)zϏq_d뼡WP_?h{c2ku&:G,1 |?-;/j ԤFQv,p'{I_7~|FK\\y-,J1b52x'ް?? a-}}o}xu-X0J/#$C?N9>ZWo'T98iFH{5}G>-h/oMK(c yf T>ⴾ<'M9v[x U3(|/1[ʫ} k h6Vg zKwuuGh5N0;̍Md=oi.ϊ5ZޖCi_?0 H#E]2ynAǸ?_h9zK[Q{^D_ǿG?_rTd1&DX-.LOVzM=WqbZOOS@//NrZ`Ѭʡ`S1@vq]yZ?Ǐ ZΣi)ek{ΰCq+21"I51}ooOB|1<QR8 #_xKLB/ۓd+t;G\uT&-Ož'|?&mVpLc$22ǁN[¿|+#ťic%B2Hc A6~=#*ՄY4^OS,19>Ɋd$'Y#p]NC >^? ||'G6CI(A2Z<{^Pq a:\[.9V/5RTOwmT$rq^S/KWOox+ėshW3qh6CEgV>*xHCy1b@[;$/]7Oԯ홆(F3vW_x|O*o:G<ߛo\sV|1/@4=> /IEoilR5ԒI׆AJA/SR7ᯆMcvKm=;'k/>!>}j5o숮ˆ%1;#6Pk7@;Jׯ5M;6u ;Aq ꬪXq@5,~";n_AߟzưhQhG+jB&= g?EQ/OY^xO|_au1S'ICoNsXJ1\;އЫR;" OMִ>+@ 2 Ac{߈0y+M&csb4dIs|zɼ}<]tTD!WmǷ>~ו||!:S4}xU%kWhn![ zK_<q=>:5߇)`L/9@9G`_ |/._ Cjmڅfa!zi:MZ,m{{ΜUwjg3AM_ I#)^$P* Ƞ.}d,gJ CO|j~SOe~omqzl~xQִ_aȗʦלpzץ|\Gߍ K1aux0  ]s@axR~=*_apM#U;yvkHifEӭn 4Xep=z |_0񥗋uuXOkIy|{v$c{n4(q!q}KG#"(+j ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<_⯉!~"ψn-b,glDPLsF2;>'=k>-E1#ƃHÂ9EQEU>?q_mɺ cqO_xoO#,|aنW S2"~y) 74;9휞敫K|,hqozNuWѿvf__2)A'n/!_} k[xoP9|+({`Ԓ@Ԋ^>#|WxԴtRW=6iiJ_[+ӋI/z-ߗ8KQvM߲[CEտhzui]#H*LB=5ĝww5=G_;5F%cݍu?w+o{kƛvzZ:U4޻}TQ_6|H|@ #9w|x,?1V&J%v۲KgSJ}tIj>/-&Țk5=:S*?0zd*3"ϊ?/g&Qfu3׷QN6Rztnvc/udctv$8,57V{%|mѝ m+dv.<6O[Ab%8ӃvNN~Z3ѭJ%*IyrCmX*`9Wu~#~^ծlLYapw4{8cھG0 -)FTn+itQE|W~K/~+` -\b;$q@5|\V=k>& j[Gp+_/n=l8FJ pMywhd_7WEtPy#lv=?ROG¯ }SY ?/c9%BO`x_Gյ{}3Lqwu (u,ǀ+‡;&> ѭY}gK̶qŤ0+8GNhrio mRßUk=v¾[Jl^nQRzܒ{__|zim$9WF8`= u=Ho _^k(^XLUz N++;ygE I' ,)hZ[<ӋY- ,qHHaz}kσ8 e-汥ExCWY{Ķ2tH6PMGCᎵX<=_j^Mɓ82xaһ_>xǚwn^uIX#0qm}sSo iռmizYmmT䎄€>'Nx'᷊#j^"d`xnK\g,0pqk>FtOWzOn.IiH#K,iRMy7D}s>61?"^dh`dW`>Ӿ[ Ϩh~+KAd7@!$2F9Y:<SCoB/br*n=^#;^#Gl'}?sJ Uvu`JGwO +[nAas{c,03t5<+xM2;Vʻ_ʖ5t;8?ࠟ+zmi6{˹F'$^GyWxvDZ8$T=WH|\OͮdD&#l $@}CyEѭt 8mtXH%]cPW~"xo⏆ kޓ1*~VU#*tu9~رZk[89Ɖz|G|4O@7F7`,| =kmn_iz7%rNcˇu;8+Ӿ8|-Owsj EHic 2Hpsx}O%X 8o< O V6E֊ ucoj6E6vVѴ\8HEff<$_C#N,$ 3eG\%{?)MCI M7; LF}IP:ImI x^vKm>-xH\W|<ᯊ{}kIU2FV8x#o|kJ tH!TUTO'$_|?DA mN-Be=>dsXԀ~?QxV}o^1ʛ&wDar}/A_G&f5щٹ@XGY7D񦫤I9pҽ7˜>7|.<s~eK*\G1w/ V]Z:%DX{/YÖChpVE;  "?>:Ɵoy.k3y""^y Wj<q@?kῃr=<φ".OVK޷-8燑КUֹg74WV]UzݙV)8>SGZ֥?fڲ׎k}CQxnM$:Ydl<}_?/ |%Yg6$Qҷ.@ 9g:>Gԧq0g*Ѣ''Ҁ= |P½.Kz:-yIq:9M Pq=Cĝn-#,ֵwm9E,rvpS@Ey?|?[ CdW u*zazzS?>8Э_F@$zڀ6(c=ԞUdN$s\Jz|3-d0#,}MtRW$&̧Z7i/VwWo{R=;N,y#m;y=A'kQ[[ .Zq~i)էY^^N^mqF|:yH]mgTzD#u7on r؁ZUhǞ)EwiL1j>XM7ѵEx/ŏ+L|o=G-~]*Em"@<8mVhZoqȱMq,lF@h*ZZU}0R  cׁXOOz5g 46 qtl6# [|Z|%}& ߇gne DU`0Zٜ䴬u%hf7Z<jm5ZwnVo~VwhDlS —^~t y|b3l7V}8$'oJ8j0`I+iZQ[S?#E3R1꩝}Mu°qkں^./K-%Q8NY~*pTQ~Z=ZieuC."u*TSx5p+=񗍴OLjoM#`p̪OLZܢÿÏxgS-*m Mq$T0 䎞3h׺uuִ;ư!5*#K )2x4^='u]G0Oے&-n/"8`) rX''kxGdF؅۠DԿ4[ /UsyU#~ykգ xMt]Wǖo)#`^rg">I- u z[aM_0W<[zƳ-ZEҠYw{2'O`9=fxnOSOj"W㺟KݛJЄs'W״mGL4Auk*z2|^ ){}/LV|[W$bT`pzV[|!o9G +;18=hh=Ꭾg|Om_2,W1)5xozwK]_I^tc& zڀ4~(hS[U9][%tkxbCBm18+KAxIz]^ (𮋬>u(o<ۼ25}3V|aS|*G:$PxCֺ=$\&U_c$WPΟY|j/> šUǪeIN"Qss.?h_'oN vH 0=1sB[ -^y"d5Vh |ς95={ݵψ5׹3`F>TEP~5<+xM2;Vʻ_ʖ5t;8jM_E^@KB~'i>wzE[+t%K 1C}\A5iou^,ƩO`[i'e'!qx9' {E|{iPn`Q^TU 1zG*j4ky+B ;{"@Ѿ'UW'kmLK< GrYkOx\PӮ5qqaʸRT) zMp_g\*C-WkZtϳ?A^v#/\^~ö7>H!}߻1w&^D L#5\Cn?ʽ^&|e:miWAyi 9zAA 1fkVWrqTGP{ |?wῈ4һ6W6W6IeYϊ?%gÿ^/a,ygƠ[6o=;>%k+IS@ ]P|zgj?ekK99M i .%?=+/>1NiKlXdqǡdwDd$'Y#p]NC [X,_ ?EGo5杻c# 5Wg[ {þWWc^|ٚtMGƚܾDH|dH՘1 '9mnφZj/xBq$s:*z5K?u{ou Icu]H '-߅ZMIDFwyFrlr猞 ?W iԖ^$Lu{Y,HU )$N1^$ lʈs3RM~xSl>xH?'tF4 gFok?ڄ6\YIcbh{SWm?dmSxGDO+{]o?KtG躕Ln93^Ҵ7P1Ʋ޽܈dR[*"W)"U}u-M4dY.f=m=PMfx^ީ=V˽I.d $H 13ZtPZJ֤n5=^2 'RF e7=:U+-jq>)EWWnmWvjv W%կA:&a5m< 6$Pa7,LJ֭]KkMSrdHI^ /?5#DUmuP ۵xǚxVy'Ӵ[[%rXD.b/6=Ys\m,iZDѡɉ{m~iYL6wQ,Ȍ+AɟMߌ>g5 ,ckF["V[i}mgkO4,q,OߵWßՆ ^kMFuqPʹCOt /-Ѵv4IV.,[8149ۜdzWX]&F&xZѭetUH8X'r>~7wZ蕠(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((w6?|ZAƽ@[~o_9Cb}.x|A[ Hppv5񅾭sntee޳&ާB I$*Iȯ$w0ks_2JGSXma $}= QEQEcx0ºq4_Oi4Qvu3B2n*r*A_KO-ӿҮXtCԾ#ց >[m/fm6̽HxٚXH6˪l'v?~}i^^1Zw⧅[ddsYo Y\O#K,gff$]ZxgBO*O2I& m58کUiՎ ub=A">LMT^]z^ǻ8қJMo#q~ |E>=Qc7Co  tRH#0zuvQ+ $*{b=5gZ@m5Gӧ\o7ƏZwË;ų/]3 OA?s^DN-p eU?A\G?d/ ڦsjjs$q+1(N+s ?]ֵig4̑p2+US+G F5T-^oVˌTtr:+~ĺ|F7P[^Ue)?_P_]֕:}g-Gڔ w) '\Q 1g*sms&Gl$? y_C$[蘫_|*e4'D+ٝd/6XRլtTgXR&+F2A\=Uթ*NeGͦh ?Ҿ_4߽&+rc#?>/_P,^#$6^XFFS8a? ?Tףg> ץKXiigA?W1g,2WlwRG{kC韉ZL:X\ x_tm+a|Q_Wߏ<Z4p$A\'}+ʿa|Q_ Nr L(W (ΌV;??jc̲hc~jK[fVLA.\܄ck-/VEiRG拱 I$|QEjSW-+q8ˡ4tKI0 EeQ  #5wjyVؐH"ܫ(T*Jn,Q(lŠ(=௚? ROGq_Kוԟn~*~Ͼ7ՔF{5*9hYf4js_'>j?x/*_O!+0ǥiI*"~u+NM} yg{+/fKNLK+$qzv94_^uqxmVoxwLVp9-cV$F\pé%1WPizMe 1G5]+PVDT!`ّ 2u,I=~dNF/(WKPnm0&MPyd%I2H=p>#S6ߙϮ+߄x ~)]!0B2Q^,i_A~O^B nҦG.Δ?`d2}xo3\gKLZ >)֭ܜ[VY@D(C_2.|Zk..es#/ sD+v~j~m#~̟{ɺb u߁:o!>v-Z$,0^/}r0/ ܨ[7L+@mS/6 Y6[~ؿg e&sak?o?RƯ%OLW:UB#lIdχs|3 }>1oa:$Ք2ڻ.G| kεf7A#p=WҴWCAӯSFtpPȑP}ǭC/~|.tsƗ24V#͹8#%=~h^tVo:7|CP-Kx^<=aӴ +t'$DS53/y+#xv¿x~ 2;*W?L x-wפ7Rq$I""Q$S )_fc֭6q'z7-mx x̎$Sk_;UL.oĮ &ac u}cbWQ?a3׾~οo W*o/[o }žrE":69 ~:mi|kP:}w(B~^ _p^"x4JDep[=Ouu 72oo $V d'~jYڷu/}Ffɦ\G4 [dc PN3k¿??e]>_߶.I.p%ЁwVc=k 񗌴ԼEG|&kO ؜HU!|C xZ^fN{"(圞M|ۡԚ>'X\0}ۭ@nC[93~gw?h>bQA ðEnI%FW韵G}k3Eoo鄜GQ]G ?|iHEGCgbLchݽ +6W c"?}oX:Vʳwv)du >ƶJVYsy=W|KMOKNI.OJFKFц2# 7ÿ,ZVXdK{xS$U_Ҳ |\g˜$>(C+ nn#$fڃ@|žנ 亐E4*Kl;:vOP7FO&IMY״vOQׇRHSⷷ $k*( \j ~(>"o⏟Jm`:n/@5_x~xF(=ZVW]>qj ':6??j^jW_j[>cd," Hˀ6Xßg#׉% RXUeܬ*#boLC?p9xwq6g碜5 xsះgxb <9g*;4(v', }+fh~9|HҦYi`E"2pF8#ER?~Fom$jk3i?3G?|?-k\:Ɏ/''i<H}?xByzߋeP4JdjOcEW:5A5Xڕ[K{tiNNU{=~l?)jM%s|EWa|Ca!?kO?[ >t'k#95[{H8o/(x:ᾅ%1/eE 5݆G<EkiZ"UQz$f9|}Ka`'1AQ9(5ÿX|Hi\'!'- zƄlnϺ^oUe/oRu|g~o,&x[0k)Y.̑/IpިNxZINgD-dumb&?xaj=bSc*0:cGėڵ7 ]sUdxy[Pz^)g߲wYQn?FO>޽=|>+NXn~^=>mÈ壈s_“J}[cUUPT`\qvچchԅܱnҽ;#Ҵa∼'S_~ ]yqb Q޴tJkJ-{RxϪ(ʚZ۷ Խ+h|do{Ʃ\~m:aDhɷvy]g9hH^6zkOsP_hz{214QŊ@{e~5_ ',-mU% #8>:^e+yx?jᖩY߭w袊S (?5;^2fm@FZ7I; 8{_#?F#*E1mPHW\c&C_%z[.uliGOUS@_Í/?--"Q-T <\nn*P;c_z'@|2ሗNdl[ Exx(3_O~ƾ&WU[iJACgA_1L|BΎ~ѮM3 $vRss@/iO>u9Vׁ}Z~|=O4c61yn c!n}o*+oW G*W 7A [ kO6XEOPGs[o_('xSAq>bGCր>4_xfúm{]@m1+O'75H~K;B{1\&Ǡbcl2 k`yXaKT I?2*6Ǽ`;\ݛp>ր-|h3֚f^~*eYo}Geo 9CUÓ_i6&}~i3 ϼەqcvӌ%_ƽX>^pؗp#=Aލ5RE;I,a/ CKw$ m|ma,Zv0n4N2~`y''v;_( տdZ_ڳh:Ǒ=6o:,O *@WM>],.6%w_lsvG4.~hkdNx?Y7&oDoԕQ?`3pz)_~1dz]3wUG)BFG *5)\'Mm|%W,n.ﲒ+ċ@g>ox'FԴ "d=_-]oxΨF;MKsFˆfzDO HXm5 MBH| 2;2̊,?o>I. &m=G?7 |֏j &f >bI$־St|c|n m 'j7"VFP}폄J`[/'_WEПR / /'蝡fy#Hx$X+?>%3Sc@# S#@[6[H5 n$VO:0X1}j~ou=Bt.'c1>h_&uY4o:nZ? ݤ[>Z$05q7/RZ/-I,WH+°޹kdz歫|Rܰ<6:VÇ}K(>R<^=}uw_QC5`LHmXTOqJg Z]<Z U3z0ܘB, !(᯺>+xno|/l3qז1~_1|__O YE$gxzx#qRKZ|(zF}4h$UP|yxdE\_ $~ r! \;85? _^u|#~п{_wP_ Q?a3M_={&}/I"?I/ž#1k;:ɾ1_KH~?|1Ol-j>ʷ%-UuiK)PSo_<q [/yA{+z/`o^+/xᶷ"ImzK[2WV+ s\ h4Yu] m!e9ҜzzSn&~9K:Ljm]@^S $]өlwxROV|nv˸mm0"rAeD2V>Uvíh4265 ,]LZw__wŏ;J<y\=)Rٍ}+^[05%eԖ]jsu12˸!OeK![ M>~M'AY<#Ν(W$gi*a|g_ n<=YZ&j dzoz?+}"zodU Bۈ /~=ϋ|OmΨn,#?f8չ2E{ /Wԭ/dQu@4o(o7k{saH1W.۰s}M S o}Leq' #̫!\tJן zZ]FYH#`N9{ 9$_D8:u+Knd2쨽HQɠgo0|mW6$ig)`B '#G>cK?> k,V7 -@GqYcygowm 5)+ >?o7q@svtjr-R籎}d}H2&[k)sC\v_WᎧ]X}KKJskV8uy,jVn6 /A;<|M{_~+ D#6zkfQ Vv6wno_/(}cE>f qq&x Ri=??h/)$7|)m$6SEw : *H囕*pgh !^[-#L;(fx~VO.,n嶃'3^u\| E>:n9W:x'Xviͣ[xtm.nt($}^qXW )~8i ??i8_1?OC>"?[#\cb:nJ ~+J+žӴY]$W kG" 1 ? "ht*;;dv,4Pr}k]cFw`%T\ӤFͤ|fٷ9A _T%vS%N `)o٤#2(<nOڛN. }HjwAGcRG9־? WƗ>[V͐9|Ryg,r:"ׄg/9a~EҴVQEI9$I$k/)ݍޱ3^iekZ]\ ܆hՉþH1@a]:W^hRxyk[s“'_LjZ%U|axWRƐ_)<6ُRg_غzxD~ՁCg?> {F>gZIG2:kt/ (l~O'63<۴tEH^s!7T>3ֵZQ䶶YHYqjO>=_K=}Z+>rfz)&K%!+# d[o(# 9#_N-|?sH~Kxb@H z#g/'?;9?oEG[imu=+οO=:fr>$Gw5o?uGgG~|ѷd(igt&QҀ< 3KiP m7M{KhW#HaU_'~UZ "ß">;JGEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPw/WzF;m'XU#{?hȣפKG#"((q#CZz{3La^6س6RFI'\ޟvkjW01>!})E{Δ8Wv~vK,\`/'=+AKE;.KHǎҰ~+о0YXynEk9ۻ!>Uڻ+˧Nc7ϽJt{t>e?։dxPg Wa'¿ ϤIqȻP`m:+Y2Y}j9~I]zƗo7mڳZ@*XۂkO3Xkd˙cσ̱y}QLx/cv;JnX.J"М׼GC*F*@:cغj8eF6 4KIiKYZ"t*J((ũGtt4O }e\\y(FmEyH SkWUdS PPGϟ~&3G1+ tW٘?^ w;iOefG%+Hw;9U+)뚩ݨ`Mo$ vI9䓌k_/~*<[%߂"i*. c8⽂_4WUY4B=RDX.!EeF x^y~ȺEƁ"pgN$S]5_Ꮔ>t._ˏ,9w9gc=~x> KSVfwqp4U <^E?exLuxzuK&FVY$J(<%O|sk?? bQ_Oy<,wC; fT? a-}Ep?> ojl3:˩H1gmr><xOxs]־t?La9 WQ@'Sz|wkϏ|jìxuڮ182k+WIho Yw ndrJE|->,ixMoOYk>d"@mh@c۹'q|QΕcJ١a BYH^EyO( /usÚpz~,# Q޸=_?W0xz`K6ped.ƾ9 /g iph="+hO%by,I'(>=|?hoVZ|wމ4c]讠e0zs_=ê~? Z2#L߅Nk.JP[W*3;^|Yh͔:}AskpDa8(/<;x!Gbз70O0_A+GWДPo]|Ch.z.zHWhFu/׉}myh4rrRv9V!>'<s6cm-;+G<`1|MC6k(?uOo|g_N3_-ox#NkOE$Tffa&U9G@;Z~:O5CPo7O6Ln#śQw6>:񟌵|H%Vė*[9S(^EQE|u{Kv~5Zk#;3%Tc3b[F|Co~']iͺ)(Aϐ pp2 }E3rGrWx_<~v>$[-MZMcL~{*$,}3]_|?BEm:Zŵ&X&\ dw?|O{S:|/o[Yڋk -\bGޑs=W>A𾘸,(ϻ&(C[ᛟ~пa׵Ӊq6u`G9Ҿ>?q_mɺ cqO_xoO#,|aن?4߆7 Cm $I-> 28 mS]X'aZPF0H܌sq/+WM5[<3Fy)T~6txZ|Ihnk x&NO#}lN\mlsׄ?7@_(f20Z|?5/Ėp\d Km"*T>A+iqʌ%ݫ+?aNJrZp7$/znrB]BXLgzwŨ5Z Hth1 ߖ8b>=(؅Yb 'Mk}CQi6zƯ]Z}a%"6H?N6b3׆VB>95O}+諎c5;MV/ EMZ|?Ky[`\LA*Ty~[{{y$R(eu#H<Gj6Ӽ7?9CFEa#3󯂿 @LӉ//ng #g8P~3| ǯExOks-W6H:g  WQ@9-]W Ttp#%EԎ=k~5_ xoš\ZNoX%v9.,Nx@/SSx _6'<7t-+/@JN8kBǿk7Yko1S<+(o6:g%]Bev,Xdx_yI?K[=#>"tdZ{YAxkm~eo[g vIXKf9^ ;C]6ĚNJY\k\7Ea9`[,rO(_i^xX?EC[w1'k.uxgZ'%t{{ڡWs8P(ukfO@zKm*ȿ+1>ⵗTCmc $p0R cks? % [Eٻ>_;nvnzn>zr̃~%O:uLj%UFz)aG|Qo*\CZEmʌ`n[yi8/|+o&𽷎/gՁy 6{qQv}_NOkac{Y EUz'_<ľ3ѵMs^*C4Iސ=$M}ExtxG\?͔,ƻ/וc cyq^xG>nXqc;nRՈ:|O~6?EM& w{>iٟ/. yʍ|J8`A#}\DŽx3WSg:.gO.Y6WscPH85mJhh5H :nV]9Ҿ~4Ӽ[?&uP 6Ŵ 1TP|?dn4x4ϊ>>Ҵ pWs[41,$]6\+)k Z5 CW 6ւ9BYA G93g@ ; 꺵߃>+xj\i\5F쑴x9⾌cUR+yt3yh!y$O<.MVvѬ0[4PJ_| }<uY ٺ=ݤ\\3~g=Mz_ßgBI > AijCkY쑀fShA8c';O|/>zY]j2Ky*Y#{WcE|~惤ǣi_!YF!ٮy" *$=cீ^,VkS^y!@FyO!լ|}薬/UFtVT7Hf][v?n :ڤV2X߭{>cڦkw`ױ Vn]TE##b:+ξ5|o 3ź{֮dʺs߶p2*p28Z(?e_igF' yFۋMx5_x7eQ5پ[q,FF2N85gqVo B1+" a]3׀Þ؏zu#T-7,Җ%ևԔQE|Q@W#xş~x7R`bcX*y'>e]85%91X`%vݒ][>3ui+P֬mݚm>id*F8$Gjh]RE7[>{Ȣqm#G"fd #%T+)󴮓I6Ԉ'gV7[]tWz-ktNQy\]JI8NJü."N-UVZEW)QEQ^INwqro*ofq^k&KGҁ_l}o^(xQ*Ͳmgc̭TJV>O/MخXwP&d2xx+keu]uaPށEWQEWG|]s[8|'IMl_3gʤ9g>3__hz_[pKD +24U=[W4KSOGH%׃nxXT|cZImÓZ!roO} Ep?;x'㖓=!l.]+f96ppqpk,)hZ7ஂuokEɅ Q8xO^44tZc**Xpv5GFw&. ܜ$xz 粛S^Ikk!P@@CQ\~"xo⏆ kޓ1*~VU#*ttQEq?>3x7ஂuokEɅ Q8QY>5<+xM2;Vʻ_ʖ5t;8$.c"8BU  Es?:M~4OTkɳs/ʀ2^/ksR7nMWI\r}Ep ~<㎟=׃dF؅۠DԿ4[ /Usy( ( +/~,Fbԯ,8^ ' '|jVV*|[_e犴>Ƞ(nh-A$sDԌR8 ( (|e\xOOqomV[ulѭ㙉 $K]^ =v5O_%k+IS@}i] I7r` /1w/X>Bf^9$rW7+RxV)5/x,ʫ8qxEs]GĞ"v%1Pv,y pZܢv<ZZ9t\Inw`qW#OxN{a'Geppgz%Vg5/^lM@Dz4E|~_ jM_!_OЮu$nSpӥ\ҿoچs♴[u}6hb}Ef 1uWmRm6Tܴ,<2sF:ׂO H /C]GA)c8@FQUBWoK;xfdF Vh7U&aWQEook$#T3mg]'/?ŋy4m?]Eմ(V M*'NvEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUDjZ?|3tl?ob8?թSֿ65 BmFi.%yZFbs5G;/-Kc^ -I?|wS΀>h[HѼ3+׾!y/la~nzWܕ7Yt{UgHUz_1+,Hp'袊(ߌ߃K˘٨K;mV'p;׎ 51|=\2@]q ց|<>i Bu?+P}GC'PjgVnJ.-"cNn0Qvvx_|NoPK}RP$eew!xlVwᅵO:isq FR$g{WW~%Vj`^@;ꠎR{ RgFSVQ<Ju7WQ߳׋):}-qaeͺ"+^$nk?k+o<)4z g!´Q#1&owK$գѮ5D1eqh+0A5IVRK<9Z,wAA?,2[Sԯ+.fWwV׵5za!OOtӥg6p!.d1cc54|5Z:E̐Cy<(EW*:⾊RKmq# o~V o#%LdP*:^G5yM:SRK_yJ1=W6sb9qj')E^͝ʼn>*&f<w~o nwM,d ;CͽIO#=}_'|ןY?RqR{i-uC.y{]t^sxN(I]{}ۘqV1$7_/zuy1$7_/xxlWֳ,fb++MxsIJsZ%׋u"ZXAWj9 C[BV{R׭NZm՜~~Пl%ֵ9iDBrI^_*X\kKwj͸(u w[)56FY_Fr c(KF܉AB|v q5B)j7fMb91pNrd}WѴ}QY&4y'l!eWI*\tmJko[L 2 $m8־OGZMc+:kKZ7CԯM/agc|T]4E<)H?}kzS獵oᇉE̫gͩZ1Plu'Qc?a]O}٧6Z+_U 'l>CgPK8>t\ڦkǜ<TҠ>3hҴ{qmGv@`$*9gfcMy? OmkO{+HlW&eT3v8>|!46/t_ hgt}j_&Yax3w?4F9N'ϧ-Ö?Yb%.9ªI.υN^L#q7@v@|saP޿m^xgfiw|[st༷M?wse-I/+;㎮Ś ]vpOyv$k_>-k]Wn m^4';v$x> CG], yvN#'׉*v> E~d S/|'|y5xZ BX␑Þ$0 џq/~:[cJy$ANSm pϥy?@)aoL֧7>l(o_>.5OmF |A޴2[(6te6߆/襯$ɰZz&?u_ߵ_?t E4b6l\"C?]1\VM G' FEk>'Y꺜kVPʟ >#q?kQ}z%cžZCpRqqτM5jV񶥥Vgqo_1:iS:{ ھ(j?x5tӂDgv:?'h߱.}qIә-2ۉy=Ie9I4f菮x'57'$SK̍"9 @ z-{?0N<,МNOsr{ g; c]#46-a-!(U<ù<%?X }vw4o`5Wh ЇVq|8 wuզ߮$XF>%M~ࠟ=7K,4]ILm"U/8|y~%m/HRCdS<GRBf /ZQ5m|ROZXH\`1ր kv> /^HSq.@Q _5M_={&}/I"ZiV6"iw Α1[rU}9:ɾ1_KHn|?[7ǚT ؓ4YW\(ȕ$de~\6c[i? XiQo%]%׮{( h7 |VbH;GlTzo uWڗ l4{_# cjVb=$-?08Vo#_|<>u|hiSg&0Myc(>:xƞ#Ў#Gj4cqڊ(2ddmku W 9c`FC:;׍~?oii)Is]i%)QHܩh:0T@s^Fw%J4K ?oo c$ʫP#|ڄ6V22_q9,{@?xz(K>{կM֓; _tk$kY-ܮ {K7oDMx*hj˜>7|.<s~eK*\G1w/qh6x? 5[Z:dIyn@${Wğ>C5tM%eXDi$"A8: |xcVi_|Br|Ӝy  "'ŽeM ZCsvI8-s.J7;J.ݮ|H731WIzGԃ?O(H< m/ĉx^?TW"u 9VƧz/E~Eדhח{78[K.܌՛j7~txko4U}z7{/w YCg{ ̊HW',FO-_ ~vg=gH-Mxl_3 ewFsW}KKe [Ƒ׭e)3_!h|4ePzOF bó9Wpm;2Ea"RXdr◄w_lS([j g }m3]rDͣSomXZhX_1~¾k㴚g%1I DMp:zWAku[~$ xV9?1VH݀k*1 D@z\:t[ dtr{o:ZG "{Wc>lqn;PW54.C$v'W緹xO n3&!N0c2kz)4Atbhc##r Ek_i=[[TqUҩN;k{'hO,#Ӵ6㸊X7)T{ xgYH60[QI0\+a@}eύh74ע7F9g1 b{I>bpXw; ڏ7+Ri%tא*CVt֗[m6un/$医Z:,F?+-o-NSݵ[сO \x#',4#,كBȷ$FTv5Z}roV}wf_ZN:u_6-ӵ[c4OD_h+WpʑBi',N9GzU%֯ki,S\F^?ڗkkj]72g#}Aoi.*Ž yF}{wnXZ'%dޓS:ލyYM6͂\]4#95_ _IwۙeO) ! =k> .Tur哴$f~DUa(}[?'+)jo{U{l3Jh|A-;º\tvQgRBO'x_ڼZFeG!Tu9ּ:ǎok eg m&} YQH m9÷a"sEl|;mvv#TI9n^GznkS*kiס}#{O?;|>ֶE#~5H{!d|2QYYL`״R]C"^hPsþ(ΈZcLzħ ǾT`u[7 Rhrk!]7L=ã2=3kr_nHLhი#pw+c`O\h- -u%q^s 87J(ruK렣̝&BU=|w~/~t&MQ-Ż[O4W?CIV)=7Iu_Z}[+kAxce<*Ӭ|r4?{؟i&m>%bC.~$_▄τ={M-i&kFȫ-=YgPcd'[ kO6XEOPGs[o_('xSAq>ݴ ?a?;uݽMs ws+>-rB*08 +GTt#7~<7 ?pXa8hdNNwfQ~fu#zlUo7ou?O<,YjdvdY_<U|=cM]X~ ;iZZ=cnxN8UW|1  mˑ c;^7㟘 1?> Gk˃3B1$I_):d>7xKIAPVБ}#(>φϊ5= LC^31FO+ʬnwvl6IJDrq_:xhO)utN м$fe<guzj_]Jxّt) Pho Dv+o#j<D7u3.hBnQ7 k&uY4o:nZ? ݤ[>Z$05q7/RZ/-I,WH+°޹kd>O|ac'׵>ssy"HêdLo±5WO%&j˦-&(QA 5|W;|Pk>{'4i#!U6cҾY{BmAcgUhLޡ 7&#:`BAhAZ귖tLAseU|q^_/Ŀ?GjK&yEY'VLHQ_Tq'B}_{_/~^{W_P {H#U& 0*H<8?ࠟV;s?~>&?t*Df!ypLiJGf5axzg|ռw:U\G"69?Q_&(/zο x{GI57ҴM*A 9=h߱g_VEG/)~ߪܫ)P%=]P|zgj?ekK99M i .%?=+/>1NiKlXdqǡdwc fYon)?Jvy/ʿM_=6;\^xfDree'EEgHVc{xC1l A|'tぁ_/$ZO쿉]9W?oI'>:?&֣?ُS=|dHp$@N95}>;|dF-%vs4~ Ӽ0N{;xXMFuQiF ^ ~nw>˨M#è/V]JTz :xmE__ |g4:뵲4{\1ܐ;E|^u]K'&:~@A(bx#c5ko,.>ըRK!yݏ98#$gO.׵>9kox.8 /?A@`^Giu<٭=+_ 0,B~a $qxEC aGW+J+žӴY]$W kG" 1om·hZ}8@u澮šv5OoxGHL =bW 뎘kW*G|F@zwwiڢܤq!ʄ#n>Z֊(YM _oxaX[]gTfJKuV\`+?1<WSXhcnAң_9#{WS Zkw]FGdR!f  <`qJ?jςm[Nn-nlayf=r_‰-)WSiFLw&'C4^~_ c'N2\ߤ - >]Ie':CF? jn3XȆ9fl}!_UjZ_^Ζv4M! ?o COx_Ş#ME0[־?^!z,>ZML=ԧh;@~Չ|Em>4jhGum\'KTʼnb}#W_'~UZS 3KiP m7M{KhW#HaU_'~UZ袊((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+r?\.@[k/S/ }Z ee޲ާh?_O ^wЍz/[^(\K<$ǻ*|"^"((ڋM |AGO6B{nޕׄcEToCf6]zՏxsLfqQ_\.!dBPGb9Oأrp֩ vDݙ3sد[ [(__VSj0嶯m<*ت?Vok6hLa<2mSykp⼓4eֽf kx$u$ P@o3M⾝_kRen&s#jy%TO`qp`qzzL\=RJoc \܉7o?ĭ7 }0έlvjɶ@U܎B?؇Iaf1WCK^Pku}F[S{r˺ 3Fl6WkND{ۛ{r|TQ([V2ʘ43V藞ӣ&I$կ{|^}d_XW|Э~+K.ɜG~bwy^2b_NQ^:']p2M#Ыi!*1ӫ>]CgzIjʲ0`GUEyZ{FQo4άDJ3wi^1ŪYܼB%}HmLcxKzK5I-n $(˰ *㡭=SDe2FxR_kB8z|$xSZ׈nq$IvaV(>ھXg+˻[>k뮧㾪|Unk?[|CWdqJ R; tM6xQ\J ;OJWGoksk0\]hZL֛Z9#>y7ЭUd=O+٦SՈT: gխoZo771Jx+@4\/]\ OG޳SנxS5xk˫jQ=Qmۉ?=ꋢjCP1~$ofmڋk,V_q,<>WՓ˾퐨bb*F1SkRğk%`(: mf“<jظ4;3w>ky&U@=w_υ,jIjo}i$Bqg0PII5_oB& 9cp5iU1[ΚqP;?jwie5j|H `}Wu31Ꮔ e5oE=wU9:)ңMSU}vǁTR (|{sS}񿆬3XaQ̓B4h=٣Uk(0ǥiI*"~u+NM} yg{+/fKNLK+$qzv95$ᾹڏIy wdI8&>WCŲ^-+q/\ vX3(*,<'khO@>v}KBVdII?Ѳ{EcAy~ߊ4ȵm$G! =Ex΋#^ GOh^@V5ȝ(Jωय़ 3inS˚kwc0'׺x.}~Es>zu %7Jd_ƻo?߂ G^V~!׮~{.8~x> KSVfwqp4U <@o|S[E8ԭ&,P-d]O'5]\\j9_&F_Pk&~񾙪1G] L 9 ISE |1 _j |$qeق8)~+/~x^Bid1\wJ;of+^>+Ŗ` +̍AUU 䎸'#xRy-^DdY۾2F7.FGQG |2aj_M)kX|UΙ⿊?59YMKu V٘5I)x7Xt)#mr)@]# E5[gZtϳ?+Z?Weơq{]iQֲ*Vv!K?I">hP߆_ .~ ̪-9 HnN=OE??|&5]9Uλo?zi9f?:^_j30I'E(gb 2}j:7 >3OE#xv¿x~ 2;*W?L x-wפ7Rq$I""Q$S~|>>/4guRbۈ%3ӊ|y+h>&:滭|?j~o'Օ$r@x/b]8Q*} }o+~ʰqףT-^oSz|wkϏ|jìxuڮ182k+WIho Yw ndrJ' &ac u}cbW|Dtϋj-[a:ϨYbk8hi|}sibү,hcXH6mPVRB:xxgCxYa+#ni?$5jZ tO'qFLzV?^/ .Pۥᕒ<WO$1;xkKk{ \ dhŴ g՘Z? w\>hqf'%KIk@ɷkg+WIho Yw ndrJ'[|XWNoޞ }BD$ Ƿs@:ɾ1_KH)t2 ᏇG#(gДi2|7<g\ZX8t9 T.ЎQS~-T%a"%$AFaH9#e]:0ʲB ~{wO_M?!6XYPWz_읭xoID~6xL"O*6i! -cv?f|mBA\ԉ7?/nrۈg'@G SĚCeea#-ddP|!տhS;_\A'lōǏQ؁-J~ֿ|9G/#ЬS|3u]J3svTtP:'^{{VGvVCQo7}^ ]lH#M]g ^/^% ʪʞJ q Zⴾ<'M9v[x U3(|/1[ʫ} k h6Vg z~e?دHtn=(WzO2iL$25z8|]k,ƿ4e`AF# d^ix_Y/Ukk!> m/R4KIP:22S+*֫e'ImnW{ AS1Gz"j M; i:TJ+.|_(Z<_]{R> WۑLH*AyP__h? #ꛎgZ[n9>jB]=PK'mcg/ső\LutH*/o wk2GGvg.K$37`gQź?^Nӛu.SQ!d x"5 Ԟ'*JGP5]㮋lLvǙ$Cc-?UbS?*Lʾx|I36[Ě ƙNUHXf+co!|gYKA].j+Hz}\X|76}1qcYEg P v9cMt4W/wu|7>&~&gj>+2Dm`sۥ}VO Rv\_yv<\{jyG~zW]Y]V[.'fu$¼v5[fRDʼQ>A17W=ֵix_bgt}Lh=9 Ӽ_TqRF8b tl8XUI{j)kWR[,/υ#WAtm>OqyqK#r1^}i nx$I'[g}3dpA+gUڦaO axb(cs)biOݓ[_AU)UxW;"/$?RGuc'ՙKqq!΄t4crg"k]?|"/"yY%1ag1}GoLWĞ kYL 薿0`<>'k؎es<|%NtxX6u `TpvJ?`}M}V޽=ogsRRkkۚCٔͩ,R#.jo?|1e|omhVꮱ(`}O/ڟu1]kSD$Fsz}t1t~KA(6ܭkv^{2Щ牨dQExQX~2ϋ494_j}E4R(.x 1"o?rWEyهY&MTxdhJHEY e5o3I/wKi{n,egEpm3 SpAym"ICHԌ A?c_Zc{qi*-% yI L3 [!|FGG?hn\I Q; )9칯|zÏx՞)I#yE*6Î3`+S)Kᇌ.e=\>#D`(T~\!~\_*+oW G*W 7A n? h^.[ip Jpxb0zW(bd!"]0| qi?ZG#KS Fzglڟ;Q<)=O_#A;ɬ|L}}W~hq%Ԟmی| ' Q2s/o^ȴipe*B0Z)LdTd .."Ia5.H@UP2I'z+?īh(fasvn0=Ƥn_Z}OAU?Xku xw x|3_il,t_8ԝd<Npr@31mnOxn[8 VW~^q\׈?co~+xź$n%b# yP*O>%WK ua`]8\/M?)㋟4C-ƚŹ'!ӡl1#*}uu j۾ cAT~br[9'</v?olYӮKMieF #ICFN>Qc?o4gqjSp8E Urkoeᯏ%|Seoc51+m%c?e.FT{+s tۯk)er}4 pQl<`J?nk%*w/uNI̎?_\$1:us2{ >ox'FԴ "d=_-]oxΨF;MKsFˆfzDMլuq>{o}-"jH ]S^- \$wH-]{ &mC^xĿةNʿݓaº?_ޏE,6(o-x%Kt}6kHQa91|&W脯d?ώ|+o&𽷎񖘺//~亂!p,,{ׯ4KVվ)xXJ+kvaþ%C}T )? ھžoKh-2 ;8lXkt؋D>$^x7!}+>. U ی*cfṼeƫ^X?ږA|Iǵg| km?T7^e< Nlzߚu:}s_ K\]*U<8~&%񞍪kT<7t H~pvPI$hOx$I#oeuHA?<#XE ]c]jʱ1ى]ּOn7Wլt) Pğ _^u|6+`Iī+:WTo6mLj}մwSX4M[ma$7+.ᜍA_?|Dtϋj-[a:ϨYbhg_7߆?+Iyo_Wo)?MeGyV䥪)e 2|7<g\ZX8t9 T.Ў[-x ơkAʡ,p#Pq4}v\^5χ2jXEq:6VV894o,t$[ǼF ke^zj/-)e^I0c7?BMzƱY|@o<_>A,zMVlÌBI# /4OV<7VbE-۰=(ه&/\#.P/˛]ǹ r{(_h? hzm~ i: ̱9tHB$#;H __><~þp*+-Am#w0G,A?9IWចzǾ9~ωm ~Eg]П59HtA4v:72β=HBT&iȵꟳoٳZO^-~*jȁ7ʈCOҀ> S o}Leq' #̫!\tJן'Dt{H-R*gz 9$_D8:u+Knd2쨽HQɯs _ !~!h0\hmu =0 m'~$gi/u]OTk+FWo%S$a}jo!Ԭ[F"eaG F_>nΘ^mZXEJ\1ou8y?dsAcѴ_HlP!լ|}薬/UFtVT7Hf][v?n :ڤV2X߭}+_C?u? ~1o$MF`D@azڱatu]?.e\g# `@nk鶺wvWQ,\DےHVSAk͓x owK}3 \ I_@i_Bxw͸&oy gS!=ֽ#OO6p>qQ2r/^ {iZ7(~؎R_5_||~.[jRY6j  OxQZKo5żB\#'x;GNG{y@o cRt{w4;oq,tv\[~)/.`뿗z#@O:M'3ʧn6;z)xKNox_,%!Mc8P98;5Sp?;[F,&}JcPys~y 'figA}W/t{"y% ,D\"=5߆Γ7w4c PGu:> >r:oba^݁ <3N,ⲷ36 FAcܜd+"~~Z&?*mcӬf0ee``(UMYsZg$Ƭ&I!5xWN-ZW "(Iv$烕 ֢/|@~$5>1BZ^"]l1!о9xž"kc%)Qѷ)V o_R / h@2'*|F'k_KF0ncٸgn1)⯅gl!ΥᙼA5O6[ƝkQQ߮tm E /g$9 tO>֧lnӮ.y(wr$)|1F]&Jm0WrĀ2X@ZVs_U'~UZ?|a ǚv<^٬6-p8z++m/M/*8`7 e@@p܌((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+Rzl?ʾ Վu[?Fy?ʾ -{]B4X74b9eAX GGH[TQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEG|M |Gqk׷pc;`"px"c1ް><^>OG_𽾑mgj-4q4zF qj((oMcx~ >׼Uox~Zy `F6G>0XN;Zz;p(WvjnػuWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@q"/ڼO ZDڎoq[%|hY`Bv*9fbU$re_Oi춡oƽ[ௌ=ORXl]SkZO7}F8'88\nYh[^:t*JB3ssZ |y?~꺴?RdO3b6pq޽' jnjGkyBE'c}U'P4vѾoǑF1bZI_H~,׵8t-:JX`x"|j+~TcҾ渊=H&qq/e2_#at;]|;qkZѣan#L|0z+O_,رUg+'^o [J{mc^IШA3-桤|<ԯ"xm+2\cr*.=bOKVi2I8U$˹QsVBQ\Oo B3w}p;;%mg$G>u"kIhov)c:q[ )!$W|݈ZpMlMJq 9&l+cѩ\*>z[v;_|H֥!-#PF#V!21_B&7[QSmUN41M{QEyPQEy!ogV {a`[&#H_ڷuυlּck@ZI&5|͟*zwў}Wk~~١i}n-@$d@ב7|:Eu_JwK(I^ ǒ?vwc޼ ,4|*ٵ5K]@8T$ ; }ӫj:ujwpiW2d1;xmj~tW)6xr{D#\ q f}4rӵMj;8x<@}g{ѥi/L8e7HUsܚ㷂~9i3;ZRѢc #`g88'f U7ëizrJ(8ON[-9 5 qq" J]sU$r-C-y 95;~¢|;CO}rAԮ5_.vo{}"{AFpqKRK N㫣fs8æf^u݆Z~"5[›|׍ <+5OG x"u_ ?X]JP? pp 5* iŬE^P8$`0L=>gK_߅NXҢI"PDSěA;\63@'|^rFFe;{(8j'h%ҌLխc3&C.GcҾ g edN9)Sq}V6ԴJݬ66Pz*rGBUOa@[WG<^i5/xD?<7a%3D^8b85}~ĺ'k'÷Nf$n$%4& >|HZO}/24h2J0 iR-džl4? {ݠd`rB@#׬_S_ |Mk h 9FG7F}q/oC{Ѫ@f: %w#h;oN vH 0=1s ƞѼCYCle]KnWPOyV?G&x[z7RFbrʈ` u}cbP[nR4D=܁#Ar{_ۣSjvv~+<; "M~-bd*ݫZ>.|'f2AjEspMp V>^aֺM6e m hiЁ}1(+?<7Gv5moI[f?+@da`:ǿ lXp5G Hh&>JWA:5m"܃t ?(Y`g yn.`{)䉒;Yb#k > kv> /^HSq.@Q @yO^44tZc**Xpv?!Cռcy=ah-bd[(8O4$8|թx jB}Aֆ{c{qN- .Cp@4U?ZZOtf}ST6f@;PXkп/o-?x?~Vx~𾍡;Jt>+hu6-@-Xxdaހ>êږoWrm-biB"X~(|t'uOqˣ=؎@7c+K?_xBoãGjn

y6,ś8S_ CxÉ?NI4S>!PA@mwskk43H f<$w>^^^CG,et;xHq{WQuoLkژ$yą_aWׂti Z]6g^Ygf?ZO_kn.mS۱$e0ppN+ϯuKYдn_,R4򵼅ucO}'⏅eA bIYVi~ |ֹ{\O䈎vUyp3|b2񏊡ĚG3*E[ dc¨.6'Io Gke`x%yz<[-5׳? I>:zU|v#WZ垇<Ӭu]YvVB#veX 8NOjޏAi6Zn."cC)V^z׍|/xJ/ x]S7k,W`G/?k>07cVeڈg8ƒ_[x3\G u!ahwLnOL0ROZ|'' 2wp@`P{P_P gʶ > ڠdk__a<%̛8eɮXjtdٔS9% П|YGi%$mqo'S"$z8< +aa^/5:+ӒkZ+ͮ?hχV"IX˵RȄc¾2 jj+mVQZЫ(:q]lˑ_Q^ [rDֺeDG #$]7^x7Z@7Mohgh++ڋOw]3\д^ẍu;tBhƋa_j/9۹Cc= $oO-zON2[\]l .APW5>.=r^Kl3ZIcu*|cC|EYT.fX=I'l^JiOMDQJ\wSw[z Zq^ۤ:m闖rH.eY"OFVRA8/ߴ7(Q+=*dH <p 9mZ;myk;yOpr+{SFT"_6K695=?v=yn 'NeJ8-p2$c*{/Cހ=XnmdG4LHe#9ȩkOGF]g7oo\ϋuJ㠯Jko>!-3:}Èⷁ%gf'`'z<~1LOKUe9>`z`  Nvk7?kӮ3ld#8`P{P|/| Ëjp:\kdoHhX f>'}=_ h?)?o@`|?ռku'<7qϳŦ~" -hoǯ YhZ6d\rg#*k=u2O'!6(܃!ۀҿmo:m.yj]@2B}ko>I.ouَe 瓻wF8q ֯?jo_GOG4-F-du]MoІGqhß )5kVzi f=GVc:WY~mE7m嵻dS=֊&`97jݽJpsڸ? w:?]av=˽8۔` ?Zj+ϼğj>5cObH0`0MUI|6Iťx6Z2Kus2 vPGB@z]yHN?u׈9 :`R|0>|dxUd 8$*3d*v5O_)hZo'.QRHrEnyA`Tz+~?zΡq}K ڽ>Z=y7Oſ~º$k5Y$*Pkb'>3j _;!Я"=6cN;oH?|qj0c8vʁ#_,J4;P;kB['`7,(F }wѿc[S?f_zH,{f&$j=@_7¿*m gsrT(K2=Mqi|#t zuƻn.,4[W JE!XoPCɮ _b德mkQcyG+|C<%v3ϰyqU1y߷7ý+ȗ_Ӽ[{ $zm؞`WkO;=gCmm* Mj;*X.#A b 7FW}&,0Q}G wk:E?`,r8su8יkxQGxڃԼQei9=6r8rH+_RG3@ig'1D !^Ġ'}YE=G>Im:im #B! LĒ$n+`ykŇ˝GTӴd2Muw*J:3M_=6;\^xfDree'EEgHVc{xC1l A|'tぁ@?ܺT.^KG]ٌqWŸI'>:?&֣?ُS=|dHp$@ Mcog+ EXfqut pyRzWUƋ/ kHo -%r  p??t>4#QTnG?Eׂߛ|]{@OH>G_|Rg?@扃"F# ԔW|i<KŔ:y2[!A :פ_.xG /Yӭum2YYY \2v U?^g㧄~=h7ǃ'$=DHjfK O7]W g~O:K}*;hTP 'Pex_9kбt呜GaA'\H|W=Vհm-K)mnr>+ |PkO Ӧf[#x"|27c"<{%΅xztd4KRXG^nW> nຄgNᑒk%'CPzmVp1FGA__cwzԚc n6L[͸D~O4?i^5oPҴ4'GkIܐ+PӬUh6凇dMx xP)|g_].Qkw/9$y_!R5f d#$f;Z۳ᖱy=7A.gUTNgivzsy \[XVR:?q_| Y2Et50$#1]͎[OP=kCćzv6lhդW,qI+k eoo4OH6 cw?5oؿ{]7LIG 3k|g_ٗVֻ 4Lw)cj=Wn~9lSvq!t'cBFZti8f'My_oګMjI5yIGf!]ҺO_h~mk$siQLUN2=kMC.iUB='\x98vv ]~}ޯ -s=fc5HlL\m\GI_ڪ(ɣj2 "FʛUl{}UD3'.+u/4],Au5kUpJ1tϕP.xVvt~H.>U/.^RNցk-ATعGy쩥׊{s %Νm?-{'ůEYzg5ٕ- +'rrƯ[ C6[h)m~hXXWo96h4~o@[[  Nys קGkm⛉.aݮ"2`ֿ|UZMZ}q%E<9UW+/1V%/Z뾾8tyd+VXdIoe?B+_ٚxy0 ǒ]L&ƾ-~GN\+*Kqpǵ|R?m4]Pȑܸ;)$E&} zWJ:I➺yhz88Uײmi>4TVku SZYpW0xHS_d_ègKv܋&C qg;9[EsF_sMX ][A:88QUQlBM'⿅9?Y݇<'-'ƞ籞1!m1duBLWf<4I|3_u; YNyrݛ+c, mfWWYjje^;3;v2d v(C?&j35QFKyg,vǽz*,.+,Ub䛲:qͻys?fz&owQv~X/"lH/;xw-:-E:X7V + w~ȿ4s᭟z#[3Fήt+QYg/cUGF2ۘvm=y_{6kknOM\rww=[࿋gWMd#f(ORTkg[§C='m–'A|9e| Z̨O1Rj &ѵ>ZUz6/+կOvihv=|0_yE]>j|O:{º:p7OJ2p*W\⽋xƿ<'1WY!ʐv:aOlWE+⦁×od$Y*'^ 7pY,hmbc7:*kyE\N?YSq䕬ޫϹBxRm$?jz9~}/^WR|=>VQ ְIe4Ѫ4~»GoOOl?V|O|}d8z?W?࿃'Y꺜kVPʟ j>U/Aj:c}QA_J_~w]OϋN]O iC"Fp\slCm_.e[ϗ\ʢHS[68C_sGixsUӕYcc@-{?0N<,МNOsr{ g{O U;."t˫":+lr28b_005o Sk^YIđ$=DLҀ6ᙎZğ5CH߳?c'ķ鷏T/6xLSw\Cg2:4J1ԓOE|V4}2cJhO*7}6&zM_E^FoD^:ɾ1_KH?o/ٿĿm3E]J@{wc'H_ v|%k\:}oMUB\ Kܣ) =׽xxgCxYa+#n2C&eF[BY:n\:+*7}6&z@ɷkg|~د$Uu石$|Yʺ6o2=*TvQ޺?-~;d̾^||?v ߶E< ZǼwI vm<(W⿴OZm \vZIu}2TF7*Z61׮=k */";[xNBp{|)_M?!2A22FkR״E/4xM̷J ,N6,-f;{hQiX*"O $Þ߶oaoq*.k'y'o[[_m%'dn$46͏_x35j:.Yİ[\đĀp<hhxK]CNY*YZV8'ʹɯ73Xx>Ѽ 7>m&tFcP_39 >!h[]W[671̈\y%x/ziM6O vKOw G}G%8 IS4~þ*n5 m>{kFour<<;G z'o2'6?U<.O<}>q]?ŐYj.mg~$do9I^>ޕLnֹv{U@؆&oE%簍}ko̿O4_Gx|;U{XGk~+/Z;Iw[^M*XgzoM\UigOྷcdv`B_K'mcg/ső\LutH*O#xז7:&$cI$ _|~)q%Ֆ愅vQM!_D~žMB&9u' ҳǑ?|yh>:>IXnd{g)-_ >=OC+cqdk/[|U OqyqK#r1^}:0jvA?ƾ36s:){|GD|x2A6ê[.Q|vZ/Oo'gO=U 3DQ&@v?__}A5}#Py?]\EZ;t'WFWϞa|Ca!~W>DUw?)k#%Bvn1Ob3^mUȞҏ@G㩾ZYYI_BTR[@}Npdsȯ\t[6fk!URNko S yq]C$,ݳS_@;Շďiq~r8x`hA`[vZzZ)_x7gG 煫DtBKX"c%8f=v?|I}_[r5X^]iGnUq'|aݥ_k/)dsQ&wߓVќ8Z85)4չϬ5UU 0Fxkj<h8 H]6+Ӿr=+O(~5'ڵח*GIԡִ-B'(a~ҍ|Ϡ-KҽˆFk[O׾0Yj٧Ӭm 1"o?rWEyهY&MTxdhJHEY e4 87J(ruK렣̝&BU=|w~/~t&MQ-Ż[O5kk_~n-%YO)$?&~w/;@ !"Ga'=4Vd3Smx}G٥ 7sI63i -2v޾VB| $z iE}tk@5_٫ 1ySoDY-р?ؙYT w5uxnMDž4Sfrlx}>\?T;CIJ<)]|m3?hgm OIb ߄.Md=3*d=hxCEWn;׺%[#Y01Ҿ$sxQďӴ+Y|lz&6 ︸ 'EԻ!U@$  c/?ho{ˋٸ }hƏ?ii?m7⯆UVvV K|8-0*_ >>\975Foinއƙs<1mW7m8U?Xku xw x|3_il,t_8ԝd<Npr@ ٿ iŧcfD'rwn 5M[O|=6y#a HF͌?tJ.n]cl`1X"Wu>GjOJx<;KhnFIx[@iJ~՞8}fOK]IY5 )C7ҕWI|?u[x{R/!dz,m p;__ h?)?o_vZsğ O7[^'amfKAZMy"cB~BthG׊ |dh]_n))O,H |sg|AmKO &L~i#Ծ,g;dl(`4Kؠ:|4eP-/d03# Ȭj &m̯o>I.~|#3|'g1hppbfhP$I=k?gL7 i h6jvz!de޾M$ _~!P]/  𮺢~6a8̧LUA_5? 1^iW4;20e<9 EoTY OduzƯg&S'K[ (y8K3&>%`UFíV#Ke嬍"K(x#WxB*OIѤͥtR[+ vA p+o wjڷ/c]mn8w$x望#/Pї_|eHU@Mx|eYZ>C Ʉ"΁qⷆh7ycjX'%?-hzEPzROw878W;@?/Ŀ?GjK&yEY'VLHQ_UEHG" Ѓ]]|#~п{_wW? _^uM_=}_ Q?a3~οo W*M|Lo[8  ;)߳$]/+72֣巘IB7t,F)*eξSH_-->ͭY@Fu[ SsKӴ?|\խ~"0cR|6$Bb,2~FŇ Y|:͢}8cQ8RJTlRI"K~K{Yd`v _'IҖQC3s$|G|XӴ,C2*Aҵ忳WM+^F]Im֠_7S,rQT=~xAgtcr<ܐ"pIbFv:uo:IőiV 0Q6AG&g:"/9|GKVHYJ) - P+BwIgM6?"3.hO[$Wi y;JEmY@fn3Ʒ?~[M$SO-uHWgXIrN#/=4Ğ't]ST YmOCåh1n. $$ N}je-=mHFK_~~hSW<'hַKB!'z(?5ZI }Z~5ԭ5a>9+m.o@l].ObNX6vz(CoJaUT>pfW5,̒"Y$6r—IguBi_]$2+_%L<]hwy&1(NGӼ=ÚDMZGglŘFr{Oszb oWYp69='4Oj,٫X}PV4ȻdanG9{;O,TiXC}lrщ6}Tph[5xw_ޗuDhwI&`K6~Lny~XHW+ǠOX5ٗچqޟyI⸅$5#V[Ӵ=>HۭDfv.A?޹ω64&g״]*YKVS*FK2#+_o oOE_|$h7vb_a$,XY .t&9 &=J7ч|[|>GHu= |zQ@?cc y?5(ݧF*/,rGJƯ9񞵯d֏%ȥZB@TxYM _4C4^~_ c'N2\ߤ - >]Ie':CF?|o)t?hO?o COx_Ş#ME0[־?^!z,>ZML=ԧh;^u>:|UL9Լ37t>f&=>!ӭj?)iiYy|[dГkz{QFJU)IKf8ԋ>lo؇B󊧊5U- H]3gmDW%MHqpWYEz8UromJ86\<t.աg-5!V${WQ^c콇|ysOftdЭ/r:auا4ni[4kܻ65-Ƀ1X7IV|ľIu=cR#S!v@q#^hvҭ.+ uGzsWfX}Qwܴ % -h:w43UvK*<][)ׯ>Lnԝ?Z*0y/uNs+(bl;!#խ5I5 bU#q(HE!y${WEeqSɮǖl(#(Iч5?x':}sU; -dA"2'#qMk%|/Zd<[[V^  E gWQ@K LVA.ArX`сW迲>1t dօaZk{n܉,th 3-/kyujz79a.O\ izljs5ojw cE]@`35P^73_mWXG:XLdee`Hd<3^>+Ŗ` +̍AUU 䎸'#xRy-^DdY۾2F7.FGQG ME| 43~"k:sH9"Ѷ-߇1kiRiZowwS[HF" !R:ֽ?Weơq{]iQֲ*Vv!K?I"(c {\/$q"yj3bm>OSm"ٔPCྉ6֡y<vA(1W#[A7ׇ5kO.Sȋxq;d&npFFG 4Pο?b3ƚw~'DNB! ضd=2|7<g\ZX8t9 T.ЎtPpr@\<9h7w: _~MZR]͌ʘq+g8W>"\λ$퐬pk(AO4tOKK݌ܸ$=p: X~^:֗kľ9U]9S)Wa;^Eqih~ ѦkIi]t+tآ)62;HtoXz=[?|]k̭5᝙˒*1 TvnO׾!Ŀig G EA88#عTʫ_⯉!~"ψn-b,glDPLsF2;>'=k>-E1#ƃHÂ9V _L\XQYqݎX] P_!-ωh_ڏyLQX:#_Yjmϟ8/1ko8W'௎<{Vn` kO0ds+鲜E<= Je(k<|u)UJm'woC{jRn-um@={r z1x׺&n'Ӯq=.o;zf^5\n")[+%=aSMF;SϚo}!IIof yYy|Ufz,Xe0­(#c$nF9s+veywi2N  |A&i-#<*?~ϺgEoj$]eXeDAg< ^EmᄊWC._w9kZƠRx|CPOppۭq~sUK8.2d * GGtV4tFdՕ\%9-VS8|knkZKu!J! 瀬ǦE3;pƭ$:Yٴ doD͜1{SXB ^}Z5(}icWѮ>İ[J$jz'F1\vi|BNblvOuC'>tU1ǚމ٫\-Y7qxX[AZJ! @3F+袹kbZWlFӢMZEW1V7sM:dvhp 8"(> z[%icm7x^&X-5+Ƴ{BBכx.оFΏ/u MByld[ $SiYg>WPjMĶ_jtE&p# d^{~^2Ewy]\PD.Et u澌9 |=Ѽ x)[F{vKX `ϓsWMM#E珬#xR =¨; >ZcKw5ıA,"=NQo/x_ڦ/M!]CwB$HWk NI&'A?j^"OuG`zp =؟QlϏP\]ͼHF%YX0 ־c +|3 ×3,N ȹ1$gj}մwSX4M[ma$7+.ᜍA_?|Dtϋj-[a:ϨYbk(>2|7<g\ZX8t9 T.Ў[-x ơkAʡ,p#WQ@xgd_ xƹSSW+3F'@'&ΊX, ]Y7/g =&+k6a]!E$Azρ'ď SÏ+iu+]@iv1"rc@tP_<|x| Cx|U=[VZGf#`-X~sӊSm"ת~fjzφu=zP\C"*#r?J(4|}Ķӥ͌}a/ye'x}WS,Q[Tr@Dڻ(=3H4&=J D1 Vu`aQ%1@8wg?|9g?I˚+-<c_? |~ym%B/#n$]xOZ5+ Ю˨Fu\9wx=23^=2Hyt&7.13wE|gMC6jƝUjx--2*JFѺq_bQ@g6MmgZ.k CBX'` Ugy!j,Α⟌=|>loڡ\/%u.=k({ß |+k PEJIf=]ؒǻ1'sYiDKHIml· Q"2;=ȯk9Mᮏ1wЭ2L^Y% u=+|=M1aோ>漆aGҾ>}b Zx~&dg=ؖ܃U\g+qe Pϭ~׵MO|K-VO6L&E"68~ #qZa|K1mC:/rw_[8p+h.]oER希ƷyA<oG]U#ڴ(?`/ @8'pukVp`/d~Wxw> [O.2]x^uRl(F <tTP]V-.+ˍ>K^%@YH&eܹܤd 8_|t3>#؎g7nLl3} EsA[ kSk67z{iw{y:kthQUչM:o]d(aKn#95mY֨(?ΛwvwCOt`XrG?-յRjSF&p#!w1'=҆SOͤdoSXDpիE?oƫz]m̊PI[KWi<`1=?"׆Sd{5|Pw &H1B2xylT%nhmq4XlŠ(#(dImƥٽ&ºį_:⹼'ȫV<{Cnؿ arŏ~8{φ%} W'T~ovۗ>诠PAUĝ[[Dyx|lRN7inzMߴ(ioJO>9#$22sc-l.𶭪]Օf4:iBFv$4W|׵Ү 3,$@dz8ʧՈeWO<x䍃+w ('P< %]VwåXN6A9b3'7ŏ3c^h#fZYo$own=s>)|b rHEt ?(Yqs@~9c׈&o[^)Վ78CP#vMi8–U'#hz( +3)qOjCJѭcɒ\3( O 5>"N/j '?$4 'ol׾ cπx3|N(<3 .Xx#x~TI\X,NNW+@=E`He# A+5w5 D-5ߧtu98'b=| ji.On'Ag _Oi^uoP8̷N8w$ܐiQ_# kVֵ3Ȋm>XF0Q^@n&𦍧kԵO/%dXegh@$#ڋEi|7q5WY-1hߨ(((((((xz{ 8̳IpOχ_Чy aS"T*NN~~ j~:Z+u߅~'h|/gڼFUBЩ*x^Z0u;ftӬ~aEWQUuMJE. DvA!#U,́4m%vZ={ZCe@Ux"KkjaA2XFθqz*e1sJI-zzPc4;J(((((akozt[GeOeeM2Dm~Fïu>((ߴǀ6z\_xoy{ =mgq@Ex6hx;-Ķ"}_Z4ytr9b{sPEQEQ_,Y3g6w MrÒʳ^]xmI<¦_y Rź&LJ`rņxj((?iO_^&3U5{a-|@+*Hͯu3~ ( ( ( ( +}⏊8𷀴Oi)IFW vkfUd Hr0x -F}'PxVʚ2ȍa<4Q@?hO 63J3n픉yG ;ʁ#@Er KB=&zXX0d0psҀ:+>#~>oZ?>x̨0'8 CI8P' M{uW#K▅§_8b24ҸTDAԒs:+ʾ.~~#Xi'Ԯ֯V3\**إ~A>iw+_x> ޿\[4%KGl|Yςv*~=VZ}M=6ǒx Q^5Zzvدt9#tQY^(^XKMK]ʱƾ=a{'/ nƿ;to$Bot IUnvPmE2YRIcfv8 $Wڿ /4{Y]I}{a2*#Iuy/|n ki{ufv][`3ᑞ3^@Q@|LO}{6˖y\BF ;`OA^I7 :-[Rώ ˴/|7:Xn$$1h+>0<}-{ú^&._r8 8 h(?'"|J BKo@B!v*ъm8Zt=Gzi^ڬv8*jqs@7>oM#Z>cVZ;<~>燾$v]k3%ի]ê;7袙4o "o_0>{QTMl3Ai>]R-mNc繠{4> _y㗊;Q-HWVU's3^+((>kk|1{I ŷ7 Gg€ +'^$:ޯqg_lg%F 63 _ ~(ךj\GjjZEŹ܀<6OA}EPEx#?K/jKDv22Ȥ?1N:ֽ /L$X]kKGȲ^~ POEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP?WxR>6rƟ鷱?թSֿ5 BmJi.eyZFbs5G;/-Kc^u' 1_'e/;Vno ﴋH`v1^{_rW߀-g`V{$QW9ā}M>(( z+Xci%y>>O_/xO/ \Wp~h]h`'VqvRճ3սWc-ǏWZIim FkQOSmͺ# < 8s]txfק藢3, ,.4&qWȟIx}f'= l;_(ծ"˾` !{~W9!xU=i$D+}>rOq'e,2>qC?|qu῅𥭡m\!/TN ?Zԥx)q$eye*8|lƬZS]XԩSmoeǏuK~oYio٪̇jFPzN.GsaY\U~L:E2'd8#\O]$³踫ҭT5 {EuGnJteG2+߹-E7kzUFG=۰QI E|_+<_jZM:\ Ȃ + |f|h|8[?r8@οxdt=5/M?t () UP3Bk4a}~ZTԜ)r/oE/. h:XM+vQr@b]J¾#K-ٯc*ɮ&[egKJ8"?CV xXwVW#_ZqOg3iƭN=Ӡ4;w/.R6cwcj)FIEk kA7a 7gQ[KihPCWB<١U,w;bIǶ*+OR~խ'13̠n9kXg{_Nkm{߯yc~/kk[_o#M/Rִ[)%WT5<㠻H>q3ϳewl]gss?= ;ei@Cm޾WxE_ |L&mJ*+GJ?\§3vr|NM'Y==|™ߴ[v1ضsOkaS_p _N׳ĸkὔ:{O{?(ӫ._N>>(j_ ~f>__7cͥ1<֖9-Z.+L7mc?^K5_-k+(Yr{sZWU08Y`'N.2WIV}ɧ^ Meә;=|s[RЈ-c-^31?X}_4]Dɮx; 8~S<_R,6 ))5^VʦWd䝽B(>*YgBuFQo]z$qgoWnMj]Qs y-!$vka|hf4m'e8-8wQk?ƏԼYYX-%EǝzR3{ #b}BG f7$ _M^u/ٯgwYiX3,yesE|*W"˿3/=iĢy V4dMͶ2,Nq}׫|TK:!Rf+(28`c< º/>-x\5xO1"-tVp@8$g޿B~9|!į귐xwVJȉ1W%U۞2 k7?8zm׫|<C~g$DdCBGfďk;x%CO4bac;ǿLb-o[~WѲ=Ashǿ-EfcnڲJlgj/WlvPMyVɦ^ा%յ{V/M:|,NG%vL@+/ῄvx(#% f2T]MzڣBcG^wIuk-bGqۗ{dΜ]?fI4]JD[0u`0E,*OA@_V/ [G%/:4Ǿ齽k?1jDBI[TD=ڛCi^oFhwPyݷ+~|&,64sq`vهZ?nĞ!k{BVh~T2<32WkFg㏅?yWIG6!c U&.?Ҽ F<'2gԮR@ԪEPՇAUɼƋ$(?˭|tnxR#J>+ɴ=]Jf8D4K(f?omMJ4>5_C?Ih p˧k3ˢ_ß:nz;+|9NJxPt뙍izS4ds!}vs1ʿ?kGm5xcm0đRQb ~5Mk9؎i*z(ot/1/#yKZKm<8_U6oaE+p0]RgOg{W5*O j[ծѤ@Z[a1wwo_w^-cs&AZ$,mϹ-Vxm{<_ɥF$tRR6$%N{5gh_ūqCd=|ob1ڹlOQ?€V|>>|!yiauq{m3Oz̨#I>61z|-u[->{ ;vǦ?,UNVciq,P`}h?‹+!HVÕNGeGz~n$h.5t邞'`Tad|"njmlr<*_j? #ԡ 702hztUY\W(J:$`xLrmQ޿kCLW+M g=#wQKm_Lf#Zt $3T# vU?_:W'XF_V%/ ^k&V]ʿr> V/-WEϳC^gX?%5f{$DK!`~\睹*/0%K_6a32ty3goƻzc =~3ċŮ?brF^  ɝ mќ*^Cy4ֶQ,Aq01{n6`8O 8>x7Z5[BciV71y?8k?Ÿ|-P$A_=;W>6"xo\^gZ 3H>6p}+UTY-E ՗vJ xOR"uMJokV ~ ~;ٗi_h_#YC?RztAorn_ufi|/fo-;I1#DO> 7E|h||iqo]B/tea:WfFQcn`_h>ug d5PM |3,|{%nnV$#Ap"%}7+ڼ=hAo >&yYtǗ@\W͟nQ^iM̗u4;[gOlgg@M3N|KzcI }`PHk 3_l-?}i8hVv-я2D+r<Im4/weEp:nL[MGv !>!`mAc]]]x.y$xnYHG<(ITvǦ_|ZEmvQ Ku@#X/MG50׮B~OarDbo0ڥ.q .uھ\z2|Rj h!UkR*p^_wyI4?G4A4js4wo8 /}#:a] sR3yO._φ#3xBukF1V@ȌJx>ըRK!yݏ98#$1|#c;ϲD@X'Cn|{RIk"Ȭ G~t|_xrv[(5IDž61(=޾sB!S^8K{T`$vb? <k_.ᙼMg6k/$g"{[yeph F/w^O5h槥Aq6? М {+G,z09  k</ND:Ŏ?^wZYxjgV˝N8Ҹo:~Ot+O]VV~1h233$h<;Ou5m u[}M[<{mt@*A"J1d|Mw5h`4|u 0!?jP__N^/W4%Σn ]M.qH3H[_J:{y{]{jOn") d _/ŭf=#>3d8m% y\~"\[[KhVl 22@ï\R:/.mQdA We*G^C(}UwBt|P?|){]rk99 Pj?~_~Ri>'M&s;0  |uuMKxXeq "aׯbEDg:FOgSZ>thq:w0F]3)ֵe.}GQ[Y@R@ԊETmuͰi^yVb9?< It0\_?ܷ9 wQ"3^%iVWl&Ĭ O3z [Fmz~Fsl6tb@+m f-njNJi5uo;n8T[lu읷}qq1)wv8 dWG9"ʱ #>yxetЗd)!MC{? 4[;k(w{3p#,ܓ$)aBSZhmّN:rJ-^ꎏþ+Y.6|. CtC^-SG&__ j$29zh7;I'Q&7̠l=)4Bls<=:WQ\v*TNR[/~U}Fcʩ[F,->ݿox=>mHikUr`*x:|Tdž_OX$1Ǔbo8$8Ծ>߉̺;cPSzW~_|3χ7:[jPsCA|1*IO+ȡTϙ(++;%wTxPoë|K| ouF ^mU$vA=%|mΉ۳2Kng^j;=߃~*- ]Ɵi60YY% `A_7о>Džc$28?.\|$דXCM;UzJţۺס>*æK"A2$c4]RN͞g=ݬdތg:םxgP֬u Kw |%"pB<+kJ.H+YjOﮛo{mFrsKNGw_|++F;cVۍ.=N3?!Kk|Jٴ ђ W|@?jz-^%2;Ju_zⵕ'~[?z/ȁ8;r׻P\W2e/ߺvӫߑ J0nT>+|(.xdzta4jdO1"\b^> xT76vW7Ŏ7N޵u1x7wXx5TAkٯᾗtm2+g:tF4/1Ibq >|\w*MG!׭b!e3"z #` 3 ~.@Ρx2zt~8y_g?j5-Zl AO.O=qCi U*o`ۛo4˿Islvl&k~:moŞLJ՜p Cqwz4DҥO-/%͸|%1'{xV4dYc"wV6tR4o>#xcᆆNJ-N My(]]y~nԯG7'ͨivI%%L{;zVxkMM2q+3)< 9F-cºݤ76W1B$pA]Cyoż<9c`FC8 ?W 7~ر#q޺%čS^ꓼ7p1?NGtrw?kWW|3xŷ2^vl?a%C^iv/wwז:NnYP{W[6FGK[28弸Ws嫴q3`*ssKӴ?|\խ~"0cR|6$Bb,2~FŇ Y|:͢}8cQ8RJT3U|(i~55;mVff 8OƟgÏ~ }Ğ*5U*>q;0B :־@G^O&zmDwHt?FW^۟6u/ X'G;_Q笘PԆ|u?i67,.]FAG*P_ rҸkKX|uWW }KC_Y[Go6Lʿ~4/s+/xL%k%bVpbF s>v:kWGmoe{]ڼHQ {ׄ5|O[MaڮtjP vѨq_Ma?iYpiXk\;؈% @uӃ; ~'P򂾓wᶤ~=/m[ؤw##Ѱk*>o`>=']2hok &1U>ڀ47Mb[&bqnO :)GG>'xS^zA-$i>g8젚 rds;~DlxVtR[ FGaG#s?>?լKIȀ>\{2~5Ov:߆u+>-C+2GEd 3'Ïڧ@~T>}582: 9Yx70k!z'f |o8f~d{VjڅYHCH50_ ҟ< W"x"Pѭ4H;[{VX@-: Lc@jo 5е@m潚>u8lWCW3Xwkې'-zoºTgҾD{ÿ߉|i7ƺ/Zh|vLNfE=76?S@-]f8punt\ oš.m'Pztq|hr?q9ֵ}Tlin$A>o !Ox^[O+I4!lm,s5o`կ4;'3=4Mx/W'ﴯ 'tb*Ol 8=UxL'tkIGKkG2#_?*5.n֚SmaM6@TGiw\מeͦ&-?f2By|~ޙ߂~8u#}C(>[$L ee bw_Zm-e%Yq+zp2I荀8TS~LӴ\}y$GDD_AOzA S6pMcG')|A_L~~RTvkN?-Ӂo*P_%/K7į/n?_f tGmbb>h^xĊ} ϊu9UM&w9i $ylORSEy''z''8ޥY+%;I %o~LJuφ|ek[z^iQjWdZiL F\($=k_./SM^k_.xQg-3۶A$dZ9euϣvPwD<l qCJndU5r7Y| /bhK6I#DyX ۳1^G?$(4(拤nN#H\.P@ap?gS]}_TWHUUEpXt$$g@k-_5|6>T+mRN?+w\s@ EP/k5]Oao70߲x8_{xIQ5XcK cDC&?uo X}?F-^Nhw"ٴ́$`힑ܘRg־h+ڥĖͭnn%1g<@oUfm2Gk[9wghDKrß¾߇xUE5 Npv#7Ur+ǿ4x?FޭύoMKr Ǟm]fݠ? |r~(RjKZIo^, \#HM}&:m 2W>.R xSNZmc[w;q́<\/Xaվ xV_.+q~Fl?訸I | /zin-o,"r _aPM}O^ڂ٘ChJ'͸l_89ێ:ǿO_4_Pk+x#hd# 2<A#ܺǏ^呼3n%8ىUx{fzWߴ-??{^B.um4M-o/aPrT {qԀ|?ռJxΗWѮ$.vz7s[Ķew/cNR$5ԑ۳+) Ҽw|IjKNJV>2' m7܍s0~caIE]2v%!.||uُ j7ki"UI @u3tBA,v-R2:*G5e[LV[hgg%Vfoq\?O_ch #V bS-䱽7 ;8e9ۿj??|uMdžeg%{HYRX|Mjf |t3xbT-z1QTHnFAu<_ƸaOkYc-#eafu-@_>6ڏ z\Ҕ$ qº?/%ٺcI6XE\3R?s_c\Y3{/i2ݔ'c*=ٰ܊?۫z==g6f;ju8fHmsԦ(._oλHSnӟq_~#[|[W X<"9X2+^G_|Q'Ju :c07,+|-nLj*'ȐGֿ'ko %y.'}M,kmfdYboe _5?Ijp-ΝGZ\7YMw߱O]?\k6 r Q}+>#xMe]wZI.}Ei =WK_~WkӲjs=µ@K h}K>0x}4u'-N1(xOY>&/o9/^+5cQ;na_b"(D[kPG(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((hksGcbLw Ўƿ35?0ծmΐVV]*myk=t*/Ww~˟mΤ+EBH{򯨫(+j ( (>mW1+ c)x`ZP[ѻwtG,jʼ//7՞ݦxD֮ X_y$`)'εkʾ~>O)5"Uݭ^&ebpTwU =ڳr/\|RiR,ᝏHŸot}'NEkkkQ@ ?y~{ ʪ|u1X 9diIJY?E~fjc&RVj׽6gxTuZBd#f9 e r>2|1뺼֭,F4[Y6`E}KY `&i7-"[_Ik+D@pIRA .3r]gʭeoW,IjyWGjz_Yatƶ+k/ڷW>2MrQ4Z\~#AtUep>5|)A|ӯk똯%H# cWq]Y{Rg])7;=;]|acOMZRVv<{iޏ(.,wFXu A wĺOWԭtu.X[E%Ԃ5y,'(]9K;K%]yUL{X>i=Iu 1N.#ºVPy@J[G"gQ,By`.!>Wi/D_QxQI2U=7Z|Qžs5%=U&ٸ qN:^55g w_M: { c~ |E4vŤs\9F¡@`z?L9?wW~u#6sXj~(Wi 7,,F7QN8 |Wg/ x:njIjD-e#xO<)M17:/+r%̪0n$:zw:7EUǂ4,Aoh 7+|<?ęYNBBc"&I0o$8Љ P? z?^Y}Ʀ,K7@$濴7ǐxNGԵIb{bQeG~g+h~9'o[D=\·69!y? }ϭ~W~>" M\,"}D^Xwtoh 17^˥,sJY,)񯌿kO񷍮>+g7V;I[B)rX ߠO џ?ǠxW u{.z#` _@??#:51X:M"=:7 >3OEsf z.bVԮfզGVU@=AͿM7qhGnooty dzm +x-O4(ΞH2ȉVf~z0~;~ǾZxghg;) +Xa?> ψ>,IhGr&Ƞ(s(=g}q/<1y}g#Dz<*#¾h(_D=}}k+:[:6΁șܧAUcğ>&xFj7![npq@M4\%{ߎq|־Z\iymv-K ~w`z =|+X/ KƏKעVlX3+>>~7h%O6:l&ҹ;PmiUaI.f8U$(c W/ឣS5,gk덿/ۄ(v=#j+T|Qi&>Iԕan8Ÿ |>Pi#䞀$m ~ 4*^noofȋ%37V%[ nHϱ|3ZI$uH||CdaVVSFT_')3_ofi%Ś,l0=AǮxᎏᶝl Va'bť݌o,<OIG6!c U&.?Һ;#'ď  V27ۜS+bh7/wg=/^YbpϰKiO>[Jsoe+bªdrÃ\dž:igCזziWkiy5y`8`w) =]/!4x{iZ|{-FkIe`G*9ou?7x"_Supn/O!P¨ߒI4ɾTFn@crs+fhᕈukЙ#o'ؕ?ɯz?񗍏4-CZZstn;r'NLJ*9']Nj#'5={]w“Zp `Hʌߵk_|YK:uhvs2MAidkИk_L>O}c_oOR ]Yj!֮>}sܐs]?>)7-5M2V*RHd$n9V<ăH9Xу ) 翈x a5|eye}׆Mg$ibܠ: WcKgWf.//H}-|nN2pNHYn?h 4aouӽb;q} |ahqSK@b'xZH|L-b}jT;.>@DP8k(&/~{{Z+98$+)e>q2P7>ե6ᮐmcqYr),wޕ2=g^8uχ,]׾+Lк-XCc(fjb%+(php3=sIҼs']_ڧ񞮝WCY!'ww6_ЈzOn;n5I ,s1^0 ߚSm"_  <#e ^fj8E~6컞~X^$mOLY4N$>xn2"ϿꟄ0m?WLEF~=ΙD-7UT=,WͳPsk=$k#yJqF cw?υ \]kڮ_g^J13z)-/=lk?״ψ.34ze5%׊&UFǠ>x++vc7Z WiPe| 6U/߳ĚxZz^dwVCfh&/+9.6h&P"0+4񍷏 #^fK"*se$}6?চ%xn#&>3'#>>_Po BE.6n1'A' |3k;_I_ꚄuL 'd@>>(gV%4YFIhy aΌ}_|f^Mo̖Pht d |COK?i7">~oh矂'3KKż/p$qW>8zcަm!#I\7z'>/4 ilPͺa(85~߱i?:jZ]Λ,\'?3p(q_'t=" wmU9eg7W6%pĻcB*8` ?#⎡exv ᑮ|QD17rGCV߳?=?^m[_2^V YG^R@h?|=UmkMJ7[Yf٨dD;TDpsID~˾-4;jłh4"h,d c~%~'xo=gGmRR9,58!ܜXqB}gPK{]^wCrx_#ê~? Z=|EּQun 7V ;۫a( |L½=Wź힃(9n$*p t֗$vW^:4ZZy dzzaA0f]Ηڕ>rnm±k+pA y/_ÿGt4Vd1. 1 pAE [Zqnlt$u*>V_eĨ/MZ-a'o/s]'bݬ kǞ,jCqm$Q,.Iַ?c? C+O]ĿֳِxM #<4S&b ӧEmeV* ApPL21$WM1H0# >&|;~,xWej3V Gj'I/|pa6EkqsɉQ<1 |@Im-k['.H#8 D~C$BʨO(3_xpiױlgi*3#%rSh:JPuH""ewAuqw|?AgCX`+19q|5c?ğK RT PAg @"*&?=kY?fh=m=WD7@wdcھQ֣%uWl+3EavmC#BEP#շq]?핮A(NgiobH"fǠ4%{}[ma]Só[CJu9#i1{J>#O궸6ͪȦ9cU9県_U0\Xӿ'+Iݵmv|5e8WW?$~~mehW:.GNF#zOrkmM nI$1,A=IJ|k/4=b mU ƶr*F rC*c +XԨ_mj qyRW{[FEĴE pUFlYX؀O~~ ?=jƚ/&gx .-- wNJ u-CCQo4 IS' ?^1, S0YɨU{j*ZC8:ӧoz}[N'.E5yS$k<+u/\%oyJJ6'/a*uYDzI+Iϊu^-Gwai\U6KxŬd׵m"HZ vksJhXt_OLϧnIa}gGB9e\4IK** >Mtx)?+zT7I$ @s ;Ocjow4? [K SYA]~Rճ^OMWm|Kxo25eU `z5xWPh+|51'j=1ҽg,-8ϚgfM `'Q֛OdžtsL̳Hꧣ#}p |:ѥ1۲,![7HIz{.Ni|qaxĶ6v͵U2q[Uo{=XWPxK3c2Xq{W Vj&N憐~޴#Nm~u;ٳׂuyݼ%H%?,l6?VW?e>  mgUn\Oūئ5e`8r6a-`<` _ky{ έHo `+kTOuc18(|Hw]薯BQc$Ko_V|G+E('>,FU-4Rv~P2|t."|a_kn졆UTeYOh^ >M4z&ugˆTd}k~ _<YJieNpRSHA[4hVgD\Z x卆 =Az?rg Fַ1\[XY3}Mxy-O۫/0ZK}/ n+ 0U|,};gcw=KQִ s:~-v7dN'$Uώh'NdW[; 3 GNvSӊ#-)7k̍y1- v$aRub]:Ii˖p,·a<3_ 5Nei.%cc 5~ξo ՞Lglpy<sx='Ɵq+6-0G>2FANsh>&kun!25݇tJ M"i;6oufg_=lXz~ xt:Vcoin0$I'$I$_~Ⱦ7ׇsVug΍N1NM[K'_-E.=eFZ]-z]w2m,֮Y|@o<_>A,zMVlÌBI# |;M[5SʰH)(VFy-Oō֟ <;.քn@VPb#I?0U>⦳;}ײdG&BU>bͽz~| hZG_G6zafvVܖ,r]j>+~<[xjnk+( EmwmF?)ffI$@>'\gCOu/?0ռ8' 18vԚؠeH_wp#sσ6k[u`|m;xF]kW"p)jRe _|Yjڕis H\:P_K_\|/g`VKg'!Dw<#稯ko_߀"xa^>\Լ7t-̲28cJ$NI5cŸ;iz߈,FV,hH#D7#xGkA ?A_|Wpt Y_|Z`ӬаP,s1F''pלA o/nO3?|vO{Tٷ¿)?ĝUGoC=~|^.YԎ7@s>4xPemo.,ir졺)5|hM6YK/[A\} H$k:Xlv8D-#w$WƟJ?^i|iIhu}Bkva0[a7LW>}+u ; :h%x+%on-$!%*Tj6r =no M{h1&7]kTIotVPZ+ZQs.9ֿcCkx~ k#$:2y'sŚAI陸 r_W|)au:V}Ӿ!x:>mFJA<呕סxs;5eCgGof^n$^fCៅ^j)HFWW7Qd?qn+g8Uq>4~:|B񎽬xSH6!8v?7Z? a-}}kvd2ɷ=3CW¿ޗ WG=vt īDO&q6Ms}G[}a!K DEL9zuɴCS{zKo|C} +sdk_̞;cP}& Km_ROj~ۡk{niu"a.ՈQ*߱Ɠ{L"̳5K$o4Q=30AWJPT`(PҟnXԿJ%\pת@_Bkڧ/CjrM^l!!Z)18OZ>~o0Ḙ9ɢƴ#$۵{// !}o5db̨\"ƧnuϠ*%|',|///u !.`bтp d[IE6~W!3Oq@EB?iۗ>O۴ *IO̐Q-'X||3¿ 4OZ#MdGRp t> XOMhe`ԆkC88mBŚh׺:uK|e[qYhpr46XxI5 :5A$r 8 zOٷjI<|餙caت5E X4{dVZQ &H}-M]~A < />>Yد-n Դaiy~I0F223\6(k. Kj,d`"zݯE3RI{HՓ5;}ēٯ5^ 4j^'lO~isNnF;?t횋 |Z[٤f/5Ą^G<pW|@|%RTԠ}:MĶDM0v@ gOxԼyO[a;)#^þ*f]WZ.Hx.[Ğ1L`.5[?q r(={¿ ~*xF\'y伂h3,syj+ 7,zk3|JkZN}O]mn!YH\B(7û;/'uψ2&,l!?uuctDќ(疕# >tnaҷ~>񮵩k~>x0(K[āB;d K'k:ܔ:GnI萴㐤Gz2о9¾"{ȴ馎6QrU_Pk̭eo+|xhI``Ǹq@;ؑcC?j,0mښv!f^KgaO [HV-Eu˟_N dv j CowK|7/4:\@dR`W! ?Z$~_xudh{ #RrB €>g;KhM%zo_º^GuQA{}ug5͈F0m;q=xWZ4mu`څь`kBh$ ?_o|d[k#qyԓb!?%;p ^Sᆉ:dWQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@xgIcM?ukcÚM&Oh'K)ϻp2Hk(⳷"H BGjQ@IEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW~_ 4VҼ;k4li6QZ72ƠOnQ@Q@Q@Q@Q@Q@Q@o >~6:ީ0Q-M& б Gῄx_/pt>_;nvnzn>@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sß k,|OhvzbH[q1l(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((boot.php000066400000000000000000000012211516072260400125310ustar00rootroot00000000000000mount('', new GitList\Controller\MainController()); $app->mount('', new GitList\Controller\BlobController()); $app->mount('', new GitList\Controller\CommitController()); $app->mount('', new GitList\Controller\TreeController()); $app->mount('', new GitList\Controller\NetworkController()); $app->mount('', new GitList\Controller\TreeGraphController()); $app->mount('', new GitList\Controller\GitController()); return $app; change-break.md000066400000000000000000000061721516072260400137200ustar00rootroot00000000000000[//]: #@corifeus-header # 🤖 P3X Gitlist - A decorated enhanced elegant, feature rich and modern private git ui repository viewer [//]: #@corifeus-header:end # Change breaking ### First Before, everything was in the `root` of the web server. Which is not secure. For now, you can create a folder eg. `/var/www/gitlist.me.com/` and make sure, that you server does not point to `/var/www/gitlist.me.com/`, but instead, point to `/var/www/gitlist.me.com/public`. ### Second The `config.ini` file with `url_subdir` or later `clone_subdir` variable has been changed to the `ssh_clone_subdir` variable. ### Third 😀 I removed `Babel`, we started to upgrade in 2018 on this repo. If you want use an older `Browser` (like iPhone 5), you can probably install latest `Chrome` and it will work. Besides, without `Babel` the `JavaScript` is much faster. (At work, without `Babel`, smaller `JS` bundle files and works about `20x` faster.) ### Fourth I have disabled loading everything in `twig`, besides the `diffs` are loading via `AJAX` and `web workers`, I made it to work huge commits with `64MB` `PHP`. See in action: https://gitlist.patrikx3.com/gitlist.git/commit/f1e4d5b938c8f1a6cd178aeea2e9e86111ea5323#93 ### Fifth If you upload a bigger binary file, it is important, that your web server allows to upload bigger files, because I found an error with `NGINX` as: ```text Request Entity Too Large ``` I resolved in the `NGINX` web server configuration file `nginx.conf` as: `client_max_body_size 64M;` Reference: http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size So, this is only for testing. You should limit for some max size, that you want it at maximum, really. ## The last version with Babel https://github.com/patrikx3/gitlist/releases/tag/2.0.4-579 The following versions are not using `Babel`!!!! Yikes! [//]: #@corifeus-footer --- 🙏 This is an open-source project. Star this repository, if you like it, or even donate to maintain the servers and the development. Thank you so much! Possible, this server, rarely, is down, please, hang on for 15-30 minutes and the server will be back up. All my domains ([patrikx3.com](https://patrikx3.com) and [corifeus.com](https://corifeus.com)) could have minor errors, since I am developing in my free time. However, it is usually stable. **Note about versioning:** Versions are cut in Major.Minor.Patch schema. Major is always the current year. Minor is either 4 (January - June) or 10 (July - December). Patch is incremental by every build. If there is a breaking change, it should be noted in the readme. --- [**P3X-GITLIST**](https://corifeus.com/gitlist) Build v2024.4.105 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [//]: #@corifeus-footer:end change-log.md000066400000000000000000000361671516072260400134240ustar00rootroot00000000000000[//]: #@corifeus-header # 🤖 P3X Gitlist - A decorated enhanced elegant, feature rich and modern private git ui repository viewer [//]: #@corifeus-header:end ### v2024.4.105 Released on 02/23/2024 * FEATURE: For the editor is works with Proto Buffer (.proto file extension). ### v2023.10.119 Released on 07/23/2023 * FIX: Changlog bug fix ### v2023.10.102 Released on 07/08/2023 * FIX: `Hangup - error: option name-only is incompatible with --long -` error * CHORE: Upgrade all deps ### v2022.4.106 Released on 02/05/2022 * CHORE: Upgrade all deps ### v2021.10.211 Released on 11/18/2021 * FEATURE: Works on PHP 8.1 ### v2021.10.198 Released on 11/05/2021 * ISSUE: https://github.com/patrikx3/gitlist/issues/37 ### v2021.10.197 Released on 11/05/2021 * ISSUE: https://github.com/patrikx3/gitlist/issues/36 ### v2021.10.195 Released on 11/04/2021 * PULL: https://github.com/patrikx3/gitlist/pull/35 ### v2021.10.194 Released on 11/03/2021 * FEATURE: On the markdown code is giving a copy function (on hover). ## v2021.10.191 Released on 10/29/2021 * BUGFIX: Remove composer platform check to work on PHP 7 and PHP 8 at once. ## v2021.10.189 Released on 10/27/2021 * FEATURE: The tag list menu is ordered by natural compare sorting. ## v2021.10.183 Released on 10/27/2021 * CHORE: Update deps and NodeJs. ## v2021.10.161 Released on 9/18/2021 * BUGFIX: There was not showing the binary files and pictures, since the total Packagist upgrade. Now it is working. ## v2021.10.152 * FEATURE: Move from Silex's Packagist composer and keep the code in the source as it has been upgraded with latest Symfony packages. ## v202.10.146 * FEATURE: Works on PHP 8. ## v2021.10.143 * FEATURE: Add option to remove .git extension from repo names * BASED ON: https://github.com/klaussilveira/gitlist/commit/434521a4e762e72a9d69d8756ee2d1279134c8af ## v2021.4.102 * CHORE: Update deps. ## v2020.10.189 * FEATURE: Add NGINX config to `highlight.js`. ## v2020.10.187 * BUGFIX: Fix a layout problem in the log. ## v2020.10.185 * BUILD: Further bundle size optimization (~800kB minus) ## v2020.10.182 * BUILD: Splitted vendor modules packages with Webpack using `import` with pre-fetch. ## v2020.10.170 * BUILD: Kept older versions in the release. ## v2020.10.138 * BUGFIX: List searcher pager elements were hidden after the search clear button click. ## v2020.10.136 * BUGFIX: List searcher pager elements were hidden after the search clear button click. ## v2020.10.104 * CHORE: Upgrade Webpack web worker loader. ## v2020.10.102 * BUGFIX: Missing TypeScript Codemirror mode. * BGUFIX: The active line was not highlighting the line number. ## v2020.4.218 * BUGFIX: Since using Fontawesome fonts instead of svg, had to do some fix-up. ## v2020.4.210 * BUGFIX: Fontawesome was using SVG, replaced with fonts as it was giving 1.5MB bundle bigger (using SVG) ## v2020.4.188 * FEATURE: Enable generate a link when clicking on the line number/gutter and scroll to the given line. ## v2020.4.185 * FEATURE: enable/disable editing via `config.ini` under the `[app]` `enable_editing` variable * BUG: DELETE button is missing in the viewer, only after editing was showing ## v2020.4.146 * FEATURE: the browser tags are in reverse order, just like GitHub ## v2020.4.144 * BUGFIX: On the sort by last commit, was not working perfectly. ## v2020.4.126 * FEATURE: Latest (Git 2.25), the log changed. ## v2020.4.125 * FEATURE: Latest (Git 2.25), the log changed. ## v2020.4.123 * FEATURE: Stronger TerserJs compression. ## v2020.4.117 * FEATURE: Enable dark/light mode for tree graph. ## v2020.4.116 * BUGFIX: Log graph was throwing an error. ## v2020.4.114 * BUGFIX: Log graph was throwing an error. ## v2020.4.111 * BUGFIX: The release zip folder was bad. ## v2020.4.107 * BUGFIX: Network graph loading popup was not working right. ## v2020.4.105 * CHORE: Updated NPM versions. * BUGFIX: Network graph was not working (drag / scroll). ## v2020.4.103 * CHORE: Updated NPM versions. ## v2019.10.154 * CHORE: Updated composer versions. * FEATURE: Enable ico file types. ## v2019.10.146 * BUGFIX: Was not working on the tree list paths with in space. ## v2019.10.114 * BUGFIX: SVG was showing "Display SVG" instead of "Toggle SVG". * CHORE: Synched with klaussilveira on July 11, 2019 * FEATURE: The commits in the tree table messages are using Twemoji and Markdown. * FEATURE: The tree table in sub-folder not only the "..", but the whole cell is going to upper folder using a pointer cursor. ## v2019.10.111 * FEATURE: The tree table looks like GitHub. * FEATURE: The file/blob size is proper size, instead of rounded kilobytes. ## v2019.10.109 * FEATURE: Show last commited ago on the tree table by tag or branch with ellipsis * FEATURE: Replaced mode column on the tree table with the last commit message with ellipsis ## v2019.4.128 * FEATURE: Added SASS/SCSS to CodeMirror ## v2019.4.124 * BUGFIX: Since Twemoji `svg` was using an older version. ## v2019.4.121 * BUGFIX: Since Twemoji `12.0.4`, the `svg` folder is missing * https://github.com/twitter/twemoji/issues/358 ## v2019.4.119 * FEATURE: Enhanced navigation. ## v2019.4.116 * BUGFIX: UTF-8 encoding disabled, it should be on a GIT level. * FEATURE: Enhanced navigation. ## v2019.4.113 * BUGFIX: UTF-8 encoding fix. Detect encoding. ## v2019.4.108 * BUGFIX: Enhanced navigation on the left side bread-crumbs. ## v2019.4.107 * BUGFIX: Enhanced navigation on the left side bread-crumbs. ## v2019.4.106 * BUGFIX: Enhanced navigation on the left side bread-crumbs. ## v2019.4.104 * BUGFIX: Enhanced navigation on the left side bread-crumbs. ## v2019.4.102 * BUGFIX: Latin ( ISO-8859-1) CSV files tries to convert to UTF-8. ## v2019.4.22 * FEATURE: if the blob view is a commit (instead of branch), the delete and edit buttons are hidden * FEATURE: default code editor default is increased from 300px to 600px ## v2019.4.19 * BUGFIX: on the commit file list with a view/edit button, it was not showing the commit view, but instead, using the main branch ### v2019.4.16 * FEATURE: the blame view was totally wrong * CHROE: upgraded Bootstrap to v3.4.1 ### v2019.4.8 * SYNC: Synchronized to original Gitlist and Gitter * BUGFIX: Regex fix ### v2019.02.09 * FEATURE: On the modal and form buttons order were not correct, the cancel button should be the last. ## v2019.01.27 * BUGFIX: fix C like (C++, Objective-C, C) CodeMirror editor ## v2019.01.23 * BUGFIX: the repo list automatic search (when loading the page and is loading the search) was not properly working ## v2019.01.19 * BUGFIX: the markdown images were pointing to the wrong URL ## v2019.01.18 * FEATURE: the codemirror full height option has an alert, that is only shown on every week, not every time ## v2019.01.15 * FIX: the index page search was not working 100% exactly ## v2019.01.12 * FEATURE: on the index page pager, when there is just one page, the button is hidden * FIX: repo_paging variables default was 5 instead of 10 * FIX: the index listing page is pure JavaScript, so for an intelligent bot will not see how to page, so it is a bot, the pager is disabled ## v2019.01.10 * added, on the repos list, sorting by name and last commit date - ascending/descending * added paging, there is a new `config.ini` variable in the `app` section named `repo_paging` * if `repo_paging = 0`, pagination is disabled * otherwise the specified `repo_paging` / page is set, the default is 10 * fixed some variables, when they were not initialized * the logo was too big, now it is proper ## v2019.01.01 * added a variable: app.fixed_navbar in config.ini * you can set the navbar as fixed or not * added an alert when on the editor to let the users some people are not liking the full height editor mode and switch to the scroll mode * added a new ssh variable so that the ssh clone button can be dynamic like the http_user_dynamic called ssh_user_dynamic * renamed the git_clone_subdir to ssh_clone_subdir, it makes more sense * in the git clone ssh button was missing the protocol (ssh://) * the RSS content type application/rss+xml is obsolete so I changed the content type to application/xml * the http_user and the ssh_user is url encoded ## v2018.12.31 * config.ini changes * clone.git_http_subdir_calculated * true = it calculates to actual route/nested path by itself for the http clone button * git_http_subdir * if git_http_subdir_calculated is false, then the git_http_subdir variable uses as the path ## v2018.12.24 * Added Python as markdown and CodeMirror ## v2018.12.22 * Added a top to bottom button ## v2018.12.21 * The ZIP and TAR button moved to the Download button as a dropdown * Added a GIT button, the first action is * Fetch origin ## v2018.12.14 * The main icon was ugly, now, is centered perfectly and has a little shadow ## v2018.12.13 * The icons of the main tabs animations were not centered (cosmetic fix) * There was a routing problem, some pages were not working * Added tooltips to the log, which is not shown - too long text ... ## v2018.9.20-0 * Sort the repo list by last updated ## v2.12 * Treegraph is using markdown ## v2.11 * Markdown images ware not working 100% * File extension types were not working with like eg. JPG, Jpg, jPg, now it works * On the index page it shows the last commit and username by elapsed time ## v2.10 * Upload binary and/or existing files * Able to delete binary files * Added some animation to the Fontawesome 5 icons * Add new text files or add directory * Sometimes, the delete file, it was not showing the last, but the previous last commit * Markdown, twemoji on commits * Fix long commits * Display SVG files, while you can edit it as well * The network dots were small, now big ones with 10 radius, 20px; * Delete files * grunt-contrib-less - 2 is missing the `@path` variable * add change log display * The right GitHub menu is now a popup menu instead of a link to GitHub. ## v2.9 * The tree search and the blames are using the shared code (with option to use with Code mirror) * Diffs are rendering with web workers. * Minor typo on the next/older commit page * Synched to klaussilveira/gitlist * Added twemoji to the commits list * Memory limit * Updated NPM and composer * The Gitter is merged into Gitlist to code easier * The pager was not working with the browser back function * The commit message is using markdown ## v2.6.0 * network and graph works with Bootstrap 3 totally ## v2.5.0 * you can edit files now ## v2.0.12-585 * removed `Babel` 😀 ## v2.0.4-579 * Automated build with webpack and grunt ## v1.1.18-573 * for big commits and changing the theme, it calculated the time it was loading the full commit list and it is about the same time when you change the theme, it added an overlay and this text eg. `9 seconds to switch the theme` * automatic versions generated with grunt ## v1.1.14 * added overlay when loading big commits ## v1.1.12 * allow CodeMirror show toggle height 300px vs all ## v1.1.11 * Make to use the tag/branch button like GitHub ## v1.1.10 * total dark/light mode (CodeMirror, diff, Markdown) ## v1.1.9 * markdown dark mode * we automatically load the next commit, when we are on the bottom of the page * minor toast fix ## v1.1.8 The `config.ini` file with `url_subdir` or later `clone_subdir` variable has been changed to the `ssh_clone_subdir` variable. ## v1.1.7 The following `CodeMirror` syntax highlighting has been added: ```js require('codemirror/mode/cmake/cmake'); require('codemirror/mode/css/css'); require('codemirror/mode/dockerfile/dockerfile'); require('codemirror/mode/go/go'); require('codemirror/mode/handlebars/handlebars'); require('codemirror/mode/htmlmixed/htmlmixed'); require('codemirror/mode/javascript/javascript'); require('codemirror/mode/jsx/jsx'); require('codemirror/mode/perl/perl'); require('codemirror/mode/php/php'); require('codemirror/mode/powershell/powershell'); require('codemirror/mode/python/python'); require('codemirror/mode/ruby/ruby'); require('codemirror/mode/sass/sass'); require('codemirror/mode/shell/shell'); require('codemirror/mode/sql/sql'); require('codemirror/mode/swift/swift'); require('codemirror/mode/twig/twig'); require('codemirror/mode/vue/vue'); require('codemirror/mode/xml/xml'); require('codemirror/mode/xquery/xquery'); require('codemirror/mode/yaml/yaml'); ``` ## v1.1.6 * All `PHP` files will be in the `root` and only `index.php`, `images`, `icons`, `svg`, `css`, `js` bundle files will be in the `public` subdir. ## v1.1.5 * Removed old `clone` button modal popup, using `Bootstrap` only * Double checked, all is using pure `Boostrap` * Added `toast` and save the `url` to the clipboard when you click on the `clone` button * Added `UglifyJs` and minimize the `css`. ## v1.1.3 * Moved to `webpack` * Using `Babel` ## v1.1.2 * Added twemoji's ## v1.1.1 * Format size was missing space (ugly) * Graph time was not using the ```config.ini``` * Fixed images to not show a html block span text and use now real image alt and title attributes in html * Graph was not using Bootstrap * Network wast not using Bootstrap ## v1.0.3 * Total bytes was not working with Twig 2 ## v1.0.2 * Add support for .gitmodules files at repository root * Updated to latest dependencies ## v1.0.1 * The minimum PHP version is 7.1 and PHPUNIT 7. ## v1.0.0 * Works with ```PHP 7.2``` ## v0.5.6 * The Markdown image links were not working. * Missed out the ```package.json``` from the previous release. ## v0.5.5 * Fixed PHPUNIT 6 ## v0.5.4 * Different submodule links for Gitlist and Github ## v0.5.3 * The markdown links are working right * Shows submodules ## v0.5.2 * Added all Bootsswatch themes (https://bootswatch.com/) * Removed default theme, kept only Bootstrap (though like over 10 themes now) * Removed PHP 5 support, only >= 7 * Upgraded Silex v1 to v2 * Upgraded Twig v1 to v2 * Upgraded Symfony/twig-bridge v2 to v3 * Upgraded Symfony/filesystem v2 to v3 * Upgraded Phpunit v4 to v6 * Moved from Showdown to Marked (more features) * For building requires (not required for the server): * NodeJs >= 8.9.0 * Bower * Grunt [//]: #@corifeus-footer --- 🙏 This is an open-source project. Star this repository, if you like it, or even donate to maintain the servers and the development. Thank you so much! Possible, this server, rarely, is down, please, hang on for 15-30 minutes and the server will be back up. All my domains ([patrikx3.com](https://patrikx3.com) and [corifeus.com](https://corifeus.com)) could have minor errors, since I am developing in my free time. However, it is usually stable. **Note about versioning:** Versions are cut in Major.Minor.Patch schema. Major is always the current year. Minor is either 4 (January - June) or 10 (July - December). Patch is incremental by every build. If there is a breaking change, it should be noted in the readme. --- [**P3X-GITLIST**](https://corifeus.com/gitlist) Build v2024.4.105 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [//]: #@corifeus-footer:end composer.json000066400000000000000000000023311516072260400136020ustar00rootroot00000000000000{ "name": "patrikx3/gitlist", "config": { "platform-check": false }, "description": "An elegant git repository viewer", "info": { "spatie/temporary-directory": "v2.0 only works on PHP 8 so deffered" }, "minimum-stability": "stable", "autoload": { "psr-4": { "GitList\\": "src/GitList", "Gitter\\": "src/Gitter", "Silex\\": "src/Silex/src/Silex" } }, "require": { "php": ">=7.1.0", "pimple/pimple": ">=3.4.0", "symfony/event-dispatcher": ">=5.3.7", "symfony/http-foundation": ">=5.3.7", "symfony/http-kernel": ">=5.3.7", "symfony/routing": ">=5.3.7", "symfony/filesystem": ">=5.3.4", "symfony/twig-bridge": ">=5.3.7", "twig/twig": ">=3.3.2", "danielstjules/stringy": ">=3.1.0", "symfony/mime": ">=5.3", "symfony/process": ">=5.3", "spatie/temporary-directory": "^1.3.0" }, "require-dev": { "symfony/filesystem": ">=4", "mockery/mockery": ">=1", "symfony/browser-kit": ">=4", "phpunit/phpunit": ">=7", "symfony/css-selector": ">=4", "phpspec/prophecy-phpunit": ">=2" } } composer.lock000066400000000000000000005044631516072260400135760ustar00rootroot00000000000000{ "_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "76bfd79762f0da1ed634740cb98ee4ac", "packages": [ { "name": "danielstjules/stringy", "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/danielstjules/Stringy.git", "reference": "df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/danielstjules/Stringy/zipball/df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e", "reference": "df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e", "shasum": "" }, "require": { "php": ">=5.4.0", "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { "phpunit/phpunit": "~4.0" }, "type": "library", "autoload": { "files": [ "src/Create.php" ], "psr-4": { "Stringy\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Daniel St. Jules", "email": "danielst.jules@gmail.com", "homepage": "http://www.danielstjules.com" } ], "description": "A string manipulation library with multibyte support", "homepage": "https://github.com/danielstjules/Stringy", "keywords": [ "UTF", "helpers", "manipulation", "methods", "multibyte", "string", "utf-8", "utility", "utils" ], "support": { "issues": "https://github.com/danielstjules/Stringy/issues", "source": "https://github.com/danielstjules/Stringy" }, "time": "2017-06-12T01:10:27+00:00" }, { "name": "pimple/pimple", "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/silexphp/Pimple.git", "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1 || ^2.0" }, "require-dev": { "symfony/phpunit-bridge": "^5.4@dev" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.4.x-dev" } }, "autoload": { "psr-0": { "Pimple": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" } ], "description": "Pimple, a simple Dependency Injection Container", "homepage": "https://pimple.symfony.com", "keywords": [ "container", "dependency injection" ], "support": { "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" }, "time": "2021-10-28T11:13:42+00:00" }, { "name": "psr/container", "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", "homepage": "https://github.com/php-fig/container", "keywords": [ "PSR-11", "container", "container-interface", "container-interop", "psr" ], "support": { "issues": "https://github.com/php-fig/container/issues", "source": "https://github.com/php-fig/container/tree/2.0.2" }, "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/event-dispatcher", "version": "1.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/event-dispatcher.git", "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", "shasum": "" }, "require": { "php": ">=7.2.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } }, "autoload": { "psr-4": { "Psr\\EventDispatcher\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "http://www.php-fig.org/" } ], "description": "Standard interfaces for event handling.", "keywords": [ "events", "psr", "psr-14" ], "support": { "issues": "https://github.com/php-fig/event-dispatcher/issues", "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" }, "time": "2019-01-08T18:20:26+00:00" }, { "name": "psr/log", "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "PHP-FIG", "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", "homepage": "https://github.com/php-fig/log", "keywords": [ "log", "psr", "psr-3" ], "support": { "source": "https://github.com/php-fig/log/tree/3.0.0" }, "time": "2021-07-14T16:46:02+00:00" }, { "name": "spatie/temporary-directory", "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/spatie/temporary-directory.git", "reference": "f517729b3793bca58f847c5fd383ec16f03ffec6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/f517729b3793bca58f847c5fd383ec16f03ffec6", "reference": "f517729b3793bca58f847c5fd383ec16f03ffec6", "shasum": "" }, "require": { "php": "^7.2|^8.0" }, "require-dev": { "phpunit/phpunit": "^8.0|^9.0" }, "type": "library", "autoload": { "psr-4": { "Spatie\\TemporaryDirectory\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Alex Vanderbist", "email": "alex@spatie.be", "homepage": "https://spatie.be", "role": "Developer" } ], "description": "Easily create, use and destroy temporary directories", "homepage": "https://github.com/spatie/temporary-directory", "keywords": [ "php", "spatie", "temporary-directory" ], "support": { "issues": "https://github.com/spatie/temporary-directory/issues", "source": "https://github.com/spatie/temporary-directory/tree/1.3.0" }, "time": "2020-11-09T15:54:21+00:00" }, { "name": "symfony/deprecation-contracts", "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", "url": "https://github.com/symfony/contracts" } }, "autoload": { "files": [ "function.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/error-handler", "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", "reference": "99d2d814a6351461af350ead4d963bd67451236f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/error-handler/zipball/99d2d814a6351461af350ead4d963bd67451236f", "reference": "99d2d814a6351461af350ead4d963bd67451236f", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", "symfony/var-dumper": "^5.4|^6.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5" }, "require-dev": { "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^5.4|^6.0", "symfony/serializer": "^5.4|^6.0" }, "bin": [ "Resources/bin/patch-type-declarations" ], "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\ErrorHandler\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/error-handler/tree/v6.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-05-10T12:03:13+00:00" }, { "name": "symfony/event-dispatcher", "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", "shasum": "" }, "require": { "php": ">=8.1", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { "symfony/dependency-injection": "<5.4", "symfony/service-contracts": "<2.5" }, "provide": { "psr/event-dispatcher-implementation": "1.0", "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", "symfony/config": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/error-handler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", "symfony/service-contracts": "^2.5|^3", "symfony/stopwatch": "^5.4|^6.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/event-dispatcher/tree/v6.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-04-21T14:41:17+00:00" }, { "name": "symfony/event-dispatcher-contracts", "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", "shasum": "" }, "require": { "php": ">=8.1", "psr/event-dispatcher": "^1" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", "url": "https://github.com/symfony/contracts" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\EventDispatcher\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Generic abstractions related to dispatching event", "homepage": "https://symfony.com", "keywords": [ "abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards" ], "support": { "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/filesystem", "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/filesystem/tree/v6.3.1" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-06-01T08:30:39+00:00" }, { "name": "symfony/http-foundation", "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", "reference": "e0ad0d153e1c20069250986cd9e9dd1ccebb0d66" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e0ad0d153e1c20069250986cd9e9dd1ccebb0d66", "reference": "e0ad0d153e1c20069250986cd9e9dd1ccebb0d66", "shasum": "" }, "require": { "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php83": "^1.27" }, "conflict": { "symfony/cache": "<6.2" }, "require-dev": { "doctrine/dbal": "^2.13.1|^3.0", "predis/predis": "^1.1|^2.0", "symfony/cache": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", "symfony/mime": "^5.4|^6.0", "symfony/rate-limiter": "^5.2|^6.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/http-foundation/tree/v6.3.1" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-06-24T11:51:27+00:00" }, { "name": "symfony/http-kernel", "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", "reference": "161e16fd2e35fb4881a43bc8b383dfd5be4ac374" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/http-kernel/zipball/161e16fd2e35fb4881a43bc8b383dfd5be4ac374", "reference": "161e16fd2e35fb4881a43bc8b383dfd5be4ac374", "shasum": "" }, "require": { "php": ">=8.1", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.3", "symfony/event-dispatcher": "^5.4|^6.0", "symfony/http-foundation": "^6.2.7", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/browser-kit": "<5.4", "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", "symfony/dependency-injection": "<6.3", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", "symfony/http-client-contracts": "<2.5", "symfony/mailer": "<5.4", "symfony/messenger": "<5.4", "symfony/translation": "<5.4", "symfony/translation-contracts": "<2.5", "symfony/twig-bridge": "<5.4", "symfony/validator": "<5.4", "symfony/var-dumper": "<6.3", "twig/twig": "<2.13" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^5.4|^6.0", "symfony/clock": "^6.2", "symfony/config": "^6.1", "symfony/console": "^5.4|^6.0", "symfony/css-selector": "^5.4|^6.0", "symfony/dependency-injection": "^6.3", "symfony/dom-crawler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/http-client-contracts": "^2.5|^3", "symfony/process": "^5.4|^6.0", "symfony/property-access": "^5.4.5|^6.0.5", "symfony/routing": "^5.4|^6.0", "symfony/serializer": "^6.3", "symfony/stopwatch": "^5.4|^6.0", "symfony/translation": "^5.4|^6.0", "symfony/translation-contracts": "^2.5|^3", "symfony/uid": "^5.4|^6.0", "symfony/validator": "^6.3", "symfony/var-exporter": "^6.2", "twig/twig": "^2.13|^3.0.4" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\HttpKernel\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/http-kernel/tree/v6.3.1" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-06-26T06:07:32+00:00" }, { "name": "symfony/mime", "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/mime/zipball/7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", "shasum": "" }, "require": { "php": ">=8.1", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", "symfony/serializer": "<6.2" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/property-access": "^5.4|^6.0", "symfony/property-info": "^5.4|^6.0", "symfony/serializer": "^6.2" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Mime\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Allows manipulating MIME messages", "homepage": "https://symfony.com", "keywords": [ "mime", "mime-type" ], "support": { "source": "https://github.com/symfony/mime/tree/v6.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-04-28T15:57:00+00:00" }, { "name": "symfony/polyfill-ctype", "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", "shasum": "" }, "require": { "php": ">=7.1" }, "provide": { "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "ctype", "polyfill", "portable" ], "support": { "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-idn", "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", "reference": "639084e360537a19f9ee352433b84ce831f3d2da" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", "reference": "639084e360537a19f9ee352433b84ce831f3d2da", "shasum": "" }, "require": { "php": ">=7.1", "symfony/polyfill-intl-normalizer": "^1.10", "symfony/polyfill-php72": "^1.10" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Laurent Bassin", "email": "laurent@bassin.info" }, { "name": "Trevor Rowbotham", "email": "trevor.rowbotham@pm.me" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "idn", "intl", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", "shasum": "" }, "require": { "php": ">=7.1" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, "classmap": [ "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "intl", "normalizer", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-mbstring", "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", "shasum": "" }, "require": { "php": ">=7.1" }, "provide": { "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", "mbstring", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php72", "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", "shasum": "" }, "require": { "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php72\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php80", "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", "shasum": "" }, "require": { "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Ion Bazan", "email": "ion.bazan@gmail.com" }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/polyfill-php83", "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", "shasum": "" }, "require": { "php": ">=7.1", "symfony/polyfill-php80": "^1.14" }, "type": "library", "extra": { "branch-alias": { "dev-main": "1.27-dev" }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" } }, "autoload": { "files": [ "bootstrap.php" ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", "polyfill", "portable", "shim" ], "support": { "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2022-11-03T14:55:06+00:00" }, { "name": "symfony/process", "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/process/zipball/8741e3ed7fe2e91ec099e02446fb86667a0f1628", "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628", "shasum": "" }, "require": { "php": ">=8.1" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Process\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/process/tree/v6.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-05-19T08:06:44+00:00" }, { "name": "symfony/routing", "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", "reference": "d37ad1779c38b8eb71996d17dc13030dcb7f9cf5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/routing/zipball/d37ad1779c38b8eb71996d17dc13030dcb7f9cf5", "reference": "d37ad1779c38b8eb71996d17dc13030dcb7f9cf5", "shasum": "" }, "require": { "php": ">=8.1" }, "conflict": { "doctrine/annotations": "<1.12", "symfony/config": "<6.2", "symfony/dependency-injection": "<5.4", "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", "symfony/config": "^6.2", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/http-foundation": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\Routing\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ "router", "routing", "uri", "url" ], "support": { "source": "https://github.com/symfony/routing/tree/v6.3.1" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-06-05T15:30:22+00:00" }, { "name": "symfony/translation-contracts", "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/02c24deb352fb0d79db5486c0c79905a85e37e86", "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", "shasum": "" }, "require": { "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", "url": "https://github.com/symfony/contracts" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Translation\\": "" }, "exclude-from-classmap": [ "/Test/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Generic abstractions related to translation", "homepage": "https://symfony.com", "keywords": [ "abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards" ], "support": { "source": "https://github.com/symfony/translation-contracts/tree/v3.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-05-30T17:17:10+00:00" }, { "name": "symfony/twig-bridge", "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", "reference": "67a33c71062d7d931fe9a8cb7be79cca986a6c09" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/67a33c71062d7d931fe9a8cb7be79cca986a6c09", "reference": "67a33c71062d7d931fe9a8cb7be79cca986a6c09", "shasum": "" }, "require": { "php": ">=8.1", "symfony/translation-contracts": "^2.5|^3", "twig/twig": "^2.13|^3.0.4" }, "conflict": { "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/console": "<5.4", "symfony/form": "<6.3", "symfony/http-foundation": "<5.4", "symfony/http-kernel": "<6.2", "symfony/mime": "<6.2", "symfony/translation": "<5.4", "symfony/workflow": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12|^2", "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/asset": "^5.4|^6.0", "symfony/asset-mapper": "^6.3", "symfony/console": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/form": "^6.3", "symfony/html-sanitizer": "^6.1", "symfony/http-foundation": "^5.4|^6.0", "symfony/http-kernel": "^6.2", "symfony/intl": "^5.4|^6.0", "symfony/mime": "^6.2", "symfony/polyfill-intl-icu": "~1.0", "symfony/property-info": "^5.4|^6.0", "symfony/routing": "^5.4|^6.0", "symfony/security-acl": "^2.8|^3.0", "symfony/security-core": "^5.4|^6.0", "symfony/security-csrf": "^5.4|^6.0", "symfony/security-http": "^5.4|^6.0", "symfony/serializer": "^6.2", "symfony/stopwatch": "^5.4|^6.0", "symfony/translation": "^6.1", "symfony/web-link": "^5.4|^6.0", "symfony/workflow": "^5.4|^6.0", "symfony/yaml": "^5.4|^6.0", "twig/cssinliner-extra": "^2.12|^3", "twig/inky-extra": "^2.12|^3", "twig/markdown-extra": "^2.12|^3" }, "type": "symfony-bridge", "autoload": { "psr-4": { "Symfony\\Bridge\\Twig\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/twig-bridge/tree/v6.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-05-29T13:12:36+00:00" }, { "name": "symfony/var-dumper", "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", "reference": "c81268d6960ddb47af17391a27d222bd58cf0515" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c81268d6960ddb47af17391a27d222bd58cf0515", "reference": "c81268d6960ddb47af17391a27d222bd58cf0515", "shasum": "" }, "require": { "php": ">=8.1", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" ], "type": "library", "autoload": { "files": [ "Resources/functions/dump.php" ], "psr-4": { "Symfony\\Component\\VarDumper\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Nicolas Grekas", "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", "keywords": [ "debug", "dump" ], "support": { "source": "https://github.com/symfony/var-dumper/tree/v6.3.1" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-06-21T12:08:28+00:00" }, { "name": "twig/twig", "version": "v3.6.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", "reference": "7e7d5839d4bec168dfeef0ac66d5c5a2edbabffd" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/twigphp/Twig/zipball/7e7d5839d4bec168dfeef0ac66d5c5a2edbabffd", "reference": "7e7d5839d4bec168dfeef0ac66d5c5a2edbabffd", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { "psr/container": "^1.0|^2.0", "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" }, "type": "library", "autoload": { "psr-4": { "Twig\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com", "homepage": "http://fabien.potencier.org", "role": "Lead Developer" }, { "name": "Twig Team", "role": "Contributors" }, { "name": "Armin Ronacher", "email": "armin.ronacher@active-4.com", "role": "Project Founder" } ], "description": "Twig, the flexible, fast, and secure template language for PHP", "homepage": "https://twig.symfony.com", "keywords": [ "templating" ], "support": { "issues": "https://github.com/twigphp/Twig/issues", "source": "https://github.com/twigphp/Twig/tree/v3.6.1" }, "funding": [ { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/twig/twig", "type": "tidelift" } ], "time": "2023-06-08T12:52:13+00:00" } ], "packages-dev": [ { "name": "doctrine/deprecations", "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", "phpstan/phpstan": "1.4.10 || 1.10.15", "phpstan/phpstan-phpunit": "^1.0", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "psalm/plugin-phpunit": "0.18.4", "psr/log": "^1 || ^2 || ^3", "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, "type": "library", "autoload": { "psr-4": { "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" }, "time": "2023-06-03T09:27:29+00:00" }, { "name": "doctrine/instantiator", "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", "shasum": "" }, "require": { "php": "^8.1" }, "require-dev": { "doctrine/coding-standard": "^11", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^1.2", "phpstan/phpstan": "^1.9.4", "phpstan/phpstan-phpunit": "^1.3", "phpunit/phpunit": "^9.5.27", "vimeo/psalm": "^5.4" }, "type": "library", "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", "homepage": "https://www.doctrine-project.org/projects/instantiator.html", "keywords": [ "constructor", "instantiate" ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", "source": "https://github.com/doctrine/instantiator/tree/2.0.0" }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", "type": "custom" }, { "url": "https://www.patreon.com/phpdoctrine", "type": "patreon" }, { "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", "type": "tidelift" } ], "time": "2022-12-30T00:23:10+00:00" }, { "name": "hamcrest/hamcrest-php", "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/hamcrest/hamcrest-php.git", "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", "shasum": "" }, "require": { "php": "^5.3|^7.0|^8.0" }, "replace": { "cordoval/hamcrest-php": "*", "davedevelopment/hamcrest-php": "*", "kodova/hamcrest-php": "*" }, "require-dev": { "phpunit/php-file-iterator": "^1.4 || ^2.0", "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.1-dev" } }, "autoload": { "classmap": [ "hamcrest" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "This is the PHP port of Hamcrest Matchers", "keywords": [ "test" ], "support": { "issues": "https://github.com/hamcrest/hamcrest-php/issues", "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" }, "time": "2020-07-09T08:09:16+00:00" }, { "name": "masterminds/html5", "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/Masterminds/html5-php.git", "reference": "3c5d5a56d56f48a1ca08a0670f0f80c1dad368f3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/3c5d5a56d56f48a1ca08a0670f0f80c1dad368f3", "reference": "3c5d5a56d56f48a1ca08a0670f0f80c1dad368f3", "shasum": "" }, "require": { "ext-dom": "*", "php": ">=5.3.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.7-dev" } }, "autoload": { "psr-4": { "Masterminds\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Matt Butcher", "email": "technosophos@gmail.com" }, { "name": "Matt Farina", "email": "matt@mattfarina.com" }, { "name": "Asmir Mustafic", "email": "goetas@gmail.com" } ], "description": "An HTML5 parser and serializer.", "homepage": "http://masterminds.github.io/html5-php", "keywords": [ "HTML5", "dom", "html", "parser", "querypath", "serializer", "xml" ], "support": { "issues": "https://github.com/Masterminds/html5-php/issues", "source": "https://github.com/Masterminds/html5-php/tree/2.8.0" }, "time": "2023-04-26T07:27:39+00:00" }, { "name": "mockery/mockery", "version": "1.6.4", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", "reference": "d1413755e26fe56a63455f7753221c86cbb88f66" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/mockery/mockery/zipball/d1413755e26fe56a63455f7753221c86cbb88f66", "reference": "d1413755e26fe56a63455f7753221c86cbb88f66", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", "php": ">=7.4,<8.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { "phpunit/phpunit": "^8.5 || ^9.3", "psalm/plugin-phpunit": "^0.18.4", "symplify/easy-coding-standard": "^11.5.0", "vimeo/psalm": "^5.13.1" }, "type": "library", "autoload": { "files": [ "library/helpers.php", "library/Mockery.php" ], "psr-4": { "Mockery\\": "library/Mockery" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Pádraic Brady", "email": "padraic.brady@gmail.com", "homepage": "https://github.com/padraic", "role": "Author" }, { "name": "Dave Marshall", "email": "dave.marshall@atstsolutions.co.uk", "homepage": "https://davedevelopment.co.uk", "role": "Developer" }, { "name": "Nathanael Esayeas", "email": "nathanael.esayeas@protonmail.com", "homepage": "https://github.com/ghostwriter", "role": "Lead Developer" } ], "description": "Mockery is a simple yet flexible PHP mock object framework", "homepage": "https://github.com/mockery/mockery", "keywords": [ "BDD", "TDD", "library", "mock", "mock objects", "mockery", "stub", "test", "test double", "testing" ], "support": { "docs": "https://docs.mockery.io/", "issues": "https://github.com/mockery/mockery/issues", "rss": "https://github.com/mockery/mockery/releases.atom", "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, "time": "2023-07-19T15:51:02+00:00" }, { "name": "myclabs/deep-copy", "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "conflict": { "doctrine/collections": "<1.6.8", "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", "autoload": { "files": [ "src/DeepCopy/deep_copy.php" ], "psr-4": { "DeepCopy\\": "src/DeepCopy/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "Create deep copies (clones) of your objects", "keywords": [ "clone", "copy", "duplicate", "object", "object graph" ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", "type": "tidelift" } ], "time": "2023-03-08T13:26:56+00:00" }, { "name": "nikic/php-parser", "version": "v4.16.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", "reference": "19526a33fb561ef417e822e85f08a00db4059c17" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", "reference": "19526a33fb561ef417e822e85f08a00db4059c17", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=7.0" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, "bin": [ "bin/php-parse" ], "type": "library", "extra": { "branch-alias": { "dev-master": "4.9-dev" } }, "autoload": { "psr-4": { "PhpParser\\": "lib/PhpParser" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Nikita Popov" } ], "description": "A PHP parser written in PHP", "keywords": [ "parser", "php" ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" }, "time": "2023-06-25T14:52:30+00:00" }, { "name": "phar-io/manifest", "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, "time": "2021-07-20T11:28:43+00:00" }, { "name": "phar-io/version", "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" }, { "name": "Sebastian Heuer", "email": "sebastian@phpeople.de", "role": "Developer" }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "Developer" } ], "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", "source": "https://github.com/phar-io/version/tree/3.2.1" }, "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { "dev-2.x": "2.x-dev" } }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Jaap van Otterdijk", "email": "opensource@ijaap.nl" } ], "description": "Common reflection classes used by phpdocumentor to reflect the code structure", "homepage": "http://www.phpdoc.org", "keywords": [ "FQSEN", "phpDocumentor", "phpdoc", "reflection", "static analysis" ], "support": { "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" }, "time": "2020-06-27T09:03:43+00:00" }, { "name": "phpdocumentor/reflection-docblock", "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", "shasum": "" }, "require": { "ext-filter": "*", "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.2", "phpdocumentor/type-resolver": "^1.3", "webmozart/assert": "^1.9.1" }, "require-dev": { "mockery/mockery": "~1.3.2", "psalm/phar": "^4.8" }, "type": "library", "extra": { "branch-alias": { "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" }, { "name": "Jaap van Otterdijk", "email": "account@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" }, "time": "2021-10-19T17:43:47+00:00" }, { "name": "phpdocumentor/type-resolver", "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.0", "phpstan/phpdoc-parser": "^1.13" }, "require-dev": { "ext-tokenizer": "*", "phpbench/phpbench": "^1.2", "phpstan/extension-installer": "^1.1", "phpstan/phpstan": "^1.8", "phpstan/phpstan-phpunit": "^1.1", "phpunit/phpunit": "^9.5", "rector/rector": "^0.13.9", "vimeo/psalm": "^4.25" }, "type": "library", "extra": { "branch-alias": { "dev-1.x": "1.x-dev" } }, "autoload": { "psr-4": { "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Mike van Riel", "email": "me@mikevanriel.com" } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2" }, "time": "2023-05-30T18:13:47+00:00" }, { "name": "phpspec/prophecy", "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", "reference": "15873c65b207b07765dbc3c95d20fdf4a320cbe2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpspec/prophecy/zipball/15873c65b207b07765dbc3c95d20fdf4a320cbe2", "reference": "15873c65b207b07765dbc3c95d20fdf4a320cbe2", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2 || ^2.0", "php": "^7.2 || 8.0.* || 8.1.* || 8.2.*", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { "phpspec/phpspec": "^6.0 || ^7.0", "phpstan/phpstan": "^1.9", "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { "Prophecy\\": "src/Prophecy" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Konstantin Kudryashov", "email": "ever.zet@gmail.com", "homepage": "http://everzet.com" }, { "name": "Marcello Duarte", "email": "marcello.duarte@gmail.com" } ], "description": "Highly opinionated mocking framework for PHP 5.3+", "homepage": "https://github.com/phpspec/prophecy", "keywords": [ "Double", "Dummy", "fake", "mock", "spy", "stub" ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", "source": "https://github.com/phpspec/prophecy/tree/v1.17.0" }, "time": "2023-02-02T15:41:36+00:00" }, { "name": "phpspec/prophecy-phpunit", "version": "v2.0.2", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy-phpunit.git", "reference": "9f26c224a2fa335f33e6666cc078fbf388255e87" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/9f26c224a2fa335f33e6666cc078fbf388255e87", "reference": "9f26c224a2fa335f33e6666cc078fbf388255e87", "shasum": "" }, "require": { "php": "^7.3 || ^8", "phpspec/prophecy": "^1.3", "phpunit/phpunit": "^9.1" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "autoload": { "psr-4": { "Prophecy\\PhpUnit\\": "src" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Christophe Coevoet", "email": "stof@notk.org" } ], "description": "Integrating the Prophecy mocking library in PHPUnit test cases", "homepage": "http://phpspec.net", "keywords": [ "phpunit", "prophecy" ], "support": { "issues": "https://github.com/phpspec/prophecy-phpunit/issues", "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.0.2" }, "time": "2023-04-18T11:58:05+00:00" }, { "name": "phpstan/phpdoc-parser", "version": "1.22.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", "reference": "65c39594fbd8c67abfc68bb323f86447bab79cc0" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/65c39594fbd8c67abfc68bb323f86447bab79cc0", "reference": "65c39594fbd8c67abfc68bb323f86447bab79cc0", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { "doctrine/annotations": "^2.0", "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", "phpstan/phpstan-phpunit": "^1.1", "phpstan/phpstan-strict-rules": "^1.0", "phpunit/phpunit": "^9.5", "symfony/process": "^5.2" }, "type": "library", "autoload": { "psr-4": { "PHPStan\\PhpDocParser\\": [ "src/" ] } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", "source": "https://github.com/phpstan/phpdoc-parser/tree/1.22.1" }, "time": "2023-06-29T20:46:06+00:00" }, { "name": "phpunit/php-code-coverage", "version": "9.2.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", "nikic/php-parser": "^4.15", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", "sebastian/code-unit-reverse-lookup": "^2.0.2", "sebastian/complexity": "^2.0", "sebastian/environment": "^5.1.2", "sebastian/lines-of-code": "^1.0.3", "sebastian/version": "^3.0.1", "theseer/tokenizer": "^1.2.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { "dev-master": "9.2-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", "homepage": "https://github.com/sebastianbergmann/php-code-coverage", "keywords": [ "coverage", "testing", "xunit" ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-03-06T12:58:08+00:00" }, { "name": "phpunit/php-file-iterator", "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "FilterIterator implementation that filters files based on a list of suffixes.", "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", "keywords": [ "filesystem", "iterator" ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "ext-pcntl": "*", "phpunit/phpunit": "^9.3" }, "suggest": { "ext-pcntl": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.1-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Invoke callables with a timeout", "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ "process" ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-09-28T05:58:55+00:00" }, { "name": "phpunit/php-text-template", "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Simple template engine.", "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ "template" ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-10-26T05:33:50+00:00" }, { "name": "phpunit/php-timer", "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "5.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Utility class for timing", "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ "timer" ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-10-26T13:16:10+00:00" }, { "name": "phpunit/phpunit", "version": "9.6.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a6d351645c3fe5a30f5e86be6577d946af65a328", "reference": "a6d351645c3fe5a30f5e86be6577d946af65a328", "shasum": "" }, "require": { "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", "phpunit/php-timer": "^5.0.2", "sebastian/cli-parser": "^1.0.1", "sebastian/code-unit": "^1.0.6", "sebastian/comparator": "^4.0.8", "sebastian/diff": "^4.0.3", "sebastian/environment": "^5.1.3", "sebastian/exporter": "^4.0.5", "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", "sebastian/type": "^3.2", "sebastian/version": "^3.0.2" }, "suggest": { "ext-soap": "To be able to generate mocks based on WSDL files", "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" ], "type": "library", "extra": { "branch-alias": { "dev-master": "9.6-dev" } }, "autoload": { "files": [ "src/Framework/Assert/Functions.php" ], "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "The PHP Unit Testing framework.", "homepage": "https://phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.10" }, "funding": [ { "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { "url": "https://github.com/sebastianbergmann", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], "time": "2023-07-10T04:04:23+00:00" }, { "name": "sebastian/cli-parser", "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-09-28T06:08:49+00:00" }, { "name": "sebastian/code-unit", "version": "1.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-10-26T13:08:54+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { "php": ">=7.3", "sebastian/diff": "^4.0", "sebastian/exporter": "^4.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" } ], "description": "Provides the functionality to compare PHP values for equality", "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", "equality" ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", "shasum": "" }, "require": { "nikic/php-parser": "^4.7", "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-10-26T15:52:27+00:00" }, { "name": "sebastian/diff", "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ "diff", "udiff", "unidiff", "unified diff" ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "5.1-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides functionality to handle HHVM/PHP environments", "homepage": "http://www.github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", "hhvm" ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { "php": ">=7.3", "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" }, { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "Provides the functionality to export PHP variables for visualization", "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { "php": ">=7.3", "sebastian/object-reflector": "^2.0", "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" }, "type": "library", "extra": { "branch-alias": { "dev-master": "5.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Snapshotting of global state", "homepage": "http://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2022-02-14T08:28:10+00:00" }, { "name": "sebastian/lines-of-code", "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", "shasum": "" }, "require": { "nikic/php-parser": "^4.6", "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-11-28T06:42:11+00:00" }, { "name": "sebastian/object-enumerator", "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { "php": ">=7.3", "sebastian/object-reflector": "^2.0", "sebastian/recursion-context": "^4.0" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "2.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "4.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "description": "Provides functionality to recursively process PHP variables", "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { "issues": "https://github.com/sebastianbergmann/resource-operations/issues", "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-09-28T06:45:17+00:00" }, { "name": "sebastian/type", "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.2-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { "dev-master": "3.0-dev" } }, "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], "time": "2020-09-28T06:39:44+00:00" }, { "name": "symfony/browser-kit", "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", "reference": "0eb7228e7c435169e65c911ba8d107d56d850049" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/browser-kit/zipball/0eb7228e7c435169e65c911ba8d107d56d850049", "reference": "0eb7228e7c435169e65c911ba8d107d56d850049", "shasum": "" }, "require": { "php": ">=8.1", "symfony/dom-crawler": "^5.4|^6.0" }, "require-dev": { "symfony/css-selector": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", "symfony/mime": "^5.4|^6.0", "symfony/process": "^5.4|^6.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\BrowserKit\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/browser-kit/tree/v6.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-04-25T10:46:17+00:00" }, { "name": "symfony/css-selector", "version": "v6.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", "reference": "88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/css-selector/zipball/88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf", "reference": "88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf", "shasum": "" }, "require": { "php": ">=8.1" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\CssSelector\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Jean-François Simon", "email": "jeanfrancois.simon@sensiolabs.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/css-selector/tree/v6.3.0" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-03-20T16:43:42+00:00" }, { "name": "symfony/dom-crawler", "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", "reference": "8aa333f41f05afc7fc285a976b58272fd90fc212" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/8aa333f41f05afc7fc285a976b58272fd90fc212", "reference": "8aa333f41f05afc7fc285a976b58272fd90fc212", "shasum": "" }, "require": { "masterminds/html5": "^2.6", "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { "symfony/css-selector": "^5.4|^6.0" }, "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\DomCrawler\\": "" }, "exclude-from-classmap": [ "/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { "source": "https://github.com/symfony/dom-crawler/tree/v6.3.1" }, "funding": [ { "url": "https://symfony.com/sponsor", "type": "custom" }, { "url": "https://github.com/fabpot", "type": "github" }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], "time": "2023-06-05T15:30:22+00:00" }, { "name": "theseer/tokenizer", "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { "classmap": [ "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Arne Blankerts", "email": "arne@blankerts.de", "role": "Developer" } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", "source": "https://github.com/theseer/tokenizer/tree/1.2.1" }, "funding": [ { "url": "https://github.com/theseer", "type": "github" } ], "time": "2021-07-28T10:34:58+00:00" }, { "name": "webmozart/assert", "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { "ext-ctype": "*", "php": "^7.2 || ^8.0" }, "conflict": { "phpstan/phpstan": "<0.12.20", "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { "phpunit/phpunit": "^8.5.13" }, "type": "library", "extra": { "branch-alias": { "dev-master": "1.10-dev" } }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Bernhard Schussek", "email": "bschussek@gmail.com" } ], "description": "Assertions to validate method input/output with nice error messages.", "keywords": [ "assert", "check", "validate" ], "support": { "issues": "https://github.com/webmozarts/assert/issues", "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, "time": "2022-06-03T18:03:27+00:00" } ], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=7.1.0" }, "platform-dev": [], "plugin-api-version": "2.1.0" } config.docker.ini000066400000000000000000000051171516072260400143010ustar00rootroot00000000000000[git] client = '/usr/bin/git' ; Your git executable path default_branch = 'master' ; Default branch when HEAD is detached repositories[] = '/var/git/' ; Path to your repositories ; If you wish to add more repositories, just add a new line ; WINDOWS USERS ;client = 'C:\Program Files (x86)\Git\bin\git.exe' ; Your git executable path ;repositories[] = 'C:\Path\to\Repos\' ; Path to your repositories ; You can hide repositories from GitList, just copy this for each repository you want to hide ; hidden[] = '/home/git/repositories/BetaTest' strip_dot_git = false ; Remove usual bare repo .git extension from displayed name [app] title = P3X GitList debug = false cache = true ; boolean either allow editing or if false, viewer only enable_editing = false ; big files can block the browser in code mirror, so there is a limit codemirror_full_limit = 48 ; if fixed_navbar = true -> the navbar is fixed ; if fixed_navbar = false -> the navbar is scrolling with the rest of the page fixed_navbar = true ; if repo_paging is 0, paging is disabled repo_paging = 10 [clone_button] ; ssh remote show_ssh_remote = true ; display remote URL for SSH ssh_user = 'git' ; user to use for cloning via SSH ssh_user_dynamic = false ; when enabled, ssh_user is set to $_SERVER['PHP_AUTH_USER'] ; if cloning via GIT ; we cannot find out the subdir ; so we have to add this git clone subdir ; eg ssh_clone_subdir = '/var/git/repository/' ssh_clone_subdir = '' ; http remote show_http_remote = true; display remote URL for HTTP use_https = true ; generate URL with https:// ; if cloning via HTTP is triggered using virtual dir (e.g. https://example.com/git/repo.git) ; it there is a subdir, start with string and end with trailing slash ; eg ssh_clone_subdir = '/var/git/repository/' ; true = it calculates to actual route/nested path by itself for the http clone button git_http_subdir_calculated = true ; if git_http_subdir_calculated is false, then as the path is used as git_http_subdir variable git_http_subdir = '/git-http-subdir' http_user = '' ; user to use for cloning via HTTP (default: none) http_user_dynamic = false ; when enabled, http_user is set to $_SERVER['PHP_AUTH_USER'] ; If you need to specify custom filetypes for certain extensions, do this here [filetypes] ; extension = type ; dist = xml ; If you need to set file types as binary or not, do this here [binary_filetypes] ; extension = true ; svh = false ; map = true ; set the timezone [date] ; timezone = UTC ; format = 'd/m/Y H:i:s' ; custom avatar service [avatar] ; url = '//gravatar.com/avatar/' ; query[] = 'd=identicon' config.example.ini000066400000000000000000000051151516072260400144630ustar00rootroot00000000000000[git] client = '/usr/bin/git' ; Your git executable path default_branch = 'master' ; Default branch when HEAD is detached repositories[] = '/var/git/' ; Path to your repositories ; If you wish to add more repositories, just add a new line ; WINDOWS USERS ;client = 'C:\Program Files (x86)\Git\bin\git.exe' ; Your git executable path ;repositories[] = 'C:\Path\to\Repos\' ; Path to your repositories ; You can hide repositories from GitList, just copy this for each repository you want to hide ; hidden[] = '/home/git/repositories/BetaTest' strip_dot_git = false ; Remove usual bare repo .git extension from displayed name [app] title = P3X GitList debug = false cache = true ; boolean either allow editing or if false, viewer only enable_editing = true ; big files can block the browser in code mirror, so there is a limit codemirror_full_limit = 48 ; if fixed_navbar = true -> the navbar is fixed ; if fixed_navbar = false -> the navbar is scrolling with the rest of the page fixed_navbar = true ; if repo_paging is 0, paging is disabled repo_paging = 10 [clone_button] ; ssh remote show_ssh_remote = true ; display remote URL for SSH ssh_user = 'git' ; user to use for cloning via SSH ssh_user_dynamic = false ; when enabled, ssh_user is set to $_SERVER['PHP_AUTH_USER'] ; if cloning via GIT ; we cannot find out the subdir ; so we have to add this git clone subdir ; eg ssh_clone_subdir = '/var/git/repository/' ssh_clone_subdir = '' ; http remote show_http_remote = true; display remote URL for HTTP use_https = true ; generate URL with https:// ; if cloning via HTTP is triggered using virtual dir (e.g. https://example.com/git/repo.git) ; it there is a subdir, start with string and end with trailing slash ; eg ssh_clone_subdir = '/var/git/repository/' ; true = it calculates to actual route/nested path by itself for the http clone button git_http_subdir_calculated = true ; if git_http_subdir_calculated is false, then as the path is used as git_http_subdir variable git_http_subdir = '/git-http-subdir' http_user = '' ; user to use for cloning via HTTP (default: none) http_user_dynamic = false ; when enabled, http_user is set to $_SERVER['PHP_AUTH_USER'] ; If you need to specify custom filetypes for certain extensions, do this here [filetypes] ; extension = type ; dist = xml ; If you need to set file types as binary or not, do this here [binary_filetypes] ; extension = true ; svh = false ; map = true ; set the timezone [date] ; timezone = UTC ; format = 'd/m/Y H:i:s' ; custom avatar service [avatar] ; url = '//gravatar.com/avatar/' ; query[] = 'd=identicon' docker-compose.yml000066400000000000000000000003451516072260400145200ustar00rootroot00000000000000# docker-compose up registry: image: patrikx3/p3x-gitlist:latest ports: - 12345:80 volumes: # here you can set your own /home/user/p3x-gitlist/git folder - /home/user/p3x-gitlist/git:/var/git package.json000066400000000000000000000051011516072260400133440ustar00rootroot00000000000000{ "name": "p3x-gitlist", "version": "2024.4.106", "corifeus": { "prod-dir": "prod", "css-postfix": "49127d5e63e7892020d8e4a89ccb3096753eedde10ae84df1b002c027fb40698", "prefix": "p3x-", "publish": false, "type": "p3x", "opencollective": false, "cdn": true, "icon": "fas fa-code", "code": "Spawn", "nodejs": "v20.11.1", "reponame": "gitlist", "build": true }, "scripts": { "build": "grunt", "webpack-watch": "webpack --watch", "less-watch": "grunt watch:less", "watch": "grunt default-less && concurrently \"webpack --watch\" \"grunt watch:less\" ", "postinstall": "node node_modules/corifeus-builder/src/utils/twemoji-install.js" }, "description": "🤖 P3X Gitlist - A decorated enhanced elegant, feature rich and modern private git ui repository viewer", "main": "index.js", "repository": "https://github.com/patrikx3/gitlist", "author": "patrikx3 ", "license": "MIT", "devDependencies": { "bootswatch": "^3.4.1", "concurrently": "^8.2.2", "corifeus-builder": "^2024.4.106", "corifeus-utils": "^2024.4.106", "css-loader": "^6.10.0", "css-minimizer-webpack-plugin": "^6.0.0", "fs-extra": "^11.2.0", "glob": "^10.3.10", "grunt": "^1.6.1", "grunt-contrib-less": "^3.0.0", "html-loader": "^5.0.0", "html-webpack-plugin": "^5.6.0", "less-loader": "^12.2.0", "mini-css-extract-plugin": "^2.8.0", "postcss-safe-parser": "^7.0.0", "source-map-loader": "^5.0.0", "style-loader": "^3.3.4", "terser-webpack-plugin": "^5.3.10", "url-loader": "^4.1.1", "webpack": "^5.90.2", "webpack-cli": "^5.1.4", "webpack-remove-debug": "^0.1.0", "worker-loader": "^3.0.8" }, "engines": { "node": ">=12.13.0" }, "homepage": "https://corifeus.com/gitlist", "dependencies": { "@fortawesome/fontawesome-free": "^6.5.1", "bootstrap": "^3.4.1", "codemirror": "^5.65.14", "highlight.js": "^11.9.0", "is-string-int": "^1.0.1", "jquery": "=3.4.1", "jquery.redirect": "^1.2.0", "js-cookie": "^3.0.5", "js-htmlencode": "^0.3.0", "list.js": "^2.3.1", "lodash": "^4.17.21", "marked": "^12.0.0", "moment": "^2.30.1", "php-date": "^4.0.1", "raphael": "^2.3.0", "snackbarjs": "^1.1.0", "twemoji": "=14.0.2" } }phpunit.xml000066400000000000000000000007221516072260400132730ustar00rootroot00000000000000 ./src/ ./tests/ public/000077500000000000000000000000001516072260400123375ustar00rootroot00000000000000public/.htaccess000066400000000000000000000005131516072260400141340ustar00rootroot00000000000000 Options -MultiViews +SymLinksIfOwnerMatch RewriteEngine On #RewriteBase /path/to/gitlist/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L,NC] order allow,deny deny from all public/img/000077500000000000000000000000001516072260400131135ustar00rootroot00000000000000public/img/favicon.png000066400000000000000000001336361516072260400152620ustar00rootroot00000000000000PNG  IHDRo'sBIT|d pHYs+tEXtSoftwarewww.inkscape.org< IDATx{u}߳9IB.ԠE *x^f\4g*jLVqflkfVq/mDDIձ3" *pS `8JIrs޿N'9y'Z}B (Rwug !/DM r#@=sO))! !5!#C+B#Žo}x՗86h:hUg?n$_Zpjc!\bRݾ樭_r"]~ٝv"!hc(>.§V_-Bv@- 0O?:b-B|]aC=?py pu1P9B ~h(BxI=tC  =euR ▍c'pz=R;b7|hݺ)S@8ݡ5~{BOKG!s}xwU!c7o<+"'7B5xm!P9ٛ={}wvwBhg1xP1۫/é@J9Y(_֧2`?#/@*9YnX>>.8MԳsi(™TA͝Pvߔz R+/n X V׎o~/$3T!xƷ"l|G(Bxk6/:@Fٻ>BxS-uR5;VgSo~heX$bqڣ0z {)GGcA_X7>.nXz 4cgU>B8?&!\njwKzI Qh"K$irA &=q|DrB 4Dr@ DrN j3ǫE$rjE&: qDrF zE$.r*M':,qDrN f2ǛE$r*Eo&* qDrF <T@@rx^DrB  GP6G$ r&@@8!%0p8'@@H@ 9#s("9&08!0H9}'"9"W8!09}#"9&8 O9='K"9"S8 9=#O"9&8 K9K&3H"9"$8)@$T9"S"9K!`8U"X9 "SE"9!0o8U&P9"S"9 !pX8u"0_9$SG"9!PJDrG q@$PrDIDr<8N@~8M&p 8NDrO @'+"9sr̉H$  k892%H; C8H/ 38qX:rǡwDrFI hqG$h!q?YrapDrjNA 1qO )qM eXt5@DrjFI qK$&q>^rǡ>Dr*NA 0qK$>q?r ǡ9Dr*FI qK$"qh>Zr !"9@uR]qx7?Gh:6M$n8z @ H(8£/~u[G_v]@yI@&CVDrro"9dE$HG CHYh>q|+CVDrd!q|!+"9` 8NJ`pr>[Js`0r>Esr>esr>Gsrgk?rDkrdkrH"9dE$`RDrȊH9T!"CVDrJq|HyF X*9"9E$XVucl. !P9k>pCI"M#ks7,On X!צr8^C^$X8``aryc#C^Drq|HyG 8&9"9E$8<D"@pMsDrȋHPN 8@"@899"9E$x2199"9E$x" r {99"9E$x@dM1"@'!/"9;Ȓ8^N$@r ;ȕ@dE?"9l 'C^Dr 79q|DrȋHD O_:"F{G$@r!/"9t9Hxh2hqDrȋH4@48>8"9E$H C<"M# #C^DrIrDrȋH4@Ԛ8^"9E$@ jK"u'$WHy:ǫO$@] @!C^Drr6!/"9P79P x}G$HyA;l#SB$@_;)!C^Dr`ro!/"9o9sDrJ'%9"9%DrȋH@T"9E$A zq|HN "&=ѷ8>G$Hy^%{#SB$@ ,)!C^Drr`!/"9T9("9E$B ,y#SB$b T&)!C^Dr`1r`*!/"9P90/sDrJX89"9%DrȋH̗@Rm"9E$C J.)!C^Drprj!/"9p(9$sDrJ(#OИ8>G$Hy!/"9p !48)!C^Drrq|HN "sr\6q|HN "!"9E$rTq|HN "@rPq|HN "@rȌ8~"9E$< qHN "@~rȄ8~"9%DrȋHy <!/"9C H$Hy 948H"9%DrȋH'@CK$SB$l948#"9%DrȋH%@È=&SB$L948'"9%DrȋH#@C}&SB$,948> "9%DrȋH!@͉&SB$ 9Ԙ8HN "@ PSxb"9%DrȋH&@ !SB$P_9Ԍ8^1"9%DrȋH$@%SB$P?9Ԅ8^q"9%DrȋH"@ 5!SB$P9T8^3"9%DrȋH @5%SB$P}9T8^s"9%DrȋH&@ !SB$P]9T80"9%DrȋH$@ %SB$P=9T8p"9%DrȋH"@)!C^Dr3#SB$P 9$$gJ$Hy =3'SB$@ DrJ`q@$Hy HDrJO 9$"9E$`qE$Hy`pr3q)!C^Dr HgQDrJO >Y"9E$qzB$Hyr1q)!C^DrzH/DrJzO +"9E$qB$HywrX"q)!C^Dr @' "9E$`q)!C^DrXADrJO ǩ"9E$`q*I$Hy`r'qJ)!C^DrXADrJO ǩ"9E$qjI$Hyr(!Sk"9%DrȋH&A4HN "@9 ("9%DrȋH'4HN " qF)!C^Drx"8N&DrJ~L  {8Y)!C^Drx@@q$SB$ 1q!/"9Ȓ8A$Hyș@@vqx"9E$ W9Y DrJ dCC)!C^Drr#qA$Hyȉ@@"9%DrȋH@.rME)!C^Drr X8,HN "t9$C!/"9M&88HN "T9"C!/"9M$8HN "49 !/"9M"P{8 HN "9l+. !nNQq}쪡SR$ :~bcQGM돛j=QGwuGa'z1z%q*@$D;拱wN>e}XyĆH]!:w춫\:߼YX*q*D$by7^g/{Z>+$'z NӹeG|3Bgv8$ rjq0/i>ҽ曦.Q7]z=P^P/98Ԁ4]?vw=%2/rjKro6nɏoUkH=KrA Ҽ\Luj>.zQtRρ:,/ǡƼ$''{/_죞p /6JrKrr<0kߧSρ*qD$'GwL}cS*DrJ RUrnLʼn7k|@58@T`^ٛv|ƸwϪc 5/J!"933{|/HRU8B:k]Ro[Z8:ڞ㐉_6{˶)O85 JҊ S/ o^*1V tUavfY1s+&*s+Bܳ]5NLqntX`UBέ@Xyk>v[-s+9 $έ@!tzCyE!s+ 008PJ$B_GRoDrM ` Mr!wή愸s|}- I!#VW9[ 7rVXwHNe˟?i=)!lYU$rFE$GO[g^>丹) Iqٛn8-HMr rzq'$Gő.˧RO4$ Uz(~䪡򒜼vݻS &+>Ǿ[hǁQv΃z k9=8wnã:3sĝSO4$w `MrxT{r/hɔ@8 T;]$'{O.")!lYU$`r-n8<1{gq`"Z^߿2HaȺK▍éP_9 s+Ba%^; VX`U*(~䪡N S &+>,,8TBQ[K-ߛz &9%0on&9bȳWCN57X yqs47! v#7X78,gUpn]Cq[ %7//8$gUZqnSVロz %PY[!sqO;{+zs++*@9Bbw7̊8{M)s+<84ܹ/Q:v;3 6%9#n&9^:tڙU&9erssh$7W{: [] IDATN(zT<@@Y[!SŪ?lFPέp @Ý3s/?.,K=‡;9@&99j?}|- 7#dq Kn紖-ߛzTrVȚhuo. 7p C8c$''}/]GROq _^dqqc򛾑zT28AINFMMr pV$'ᓇ_mg@UI 8'7H hgUȹi;G@8<9@ @6l P7"9@58INôO|O;n$hHMr(?[Sπzr rrV !Vhe?7@]9P9@  3^pL Pg"9@ 5#THN+xnzW"9@} 5⃜X$|&j+nO=·;I  o|z,^'hUz4]¦[ErjjnŪݡhzB9C Hqk=So^ia"ȅ $8@3>vw +q'Lyq 5 gU){So^i?zƹru̱^ڣ G"9@:9 /nib W"9@9 '@3֭O=zgdBB> 0x9 '@sFROi 3"$Ý7?} @õZn6!'V[q+ZC'@9TH09@9* 9Z9T'(tRO&9@? =8@fHt U%9@=8@~n 39T ڳ;ҝ|¼$=Wgrt{&gROKr^('fqLi'V6*,@Ϊwh'v85 @o !}W?gDVo~qtw] +ᇖ,K#,<^zJ;֦,%,r${'1L=z=Ԕw,@0O8ffN=z`Oر>`Drq%ؑz,ROMrqg;Kydl,W$/U`>:lJ*}T @80?9@ q|Q7R- F$8< `!:wvrz,EI=7M 8,T 3={F@IPF xgUXC?z,Vms+'`Y!kqXKr W9/='fugiyIL 8չ̲;*ȓ@d9}W|)7|M_N G9gUٛw&|&9h,7Hs׭Ԟ[SR5_3jsȁ@48@jxX PfƯ:K$N 9}[Tpq>1>|h2h*⮉#wݐz(?3n|h&h j&?t1!z<ޏ'ENyr:8os=3W};rh=7`./Į?K&9$EK8uSWX>;\nutH=h&+>Ǿ[.K>@/yI4@-y9@Z\}wXlC)d*vuV @?xIԙ@x9@t{#g}6q/Ɂ:/5G>#2әofg4@yAԆ8@So ?{ǁA(B4>vk[F */n8<1V\Bܜz ,ž;Bg}o扱R8:ڞ4EO -ۮܲ;\crVN5_yW|٩P}~fEܽ& o> T@%4Z31BNb_8P> T@Trm T+@x9@N+'ݗ˞z ?ƟqN=@έU9P8{S![h-U PE9P Ϊ[nz]_rK1X esF~פTHN=OmO~![j:7ϺONj%L5*3s 6Ѐ8BWVG9 @ DmOŋq89zo0[[ҍ;֧2_#oyו%q|c|e` S/ }GGw^B[NĎ|ުܟz n]o}w>#y˻\3zH&9h$Yw@?8^Ϻ{jyhOqƃ7]z)󵈗}WM}O^ޓQ@Xٻ(C{SSL 4-$"CLb qJH4^r8DLKLDq\8!ћAeh'z~? }Qꡪ9\]Ԯg_&_՝y(8cYۧН{vMi`Q+M!P rif 'P\ =S_nuGiܙi+UBƈt[5<]YqPYoB,d|k }B)ϼOЬ00̭HϼN-2':nVգ4G`@ZV"_6*TN⍢ٻEU8GJM<roV, _;Ywr9~%9P: rF9&JLv44*G}Egpښ]j놦o[^wP5ї%-!I.>meˠ?(%i*o乓.)$pJrCAC(@3N'|qe+&eLJ&'m\{qn$N";ɼƼi}ܐI %uj;KG?a(t9vSӦB^; 5`ȴoWƟ=Xv G×|}Yx7EnIjnZ{c}e$Lںx*x+W\.?~HwSꀳsѧ/zmPIKwL0?a( rBMf'6Uy,`oUE%uganxe9Q O^8̹U:r˚?Y_Z`+rO ssd|a#M~J[/l@/ r8992BHY; >O)鉕-{,gY}_&0YP<\@Īw^{{eÄbs=?{-xΑe$pN |r2 הGV}+gΥM?DT;1"yMSN_vc`-$pJr(ʏRG ֝M?.l^{,FRe*GWǴXeD(';J5Xtط{obژH|{o-7uK|^BI0䀟Q>D9ҥrs!e,'A?3E2/*-m 8*%=%m+I8[TR֖B$ɺ}BΎɪR`%@9)CI93\ i&ʽN $0|v!g{qq'6\ op4W.q 4tm՝Hc$І r'( dAQmo! G΂ hmZxW{&kkztxPhCI 9^VI=A\h2M'uG:rC($mEp^ViB9/tG:rdxgDyA'.RaYd9`0qH/|ւ=g ;8@wdJh=䤏tG:r($Pj`}|Ru,`|ւ; 4Po8 H%?{-xq*:ŭ<%򹢞 $ҏ䀁Դiv}zr*[Up帏IY?VŐ-oQ O>RՈy$ r0̪@zY{ H&̼,TU}2'Iw@fUan0 9`fU ͤT2YT2ZwT$wXO7U rB qA]YJr Q@o*={\[wWpYs%969lt16XoBi)\$tՓw>+DE9GVR{92*?E9*l\;Gc rCU_v"oD9mWo\;Ĭk10̭^ ̪@fX={W!e,0BSM$wl`V[І[8Ax8d|l78(/jv ;@9̭pHѳ$p96 srd0{c]I wP.8d]ZV!r u$wBAr@ɒ{;YwK`YҾUsݜknisZA0b4VanЏЀr+ NC?;_T$7%96^@Q@vY{ V 6̭GA8GpܤUBZ=tEʢi_X;@In4Jrm(Ɂ qpWtD˛tg9$7ڰI9lNWw#ACIn46Mr (ȁNbVQ[Bt:e啺c,̭m[qpnBH9 }6`JrQhCIt 9Al{N8<)|`&6ɍ&96lGAtnv3ҫl0Fca$:h'fUdQ~a)IҲJҲ*9`.V 6̭GA8_I)Q@Jrc(ȁo:Iw+&tg$7ڰI9p lw؃t=lMrah r(U)Gw+daQ_̭m[R rE#2\IT$7%96QA9c>qu |R JrQhCIo$p!'xu:tؠ;;ŝpq'pd'+0 @:\i4.p.>̪> @:_̭m[>G9g蝣;Vy3(ɍFI %9(kl! tGAIn46a88C3ia&$p6 r*`iE²1![1s+0 Pa"yMB^/8hP(+ly"DEuoН8Fc@6W 6L*ӝH'ug>MrI0l( ̪d DYE9"-!tR<%K%>)g.~R #sՌAYt Դiv}zTu,J63 O4w'ɍ%SO$9ԥu5b'a rx*o9O՝Hjj,,V 6̭$4qBH E29Z]; tg2hPk(zTU!@W9ӝ$JrQhCI/ Qڥ)O8N1.Q=@Q@Jrx9\rno @Wz>oP@Jrx9\IOl}r^ΖM3]Ԡ;MK{ Jr}R\;GcGBAQӦ5Q!ԥ#[3]_ ;mN$dx$pF$9܈¬ -;e ܊ј[І9\rvoWtJ&w'w,ӝЅhPÍ( lbWHު;Fc@66Ўq@Dtg:#_17`hl8 p rhŬ zxΈB [0b4VannAAm(ܷEt|V;&F$Іn@A-d.ꄧ$6e86ɍ&96lC7 rdLZ=Dwo8In4NhIrt'!/K,[j% _i=0뚰jj(#Npŋ8TޞZ;%՝3Np!u7c5I!ԥ2'7H*՝>TM8=@«ιӄYv*:ŭ

{$post['title']}

". "

{$post['body']}

"; }); Using multiple databases ------------------------ The Doctrine provider can allow access to multiple databases. In order to configure the data sources, replace the **db.options** with **dbs.options**. **dbs.options** is an array of configurations where keys are connection names and values are options:: $app->register(new Silex\Provider\DoctrineServiceProvider(), array( 'dbs.options' => array ( 'mysql_read' => array( 'driver' => 'pdo_mysql', 'host' => 'mysql_read.someplace.tld', 'dbname' => 'my_database', 'user' => 'my_username', 'password' => 'my_password', 'charset' => 'utf8mb4', ), 'mysql_write' => array( 'driver' => 'pdo_mysql', 'host' => 'mysql_write.someplace.tld', 'dbname' => 'my_database', 'user' => 'my_username', 'password' => 'my_password', 'charset' => 'utf8mb4', ), ), )); The first registered connection is the default and can simply be accessed as you would if there was only one connection. Given the above configuration, these two lines are equivalent:: $app['db']->fetchAll('SELECT * FROM table'); $app['dbs']['mysql_read']->fetchAll('SELECT * FROM table'); Using multiple connections:: $app->get('/blog/{id}', function ($id) use ($app) { $sql = "SELECT * FROM posts WHERE id = ?"; $post = $app['dbs']['mysql_read']->fetchAssoc($sql, array((int) $id)); $sql = "UPDATE posts SET value = ? WHERE id = ?"; $app['dbs']['mysql_write']->executeUpdate($sql, array('newValue', (int) $id)); return "

{$post['title']}

". "

{$post['body']}

"; }); For more information, consult the `Doctrine DBAL documentation `_. src/Silex/doc/providers/form.rst000066400000000000000000000145151516072260400172210ustar00rootroot00000000000000Form ==== The *FormServiceProvider* provides a service for building forms in your application with the Symfony Form component. Parameters ---------- * none Services -------- * **form.factory**: An instance of `FormFactory `_, that is used to build a form. Registering ----------- .. code-block:: php use Silex\Provider\FormServiceProvider; $app->register(new FormServiceProvider()); .. note:: If you don't want to create your own form layout, it's fine: a default one will be used. But you will have to register the :doc:`translation provider ` as the default form layout requires it:: $app->register(new Silex\Provider\TranslationServiceProvider(), array( 'translator.domains' => array(), )); If you want to use validation with forms, do not forget to register the :doc:`Validator provider `. .. note:: Add the Symfony Form Component as a dependency: .. code-block:: bash composer require symfony/form If you are going to use the validation extension with forms, you must also add a dependency to the ``symfony/validator`` and ``symfony/config`` components: .. code-block:: bash composer require symfony/validator symfony/config If you want to use forms in your Twig templates, you can also install the Symfony Twig Bridge. Make sure to install, if you didn't do that already, the Translation component in order for the bridge to work: .. code-block:: bash composer require symfony/twig-bridge Usage ----- The FormServiceProvider provides a ``form.factory`` service. Here is a usage example:: use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; $app->match('/form', function (Request $request) use ($app) { // some default data for when the form is displayed the first time $data = array( 'name' => 'Your name', 'email' => 'Your email', ); $form = $app['form.factory']->createBuilder(FormType::class, $data) ->add('name') ->add('email') ->add('billing_plan', ChoiceType::class, array( 'choices' => array('free' => 1, 'small business' => 2, 'corporate' => 3), 'expanded' => true, )) ->add('submit', SubmitType::class, [ 'label' => 'Save', ]) ->getForm(); $form->handleRequest($request); if ($form->isValid()) { $data = $form->getData(); // do something with the data // redirect somewhere return $app->redirect('...'); } // display the form return $app['twig']->render('index.twig', array('form' => $form->createView())); }); And here is the ``index.twig`` form template (requires ``symfony/twig-bridge``): .. code-block:: jinja
{{ form_widget(form) }}
If you are using the validator provider, you can also add validation to your form by adding constraints on the fields:: use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Validator\Constraints as Assert; $app->register(new Silex\Provider\ValidatorServiceProvider()); $app->register(new Silex\Provider\TranslationServiceProvider(), array( 'translator.domains' => array(), )); $form = $app['form.factory']->createBuilder(FormType::class) ->add('name', TextType::class, array( 'constraints' => array(new Assert\NotBlank(), new Assert\Length(array('min' => 5))) )) ->add('email', TextType::class, array( 'constraints' => new Assert\Email() )) ->add('billing_plan', ChoiceType::class, array( 'choices' => array('free' => 1, 'small business' => 2, 'corporate' => 3), 'expanded' => true, 'constraints' => new Assert\Choice(array(1, 2, 3)), )) ->add('submit', SubmitType::class, [ 'label' => 'Save', ]) ->getForm(); You can register form types by extending ``form.types``:: $app['your.type.service'] = function ($app) { return new YourServiceFormType(); }; $app->extend('form.types', function ($types) use ($app) { $types[] = new YourFormType(); $types[] = 'your.type.service'; return $types; }); You can register form extensions by extending ``form.extensions``:: $app->extend('form.extensions', function ($extensions) use ($app) { $extensions[] = new YourTopFormExtension(); return $extensions; }); You can register form type extensions by extending ``form.type.extensions``:: $app['your.type.extension.service'] = function ($app) { return new YourServiceFormTypeExtension(); }; $app->extend('form.type.extensions', function ($extensions) use ($app) { $extensions[] = new YourFormTypeExtension(); $extensions[] = 'your.type.extension.service'; return $extensions; }); You can register form type guessers by extending ``form.type.guessers``:: $app['your.type.guesser.service'] = function ($app) { return new YourServiceFormTypeGuesser(); }; $app->extend('form.type.guessers', function ($guessers) use ($app) { $guessers[] = new YourFormTypeGuesser(); $guessers[] = 'your.type.guesser.service'; return $guessers; }); .. warning:: CSRF protection is only available and automatically enabled when the :doc:`CSRF Service Provider ` is registered. Traits ------ ``Silex\Application\FormTrait`` adds the following shortcuts: * **form**: Creates a FormBuilderInterface instance. * **namedForm**: Creates a FormBuilderInterface instance (named). .. code-block:: php $app->form($data); $app->namedForm($name, $data, $options, $type); For more information, consult the `Symfony Forms documentation `_. src/Silex/doc/providers/http_cache.rst000066400000000000000000000073561516072260400203650ustar00rootroot00000000000000HTTP Cache ========== The *HttpCacheServiceProvider* provides support for the Symfony Reverse Proxy. Parameters ---------- * **http_cache.cache_dir**: The cache directory to store the HTTP cache data. * **http_cache.options** (optional): An array of options for the `HttpCache `_ constructor. Services -------- * **http_cache**: An instance of `HttpCache `_. * **http_cache.esi**: An instance of `Esi `_, that implements the ESI capabilities to Request and Response instances. * **http_cache.store**: An instance of `Store `_, that implements all the logic for storing cache metadata (Request and Response headers). Registering ----------- .. code-block:: php $app->register(new Silex\Provider\HttpCacheServiceProvider(), array( 'http_cache.cache_dir' => __DIR__.'/cache/', )); Usage ----- Silex already supports any reverse proxy like Varnish out of the box by setting Response HTTP cache headers:: use Symfony\Component\HttpFoundation\Response; $app->get('/', function() { return new Response('Foo', 200, array( 'Cache-Control' => 's-maxage=5', )); }); .. tip:: If you want Silex to trust the ``X-Forwarded-For*`` headers from your reverse proxy at address $ip, you will need to whitelist it as documented in `Trusting Proxies `_. If you would be running Varnish in front of your application on the same machine:: use Symfony\Component\HttpFoundation\Request; Request::setTrustedProxies(array('127.0.0.1', '::1')); $app->run(); This provider allows you to use the Symfony reverse proxy natively with Silex applications by using the ``http_cache`` service. The Symfony reverse proxy acts much like any other proxy would, so you will want to whitelist it:: use Symfony\Component\HttpFoundation\Request; Request::setTrustedProxies(array('127.0.0.1')); $app['http_cache']->run(); The provider also provides ESI support:: $app->get('/', function() { $response = new Response(<< Hello EOF , 200, array( 'Surrogate-Control' => 'content="ESI/1.0"', )); $response->setTtl(20); return $response; }); $app->get('/included', function() { $response = new Response('Foo'); $response->setTtl(5); return $response; }); $app['http_cache']->run(); If your application doesn't use ESI, you can disable it to slightly improve the overall performance:: $app->register(new Silex\Provider\HttpCacheServiceProvider(), array( 'http_cache.cache_dir' => __DIR__.'/cache/', 'http_cache.esi' => null, )); .. tip:: To help you debug caching issues, set your application ``debug`` to true. Symfony automatically adds a ``X-Symfony-Cache`` header to each response with useful information about cache hits and misses. If you are *not* using the Symfony Session provider, you might want to set the PHP ``session.cache_limiter`` setting to an empty value to avoid the default PHP behavior. Finally, check that your Web server does not override your caching strategy. For more information, consult the `Symfony HTTP Cache documentation `_. src/Silex/doc/providers/http_fragment.rst000066400000000000000000000036671516072260400211260ustar00rootroot00000000000000HTTP Fragment ============= The *HttpFragmentServiceProvider* provides support for the Symfony fragment sub-framework, which allows you to embed fragments of HTML in a template. Parameters ---------- * **fragment.path**: The path to use for the URL generated for ESI and HInclude URLs (``/_fragment`` by default). * **uri_signer.secret**: The secret to use for the URI signer service (used for the HInclude renderer). * **fragment.renderers.hinclude.global_template**: The content or Twig template to use for the default content when using the HInclude renderer. Services -------- * **fragment.handler**: An instance of `FragmentHandler `_. * **fragment.renderers**: An array of fragment renderers (by default, the inline, ESI, and HInclude renderers are pre-configured). Registering ----------- .. code-block:: php $app->register(new Silex\Provider\HttpFragmentServiceProvider()); Usage ----- .. note:: This section assumes that you are using Twig for your templates. Instead of building a page out of a single request/controller/template, the fragment framework allows you to build a page from several controllers/sub-requests/sub-templates by using **fragments**. Including "sub-pages" in the main page can be done with the Twig ``render()`` function: .. code-block:: jinja The main page content. {{ render('/foo') }} The main page content resumes here. The ``render()`` call is replaced by the content of the ``/foo`` URL (internally, a sub-request is handled by Silex to render the sub-page). Instead of making internal sub-requests, you can also use the ESI (the sub-request is handled by a reverse proxy) or the HInclude strategies (the sub-request is handled by a web browser): .. code-block:: jinja {{ render(url('route_name')) }} {{ render_esi(url('route_name')) }} {{ render_hinclude(url('route_name')) }} src/Silex/doc/providers/index.rst000066400000000000000000000005301516072260400173550ustar00rootroot00000000000000Built-in Service Providers ========================== .. toctree:: :maxdepth: 1 twig asset monolog session swiftmailer locale translation validator form csrf http_cache http_fragment security remember_me serializer service_controller var_dumper doctrine routing src/Silex/doc/providers/locale.rst000066400000000000000000000007651516072260400175170ustar00rootroot00000000000000Locale ====== The *LocaleServiceProvider* manages the locale of an application. Parameters ---------- * **locale**: The locale of the user. When set before any request handling, it defines the default locale (``en`` by default). When a request is being handled, it is automatically set according to the ``_locale`` request attribute of the current route. Services -------- * n/a Registering ----------- .. code-block:: php $app->register(new Silex\Provider\LocaleServiceProvider()); src/Silex/doc/providers/monolog.rst000066400000000000000000000066351516072260400177340ustar00rootroot00000000000000Monolog ======= The *MonologServiceProvider* provides a default logging mechanism through Jordi Boggiano's `Monolog `_ library. It will log requests and errors and allow you to add logging to your application. This allows you to debug and monitor the behaviour, even in production. Parameters ---------- * **monolog.logfile**: File where logs are written to. * **monolog.bubble** (optional): Whether the messages that are handled can bubble up the stack or not. * **monolog.permission** (optional): File permissions default (null), nothing change. * **monolog.level** (optional): Level of logging, defaults to ``DEBUG``. Must be one of ``Logger::DEBUG``, ``Logger::INFO``, ``Logger::WARNING``, ``Logger::ERROR``. ``DEBUG`` will log everything, ``INFO`` will log everything except ``DEBUG``, etc. In addition to the ``Logger::`` constants, it is also possible to supply the level in string form, for example: ``"DEBUG"``, ``"INFO"``, ``"WARNING"``, ``"ERROR"``. PSR-3 log levels from ``\Psr\Log\LogLevel::`` constants are also supported. * **monolog.name** (optional): Name of the monolog channel, defaults to ``myapp``. * **monolog.exception.logger_filter** (optional): An anonymous function that returns an error level for on uncaught exception that should be logged. * **monolog.use_error_handler** (optional): Whether errors and uncaught exceptions should be handled by the Monolog ``ErrorHandler`` class and added to the log. By default the error handler is enabled unless the application ``debug`` parameter is set to true. Please note that enabling the error handler may silence some errors, ignoring the PHP ``display_errors`` configuration setting. Services -------- * **monolog**: The monolog logger instance. Example usage:: $app['monolog']->debug('Testing the Monolog logging.'); * **monolog.listener**: An event listener to log requests, responses and errors. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\MonologServiceProvider(), array( 'monolog.logfile' => __DIR__.'/development.log', )); .. note:: Add Monolog as a dependency: .. code-block:: bash composer require monolog/monolog Usage ----- The MonologServiceProvider provides a ``monolog`` service. You can use it to add log entries for any logging level through ``debug()``, ``info()``, ``warning()`` and ``error()``:: use Symfony\Component\HttpFoundation\Response; $app->post('/user', function () use ($app) { // ... $app['monolog']->info(sprintf("User '%s' registered.", $username)); return new Response('', 201); }); Customization ------------- You can configure Monolog (like adding or changing the handlers) before using it by extending the ``monolog`` service:: $app->extend('monolog', function($monolog, $app) { $monolog->pushHandler(...); return $monolog; }); By default, all requests, responses and errors are logged by an event listener registered as a service called `monolog.listener`. You can replace or remove this service if you want to modify or disable the logged information. Traits ------ ``Silex\Application\MonologTrait`` adds the following shortcuts: * **log**: Logs a message. .. code-block:: php $app->log(sprintf("User '%s' registered.", $username)); For more information, check out the `Monolog documentation `_. src/Silex/doc/providers/remember_me.rst000066400000000000000000000034221516072260400205300ustar00rootroot00000000000000Remember Me =========== The *RememberMeServiceProvider* adds "Remember-Me" authentication to the *SecurityServiceProvider*. Parameters ---------- n/a Services -------- n/a .. note:: The service provider defines many other services that are used internally but rarely need to be customized. Registering ----------- Before registering this service provider, you must register the *SecurityServiceProvider*:: $app->register(new Silex\Provider\SecurityServiceProvider()); $app->register(new Silex\Provider\RememberMeServiceProvider()); $app['security.firewalls'] = array( 'my-firewall' => array( 'pattern' => '^/secure$', 'form' => true, 'logout' => true, 'remember_me' => array( 'key' => 'Choose_A_Unique_Random_Key', 'always_remember_me' => true, /* Other options */ ), 'users' => array( /* ... */ ), ), ); Options ------- * **key**: A secret key to generate tokens (you should generate a random string). * **name**: Cookie name (default: ``REMEMBERME``). * **lifetime**: Cookie lifetime (default: ``31536000`` ~ 1 year). * **path**: Cookie path (default: ``/``). * **domain**: Cookie domain (default: ``null`` = request domain). * **secure**: Cookie is secure (default: ``false``). * **httponly**: Cookie is HTTP only (default: ``true``). * **always_remember_me**: Enable remember me (default: ``false``). * **remember_me_parameter**: Name of the request parameter enabling remember_me on login. To add the checkbox to the login form. You can find more information in the `Symfony cookbook `_ (default: ``_remember_me``). src/Silex/doc/providers/routing.rst000066400000000000000000000041211516072260400177350ustar00rootroot00000000000000Routing ======= The *RoutingServiceProvider* provides a service for generating URLs for named routes. Parameters ---------- * **route_class**: (optional): The default route class used by the route factory (defaults to ``Silex\Route``). Services -------- * **url_generator**: An instance of `UrlGenerator `_, using the `RouteCollection `_ that is provided through the ``routes`` service. It has a ``generate`` method, which takes the route name as an argument, followed by an array of route parameters. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\RoutingServiceProvider()); Usage ----- The Routing provider provides a ``url_generator`` service:: $app->get('/', function () { return 'welcome to the homepage'; }) ->bind('homepage'); $app->get('/hello/{name}', function ($name) { return "Hello $name!"; }) ->bind('hello'); $app->get('/navigation', function () use ($app) { return 'Home'. ' | '. 'Hello Igor'; }); When using Twig, the service can be used like this: .. code-block:: jinja {{ app.url_generator.generate('homepage') }} Moreover, if you have ``twig-bridge`` as a Composer dep, you will have access to the ``path()`` and ``url()`` functions: .. code-block:: jinja {{ path('homepage') }} {{ url('homepage') }} {# generates the absolute url http://example.org/ #} {{ path('hello', {name: 'Fabien'}) }} {{ url('hello', {name: 'Fabien'}) }} {# generates the absolute url http://example.org/hello/Fabien #} Traits ------ ``Silex\Application\UrlGeneratorTrait`` adds the following shortcuts: * **path**: Generates a path. * **url**: Generates an absolute URL. .. code-block:: php $app->path('homepage'); $app->url('homepage'); src/Silex/doc/providers/security.rst000066400000000000000000000606631516072260400201320ustar00rootroot00000000000000Security ======== The *SecurityServiceProvider* manages authentication and authorization for your applications. Parameters ---------- * **security.hide_user_not_found** (optional): Defines whether to hide user not found exception or not. Defaults to ``true``. * **security.encoder.bcrypt.cost** (optional): Defines BCrypt password encoder cost. Defaults to 13. * **security.role_hierarchy**:(optional): Defines a map of roles including other roles. * **security.access_rules** (optional): Defines rules based on paths and roles. See `Defining Access Rule <#defining-access-rules>`_. Services -------- * **security.token_storage**: Gives access to the user token. * **security.authorization_checker**: Allows to check authorizations for the users. * **security.authentication_manager**: An instance of `AuthenticationProviderManager `_, responsible for authentication. * **security.access_manager**: An instance of `AccessDecisionManager `_, responsible for authorization. * **security.session_strategy**: Define the session strategy used for authentication (default to a migration strategy). * **security.user_checker**: Checks user flags after authentication. * **security.last_error**: Returns the last authentication error message when given a Request object. * **security.authentication_utils**: Returns the AuthenticationUtils service allowing you to get last authentication exception or last username. * **security.encoder_factory**: Defines the encoding strategies for user passwords (uses ``security.default_encoder``). * **security.default_encoder**: The encoder to use by default for all users (BCrypt). * **security.encoder.digest**: Digest password encoder. * **security.encoder.bcrypt**: BCrypt password encoder. * **security.encoder.pbkdf2**: Pbkdf2 password encoder. * **user**: Returns the current user .. note:: The service provider defines many other services that are used internally but rarely need to be customized. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\SecurityServiceProvider(), array( 'security.firewalls' => // see below )); .. note:: Add the Symfony Security Component as a dependency: .. code-block:: bash composer require symfony/security .. caution:: If you're using a form to authenticate users, you need to enable ``SessionServiceProvider``. .. caution:: The security features are only available after the Application has been booted. So, if you want to use it outside of the handling of a request, don't forget to call ``boot()`` first:: $app->boot(); Usage ----- The Symfony Security component is powerful. To learn more about it, read the `Symfony Security documentation `_. .. tip:: When a security configuration does not behave as expected, enable logging (with the Monolog extension for instance) as the Security Component logs a lot of interesting information about what it does and why. Below is a list of recipes that cover some common use cases. Accessing the current User ~~~~~~~~~~~~~~~~~~~~~~~~~~ The current user information is stored in a token that is accessible via the ``security`` service:: $token = $app['security.token_storage']->getToken(); If there is no information about the user, the token is ``null``. If the user is known, you can get it with a call to ``getUser()``:: if (null !== $token) { $user = $token->getUser(); } The user can be a string, an object with a ``__toString()`` method, or an instance of `UserInterface `_. Securing a Path with HTTP Authentication ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The following configuration uses HTTP basic authentication to secure URLs under ``/admin/``:: $app['security.firewalls'] = array( 'admin' => array( 'pattern' => '^/admin', 'http' => true, 'users' => array( // raw password is foo 'admin' => array('ROLE_ADMIN', '$2y$10$3i9/lVd8UOFIJ6PAMFt8gu3/r5g0qeCJvoSlLCsvMTythye19F77a'), ), ), ); The ``pattern`` is a regular expression on the URL path; the ``http`` setting tells the security layer to use HTTP basic authentication and the ``users`` entry defines valid users. If you want to restrict the firewall by more than the URL pattern (like the HTTP method, the client IP, the hostname, or any Request attributes), use an instance of a `RequestMatcher `_ for the ``pattern`` option:: use Symfony\Component\HttpFoundation\RequestMatcher; $app['security.firewalls'] = array( 'admin' => array( 'pattern' => new RequestMatcher('^/admin', 'example.com', 'POST'), // ... ), ); Each user is defined with the following information: * The role or an array of roles for the user (roles are strings beginning with ``ROLE_`` and ending with anything you want); * The user encoded password. .. caution:: All users must at least have one role associated with them. The default configuration of the extension enforces encoded passwords. To generate a valid encoded password from a raw password, use the ``security.encoder_factory`` service:: // find the encoder for a UserInterface instance $encoder = $app['security.encoder_factory']->getEncoder($user); // compute the encoded password for foo $password = $encoder->encodePassword('foo', $user->getSalt()); When the user is authenticated, the user stored in the token is an instance of `User `_ .. caution:: If you are using php-cgi under Apache, you need to add this configuration to make things work correctly: .. code-block:: apache RewriteEngine On RewriteCond %{HTTP:Authorization} ^(.+)$ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ app.php [QSA,L] Securing a Path with a Form ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Using a form to authenticate users is very similar to the above configuration. Instead of using the ``http`` setting, use the ``form`` one and define these two parameters: * **login_path**: The login path where the user is redirected when they are accessing a secured area without being authenticated so that they can enter their credentials; * **check_path**: The check URL used by Symfony to validate the credentials of the user. Here is how to secure all URLs under ``/admin/`` with a form:: $app['security.firewalls'] = array( 'admin' => array( 'pattern' => '^/admin/', 'form' => array('login_path' => '/login', 'check_path' => '/admin/login_check'), 'users' => array( 'admin' => array('ROLE_ADMIN', '$2y$10$3i9/lVd8UOFIJ6PAMFt8gu3/r5g0qeCJvoSlLCsvMTythye19F77a'), ), ), ); Always keep in mind the following two golden rules: * The ``login_path`` path must always be defined **outside** the secured area (or if it is in the secured area, the ``anonymous`` authentication mechanism must be enabled -- see below); * The ``check_path`` path must always be defined **inside** the secured area. For the login form to work, create a controller like the following:: use Symfony\Component\HttpFoundation\Request; $app->get('/login', function(Request $request) use ($app) { return $app['twig']->render('login.html', array( 'error' => $app['security.last_error']($request), 'last_username' => $app['session']->get('_security.last_username'), )); }); The ``error`` and ``last_username`` variables contain the last authentication error and the last username entered by the user in case of an authentication error. If you want to have the last error message translated, you would need to use the ``security.authentication_utils`` service and retrieve the actual ``AuthenticationException`` instance. Create the associated template: .. code-block:: jinja
{{ error }}
.. note:: The ``admin_login_check`` route is automatically defined by Silex and its name is derived from the ``check_path`` value (all ``/`` are replaced with ``_`` and the leading ``/`` is stripped). Defining more than one Firewall ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You are not limited to define one firewall per project. Configuring several firewalls is useful when you want to secure different parts of your website with different authentication strategies or for different users (like using an HTTP basic authentication for the website API and a form to secure your website administration area). It's also useful when you want to secure all URLs except the login form:: $app['security.firewalls'] = array( 'login' => array( 'pattern' => '^/login$', ), 'secured' => array( 'pattern' => '^.*$', 'form' => array('login_path' => '/login', 'check_path' => '/login_check'), 'users' => array( 'admin' => array('ROLE_ADMIN', '$2y$10$3i9/lVd8UOFIJ6PAMFt8gu3/r5g0qeCJvoSlLCsvMTythye19F77a'), ), ), ); The order of the firewall configurations is significant as the first one to match wins. The above configuration first ensures that the ``/login`` URL is not secured (no authentication settings), and then it secures all other URLs. .. tip:: You can toggle all registered authentication mechanisms for a particular area on and off with the ``security`` flag:: $app['security.firewalls'] = array( 'api' => array( 'pattern' => '^/api', 'security' => $app['debug'] ? false : true, 'wsse' => true, // ... ), ); Adding a Logout ~~~~~~~~~~~~~~~ When using a form for authentication, you can let users log out if you add the ``logout`` setting, where ``logout_path`` must match the main firewall pattern:: $app['security.firewalls'] = array( 'secured' => array( 'pattern' => '^/admin/', 'form' => array('login_path' => '/login', 'check_path' => '/admin/login_check'), 'logout' => array('logout_path' => '/admin/logout', 'invalidate_session' => true), // ... ), ); A route is automatically generated, based on the configured path (all ``/`` are replaced with ``_`` and the leading ``/`` is stripped): .. code-block:: jinja Logout Allowing Anonymous Users ~~~~~~~~~~~~~~~~~~~~~~~~ When securing only some parts of your website, the user information are not available in non-secured areas. To make the user accessible in such areas, enabled the ``anonymous`` authentication mechanism:: $app['security.firewalls'] = array( 'unsecured' => array( 'anonymous' => true, // ... ), ); When enabling the anonymous setting, a user will always be accessible from the security context; if the user is not authenticated, it returns the ``anon.`` string. Checking User Roles ~~~~~~~~~~~~~~~~~~~ To check if a user is granted some role, use the ``isGranted()`` method on the security context:: if ($app['security.authorization_checker']->isGranted('ROLE_ADMIN')) { // ... } You can check roles in Twig templates too: .. code-block:: jinja {% if is_granted('ROLE_ADMIN') %} Switch to Fabien {% endif %} You can check if a user is "fully authenticated" (not an anonymous user for instance) with the special ``IS_AUTHENTICATED_FULLY`` role: .. code-block:: jinja {% if is_granted('IS_AUTHENTICATED_FULLY') %} Logout {% else %} Login {% endif %} Of course you will need to define a ``login`` route for this to work. .. tip:: Don't use the ``getRoles()`` method to check user roles. .. caution:: ``isGranted()`` throws an exception when no authentication information is available (which is the case on non-secured area). Impersonating a User ~~~~~~~~~~~~~~~~~~~~ If you want to be able to switch to another user (without knowing the user credentials), enable the ``switch_user`` authentication strategy:: $app['security.firewalls'] = array( 'unsecured' => array( 'switch_user' => array('parameter' => '_switch_user', 'role' => 'ROLE_ALLOWED_TO_SWITCH'), // ... ), ); Switching to another user is now a matter of adding the ``_switch_user`` query parameter to any URL when logged in as a user who has the ``ROLE_ALLOWED_TO_SWITCH`` role: .. code-block:: jinja {% if is_granted('ROLE_ALLOWED_TO_SWITCH') %} Switch to user Fabien {% endif %} You can check that you are impersonating a user by checking the special ``ROLE_PREVIOUS_ADMIN``. This is useful for instance to allow the user to switch back to their primary account: .. code-block:: jinja {% if is_granted('ROLE_PREVIOUS_ADMIN') %} You are an admin but you've switched to another user, exit the switch. {% endif %} Sharing Security Context between multiple Firewalls ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ By default, all the firewalls have a different **security context**. In case you need to share the same security context between multiple firewalls you can set the ``context`` setting for each firewall you want the context to be shared with. .. code-block:: php $app['security.firewalls'] = array( 'login' => array( 'context' => 'admin_security', 'pattern' => '^/login', // ... ), 'secured' => array( 'context' => 'admin_security', 'pattern' => '^/admin/', 'form' => array('login_path' => '/login', 'check_path' => '/admin/login_check'), 'users' => array( 'admin' => array('ROLE_ADMIN', '$2y$10$3i9/lVd8UOFIJ6PAMFt8gu3/r5g0qeCJvoSlLCsvMTythye19F77a'), ), // ... ), ); Above configuration ensures that you have the same security context ``admin_security`` inside both, ``login`` and ``admin`` firewalls. This might be useful for instance to redirect already logged in users to the secured area of your website when they visit the login form, as you have the possibility to check if the user has been granted the ``ROLE_ADMIN`` role inside the ``login`` firewall. Defining a Role Hierarchy ~~~~~~~~~~~~~~~~~~~~~~~~~ Defining a role hierarchy allows to automatically grant users some additional roles:: $app['security.role_hierarchy'] = array( 'ROLE_ADMIN' => array('ROLE_USER', 'ROLE_ALLOWED_TO_SWITCH'), ); With this configuration, all users with the ``ROLE_ADMIN`` role also automatically have the ``ROLE_USER`` and ``ROLE_ALLOWED_TO_SWITCH`` roles. Defining Access Rules ~~~~~~~~~~~~~~~~~~~~~ Roles are a great way to adapt the behavior of your website depending on groups of users, but they can also be used to further secure some areas by defining access rules:: $app['security.access_rules'] = array( array('^/admin', 'ROLE_ADMIN', 'https'), array('^.*$', 'ROLE_USER'), ); With the above configuration, users must have the ``ROLE_ADMIN`` to access the ``/admin`` section of the website, and ``ROLE_USER`` for everything else. Furthermore, the admin section can only be accessible via HTTPS (if that's not the case, the user will be automatically redirected). .. note:: The first argument can also be a `RequestMatcher `_ instance. Defining a custom User Provider ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Using an array of users is simple and useful when securing an admin section of a personal website, but you can override this default mechanism with you own. The ``users`` setting can be defined as a service or a service id that returns an instance of `UserProviderInterface `_:: 'users' => function () use ($app) { return new UserProvider($app['db']); }, Here is a simple example of a user provider, where Doctrine DBAL is used to store the users:: use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\User; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; use Doctrine\DBAL\Connection; class UserProvider implements UserProviderInterface { private $conn; public function __construct(Connection $conn) { $this->conn = $conn; } public function loadUserByUsername($username) { $stmt = $this->conn->executeQuery('SELECT * FROM users WHERE username = ?', array(strtolower($username))); if (!$user = $stmt->fetch()) { throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username)); } return new User($user['username'], $user['password'], explode(',', $user['roles']), true, true, true, true); } public function refreshUser(UserInterface $user) { if (!$user instanceof User) { throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user))); } return $this->loadUserByUsername($user->getUsername()); } public function supportsClass($class) { return $class === 'Symfony\Component\Security\Core\User\User'; } } In this example, instances of the default ``User`` class are created for the users, but you can define your own class; the only requirement is that the class must implement `UserInterface `_ And here is the code that you can use to create the database schema and some sample users:: use Doctrine\DBAL\Schema\Table; $schema = $app['db']->getSchemaManager(); if (!$schema->tablesExist('users')) { $users = new Table('users'); $users->addColumn('id', 'integer', array('unsigned' => true, 'autoincrement' => true)); $users->setPrimaryKey(array('id')); $users->addColumn('username', 'string', array('length' => 32)); $users->addUniqueIndex(array('username')); $users->addColumn('password', 'string', array('length' => 255)); $users->addColumn('roles', 'string', array('length' => 255)); $schema->createTable($users); $app['db']->insert('users', array( 'username' => 'fabien', 'password' => '$2y$10$3i9/lVd8UOFIJ6PAMFt8gu3/r5g0qeCJvoSlLCsvMTythye19F77a', 'roles' => 'ROLE_USER' )); $app['db']->insert('users', array( 'username' => 'admin', 'password' => '$2y$10$3i9/lVd8UOFIJ6PAMFt8gu3/r5g0qeCJvoSlLCsvMTythye19F77a', 'roles' => 'ROLE_ADMIN' )); } .. tip:: If you are using the Doctrine ORM, the Symfony bridge for Doctrine provides a user provider class that is able to load users from your entities. Defining a custom Encoder ~~~~~~~~~~~~~~~~~~~~~~~~~ By default, Silex uses the ``BCrypt`` algorithm to encode passwords. Additionally, the password is encoded multiple times. You can change these defaults by overriding ``security.default_encoder`` service to return one of the predefined encoders: * **security.encoder.digest**: Digest password encoder. * **security.encoder.bcrypt**: BCrypt password encoder. * **security.encoder.pbkdf2**: Pbkdf2 password encoder. .. code-block:: php $app['security.default_encoder'] = function ($app) { return $app['security.encoder.pbkdf2']; }; Or you can define you own, fully customizable encoder:: use Symfony\Component\Security\Core\Encoder\PlaintextPasswordEncoder; $app['security.default_encoder'] = function ($app) { // Plain text (e.g. for debugging) return new PlaintextPasswordEncoder(); }; .. tip:: You can change the default BCrypt encoding cost by overriding ``security.encoder.bcrypt.cost`` Defining a custom Authentication Provider ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The Symfony Security component provides a lot of ready-to-use authentication providers (form, HTTP, X509, remember me, ...), but you can add new ones easily. To register a new authentication provider, create a service named ``security.authentication_listener.factory.XXX`` where ``XXX`` is the name you want to use in your configuration:: $app['security.authentication_listener.factory.wsse'] = $app->protect(function ($name, $options) use ($app) { // define the authentication provider object $app['security.authentication_provider.'.$name.'.wsse'] = function () use ($app) { return new WsseProvider($app['security.user_provider.default'], __DIR__.'/security_cache'); }; // define the authentication listener object $app['security.authentication_listener.'.$name.'.wsse'] = function () use ($app) { return new WsseListener($app['security.token_storage'], $app['security.authentication_manager']); }; return array( // the authentication provider id 'security.authentication_provider.'.$name.'.wsse', // the authentication listener id 'security.authentication_listener.'.$name.'.wsse', // the entry point id null, // the position of the listener in the stack 'pre_auth' ); }); You can now use it in your configuration like any other built-in authentication provider:: $app->register(new Silex\Provider\SecurityServiceProvider(), array( 'security.firewalls' => array( 'default' => array( 'wsse' => true, // ... ), ), )); Instead of ``true``, you can also define an array of options that customize the behavior of your authentication factory; it will be passed as the second argument of your authentication factory (see above). This example uses the authentication provider classes as described in the Symfony `cookbook`_. .. note:: The Guard component simplifies the creation of custom authentication providers. :doc:`How to Create a Custom Authentication System with Guard ` Stateless Authentication ~~~~~~~~~~~~~~~~~~~~~~~~ By default, a session cookie is created to persist the security context of the user. However, if you use certificates, HTTP authentication, WSSE and so on, the credentials are sent for each request. In that case, you can turn off persistence by activating the ``stateless`` authentication flag:: $app['security.firewalls'] = array( 'default' => array( 'stateless' => true, 'wsse' => true, // ... ), ); Traits ------ ``Silex\Application\SecurityTrait`` adds the following shortcuts: * **encodePassword**: Encode a given password. .. code-block:: php $encoded = $app->encodePassword($app['user'], 'foo'); ``Silex\Route\SecurityTrait`` adds the following methods to the controllers: * **secure**: Secures a controller for the given roles. .. code-block:: php $app->get('/', function () { // do something but only for admins })->secure('ROLE_ADMIN'); .. caution:: The ``Silex\Route\SecurityTrait`` must be used with a user defined ``Route`` class, not the application. .. code-block:: php use Silex\Route; class MyRoute extends Route { use Route\SecurityTrait; } .. code-block:: php $app['route_class'] = 'MyRoute'; .. _cookbook: http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html src/Silex/doc/providers/serializer.rst000066400000000000000000000056211516072260400204250ustar00rootroot00000000000000Serializer ========== The *SerializerServiceProvider* provides a service for serializing objects. Parameters ---------- None. Services -------- * **serializer**: An instance of `Symfony\\Component\\Serializer\\Serializer `_. * **serializer.encoders**: `Symfony\\Component\\Serializer\\Encoder\\JsonEncoder `_ and `Symfony\\Component\\Serializer\\Encoder\\XmlEncoder `_. * **serializer.normalizers**: `Symfony\\Component\\Serializer\\Normalizer\\CustomNormalizer `_ and `Symfony\\Component\\Serializer\\Normalizer\\GetSetMethodNormalizer `_. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\SerializerServiceProvider()); .. note:: Add the Symfony's `Serializer Component `_ as a dependency: .. code-block:: bash composer require symfony/serializer Usage ----- The ``SerializerServiceProvider`` provider provides a ``serializer`` service:: use Silex\Application; use Silex\Provider\SerializerServiceProvider; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; $app = new Application(); $app->register(new SerializerServiceProvider()); // only accept content types supported by the serializer via the assert method. $app->get("/pages/{id}.{_format}", function (Request $request, $id) use ($app) { // assume a page_repository service exists that returns Page objects. The // object returned has getters and setters exposing the state. $page = $app['page_repository']->find($id); $format = $request->getRequestFormat(); if (!$page instanceof Page) { $app->abort("No page found for id: $id"); } return new Response($app['serializer']->serialize($page, $format), 200, array( "Content-Type" => $request->getMimeType($format) )); })->assert("_format", "xml|json") ->assert("id", "\d+"); Using a Cache ------------- To use a cache, register a class implementing ``Doctrine\Common\Cache\Cache``:: $app->register(new Silex\Provider\SerializerServiceProvider()); $app['serializer.normalizers'] = function () use ($app) { return [new \Symfony\Component\Serializer\Normalizer\CustomNormalizer(), new \Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer(new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()), $app['my_custom_cache'])) ]; }; src/Silex/doc/providers/service_controller.rst000066400000000000000000000107751516072260400221650ustar00rootroot00000000000000Service Controllers =================== As your Silex application grows, you may wish to begin organizing your controllers in a more formal fashion. Silex can use controller classes out of the box, but with a bit of work, your controllers can be created as services, giving you the full power of dependency injection and lazy loading. .. ::todo Link above to controller classes cookbook Why would I want to do this? ---------------------------- - Dependency Injection over Service Location Using this method, you can inject the actual dependencies required by your controller and gain total inversion of control, while still maintaining the lazy loading of your controllers and its dependencies. Because your dependencies are clearly defined, they are easily mocked, allowing you to test your controllers in isolation. - Framework Independence Using this method, your controllers start to become more independent of the framework you are using. Carefully crafted, your controllers will become reusable with multiple frameworks. By keeping careful control of your dependencies, your controllers could easily become compatible with Silex, Symfony (full stack) and Drupal, to name just a few. Parameters ---------- There are currently no parameters for the ``ServiceControllerServiceProvider``. Services -------- There are no extra services provided, the ``ServiceControllerServiceProvider`` simply extends the existing **resolver** service. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\ServiceControllerServiceProvider()); Usage ----- In this slightly contrived example of a blog API, we're going to change the ``/posts.json`` route to use a controller, that is defined as a service. .. code-block:: php use Silex\Application; use Demo\Repository\PostRepository; $app = new Application(); $app['posts.repository'] = function() { return new PostRepository; }; $app->get('/posts.json', function() use ($app) { return $app->json($app['posts.repository']->findAll()); }); Rewriting your controller as a service is pretty simple, create a Plain Ol' PHP Object with your ``PostRepository`` as a dependency, along with an ``indexJsonAction`` method to handle the request. Although not shown in the example below, you can use type hinting and parameter naming to get the parameters you need, just like with standard Silex routes. If you are a TDD/BDD fan (and you should be), you may notice that this controller has well defined responsibilities and dependencies, and is easily tested/specced. You may also notice that the only external dependency is on ``Symfony\Component\HttpFoundation\JsonResponse``, meaning this controller could easily be used in a Symfony (full stack) application, or potentially with other applications or frameworks that know how to handle a `Symfony/HttpFoundation `_ ``Response`` object. .. code-block:: php namespace Demo\Controller; use Demo\Repository\PostRepository; use Symfony\Component\HttpFoundation\JsonResponse; class PostController { protected $repo; public function __construct(PostRepository $repo) { $this->repo = $repo; } public function indexJsonAction() { return new JsonResponse($this->repo->findAll()); } } And lastly, define your controller as a service in the application, along with your route. The syntax in the route definition is the name of the service, followed by a single colon (:), followed by the method name. .. code-block:: php $app['posts.controller'] = function() use ($app) { return new PostController($app['posts.repository']); }; $app->get('/posts.json', "posts.controller:indexJsonAction"); In addition to using classes for service controllers, you can define any callable as a service in the application to be used for a route. .. code-block:: php namespace Demo\Controller; use Demo\Repository\PostRepository; use Symfony\Component\HttpFoundation\JsonResponse; function postIndexJson(PostRepository $repo) { return function() use ($repo) { return new JsonResponse($repo->findAll()); }; } And when defining your route, the code would look like the following: .. code-block:: php $app['posts.controller'] = function($app) { return Demo\Controller\postIndexJson($app['posts.repository']); }; $app->get('/posts.json', 'posts.controller'); src/Silex/doc/providers/session.rst000066400000000000000000000121231516072260400177320ustar00rootroot00000000000000Session ======= The *SessionServiceProvider* provides a service for storing data persistently between requests. Parameters ---------- * **session.storage.save_path** (optional): The path for the ``NativeFileSessionHandler``, defaults to the value of ``sys_get_temp_dir()``. * **session.storage.options**: An array of options that is passed to the constructor of the ``session.storage`` service. In case of the default `NativeSessionStorage `_, the most useful options are: * **name**: The cookie name (_SESS by default) * **id**: The session id (null by default) * **cookie_lifetime**: Cookie lifetime * **cookie_path**: Cookie path * **cookie_domain**: Cookie domain * **cookie_secure**: Cookie secure (HTTPS) * **cookie_httponly**: Whether the cookie is http only However, all of these are optional. Default Sessions life time is 1800 seconds (30 minutes). To override this, set the ``lifetime`` option. For a full list of available options, read the `PHP `_ official documentation. * **session.test**: Whether to simulate sessions or not (useful when writing functional tests). * **session.attribute_bag** (optional): The attribute bag service to use in the session. Instance of ``AttributeBagInterface``. * **session.flash_bag** (optional): The flash bag service to use in the session. Instance of ``FlashBagInterface``. Services -------- * **session**: An instance of Symfony's `Session `_. * **session.storage**: A service that is used for persistence of the session data. * **session.storage.handler**: A service that is used by the ``session.storage`` for data access. Defaults to a `NativeFileSessionHandler `_ storage handler. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\SessionServiceProvider()); Using Handlers -------------- The default session handler is ``NativeFileSessionHandler``. However, there are multiple handlers available for use by setting ``session.storage.handler`` to an instance of one of the following handler objects: * `LegacyPdoSessionHandler `_ * `MemcacheSessionHandler `_ * `MemcachedSessionHandler `_ * `MongoDbSessionHandler `_ * `NativeFileSessionHandler `_ * `NativeSessionHandler `_ * `NullSessionHandler `_ * `PdoSessionHandler `_ * `WriteCheckSessionHandler `_ Usage ----- The Session provider provides a ``session`` service. Here is an example that authenticates a user and creates a session for them:: use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; $app->get('/login', function (Request $request) use ($app) { $username = $request->server->get('PHP_AUTH_USER', false); $password = $request->server->get('PHP_AUTH_PW'); if ('igor' === $username && 'password' === $password) { $app['session']->set('user', array('username' => $username)); return $app->redirect('/account'); } $response = new Response(); $response->headers->set('WWW-Authenticate', sprintf('Basic realm="%s"', 'site_login')); $response->setStatusCode(401, 'Please sign in.'); return $response; }); $app->get('/account', function () use ($app) { if (null === $user = $app['session']->get('user')) { return $app->redirect('/login'); } return "Welcome {$user['username']}!"; }); Custom Session Configurations ----------------------------- If your system is using a custom session configuration (such as a redis handler from a PHP extension) then you need to disable the NativeFileSessionHandler by setting ``session.storage.handler`` to null. You will have to configure the ``session.save_path`` ini setting yourself in that case. .. code-block:: php $app['session.storage.handler'] = null; src/Silex/doc/providers/swiftmailer.rst000066400000000000000000000110451516072260400205770ustar00rootroot00000000000000Swiftmailer =========== The *SwiftmailerServiceProvider* provides a service for sending email through the `Swift Mailer `_ library. You can use the ``mailer`` service to send messages easily. By default, it will attempt to send emails through SMTP. Parameters ---------- * **swiftmailer.use_spool**: A boolean to specify whether or not to use the memory spool, defaults to true. * **swiftmailer.options**: An array of options for the default SMTP-based configuration. The following options can be set: * **host**: SMTP hostname, defaults to 'localhost'. * **port**: SMTP port, defaults to 25. * **username**: SMTP username, defaults to an empty string. * **password**: SMTP password, defaults to an empty string. * **encryption**: SMTP encryption, defaults to null. Valid values are 'tls', 'ssl', or null (indicating no encryption). * **auth_mode**: SMTP authentication mode, defaults to null. Valid values are 'plain', 'login', 'cram-md5', or null. Example usage:: $app['swiftmailer.options'] = array( 'host' => 'host', 'port' => '25', 'username' => 'username', 'password' => 'password', 'encryption' => null, 'auth_mode' => null ); * **swiftmailer.sender_address**: If set, all messages will be delivered with this address as the "return path" address. * **swiftmailer.delivery_addresses**: If not empty, all email messages will be sent to those addresses instead of being sent to their actual recipients. This is often useful when developing. * **swiftmailer.delivery_whitelist**: Used in combination with ``delivery_addresses``. If set, emails matching any of these patterns will be delivered like normal, as well as being sent to ``delivery_addresses``. * **swiftmailer.plugins**: Array of SwiftMailer plugins. Example usage:: $app['swiftmailer.plugins'] = function ($app) { return array( new \Swift_Plugins_PopBeforeSmtpPlugin('pop3.example.com'), ); }; Services -------- * **mailer**: The mailer instance. Example usage:: $message = \Swift_Message::newInstance(); // ... $app['mailer']->send($message); * **swiftmailer.transport**: The transport used for e-mail delivery. Defaults to a ``Swift_Transport_EsmtpTransport``. * **swiftmailer.transport.buffer**: StreamBuffer used by the transport. * **swiftmailer.transport.authhandler**: Authentication handler used by the transport. Will try the following by default: CRAM-MD5, login, plaintext. * **swiftmailer.transport.eventdispatcher**: Internal event dispatcher used by Swiftmailer. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\SwiftmailerServiceProvider()); .. note:: Add SwiftMailer as a dependency: .. code-block:: bash composer require swiftmailer/swiftmailer Usage ----- The Swiftmailer provider provides a ``mailer`` service:: use Symfony\Component\HttpFoundation\Request; $app->post('/feedback', function (Request $request) use ($app) { $message = \Swift_Message::newInstance() ->setSubject('[YourSite] Feedback') ->setFrom(array('noreply@yoursite.com')) ->setTo(array('feedback@yoursite.com')) ->setBody($request->get('message')); $app['mailer']->send($message); return new Response('Thank you for your feedback!', 201); }); Usage in commands ~~~~~~~~~~~~~~~~~ By default, the Swiftmailer provider sends the emails using the ``KernelEvents::TERMINATE`` event, which is fired after the response has been sent. However, as this event isn't fired for console commands, your emails won't be sent. For that reason, if you send emails using a command console, it is recommended that you disable the use of the memory spool (before accessing ``$app['mailer']``):: $app['swiftmailer.use_spool'] = false; Alternatively, you can just make sure to flush the message spool by hand before ending the command execution. To do so, use the following code:: $app['swiftmailer.spooltransport'] ->getSpool() ->flushQueue($app['swiftmailer.transport']) ; Traits ------ ``Silex\Application\SwiftmailerTrait`` adds the following shortcuts: * **mail**: Sends an email. .. code-block:: php $app->mail(\Swift_Message::newInstance() ->setSubject('[YourSite] Feedback') ->setFrom(array('noreply@yoursite.com')) ->setTo(array('feedback@yoursite.com')) ->setBody($request->get('message'))); For more information, check out the `Swift Mailer documentation `_. src/Silex/doc/providers/translation.rst000066400000000000000000000135451516072260400206160ustar00rootroot00000000000000Translation =========== The *TranslationServiceProvider* provides a service for translating your application into different languages. Parameters ---------- * **translator.domains** (optional): A mapping of domains/locales/messages. This parameter contains the translation data for all languages and domains. * **locale** (optional): The locale for the translator. You will most likely want to set this based on some request parameter. Defaults to ``en``. * **locale_fallbacks** (optional): Fallback locales for the translator. It will be used when the current locale has no messages set. Defaults to ``en``. * **translator.cache_dir** (optional): Defines the cache directory if you want translations to be cached. Services -------- * **translator**: An instance of `Translator `_, that is used for translation. * **translator.loader**: An instance of an implementation of the translation `LoaderInterface `_, defaults to an `ArrayLoader `_. * **translator.message_selector**: An instance of `MessageSelector `_. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\LocaleServiceProvider()); $app->register(new Silex\Provider\TranslationServiceProvider(), array( 'locale_fallbacks' => array('en'), )); .. note:: Add the Symfony Translation Component as a dependency: .. code-block:: bash composer require symfony/translation Usage ----- The Translation provider provides a ``translator`` service and makes use of the ``translator.domains`` parameter:: $app['translator.domains'] = array( 'messages' => array( 'en' => array( 'hello' => 'Hello %name%', 'goodbye' => 'Goodbye %name%', ), 'de' => array( 'hello' => 'Hallo %name%', 'goodbye' => 'Tschüss %name%', ), 'fr' => array( 'hello' => 'Bonjour %name%', 'goodbye' => 'Au revoir %name%', ), ), 'validators' => array( 'fr' => array( 'This value should be a valid number.' => 'Cette valeur doit être un nombre.', ), ), ); $app->get('/{_locale}/{message}/{name}', function ($message, $name) use ($app) { return $app['translator']->trans($message, array('%name%' => $name)); }); The above example will result in following routes: * ``/en/hello/igor`` will return ``Hello igor``. * ``/de/hello/igor`` will return ``Hallo igor``. * ``/fr/hello/igor`` will return ``Bonjour igor``. * ``/it/hello/igor`` will return ``Hello igor`` (because of the fallback). Using Resources --------------- When translations are stored in a file, you can load them as follows:: $app = new Application(); $app->register(new TranslationServiceProvider()); $app->extend('translator.resources', function ($resources, $app) { $resources = array_merge($resources, array( array('array', array('This value should be a valid number.' => 'Cette valeur doit être un nombre.'), 'fr', 'validators'), )); return $resources; }); Traits ------ ``Silex\Application\TranslationTrait`` adds the following shortcuts: * **trans**: Translates the given message. * **transChoice**: Translates the given choice message by choosing a translation according to a number. .. code-block:: php $app->trans('Hello World'); $app->transChoice('Hello World'); Recipes ------- YAML-based language files ~~~~~~~~~~~~~~~~~~~~~~~~~ Having your translations in PHP files can be inconvenient. This recipe will show you how to load translations from external YAML files. First, add the Symfony ``Config`` and ``Yaml`` components as dependencies: .. code-block:: bash composer require symfony/config symfony/yaml Next, you have to create the language mappings in YAML files. A naming you can use is ``locales/en.yml``. Just do the mapping in this file as follows: .. code-block:: yaml hello: Hello %name% goodbye: Goodbye %name% Then, register the ``YamlFileLoader`` on the ``translator`` and add all your translation files:: use Symfony\Component\Translation\Loader\YamlFileLoader; $app->extend('translator', function($translator, $app) { $translator->addLoader('yaml', new YamlFileLoader()); $translator->addResource('yaml', __DIR__.'/locales/en.yml', 'en'); $translator->addResource('yaml', __DIR__.'/locales/de.yml', 'de'); $translator->addResource('yaml', __DIR__.'/locales/fr.yml', 'fr'); return $translator; }); XLIFF-based language files ~~~~~~~~~~~~~~~~~~~~~~~~~~ Just as you would do with YAML translation files, you first need to add the Symfony ``Config`` component as a dependency (see above for details). Then, similarly, create XLIFF files in your locales directory and add them to the translator:: $translator->addResource('xliff', __DIR__.'/locales/en.xlf', 'en'); $translator->addResource('xliff', __DIR__.'/locales/de.xlf', 'de'); $translator->addResource('xliff', __DIR__.'/locales/fr.xlf', 'fr'); .. note:: The XLIFF loader is already pre-configured by the extension. Accessing translations in Twig templates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Once loaded, the translation service provider is available from within Twig templates when using the Twig bridge provided by Symfony (see :doc:`TwigServiceProvider `): .. code-block:: jinja {{ 'translation_key'|trans }} {{ 'translation_key'|transchoice }} {% trans %}translation_key{% endtrans %} src/Silex/doc/providers/twig.rst000066400000000000000000000167241516072260400172340ustar00rootroot00000000000000Twig ==== The *TwigServiceProvider* provides integration with the `Twig `_ template engine. Parameters ---------- * **twig.path** (optional): Path to the directory containing twig template files (it can also be an array of paths). * **twig.templates** (optional): An associative array of template names to template contents. Use this if you want to define your templates inline. * **twig.options** (optional): An associative array of twig options. Check out the `twig documentation `_ for more information. * **twig.form.templates** (optional): An array of templates used to render forms (only available when the ``FormServiceProvider`` is enabled). The default theme is ``form_div_layout.html.twig``, but you can use the other built-in themes: ``form_table_layout.html.twig``, ``bootstrap_3_layout.html.twig``, and ``bootstrap_3_horizontal_layout.html.twig``. * **twig.date.format** (optional): Default format used by the ``date`` filter. The format string must conform to the format accepted by `date() `_. * **twig.date.interval_format** (optional): Default format used by the ``date`` filter when the filtered data is of type `DateInterval `_. The format string must conform to the format accepted by `DateInterval::format() `_. * **twig.date.timezone** (optional): Default timezone used when formatting dates. If set to ``null`` the timezone returned by `date_default_timezone_get() `_ is used. * **twig.number_format.decimals** (optional): Default number of decimals displayed by the ``number_format`` filter. * **twig.number_format.decimal_point** (optional): Default separator for the decimal point used by the ``number_format`` filter. * **twig.number_format.thousands_separator** (optional): Default thousands separator used by the ``number_format`` filter. Services -------- * **twig**: The ``\Twig\Environment`` instance. The main way of interacting with Twig. * **twig.loader**: The loader for Twig templates which uses the ``twig.path`` and the ``twig.templates`` options. You can also replace the loader completely. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\TwigServiceProvider(), array( 'twig.path' => __DIR__.'/views', )); .. note:: Add Twig as a dependency: .. code-block:: bash composer require twig/twig Usage ----- The Twig provider provides a ``twig`` service that can render templates:: $app->get('/hello/{name}', function ($name) use ($app) { return $app['twig']->render('hello.twig', array( 'name' => $name, )); }); Symfony Components Integration ------------------------------ Symfony provides a Twig bridge that provides additional integration between some Symfony components and Twig. Add it as a dependency: .. code-block:: bash composer require symfony/twig-bridge When present, the ``TwigServiceProvider`` will provide you with the following additional capabilities. * Access to the ``path()`` and ``url()`` functions. You can find more information in the `Symfony Routing documentation `_: .. code-block:: jinja {{ path('homepage') }} {{ url('homepage') }} {# generates the absolute url http://example.org/ #} {{ path('hello', {name: 'Fabien'}) }} {{ url('hello', {name: 'Fabien'}) }} {# generates the absolute url http://example.org/hello/Fabien #} * Access to the ``absolute_url()`` and ``relative_path()`` Twig functions. Translations Support ~~~~~~~~~~~~~~~~~~~~ If you are using the ``TranslationServiceProvider``, you will get the ``trans()`` and ``transchoice()`` functions for translation in Twig templates. You can find more information in the `Symfony Translation documentation `_. Form Support ~~~~~~~~~~~~ If you are using the ``FormServiceProvider``, you will get a set of helpers for working with forms in templates. You can find more information in the `Symfony Forms reference `_. Security Support ~~~~~~~~~~~~~~~~ If you are using the ``SecurityServiceProvider``, you will have access to the ``is_granted()`` function in templates. You can find more information in the `Symfony Security documentation `_. Web Link Support ~~~~~~~~~~~~~~~~ If you are using the ``symfony/web-link`` component, you will have access to the ``preload()``, ``prefetch()``, ``prerender()``, ``dns_prefetch()``, ``preconnect()`` and ``link()`` functions in templates. You can find more information in the `Symfony WebLink documentation `_. Global Variable ~~~~~~~~~~~~~~~ When the Twig bridge is available, the ``global`` variable refers to an instance of `AppVariable `_. It gives access to the following methods: .. code-block:: jinja {# The current Request #} {{ global.request }} {# The current User (when security is enabled) #} {{ global.user }} {# The current Session #} {{ global.session }} {# The debug flag #} {{ global.debug }} {# The flash messages (Symfony 3.3 or later) #} {{ global.flashes }} Rendering a Controller ~~~~~~~~~~~~~~~~~~~~~~ A ``render`` function is also registered to help you render another controller from a template (available when the :doc:`HttpFragment Service Provider ` is registered): .. code-block:: jinja {{ render(url('sidebar')) }} {# or you can reference a controller directly without defining a route for it #} {{ render(controller(controller)) }} .. note:: You must prepend the ``app.request.baseUrl`` to render calls to ensure that the render works when deployed into a sub-directory of the docroot. .. note:: Read the Twig `reference`_ for Symfony document to learn more about the various Twig functions. Traits ------ ``Silex\Application\TwigTrait`` adds the following shortcuts: * **render**: Renders a view with the given parameters and returns a Response object. .. code-block:: php return $app->render('index.html', ['name' => 'Fabien']); $response = new Response(); $response->setTtl(10); return $app->render('index.html', ['name' => 'Fabien'], $response); .. code-block:: php // stream a view use Symfony\Component\HttpFoundation\StreamedResponse; return $app->render('index.html', ['name' => 'Fabien'], new StreamedResponse()); * **renderView**: Renders a view with the given parameters and returns a string. .. code-block:: php $content = $app->renderView('index.html', ['name' => 'Fabien']); Customization ------------- You can configure the Twig environment before using it by extending the ``twig`` service:: $app->extend('twig', function($twig, $app) { $twig->addGlobal('pi', 3.14); $twig->addFilter('levenshtein', new \Twig_Filter_Function('levenshtein')); return $twig; }); For more information, check out the `official Twig documentation `_. .. _reference: https://symfony.com/doc/current/reference/twig_reference.html#controller src/Silex/doc/providers/validator.rst000066400000000000000000000151261516072260400202420ustar00rootroot00000000000000Validator ========= The *ValidatorServiceProvider* provides a service for validating data. It is most useful when used with the *FormServiceProvider*, but can also be used standalone. Parameters ---------- * **validator.validator_service_ids** (optional): An array of service names representing validators. * **validator.translation_domain** (optional): The translation domain to use for translating validator messages. (Defaults to ``validators``.) * **validator.object_initializers** (optional): An array of object initializers. See `the relevant Validation documentation `_. Services -------- * **validator**: An instance of `Validator `_. * **validator.mapping.class_metadata_factory**: Factory for metadata loaders, which can read validation constraint information from classes. Defaults to StaticMethodLoader--ClassMetadataFactory. This means you can define a static ``loadValidatorMetadata`` method on your data class, which takes a ClassMetadata argument. Then you can set constraints on this ClassMetadata instance. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\ValidatorServiceProvider()); .. note:: Add the Symfony Validator Component as a dependency: .. code-block:: bash composer require symfony/validator Usage ----- The Validator provider provides a ``validator`` service. Validating Values ~~~~~~~~~~~~~~~~~ You can validate values directly using the ``validate`` validator method:: use Symfony\Component\Validator\Constraints as Assert; $app->get('/validate/{email}', function ($email) use ($app) { $errors = $app['validator']->validate($email, new Assert\Email()); if (count($errors) > 0) { return (string) $errors; } else { return 'The email is valid'; } }); Validating Associative Arrays ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Validating associative arrays is like validating simple values, with a collection of constraints:: use Symfony\Component\Validator\Constraints as Assert; $book = array( 'title' => 'My Book', 'author' => array( 'first_name' => 'Fabien', 'last_name' => 'Potencier', ), ); $constraint = new Assert\Collection(array( 'title' => new Assert\Length(array('min' => 10)), 'author' => new Assert\Collection(array( 'first_name' => array(new Assert\NotBlank(), new Assert\Length(array('min' => 10))), 'last_name' => new Assert\Length(array('min' => 10)), )), )); $errors = $app['validator']->validate($book, $constraint); if (count($errors) > 0) { foreach ($errors as $error) { echo $error->getPropertyPath().' '.$error->getMessage()."\n"; } } else { echo 'The book is valid'; } Validating Objects ~~~~~~~~~~~~~~~~~~ If you want to add validations to a class, you can define the constraint for the class properties and getters, and then call the ``validate`` method:: use Symfony\Component\Validator\Constraints as Assert; class Book { public $title; public $author; } class Author { public $first_name; public $last_name; } $author = new Author(); $author->first_name = 'Fabien'; $author->last_name = 'Potencier'; $book = new Book(); $book->title = 'My Book'; $book->author = $author; $metadata = $app['validator.mapping.class_metadata_factory']->getMetadataFor('Author'); $metadata->addPropertyConstraint('first_name', new Assert\NotBlank()); $metadata->addPropertyConstraint('first_name', new Assert\Length(array('min' => 10))); $metadata->addPropertyConstraint('last_name', new Assert\Length(array('min' => 10))); $metadata = $app['validator.mapping.class_metadata_factory']->getMetadataFor('Book'); $metadata->addPropertyConstraint('title', new Assert\Length(array('min' => 10))); $metadata->addPropertyConstraint('author', new Assert\Valid()); $errors = $app['validator']->validate($book); if (count($errors) > 0) { foreach ($errors as $error) { echo $error->getPropertyPath().' '.$error->getMessage()."\n"; } } else { echo 'The author is valid'; } You can also declare the class constraint by adding a static ``loadValidatorMetadata`` method to your classes:: use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Constraints as Assert; class Book { public $title; public $author; static public function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('title', new Assert\Length(array('min' => 10))); $metadata->addPropertyConstraint('author', new Assert\Valid()); } } class Author { public $first_name; public $last_name; static public function loadValidatorMetadata(ClassMetadata $metadata) { $metadata->addPropertyConstraint('first_name', new Assert\NotBlank()); $metadata->addPropertyConstraint('first_name', new Assert\Length(array('min' => 10))); $metadata->addPropertyConstraint('last_name', new Assert\Length(array('min' => 10))); } } $app->get('/validate/{email}', function ($email) use ($app) { $author = new Author(); $author->first_name = 'Fabien'; $author->last_name = 'Potencier'; $book = new Book(); $book->title = 'My Book'; $book->author = $author; $errors = $app['validator']->validate($book); if (count($errors) > 0) { foreach ($errors as $error) { echo $error->getPropertyPath().' '.$error->getMessage()."\n"; } } else { echo 'The author is valid'; } }); .. note:: Use ``addGetterConstraint()`` to add constraints on getter methods and ``addConstraint()`` to add constraints on the class itself. Translation ~~~~~~~~~~~ To be able to translate the error messages, you can use the translator provider and register the messages under the ``validators`` domain:: $app['translator.domains'] = array( 'validators' => array( 'fr' => array( 'This value should be a valid number.' => 'Cette valeur doit être un nombre.', ), ), ); For more information, consult the `Symfony Validation documentation `_. src/Silex/doc/providers/var_dumper.rst000066400000000000000000000016511516072260400204170ustar00rootroot00000000000000Var Dumper ========== The *VarDumperServiceProvider* provides a mechanism that allows exploring then dumping any PHP variable. Parameters ---------- * **var_dumper.dump_destination**: A stream URL where dumps should be written to (defaults to ``null``). Services -------- * n/a Registering ----------- .. code-block:: php $app->register(new Silex\Provider\VarDumperServiceProvider()); .. note:: Add the Symfony VarDumper Component as a dependency: .. code-block:: bash composer require symfony/var-dumper Usage ----- Adding the VarDumper component as a Composer dependency gives you access to the ``dump()`` PHP function anywhere in your code. If you are using Twig, it also provides a ``dump()`` Twig function and a ``dump`` Twig tag. The VarDumperServiceProvider is also useful when used with the Silex WebProfiler as the dumps are made available in the web debug toolbar and in the web profiler. src/Silex/doc/services.rst000066400000000000000000000230001516072260400160510ustar00rootroot00000000000000Services ======== Silex is not only a framework, it is also a service container. It does this by extending `Pimple `_ which provides a very simple service container. Dependency Injection -------------------- .. note:: You can skip this if you already know what Dependency Injection is. Dependency Injection is a design pattern where you pass dependencies to services instead of creating them from within the service or relying on globals. This generally leads to code that is decoupled, re-usable, flexible and testable. Here is an example of a class that takes a ``User`` object and stores it as a file in JSON format:: class JsonUserPersister { private $basePath; public function __construct($basePath) { $this->basePath = $basePath; } public function persist(User $user) { $data = $user->getAttributes(); $json = json_encode($data); $filename = $this->basePath.'/'.$user->id.'.json'; file_put_contents($filename, $json, LOCK_EX); } } In this simple example the dependency is the ``basePath`` property. It is passed to the constructor. This means you can create several independent instances with different base paths. Of course dependencies do not have to be simple strings. More often they are in fact other services. A service container is responsible for creating and storing services. It can recursively create dependencies of the requested services and inject them. It does so lazily, which means a service is only created when you actually need it. Pimple ------ Pimple makes strong use of closures and implements the ArrayAccess interface. We will start off by creating a new instance of Pimple -- and because ``Silex\Application`` extends ``Pimple\Container`` all of this applies to Silex as well:: $container = new Pimple\Container(); or:: $app = new Silex\Application(); Parameters ~~~~~~~~~~ You can set parameters (which are usually strings) by setting an array key on the container:: $app['some_parameter'] = 'value'; The array key can be any value. By convention dots are used for namespacing:: $app['asset.host'] = 'http://cdn.mysite.com/'; Reading parameter values is possible with the same syntax:: echo $app['some_parameter']; Service definitions ~~~~~~~~~~~~~~~~~~~ Defining services is no different than defining parameters. You just set an array key on the container to be a closure. However, when you retrieve the service, the closure is executed. This allows for lazy service creation:: $app['some_service'] = function () { return new Service(); }; And to retrieve the service, use:: $service = $app['some_service']; On first invocation, this will create the service; the same instance will then be returned on any subsequent access. Factory services ~~~~~~~~~~~~~~~~ If you want a different instance to be returned for each service access, wrap the service definition with the ``factory()`` method:: $app['some_service'] = $app->factory(function () { return new Service(); }); Every time you call ``$app['some_service']``, a new instance of the service is created. Access container from closure ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In many cases you will want to access the service container from within a service definition closure. For example when fetching services the current service depends on. Because of this, the container is passed to the closure as an argument:: $app['some_service'] = function ($app) { return new Service($app['some_other_service'], $app['some_service.config']); }; Here you can see an example of Dependency Injection. ``some_service`` depends on ``some_other_service`` and takes ``some_service.config`` as configuration options. The dependency is only created when ``some_service`` is accessed, and it is possible to replace either of the dependencies by simply overriding those definitions. Going back to our initial example, here's how we could use the container to manage its dependencies:: $app['user.persist_path'] = '/tmp/users'; $app['user.persister'] = function ($app) { return new JsonUserPersister($app['user.persist_path']); }; Protected closures ~~~~~~~~~~~~~~~~~~ Because the container sees closures as factories for services, it will always execute them when reading them. In some cases you will however want to store a closure as a parameter, so that you can fetch it and execute it yourself -- with your own arguments. This is why Pimple allows you to protect your closures from being executed, by using the ``protect`` method:: $app['closure_parameter'] = $app->protect(function ($a, $b) { return $a + $b; }); // will not execute the closure $add = $app['closure_parameter']; // calling it now echo $add(2, 3); Note that the container is not provided as an argument to protected closures. However, you can inject it via `use($app)`:: $app['closure_parameter'] = $app->protect(function ($a, $b) use ($app) { // ... }); Modify services after definition ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sometimes you want to alter a service after its definition. Pimple facilitates this by extending the already defined service. First argument of the ``extend`` method is the name of the service you want to modify. Second argument is a callable. This callable is executed with the service you want to alter as its first argument, the service container itself is provided in the second argument. .. note:: Be sure to return the modified service in the callable. You can use this pattern to add functionality to :doc:Twig for example:: $app->extend('twig', function($twig, $app) { $twig->addGlobal('pi', 3.14); $twig->addFilter('levenshtein', new \Twig_Filter_Function('levenshtein')); return $twig; }); Core services ------------- Silex defines a range of services. * **request_stack**: Controls the lifecycle of requests, an instance of `RequestStack `_. It gives you access to ``GET``, ``POST`` parameters and lots more! Example usage:: $id = $app['request_stack']->getCurrentRequest()->get('id'); A request is only available when a request is being served; you can only access it from within a controller, an application before/after middlewares, or an error handler. * **routes**: The `RouteCollection `_ that is used internally. You can add, modify, read routes. * **url_generator**: An instance of `UrlGenerator `_, using the `RouteCollection `_ that is provided through the ``routes`` service. It has a ``generate`` method, which takes the route name as an argument, followed by an array of route parameters. * **controllers**: The ``Silex\ControllerCollection`` that is used internally. Check the :doc:`Internals chapter ` for more information. * **dispatcher**: The `EventDispatcher `_ that is used internally. It is the core of the Symfony system and is used quite a bit by Silex. * **resolver**: The `ControllerResolver `_ that is used internally. It takes care of executing the controller with the right arguments. * **kernel**: The `HttpKernel `_ that is used internally. The HttpKernel is the heart of Symfony, it takes a Request as input and returns a Response as output. * **request_context**: The request context is a simplified representation of the request that is used by the router and the URL generator. * **exception_handler**: The Exception handler is the default handler that is used when you don't register one via the ``error()`` method or if your handler does not return a Response. Disable it with ``unset($app['exception_handler'])``. * **logger**: A `LoggerInterface `_ instance. By default, logging is disabled as the value is set to ``null``. To enable logging you can either use the :doc:`MonologServiceProvider ` or define your own ``logger`` service that conforms to the PSR logger interface. Core traits ----------- * ``Silex\Application\UrlGeneratorTrait`` adds the following shortcuts: * **path**: Generates a path. * **url**: Generates an absolute URL. .. code-block:: php $app->path('homepage'); $app->url('homepage'); Core parameters --------------- * **request.http_port** (optional): Allows you to override the default port for non-HTTPS URLs. If the current request is HTTP, it will always use the current port. Defaults to 80. This parameter can be used when generating URLs. * **request.https_port** (optional): Allows you to override the default port for HTTPS URLs. If the current request is HTTPS, it will always use the current port. Defaults to 443. This parameter can be used when generating URLs. * **debug** (optional): Returns whether or not the application is running in debug mode. Defaults to false. * **charset** (optional): The charset to use for Responses. Defaults to UTF-8. src/Silex/doc/testing.rst000066400000000000000000000153761516072260400157240ustar00rootroot00000000000000Testing ======= Because Silex is built on top of Symfony, it is very easy to write functional tests for your application. Functional tests are automated software tests that ensure that your code is working correctly. They go through the user interface, using a fake browser, and mimic the actions a user would do. Why --- If you are not familiar with software tests, you may be wondering why you would need this. Every time you make a change to your application, you have to test it. This means going through all the pages and making sure they are still working. Functional tests save you a lot of time, because they enable you to test your application in usually under a second by running a single command. For more information on functional testing, unit testing, and automated software tests in general, check out `PHPUnit `_ and `Bulat Shakirzyanov's talk on Clean Code `_. PHPUnit ------- `PHPUnit `_ is the de-facto standard testing framework for PHP. It was built for writing unit tests, but it can be used for functional tests too. You write tests by creating a new class, that extends the ``PHPUnit\Framework\TestCase``. Your test cases are methods prefixed with ``test``:: use PHPUnit\Framework\TestCase; class ContactFormTest extends TestCase { public function testInitialPage() { ... } } In your test cases, you do assertions on the state of what you are testing. In this case we are testing a contact form, so we would want to assert that the page loaded correctly and contains our form:: public function testInitialPage() { $statusCode = ... $pageContent = ... $this->assertEquals(200, $statusCode); $this->assertContains('Contact us', $pageContent); $this->assertContains('`_ section of the PHPUnit documentation. WebTestCase ----------- Symfony provides a WebTestCase class that can be used to write functional tests. The Silex version of this class is ``Silex\WebTestCase``, and you can use it by making your test extend it:: use Silex\WebTestCase; class ContactFormTest extends WebTestCase { ... } .. caution:: If you need to override the ``setUp()`` method, don't forget to call the parent (``parent::setUp()``) to call the Silex default setup. .. note:: If you want to use the Symfony ``WebTestCase`` class you will need to explicitly install its dependencies for your project: .. code-block:: bash composer require --dev symfony/browser-kit symfony/css-selector For your WebTestCase, you will have to implement a ``createApplication`` method, which returns your application instance:: public function createApplication() { // app.php must return an Application instance return require __DIR__.'/path/to/app.php'; } Make sure you do **not** use ``require_once`` here, as this method will be executed before every test. .. tip:: By default, the application behaves in the same way as when using it from a browser. But when an error occurs, it is sometimes easier to get raw exceptions instead of HTML pages. It is rather simple if you tweak the application configuration in the ``createApplication()`` method like follows:: public function createApplication() { $app = require __DIR__.'/path/to/app.php'; $app['debug'] = true; unset($app['exception_handler']); return $app; } .. tip:: If your application use sessions, set ``session.test`` to ``true`` to simulate sessions:: public function createApplication() { // ... $app['session.test'] = true; // ... } The WebTestCase provides a ``createClient`` method. A client acts as a browser, and allows you to interact with your application. Here's how it works:: public function testInitialPage() { $client = $this->createClient(); $crawler = $client->request('GET', '/'); $this->assertTrue($client->getResponse()->isOk()); $this->assertCount(1, $crawler->filter('h1:contains("Contact us")')); $this->assertCount(1, $crawler->filter('form')); ... } There are several things going on here. You have both a ``Client`` and a ``Crawler``. You can also access the application through ``$this->app``. Client ~~~~~~ The client represents a browser. It holds your browsing history, cookies and more. The ``request`` method allows you to make a request to a page on your application. .. note:: You can find some documentation for it in `the client section of the testing chapter of the Symfony documentation `_. Crawler ~~~~~~~ The crawler allows you to inspect the content of a page. You can filter it using CSS expressions and lots more. .. note:: You can find some documentation for it in `the crawler section of the testing chapter of the Symfony documentation `_. Configuration ------------- The suggested way to configure PHPUnit is to create a ``phpunit.xml.dist`` file, a ``tests`` folder and your tests in ``tests/YourApp/Tests/YourTest.php``. The ``phpunit.xml.dist`` file should look like this: .. code-block:: xml ./tests/ Your ``tests/YourApp/Tests/YourTest.php`` should look like this:: namespace YourApp\Tests; use Silex\WebTestCase; class YourTest extends WebTestCase { public function createApplication() { return require __DIR__.'/../../../app.php'; } public function testFooBar() { ... } } Now, when running ``phpunit`` on the command line, tests should run. src/Silex/doc/usage.rst000066400000000000000000000603371516072260400153500ustar00rootroot00000000000000Usage ===== Installation ------------ If you want to get started fast, use the `Silex Skeleton`_: .. code-block:: bash composer create-project fabpot/silex-skeleton path/to/install "~2.0" If you want more flexibility, use Composer_ instead: .. code-block:: bash composer require silex/silex:~2.0 Web Server ---------- All examples in the documentation rely on a well-configured web server; read the :doc:`webserver documentation` to check yours. Bootstrap --------- To bootstrap Silex, all you need to do is require the ``vendor/autoload.php`` file and create an instance of ``Silex\Application``. After your controller definitions, call the ``run`` method on your application:: // web/index.php require_once __DIR__.'/../vendor/autoload.php'; $app = new Silex\Application(); // ... definitions $app->run(); .. tip:: When developing a website, you might want to turn on the debug mode to ease debugging:: $app['debug'] = true; .. tip:: If your application is hosted behind a reverse proxy at address ``$ip``, and you want Silex to trust the ``X-Forwarded-For*`` headers, you will need to run your application like this:: use Symfony\Component\HttpFoundation\Request; Request::setTrustedProxies(array($ip)); $app->run(); Routing ------- In Silex you define a route and the controller that is called when that route is matched. A route pattern consists of: * *Pattern*: The route pattern defines a path that points to a resource. The pattern can include variable parts and you are able to set RegExp requirements for them. * *Method*: One of the following HTTP methods: ``GET``, ``POST``, ``PUT``, ``DELETE``, ``PATCH``, or ``OPTIONS``. This describes the interaction with the resource. The controller is defined using a closure like this:: function () { // ... do something } The return value of the closure becomes the content of the page. Example GET Route ~~~~~~~~~~~~~~~~~ Here is an example definition of a ``GET`` route:: $blogPosts = array( 1 => array( 'date' => '2011-03-29', 'author' => 'igorw', 'title' => 'Using Silex', 'body' => '...', ), ); $app->get('/blog', function () use ($blogPosts) { $output = ''; foreach ($blogPosts as $post) { $output .= $post['title']; $output .= '
'; } return $output; }); Visiting ``/blog`` will return a list of blog post titles. The ``use`` statement means something different in this context. It tells the closure to import the ``$blogPosts`` variable from the outer scope. This allows you to use it from within the closure. Dynamic Routing ~~~~~~~~~~~~~~~ Now, you can create another controller for viewing individual blog posts:: $app->get('/blog/{id}', function (Silex\Application $app, $id) use ($blogPosts) { if (!isset($blogPosts[$id])) { $app->abort(404, "Post $id does not exist."); } $post = $blogPosts[$id]; return "

{$post['title']}

". "

{$post['body']}

"; }); This route definition has a variable ``{id}`` part which is passed to the closure. The current ``Application`` is automatically injected by Silex to the Closure thanks to the type hinting. When the post does not exist, you are using ``abort()`` to stop the request early. It actually throws an exception, which you will see how to handle later on. Example POST Route ~~~~~~~~~~~~~~~~~~ POST routes signify the creation of a resource. An example for this is a feedback form. You will use the ``mail`` function to send an e-mail:: use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; $app->post('/feedback', function (Request $request) { $message = $request->get('message'); mail('feedback@yoursite.com', '[YourSite] Feedback', $message); return new Response('Thank you for your feedback!', 201); }); It is pretty straightforward. .. note:: There is a :doc:`SwiftmailerServiceProvider ` included that you can use instead of ``mail()``. The current ``request`` is automatically injected by Silex to the Closure thanks to the type hinting. It is an instance of Request_, so you can fetch variables using the request ``get`` method. Instead of returning a string you are returning an instance of Response_. This allows setting an HTTP status code, in this case it is set to ``201 Created``. .. note:: Silex always uses a ``Response`` internally, it converts strings to responses with status code ``200``. Other methods ~~~~~~~~~~~~~ You can create controllers for most HTTP methods. Just call one of these methods on your application: ``get``, ``post``, ``put``, ``delete``, ``patch``, ``options``:: $app->put('/blog/{id}', function ($id) { // ... }); $app->delete('/blog/{id}', function ($id) { // ... }); $app->patch('/blog/{id}', function ($id) { // ... }); .. tip:: Forms in most web browsers do not directly support the use of other HTTP methods. To use methods other than GET and POST you can utilize a special form field with a name of ``_method``. The form's ``method`` attribute must be set to POST when using this field: .. code-block:: html
You need to explicitly enable this method override:: use Symfony\Component\HttpFoundation\Request; Request::enableHttpMethodParameterOverride(); $app->run(); You can also call ``match``, which will match all methods. This can be restricted via the ``method`` method:: $app->match('/blog', function () { // ... }); $app->match('/blog', function () { // ... }) ->method('PATCH'); $app->match('/blog', function () { // ... }) ->method('PUT|POST'); .. note:: The order in which the routes are defined is significant. The first matching route will be used, so place more generic routes at the bottom. Route Variables ~~~~~~~~~~~~~~~ As it has been shown before you can define variable parts in a route like this:: $app->get('/blog/{id}', function ($id) { // ... }); It is also possible to have more than one variable part, just make sure the closure arguments match the names of the variable parts:: $app->get('/blog/{postId}/{commentId}', function ($postId, $commentId) { // ... }); While it's not recommended, you could also do this (note the switched arguments):: $app->get('/blog/{postId}/{commentId}', function ($commentId, $postId) { // ... }); You can also ask for the current Request and Application objects:: $app->get('/blog/{id}', function (Application $app, Request $request, $id) { // ... }); .. note:: Note for the Application and Request objects, Silex does the injection based on the type hinting and not on the variable name:: $app->get('/blog/{id}', function (Application $foo, Request $bar, $id) { // ... }); Route Variable Converters ~~~~~~~~~~~~~~~~~~~~~~~~~ Before injecting the route variables into the controller, you can apply some converters:: $app->get('/user/{id}', function ($id) { // ... })->convert('id', function ($id) { return (int) $id; }); This is useful when you want to convert route variables to objects as it allows to reuse the conversion code across different controllers:: $userProvider = function ($id) { return new User($id); }; $app->get('/user/{user}', function (User $user) { // ... })->convert('user', $userProvider); $app->get('/user/{user}/edit', function (User $user) { // ... })->convert('user', $userProvider); The converter callback also receives the ``Request`` as its second argument:: $callback = function ($post, Request $request) { return new Post($request->attributes->get('slug')); }; $app->get('/blog/{id}/{slug}', function (Post $post) { // ... })->convert('post', $callback); A converter can also be defined as a service. For example, here is a user converter based on Doctrine ObjectManager:: use Doctrine\Common\Persistence\ObjectManager; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class UserConverter { private $om; public function __construct(ObjectManager $om) { $this->om = $om; } public function convert($id) { if (null === $user = $this->om->find('User', (int) $id)) { throw new NotFoundHttpException(sprintf('User %d does not exist', $id)); } return $user; } } The service will now be registered in the application, and the ``convert()`` method will be used as converter (using the syntax ``service_name:method_name``):: $app['converter.user'] = function () { return new UserConverter(); }; $app->get('/user/{user}', function (User $user) { // ... })->convert('user', 'converter.user:convert'); Requirements ~~~~~~~~~~~~ In some cases you may want to only match certain expressions. You can define requirements using regular expressions by calling ``assert`` on the ``Controller`` object, which is returned by the routing methods. The following will make sure the ``id`` argument is a positive integer, since ``\d+`` matches any amount of digits:: $app->get('/blog/{id}', function ($id) { // ... }) ->assert('id', '\d+'); You can also chain these calls:: $app->get('/blog/{postId}/{commentId}', function ($postId, $commentId) { // ... }) ->assert('postId', '\d+') ->assert('commentId', '\d+'); Conditions ~~~~~~~~~~ Besides restricting route matching based on the HTTP method or parameter requirements, you can set conditions on any part of the request by calling ``when`` on the ``Controller`` object, which is returned by the routing methods:: $app->get('/blog/{id}', function ($id) { // ... }) ->when("request.headers.get('User-Agent') matches '/firefox/i'"); The ``when`` argument is a Symfony Expression_ , which means that you need to add ``symfony/expression-language`` as a dependency of your project. Default Values ~~~~~~~~~~~~~~ You can define a default value for any route variable by calling ``value`` on the ``Controller`` object:: $app->get('/{pageName}', function ($pageName) { // ... }) ->value('pageName', 'index'); This will allow matching ``/``, in which case the ``pageName`` variable will have the value ``index``. Named Routes ~~~~~~~~~~~~ Some providers can make use of named routes. By default Silex will generate an internal route name for you but you can give an explicit route name by calling ``bind``:: $app->get('/', function () { // ... }) ->bind('homepage'); $app->get('/blog/{id}', function ($id) { // ... }) ->bind('blog_post'); Controllers as Classes ~~~~~~~~~~~~~~~~~~~~~~ Instead of anonymous functions, you can also define your controllers as methods. By using the ``ControllerClass::methodName`` syntax, you can tell Silex to lazily create the controller object for you:: $app->get('/', 'Acme\\Foo::bar'); use Silex\Application; use Symfony\Component\HttpFoundation\Request; namespace Acme { class Foo { public function bar(Request $request, Application $app) { // ... } } } This will load the ``Acme\Foo`` class on demand, create an instance and call the ``bar`` method to get the response. You can use ``Request`` and ``Silex\Application`` type hints to get ``$request`` and ``$app`` injected. It is also possible to :doc:`define your controllers as services `. Global Configuration -------------------- If a controller setting must be applied to **all** controllers (a converter, a middleware, a requirement, or a default value), configure it on ``$app['controllers']``, which holds all application controllers:: $app['controllers'] ->value('id', '1') ->assert('id', '\d+') ->requireHttps() ->method('get') ->convert('id', function () { /* ... */ }) ->before(function () { /* ... */ }) ->when('request.isSecure() == true') ; These settings are applied to already registered controllers and they become the defaults for new controllers. .. note:: The global configuration does not apply to controller providers you might mount as they have their own global configuration (read the :doc:`dedicated chapter` for more information). Error Handlers -------------- When an exception is thrown, error handlers allow you to display a custom error page to the user. They can also be used to do additional things, such as logging. To register an error handler, pass a closure to the ``error`` method which takes an ``Exception`` argument and returns a response:: use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; $app->error(function (\Exception $e, Request $request, $code) { return new Response('We are sorry, but something went terribly wrong.'); }); You can also check for specific errors by using the ``$code`` argument, and handle them differently:: use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; $app->error(function (\Exception $e, Request $request, $code) { switch ($code) { case 404: $message = 'The requested page could not be found.'; break; default: $message = 'We are sorry, but something went terribly wrong.'; } return new Response($message); }); You can restrict an error handler to only handle some Exception classes by setting a more specific type hint for the Closure argument:: use Symfony\Component\HttpFoundation\Request; $app->error(function (\LogicException $e, Request $request, $code) { // this handler will only handle \LogicException exceptions // and exceptions that extend \LogicException }); .. note:: As Silex ensures that the Response status code is set to the most appropriate one depending on the exception, setting the status on the response alone won't work. If you want to overwrite the status code, which you should not without a good reason, set the ``X-Status-Code`` header (on Symfony until version 3.2):: return new Response('Error', 404 /* ignored */, array('X-Status-Code' => 200)); As of Symfony 3.3, call ``ExceptionEvent::allowCustomResponseCode()`` first and then then set the status code on the response as normal. The kernel will now use your status code when sending the response to the client. The ``ExceptionEvent`` is passed to the error callback as a 4th parameter:: use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Event\ExceptionEvent; $app->error(function (\Exception $e, Request $request, $code, ExceptionEvent $event) { $event->allowCustomResponseCode(); $response = new Response('No Content', 204); return $response; }); If you want to use a separate error handler for logging, make sure you register it with a higher priority than response error handlers, because once a response is returned, the following handlers are ignored. .. note:: Silex ships with a provider for Monolog_ which handles logging of errors. Check out the *Providers* :doc:`chapter ` for details. .. tip:: Silex comes with a default error handler that displays a detailed error message with the stack trace when **debug** is true, and a simple error message otherwise. Error handlers registered via the ``error()`` method always take precedence but you can keep the nice error messages when debug is turned on like this:: use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; $app->error(function (\Exception $e, Request $request, $code) use ($app) { if ($app['debug']) { return; } // ... logic to handle the error and return a Response }); The error handlers are also called when you use ``abort`` to abort a request early:: $app->get('/blog/{id}', function (Silex\Application $app, $id) use ($blogPosts) { if (!isset($blogPosts[$id])) { $app->abort(404, "Post $id does not exist."); } return new Response(...); }); You can convert errors to ``Exceptions``, check out the cookbook :doc:`chapter ` for details. View Handlers ------------- View Handlers allow you to intercept a controller result that is not a ``Response`` and transform it before it gets returned to the kernel. To register a view handler, pass a callable (or string that can be resolved to a callable) to the ``view()`` method. The callable should accept some sort of result from the controller:: $app->view(function (array $controllerResult) use ($app) { return $app->json($controllerResult); }); View Handlers also receive the ``Request`` as their second argument, making them a good candidate for basic content negotiation:: $app->view(function (array $controllerResult, Request $request) use ($app) { $acceptHeader = $request->headers->get('Accept'); $bestFormat = $app['negotiator']->getBestFormat($acceptHeader, array('json', 'xml')); if ('json' === $bestFormat) { return new JsonResponse($controllerResult); } if ('xml' === $bestFormat) { return $app['serializer.xml']->renderResponse($controllerResult); } return $controllerResult; }); View Handlers will be examined in the order they are added to the application and Silex will use type hints to determine if a view handler should be used for the current result, continuously using the return value of the last view handler as the input for the next. .. note:: You must ensure that Silex receives a ``Response`` or a string as the result of the last view handler (or controller) to be run. Redirects --------- You can redirect to another page by returning a ``RedirectResponse`` response, which you can create by calling the ``redirect`` method:: $app->get('/', function () use ($app) { return $app->redirect('/hello'); }); This will redirect from ``/`` to ``/hello``. Forwards -------- When you want to delegate the rendering to another controller, without a round-trip to the browser (as for a redirect), use an internal sub-request:: use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; $app->get('/', function () use ($app) { // forward to /hello $subRequest = Request::create('/hello', 'GET'); return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST); }); .. tip:: You can also generate the URI via the built-in URL generator:: $request = Request::create($app['url_generator']->generate('hello'), 'GET'); There's some more things that you need to keep in mind though. In most cases you will want to forward some parts of the current master request to the sub-request. That includes: Cookies, server information, session. Read more on :doc:`how to make sub-requests `. JSON ---- If you want to return JSON data, you can use the ``json`` helper method. Simply pass it your data, status code and headers, and it will create a JSON response for you:: $app->get('/users/{id}', function ($id) use ($app) { $user = getUser($id); if (!$user) { $error = array('message' => 'The user was not found.'); return $app->json($error, 404); } return $app->json($user); }); Streaming --------- It's possible to stream a response, which is important in cases when you don't want to buffer the data being sent:: $app->get('/images/{file}', function ($file) use ($app) { if (!file_exists(__DIR__.'/images/'.$file)) { return $app->abort(404, 'The image was not found.'); } $stream = function () use ($file) { readfile($file); }; return $app->stream($stream, 200, array('Content-Type' => 'image/png')); }); If you need to send chunks, make sure you call ``ob_flush`` and ``flush`` after every chunk:: $stream = function () { $fh = fopen('http://www.example.com/', 'rb'); while (!feof($fh)) { echo fread($fh, 1024); ob_flush(); flush(); } fclose($fh); }; Sending a file -------------- If you want to return a file, you can use the ``sendFile`` helper method. It eases returning files that would otherwise not be publicly available. Simply pass it your file path, status code, headers and the content disposition and it will create a ``BinaryFileResponse`` response for you:: $app->get('/files/{path}', function ($path) use ($app) { if (!file_exists('/base/path/' . $path)) { $app->abort(404); } return $app->sendFile('/base/path/' . $path); }); To further customize the response before returning it, check the API doc for `Symfony\Component\HttpFoundation\BinaryFileResponse `_:: return $app ->sendFile('/base/path/' . $path) ->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'pic.jpg') ; Traits ------ Silex comes with PHP traits that define shortcut methods. Almost all built-in service providers have some corresponding PHP traits. To use them, define your own Application class and include the traits you want:: use Silex\Application; class MyApplication extends Application { use Application\TwigTrait; use Application\SecurityTrait; use Application\FormTrait; use Application\UrlGeneratorTrait; use Application\SwiftmailerTrait; use Application\MonologTrait; use Application\TranslationTrait; } You can also define your own Route class and use some traits:: use Silex\Route; class MyRoute extends Route { use Route\SecurityTrait; } To use your newly defined route, override the ``$app['route_class']`` setting:: $app['route_class'] = 'MyRoute'; Read each provider chapter to learn more about the added methods. Security -------- Make sure to protect your application against attacks. Escaping ~~~~~~~~ When outputting any user input, make sure to escape it correctly to prevent Cross-Site-Scripting attacks. * **Escaping HTML**: PHP provides the ``htmlspecialchars`` function for this. Silex provides a shortcut ``escape`` method:: use Symfony\Component\HttpFoundation\Request; $app->get('/name', function (Request $request, Silex\Application $app) { $name = $request->get('name'); return "You provided the name {$app->escape($name)}."; }); If you use the Twig template engine, you should use its escaping or even auto-escaping mechanisms. Check out the *Providers* :doc:`chapter ` for details. * **Escaping JSON**: If you want to provide data in JSON format you should use the Silex ``json`` function:: use Symfony\Component\HttpFoundation\Request; $app->get('/name.json', function (Request $request, Silex\Application $app) { $name = $request->get('name'); return $app->json(array('name' => $name)); }); .. _Silex Skeleton: http://github.com/silexphp/Silex-Skeleton .. _Composer: http://getcomposer.org/ .. _Request: http://api.symfony.com/master/Symfony/Component/HttpFoundation/Request.html .. _Response: http://api.symfony.com/master/Symfony/Component/HttpFoundation/Response.html .. _Monolog: https://github.com/Seldaek/monolog .. _Expression: https://symfony.com/doc/current/book/routing.html#completely-customized-route-matching-with-conditions src/Silex/doc/web_servers.rst000066400000000000000000000122521516072260400165630ustar00rootroot00000000000000Webserver Configuration ======================= Apache ------ If you are using Apache, make sure ``mod_rewrite`` is enabled and use the following ``.htaccess`` file: .. code-block:: apache Options -MultiViews RewriteEngine On #RewriteBase /path/to/app RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L] .. note:: If your site is not at the webroot level you will have to uncomment the ``RewriteBase`` statement and adjust the path to point to your directory, relative from the webroot. Alternatively, if you use Apache 2.2.16 or higher, you can use the `FallbackResource directive`_ to make your .htaccess even easier: .. code-block:: apache FallbackResource index.php .. note:: If your site is not at the webroot level you will have to adjust the path to point to your directory, relative from the webroot. Or if you're using a VirtualHost, you can add the same directive to the VirtualHost's Directory entry: .. code-block:: apache # other directives Alias /app/ /path/to/app/ # other directives FallbackResource /app/index.php .. note:: Note that you need the leading forward slash there, unlike with the .htaccess version nginx ----- The **minimum configuration** to get your application running under Nginx is: .. code-block:: nginx server { server_name domain.tld www.domain.tld; root /var/www/project/web; location / { # try to serve file directly, fallback to front controller try_files $uri /index.php$is_args$args; } # If you have 2 front controllers for dev|prod use the following line instead # location ~ ^/(index|index_dev)\.php(/|$) { location ~ ^/index\.php(/|$) { # the ubuntu default fastcgi_pass unix:/var/run/php/phpX.X-fpm.sock; # for running on centos #fastcgi_pass unix:/var/run/php-fpm/www.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; # Prevents URIs that include the front controller. This will 404: # http://domain.tld/index.php/some-path # Enable the internal directive to disable URIs like this # internal; } #return 404 for all php files as we do have a front controller location ~ \.php$ { return 404; } error_log /var/log/nginx/project_error.log; access_log /var/log/nginx/project_access.log; } IIS --- If you are using the Internet Information Services from Windows, you can use this sample ``web.config`` file: .. code-block:: xml Lighttpd -------- If you are using lighttpd, use this sample ``simple-vhost`` as a starting point: .. code-block:: lighttpd server.document-root = "/path/to/app" url.rewrite-once = ( # configure some static files "^/assets/.+" => "$0", "^/favicon\.ico$" => "$0", "^(/[^\?]*)(\?.*)?" => "/index.php$1$2" ) .. _FallbackResource directive: http://www.adayinthelifeof.nl/2012/01/21/apaches-fallbackresource-your-new-htaccess-command/ PHP --- PHP ships with a built-in webserver for development. This server allows you to run silex without any configuration. However, in order to serve static files, you'll have to make sure your front controller returns false in that case:: // web/index.php $filename = __DIR__.preg_replace('#(\?.*)$#', '', $_SERVER['REQUEST_URI']); if (php_sapi_name() === 'cli-server' && is_file($filename)) { return false; } $app = require __DIR__.'/../src/app.php'; $app->run(); Assuming your front controller is at ``web/index.php``, you can start the server from the command-line with this command: .. code-block:: text $ php -S localhost:8080 -t web web/index.php Now the application should be running at ``http://localhost:8080``. .. note:: This server is for development only. It is **not** recommended to use it in production. src/Silex/phpunit.xml.dist000066400000000000000000000012361516072260400161110ustar00rootroot00000000000000 ./tests/Silex/ ./src src/Silex/src/000077500000000000000000000000001516072260400135235ustar00rootroot00000000000000src/Silex/src/Silex/000077500000000000000000000000001516072260400146075ustar00rootroot00000000000000src/Silex/src/Silex/Api/000077500000000000000000000000001516072260400153205ustar00rootroot00000000000000src/Silex/src/Silex/Api/BootableProviderInterface.php000066400000000000000000000013351516072260400231160ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Api; use Silex\Application; /** * Interface for bootable service providers. * * @author Fabien Potencier */ interface BootableProviderInterface { /** * Bootstraps the application. * * This method is called after all services are registered * and should be used for "dynamic" configuration (whenever * a service must be requested). * * @param Application $app */ public function boot(Application $app); } src/Silex/src/Silex/Api/ControllerProviderInterface.php000066400000000000000000000013141516072260400235070ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Api; use Silex\Application; use Silex\ControllerCollection; /** * Interface for controller providers. * * @author Fabien Potencier */ interface ControllerProviderInterface { /** * Returns routes to connect to the given application. * * @param Application $app An Application instance * * @return ControllerCollection A ControllerCollection instance */ public function connect(Application $app); } src/Silex/src/Silex/Api/EventListenerProviderInterface.php000066400000000000000000000011041516072260400241500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Api; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Pimple\Container; /** * Interface for event listener providers. * * @author Fabien Potencier */ interface EventListenerProviderInterface { public function subscribe(Container $app, EventDispatcherInterface $dispatcher); } src/Silex/src/Silex/Api/LICENSE000066400000000000000000000020511516072260400163230ustar00rootroot00000000000000Copyright (c) 2010-2015 Fabien Potencier 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. src/Silex/src/Silex/Api/composer.json000066400000000000000000000015321516072260400200430ustar00rootroot00000000000000{ "minimum-stability": "dev", "name": "silex/api", "description": "The Silex interfaces", "keywords": ["microframework"], "homepage": "http://silex.sensiolabs.org", "license": "MIT", "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Igor Wiedler", "email": "igor@wiedler.ch" } ], "require": { "php": ">=5.5.9", "pimple/pimple": "~3.0" }, "suggest": { "symfony/event-dispatcher": "For EventListenerProviderInterface", "silex/silex": "For BootableProviderInterface and ControllerProviderInterface" }, "autoload": { "psr-4": { "Silex\\Api\\": "" } }, "extra": { "branch-alias": { "dev-master": "2.3.x-dev" } } } src/Silex/src/Silex/AppArgumentValueResolver.php000066400000000000000000000022351516072260400222640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; /** * HttpKernel Argument Resolver for Silex. * * @author Romain Neutron */ class AppArgumentValueResolver implements ArgumentValueResolverInterface { private $app; public function __construct(Application $app) { $this->app = $app; } /** * {@inheritdoc} */ public function supports(Request $request, ArgumentMetadata $argument) : bool { return null !== $argument->getType() && (Application::class === $argument->getType() || is_subclass_of($argument->getType(), Application::class)); } /** * {@inheritdoc} */ public function resolve(Request $request, ArgumentMetadata $argument) : iterable { yield $this->app; } } src/Silex/src/Silex/Application.php000066400000000000000000000404671516072260400175760ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Pimple\Container; use Pimple\ServiceProviderInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpKernel\TerminableInterface; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\TerminateEvent; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\HttpFoundation\JsonResponse; use Silex\Api\BootableProviderInterface; use Silex\Api\EventListenerProviderInterface; use Silex\Api\ControllerProviderInterface; use Silex\Provider\ExceptionHandlerServiceProvider; use Silex\Provider\RoutingServiceProvider; use Silex\Provider\HttpKernelServiceProvider; /** * The Silex framework class. * * @author Fabien Potencier */ class Application extends Container implements HttpKernelInterface, TerminableInterface { const VERSION = '2.3.0'; const EARLY_EVENT = 512; const LATE_EVENT = -512; protected $providers = []; protected $booted = false; /** * Instantiate a new Application. * * Objects and parameters can be passed as argument to the constructor. * * @param array $values the parameters or objects */ public function __construct(array $values = []) { parent::__construct(); $this['request.http_port'] = 80; $this['request.https_port'] = 443; $this['debug'] = false; $this['charset'] = 'UTF-8'; $this['logger'] = null; $this->register(new HttpKernelServiceProvider()); $this->register(new RoutingServiceProvider()); $this->register(new ExceptionHandlerServiceProvider()); foreach ($values as $key => $value) { $this[$key] = $value; } } /** * Registers a service provider. * * @param ServiceProviderInterface $provider A ServiceProviderInterface instance * @param array $values An array of values that customizes the provider * * @return Application */ public function register(ServiceProviderInterface $provider, array $values = []) { $this->providers[] = $provider; parent::register($provider, $values); return $this; } /** * Boots all service providers. * * This method is automatically called by handle(), but you can use it * to boot all service providers when not handling a request. */ public function boot() { if ($this->booted) { return; } $this->booted = true; foreach ($this->providers as $provider) { if ($provider instanceof EventListenerProviderInterface) { $provider->subscribe($this, $this['dispatcher']); } if ($provider instanceof BootableProviderInterface) { $provider->boot($this); } } } /** * Maps a pattern to a callable. * * You can optionally specify HTTP methods that should be matched. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function match($pattern, $to = null) { return $this['controllers']->match($pattern, $to); } /** * Maps a GET request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function get($pattern, $to = null) { return $this['controllers']->get($pattern, $to); } /** * Maps a POST request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function post($pattern, $to = null) { return $this['controllers']->post($pattern, $to); } /** * Maps a PUT request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function put($pattern, $to = null) { return $this['controllers']->put($pattern, $to); } /** * Maps a DELETE request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function delete($pattern, $to = null) { return $this['controllers']->delete($pattern, $to); } /** * Maps an OPTIONS request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function options($pattern, $to = null) { return $this['controllers']->options($pattern, $to); } /** * Maps a PATCH request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function patch($pattern, $to = null) { return $this['controllers']->patch($pattern, $to); } /** * Adds an event listener that listens on the specified events. * * @param string $eventName The event to listen on * @param callable $callback The listener * @param int $priority The higher this value, the earlier an event * listener will be triggered in the chain (defaults to 0) */ public function on($eventName, $callback, $priority = 0) { if ($this->booted) { $this['dispatcher']->addListener($eventName, $this['callback_resolver']->resolveCallback($callback), $priority); return; } $this->extend('dispatcher', function (EventDispatcherInterface $dispatcher, $app) use ($callback, $priority, $eventName) { $dispatcher->addListener($eventName, $app['callback_resolver']->resolveCallback($callback), $priority); return $dispatcher; }); } /** * Registers a before filter. * * Before filters are run before any route has been matched. * * @param mixed $callback Before filter callback * @param int $priority The higher this value, the earlier an event * listener will be triggered in the chain (defaults to 0) */ public function before($callback, $priority = 0) { $app = $this; $this->on(KernelEvents::REQUEST, function (RequestEvent $event) use ($callback, $app) { if (!$event->isMasterRequest()) { return; } $ret = call_user_func($app['callback_resolver']->resolveCallback($callback), $event->getRequest(), $app); if ($ret instanceof Response) { $event->setResponse($ret); } }, $priority); } /** * Registers an after filter. * * After filters are run after the controller has been executed. * * @param mixed $callback After filter callback * @param int $priority The higher this value, the earlier an event * listener will be triggered in the chain (defaults to 0) */ public function after($callback, $priority = 0) { $app = $this; $this->on(KernelEvents::RESPONSE, function (FilterResponseEvent $event) use ($callback, $app) { if (!$event->isMasterRequest()) { return; } $response = call_user_func($app['callback_resolver']->resolveCallback($callback), $event->getRequest(), $event->getResponse(), $app); if ($response instanceof Response) { $event->setResponse($response); } elseif (null !== $response) { throw new \RuntimeException('An after middleware returned an invalid response value. Must return null or an instance of Response.'); } }, $priority); } /** * Registers a finish filter. * * Finish filters are run after the response has been sent. * * @param mixed $callback Finish filter callback * @param int $priority The higher this value, the earlier an event * listener will be triggered in the chain (defaults to 0) */ public function finish($callback, $priority = 0) { $app = $this; $this->on(KernelEvents::TERMINATE, function (TerminateEvent $event) use ($callback, $app) { call_user_func($app['callback_resolver']->resolveCallback($callback), $event->getRequest(), $event->getResponse(), $app); }, $priority); } /** * Aborts the current request by sending a proper HTTP error. * * @param int $statusCode The HTTP status code * @param string $message The status message * @param array $headers An array of HTTP headers */ public function abort($statusCode, $message = '', array $headers = []) { throw new HttpException($statusCode, $message, null, $headers); } /** * Registers an error handler. * * Error handlers are simple callables which take a single Exception * as an argument. If a controller throws an exception, an error handler * can return a specific response. * * When an exception occurs, all handlers will be called, until one returns * something (a string or a Response object), at which point that will be * returned to the client. * * For this reason you should add logging handlers before output handlers. * * @param mixed $callback Error handler callback, takes an Exception argument * @param int $priority The higher this value, the earlier an event * listener will be triggered in the chain (defaults to -8) */ public function error($callback, $priority = -8) { $this->on(KernelEvents::EXCEPTION, new ExceptionListenerWrapper($this, $callback), $priority); } /** * Registers a view handler. * * View handlers are simple callables which take a controller result and the * request as arguments, whenever a controller returns a value that is not * an instance of Response. When this occurs, all suitable handlers will be * called, until one returns a Response object. * * @param mixed $callback View handler callback * @param int $priority The higher this value, the earlier an event * listener will be triggered in the chain (defaults to 0) */ public function view($callback, $priority = 0) { $this->on(KernelEvents::VIEW, new ViewListenerWrapper($this, $callback), $priority); } /** * Flushes the controller collection. */ public function flush() { $this['routes']->addCollection($this['controllers']->flush()); } /** * Redirects the user to another URL. * * @param string $url The URL to redirect to * @param int $status The status code (302 by default) * * @return RedirectResponse */ public function redirect($url, $status = 302) { return new RedirectResponse($url, $status); } /** * Creates a streaming response. * * @param mixed $callback A valid PHP callback * @param int $status The response status code * @param array $headers An array of response headers * * @return StreamedResponse */ public function stream($callback = null, $status = 200, array $headers = []) { return new StreamedResponse($callback, $status, $headers); } /** * Escapes a text for HTML. * * @param string $text The input text to be escaped * @param int $flags The flags (@see htmlspecialchars) * @param string $charset The charset * @param bool $doubleEncode Whether to try to avoid double escaping or not * * @return string Escaped text */ public function escape($text, $flags = ENT_COMPAT, $charset = null, $doubleEncode = true) { return htmlspecialchars($text, $flags, $charset ?: $this['charset'], $doubleEncode); } /** * Convert some data into a JSON response. * * @param mixed $data The response data * @param int $status The response status code * @param array $headers An array of response headers * * @return JsonResponse */ public function json($data = [], $status = 200, array $headers = []) { return new JsonResponse($data, $status, $headers); } /** * Sends a file. * * @param \SplFileInfo|string $file The file to stream * @param int $status The response status code * @param array $headers An array of response headers * @param null|string $contentDisposition The type of Content-Disposition to set automatically with the filename * * @return BinaryFileResponse */ public function sendFile($file, $status = 200, array $headers = [], $contentDisposition = null) { return new BinaryFileResponse($file, $status, $headers, true, $contentDisposition); } /** * Mounts controllers under the given route prefix. * * @param string $prefix The route prefix * @param ControllerCollection|callable|ControllerProviderInterface $controllers A ControllerCollection, a callable, or a ControllerProviderInterface instance * * @return Application * * @throws \LogicException */ public function mount($prefix, $controllers) { if ($controllers instanceof ControllerProviderInterface) { $connectedControllers = $controllers->connect($this); if (!$connectedControllers instanceof ControllerCollection) { throw new \LogicException(sprintf('The method "%s::connect" must return a "ControllerCollection" instance. Got: "%s"', get_class($controllers), is_object($connectedControllers) ? get_class($connectedControllers) : gettype($connectedControllers))); } $controllers = $connectedControllers; } elseif (!$controllers instanceof ControllerCollection && !is_callable($controllers)) { throw new \LogicException('The "mount" method takes either a "ControllerCollection" instance, "ControllerProviderInterface" instance, or a callable.'); } $this['controllers']->mount($prefix, $controllers); return $this; } /** * Handles the request and delivers the response. * * @param Request|null $request Request to process */ public function run(Request $request = null) { if (null === $request) { $request = Request::createFromGlobals(); } $response = $this->handle($request); $response->send(); $this->terminate($request, $response); } /** * {@inheritdoc} * * If you call this method directly instead of run(), you must call the * terminate() method yourself if you want the finish filters to be run. */ public function handle(Request $request, int $type = self::MAIN_REQUEST, bool $catch = true) : Response { if (!$this->booted) { $this->boot(); } $this->flush(); return $this['kernel']->handle($request, $type, $catch); } /** * {@inheritdoc} */ public function terminate(Request $request, Response $response) { $this['kernel']->terminate($request, $response); } } src/Silex/src/Silex/Application/000077500000000000000000000000001516072260400170525ustar00rootroot00000000000000src/Silex/src/Silex/Application/FormTrait.php000066400000000000000000000031471516072260400214770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Application; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\FormBuilder; use Symfony\Component\Form\FormTypeInterface; /** * Form trait. * * @author Fabien Potencier * @author David Berlioz */ trait FormTrait { /** * Creates and returns a form builder instance. * * @param mixed $data The initial data for the form * @param array $options Options for the form * @param string|FormTypeInterface $type Type of the form * * @return FormBuilder */ public function form($data = null, array $options = [], $type = null) { return $this['form.factory']->createBuilder($type ?: FormType::class, $data, $options); } /** * Creates and returns a named form builder instance. * * @param string $name * @param mixed $data The initial data for the form * @param array $options Options for the form * @param string|FormTypeInterface $type Type of the form * * @return FormBuilder */ public function namedForm($name, $data = null, array $options = [], $type = null) { return $this['form.factory']->createNamedBuilder($name, $type ?: FormType::class, $data, $options); } } src/Silex/src/Silex/Application/MonologTrait.php000066400000000000000000000014461516072260400222060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Application; use Monolog\Logger; /** * Monolog trait. * * @author Fabien Potencier */ trait MonologTrait { /** * Adds a log record. * * @param string $message The log message * @param array $context The log context * @param int $level The logging level * * @return bool Whether the record has been processed */ public function log($message, array $context = [], $level = Logger::INFO) { return $this['monolog']->addRecord($level, $message, $context); } } src/Silex/src/Silex/Application/SecurityTrait.php000066400000000000000000000030021516072260400223710ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Application; use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException; use Symfony\Component\Security\Core\User\UserInterface; /** * Security trait. * * @author Fabien Potencier */ trait SecurityTrait { /** * Encodes the raw password. * * @param UserInterface $user A UserInterface instance * @param string $password The password to encode * * @return string The encoded password * * @throws \RuntimeException when no password encoder could be found for the user */ public function encodePassword(UserInterface $user, $password) { return $this['security.encoder_factory']->getEncoder($user)->encodePassword($password, $user->getSalt()); } /** * Checks if the attributes are granted against the current authentication token and optionally supplied object. * * @param mixed $attributes * @param mixed $object * * @return bool * * @throws AuthenticationCredentialsNotFoundException when the token storage has no authentication token */ public function isGranted($attributes, $object = null) { return $this['security.authorization_checker']->isGranted($attributes, $object); } } src/Silex/src/Silex/Application/SwiftmailerTrait.php000066400000000000000000000014231516072260400230550ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Application; /** * Swiftmailer trait. * * @author Fabien Potencier */ trait SwiftmailerTrait { /** * Sends an email. * * @param \Swift_Message $message A \Swift_Message instance * @param array $failedRecipients An array of failures by-reference * * @return int The number of sent messages */ public function mail(\Swift_Message $message, &$failedRecipients = null) { return $this['mailer']->send($message, $failedRecipients); } } src/Silex/src/Silex/Application/TranslationTrait.php000066400000000000000000000030621516072260400230660ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Application; /** * Translation trait. * * @author Fabien Potencier */ trait TranslationTrait { /** * Translates the given message. * * @param string $id The message id * @param array $parameters An array of parameters for the message * @param string $domain The domain for the message * @param string $locale The locale * * @return string The translated string */ public function trans($id, array $parameters = [], $domain = 'messages', $locale = null) { return $this['translator']->trans($id, $parameters, $domain, $locale); } /** * Translates the given choice message by choosing a translation according to a number. * * @param string $id The message id * @param int $number The number to use to find the indice of the message * @param array $parameters An array of parameters for the message * @param string $domain The domain for the message * @param string $locale The locale * * @return string The translated string */ public function transChoice($id, $number, array $parameters = [], $domain = 'messages', $locale = null) { return $this['translator']->transChoice($id, $number, $parameters, $domain, $locale); } } src/Silex/src/Silex/Application/TwigTrait.php000066400000000000000000000033361516072260400215060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Application; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\StreamedResponse; /** * Twig trait. * * @author Fabien Potencier */ trait TwigTrait { /** * Renders a view and returns a Response. * * To stream a view, pass an instance of StreamedResponse as a third argument. * * @param string $view The view name * @param array $parameters An array of parameters to pass to the view * @param Response $response A Response instance * * @return Response A Response instance */ public function render($view, array $parameters = [], Response $response = null) { $twig = $this['twig']; if ($response instanceof StreamedResponse) { $response->setCallback(function () use ($twig, $view, $parameters) { $twig->display($view, $parameters); }); } else { if (null === $response) { $response = new Response(); } $response->setContent($twig->render($view, $parameters)); } return $response; } /** * Renders a view. * * @param string $view The view name * @param array $parameters An array of parameters to pass to the view * * @return string The rendered view */ public function renderView($view, array $parameters = []) { return $this['twig']->render($view, $parameters); } } src/Silex/src/Silex/Application/UrlGeneratorTrait.php000066400000000000000000000023521516072260400232020ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Application; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; /** * UrlGenerator trait. * * @author Fabien Potencier */ trait UrlGeneratorTrait { /** * Generates a path from the given parameters. * * @param string $route The name of the route * @param mixed $parameters An array of parameters * * @return string The generated path */ public function path($route, $parameters = []) { return $this['url_generator']->generate($route, $parameters, UrlGeneratorInterface::ABSOLUTE_PATH); } /** * Generates an absolute URL from the given parameters. * * @param string $route The name of the route * @param mixed $parameters An array of parameters * * @return string The generated URL */ public function url($route, $parameters = []) { return $this['url_generator']->generate($route, $parameters, UrlGeneratorInterface::ABSOLUTE_URL); } } src/Silex/src/Silex/CallbackResolver.php000066400000000000000000000037001516072260400205360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Pimple\Container; class CallbackResolver { const SERVICE_PATTERN = "/[A-Za-z0-9\._\-]+:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/"; private $app; public function __construct(Container $app) { $this->app = $app; } /** * Returns true if the string is a valid service method representation. * * @param string $name * * @return bool */ public function isValid($name) { return is_string($name) && (preg_match(static::SERVICE_PATTERN, $name) || isset($this->app[$name])); } /** * Returns a callable given its string representation. * * @param string $name * * @return callable * * @throws \InvalidArgumentException in case the method does not exist */ public function convertCallback($name) { if (preg_match(static::SERVICE_PATTERN, $name)) { list($service, $method) = explode(':', $name, 2); $callback = [$this->app[$service], $method]; } else { $service = $name; $callback = $this->app[$name]; } if (!is_callable($callback)) { throw new \InvalidArgumentException(sprintf('Service "%s" is not callable.', $service)); } return $callback; } /** * Returns a callable given its string representation if it is a valid service method. * * @param string $name * * @return string|callable A callable value or the string passed in * * @throws \InvalidArgumentException in case the method does not exist */ public function resolveCallback($name) { return $this->isValid($name) ? $this->convertCallback($name) : $name; } } src/Silex/src/Silex/Controller.php000066400000000000000000000057621516072260400174550ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Silex\Exception\ControllerFrozenException; /** * A wrapper for a controller, mapped to a route. * * __call() forwards method-calls to Route, but returns instance of Controller * listing Route's methods below, so that IDEs know they are valid * * @method Controller assert(string $variable, string $regexp) * @method Controller value(string $variable, mixed $default) * @method Controller convert(string $variable, mixed $callback) * @method Controller method(string $method) * @method Controller requireHttp() * @method Controller requireHttps() * @method Controller before(mixed $callback) * @method Controller after(mixed $callback) * @method Controller when(string $condition) * * @author Igor Wiedler */ class Controller { private $route; private $routeName; private $isFrozen = false; /** * Constructor. * * @param Route $route */ public function __construct(Route $route) { $this->route = $route; } /** * Gets the controller's route. * * @return Route */ public function getRoute() { return $this->route; } /** * Gets the controller's route name. * * @return string */ public function getRouteName() { return $this->routeName; } /** * Sets the controller's route. * * @param string $routeName * * @return Controller $this The current Controller instance */ public function bind($routeName) { if ($this->isFrozen) { throw new ControllerFrozenException(sprintf('Calling %s on frozen %s instance.', __METHOD__, __CLASS__)); } $this->routeName = $routeName; return $this; } public function __call($method, $arguments) { if (!method_exists($this->route, $method)) { throw new \BadMethodCallException(sprintf('Method "%s::%s" does not exist.', get_class($this->route), $method)); } call_user_func_array([$this->route, $method], $arguments); return $this; } /** * Freezes the controller. * * Once the controller is frozen, you can no longer change the route name */ public function freeze() { $this->isFrozen = true; } public function generateRouteName($prefix) { $methods = implode('_', $this->route->getMethods()).'_'; $routeName = $methods.$prefix.$this->route->getPath(); $routeName = str_replace(['/', ':', '|', '-'], '_', $routeName); $routeName = preg_replace('/[^a-z0-9A-Z_.]+/', '', $routeName); // Collapse consecutive underscores down into a single underscore. $routeName = preg_replace('/_+/', '_', $routeName); return $routeName; } } src/Silex/src/Silex/ControllerCollection.php000066400000000000000000000167701516072260400214720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\HttpFoundation\Request; /** * Builds Silex controllers. * * It acts as a staging area for routes. You are able to set the route name * until flush() is called, at which point all controllers are frozen and * converted to a RouteCollection. * * __call() forwards method-calls to Route, but returns instance of ControllerCollection * listing Route's methods below, so that IDEs know they are valid * * @method ControllerCollection assert(string $variable, string $regexp) * @method ControllerCollection value(string $variable, mixed $default) * @method ControllerCollection convert(string $variable, mixed $callback) * @method ControllerCollection method(string $method) * @method ControllerCollection requireHttp() * @method ControllerCollection requireHttps() * @method ControllerCollection before(mixed $callback) * @method ControllerCollection after(mixed $callback) * @method ControllerCollection when(string $condition) * * @author Igor Wiedler * @author Fabien Potencier */ class ControllerCollection { protected $controllers = []; protected $defaultRoute; protected $defaultController; protected $prefix; protected $routesFactory; protected $controllersFactory; public function __construct(Route $defaultRoute, RouteCollection $routesFactory = null, $controllersFactory = null) { $this->defaultRoute = $defaultRoute; $this->routesFactory = $routesFactory; $this->controllersFactory = $controllersFactory; $this->defaultController = function (Request $request) { throw new \LogicException(sprintf('The "%s" route must have code to run when it matches.', $request->attributes->get('_route'))); }; } /** * Mounts controllers under the given route prefix. * * @param string $prefix The route prefix * @param ControllerCollection|callable $controllers A ControllerCollection instance or a callable for defining routes * * @throws \LogicException */ public function mount($prefix, $controllers) { if (is_callable($controllers)) { $collection = $this->controllersFactory ? call_user_func($this->controllersFactory) : new static(new Route(), new RouteCollection()); $collection->defaultRoute = clone $this->defaultRoute; call_user_func($controllers, $collection); $controllers = $collection; } elseif (!$controllers instanceof self) { throw new \LogicException('The "mount" method takes either a "ControllerCollection" instance or callable.'); } $controllers->prefix = $prefix; $this->controllers[] = $controllers; } /** * Maps a pattern to a callable. * * You can optionally specify HTTP methods that should be matched. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function match($pattern, $to = null) { $route = clone $this->defaultRoute; $route->setPath($pattern); $this->controllers[] = $controller = new Controller($route); $route->setDefault('_controller', null === $to ? $this->defaultController : $to); return $controller; } /** * Maps a GET request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function get($pattern, $to = null) { return $this->match($pattern, $to)->method('GET'); } /** * Maps a POST request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function post($pattern, $to = null) { return $this->match($pattern, $to)->method('POST'); } /** * Maps a PUT request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function put($pattern, $to = null) { return $this->match($pattern, $to)->method('PUT'); } /** * Maps a DELETE request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function delete($pattern, $to = null) { return $this->match($pattern, $to)->method('DELETE'); } /** * Maps an OPTIONS request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function options($pattern, $to = null) { return $this->match($pattern, $to)->method('OPTIONS'); } /** * Maps a PATCH request to a callable. * * @param string $pattern Matched route pattern * @param mixed $to Callback that returns the response when matched * * @return Controller */ public function patch($pattern, $to = null) { return $this->match($pattern, $to)->method('PATCH'); } public function __call($method, $arguments) { if (!method_exists($this->defaultRoute, $method)) { throw new \BadMethodCallException(sprintf('Method "%s::%s" does not exist.', get_class($this->defaultRoute), $method)); } call_user_func_array([$this->defaultRoute, $method], $arguments); foreach ($this->controllers as $controller) { call_user_func_array([$controller, $method], $arguments); } return $this; } /** * Persists and freezes staged controllers. * * @return RouteCollection A RouteCollection instance */ public function flush() { if (null === $this->routesFactory) { $routes = new RouteCollection(); } else { $routes = $this->routesFactory; } return $this->doFlush('', $routes); } private function doFlush($prefix, RouteCollection $routes) { if ('' !== $prefix) { $prefix = '/'.trim(trim($prefix), '/'); } foreach ($this->controllers as $controller) { if ($controller instanceof Controller) { $controller->getRoute()->setPath($prefix.$controller->getRoute()->getPath()); if (!$name = $controller->getRouteName()) { $name = $base = $controller->generateRouteName(''); $i = 0; while ($routes->get($name)) { $name = $base.'_'.++$i; } $controller->bind($name); } $routes->add($name, $controller->getRoute()); $controller->freeze(); } else { $controller->doFlush($prefix.$controller->prefix, $routes); } } $this->controllers = []; return $routes; } } src/Silex/src/Silex/EventListener/000077500000000000000000000000001516072260400173765ustar00rootroot00000000000000src/Silex/src/Silex/EventListener/ConverterListener.php000066400000000000000000000035671516072260400235770ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\EventListener; use Silex\CallbackResolver; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\ControllerEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Routing\RouteCollection; /** * Handles converters. * * @author Fabien Potencier */ class ConverterListener implements EventSubscriberInterface { protected $routes; protected $callbackResolver; /** * Constructor. * * @param RouteCollection $routes A RouteCollection instance * @param CallbackResolver $callbackResolver A CallbackResolver instance */ public function __construct(RouteCollection $routes, CallbackResolver $callbackResolver) { $this->routes = $routes; $this->callbackResolver = $callbackResolver; } /** * Handles converters. * * @param ControllerEvent $event The event to handle */ public function onKernelController(ControllerEvent $event) { $request = $event->getRequest(); $route = $this->routes->get($request->attributes->get('_route')); if ($route && $converters = $route->getOption('_converters')) { foreach ($converters as $name => $callback) { $callback = $this->callbackResolver->resolveCallback($callback); $request->attributes->set($name, call_user_func($callback, $request->attributes->get($name), $request)); } } } public static function getSubscribedEvents() { return [ KernelEvents::CONTROLLER => 'onKernelController', ]; } } src/Silex/src/Silex/EventListener/LogListener.php000066400000000000000000000073551516072260400223500ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\EventListener; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\RedirectResponse; /** * Logs request, response, and exceptions. */ class LogListener implements EventSubscriberInterface { protected $logger; protected $exceptionLogFilter; public function __construct(LoggerInterface $logger, $exceptionLogFilter = null) { $this->logger = $logger; if (null === $exceptionLogFilter) { $exceptionLogFilter = function (\Exception $e) { if ($e instanceof HttpExceptionInterface && $e->getStatusCode() < 500) { return LogLevel::ERROR; } return LogLevel::CRITICAL; }; } $this->exceptionLogFilter = $exceptionLogFilter; } /** * Logs master requests on event KernelEvents::REQUEST. * * @param RequestEvent $event */ public function onKernelRequest(RequestEvent $event) { if (!$event->isMasterRequest()) { return; } $this->logRequest($event->getRequest()); } /** * Logs master response on event KernelEvents::RESPONSE. * * @param FilterResponseEvent $event */ public function onKernelResponse(FilterResponseEvent $event) { if (!$event->isMasterRequest()) { return; } $this->logResponse($event->getResponse()); } /** * Logs uncaught exceptions on event KernelEvents::EXCEPTION. * * @param ExceptionEvent $event */ public function onKernelException(ExceptionEvent $event) { $this->logException($event->getException()); } /** * Logs a request. * * @param Request $request */ protected function logRequest(Request $request) { $this->logger->log(LogLevel::DEBUG, '> '.$request->getMethod().' '.$request->getRequestUri()); } /** * Logs a response. * * @param Response $response */ protected function logResponse(Response $response) { $message = '< '.$response->getStatusCode(); if ($response instanceof RedirectResponse) { $message .= ' '.$response->getTargetUrl(); } $this->logger->log(LogLevel::DEBUG, $message); } /** * Logs an exception. */ protected function logException(\Exception $e) { $this->logger->log(call_user_func($this->exceptionLogFilter, $e), sprintf('%s: %s (uncaught exception) at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()), ['exception' => $e]); } public static function getSubscribedEvents() { return [ KernelEvents::REQUEST => ['onKernelRequest', 0], KernelEvents::RESPONSE => ['onKernelResponse', 0], /* * Priority -4 is used to come after those from SecurityServiceProvider (0) * but before the error handlers added with Silex\Application::error (defaults to -8) */ KernelEvents::EXCEPTION => ['onKernelException', -4], ]; } } src/Silex/src/Silex/EventListener/MiddlewareListener.php000066400000000000000000000062021516072260400236720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\EventListener; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Silex\Application; /** * Manages the route middlewares. * * @author Fabien Potencier */ class MiddlewareListener implements EventSubscriberInterface { protected $app; /** * Constructor. * * @param Application $app An Application instance */ public function __construct(Application $app) { $this->app = $app; } /** * Runs before filters. * * @param RequestEvent $event The event to handle */ public function onKernelRequest(RequestEvent $event) { $request = $event->getRequest(); $routeName = $request->attributes->get('_route'); if (!$route = $this->app['routes']->get($routeName)) { return; } foreach ((array) $route->getOption('_before_middlewares') as $callback) { $ret = call_user_func($this->app['callback_resolver']->resolveCallback($callback), $request, $this->app); if ($ret instanceof Response) { $event->setResponse($ret); return; } elseif (null !== $ret) { throw new \RuntimeException(sprintf('A before middleware for route "%s" returned an invalid response value. Must return null or an instance of Response.', $routeName)); } } } /** * Runs after filters. * * @param FilterResponseEvent $event The event to handle */ public function onKernelResponse(\Symfony\Component\HttpKernel\Event\ResponseEvent $event) { $request = $event->getRequest(); $routeName = $request->attributes->get('_route'); if (is_null($routeName) || !$route = $this->app['routes']->get($routeName)) { return; } foreach ((array) $route->getOption('_after_middlewares') as $callback) { $response = call_user_func($this->app['callback_resolver']->resolveCallback($callback), $request, $event->getResponse(), $this->app); if ($response instanceof Response) { $event->setResponse($response); } elseif (null !== $response) { throw new \RuntimeException(sprintf('An after middleware for route "%s" returned an invalid response value. Must return null or an instance of Response.', $routeName)); } } } public static function getSubscribedEvents() { return [ // this must be executed after the late events defined with before() (and their priority is -512) KernelEvents::REQUEST => ['onKernelRequest', -1024], KernelEvents::RESPONSE => ['onKernelResponse', 128], ]; } } src/Silex/src/Silex/EventListener/StringToResponseListener.php000066400000000000000000000025651516072260400251150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\EventListener; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Response; /** * Converts string responses to proper Response instances. * * @author Fabien Potencier */ class StringToResponseListener implements EventSubscriberInterface { /** * Handles string responses. * * @param ViewEvent $event The event to handle */ public function onKernelView(\Symfony\Component\HttpKernel\Event\ViewEvent $event) { $response = $event->getControllerResult(); if (!( null === $response || is_array($response) || $response instanceof Response || (is_object($response) && !method_exists($response, '__toString')) )) { $event->setResponse(new Response((string) $response)); } } public static function getSubscribedEvents() { return [ KernelEvents::VIEW => ['onKernelView', -10], ]; } } src/Silex/src/Silex/Exception/000077500000000000000000000000001516072260400165455ustar00rootroot00000000000000src/Silex/src/Silex/Exception/ControllerFrozenException.php000066400000000000000000000006731516072260400244520ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Exception; /** * Exception, is thrown when a frozen controller is modified. * * @author Igor Wiedler */ class ControllerFrozenException extends \RuntimeException { } src/Silex/src/Silex/ExceptionHandler.php000066400000000000000000000027741516072260400205660ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Symfony\Component\Debug\ExceptionHandler as DebugExceptionHandler; use Symfony\Component\Debug\Exception\FlattenException; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\KernelEvents; /** * Default exception handler. * * @author Fabien Potencier */ class ExceptionHandler implements EventSubscriberInterface { protected $debug; public function __construct($debug) { $this->debug = $debug; } public function onSilexError(ExceptionEvent $event) { $handler = new DebugExceptionHandler($this->debug); $exception = $event->getException(); if (!$exception instanceof FlattenException) { $exception = FlattenException::create($exception); } $response = Response::create($handler->getHtml($exception), $exception->getStatusCode(), $exception->getHeaders())->setCharset(ini_get('default_charset')); $event->setResponse($response); } /** * {@inheritdoc} */ public static function getSubscribedEvents() { return [KernelEvents::EXCEPTION => ['onSilexError', -255]]; } } src/Silex/src/Silex/ExceptionListenerWrapper.php000066400000000000000000000057721516072260400223400ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\Event\ViewEvent; /** * Wraps exception listeners. * * @author Fabien Potencier */ class ExceptionListenerWrapper { protected $app; protected $callback; /** * Constructor. * * @param Application $app An Application instance * @param callable $callback */ public function __construct(Application $app, $callback) { $this->app = $app; $this->callback = $callback; } public function __invoke(ExceptionEvent $event) { $exception = $event->getThrowable(); $this->callback = $this->app['callback_resolver']->resolveCallback($this->callback); if (!$this->shouldRun($exception)) { return; } $code = $exception instanceof HttpExceptionInterface ? $exception->getStatusCode() : 500; $response = call_user_func($this->callback, $exception, $event->getRequest(), $code, $event); $this->ensureResponse($response, $event); } protected function shouldRun(\Exception $exception) { if (is_array($this->callback)) { $callbackReflection = new \ReflectionMethod($this->callback[0], $this->callback[1]); } elseif (is_object($this->callback) && !$this->callback instanceof \Closure) { $callbackReflection = new \ReflectionObject($this->callback); $callbackReflection = $callbackReflection->getMethod('__invoke'); } else { $callbackReflection = new \ReflectionFunction($this->callback); } if ($callbackReflection->getNumberOfParameters() > 0) { $parameters = $callbackReflection->getParameters(); $expectedException = $parameters[0]; $class = $expectedException->getType() && !$expectedException->getType()->isBuiltin() ? new \ReflectionClass($expectedException->getType()->getName()) : null; if ($class && !$class->isInstance($exception)) { return false; } } return true; } protected function ensureResponse($response, ExceptionEvent $event) { if ($response instanceof Response) { $event->setResponse($response); } else { $viewEvent = new ViewEvent($this->app['kernel'], $event->getRequest(), $event->getRequestType(), $response); $this->app['dispatcher']->dispatch($viewEvent, KernelEvents::VIEW); if ($viewEvent->hasResponse()) { $event->setResponse($viewEvent->getResponse()); } } } } src/Silex/src/Silex/Provider/000077500000000000000000000000001516072260400164015ustar00rootroot00000000000000src/Silex/src/Silex/Provider/AssetServiceProvider.php000066400000000000000000000067761516072260400232450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Symfony\Component\Asset\Packages; use Symfony\Component\Asset\Package; use Symfony\Component\Asset\PathPackage; use Symfony\Component\Asset\UrlPackage; use Symfony\Component\Asset\Context\RequestStackContext; use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy; use Symfony\Component\Asset\VersionStrategy\JsonManifestVersionStrategy; use Symfony\Component\Asset\VersionStrategy\StaticVersionStrategy; /** * Symfony Asset component Provider. * * @author Fabien Potencier */ class AssetServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['assets.packages'] = function ($app) { $packages = []; foreach ($app['assets.named_packages'] as $name => $package) { $version = $app['assets.strategy_factory'](isset($package['version']) ? $package['version'] : null, isset($package['version_format']) ? $package['version_format'] : null, isset($package['json_manifest_path']) ? $package['json_manifest_path'] : null, $name); $packages[$name] = $app['assets.package_factory'](isset($package['base_path']) ? $package['base_path'] : '', isset($package['base_urls']) ? $package['base_urls'] : [], $version, $name); } return new Packages($app['assets.default_package'], $packages); }; $app['assets.default_package'] = function ($app) { $version = $app['assets.strategy_factory']($app['assets.version'], $app['assets.version_format'], $app['assets.json_manifest_path'], 'default'); return $app['assets.package_factory']($app['assets.base_path'], $app['assets.base_urls'], $version, 'default'); }; $app['assets.context'] = function ($app) { return new RequestStackContext($app['request_stack']); }; $app['assets.base_path'] = ''; $app['assets.base_urls'] = []; $app['assets.version'] = null; $app['assets.version_format'] = null; $app['assets.json_manifest_path'] = null; $app['assets.named_packages'] = []; // prototypes $app['assets.strategy_factory'] = $app->protect(function ($version, $format, $jsonManifestPath, $name) use ($app) { if ($version && $jsonManifestPath) { throw new \LogicException(sprintf('Asset package "%s" cannot have version and manifest.', $name)); } if ($version) { return new StaticVersionStrategy($version, $format); } if ($jsonManifestPath) { return new JsonManifestVersionStrategy($jsonManifestPath); } return new EmptyVersionStrategy(); }); $app['assets.package_factory'] = $app->protect(function ($basePath, $baseUrls, $version, $name) use ($app) { if ($basePath && $baseUrls) { throw new \LogicException(sprintf('Asset package "%s" cannot have base URLs and base paths.', $name)); } if (!$baseUrls) { return new PathPackage($basePath, $version, $app['assets.context']); } return new UrlPackage($baseUrls, $version, $app['assets.context']); }); } } src/Silex/src/Silex/Provider/CsrfServiceProvider.php000066400000000000000000000026671516072260400230560ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Symfony\Component\Security\Csrf\CsrfTokenManager; use Symfony\Component\Security\Csrf\TokenGenerator\UriSafeTokenGenerator; use Symfony\Component\Security\Csrf\TokenStorage\SessionTokenStorage; use Symfony\Component\Security\Csrf\TokenStorage\NativeSessionTokenStorage; /** * Symfony CSRF Security component Provider. * * @author Fabien Potencier */ class CsrfServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['csrf.token_manager'] = function ($app) { return new CsrfTokenManager($app['csrf.token_generator'], $app['csrf.token_storage']); }; $app['csrf.token_storage'] = function ($app) { if (isset($app['session'])) { return new SessionTokenStorage($app['session'], $app['csrf.session_namespace']); } return new NativeSessionTokenStorage($app['csrf.session_namespace']); }; $app['csrf.token_generator'] = function ($app) { return new UriSafeTokenGenerator(); }; $app['csrf.session_namespace'] = '_csrf'; } } src/Silex/src/Silex/Provider/DoctrineServiceProvider.php000066400000000000000000000075161516072260400237260ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\Configuration; use Doctrine\Common\EventManager; use Symfony\Bridge\Doctrine\Logger\DbalLogger; /** * Doctrine DBAL Provider. * * @author Fabien Potencier */ class DoctrineServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['db.default_options'] = [ 'driver' => 'pdo_mysql', 'dbname' => null, 'host' => 'localhost', 'user' => 'root', 'password' => null, ]; $app['dbs.options.initializer'] = $app->protect(function () use ($app) { static $initialized = false; if ($initialized) { return; } $initialized = true; if (!isset($app['dbs.options'])) { $app['dbs.options'] = ['default' => isset($app['db.options']) ? $app['db.options'] : []]; } $tmp = $app['dbs.options']; foreach ($tmp as $name => &$options) { $options = array_replace($app['db.default_options'], $options); if (!isset($app['dbs.default'])) { $app['dbs.default'] = $name; } } $app['dbs.options'] = $tmp; }); $app['dbs'] = function ($app) { $app['dbs.options.initializer'](); $dbs = new Container(); foreach ($app['dbs.options'] as $name => $options) { if ($app['dbs.default'] === $name) { // we use shortcuts here in case the default has been overridden $config = $app['db.config']; $manager = $app['db.event_manager']; } else { $config = $app['dbs.config'][$name]; $manager = $app['dbs.event_manager'][$name]; } $dbs[$name] = function ($dbs) use ($options, $config, $manager) { return DriverManager::getConnection($options, $config, $manager); }; } return $dbs; }; $app['dbs.config'] = function ($app) { $app['dbs.options.initializer'](); $configs = new Container(); $addLogger = isset($app['logger']) && null !== $app['logger'] && class_exists('Symfony\Bridge\Doctrine\Logger\DbalLogger'); foreach ($app['dbs.options'] as $name => $options) { $configs[$name] = new Configuration(); if ($addLogger) { $configs[$name]->setSQLLogger(new DbalLogger($app['logger'], isset($app['stopwatch']) ? $app['stopwatch'] : null)); } } return $configs; }; $app['dbs.event_manager'] = function ($app) { $app['dbs.options.initializer'](); $managers = new Container(); foreach ($app['dbs.options'] as $name => $options) { $managers[$name] = new EventManager(); } return $managers; }; // shortcuts for the "first" DB $app['db'] = function ($app) { $dbs = $app['dbs']; return $dbs[$app['dbs.default']]; }; $app['db.config'] = function ($app) { $dbs = $app['dbs.config']; return $dbs[$app['dbs.default']]; }; $app['db.event_manager'] = function ($app) { $dbs = $app['dbs.event_manager']; return $dbs[$app['dbs.default']]; }; } } src/Silex/src/Silex/Provider/ExceptionHandlerServiceProvider.php000066400000000000000000000014601516072260400254030ustar00rootroot00000000000000addSubscriber($app['exception_handler']); } } } src/Silex/src/Silex/Provider/Form/000077500000000000000000000000001516072260400173045ustar00rootroot00000000000000src/Silex/src/Silex/Provider/Form/SilexFormExtension.php000066400000000000000000000072211516072260400236240ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\Form; use Pimple\Container; use Symfony\Component\Form\Exception\InvalidArgumentException; use Symfony\Component\Form\FormExtensionInterface; use Symfony\Component\Form\FormTypeGuesserChain; class SilexFormExtension implements FormExtensionInterface { private $app; private $types; private $typeExtensions; private $guessers; private $guesserLoaded = false; private $guesser; public function __construct(Container $app, array $types, array $typeExtensions, array $guessers) { $this->app = $app; $this->setTypes($types); $this->setTypeExtensions($typeExtensions); $this->setGuessers($guessers); } public function getType($name) { if (!isset($this->types[$name])) { throw new InvalidArgumentException(sprintf('The type "%s" is not the name of a registered form type.', $name)); } if (!is_object($this->types[$name])) { $this->types[$name] = $this->app[$this->types[$name]]; } return $this->types[$name]; } public function hasType($name) { return isset($this->types[$name]); } public function getTypeExtensions($name) { return isset($this->typeExtensions[$name]) ? $this->typeExtensions[$name] : []; } public function hasTypeExtensions($name) { return isset($this->typeExtensions[$name]); } public function getTypeGuesser() { if (!$this->guesserLoaded) { $this->guesserLoaded = true; if ($this->guessers) { $guessers = []; foreach ($this->guessers as $guesser) { if (!is_object($guesser)) { $guesser = $this->app[$guesser]; } $guessers[] = $guesser; } $this->guesser = new FormTypeGuesserChain($guessers); } } return $this->guesser; } private function setTypes(array $types) { $this->types = []; foreach ($types as $type) { if (!is_object($type)) { if (!isset($this->app[$type])) { throw new InvalidArgumentException(sprintf('Invalid form type. The silex service "%s" does not exist.', $type)); } $this->types[$type] = $type; } else { $this->types[get_class($type)] = $type; } } } private function setTypeExtensions(array $typeExtensions) { $this->typeExtensions = []; foreach ($typeExtensions as $extension) { if (!is_object($extension)) { if (!isset($this->app[$extension])) { throw new InvalidArgumentException(sprintf('Invalid form type extension. The silex service "%s" does not exist.', $extension)); } $extension = $this->app[$extension]; } $this->typeExtensions[$extension->getExtendedType()][] = $extension; } } private function setGuessers(array $guessers) { $this->guessers = []; foreach ($guessers as $guesser) { if (!is_object($guesser) && !isset($this->app[$guesser])) { throw new InvalidArgumentException(sprintf('Invalid form type guesser. The silex service "%s" does not exist.', $guesser)); } $this->guessers[] = $guesser; } } } src/Silex/src/Silex/Provider/FormServiceProvider.php000066400000000000000000000056101516072260400230530ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Symfony\Component\Form\Extension\Csrf\CsrfExtension; use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension; use Symfony\Component\Form\Extension\Validator\ValidatorExtension as FormValidatorExtension; use Symfony\Component\Form\FormFactory; use Symfony\Component\Form\FormRegistry; use Symfony\Component\Form\ResolvedFormTypeFactory; /** * Symfony Form component Provider. * * @author Fabien Potencier */ class FormServiceProvider implements ServiceProviderInterface { public function register(Container $app) { if (!class_exists('Locale')) { throw new \RuntimeException('You must either install the PHP intl extension or the Symfony Intl Component to use the Form extension.'); } $app['form.types'] = function ($app) { return []; }; $app['form.type.extensions'] = function ($app) { return []; }; $app['form.type.guessers'] = function ($app) { return []; }; $app['form.extension.csrf'] = function ($app) { if (isset($app['translator'])) { $translationDomain = isset($app['validator.translation_domain']) ? $app['validator.translation_domain'] : null; return new CsrfExtension($app['csrf.token_manager'], $app['translator'], $translationDomain); } return new CsrfExtension($app['csrf.token_manager']); }; $app['form.extension.silex'] = function ($app) { return new Form\SilexFormExtension($app, $app['form.types'], $app['form.type.extensions'], $app['form.type.guessers']); }; $app['form.extensions'] = function ($app) { $extensions = [ new HttpFoundationExtension(), ]; if (isset($app['csrf.token_manager'])) { $extensions[] = $app['form.extension.csrf']; } if (isset($app['validator'])) { $extensions[] = new FormValidatorExtension($app['validator']); } $extensions[] = $app['form.extension.silex']; return $extensions; }; $app['form.factory'] = function ($app) { return new FormFactory($app['form.registry'], $app['form.resolved_type_factory']); }; $app['form.registry'] = function ($app) { return new FormRegistry($app['form.extensions'], $app['form.resolved_type_factory']); }; $app['form.resolved_type_factory'] = function ($app) { return new ResolvedFormTypeFactory(); }; } } src/Silex/src/Silex/Provider/HttpCache/000077500000000000000000000000001516072260400202445ustar00rootroot00000000000000src/Silex/src/Silex/Provider/HttpCache/HttpCache.php000066400000000000000000000016761516072260400226320ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\HttpCache; use Symfony\Component\HttpKernel\HttpCache\HttpCache as BaseHttpCache; use Symfony\Component\HttpFoundation\Request; /** * HTTP Cache extension to allow using the run() shortcut. * * @author Fabien Potencier */ class HttpCache extends BaseHttpCache { /** * Handles the Request and delivers the Response. * * @param Request $request The Request object */ public function run(Request $request = null) { if (null === $request) { $request = Request::createFromGlobals(); } $response = $this->handle($request); $response->send(); $this->terminate($request, $response); } } src/Silex/src/Silex/Provider/HttpCacheServiceProvider.php000066400000000000000000000034561516072260400240210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Provider\HttpCache\HttpCache; use Silex\Api\EventListenerProviderInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpKernel\HttpCache\Esi; use Symfony\Component\HttpKernel\HttpCache\Store; use Symfony\Component\HttpKernel\EventListener\SurrogateListener; /** * Symfony HttpKernel component Provider for HTTP cache. * * @author Fabien Potencier */ class HttpCacheServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['http_cache'] = function ($app) { $app['http_cache.options'] = array_replace( [ 'debug' => $app['debug'], ], $app['http_cache.options'] ); return new HttpCache($app, $app['http_cache.store'], $app['http_cache.esi'], $app['http_cache.options']); }; $app['http_cache.esi'] = function ($app) { return new Esi(); }; $app['http_cache.store'] = function ($app) { return new Store($app['http_cache.cache_dir']); }; $app['http_cache.esi_listener'] = function ($app) { return new SurrogateListener($app['http_cache.esi']); }; $app['http_cache.options'] = []; } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { $dispatcher->addSubscriber($app['http_cache.esi_listener']); } } src/Silex/src/Silex/Provider/HttpFragmentServiceProvider.php000066400000000000000000000057631516072260400245640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Api\EventListenerProviderInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpKernel\Fragment\FragmentHandler; use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer; use Symfony\Component\HttpKernel\Fragment\EsiFragmentRenderer; use Symfony\Component\HttpKernel\Fragment\HIncludeFragmentRenderer; use Symfony\Component\HttpKernel\EventListener\FragmentListener; use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\HttpKernel\UriSigner; /** * HttpKernel Fragment integration for Silex. * * @author Fabien Potencier */ class HttpFragmentServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['fragment.handler'] = function ($app) { return new FragmentHandler($app['request_stack'], $app['fragment.renderers'], $app['debug']); }; $app['fragment.renderer.inline'] = function ($app) { $renderer = new InlineFragmentRenderer($app['kernel'], $app['dispatcher']); $renderer->setFragmentPath($app['fragment.path']); return $renderer; }; $app['fragment.renderer.hinclude'] = function ($app) { $renderer = new HIncludeFragmentRenderer(null, $app['uri_signer'], $app['fragment.renderer.hinclude.global_template'], $app['charset']); $renderer->setFragmentPath($app['fragment.path']); return $renderer; }; $app['fragment.renderer.esi'] = function ($app) { $renderer = new EsiFragmentRenderer($app['http_cache.esi'], $app['fragment.renderer.inline'], $app['uri_signer']); $renderer->setFragmentPath($app['fragment.path']); return $renderer; }; $app['fragment.listener'] = function ($app) { return new FragmentListener($app['uri_signer'], $app['fragment.path']); }; $app['uri_signer'] = function ($app) { return new UriSigner($app['uri_signer.secret']); }; $app['uri_signer.secret'] = md5(__DIR__); $app['fragment.path'] = '/_fragment'; $app['fragment.renderer.hinclude.global_template'] = null; $app['fragment.renderers'] = function ($app) { $renderers = [$app['fragment.renderer.inline'], $app['fragment.renderer.hinclude']]; if (isset($app['http_cache.esi'])) { $renderers[] = $app['fragment.renderer.esi']; } return $renderers; }; } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { $dispatcher->addSubscriber($app['fragment.listener']); } } src/Silex/src/Silex/Provider/HttpKernelServiceProvider.php000066400000000000000000000054031516072260400242300ustar00rootroot00000000000000addSubscriber(new ResponseListener($app['charset'])); $dispatcher->addSubscriber(new MiddlewareListener($app)); $dispatcher->addSubscriber(new ConverterListener($app['routes'], $app['callback_resolver'])); $dispatcher->addSubscriber(new StringToResponseListener()); if (class_exists(HttpHeaderSerializer::class)) { $dispatcher->addSubscriber(new AddLinkHeaderListener()); } } } src/Silex/src/Silex/Provider/LICENSE000066400000000000000000000020511516072260400174040ustar00rootroot00000000000000Copyright (c) 2010-2015 Fabien Potencier 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. src/Silex/src/Silex/Provider/Locale/000077500000000000000000000000001516072260400176005ustar00rootroot00000000000000src/Silex/src/Silex/Provider/Locale/LocaleListener.php000066400000000000000000000047511516072260400232250ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\Locale; use Pimple\Container; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\FinishRequestEvent; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Routing\RequestContext; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * Initializes the locale based on the current request. * * @author Fabien Potencier * @author Jérôme Tamarelle */ class LocaleListener implements EventSubscriberInterface { private $app; private $defaultLocale; private $requestStack; private $requestContext; public function __construct(Container $app, $defaultLocale = 'en', RequestStack $requestStack, RequestContext $requestContext = null) { $this->app = $app; $this->defaultLocale = $defaultLocale; $this->requestStack = $requestStack; $this->requestContext = $requestContext; } public function onKernelRequest(RequestEvent $event) { $request = $event->getRequest(); $request->setDefaultLocale($this->defaultLocale); $this->setLocale($request); $this->setRouterContext($request); $this->app['locale'] = $request->getLocale(); } public function onKernelFinishRequest(FinishRequestEvent $event) { if (null !== $parentRequest = $this->requestStack->getParentRequest()) { $this->setRouterContext($parentRequest); } } private function setLocale(Request $request) { if ($locale = $request->attributes->get('_locale')) { $request->setLocale($locale); } } private function setRouterContext(Request $request) { if (null !== $this->requestContext) { $this->requestContext->setParameter('_locale', $request->getLocale()); } } public static function getSubscribedEvents() { return [ // must be registered after the Router to have access to the _locale KernelEvents::REQUEST => [['onKernelRequest', 16]], KernelEvents::FINISH_REQUEST => [['onKernelFinishRequest', 0]], ]; } } src/Silex/src/Silex/Provider/LocaleServiceProvider.php000066400000000000000000000021341516072260400233450ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Api\EventListenerProviderInterface; use Silex\Provider\Locale\LocaleListener; use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** * Locale Provider. * * @author Fabien Potencier */ class LocaleServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['locale.listener'] = function ($app) { return new LocaleListener($app, $app['locale'], $app['request_stack'], isset($app['request_context']) ? $app['request_context'] : null); }; $app['locale'] = 'en'; } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { $dispatcher->addSubscriber($app['locale.listener']); } } src/Silex/src/Silex/Provider/MonologServiceProvider.php000066400000000000000000000113111516072260400235550ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Monolog\Formatter\LineFormatter; use Monolog\Logger; use Monolog\Handler; use Monolog\ErrorHandler; use Silex\Application; use Silex\Api\BootableProviderInterface; use Silex\Api\EventListenerProviderInterface; use Symfony\Bridge\Monolog\Handler\FingersCrossed\NotFoundActivationStrategy; use Symfony\Bridge\Monolog\Processor\DebugProcessor; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Silex\EventListener\LogListener; /** * Monolog Provider. * * @author Fabien Potencier */ class MonologServiceProvider implements ServiceProviderInterface, BootableProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['logger'] = function () use ($app) { return $app['monolog']; }; if ($bridge = class_exists('Symfony\Bridge\Monolog\Logger')) { if (isset($app['request_stack'])) { $app['monolog.not_found_activation_strategy'] = function () use ($app) { $level = MonologServiceProvider::translateLevel($app['monolog.level']); return new NotFoundActivationStrategy($app['request_stack'], ['^/'], $level); }; } } $app['monolog.logger.class'] = $bridge ? 'Symfony\Bridge\Monolog\Logger' : 'Monolog\Logger'; $app['monolog'] = function ($app) use ($bridge) { $log = new $app['monolog.logger.class']($app['monolog.name']); $handler = new Handler\GroupHandler($app['monolog.handlers']); if (isset($app['monolog.not_found_activation_strategy'])) { $handler = new Handler\FingersCrossedHandler($handler, $app['monolog.not_found_activation_strategy']); } $log->pushHandler($handler); if ($app['debug'] && $bridge) { $log->pushProcessor(new DebugProcessor()); } return $log; }; $app['monolog.formatter'] = function () { return new LineFormatter(); }; $app['monolog.handler'] = $defaultHandler = function () use ($app) { $level = MonologServiceProvider::translateLevel($app['monolog.level']); $handler = new Handler\StreamHandler($app['monolog.logfile'], $level, $app['monolog.bubble'], $app['monolog.permission']); $handler->setFormatter($app['monolog.formatter']); return $handler; }; $app['monolog.handlers'] = function () use ($app, $defaultHandler) { $handlers = []; // enables the default handler if a logfile was set or the monolog.handler service was redefined if ($app['monolog.logfile'] || $defaultHandler !== $app->raw('monolog.handler')) { $handlers[] = $app['monolog.handler']; } return $handlers; }; $app['monolog.level'] = function () { return Logger::DEBUG; }; $app['monolog.listener'] = function () use ($app) { return new LogListener($app['logger'], $app['monolog.exception.logger_filter']); }; $app['monolog.name'] = 'app'; $app['monolog.bubble'] = true; $app['monolog.permission'] = null; $app['monolog.exception.logger_filter'] = null; $app['monolog.logfile'] = null; $app['monolog.use_error_handler'] = function ($app) { return !$app['debug']; }; } public function boot(Application $app) { if ($app['monolog.use_error_handler']) { ErrorHandler::register($app['monolog']); } } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { if (isset($app['monolog.listener'])) { $dispatcher->addSubscriber($app['monolog.listener']); } } public static function translateLevel($name) { // level is already translated to logger constant, return as-is if (is_int($name)) { return $name; } $psrLevel = Logger::toMonologLevel($name); if (is_int($psrLevel)) { return $psrLevel; } $levels = Logger::getLevels(); $upper = strtoupper($name); if (!isset($levels[$upper])) { throw new \InvalidArgumentException("Provided logging level '$name' does not exist. Must be a valid monolog logging level."); } return $levels[$upper]; } } src/Silex/src/Silex/Provider/RememberMeServiceProvider.php000066400000000000000000000105611516072260400241710ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Api\EventListenerProviderInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\Security\Core\Authentication\Provider\RememberMeAuthenticationProvider; use Symfony\Component\Security\Http\Firewall\RememberMeListener; use Symfony\Component\Security\Http\RememberMe\TokenBasedRememberMeServices; use Symfony\Component\Security\Http\RememberMe\ResponseListener; /** * Remember-me authentication for the SecurityServiceProvider. * * @author Jérôme Tamarelle */ class RememberMeServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['security.remember_me.response_listener'] = function ($app) { if (!isset($app['security.token_storage'])) { throw new \LogicException('You must register the SecurityServiceProvider to use the RememberMeServiceProvider'); } return new ResponseListener(); }; $app['security.authentication_listener.factory.remember_me'] = $app->protect(function ($name, $options) use ($app) { if (empty($options['key'])) { $options['key'] = $name; } if (!isset($app['security.remember_me.service.'.$name])) { $app['security.remember_me.service.'.$name] = $app['security.remember_me.service._proto']($name, $options); } if (!isset($app['security.authentication_listener.'.$name.'.remember_me'])) { $app['security.authentication_listener.'.$name.'.remember_me'] = $app['security.authentication_listener.remember_me._proto']($name, $options); } if (!isset($app['security.authentication_provider.'.$name.'.remember_me'])) { $app['security.authentication_provider.'.$name.'.remember_me'] = $app['security.authentication_provider.remember_me._proto']($name, $options); } return [ 'security.authentication_provider.'.$name.'.remember_me', 'security.authentication_listener.'.$name.'.remember_me', null, // entry point 'remember_me', ]; }); $app['security.remember_me.service._proto'] = $app->protect(function ($providerKey, $options) use ($app) { return function () use ($providerKey, $options, $app) { $options = array_replace([ 'name' => 'REMEMBERME', 'lifetime' => 31536000, 'path' => '/', 'domain' => null, 'secure' => false, 'httponly' => true, 'always_remember_me' => false, 'remember_me_parameter' => '_remember_me', ], $options); return new TokenBasedRememberMeServices([$app['security.user_provider.'.$providerKey]], $options['key'], $providerKey, $options, $app['logger']); }; }); $app['security.authentication_listener.remember_me._proto'] = $app->protect(function ($providerKey) use ($app) { return function () use ($app, $providerKey) { $listener = new RememberMeListener( $app['security.token_storage'], $app['security.remember_me.service.'.$providerKey], $app['security.authentication_manager'], $app['logger'], $app['dispatcher'] ); return $listener; }; }); $app['security.authentication_provider.remember_me._proto'] = $app->protect(function ($name, $options) use ($app) { return function () use ($app, $name, $options) { return new RememberMeAuthenticationProvider($app['security.user_checker'], $options['key'], $name); }; }); } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { $dispatcher->addSubscriber($app['security.remember_me.response_listener']); } } src/Silex/src/Silex/Provider/Routing/000077500000000000000000000000001516072260400200305ustar00rootroot00000000000000src/Silex/src/Silex/Provider/Routing/LazyRequestMatcher.php000066400000000000000000000026241516072260400243410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\Routing; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Matcher\RequestMatcherInterface; use Symfony\Component\Routing\Matcher\UrlMatcherInterface; /** * Implements a lazy UrlMatcher. * * @author Igor Wiedler * @author Jérôme Tamarelle */ class LazyRequestMatcher implements RequestMatcherInterface { private $factory; public function __construct(\Closure $factory) { $this->factory = $factory; } /** * Returns the corresponding RequestMatcherInterface instance. * * @return UrlMatcherInterface */ public function getRequestMatcher() { $matcher = call_user_func($this->factory); if (!$matcher instanceof RequestMatcherInterface) { throw new \LogicException("Factory supplied to LazyRequestMatcher must return implementation of Symfony\Component\Routing\RequestMatcherInterface."); } return $matcher; } /** * {@inheritdoc} */ public function matchRequest(Request $request): array { return $this->getRequestMatcher()->matchRequest($request); } } src/Silex/src/Silex/Provider/Routing/RedirectableUrlMatcher.php000066400000000000000000000031241516072260400251150ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\Routing; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\Routing\Matcher\RedirectableUrlMatcher as BaseRedirectableUrlMatcher; /** * Implements the RedirectableUrlMatcherInterface for Silex. * * @author Fabien Potencier */ class RedirectableUrlMatcher extends BaseRedirectableUrlMatcher { /** * {@inheritdoc} */ public function redirect(string $path, string $route, ?string $scheme = null) : array { $url = $this->context->getBaseUrl().$path; $query = $this->context->getQueryString() ?: ''; if ('' !== $query) { $url .= '?'.$query; } if ($this->context->getHost()) { if ($scheme) { $port = ''; if ('http' === $scheme && 80 != $this->context->getHttpPort()) { $port = ':'.$this->context->getHttpPort(); } elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) { $port = ':'.$this->context->getHttpsPort(); } $url = $scheme.'://'.$this->context->getHost().$port.$url; } } return [ '_controller' => function ($url) { return new RedirectResponse($url, 301); }, '_route' => $route, 'url' => $url, ]; } } src/Silex/src/Silex/Provider/RoutingServiceProvider.php000066400000000000000000000056351516072260400236060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\ControllerCollection; use Silex\Api\EventListenerProviderInterface; use Silex\Provider\Routing\RedirectableUrlMatcher; use Silex\Provider\Routing\LazyRequestMatcher; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Generator\UrlGenerator; use Symfony\Component\Routing\RequestContext; use Symfony\Component\HttpKernel\EventListener\RouterListener; use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** * Symfony Routing component Provider. * * @author Fabien Potencier */ class RoutingServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['route_class'] = 'Silex\\Route'; $app['route_factory'] = $app->factory(function ($app) { return new $app['route_class'](); }); $app['routes_factory'] = $app->factory(function () { return new RouteCollection(); }); $app['routes'] = function ($app) { return $app['routes_factory']; }; $app['url_generator'] = function ($app) { return new UrlGenerator($app['routes'], $app['request_context']); }; $app['request_matcher'] = function ($app) { return new RedirectableUrlMatcher($app['routes'], $app['request_context']); }; $app['request_context'] = function ($app) { $context = new RequestContext(); $context->setHttpPort(isset($app['request.http_port']) ? $app['request.http_port'] : 80); $context->setHttpsPort(isset($app['request.https_port']) ? $app['request.https_port'] : 443); return $context; }; $app['controllers'] = function ($app) { return $app['controllers_factory']; }; $controllers_factory = function () use ($app, &$controllers_factory) { return new ControllerCollection($app['route_factory'], $app['routes_factory'], $controllers_factory); }; $app['controllers_factory'] = $app->factory($controllers_factory); $app['routing.listener'] = function ($app) { $urlMatcher = new LazyRequestMatcher(function () use ($app) { return $app['request_matcher']; }); return new RouterListener($urlMatcher, $app['request_stack'], $app['request_context'], $app['logger'], null, isset($app['debug']) ? $app['debug'] : false); }; } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { $dispatcher->addSubscriber($app['routing.listener']); } } src/Silex/src/Silex/Provider/SecurityServiceProvider.php000066400000000000000000000763631516072260400237740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Application; use Silex\Api\BootableProviderInterface; use Silex\Api\ControllerProviderInterface; use Silex\Api\EventListenerProviderInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\User\UserChecker; use Symfony\Component\Security\Core\User\InMemoryUserProvider; use Symfony\Component\Security\Core\Encoder\EncoderFactory; use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder; use Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder; use Symfony\Component\Security\Core\Encoder\Pbkdf2PasswordEncoder; use Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider; use Symfony\Component\Security\Core\Authentication\Provider\AnonymousAuthenticationProvider; use Symfony\Component\Security\Core\Authentication\AuthenticationProviderManager; use Symfony\Component\Security\Core\Authentication\AuthenticationTrustResolver; use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler; use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationFailureHandler; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; use Symfony\Component\Security\Core\Authorization\AuthorizationChecker; use Symfony\Component\Security\Core\Authorization\Voter\RoleHierarchyVoter; use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter; use Symfony\Component\Security\Core\Authorization\AccessDecisionManager; use Symfony\Component\Security\Core\Role\RoleHierarchy; use Symfony\Component\Security\Core\Validator\Constraints\UserPasswordValidator; use Symfony\Component\Security\Http\Firewall; use Symfony\Component\Security\Http\FirewallMap; use Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener; use Symfony\Component\Security\Http\Firewall\AccessListener; use Symfony\Component\Security\Http\Firewall\BasicAuthenticationListener; use Symfony\Component\Security\Http\Firewall\LogoutListener; use Symfony\Component\Security\Http\Firewall\SwitchUserListener; use Symfony\Component\Security\Http\Firewall\AnonymousAuthenticationListener; use Symfony\Component\Security\Http\Firewall\ContextListener; use Symfony\Component\Security\Http\Firewall\ExceptionListener; use Symfony\Component\Security\Http\Firewall\ChannelListener; use Symfony\Component\Security\Http\EntryPoint\FormAuthenticationEntryPoint; use Symfony\Component\Security\Http\EntryPoint\BasicAuthenticationEntryPoint; use Symfony\Component\Security\Http\EntryPoint\RetryAuthenticationEntryPoint; use Symfony\Component\Security\Http\Session\SessionAuthenticationStrategy; use Symfony\Component\Security\Http\Logout\SessionLogoutHandler; use Symfony\Component\Security\Http\Logout\DefaultLogoutSuccessHandler; use Symfony\Component\Security\Http\AccessMap; use Symfony\Component\Security\Http\HttpUtils; use Symfony\Component\Security\Guard\GuardAuthenticatorHandler; use Symfony\Component\Security\Guard\Firewall\GuardAuthenticationListener; use Symfony\Component\Security\Guard\Provider\GuardAuthenticationProvider; /** * Symfony Security component Provider. * * @author Fabien Potencier */ class SecurityServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface, ControllerProviderInterface, BootableProviderInterface { protected $fakeRoutes; public function register(Container $app) { // used to register routes for login_check and logout $this->fakeRoutes = []; $that = $this; $app['security.role_hierarchy'] = []; $app['security.access_rules'] = []; $app['security.hide_user_not_found'] = true; $app['security.encoder.bcrypt.cost'] = 13; $app['security.authorization_checker'] = function ($app) { return new AuthorizationChecker($app['security.token_storage'], $app['security.authentication_manager'], $app['security.access_manager']); }; $app['security.token_storage'] = function ($app) { return new TokenStorage(); }; $app['user'] = $app->factory(function ($app) { if (null === $token = $app['security.token_storage']->getToken()) { return; } if (!is_object($user = $token->getUser())) { return; } return $user; }); $app['security.authentication_manager'] = function ($app) { $manager = new AuthenticationProviderManager($app['security.authentication_providers']); $manager->setEventDispatcher($app['dispatcher']); return $manager; }; // by default, all users use the digest encoder $app['security.encoder_factory'] = function ($app) { return new EncoderFactory([ 'Symfony\Component\Security\Core\User\UserInterface' => $app['security.default_encoder'], ]); }; // by default, all users use the BCrypt encoder $app['security.default_encoder'] = function ($app) { return $app['security.encoder.bcrypt']; }; $app['security.encoder.digest'] = function ($app) { return new MessageDigestPasswordEncoder(); }; $app['security.encoder.bcrypt'] = function ($app) { return new BCryptPasswordEncoder($app['security.encoder.bcrypt.cost']); }; $app['security.encoder.pbkdf2'] = function ($app) { return new Pbkdf2PasswordEncoder(); }; $app['security.user_checker'] = function ($app) { return new UserChecker(); }; $app['security.access_manager'] = function ($app) { return new AccessDecisionManager($app['security.voters']); }; $app['security.voters'] = function ($app) { return [ new RoleHierarchyVoter(new RoleHierarchy($app['security.role_hierarchy'])), new AuthenticatedVoter($app['security.trust_resolver']), ]; }; $app['security.firewall'] = function ($app) { if (isset($app['validator'])) { $app['security.validator.user_password_validator'] = function ($app) { return new UserPasswordValidator($app['security.token_storage'], $app['security.encoder_factory']); }; $app['validator.validator_service_ids'] = array_merge($app['validator.validator_service_ids'], ['security.validator.user_password' => 'security.validator.user_password_validator']); } return new Firewall($app['security.firewall_map'], $app['dispatcher']); }; $app['security.channel_listener'] = function ($app) { return new ChannelListener( $app['security.access_map'], new RetryAuthenticationEntryPoint( isset($app['request.http_port']) ? $app['request.http_port'] : 80, isset($app['request.https_port']) ? $app['request.https_port'] : 443 ), $app['logger'] ); }; // generate the build-in authentication factories foreach (['logout', 'pre_auth', 'guard', 'form', 'http', 'remember_me', 'anonymous'] as $type) { $entryPoint = null; if ('http' === $type) { $entryPoint = 'http'; } elseif ('form' === $type) { $entryPoint = 'form'; } elseif ('guard' === $type) { $entryPoint = 'guard'; } $app['security.authentication_listener.factory.'.$type] = $app->protect(function ($name, $options) use ($type, $app, $entryPoint) { if ($entryPoint && !isset($app['security.entry_point.'.$name.'.'.$entryPoint])) { $app['security.entry_point.'.$name.'.'.$entryPoint] = $app['security.entry_point.'.$entryPoint.'._proto']($name, $options); } if (!isset($app['security.authentication_listener.'.$name.'.'.$type])) { $app['security.authentication_listener.'.$name.'.'.$type] = $app['security.authentication_listener.'.$type.'._proto']($name, $options); } $provider = 'dao'; if ('anonymous' === $type) { $provider = 'anonymous'; } elseif ('guard' === $type) { $provider = 'guard'; } if (!isset($app['security.authentication_provider.'.$name.'.'.$provider])) { $app['security.authentication_provider.'.$name.'.'.$provider] = $app['security.authentication_provider.'.$provider.'._proto']($name, $options); } return [ 'security.authentication_provider.'.$name.'.'.$provider, 'security.authentication_listener.'.$name.'.'.$type, $entryPoint ? 'security.entry_point.'.$name.'.'.$entryPoint : null, $type, ]; }); } $app['security.firewall_map'] = function ($app) { $positions = ['logout', 'pre_auth', 'guard', 'form', 'http', 'remember_me', 'anonymous']; $providers = []; $configs = []; foreach ($app['security.firewalls'] as $name => $firewall) { $entryPoint = null; $pattern = isset($firewall['pattern']) ? $firewall['pattern'] : null; $users = isset($firewall['users']) ? $firewall['users'] : []; $security = isset($firewall['security']) ? (bool) $firewall['security'] : true; $stateless = isset($firewall['stateless']) ? (bool) $firewall['stateless'] : false; $context = isset($firewall['context']) ? $firewall['context'] : $name; $hosts = isset($firewall['hosts']) ? $firewall['hosts'] : null; $methods = isset($firewall['methods']) ? $firewall['methods'] : null; unset($firewall['pattern'], $firewall['users'], $firewall['security'], $firewall['stateless'], $firewall['context'], $firewall['methods'], $firewall['hosts']); $protected = false === $security ? false : count($firewall); $listeners = ['security.channel_listener']; if (is_string($users)) { $users = function () use ($app, $users) { return $app[$users]; }; } if ($protected) { if (!isset($app['security.context_listener.'.$context])) { if (!isset($app['security.user_provider.'.$name])) { $app['security.user_provider.'.$name] = is_array($users) ? $app['security.user_provider.inmemory._proto']($users) : $users; } $app['security.context_listener.'.$context] = $app['security.context_listener._proto']($name, [$app['security.user_provider.'.$name]]); } if (false === $stateless) { $listeners[] = 'security.context_listener.'.$context; } $factories = []; foreach ($positions as $position) { $factories[$position] = []; } foreach ($firewall as $type => $options) { if ('switch_user' === $type) { continue; } // normalize options if (!is_array($options)) { if (!$options) { continue; } $options = []; } if (!isset($app['security.authentication_listener.factory.'.$type])) { throw new \LogicException(sprintf('The "%s" authentication entry is not registered.', $type)); } $options['stateless'] = $stateless; list($providerId, $listenerId, $entryPointId, $position) = $app['security.authentication_listener.factory.'.$type]($name, $options); if (null !== $entryPointId) { $entryPoint = $entryPointId; } $factories[$position][] = $listenerId; $providers[] = $providerId; } foreach ($positions as $position) { foreach ($factories[$position] as $listener) { $listeners[] = $listener; } } $listeners[] = 'security.access_listener'; if (isset($firewall['switch_user'])) { $app['security.switch_user.'.$name] = $app['security.authentication_listener.switch_user._proto']($name, $firewall['switch_user']); $listeners[] = 'security.switch_user.'.$name; } if (!isset($app['security.exception_listener.'.$name])) { if (null === $entryPoint) { $app[$entryPoint = 'security.entry_point.'.$name.'.form'] = $app['security.entry_point.form._proto']($name, []); } $accessDeniedHandler = null; if (isset($app['security.access_denied_handler.'.$name])) { $accessDeniedHandler = $app['security.access_denied_handler.'.$name]; } $app['security.exception_listener.'.$name] = $app['security.exception_listener._proto']($entryPoint, $name, $accessDeniedHandler); } } $configs[$name] = [ 'pattern' => $pattern, 'listeners' => $listeners, 'protected' => $protected, 'methods' => $methods, 'hosts' => $hosts, ]; } $app['security.authentication_providers'] = array_map(function ($provider) use ($app) { return $app[$provider]; }, array_unique($providers)); $map = new FirewallMap(); foreach ($configs as $name => $config) { if (is_string($config['pattern'])) { $requestMatcher = new RequestMatcher($config['pattern'], $config['hosts'], $config['methods']); } else { $requestMatcher = $config['pattern']; } $map->add( $requestMatcher, array_map(function ($listenerId) use ($app, $name) { $listener = $app[$listenerId]; if (isset($app['security.remember_me.service.'.$name])) { if ($listener instanceof AbstractAuthenticationListener || $listener instanceof GuardAuthenticationListener) { $listener->setRememberMeServices($app['security.remember_me.service.'.$name]); } if ($listener instanceof LogoutListener) { $listener->addHandler($app['security.remember_me.service.'.$name]); } } return $listener; }, $config['listeners']), $config['protected'] ? $app['security.exception_listener.'.$name] : null ); } return $map; }; $app['security.access_listener'] = function ($app) { return new AccessListener( $app['security.token_storage'], $app['security.access_manager'], $app['security.access_map'], $app['security.authentication_manager'], $app['logger'] ); }; $app['security.access_map'] = function ($app) { $map = new AccessMap(); foreach ($app['security.access_rules'] as $rule) { if (is_string($rule[0])) { $rule[0] = new RequestMatcher($rule[0]); } elseif (is_array($rule[0])) { $rule[0] += [ 'path' => null, 'host' => null, 'methods' => null, 'ips' => null, 'attributes' => [], 'schemes' => null, ]; $rule[0] = new RequestMatcher($rule[0]['path'], $rule[0]['host'], $rule[0]['methods'], $rule[0]['ips'], $rule[0]['attributes'], $rule[0]['schemes']); } $map->add($rule[0], (array) $rule[1], isset($rule[2]) ? $rule[2] : null); } return $map; }; $app['security.trust_resolver'] = function ($app) { return new AuthenticationTrustResolver('Symfony\Component\Security\Core\Authentication\Token\AnonymousToken', 'Symfony\Component\Security\Core\Authentication\Token\RememberMeToken'); }; $app['security.session_strategy'] = function ($app) { return new SessionAuthenticationStrategy(SessionAuthenticationStrategy::MIGRATE); }; $app['security.http_utils'] = function ($app) { return new HttpUtils($app['url_generator'], $app['request_matcher']); }; $app['security.last_error'] = $app->protect(function (Request $request) { if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) { return $request->attributes->get(Security::AUTHENTICATION_ERROR)->getMessage(); } $session = $request->getSession(); if ($session && $session->has(Security::AUTHENTICATION_ERROR)) { $message = $session->get(Security::AUTHENTICATION_ERROR)->getMessage(); $session->remove(Security::AUTHENTICATION_ERROR); return $message; } }); // prototypes (used by the Firewall Map) $app['security.context_listener._proto'] = $app->protect(function ($providerKey, $userProviders) use ($app) { return function () use ($app, $userProviders, $providerKey) { return new ContextListener( $app['security.token_storage'], $userProviders, $providerKey, $app['logger'], $app['dispatcher'] ); }; }); $app['security.user_provider.inmemory._proto'] = $app->protect(function ($params) use ($app) { return function () use ($app, $params) { $users = []; foreach ($params as $name => $user) { $users[$name] = ['roles' => (array) $user[0], 'password' => $user[1]]; } return new InMemoryUserProvider($users); }; }); $app['security.exception_listener._proto'] = $app->protect(function ($entryPoint, $name, $accessDeniedHandler = null) use ($app) { return function () use ($app, $entryPoint, $name, $accessDeniedHandler) { return new ExceptionListener( $app['security.token_storage'], $app['security.trust_resolver'], $app['security.http_utils'], $name, $app[$entryPoint], null, // errorPage $accessDeniedHandler, $app['logger'] ); }; }); $app['security.authentication.success_handler._proto'] = $app->protect(function ($name, $options) use ($app) { return function () use ($name, $options, $app) { $handler = new DefaultAuthenticationSuccessHandler( $app['security.http_utils'], $options ); $handler->setProviderKey($name); return $handler; }; }); $app['security.authentication.failure_handler._proto'] = $app->protect(function ($name, $options) use ($app) { return function () use ($name, $options, $app) { return new DefaultAuthenticationFailureHandler( $app, $app['security.http_utils'], $options, $app['logger'] ); }; }); $app['security.authentication_listener.guard._proto'] = $app->protect(function ($providerKey, $options) use ($app, $that) { return function () use ($app, $providerKey, $options, $that) { if (!isset($app['security.authentication.guard_handler'])) { $app['security.authentication.guard_handler'] = new GuardAuthenticatorHandler($app['security.token_storage'], $app['dispatcher']); } $authenticators = []; foreach ($options['authenticators'] as $authenticatorId) { $authenticators[] = $app[$authenticatorId]; } return new GuardAuthenticationListener( $app['security.authentication.guard_handler'], $app['security.authentication_manager'], $providerKey, $authenticators, $app['logger'] ); }; }); $app['security.authentication_listener.form._proto'] = $app->protect(function ($name, $options) use ($app, $that) { return function () use ($app, $name, $options, $that) { $that->addFakeRoute( 'match', $tmp = isset($options['check_path']) ? $options['check_path'] : '/login_check', str_replace('/', '_', ltrim($tmp, '/')) ); $class = isset($options['listener_class']) ? $options['listener_class'] : 'Symfony\\Component\\Security\\Http\\Firewall\\UsernamePasswordFormAuthenticationListener'; if (!isset($app['security.authentication.success_handler.'.$name])) { $app['security.authentication.success_handler.'.$name] = $app['security.authentication.success_handler._proto']($name, $options); } if (!isset($app['security.authentication.failure_handler.'.$name])) { $app['security.authentication.failure_handler.'.$name] = $app['security.authentication.failure_handler._proto']($name, $options); } return new $class( $app['security.token_storage'], $app['security.authentication_manager'], isset($app['security.session_strategy.'.$name]) ? $app['security.session_strategy.'.$name] : $app['security.session_strategy'], $app['security.http_utils'], $name, $app['security.authentication.success_handler.'.$name], $app['security.authentication.failure_handler.'.$name], $options, $app['logger'], $app['dispatcher'], isset($options['with_csrf']) && $options['with_csrf'] && isset($app['csrf.token_manager']) ? $app['csrf.token_manager'] : null ); }; }); $app['security.authentication_listener.http._proto'] = $app->protect(function ($providerKey, $options) use ($app) { return function () use ($app, $providerKey, $options) { return new BasicAuthenticationListener( $app['security.token_storage'], $app['security.authentication_manager'], $providerKey, $app['security.entry_point.'.$providerKey.'.http'], $app['logger'] ); }; }); $app['security.authentication_listener.anonymous._proto'] = $app->protect(function ($providerKey, $options) use ($app) { return function () use ($app, $providerKey, $options) { return new AnonymousAuthenticationListener( $app['security.token_storage'], $providerKey, $app['logger'] ); }; }); $app['security.authentication.logout_handler._proto'] = $app->protect(function ($name, $options) use ($app) { return function () use ($name, $options, $app) { return new DefaultLogoutSuccessHandler( $app['security.http_utils'], isset($options['target_url']) ? $options['target_url'] : '/' ); }; }); $app['security.authentication_listener.logout._proto'] = $app->protect(function ($name, $options) use ($app, $that) { return function () use ($app, $name, $options, $that) { $that->addFakeRoute( 'get', $tmp = isset($options['logout_path']) ? $options['logout_path'] : '/logout', str_replace('/', '_', ltrim($tmp, '/')) ); if (!isset($app['security.authentication.logout_handler.'.$name])) { $app['security.authentication.logout_handler.'.$name] = $app['security.authentication.logout_handler._proto']($name, $options); } $listener = new LogoutListener( $app['security.token_storage'], $app['security.http_utils'], $app['security.authentication.logout_handler.'.$name], $options, isset($options['with_csrf']) && $options['with_csrf'] && isset($app['csrf.token_manager']) ? $app['csrf.token_manager'] : null ); $invalidateSession = isset($options['invalidate_session']) ? $options['invalidate_session'] : true; if (true === $invalidateSession && false === $options['stateless']) { $listener->addHandler(new SessionLogoutHandler()); } return $listener; }; }); $app['security.authentication_listener.switch_user._proto'] = $app->protect(function ($name, $options) use ($app, $that) { return function () use ($app, $name, $options, $that) { return new SwitchUserListener( $app['security.token_storage'], $app['security.user_provider.'.$name], $app['security.user_checker'], $name, $app['security.access_manager'], $app['logger'], isset($options['parameter']) ? $options['parameter'] : '_switch_user', isset($options['role']) ? $options['role'] : 'ROLE_ALLOWED_TO_SWITCH', $app['dispatcher'] ); }; }); $app['security.entry_point.form._proto'] = $app->protect(function ($name, array $options) use ($app) { return function () use ($app, $options) { $loginPath = isset($options['login_path']) ? $options['login_path'] : '/login'; $useForward = isset($options['use_forward']) ? $options['use_forward'] : false; return new FormAuthenticationEntryPoint($app, $app['security.http_utils'], $loginPath, $useForward); }; }); $app['security.entry_point.http._proto'] = $app->protect(function ($name, array $options) use ($app) { return function () use ($app, $name, $options) { return new BasicAuthenticationEntryPoint(isset($options['real_name']) ? $options['real_name'] : 'Secured'); }; }); $app['security.entry_point.guard._proto'] = $app->protect(function ($name, array $options) use ($app) { if (isset($options['entry_point'])) { // if it's configured explicitly, use it! return $app[$options['entry_point']]; } $authenticatorIds = $options['authenticators']; if (1 == count($authenticatorIds)) { // if there is only one authenticator, use that as the entry point return $app[reset($authenticatorIds)]; } // we have multiple entry points - we must ask them to configure one throw new \LogicException(sprintf( 'Because you have multiple guard configurators, you need to set the "guard.entry_point" key to one of your configurators (%s)', implode(', ', $authenticatorIds) )); }); $app['security.authentication_provider.dao._proto'] = $app->protect(function ($name, $options) use ($app) { return function () use ($app, $name) { return new DaoAuthenticationProvider( $app['security.user_provider.'.$name], $app['security.user_checker'], $name, $app['security.encoder_factory'], $app['security.hide_user_not_found'] ); }; }); $app['security.authentication_provider.guard._proto'] = $app->protect(function ($name, $options) use ($app) { return function () use ($app, $name, $options) { $authenticators = []; foreach ($options['authenticators'] as $authenticatorId) { $authenticators[] = $app[$authenticatorId]; } return new GuardAuthenticationProvider( $authenticators, $app['security.user_provider.'.$name], $name, $app['security.user_checker'] ); }; }); $app['security.authentication_provider.anonymous._proto'] = $app->protect(function ($name, $options) use ($app) { return function () use ($app, $name) { return new AnonymousAuthenticationProvider($name); }; }); $app['security.authentication_utils'] = function ($app) { return new AuthenticationUtils($app['request_stack']); }; } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { $dispatcher->addSubscriber($app['security.firewall']); } public function connect(Application $app) { $controllers = $app['controllers_factory']; foreach ($this->fakeRoutes as $route) { list($method, $pattern, $name) = $route; $controllers->$method($pattern)->run(null)->bind($name); } return $controllers; } public function boot(Application $app) { $app->mount('/', $this->connect($app)); } public function addFakeRoute($method, $pattern, $name) { $this->fakeRoutes[] = [$method, $pattern, $name]; } } src/Silex/src/Silex/Provider/SerializerServiceProvider.php000066400000000000000000000030221516072260400242540ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Symfony\Component\Serializer\Serializer; use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Encoder\XmlEncoder; use Symfony\Component\Serializer\Normalizer\CustomNormalizer; use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer; /** * Symfony Serializer component Provider. * * @author Fabien Potencier * @author Marijn Huizendveld */ class SerializerServiceProvider implements ServiceProviderInterface { /** * {@inheritdoc} * * This method registers a serializer service. {@link http://api.symfony.com/master/Symfony/Component/Serializer/Serializer.html * The service is provided by the Symfony Serializer component}. */ public function register(Container $app) { $app['serializer'] = function ($app) { return new Serializer($app['serializer.normalizers'], $app['serializer.encoders']); }; $app['serializer.encoders'] = function () { return [new JsonEncoder(), new XmlEncoder()]; }; $app['serializer.normalizers'] = function () { return [new CustomNormalizer(), new GetSetMethodNormalizer()]; }; } } src/Silex/src/Silex/Provider/ServiceControllerServiceProvider.php000066400000000000000000000012241516072260400256110ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\ServiceControllerResolver; class ServiceControllerServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app->extend('resolver', function ($resolver, $app) { return new ServiceControllerResolver($resolver, $app['callback_resolver']); }); } } src/Silex/src/Silex/Provider/Session/000077500000000000000000000000001516072260400200245ustar00rootroot00000000000000src/Silex/src/Silex/Provider/Session/SessionListener.php000066400000000000000000000014421516072260400236670ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\Session; use Pimple\Container; use Symfony\Component\HttpKernel\EventListener\SessionListener as BaseSessionListener; /** * Sets the session in the request. * * @author Fabien Potencier */ class SessionListener extends BaseSessionListener { private $app; public function __construct(Container $app) { $this->app = $app; } protected function getSession() { if (!isset($this->app['session'])) { return; } return $this->app['session']; } } src/Silex/src/Silex/Provider/Session/TestSessionListener.php000066400000000000000000000014711516072260400245310ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\Session; use Pimple\Container; use Symfony\Component\HttpKernel\EventListener\TestSessionListener as BaseTestSessionListener; /** * Simulates sessions for testing purpose. * * @author Fabien Potencier */ class TestSessionListener extends BaseTestSessionListener { private $app; public function __construct(Container $app) { $this->app = $app; } protected function getSession() { if (!isset($this->app['session'])) { return; } return $this->app['session']; } } src/Silex/src/Silex/Provider/SessionServiceProvider.php000066400000000000000000000052401516072260400235720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Api\EventListenerProviderInterface; use Silex\Provider\Session\SessionListener; use Silex\Provider\Session\TestSessionListener; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeFileSessionHandler; use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage; use Symfony\Component\HttpFoundation\Session\Session; /** * Symfony HttpFoundation component Provider for sessions. * * @author Fabien Potencier */ class SessionServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['session.test'] = false; $app['session'] = function ($app) { return new Session($app['session.storage'], $app['session.attribute_bag'], $app['session.flash_bag']); }; $app['session.storage'] = function ($app) { if ($app['session.test']) { return $app['session.storage.test']; } return $app['session.storage.native']; }; $app['session.storage.handler'] = function ($app) { return new NativeFileSessionHandler($app['session.storage.save_path']); }; $app['session.storage.native'] = function ($app) { return new NativeSessionStorage( $app['session.storage.options'], $app['session.storage.handler'] ); }; $app['session.listener'] = function ($app) { return new SessionListener($app); }; $app['session.storage.test'] = function () { return new MockFileSessionStorage(); }; $app['session.listener.test'] = function ($app) { return new TestSessionListener($app); }; $app['session.storage.options'] = []; $app['session.storage.save_path'] = null; $app['session.attribute_bag'] = null; $app['session.flash_bag'] = null; } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { $dispatcher->addSubscriber($app['session.listener']); if ($app['session.test']) { $dispatcher->addSubscriber($app['session.listener.test']); } } } src/Silex/src/Silex/Provider/SwiftmailerServiceProvider.php000066400000000000000000000122341516072260400244360ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Api\EventListenerProviderInterface; use Symfony\Component\Console\ConsoleEvents; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\PostResponseEvent; /** * Swiftmailer Provider. * * @author Fabien Potencier */ class SwiftmailerServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['swiftmailer.options'] = []; $app['swiftmailer.use_spool'] = true; $app['mailer.initialized'] = false; $app['mailer'] = function ($app) { $app['mailer.initialized'] = true; $transport = $app['swiftmailer.use_spool'] ? $app['swiftmailer.spooltransport'] : $app['swiftmailer.transport']; return new \Swift_Mailer($transport); }; $app['swiftmailer.spooltransport'] = function ($app) { return new \Swift_Transport_SpoolTransport($app['swiftmailer.transport.eventdispatcher'], $app['swiftmailer.spool']); }; $app['swiftmailer.spool'] = function ($app) { return new \Swift_MemorySpool(); }; $app['swiftmailer.transport'] = function ($app) { $transport = new \Swift_Transport_EsmtpTransport( $app['swiftmailer.transport.buffer'], [$app['swiftmailer.transport.authhandler']], $app['swiftmailer.transport.eventdispatcher'] ); $options = $app['swiftmailer.options'] = array_replace([ 'host' => 'localhost', 'port' => 25, 'username' => '', 'password' => '', 'encryption' => null, 'auth_mode' => null, 'stream_context_options' => [], ], $app['swiftmailer.options']); $transport->setHost($options['host']); $transport->setPort($options['port']); $transport->setEncryption($options['encryption']); $transport->setUsername($options['username']); $transport->setPassword($options['password']); $transport->setAuthMode($options['auth_mode']); $transport->setStreamOptions($options['stream_context_options']); return $transport; }; $app['swiftmailer.transport.buffer'] = function () { return new \Swift_Transport_StreamBuffer(new \Swift_StreamFilters_StringReplacementFilterFactory()); }; $app['swiftmailer.transport.authhandler'] = function () { return new \Swift_Transport_Esmtp_AuthHandler([ new \Swift_Transport_Esmtp_Auth_CramMd5Authenticator(), new \Swift_Transport_Esmtp_Auth_LoginAuthenticator(), new \Swift_Transport_Esmtp_Auth_PlainAuthenticator(), ]); }; $app['swiftmailer.transport.eventdispatcher'] = function ($app) { $dispatcher = new \Swift_Events_SimpleEventDispatcher(); $plugins = $app['swiftmailer.plugins']; if (null !== $app['swiftmailer.sender_address']) { $plugins[] = new \Swift_Plugins_ImpersonatePlugin($app['swiftmailer.sender_address']); } if (!empty($app['swiftmailer.delivery_addresses'])) { $plugins[] = new \Swift_Plugins_RedirectingPlugin( $app['swiftmailer.delivery_addresses'], $app['swiftmailer.delivery_whitelist'] ); } foreach ($plugins as $plugin) { $dispatcher->bindEventListener($plugin); } return $dispatcher; }; $app['swiftmailer.plugins'] = function ($app) { return []; }; $app['swiftmailer.sender_address'] = null; $app['swiftmailer.delivery_addresses'] = []; $app['swiftmailer.delivery_whitelist'] = []; } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { // Event has no typehint as it can be either a PostResponseEvent or a ConsoleTerminateEvent $onTerminate = function ($event) use ($app) { // To speed things up (by avoiding Swift Mailer initialization), flush // messages only if our mailer has been created (potentially used) if ($app['mailer.initialized'] && $app['swiftmailer.use_spool'] && $app['swiftmailer.spooltransport'] instanceof \Swift_Transport_SpoolTransport) { $app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']); } }; $dispatcher->addListener(KernelEvents::TERMINATE, $onTerminate); if (class_exists('Symfony\Component\Console\ConsoleEvents')) { $dispatcher->addListener(ConsoleEvents::TERMINATE, $onTerminate); } } } src/Silex/src/Silex/Provider/TranslationServiceProvider.php000066400000000000000000000071571516072260400244560ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Symfony\Component\Translation\Translator; use Symfony\Component\Translation\Formatter\MessageFormatter; use Symfony\Component\Translation\Loader\ArrayLoader; use Symfony\Component\Translation\Loader\XliffFileLoader; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpKernel\EventListener\TranslatorListener; use Silex\Api\EventListenerProviderInterface; /** * Symfony Translation component Provider. * * @author Fabien Potencier */ class TranslationServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['translator'] = function ($app) { if (!isset($app['locale'])) { throw new \LogicException('You must define \'locale\' parameter or register the LocaleServiceProvider to use the TranslationServiceProvider'); } $translator = new Translator($app['locale'], $app['translator.message_selector'], $app['translator.cache_dir'], $app['debug']); $translator->setFallbackLocales($app['locale_fallbacks']); $translator->addLoader('array', new ArrayLoader()); $translator->addLoader('xliff', new XliffFileLoader()); if (isset($app['validator'])) { $r = new \ReflectionClass('Symfony\Component\Validator\Validation'); $file = dirname($r->getFilename()).'/Resources/translations/validators.'.$app['locale'].'.xlf'; if (file_exists($file)) { $translator->addResource('xliff', $file, $app['locale'], 'validators'); } } if (isset($app['form.factory'])) { $r = new \ReflectionClass('Symfony\Component\Form\Form'); $file = dirname($r->getFilename()).'/Resources/translations/validators.'.$app['locale'].'.xlf'; if (file_exists($file)) { $translator->addResource('xliff', $file, $app['locale'], 'validators'); } } // Register default resources foreach ($app['translator.resources'] as $resource) { $translator->addResource($resource[0], $resource[1], $resource[2], $resource[3]); } foreach ($app['translator.domains'] as $domain => $data) { foreach ($data as $locale => $messages) { $translator->addResource('array', $messages, $locale, $domain); } } return $translator; }; if (isset($app['request_stack'])) { $app['translator.listener'] = function ($app) { return new TranslatorListener($app['translator'], $app['request_stack']); }; } $app['translator.message_selector'] = function () { return new MessageFormatter(); }; $app['translator.resources'] = function ($app) { return []; }; $app['translator.domains'] = []; $app['locale_fallbacks'] = ['en']; $app['translator.cache_dir'] = null; } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { if (isset($app['translator.listener'])) { $dispatcher->addSubscriber($app['translator.listener']); } } } src/Silex/src/Silex/Provider/Twig/000077500000000000000000000000001516072260400173135ustar00rootroot00000000000000src/Silex/src/Silex/Provider/Twig/RuntimeLoader.php000066400000000000000000000015561516072260400226050ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\Twig; use Pimple\Container; /** * Loads Twig extension runtimes via Pimple. * * @author Fabien Potencier */ class RuntimeLoader implements \Twig\RuntimeLoader\RuntimeLoaderInterface { private $container; private $mapping; public function __construct(Container $container, array $mapping) { $this->container = $container; $this->mapping = $mapping; } /** * {@inheritdoc} */ public function load($class) { if (isset($this->mapping[$class])) { return $this->container[$this->mapping[$class]]; } } } src/Silex/src/Silex/Provider/TwigServiceProvider.php000066400000000000000000000163201516072260400230620ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Provider\Twig\RuntimeLoader; use Symfony\Bridge\Twig\AppVariable; use Symfony\Bridge\Twig\Extension\AssetExtension; use Symfony\Bridge\Twig\Extension\DumpExtension; use Symfony\Bridge\Twig\Extension\RoutingExtension; use Symfony\Bridge\Twig\Extension\TranslationExtension; use Symfony\Bridge\Twig\Extension\FormExtension; use Symfony\Bridge\Twig\Extension\SecurityExtension; use Symfony\Bridge\Twig\Extension\HttpFoundationExtension; use Symfony\Bridge\Twig\Extension\HttpKernelExtension; use Symfony\Bridge\Twig\Extension\WebLinkExtension; use Symfony\Bridge\Twig\Form\TwigRendererEngine; use Symfony\Bridge\Twig\Extension\HttpKernelRuntime; use Symfony\Component\Form\FormRenderer; /** * Twig integration for Silex. * * @author Fabien Potencier */ class TwigServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['twig.options'] = []; $app['twig.form.templates'] = ['form_div_layout.html.twig']; $app['twig.path'] = []; $app['twig.templates'] = []; $app['twig.date.format'] = 'F j, Y H:i'; $app['twig.date.interval_format'] = '%d days'; $app['twig.date.timezone'] = null; $app['twig.number_format.decimals'] = 0; $app['twig.number_format.decimal_point'] = '.'; $app['twig.number_format.thousands_separator'] = ','; $app['twig'] = function ($app) { $twig = $app['twig.environment_factory']($app); // registered for BC, but should not be used anymore // deprecated and should probably be removed in Silex 3.0 $twig->addGlobal('app', $app); $coreExtension = $twig->getExtension('Twig\Extension\CoreExtension'); $coreExtension->setDateFormat($app['twig.date.format'], $app['twig.date.interval_format']); if (null !== $app['twig.date.timezone']) { $coreExtension->setTimezone($app['twig.date.timezone']); } $coreExtension->setNumberFormat($app['twig.number_format.decimals'], $app['twig.number_format.decimal_point'], $app['twig.number_format.thousands_separator']); if ($app['debug']) { $twig->addExtension(new \Twig\Extension\DebugExtension()); } if (class_exists('Symfony\Bridge\Twig\Extension\RoutingExtension')) { $app['twig.app_variable'] = function ($app) { $var = new AppVariable(); if (isset($app['security.token_storage'])) { $var->setTokenStorage($app['security.token_storage']); } if (isset($app['request_stack'])) { $var->setRequestStack($app['request_stack']); } $var->setDebug($app['debug']); return $var; }; $twig->addGlobal('global', $app['twig.app_variable']); if (isset($app['request_stack'])) { $twig->addExtension(new HttpFoundationExtension(new \Symfony\Component\HttpFoundation\UrlHelper($app['request_stack']))); $twig->addExtension(new RoutingExtension($app['url_generator'])); } if (isset($app['translator'])) { $twig->addExtension(new TranslationExtension($app['translator'])); } if (isset($app['security.authorization_checker'])) { $twig->addExtension(new SecurityExtension($app['security.authorization_checker'])); } if (isset($app['fragment.handler'])) { $app['fragment.renderer.hinclude']->setTemplating($twig); $twig->addExtension(new HttpKernelExtension($app['fragment.handler'])); } if (isset($app['assets.packages'])) { $twig->addExtension(new AssetExtension($app['assets.packages'])); } if (isset($app['form.factory'])) { $app['twig.form.engine'] = function ($app) use ($twig) { return new TwigRendererEngine($app['twig.form.templates'], $twig); }; $app['twig.form.renderer'] = function ($app) { $csrfTokenManager = isset($app['csrf.token_manager']) ? $app['csrf.token_manager'] : null; return new FormRenderer($app['twig.form.engine'], $csrfTokenManager); }; $twig->addExtension(new FormExtension()); // add loader for Symfony built-in form templates $reflected = new \ReflectionClass('Symfony\Bridge\Twig\Extension\FormExtension'); $path = dirname($reflected->getFileName()).'/../Resources/views/Form'; $app['twig.loader']->addLoader(new \Twig\Loader\FilesystemLoader($path)); } if (isset($app['var_dumper.cloner'])) { $twig->addExtension(new DumpExtension($app['var_dumper.cloner'])); } $twig->addRuntimeLoader($app['twig.runtime_loader']); $twig->addExtension(new WebLinkExtension($app['request_stack'])); } return $twig; }; $app['twig.loader.filesystem'] = function ($app) { $loader = new \Twig\Loader\FilesystemLoader(); foreach (is_array($app['twig.path']) ? $app['twig.path'] : [$app['twig.path']] as $key => $val) { if (is_string($key)) { $loader->addPath($key, $val); } else { $loader->addPath($val); } } return $loader; }; $app['twig.loader.array'] = function ($app) { return new \Twig\Loader\ArrayLoader($app['twig.templates']); }; $app['twig.loader'] = function ($app) { return new \Twig\Loader\ChainLoader([ $app['twig.loader.array'], $app['twig.loader.filesystem'], ]); }; $app['twig.environment_factory'] = $app->protect(function ($app) { return new \Twig\Environment($app['twig.loader'], array_replace([ 'charset' => $app['charset'], 'debug' => $app['debug'], 'strict_variables' => $app['debug'], ], $app['twig.options'])); }); $app['twig.runtime.httpkernel'] = function ($app) { return new HttpKernelRuntime($app['fragment.handler']); }; $app['twig.runtimes'] = function ($app) { return [ HttpKernelRuntime::class => 'twig.runtime.httpkernel', FormRenderer::class => 'twig.form.renderer', ]; }; $app['twig.runtime_loader'] = function ($app) { return new RuntimeLoader($app, $app['twig.runtimes']); }; } } src/Silex/src/Silex/Provider/Validator/000077500000000000000000000000001516072260400203265ustar00rootroot00000000000000src/Silex/src/Silex/Provider/Validator/ConstraintValidatorFactory.php000066400000000000000000000030311516072260400263560ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider\Validator; use Pimple\Container; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidatorFactory as BaseConstraintValidatorFactory; /** * Uses a service container to create constraint validators with dependencies. * * @author Kris Wallsmith * @author Alex Kalyvitis */ class ConstraintValidatorFactory extends BaseConstraintValidatorFactory { /** * @var Container */ protected $container; /** * @var array */ protected $serviceNames; /** * Constructor. * * @param Container $container DI container * @param array $serviceNames Validator service names */ public function __construct(Container $container, array $serviceNames = [], $propertyAccessor = null) { parent::__construct($propertyAccessor); $this->container = $container; $this->serviceNames = $serviceNames; } /** * {@inheritdoc} */ public function getInstance(Constraint $constraint) { $name = $constraint->validatedBy(); if (isset($this->serviceNames[$name])) { return $this->container[$this->serviceNames[$name]]; } return parent::getInstance($constraint); } } src/Silex/src/Silex/Provider/ValidatorServiceProvider.php000066400000000000000000000042221516072260400240730ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Provider\Validator\ConstraintValidatorFactory; use Symfony\Component\Validator\Validator; use Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory; use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader; use Symfony\Component\Validator\Validation; /** * Symfony Validator component Provider. * * @author Fabien Potencier */ class ValidatorServiceProvider implements ServiceProviderInterface { public function register(Container $app) { $app['validator'] = function ($app) { return $app['validator.builder']->getValidator(); }; $app['validator.builder'] = function ($app) { $builder = Validation::createValidatorBuilder(); $builder->setConstraintValidatorFactory($app['validator.validator_factory']); $builder->setTranslationDomain($app['validator.translation_domain']); $builder->addObjectInitializers($app['validator.object_initializers']); $builder->setMetadataFactory($app['validator.mapping.class_metadata_factory']); if (isset($app['translator'])) { $builder->setTranslator($app['translator']); } return $builder; }; $app['validator.mapping.class_metadata_factory'] = function ($app) { return new LazyLoadingMetadataFactory(new StaticMethodLoader()); }; $app['validator.validator_factory'] = function () use ($app) { return new ConstraintValidatorFactory($app, $app['validator.validator_service_ids']); }; $app['validator.object_initializers'] = function ($app) { return []; }; $app['validator.validator_service_ids'] = []; $app['validator.translation_domain'] = function () { return 'validators'; }; } } src/Silex/src/Silex/Provider/VarDumperServiceProvider.php000066400000000000000000000032141516072260400240530ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Provider; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Application; use Silex\Api\BootableProviderInterface; use Symfony\Component\VarDumper\VarDumper; use Symfony\Component\VarDumper\Cloner\VarCloner; use Symfony\Component\VarDumper\Dumper\CliDumper; /** * Symfony Var Dumper component Provider. * * @author Fabien Potencier */ class VarDumperServiceProvider implements ServiceProviderInterface, BootableProviderInterface { public function register(Container $app) { $app['var_dumper.cli_dumper'] = function ($app) { return new CliDumper($app['var_dumper.dump_destination'], $app['charset']); }; $app['var_dumper.cloner'] = function ($app) { return new VarCloner(); }; $app['var_dumper.dump_destination'] = null; } public function boot(Application $app) { if (!$app['debug']) { return; } // This code is here to lazy load the dump stack. This default // configuration for CLI mode is overridden in HTTP mode on // 'kernel.request' event VarDumper::setHandler(function ($var) use ($app) { VarDumper::setHandler($handler = function ($var) use ($app) { $app['var_dumper.cli_dumper']->dump($app['var_dumper.cloner']->cloneVar($var)); }); $handler($var); }); } } src/Silex/src/Silex/Provider/composer.json000066400000000000000000000013101516072260400211160ustar00rootroot00000000000000{ "minimum-stability": "dev", "name": "silex/providers", "description": "The Silex providers", "keywords": ["microframework"], "homepage": "http://silex.sensiolabs.org", "license": "MIT", "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Igor Wiedler", "email": "igor@wiedler.ch" } ], "require": { "php": ">=5.5.9", "pimple/pimple": "~3.0", "silex/api": "~2.2" }, "autoload": { "psr-4": { "Silex\\Provider\\": "" } }, "extra": { "branch-alias": { "dev-master": "2.3.x-dev" } } } src/Silex/src/Silex/Route.php000066400000000000000000000126221516072260400164210ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Symfony\Component\Routing\Route as BaseRoute; /** * A wrapper for a controller, mapped to a route. * * @author Fabien Potencier */ class Route extends BaseRoute { /** * Constructor. * * Available options: * * * compiler_class: A class name able to compile this route instance (RouteCompiler by default) * * @param string $path The path pattern to match * @param array $defaults An array of default parameter values * @param array $requirements An array of requirements for parameters (regexes) * @param array $options An array of options * @param string $host The host pattern to match * @param string|array $schemes A required URI scheme or an array of restricted schemes * @param string|array $methods A required HTTP method or an array of restricted methods */ public function __construct($path = '/', array $defaults = [], array $requirements = [], array $options = [], $host = '', $schemes = [], $methods = []) { // overridden constructor to make $path optional parent::__construct($path, $defaults, $requirements, $options, $host, $schemes, $methods); } /** * Sets the route code that should be executed when matched. * * @param callable $to PHP callback that returns the response when matched * * @return Route $this The current Route instance */ public function run($to) { $this->setDefault('_controller', $to); return $this; } /** * Sets the requirement for a route variable. * * @param string $variable The variable name * @param string $regexp The regexp to apply * * @return Route $this The current route instance */ public function assert($variable, $regexp) { $this->setRequirement($variable, $regexp); return $this; } /** * Sets the default value for a route variable. * * @param string $variable The variable name * @param mixed $default The default value * * @return Route $this The current Route instance */ public function value($variable, $default) { $this->setDefault($variable, $default); return $this; } /** * Sets a converter for a route variable. * * @param string $variable The variable name * @param mixed $callback A PHP callback that converts the original value * * @return Route $this The current Route instance */ public function convert($variable, $callback) { $converters = $this->getOption('_converters'); $converters[$variable] = $callback; $this->setOption('_converters', $converters); return $this; } /** * Sets the requirement for the HTTP method. * * @param string $method The HTTP method name. Multiple methods can be supplied, delimited by a pipe character '|', eg. 'GET|POST' * * @return Route $this The current Route instance */ public function method($method) { $this->setMethods(explode('|', $method)); return $this; } /** * Sets the requirement of host on this Route. * * @param string $host The host for which this route should be enabled * * @return Route $this The current Route instance */ public function host($host) { $this->setHost($host); return $this; } /** * Sets the requirement of HTTP (no HTTPS) on this Route. * * @return Route $this The current Route instance */ public function requireHttp() { $this->setSchemes('http'); return $this; } /** * Sets the requirement of HTTPS on this Route. * * @return Route $this The current Route instance */ public function requireHttps() { $this->setSchemes('https'); return $this; } /** * Sets a callback to handle before triggering the route callback. * * @param mixed $callback A PHP callback to be triggered when the Route is matched, just before the route callback * * @return Route $this The current Route instance */ public function before($callback) { $callbacks = $this->getOption('_before_middlewares'); $callbacks[] = $callback; $this->setOption('_before_middlewares', $callbacks); return $this; } /** * Sets a callback to handle after the route callback. * * @param mixed $callback A PHP callback to be triggered after the route callback * * @return Route $this The current Route instance */ public function after($callback) { $callbacks = $this->getOption('_after_middlewares'); $callbacks[] = $callback; $this->setOption('_after_middlewares', $callbacks); return $this; } /** * Sets a condition for the route to match. * * @param string $condition The condition * * @return Route $this The current Route instance */ public function when($condition) { $this->setCondition($condition); return $this; } } src/Silex/src/Silex/Route/000077500000000000000000000000001516072260400157055ustar00rootroot00000000000000src/Silex/src/Silex/Route/SecurityTrait.php000066400000000000000000000012741516072260400212350ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Route; use Symfony\Component\Security\Core\Exception\AccessDeniedException; /** * Security trait. * * @author Fabien Potencier */ trait SecurityTrait { public function secure($roles) { $this->before(function ($request, $app) use ($roles) { if (!$app['security.authorization_checker']->isGranted($roles)) { throw new AccessDeniedException(); } }); } } src/Silex/src/Silex/ServiceControllerResolver.php000066400000000000000000000033221516072260400225060ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface; /** * Enables name_of_service:method_name syntax for declaring controllers. * * @see http://silex.sensiolabs.org/doc/providers/service_controller.html */ class ServiceControllerResolver implements ControllerResolverInterface { protected $controllerResolver; protected $callbackResolver; /** * Constructor. * * @param ControllerResolverInterface $controllerResolver A ControllerResolverInterface instance to delegate to * @param CallbackResolver $callbackResolver A service resolver instance */ public function __construct(ControllerResolverInterface $controllerResolver, CallbackResolver $callbackResolver) { $this->controllerResolver = $controllerResolver; $this->callbackResolver = $callbackResolver; } /** * {@inheritdoc} */ public function getController(Request $request) { $controller = $request->attributes->get('_controller', null); if (!$this->callbackResolver->isValid($controller)) { return $this->controllerResolver->getController($request); } return $this->callbackResolver->convertCallback($controller); } /** * {@inheritdoc} */ public function getArguments(Request $request, $controller) { return $this->controllerResolver->getArguments($request, $controller); } } src/Silex/src/Silex/ViewListenerWrapper.php000066400000000000000000000051711516072260400213050ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent; /** * Wraps view listeners. * * @author Dave Marshall */ class ViewListenerWrapper { private $app; private $callback; /** * Constructor. * * @param Application $app An Application instance * @param mixed $callback */ public function __construct(Application $app, $callback) { $this->app = $app; $this->callback = $callback; } public function __invoke(GetResponseForControllerResultEvent $event) { $controllerResult = $event->getControllerResult(); $callback = $this->app['callback_resolver']->resolveCallback($this->callback); if (!$this->shouldRun($callback, $controllerResult)) { return; } $response = call_user_func($callback, $controllerResult, $event->getRequest()); if ($response instanceof Response) { $event->setResponse($response); } elseif (null !== $response) { $event->setControllerResult($response); } } private function shouldRun($callback, $controllerResult) { if (is_array($callback)) { $callbackReflection = new \ReflectionMethod($callback[0], $callback[1]); } elseif (is_object($callback) && !$callback instanceof \Closure) { $callbackReflection = new \ReflectionObject($callback); $callbackReflection = $callbackReflection->getMethod('__invoke'); } else { $callbackReflection = new \ReflectionFunction($callback); } if ($callbackReflection->getNumberOfParameters() > 0) { $parameters = $callbackReflection->getParameters(); $expectedControllerResult = $parameters[0]; if ($expectedControllerResult->getClass() && (!is_object($controllerResult) || !$expectedControllerResult->getClass()->isInstance($controllerResult))) { return false; } if ($expectedControllerResult->isArray() && !is_array($controllerResult)) { return false; } if (method_exists($expectedControllerResult, 'isCallable') && $expectedControllerResult->isCallable() && !is_callable($controllerResult)) { return false; } } return true; } } src/Silex/src/Silex/WebTestCase.php000066400000000000000000000030011516072260400174630ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpKernel\Client; use Symfony\Component\HttpKernel\HttpKernelInterface; /** * WebTestCase is the base class for functional tests. * * @author Igor Wiedler */ abstract class WebTestCase extends TestCase { /** * HttpKernelInterface instance. * * @var HttpKernelInterface */ protected $app; /** * PHPUnit setUp for setting up the application. * * Note: Child classes that define a setUp method must call * parent::setUp(). */ protected function setUp() { $this->app = $this->createApplication(); } /** * Creates the application. * * @return HttpKernelInterface */ abstract public function createApplication(); /** * Creates a Client. * * @param array $server Server parameters * * @return Client A Client instance */ public function createClient(array $server = []) { if (!class_exists('Symfony\Component\BrowserKit\Client')) { throw new \LogicException('Component "symfony/browser-kit" is required by WebTestCase.'.PHP_EOL.'Run composer require symfony/browser-kit'); } return new Client($this->app, $server); } } src/Silex/tests/000077500000000000000000000000001516072260400140765ustar00rootroot00000000000000src/Silex/tests/Silex/000077500000000000000000000000001516072260400151625ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/000077500000000000000000000000001516072260400162645ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/Application/000077500000000000000000000000001516072260400205275ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/Application/FormApplication.php000066400000000000000000000005501516072260400243270ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use Silex\Application; class FormApplication extends Application { use Application\FormTrait; } src/Silex/tests/Silex/Tests/Application/FormTraitTest.php000066400000000000000000000020031516072260400240020ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use PHPUnit\Framework\TestCase; use Silex\Provider\FormServiceProvider; use Symfony\Component\Form\FormBuilder; /** * FormTrait test cases. * * @author Fabien Potencier */ class FormTraitTest extends TestCase { public function testForm() { $this->assertInstanceOf(FormBuilder::class, $this->createApplication()->form()); } public function testNamedForm() { $builder = $this->createApplication()->namedForm('foo'); $this->assertInstanceOf(FormBuilder::class, $builder); $this->assertSame('foo', $builder->getName()); } public function createApplication() { $app = new FormApplication(); $app->register(new FormServiceProvider()); return $app; } } src/Silex/tests/Silex/Tests/Application/MonologApplication.php000066400000000000000000000005561516072260400250440ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use Silex\Application; class MonologApplication extends Application { use Application\MonologTrait; } src/Silex/tests/Silex/Tests/Application/MonologTraitTest.php000066400000000000000000000021771516072260400245250ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use PHPUnit\Framework\TestCase; use Silex\Provider\MonologServiceProvider; use Monolog\Handler\TestHandler; use Monolog\Logger; /** * @author Fabien Potencier */ class MonologTraitTest extends TestCase { public function testLog() { $app = $this->createApplication(); $app->log('Foo'); $app->log('Bar', [], Logger::DEBUG); $this->assertTrue($app['monolog.handler']->hasInfo('Foo')); $this->assertTrue($app['monolog.handler']->hasDebug('Bar')); } public function createApplication() { $app = new MonologApplication(); $app->register(new MonologServiceProvider(), [ 'monolog.handler' => function () use ($app) { return new TestHandler($app['monolog.level']); }, 'monolog.logfile' => 'php://memory', ]); return $app; } } src/Silex/tests/Silex/Tests/Application/SecurityApplication.php000066400000000000000000000005601516072260400252340ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use Silex\Application; class SecurityApplication extends Application { use Application\SecurityTrait; } src/Silex/tests/Silex/Tests/Application/SecurityTraitTest.php000066400000000000000000000053571516072260400247250ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use PHPUnit\Framework\TestCase; use Silex\Provider\SecurityServiceProvider; use Symfony\Component\Security\Core\User\User; use Symfony\Component\HttpFoundation\Request; /** * @author Fabien Potencier */ class SecurityTraitTest extends TestCase { public function testEncodePassword() { $app = $this->createApplication([ 'fabien' => ['ROLE_ADMIN', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], ]); $user = new User('foo', 'bar'); $password = 'foo'; $encoded = $app->encodePassword($user, $password); $this->assertTrue( $app['security.encoder_factory']->getEncoder($user)->isPasswordValid($encoded, $password, $user->getSalt()) ); } /** * @expectedException \Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException */ public function testIsGrantedWithoutTokenThrowsException() { $app = $this->createApplication(); $app->get('/', function () { return 'foo'; }); $app->handle(Request::create('/')); $app->isGranted('ROLE_ADMIN'); } public function testIsGranted() { $request = Request::create('/'); $app = $this->createApplication([ 'fabien' => ['ROLE_ADMIN', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], 'monique' => ['ROLE_USER', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], ]); $app->get('/', function () { return 'foo'; }); // User is Monique (ROLE_USER) $request->headers->set('PHP_AUTH_USER', 'monique'); $request->headers->set('PHP_AUTH_PW', 'foo'); $app->handle($request); $this->assertTrue($app->isGranted('ROLE_USER')); $this->assertFalse($app->isGranted('ROLE_ADMIN')); // User is Fabien (ROLE_ADMIN) $request->headers->set('PHP_AUTH_USER', 'fabien'); $request->headers->set('PHP_AUTH_PW', 'foo'); $app->handle($request); $this->assertFalse($app->isGranted('ROLE_USER')); $this->assertTrue($app->isGranted('ROLE_ADMIN')); } public function createApplication($users = []) { $app = new SecurityApplication(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ 'http' => true, 'users' => $users, ], ], ]); return $app; } } src/Silex/tests/Silex/Tests/Application/SwiftmailerApplication.php000066400000000000000000000005661516072260400257210ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use Silex\Application; class SwiftmailerApplication extends Application { use Application\SwiftmailerTrait; } src/Silex/tests/Silex/Tests/Application/SwiftmailerTraitTest.php000066400000000000000000000020551516072260400253740ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use PHPUnit\Framework\TestCase; use Silex\Provider\SwiftmailerServiceProvider; /** * @author Fabien Potencier */ class SwiftmailerTraitTest extends TestCase { public function testMail() { $app = $this->createApplication(); $message = $this->getMockBuilder('Swift_Message')->disableOriginalConstructor()->getMock(); $app['mailer'] = $mailer = $this->getMockBuilder('Swift_Mailer')->disableOriginalConstructor()->getMock(); $mailer->expects($this->once()) ->method('send') ->with($message) ; $app->mail($message); } public function createApplication() { $app = new SwiftmailerApplication(); $app->register(new SwiftmailerServiceProvider()); return $app; } } src/Silex/tests/Silex/Tests/Application/TranslationApplication.php000066400000000000000000000005661516072260400257310ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use Silex\Application; class TranslationApplication extends Application { use Application\TranslationTrait; } src/Silex/tests/Silex/Tests/Application/TranslationTraitTest.php000066400000000000000000000024241516072260400254040ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use PHPUnit\Framework\TestCase; use Silex\Provider\TranslationServiceProvider; /** * @author Fabien Potencier */ class TranslationTraitTest extends TestCase { public function testTrans() { $app = $this->createApplication(); $app['translator'] = $translator = $this->getMockBuilder('Symfony\Component\Translation\Translator')->disableOriginalConstructor()->getMock(); $translator->expects($this->once())->method('trans'); $app->trans('foo'); } public function testTransChoice() { $app = $this->createApplication(); $app['translator'] = $translator = $this->getMockBuilder('Symfony\Component\Translation\Translator')->disableOriginalConstructor()->getMock(); $translator->expects($this->once())->method('transChoice'); $app->transChoice('foo', 2); } public function createApplication() { $app = new TranslationApplication(); $app->register(new TranslationServiceProvider()); return $app; } } src/Silex/tests/Silex/Tests/Application/TwigApplication.php000066400000000000000000000005501516072260400243360ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use Silex\Application; class TwigApplication extends Application { use Application\TwigTrait; } src/Silex/tests/Silex/Tests/Application/TwigTraitTest.php000066400000000000000000000047731516072260400240310ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use PHPUnit\Framework\TestCase; use Silex\Provider\TwigServiceProvider; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\StreamedResponse; /** * @author Fabien Potencier */ class TwigTraitTest extends TestCase { public function testRender() { $app = $this->createApplication(); $app['twig'] = $mailer = $this->getMockBuilder('\Twig\Environment')->disableOriginalConstructor()->getMock(); $mailer->expects($this->once())->method('render')->will($this->returnValue('foo')); $response = $app->render('view'); $this->assertEquals('Symfony\Component\HttpFoundation\Response', get_class($response)); $this->assertEquals('foo', $response->getContent()); } public function testRenderKeepResponse() { $app = $this->createApplication(); $app['twig'] = $mailer = $this->getMockBuilder('\Twig\Environment')->disableOriginalConstructor()->getMock(); $mailer->expects($this->once())->method('render')->will($this->returnValue('foo')); $response = $app->render('view', [], new Response('', 404)); $this->assertEquals(404, $response->getStatusCode()); } public function testRenderForStream() { $app = $this->createApplication(); $app['twig'] = $mailer = $this->getMockBuilder('\Twig\Environment')->disableOriginalConstructor()->getMock(); $mailer->expects($this->once())->method('display')->will($this->returnCallback(function () { echo 'foo'; })); $response = $app->render('view', [], new StreamedResponse()); $this->assertEquals('Symfony\Component\HttpFoundation\StreamedResponse', get_class($response)); ob_start(); $response->send(); $this->assertEquals('foo', ob_get_clean()); } public function testRenderView() { $app = $this->createApplication(); $app['twig'] = $mailer = $this->getMockBuilder('\Twig\Environment')->disableOriginalConstructor()->getMock(); $mailer->expects($this->once())->method('render'); $app->renderView('view'); } public function createApplication() { $app = new TwigApplication(); $app->register(new TwigServiceProvider()); return $app; } } src/Silex/tests/Silex/Tests/Application/UrlGeneratorApplication.php000066400000000000000000000005701516072260400260370ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use Silex\Application; class UrlGeneratorApplication extends Application { use Application\UrlGeneratorTrait; } src/Silex/tests/Silex/Tests/Application/UrlGeneratorTraitTest.php000066400000000000000000000024251516072260400255200ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Application; use PHPUnit\Framework\TestCase; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; /** * UrlGeneratorTrait test cases. * * @author Fabien Potencier */ class UrlGeneratorTraitTest extends TestCase { public function testUrl() { $app = new UrlGeneratorApplication(); $app['url_generator'] = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGeneratorInterface')->disableOriginalConstructor()->getMock(); $app['url_generator']->expects($this->once())->method('generate')->with('foo', [], UrlGeneratorInterface::ABSOLUTE_URL); $app->url('foo'); } public function testPath() { $app = new UrlGeneratorApplication(); $app['url_generator'] = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGeneratorInterface')->disableOriginalConstructor()->getMock(); $app['url_generator']->expects($this->once())->method('generate')->with('foo', [], UrlGeneratorInterface::ABSOLUTE_PATH); $app->path('foo'); } } src/Silex/tests/Silex/Tests/ApplicationTest.php000066400000000000000000000533571516072260400221150ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use Fig\Link\GenericLinkProvider; use Fig\Link\Link; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\ControllerCollection; use Silex\Api\ControllerProviderInterface; use Silex\Route; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\EventDispatcher\Event; use Symfony\Component\Routing\RouteCollection; /** * Application test cases. * * @author Igor Wiedler */ class ApplicationTest extends TestCase { public function testMatchReturnValue() { $app = new Application(); $returnValue = $app->match('/foo', function () {}); $this->assertInstanceOf('Silex\Controller', $returnValue); $returnValue = $app->get('/foo', function () {}); $this->assertInstanceOf('Silex\Controller', $returnValue); $returnValue = $app->post('/foo', function () {}); $this->assertInstanceOf('Silex\Controller', $returnValue); $returnValue = $app->put('/foo', function () {}); $this->assertInstanceOf('Silex\Controller', $returnValue); $returnValue = $app->patch('/foo', function () {}); $this->assertInstanceOf('Silex\Controller', $returnValue); $returnValue = $app->delete('/foo', function () {}); $this->assertInstanceOf('Silex\Controller', $returnValue); } public function testConstructorInjection() { // inject a custom parameter $params = ['param' => 'value']; $app = new Application($params); $this->assertSame($params['param'], $app['param']); // inject an existing parameter $params = ['locale' => 'value']; $app = new Application($params); $this->assertSame($params['locale'], $app['locale']); } public function testGetRequest() { $request = Request::create('/'); $app = new Application(); $app->get('/', function (Request $req) use ($request) { return $request === $req ? 'ok' : 'ko'; }); $this->assertEquals('ok', $app->handle($request)->getContent()); } public function testGetRoutesWithNoRoutes() { $app = new Application(); $routes = $app['routes']; $this->assertInstanceOf('Symfony\Component\Routing\RouteCollection', $routes); $this->assertCount(0, $routes->all()); } public function testGetRoutesWithRoutes() { $app = new Application(); $app->get('/foo', function () { return 'foo'; }); $app->get('/bar')->run(function () { return 'bar'; }); $routes = $app['routes']; $this->assertInstanceOf('Symfony\Component\Routing\RouteCollection', $routes); $this->assertCount(0, $routes->all()); $app->flush(); $this->assertCount(2, $routes->all()); } public function testOnCoreController() { $app = new Application(); $app->get('/foo/{foo}', function (\ArrayObject $foo) { return $foo['foo']; })->convert('foo', function ($foo) { return new \ArrayObject(['foo' => $foo]); }); $response = $app->handle(Request::create('/foo/bar')); $this->assertEquals('bar', $response->getContent()); $app->get('/foo/{foo}/{bar}', function (\ArrayObject $foo) { return $foo['foo']; })->convert('foo', function ($foo, Request $request) { return new \ArrayObject(['foo' => $foo.$request->attributes->get('bar')]); }); $response = $app->handle(Request::create('/foo/foo/bar')); $this->assertEquals('foobar', $response->getContent()); } public function testOn() { $app = new Application(); $app['pass'] = false; $app->on('test', function (Event $e) use ($app) { $app['pass'] = true; }); $app['dispatcher']->dispatch('test'); $this->assertTrue($app['pass']); } public function testAbort() { $app = new Application(); try { $app->abort(404); $this->fail(); } catch (HttpException $e) { $this->assertEquals(404, $e->getStatusCode()); } } /** * @dataProvider escapeProvider */ public function testEscape($expected, $text) { $app = new Application(); $this->assertEquals($expected, $app->escape($text)); } public function escapeProvider() { return [ ['<', '<'], ['>', '>'], ['"', '"'], ["'", "'"], ['abc', 'abc'], ]; } public function testControllersAsMethods() { $app = new Application(); unset($app['exception_handler']); $app->get('/{name}', 'Silex\Tests\FooController::barAction'); $this->assertEquals('Hello Fabien', $app->handle(Request::create('/Fabien'))->getContent()); } public function testApplicationTypeHintWorks() { $app = new SpecialApplication(); unset($app['exception_handler']); $app->get('/{name}', 'Silex\Tests\FooController::barSpecialAction'); $this->assertEquals('Hello Fabien in Silex\Tests\SpecialApplication', $app->handle(Request::create('/Fabien'))->getContent()); } /** * @requires PHP 7.0 */ public function testPhp7TypeHintWorks() { $app = new SpecialApplication(); unset($app['exception_handler']); $app->get('/{name}', 'Silex\Tests\Fixtures\Php7Controller::typehintedAction'); $this->assertEquals('Hello Fabien in Silex\Tests\SpecialApplication', $app->handle(Request::create('/Fabien'))->getContent()); } public function testHttpSpec() { $app = new Application(); $app['charset'] = 'ISO-8859-1'; $app->get('/', function () { return 'hello'; }); // content is empty for HEAD requests $response = $app->handle(Request::create('/', 'HEAD')); $this->assertEquals('', $response->getContent()); // charset is appended to Content-Type $response = $app->handle(Request::create('/')); $this->assertEquals('text/html; charset=ISO-8859-1', $response->headers->get('Content-Type')); } public function testRoutesMiddlewares() { $app = new Application(); $test = $this; $middlewareTarget = []; $beforeMiddleware1 = function (Request $request) use (&$middlewareTarget, $test) { $test->assertEquals('/reached', $request->getRequestUri()); $middlewareTarget[] = 'before_middleware1_triggered'; }; $beforeMiddleware2 = function (Request $request) use (&$middlewareTarget, $test) { $test->assertEquals('/reached', $request->getRequestUri()); $middlewareTarget[] = 'before_middleware2_triggered'; }; $beforeMiddleware3 = function (Request $request) use (&$middlewareTarget, $test) { throw new \Exception('This middleware shouldn\'t run!'); }; $afterMiddleware1 = function (Request $request, Response $response) use (&$middlewareTarget, $test) { $test->assertEquals('/reached', $request->getRequestUri()); $middlewareTarget[] = 'after_middleware1_triggered'; }; $afterMiddleware2 = function (Request $request, Response $response) use (&$middlewareTarget, $test) { $test->assertEquals('/reached', $request->getRequestUri()); $middlewareTarget[] = 'after_middleware2_triggered'; }; $afterMiddleware3 = function (Request $request, Response $response) use (&$middlewareTarget, $test) { throw new \Exception('This middleware shouldn\'t run!'); }; $app->get('/reached', function () use (&$middlewareTarget) { $middlewareTarget[] = 'route_triggered'; return 'hello'; }) ->before($beforeMiddleware1) ->before($beforeMiddleware2) ->after($afterMiddleware1) ->after($afterMiddleware2); $app->get('/never-reached', function () use (&$middlewareTarget) { throw new \Exception('This route shouldn\'t run!'); }) ->before($beforeMiddleware3) ->after($afterMiddleware3); $result = $app->handle(Request::create('/reached')); $this->assertSame(['before_middleware1_triggered', 'before_middleware2_triggered', 'route_triggered', 'after_middleware1_triggered', 'after_middleware2_triggered'], $middlewareTarget); $this->assertEquals('hello', $result->getContent()); } public function testRoutesBeforeMiddlewaresWithResponseObject() { $app = new Application(); $app->get('/foo', function () { throw new \Exception('This route shouldn\'t run!'); }) ->before(function () { return new Response('foo'); }); $request = Request::create('/foo'); $result = $app->handle($request); $this->assertEquals('foo', $result->getContent()); } public function testRoutesAfterMiddlewaresWithResponseObject() { $app = new Application(); $app->get('/foo', function () { return new Response('foo'); }) ->after(function () { return new Response('bar'); }); $request = Request::create('/foo'); $result = $app->handle($request); $this->assertEquals('bar', $result->getContent()); } public function testRoutesBeforeMiddlewaresWithRedirectResponseObject() { $app = new Application(); $app->get('/foo', function () { throw new \Exception('This route shouldn\'t run!'); }) ->before(function () use ($app) { return $app->redirect('/bar'); }); $request = Request::create('/foo'); $result = $app->handle($request); $this->assertInstanceOf('Symfony\Component\HttpFoundation\RedirectResponse', $result); $this->assertEquals('/bar', $result->getTargetUrl()); } public function testRoutesBeforeMiddlewaresTriggeredAfterSilexBeforeFilters() { $app = new Application(); $middlewareTarget = []; $middleware = function (Request $request) use (&$middlewareTarget) { $middlewareTarget[] = 'middleware_triggered'; }; $app->get('/foo', function () use (&$middlewareTarget) { $middlewareTarget[] = 'route_triggered'; }) ->before($middleware); $app->before(function () use (&$middlewareTarget) { $middlewareTarget[] = 'before_triggered'; }); $app->handle(Request::create('/foo')); $this->assertSame(['before_triggered', 'middleware_triggered', 'route_triggered'], $middlewareTarget); } public function testRoutesAfterMiddlewaresTriggeredBeforeSilexAfterFilters() { $app = new Application(); $middlewareTarget = []; $middleware = function (Request $request) use (&$middlewareTarget) { $middlewareTarget[] = 'middleware_triggered'; }; $app->get('/foo', function () use (&$middlewareTarget) { $middlewareTarget[] = 'route_triggered'; }) ->after($middleware); $app->after(function () use (&$middlewareTarget) { $middlewareTarget[] = 'after_triggered'; }); $app->handle(Request::create('/foo')); $this->assertSame(['route_triggered', 'middleware_triggered', 'after_triggered'], $middlewareTarget); } public function testFinishFilter() { $containerTarget = []; $app = new Application(); $app->finish(function () use (&$containerTarget) { $containerTarget[] = '4_filterFinish'; }); $app->get('/foo', function () use (&$containerTarget) { $containerTarget[] = '1_routeTriggered'; return new StreamedResponse(function () use (&$containerTarget) { $containerTarget[] = '3_responseSent'; }); }); $app->after(function () use (&$containerTarget) { $containerTarget[] = '2_filterAfter'; }); $app->run(Request::create('/foo')); $this->assertSame(['1_routeTriggered', '2_filterAfter', '3_responseSent', '4_filterFinish'], $containerTarget); } /** * @expectedException \RuntimeException */ public function testNonResponseAndNonNullReturnFromRouteBeforeMiddlewareShouldThrowRuntimeException() { $app = new Application(); $middleware = function (Request $request) { return 'string return'; }; $app->get('/', function () { return 'hello'; }) ->before($middleware); $app->handle(Request::create('/'), HttpKernelInterface::MASTER_REQUEST, false); } /** * @expectedException \RuntimeException */ public function testNonResponseAndNonNullReturnFromRouteAfterMiddlewareShouldThrowRuntimeException() { $app = new Application(); $middleware = function (Request $request) { return 'string return'; }; $app->get('/', function () { return 'hello'; }) ->after($middleware); $app->handle(Request::create('/'), HttpKernelInterface::MASTER_REQUEST, false); } public function testSubRequest() { $app = new Application(); $app->get('/sub', function (Request $request) { return new Response('foo'); }); $app->get('/', function (Request $request) use ($app) { return $app->handle(Request::create('/sub'), HttpKernelInterface::SUB_REQUEST); }); $this->assertEquals('foo', $app->handle(Request::create('/'))->getContent()); } public function testRegisterShouldReturnSelf() { $app = new Application(); $provider = $this->getMockBuilder('Pimple\ServiceProviderInterface')->getMock(); $this->assertSame($app, $app->register($provider)); } public function testMountShouldReturnSelf() { $app = new Application(); $mounted = new ControllerCollection(new Route()); $mounted->get('/{name}', function ($name) { return new Response($name); }); $this->assertSame($app, $app->mount('/hello', $mounted)); } public function testMountPreservesOrder() { $app = new Application(); $mounted = new ControllerCollection(new Route()); $mounted->get('/mounted')->bind('second'); $app->get('/before')->bind('first'); $app->mount('/', $mounted); $app->get('/after')->bind('third'); $app->flush(); $this->assertEquals(['first', 'second', 'third'], array_keys(iterator_to_array($app['routes']))); } /** * @expectedException \LogicException * @expectedExceptionMessage The "mount" method takes either a "ControllerCollection" instance, "ControllerProviderInterface" instance, or a callable. */ public function testMountNullException() { $app = new Application(); $app->mount('/exception', null); } /** * @expectedException \LogicException * @expectedExceptionMessage The method "Silex\Tests\IncorrectControllerCollection::connect" must return a "ControllerCollection" instance. Got: "NULL" */ public function testMountWrongConnectReturnValueException() { $app = new Application(); $app->mount('/exception', new IncorrectControllerCollection()); } public function testMountCallable() { $app = new Application(); $app->mount('/prefix', function (ControllerCollection $coll) { $coll->get('/path'); }); $app->flush(); $this->assertEquals(1, $app['routes']->count()); } public function testSendFile() { $app = new Application(); $response = $app->sendFile(__FILE__, 200, ['Content-Type: application/php']); $this->assertInstanceOf('Symfony\Component\HttpFoundation\BinaryFileResponse', $response); $this->assertEquals(__FILE__, (string) $response->getFile()); } /** * @expectedException \LogicException * @expectedExceptionMessage The "homepage" route must have code to run when it matches. */ public function testGetRouteCollectionWithRouteWithoutController() { $app = new Application(); unset($app['exception_handler']); $app->match('/')->bind('homepage'); $app->handle(Request::create('/')); } public function testBeforeFilterOnMountedControllerGroupIsolatedToGroup() { $app = new Application(); $app->match('/', function () { return new Response('ok'); }); $mounted = $app['controllers_factory']; $mounted->before(function () { return new Response('not ok'); }); $app->mount('/group', $mounted); $response = $app->handle(Request::create('/')); $this->assertEquals('ok', $response->getContent()); } public function testViewListenerWithPrimitive() { $app = new Application(); $app->get('/foo', function () { return 123; }); $app->view(function ($view, Request $request) { return new Response($view); }); $response = $app->handle(Request::create('/foo')); $this->assertEquals('123', $response->getContent()); } public function testViewListenerWithArrayTypeHint() { $app = new Application(); $app->get('/foo', function () { return ['ok']; }); $app->view(function (array $view) { return new Response($view[0]); }); $response = $app->handle(Request::create('/foo')); $this->assertEquals('ok', $response->getContent()); } public function testViewListenerWithObjectTypeHint() { $app = new Application(); $app->get('/foo', function () { return (object) ['name' => 'world']; }); $app->view(function (\stdClass $view) { return new Response('Hello '.$view->name); }); $response = $app->handle(Request::create('/foo')); $this->assertEquals('Hello world', $response->getContent()); } public function testViewListenerWithCallableTypeHint() { $app = new Application(); $app->get('/foo', function () { return function () { return 'world'; }; }); $app->view(function (callable $view) { return new Response('Hello '.$view()); }); $response = $app->handle(Request::create('/foo')); $this->assertEquals('Hello world', $response->getContent()); } public function testViewListenersCanBeChained() { $app = new Application(); $app->get('/foo', function () { return (object) ['name' => 'world']; }); $app->view(function (\stdClass $view) { return ['msg' => 'Hello '.$view->name]; }); $app->view(function (array $view) { return $view['msg']; }); $response = $app->handle(Request::create('/foo')); $this->assertEquals('Hello world', $response->getContent()); } public function testViewListenersAreIgnoredIfNotSuitable() { $app = new Application(); $app->get('/foo', function () { return 'Hello world'; }); $app->view(function (\stdClass $view) { throw new \Exception('View listener was called'); }); $app->view(function (array $view) { throw new \Exception('View listener was called'); }); $response = $app->handle(Request::create('/foo')); $this->assertEquals('Hello world', $response->getContent()); } public function testViewListenersResponsesAreNotUsedIfNull() { $app = new Application(); $app->get('/foo', function () { return 'Hello world'; }); $app->view(function ($view) { return 'Hello view listener'; }); $app->view(function ($view) { return; }); $response = $app->handle(Request::create('/foo')); $this->assertEquals('Hello view listener', $response->getContent()); } public function testWebLinkListener() { $app = new Application(); $app->get('/', function () { return 'hello'; }); $request = Request::create('/'); $request->attributes->set('_links', (new GenericLinkProvider())->withLink(new Link('preload', '/foo.css'))); $response = $app->handle($request); $this->assertEquals('; rel="preload"', $response->headers->get('Link')); } public function testDefaultRoutesFactory() { $app = new Application(); $this->assertInstanceOf('Symfony\Component\Routing\RouteCollection', $app['routes']); } public function testOverriddenRoutesFactory() { $app = new Application(); $app['routes_factory'] = $app->factory(function () { return new RouteCollectionSubClass(); }); $this->assertInstanceOf('Silex\Tests\RouteCollectionSubClass', $app['routes']); } } class FooController { public function barAction(Application $app, $name) { return 'Hello '.$app->escape($name); } public function barSpecialAction(SpecialApplication $app, $name) { return 'Hello '.$app->escape($name).' in '.get_class($app); } } class IncorrectControllerCollection implements ControllerProviderInterface { public function connect(Application $app) { return; } } class RouteCollectionSubClass extends RouteCollection { } class SpecialApplication extends Application { } src/Silex/tests/Silex/Tests/CallbackResolverTest.php000066400000000000000000000044601516072260400230570ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Pimple\Container; use Silex\CallbackResolver; class CallbackResolverTest extends Testcase { private $app; private $resolver; public function setup() { $this->app = new Container(); $this->resolver = new CallbackResolver($this->app); } public function testShouldResolveCallback() { $callable = function () {}; $this->app['some_service'] = function () { return new \ArrayObject(); }; $this->app['callable_service'] = function () use ($callable) { return $callable; }; $this->assertTrue($this->resolver->isValid('some_service:methodName')); $this->assertTrue($this->resolver->isValid('callable_service')); $this->assertEquals( [$this->app['some_service'], 'append'], $this->resolver->convertCallback('some_service:append') ); $this->assertSame($callable, $this->resolver->convertCallback('callable_service')); } /** * @dataProvider nonStringsAreNotValidProvider */ public function testNonStringsAreNotValid($name) { $this->assertFalse($this->resolver->isValid($name)); } public function nonStringsAreNotValidProvider() { return [ [null], ['some_service::methodName'], ['missing_service'], ]; } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessageRegExp /Service "[a-z_]+" is not callable./ * @dataProvider shouldThrowAnExceptionIfServiceIsNotCallableProvider */ public function testShouldThrowAnExceptionIfServiceIsNotCallable($name) { $this->app['non_callable_obj'] = function () { return new \stdClass(); }; $this->app['non_callable'] = function () { return []; }; $this->resolver->convertCallback($name); } public function shouldThrowAnExceptionIfServiceIsNotCallableProvider() { return [ ['non_callable_obj:methodA'], ['non_callable'], ]; } } src/Silex/tests/Silex/Tests/CallbackServicesTest.php000066400000000000000000000045031516072260400230370ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; use Symfony\Component\HttpFoundation\Request; use Silex\Provider\ServiceControllerServiceProvider; /** * Callback as services test cases. * * @author Fabien Potencier */ class CallbackServicesTest extends TestCase { public $called = []; public function testCallbacksAsServices() { $app = new Application(); $app->register(new ServiceControllerServiceProvider()); $app['service'] = function () { return new CallbackServicesTest(); }; $app->before('service:beforeApp'); $app->after('service:afterApp'); $app->finish('service:finishApp'); $app->error('service:error'); $app->on('kernel.request', 'service:onRequest'); $app ->match('/', 'service:controller') ->convert('foo', 'service:convert') ->before('service:before') ->after('service:after') ; $request = Request::create('/'); $response = $app->handle($request); $app->terminate($request, $response); $this->assertEquals([ 'BEFORE APP', 'ON REQUEST', 'BEFORE', 'CONVERT', 'ERROR', 'AFTER', 'AFTER APP', 'FINISH APP', ], $app['service']->called); } public function controller(Application $app) { $app->abort(404); } public function before() { $this->called[] = 'BEFORE'; } public function after() { $this->called[] = 'AFTER'; } public function beforeApp() { $this->called[] = 'BEFORE APP'; } public function afterApp() { $this->called[] = 'AFTER APP'; } public function finishApp() { $this->called[] = 'FINISH APP'; } public function error() { $this->called[] = 'ERROR'; } public function convert() { $this->called[] = 'CONVERT'; } public function onRequest() { $this->called[] = 'ON REQUEST'; } } src/Silex/tests/Silex/Tests/ControllerCollectionTest.php000066400000000000000000000272671516072260400240120ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Controller; use Silex\ControllerCollection; use Silex\Exception\ControllerFrozenException; use Silex\Route; use Symfony\Component\Routing\RouteCollection; /** * ControllerCollection test cases. * * @author Igor Wiedler */ class ControllerCollectionTest extends TestCase { public function testGetRouteCollectionWithNoRoutes() { $controllers = new ControllerCollection(new Route()); $routes = $controllers->flush(); $this->assertCount(0, $routes->all()); } public function testGetRouteCollectionWithRoutes() { $controllers = new ControllerCollection(new Route()); $controllers->match('/foo', function () {}); $controllers->match('/bar', function () {}); $routes = $controllers->flush(); $this->assertCount(2, $routes->all()); } public function testControllerFreezing() { $controllers = new ControllerCollection(new Route()); $fooController = $controllers->match('/foo', function () {})->bind('foo'); $barController = $controllers->match('/bar', function () {})->bind('bar'); $controllers->flush(); try { $fooController->bind('foo2'); $this->fail(); } catch (ControllerFrozenException $e) { } $this->addToAssertionCount(1); try { $barController->bind('bar2'); $this->fail(); } catch (ControllerFrozenException $e) { } $this->addToAssertionCount(1); } public function testConflictingRouteNames() { $controllers = new ControllerCollection(new Route()); $mountedRootController = $controllers->match('/', function () {}); $mainRootController = new Controller(new Route('/')); $mainRootController->bind($mainRootController->generateRouteName('main_1')); $controllers->flush(); $this->assertNotEquals($mainRootController->getRouteName(), $mountedRootController->getRouteName()); } public function testUniqueGeneratedRouteNames() { $controllers = new ControllerCollection(new Route()); $controllers->match('/a-a', function () {}); $controllers->match('/a_a', function () {}); $controllers->match('/a/a', function () {}); $routes = $controllers->flush(); $this->assertCount(3, $routes->all()); $this->assertEquals(['_a_a', '_a_a_1', '_a_a_2'], array_keys($routes->all())); } public function testUniqueGeneratedRouteNamesAmongMounts() { $controllers = new ControllerCollection(new Route()); $controllers->mount('/root-a', $rootA = new ControllerCollection(new Route())); $controllers->mount('/root_a', $rootB = new ControllerCollection(new Route())); $rootA->match('/leaf', function () {}); $rootB->match('/leaf', function () {}); $routes = $controllers->flush(); $this->assertCount(2, $routes->all()); $this->assertEquals(['_root_a_leaf', '_root_a_leaf_1'], array_keys($routes->all())); } public function testUniqueGeneratedRouteNamesAmongNestedMounts() { $controllers = new ControllerCollection(new Route()); $controllers->mount('/root-a', $rootA = new ControllerCollection(new Route())); $controllers->mount('/root_a', $rootB = new ControllerCollection(new Route())); $rootA->mount('/tree', $treeA = new ControllerCollection(new Route())); $rootB->mount('/tree', $treeB = new ControllerCollection(new Route())); $treeA->match('/leaf', function () {}); $treeB->match('/leaf', function () {}); $routes = $controllers->flush(); $this->assertCount(2, $routes->all()); $this->assertEquals(['_root_a_tree_leaf', '_root_a_tree_leaf_1'], array_keys($routes->all())); } public function testMountCallable() { $controllers = new ControllerCollection(new Route()); $controllers->mount('/prefix', function (ControllerCollection $coll) { $coll->mount('/path', function ($coll) { $coll->get('/part'); }); }); $routes = $controllers->flush(); $this->assertEquals('/prefix/path/part', current($routes->all())->getPath()); } public function testMountCallableProperClone() { $controllers = new ControllerCollection(new Route(), new RouteCollection()); $controllers->get('/'); $subControllers = null; $controllers->mount('/prefix', function (ControllerCollection $coll) use (&$subControllers) { $subControllers = $coll; $coll->get('/'); }); $routes = $controllers->flush(); $subRoutes = $subControllers->flush(); $this->assertTrue(2 == $routes->count() && 0 == $subRoutes->count()); } public function testMountControllersFactory() { $testControllers = new ControllerCollection(new Route()); $controllers = new ControllerCollection(new Route(), null, function () use ($testControllers) { return $testControllers; }); $controllers->mount('/prefix', function ($mounted) use ($testControllers) { $this->assertSame($mounted, $testControllers); }); } /** * @expectedException \LogicException * @expectedExceptionMessage The "mount" method takes either a "ControllerCollection" instance or callable. */ public function testMountCallableException() { $controllers = new ControllerCollection(new Route()); $controllers->mount('/prefix', ''); } public function testAssert() { $controllers = new ControllerCollection(new Route()); $controllers->assert('id', '\d+'); $controller = $controllers->match('/{id}/{name}/{extra}', function () {})->assert('name', '\w+')->assert('extra', '.*'); $controllers->assert('extra', '\w+'); $this->assertEquals('\d+', $controller->getRoute()->getRequirement('id')); $this->assertEquals('\w+', $controller->getRoute()->getRequirement('name')); $this->assertEquals('\w+', $controller->getRoute()->getRequirement('extra')); } public function testAssertWithMountCallable() { $controllers = new ControllerCollection(new Route()); $controller = null; $controllers->mount('/{name}', function ($mounted) use (&$controller) { $mounted->assert('name', '\w+'); $mounted->mount('/{id}', function ($mounted2) use (&$controller) { $mounted2->assert('id', '\d+'); $controller = $mounted2->match('/{extra}', function () {})->assert('extra', '\w+'); }); }); $this->assertEquals('\d+', $controller->getRoute()->getRequirement('id')); $this->assertEquals('\w+', $controller->getRoute()->getRequirement('name')); $this->assertEquals('\w+', $controller->getRoute()->getRequirement('extra')); } public function testValue() { $controllers = new ControllerCollection(new Route()); $controllers->value('id', '1'); $controller = $controllers->match('/{id}/{name}/{extra}', function () {})->value('name', 'Fabien')->value('extra', 'Symfony'); $controllers->value('extra', 'Twig'); $this->assertEquals('1', $controller->getRoute()->getDefault('id')); $this->assertEquals('Fabien', $controller->getRoute()->getDefault('name')); $this->assertEquals('Twig', $controller->getRoute()->getDefault('extra')); } public function testConvert() { $controllers = new ControllerCollection(new Route()); $controllers->convert('id', '1'); $controller = $controllers->match('/{id}/{name}/{extra}', function () {})->convert('name', 'Fabien')->convert('extra', 'Symfony'); $controllers->convert('extra', 'Twig'); $this->assertEquals(['id' => '1', 'name' => 'Fabien', 'extra' => 'Twig'], $controller->getRoute()->getOption('_converters')); } public function testRequireHttp() { $controllers = new ControllerCollection(new Route()); $controllers->requireHttp(); $controller = $controllers->match('/{id}/{name}/{extra}', function () {})->requireHttps(); $this->assertEquals(['https'], $controller->getRoute()->getSchemes()); $controllers->requireHttp(); $this->assertEquals(['http'], $controller->getRoute()->getSchemes()); } public function testBefore() { $controllers = new ControllerCollection(new Route()); $controllers->before('mid1'); $controller = $controllers->match('/{id}/{name}/{extra}', function () {})->before('mid2'); $controllers->before('mid3'); $this->assertEquals(['mid1', 'mid2', 'mid3'], $controller->getRoute()->getOption('_before_middlewares')); } public function testAfter() { $controllers = new ControllerCollection(new Route()); $controllers->after('mid1'); $controller = $controllers->match('/{id}/{name}/{extra}', function () {})->after('mid2'); $controllers->after('mid3'); $this->assertEquals(['mid1', 'mid2', 'mid3'], $controller->getRoute()->getOption('_after_middlewares')); } public function testWhen() { $controllers = new ControllerCollection(new Route()); $controller = $controllers->match('/{id}/{name}/{extra}', function () {})->when('request.isSecure() == true'); $this->assertEquals('request.isSecure() == true', $controller->getRoute()->getCondition()); } public function testRouteExtension() { $route = new MyRoute1(); $controller = new ControllerCollection($route); $controller->foo('foo'); $this->assertEquals('foo', $route->foo); } /** * @expectedException \BadMethodCallException */ public function testRouteMethodDoesNotExist() { $route = new MyRoute1(); $controller = new ControllerCollection($route); $controller->bar(); } public function testNestedCollectionRouteCallbacks() { $cl1 = new ControllerCollection(new MyRoute1()); $cl2 = new ControllerCollection(new MyRoute1()); $c1 = $cl2->match('/c1', function () {}); $cl1->mount('/foo', $cl2); $c2 = $cl2->match('/c2', function () {}); $cl1->before('before'); $c3 = $cl2->match('/c3', function () {}); $cl1->flush(); $this->assertEquals(['before'], $c1->getRoute()->getOption('_before_middlewares')); $this->assertEquals(['before'], $c2->getRoute()->getOption('_before_middlewares')); $this->assertEquals(['before'], $c3->getRoute()->getOption('_before_middlewares')); } public function testRoutesFactoryOmitted() { $controllers = new ControllerCollection(new Route()); $routes = $controllers->flush(); $this->assertInstanceOf('Symfony\Component\Routing\RouteCollection', $routes); } public function testRoutesFactoryInConstructor() { $app = new Application(); $app['routes_factory'] = $app->factory(function () { return new RouteCollectionSubClass2(); }); $controllers = new ControllerCollection(new Route(), $app['routes_factory']); $routes = $controllers->flush(); $this->assertInstanceOf('Silex\Tests\RouteCollectionSubClass2', $routes); } } class MyRoute1 extends Route { public $foo; public function foo($value) { $this->foo = $value; } } class RouteCollectionSubClass2 extends RouteCollection { } src/Silex/tests/Silex/Tests/ControllerTest.php000066400000000000000000000073001516072260400217600ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Controller; use Silex\Route; /** * Controller test cases. * * @author Igor Wiedler */ class ControllerTest extends TestCase { public function testBind() { $controller = new Controller(new Route('/foo')); $ret = $controller->bind('foo'); $this->assertSame($ret, $controller); $this->assertEquals('foo', $controller->getRouteName()); } /** * @expectedException \Silex\Exception\ControllerFrozenException */ public function testBindOnFrozenControllerShouldThrowException() { $controller = new Controller(new Route('/foo')); $controller->bind('foo'); $controller->freeze(); $controller->bind('bar'); } public function testAssert() { $controller = new Controller(new Route('/foo/{bar}')); $ret = $controller->assert('bar', '\d+'); $this->assertSame($ret, $controller); $this->assertEquals(['bar' => '\d+'], $controller->getRoute()->getRequirements()); } public function testValue() { $controller = new Controller(new Route('/foo/{bar}')); $ret = $controller->value('bar', 'foo'); $this->assertSame($ret, $controller); $this->assertEquals(['bar' => 'foo'], $controller->getRoute()->getDefaults()); } public function testConvert() { $controller = new Controller(new Route('/foo/{bar}')); $ret = $controller->convert('bar', $func = function ($bar) { return $bar; }); $this->assertSame($ret, $controller); $this->assertEquals(['bar' => $func], $controller->getRoute()->getOption('_converters')); } public function testRun() { $controller = new Controller(new Route('/foo/{bar}')); $ret = $controller->run($cb = function () { return 'foo'; }); $this->assertSame($ret, $controller); $this->assertEquals($cb, $controller->getRoute()->getDefault('_controller')); } /** * @dataProvider provideRouteAndExpectedRouteName */ public function testDefaultRouteNameGeneration(Route $route, $prefix, $expectedRouteName) { $controller = new Controller($route); $controller->bind($controller->generateRouteName($prefix)); $this->assertEquals($expectedRouteName, $controller->getRouteName()); } public function provideRouteAndExpectedRouteName() { return [ [new Route('/Invalid%Symbols#Stripped', [], [], [], '', [], ['POST']), '', 'POST_InvalidSymbolsStripped'], [new Route('/post/{id}', [], [], [], '', [], ['GET']), '', 'GET_post_id'], [new Route('/colon:pipe|dashes-escaped'), '', '_colon_pipe_dashes_escaped'], [new Route('/underscores_and.periods'), '', '_underscores_and.periods'], [new Route('/post/{id}', [], [], [], '', [], ['GET']), 'prefix', 'GET_prefix_post_id'], ]; } public function testRouteExtension() { $route = new MyRoute(); $controller = new Controller($route); $controller->foo('foo'); $this->assertEquals('foo', $route->foo); } /** * @expectedException \BadMethodCallException */ public function testRouteMethodDoesNotExist() { $route = new MyRoute(); $controller = new Controller($route); $controller->bar(); } } class MyRoute extends Route { public $foo; public function foo($value) { $this->foo = $value; } } src/Silex/tests/Silex/Tests/EventListener/000077500000000000000000000000001516072260400210535ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/EventListener/LogListenerTest.php000066400000000000000000000074541516072260400246650ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\EventListener; use PHPUnit\Framework\TestCase; use Psr\Log\LogLevel; use Silex\EventListener\LogListener; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\HttpKernel\Exception\HttpException; /** * LogListener. * * @author Jérôme Tamarelle */ class LogListenerTest extends TestCase { public function testRequestListener() { $logger = $this->getMockBuilder('Psr\\Log\\LoggerInterface')->getMock(); $logger ->expects($this->once()) ->method('log') ->with(LogLevel::DEBUG, '> GET /foo') ; $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new LogListener($logger)); $kernel = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\HttpKernelInterface')->getMock(); $dispatcher->dispatch(KernelEvents::REQUEST, new GetResponseEvent($kernel, Request::create('/subrequest'), HttpKernelInterface::SUB_REQUEST), 'Skip sub requests'); $dispatcher->dispatch(KernelEvents::REQUEST, new GetResponseEvent($kernel, Request::create('/foo'), HttpKernelInterface::MASTER_REQUEST), 'Log master requests'); } public function testResponseListener() { $logger = $this->getMockBuilder('Psr\\Log\\LoggerInterface')->getMock(); $logger ->expects($this->once()) ->method('log') ->with(LogLevel::DEBUG, '< 301') ; $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new LogListener($logger)); $kernel = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\HttpKernelInterface')->getMock(); $dispatcher->dispatch(KernelEvents::RESPONSE, new FilterResponseEvent($kernel, Request::create('/foo'), HttpKernelInterface::SUB_REQUEST, Response::create('subrequest', 200)), 'Skip sub requests'); $dispatcher->dispatch(KernelEvents::RESPONSE, new FilterResponseEvent($kernel, Request::create('/foo'), HttpKernelInterface::MASTER_REQUEST, Response::create('bar', 301)), 'Log master requests'); } public function testExceptionListener() { $logger = $this->getMockBuilder('Psr\\Log\\LoggerInterface')->getMock(); $logger ->expects($this->at(0)) ->method('log') ->with(LogLevel::CRITICAL, 'RuntimeException: Fatal error (uncaught exception) at '.__FILE__.' line '.(__LINE__ + 13)) ; $logger ->expects($this->at(1)) ->method('log') ->with(LogLevel::ERROR, 'Symfony\Component\HttpKernel\Exception\HttpException: Http error (uncaught exception) at '.__FILE__.' line '.(__LINE__ + 9)) ; $dispatcher = new EventDispatcher(); $dispatcher->addSubscriber(new LogListener($logger)); $kernel = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\HttpKernelInterface')->getMock(); $dispatcher->dispatch(KernelEvents::EXCEPTION, new ExceptionEvent($kernel, Request::create('/foo'), HttpKernelInterface::SUB_REQUEST, new \RuntimeException('Fatal error'))); $dispatcher->dispatch(KernelEvents::EXCEPTION, new ExceptionEvent($kernel, Request::create('/foo'), HttpKernelInterface::SUB_REQUEST, new HttpException(400, 'Http error'))); } } src/Silex/tests/Silex/Tests/ExceptionHandlerTest.php000066400000000000000000000311301516072260400230670ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Error handler test cases. * * @author Igor Wiedler */ class ExceptionHandlerTest extends TestCase { public function testExceptionHandlerExceptionNoDebug() { $app = new Application(); $app['debug'] = false; $app->match('/foo', function () { throw new \RuntimeException('foo exception'); }); $request = Request::create('/foo'); $response = $app->handle($request); $this->assertContains('Whoops, looks like something went wrong.', $response->getContent()); $this->assertEquals(500, $response->getStatusCode()); } public function testExceptionHandlerExceptionDebug() { $app = new Application(); $app['debug'] = true; $app->match('/foo', function () { throw new \RuntimeException('foo exception'); }); $request = Request::create('/foo'); $response = $app->handle($request); $this->assertContains('foo exception', $response->getContent()); $this->assertEquals(500, $response->getStatusCode()); } public function testExceptionHandlerNotFoundNoDebug() { $app = new Application(); $app['debug'] = false; $request = Request::create('/foo'); $response = $app->handle($request); $this->assertContains('Sorry, the page you are looking for could not be found.', $response->getContent()); $this->assertEquals(404, $response->getStatusCode()); } public function testExceptionHandlerNotFoundDebug() { $app = new Application(); $app['debug'] = true; $request = Request::create('/foo'); $response = $app->handle($request); $this->assertContains('No route found for "GET /foo"', html_entity_decode($response->getContent())); $this->assertEquals(404, $response->getStatusCode()); } public function testExceptionHandlerMethodNotAllowedNoDebug() { $app = new Application(); $app['debug'] = false; $app->get('/foo', function () { return 'foo'; }); $request = Request::create('/foo', 'POST'); $response = $app->handle($request); $this->assertContains('Whoops, looks like something went wrong.', $response->getContent()); $this->assertEquals(405, $response->getStatusCode()); $this->assertEquals('GET', $response->headers->get('Allow')); } public function testExceptionHandlerMethodNotAllowedDebug() { $app = new Application(); $app['debug'] = true; $app->get('/foo', function () { return 'foo'; }); $request = Request::create('/foo', 'POST'); $response = $app->handle($request); $this->assertContains('No route found for "POST /foo": Method Not Allowed (Allow: GET)', html_entity_decode($response->getContent())); $this->assertEquals(405, $response->getStatusCode()); $this->assertEquals('GET', $response->headers->get('Allow')); } public function testNoExceptionHandler() { $app = new Application(); unset($app['exception_handler']); $app->match('/foo', function () { throw new \RuntimeException('foo exception'); }); try { $request = Request::create('/foo'); $app->handle($request); $this->fail('->handle() should not catch exceptions where no error handler was supplied'); } catch (\RuntimeException $e) { $this->assertEquals('foo exception', $e->getMessage()); } } public function testOneExceptionHandler() { $app = new Application(); $app->match('/500', function () { throw new \RuntimeException('foo exception'); }); $app->match('/404', function () { throw new NotFoundHttpException('foo exception'); }); $app->get('/405', function () { return 'foo'; }); $app->error(function ($e, $code) { return new Response('foo exception handler'); }); $response = $this->checkRouteResponse($app, '/500', 'foo exception handler'); $this->assertEquals(500, $response->getStatusCode()); $response = $app->handle(Request::create('/404')); $this->assertEquals(404, $response->getStatusCode()); $response = $app->handle(Request::create('/405', 'POST')); $this->assertEquals(405, $response->getStatusCode()); $this->assertEquals('GET', $response->headers->get('Allow')); } public function testMultipleExceptionHandlers() { $app = new Application(); $app->match('/foo', function () { throw new \RuntimeException('foo exception'); }); $errors = 0; $app->error(function ($e) use (&$errors) { ++$errors; }); $app->error(function ($e) use (&$errors) { ++$errors; }); $app->error(function ($e) use (&$errors) { ++$errors; return new Response('foo exception handler'); }); $app->error(function ($e) use (&$errors) { // should not execute ++$errors; }); $request = Request::create('/foo'); $this->checkRouteResponse($app, '/foo', 'foo exception handler', 'should return the first response returned by an exception handler'); $this->assertEquals(3, $errors, 'should execute error handlers until a response is returned'); } public function testNoResponseExceptionHandler() { $app = new Application(); unset($app['exception_handler']); $app->match('/foo', function () { throw new \RuntimeException('foo exception'); }); $errors = 0; $app->error(function ($e) use (&$errors) { ++$errors; }); try { $request = Request::create('/foo'); $app->handle($request); $this->fail('->handle() should not catch exceptions where an empty error handler was supplied'); } catch (\RuntimeException $e) { $this->assertEquals('foo exception', $e->getMessage()); } catch (\LogicException $e) { $this->assertEquals('foo exception', $e->getPrevious()->getMessage()); } $this->assertEquals(1, $errors, 'should execute the error handler'); } public function testStringResponseExceptionHandler() { $app = new Application(); $app->match('/foo', function () { throw new \RuntimeException('foo exception'); }); $app->error(function ($e) { return 'foo exception handler'; }); $request = Request::create('/foo'); $this->checkRouteResponse($app, '/foo', 'foo exception handler', 'should accept a string response from the error handler'); } public function testExceptionHandlerException() { $app = new Application(); $app->match('/foo', function () { throw new \RuntimeException('foo exception'); }); $app->error(function ($e) { throw new \RuntimeException('foo exception handler exception'); }); try { $request = Request::create('/foo'); $app->handle($request); $this->fail('->handle() should not catch exceptions thrown from an error handler'); } catch (\RuntimeException $e) { $this->assertEquals('foo exception handler exception', $e->getMessage()); } } public function testRemoveExceptionHandlerAfterDispatcherAccess() { $app = new Application(); $app->match('/foo', function () { throw new \RuntimeException('foo exception'); }); $app->before(function () { // just making sure the dispatcher gets created }); unset($app['exception_handler']); try { $request = Request::create('/foo'); $app->handle($request); $this->fail('default exception handler should have been removed'); } catch (\RuntimeException $e) { $this->assertEquals('foo exception', $e->getMessage()); } } public function testExceptionHandlerWithDefaultException() { $app = new Application(); $app['debug'] = false; $app->match('/foo', function () { throw new \Exception(); }); $app->error(function (\Exception $e) { return new Response('Exception thrown', 500); }); $request = Request::create('/foo'); $response = $app->handle($request); $this->assertContains('Exception thrown', $response->getContent()); $this->assertEquals(500, $response->getStatusCode()); } public function testExceptionHandlerWithStandardException() { $app = new Application(); $app['debug'] = false; $app->match('/foo', function () { // Throw a normal exception throw new \Exception(); }); // Register 2 error handlers, each with a specified Exception class // Since we throw a standard Exception above only // the second error handler should fire $app->error(function (\LogicException $e) { // Extends \Exception return 'Caught LogicException'; }); $app->error(function (\Exception $e) { return 'Caught Exception'; }); $request = Request::create('/foo'); $response = $app->handle($request); $this->assertContains('Caught Exception', $response->getContent()); } public function testExceptionHandlerWithSpecifiedException() { $app = new Application(); $app['debug'] = false; $app->match('/foo', function () { // Throw a specified exception throw new \LogicException(); }); // Register 2 error handlers, each with a specified Exception class // Since we throw a LogicException above // the first error handler should fire $app->error(function (\LogicException $e) { // Extends \Exception return 'Caught LogicException'; }); $app->error(function (\Exception $e) { return 'Caught Exception'; }); $request = Request::create('/foo'); $response = $app->handle($request); $this->assertContains('Caught LogicException', $response->getContent()); } public function testExceptionHandlerWithSpecifiedExceptionInReverseOrder() { $app = new Application(); $app['debug'] = false; $app->match('/foo', function () { // Throw a specified exception throw new \LogicException(); }); // Register the \Exception error handler first, since the // error handler works with an instanceof mechanism the // second more specific error handler should not fire since // the \Exception error handler is registered first and also // captures all exceptions that extend it $app->error(function (\Exception $e) { return 'Caught Exception'; }); $app->error(function (\LogicException $e) { // Extends \Exception return 'Caught LogicException'; }); $request = Request::create('/foo'); $response = $app->handle($request); $this->assertContains('Caught Exception', $response->getContent()); } public function testExceptionHandlerWithArrayStyleCallback() { $app = new Application(); $app['debug'] = false; $app->match('/foo', function () { throw new \Exception(); }); // Array style callback for error handler $app->error([$this, 'exceptionHandler']); $request = Request::create('/foo'); $response = $app->handle($request); $this->assertContains('Caught Exception', $response->getContent()); } protected function checkRouteResponse($app, $path, $expectedContent, $method = 'get', $message = null) { $request = Request::create($path, $method); $response = $app->handle($request); $this->assertEquals($expectedContent, $response->getContent(), $message); return $response; } public function exceptionHandler() { return 'Caught Exception'; } } src/Silex/tests/Silex/Tests/Fixtures/000077500000000000000000000000001516072260400200755ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/Fixtures/Php7Controller.php000066400000000000000000000007361516072260400234760ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Fixtures; use Silex\Application; class Php7Controller { public function typehintedAction(Application $application, string $name) { return 'Hello '.$application->escape($name).' in '.get_class($application); } } src/Silex/tests/Silex/Tests/Fixtures/manifest.json000066400000000000000000000000451516072260400225750ustar00rootroot00000000000000{ "app.js": "some-random-hash.js" }src/Silex/tests/Silex/Tests/FunctionalTest.php000066400000000000000000000027241516072260400217440ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Route; use Silex\ControllerCollection; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; /** * Functional test cases. * * @author Igor Wiedler */ class FunctionalTest extends TestCase { public function testBind() { $app = new Application(); $app->get('/', function () { return 'hello'; }) ->bind('homepage'); $app->get('/foo', function () { return 'foo'; }) ->bind('foo_abc'); $app->flush(); $routes = $app['routes']; $this->assertInstanceOf('Symfony\Component\Routing\Route', $routes->get('homepage')); $this->assertInstanceOf('Symfony\Component\Routing\Route', $routes->get('foo_abc')); } public function testMount() { $mounted = new ControllerCollection(new Route()); $mounted->get('/{name}', function ($name) { return new Response($name); }); $app = new Application(); $app->mount('/hello', $mounted); $response = $app->handle(Request::create('/hello/Silex')); $this->assertEquals('Silex', $response->getContent()); } } src/Silex/tests/Silex/Tests/JsonTest.php000066400000000000000000000025131516072260400205470ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; /** * JSON test cases. * * @author Igor Wiedler */ class JsonTest extends TestCase { public function testJsonReturnsJsonResponse() { $app = new Application(); $response = $app->json(); $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response); $response = json_decode($response->getContent(), true); $this->assertSame([], $response); } public function testJsonUsesData() { $app = new Application(); $response = $app->json(['foo' => 'bar']); $this->assertSame('{"foo":"bar"}', $response->getContent()); } public function testJsonUsesStatus() { $app = new Application(); $response = $app->json([], 202); $this->assertSame(202, $response->getStatusCode()); } public function testJsonUsesHeaders() { $app = new Application(); $response = $app->json([], 200, ['ETag' => 'foo']); $this->assertSame('foo', $response->headers->get('ETag')); } } src/Silex/tests/Silex/Tests/LazyDispatcherTest.php000066400000000000000000000026751516072260400225750ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; use Symfony\Component\HttpFoundation\Request; class LazyDispatcherTest extends TestCase { /** @test */ public function beforeMiddlewareShouldNotCreateDispatcherEarly() { $dispatcherCreated = false; $app = new Application(); $app->extend('dispatcher', function ($dispatcher, $app) use (&$dispatcherCreated) { $dispatcherCreated = true; return $dispatcher; }); $app->before(function () {}); $this->assertFalse($dispatcherCreated); $request = Request::create('/'); $app->handle($request); $this->assertTrue($dispatcherCreated); } /** @test */ public function eventHelpersShouldDirectlyAddListenersAfterBoot() { $app = new Application(); $fired = false; $app->get('/', function () use ($app, &$fired) { $app->finish(function () use (&$fired) { $fired = true; }); }); $request = Request::create('/'); $response = $app->handle($request); $app->terminate($request, $response); $this->assertTrue($fired, 'Event was not fired'); } } src/Silex/tests/Silex/Tests/LazyRequestMatcherTest.php000066400000000000000000000044031516072260400234320ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Request; use Silex\Provider\Routing\LazyRequestMatcher; /** * LazyRequestMatcher test case. * * @author Leszek Prabucki */ class LazyRequestMatcherTest extends TestCase { /** * @covers \Silex\LazyRequestMatcher::getRequestMatcher */ public function testUserMatcherIsCreatedLazily() { $callCounter = 0; $requestMatcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\RequestMatcherInterface')->getMock(); $matcher = new LazyRequestMatcher(function () use ($requestMatcher, &$callCounter) { ++$callCounter; return $requestMatcher; }); $this->assertEquals(0, $callCounter); $request = Request::create('path'); $matcher->matchRequest($request); $this->assertEquals(1, $callCounter); } /** * @expectedException \LogicException * @expectedExceptionMessage Factory supplied to LazyRequestMatcher must return implementation of Symfony\Component\Routing\RequestMatcherInterface. */ public function testThatCanInjectRequestMatcherOnly() { $matcher = new LazyRequestMatcher(function () { return 'someMatcher'; }); $request = Request::create('path'); $matcher->matchRequest($request); } /** * @covers \Silex\LazyRequestMatcher::matchRequest */ public function testMatchIsProxy() { $request = Request::create('path'); $matcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\RequestMatcherInterface')->getMock(); $matcher->expects($this->once()) ->method('matchRequest') ->with($request) ->will($this->returnValue('matcherReturnValue')); $matcher = new LazyRequestMatcher(function () use ($matcher) { return $matcher; }); $result = $matcher->matchRequest($request); $this->assertEquals('matcherReturnValue', $result); } } src/Silex/tests/Silex/Tests/LocaleTest.php000066400000000000000000000067461516072260400210510ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\LocaleServiceProvider; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; /** * Locale test cases. * * @author Fabien Potencier */ class LocaleTest extends TestCase { public function testLocale() { $app = new Application(); $app->register(new LocaleServiceProvider()); $app->get('/', function (Request $request) { return $request->getLocale(); }); $response = $app->handle(Request::create('/')); $this->assertEquals('en', $response->getContent()); $app = new Application(); $app->register(new LocaleServiceProvider()); $app['locale'] = 'fr'; $app->get('/', function (Request $request) { return $request->getLocale(); }); $response = $app->handle(Request::create('/')); $this->assertEquals('fr', $response->getContent()); $app = new Application(); $app->register(new LocaleServiceProvider()); $app->get('/{_locale}', function (Request $request) { return $request->getLocale(); }); $response = $app->handle(Request::create('/es')); $this->assertEquals('es', $response->getContent()); } public function testLocaleInSubRequests() { $app = new Application(); $app->register(new LocaleServiceProvider()); $app->get('/embed/{_locale}', function (Request $request) { return $request->getLocale(); }); $app->get('/{_locale}', function (Request $request) use ($app) { return $request->getLocale().$app->handle(Request::create('/embed/es'), HttpKernelInterface::SUB_REQUEST)->getContent().$request->getLocale(); }); $response = $app->handle(Request::create('/fr')); $this->assertEquals('fresfr', $response->getContent()); $app = new Application(); $app->register(new LocaleServiceProvider()); $app->get('/embed', function (Request $request) { return $request->getLocale(); }); $app->get('/{_locale}', function (Request $request) use ($app) { return $request->getLocale().$app->handle(Request::create('/embed'), HttpKernelInterface::SUB_REQUEST)->getContent().$request->getLocale(); }); $response = $app->handle(Request::create('/fr')); // locale in sub-request must be "en" as this is the value if the sub-request is converted to an ESI $this->assertEquals('frenfr', $response->getContent()); } public function testLocaleWithBefore() { $app = new Application(); $app->register(new LocaleServiceProvider()); $app->before(function (Request $request) use ($app) { $request->setLocale('fr'); }); $app->get('/embed', function (Request $request) { return $request->getLocale(); }); $app->get('/', function (Request $request) use ($app) { return $request->getLocale().$app->handle(Request::create('/embed'), HttpKernelInterface::SUB_REQUEST)->getContent().$request->getLocale(); }); $response = $app->handle(Request::create('/')); // locale in sub-request is "en" as the before filter is only executed for the main request $this->assertEquals('frenfr', $response->getContent()); } } src/Silex/tests/Silex/Tests/MiddlewareTest.php000066400000000000000000000217071516072260400217210ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; /** * Middleware test cases. * * @author Igor Wiedler */ class MiddlewareTest extends TestCase { public function testBeforeAndAfterFilter() { $i = 0; $test = $this; $app = new Application(); $app->before(function () use (&$i, $test) { $test->assertEquals(0, $i); ++$i; }); $app->match('/foo', function () use (&$i, $test) { $test->assertEquals(1, $i); ++$i; }); $app->after(function () use (&$i, $test) { $test->assertEquals(2, $i); ++$i; }); $request = Request::create('/foo'); $app->handle($request); $this->assertEquals(3, $i); } public function testAfterFilterWithResponseObject() { $i = 0; $app = new Application(); $app->match('/foo', function () use (&$i) { ++$i; return new Response('foo'); }); $app->after(function () use (&$i) { ++$i; }); $request = Request::create('/foo'); $app->handle($request); $this->assertEquals(2, $i); } public function testMultipleFilters() { $i = 0; $test = $this; $app = new Application(); $app->before(function () use (&$i, $test) { $test->assertEquals(0, $i); ++$i; }); $app->before(function () use (&$i, $test) { $test->assertEquals(1, $i); ++$i; }); $app->match('/foo', function () use (&$i, $test) { $test->assertEquals(2, $i); ++$i; }); $app->after(function () use (&$i, $test) { $test->assertEquals(3, $i); ++$i; }); $app->after(function () use (&$i, $test) { $test->assertEquals(4, $i); ++$i; }); $request = Request::create('/foo'); $app->handle($request); $this->assertEquals(5, $i); } public function testFiltersShouldFireOnException() { $i = 0; $app = new Application(); $app->before(function () use (&$i) { ++$i; }); $app->match('/foo', function () { throw new \RuntimeException(); }); $app->after(function () use (&$i) { ++$i; }); $app->error(function () { return 'error handled'; }); $request = Request::create('/foo'); $app->handle($request); $this->assertEquals(2, $i); } public function testFiltersShouldFireOnHttpException() { $i = 0; $app = new Application(); $app->before(function () use (&$i) { ++$i; }, Application::EARLY_EVENT); $app->after(function () use (&$i) { ++$i; }); $app->error(function () { return 'error handled'; }); $request = Request::create('/nowhere'); $app->handle($request); $this->assertEquals(2, $i); } public function testBeforeFilterPreventsBeforeMiddlewaresToBeExecuted() { $app = new Application(); $app->before(function () { return new Response('app before'); }); $app->get('/', function () { return new Response('test'); })->before(function () { return new Response('middleware before'); }); $this->assertEquals('app before', $app->handle(Request::create('/'))->getContent()); } public function testBeforeFilterExceptionsWhenHandlingAnException() { $app = new Application(); $app->before(function () { throw new \RuntimeException(''); }); // even if the before filter throws an exception, we must have the 404 $this->assertEquals(404, $app->handle(Request::create('/'))->getStatusCode()); } public function testRequestShouldBePopulatedOnBefore() { $app = new Application(); $app->before(function (Request $request) use ($app) { $app['project'] = $request->get('project'); }); $app->match('/foo/{project}', function () use ($app) { return $app['project']; }); $request = Request::create('/foo/bar'); $this->assertEquals('bar', $app->handle($request)->getContent()); $request = Request::create('/foo/baz'); $this->assertEquals('baz', $app->handle($request)->getContent()); } public function testBeforeFilterAccessesRequestAndCanReturnResponse() { $app = new Application(); $app->before(function (Request $request) { return new Response($request->get('name')); }); $app->match('/', function () use ($app) { throw new \Exception('Should never be executed'); }); $request = Request::create('/?name=Fabien'); $this->assertEquals('Fabien', $app->handle($request)->getContent()); } public function testAfterFilterAccessRequestResponse() { $app = new Application(); $app->after(function (Request $request, Response $response) { $response->setContent($response->getContent().'---'); }); $app->match('/', function () { return new Response('foo'); }); $request = Request::create('/'); $this->assertEquals('foo---', $app->handle($request)->getContent()); } public function testAfterFilterCanReturnResponse() { $app = new Application(); $app->after(function (Request $request, Response $response) { return new Response('bar'); }); $app->match('/', function () { return new Response('foo'); }); $request = Request::create('/'); $this->assertEquals('bar', $app->handle($request)->getContent()); } public function testRouteAndApplicationMiddlewareParameterInjection() { $app = new Application(); $test = $this; $middlewareTarget = []; $applicationBeforeMiddleware = function ($request, $app) use (&$middlewareTarget, $test) { $test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request); $test->assertInstanceOf('\Silex\Application', $app); $middlewareTarget[] = 'application_before_middleware_triggered'; }; $applicationAfterMiddleware = function ($request, $response, $app) use (&$middlewareTarget, $test) { $test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request); $test->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $response); $test->assertInstanceOf('\Silex\Application', $app); $middlewareTarget[] = 'application_after_middleware_triggered'; }; $applicationFinishMiddleware = function ($request, $response, $app) use (&$middlewareTarget, $test) { $test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request); $test->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $response); $test->assertInstanceOf('\Silex\Application', $app); $middlewareTarget[] = 'application_finish_middleware_triggered'; }; $routeBeforeMiddleware = function ($request, $app) use (&$middlewareTarget, $test) { $test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request); $test->assertInstanceOf('\Silex\Application', $app); $middlewareTarget[] = 'route_before_middleware_triggered'; }; $routeAfterMiddleware = function ($request, $response, $app) use (&$middlewareTarget, $test) { $test->assertInstanceOf('\Symfony\Component\HttpFoundation\Request', $request); $test->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $response); $test->assertInstanceOf('\Silex\Application', $app); $middlewareTarget[] = 'route_after_middleware_triggered'; }; $app->before($applicationBeforeMiddleware); $app->after($applicationAfterMiddleware); $app->finish($applicationFinishMiddleware); $app->match('/', function () { return new Response('foo'); }) ->before($routeBeforeMiddleware) ->after($routeAfterMiddleware); $request = Request::create('/'); $response = $app->handle($request); $app->terminate($request, $response); $this->assertSame(['application_before_middleware_triggered', 'route_before_middleware_triggered', 'route_after_middleware_triggered', 'application_after_middleware_triggered', 'application_finish_middleware_triggered'], $middlewareTarget); } } src/Silex/tests/Silex/Tests/Provider/000077500000000000000000000000001516072260400200565ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/Provider/AssetServiceProviderTest.php000066400000000000000000000030161516072260400255420ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\AssetServiceProvider; class AssetServiceProviderTest extends TestCase { public function testGenerateAssetUrl() { $app = new Application(); $app->register(new AssetServiceProvider(), [ 'assets.version' => 'v1', 'assets.version_format' => '%s?version=%s', 'assets.named_packages' => [ 'css' => ['version' => 'css2', 'base_path' => '/whatever-makes-sense'], 'images' => ['base_urls' => ['https://img.example.com']], ], ]); $this->assertEquals('/foo.png?version=v1', $app['assets.packages']->getUrl('/foo.png')); $this->assertEquals('/whatever-makes-sense/foo.css?css2', $app['assets.packages']->getUrl('foo.css', 'css')); $this->assertEquals('https://img.example.com/foo.png', $app['assets.packages']->getUrl('/foo.png', 'images')); } public function testJsonManifestVersionStrategy() { $app = new Application(); $app->register(new AssetServiceProvider(), [ 'assets.json_manifest_path' => __DIR__.'/../Fixtures/manifest.json', ]); $this->assertEquals('/some-random-hash.js', $app['assets.packages']->getUrl('app.js')); } } src/Silex/tests/Silex/Tests/Provider/DoctrineServiceProviderTest.php000066400000000000000000000073641516072260400262440ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Pimple\Container; use Silex\Application; use Silex\Provider\DoctrineServiceProvider; /** * DoctrineProvider test cases. * * Fabien Potencier */ class DoctrineServiceProviderTest extends TestCase { public function testOptionsInitializer() { $app = new Application(); $app->register(new DoctrineServiceProvider()); $this->assertEquals($app['db.default_options'], $app['db']->getParams()); } public function testSingleConnection() { if (!in_array('sqlite', \PDO::getAvailableDrivers())) { $this->markTestSkipped('pdo_sqlite is not available'); } $app = new Application(); $app->register(new DoctrineServiceProvider(), [ 'db.options' => ['driver' => 'pdo_sqlite', 'memory' => true], ]); $db = $app['db']; $params = $db->getParams(); $this->assertArrayHasKey('memory', $params); $this->assertTrue($params['memory']); $this->assertInstanceof('Doctrine\DBAL\Driver\PDOSqlite\Driver', $db->getDriver()); $this->assertEquals(22, $app['db']->fetchColumn('SELECT 22')); $this->assertSame($app['dbs']['default'], $db); } public function testMultipleConnections() { if (!in_array('sqlite', \PDO::getAvailableDrivers())) { $this->markTestSkipped('pdo_sqlite is not available'); } $app = new Application(); $app->register(new DoctrineServiceProvider(), [ 'dbs.options' => [ 'sqlite1' => ['driver' => 'pdo_sqlite', 'memory' => true], 'sqlite2' => ['driver' => 'pdo_sqlite', 'path' => sys_get_temp_dir().'/silex'], ], ]); $db = $app['db']; $params = $db->getParams(); $this->assertArrayHasKey('memory', $params); $this->assertTrue($params['memory']); $this->assertInstanceof('Doctrine\DBAL\Driver\PDOSqlite\Driver', $db->getDriver()); $this->assertEquals(22, $app['db']->fetchColumn('SELECT 22')); $this->assertSame($app['dbs']['sqlite1'], $db); $db2 = $app['dbs']['sqlite2']; $params = $db2->getParams(); $this->assertArrayHasKey('path', $params); $this->assertEquals(sys_get_temp_dir().'/silex', $params['path']); } public function testLoggerLoading() { if (!in_array('sqlite', \PDO::getAvailableDrivers())) { $this->markTestSkipped('pdo_sqlite is not available'); } $app = new Application(); $this->assertArrayHasKey('logger', $app); $this->assertNull($app['logger']); $app->register(new DoctrineServiceProvider(), [ 'dbs.options' => [ 'sqlite1' => ['driver' => 'pdo_sqlite', 'memory' => true], ], ]); $this->assertEquals(22, $app['db']->fetchColumn('SELECT 22')); $this->assertNull($app['db']->getConfiguration()->getSQLLogger()); } public function testLoggerNotLoaded() { if (!in_array('sqlite', \PDO::getAvailableDrivers())) { $this->markTestSkipped('pdo_sqlite is not available'); } $app = new Container(); $app->register(new DoctrineServiceProvider(), [ 'dbs.options' => [ 'sqlite1' => ['driver' => 'pdo_sqlite', 'memory' => true], ], ]); $this->assertEquals(22, $app['db']->fetchColumn('SELECT 22')); $this->assertNull($app['db']->getConfiguration()->getSQLLogger()); } } src/Silex/tests/Silex/Tests/Provider/FormServiceProviderTest.php000066400000000000000000000246451516072260400254010ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\FormServiceProvider; use Silex\Provider\CsrfServiceProvider; use Silex\Provider\SessionServiceProvider; use Silex\Provider\TranslationServiceProvider; use Silex\Provider\ValidatorServiceProvider; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractTypeExtension; use Symfony\Component\Form\FormTypeGuesserChain; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Translation\Exception\NotFoundResourceException; class FormServiceProviderTest extends TestCase { public function testFormFactoryServiceIsFormFactory() { $app = new Application(); $app->register(new FormServiceProvider()); $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']); } public function testFormRegistryServiceIsFormRegistry() { $app = new Application(); $app->register(new FormServiceProvider()); $this->assertInstanceOf('Symfony\Component\Form\FormRegistry', $app['form.registry']); } public function testFormServiceProviderWillLoadTypes() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.types', function ($extensions) { $extensions[] = new DummyFormType(); return $extensions; }); $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', []) ->add('dummy', 'Silex\Tests\Provider\DummyFormType') ->getForm(); $this->assertInstanceOf('Symfony\Component\Form\Form', $form); } public function testFormServiceProviderWillLoadTypesServices() { $app = new Application(); $app->register(new FormServiceProvider()); $app['dummy'] = function () { return new DummyFormType(); }; $app->extend('form.types', function ($extensions) { $extensions[] = 'dummy'; return $extensions; }); $form = $app['form.factory'] ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', []) ->add('dummy', 'dummy') ->getForm(); $this->assertInstanceOf('Symfony\Component\Form\Form', $form); } /** * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException * @expectedExceptionMessage Invalid form type. The silex service "dummy" does not exist. */ public function testNonExistentTypeService() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.types', function ($extensions) { $extensions[] = 'dummy'; return $extensions; }); $app['form.factory'] ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', []) ->add('dummy', 'dummy') ->getForm(); } public function testFormServiceProviderWillLoadTypeExtensions() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.type.extensions', function ($extensions) { $extensions[] = new DummyFormTypeExtension(); return $extensions; }); $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', []) ->add('file', 'Symfony\Component\Form\Extension\Core\Type\FileType', ['image_path' => 'webPath']) ->getForm(); $this->assertInstanceOf('Symfony\Component\Form\Form', $form); } public function testFormServiceProviderWillLoadTypeExtensionsServices() { $app = new Application(); $app->register(new FormServiceProvider()); $app['dummy.form.type.extension'] = function () { return new DummyFormTypeExtension(); }; $app->extend('form.type.extensions', function ($extensions) { $extensions[] = 'dummy.form.type.extension'; return $extensions; }); $form = $app['form.factory'] ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', []) ->add('file', 'Symfony\Component\Form\Extension\Core\Type\FileType', ['image_path' => 'webPath']) ->getForm(); $this->assertInstanceOf('Symfony\Component\Form\Form', $form); } /** * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException * @expectedExceptionMessage Invalid form type extension. The silex service "dummy.form.type.extension" does not exist. */ public function testNonExistentTypeExtensionService() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.type.extensions', function ($extensions) { $extensions[] = 'dummy.form.type.extension'; return $extensions; }); $app['form.factory'] ->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', []) ->add('dummy', 'dummy.form.type') ->getForm(); } public function testFormServiceProviderWillLoadTypeGuessers() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.type.guessers', function ($guessers) { $guessers[] = new FormTypeGuesserChain([]); return $guessers; }); $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']); } public function testFormServiceProviderWillLoadTypeGuessersServices() { $app = new Application(); $app->register(new FormServiceProvider()); $app['dummy.form.type.guesser'] = function () { return new FormTypeGuesserChain([]); }; $app->extend('form.type.guessers', function ($guessers) { $guessers[] = 'dummy.form.type.guesser'; return $guessers; }); $this->assertInstanceOf('Symfony\Component\Form\FormFactory', $app['form.factory']); } /** * @expectedException \Symfony\Component\Form\Exception\InvalidArgumentException * @expectedExceptionMessage Invalid form type guesser. The silex service "dummy.form.type.guesser" does not exist. */ public function testNonExistentTypeGuesserService() { $app = new Application(); $app->register(new FormServiceProvider()); $app->extend('form.type.guessers', function ($extensions) { $extensions[] = 'dummy.form.type.guesser'; return $extensions; }); $factory = $app['form.factory']; } public function testFormServiceProviderWillUseTranslatorIfAvailable() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new TranslationServiceProvider()); $app['translator.domains'] = [ 'messages' => [ 'de' => [ 'The CSRF token is invalid. Please try to resubmit the form.' => 'German translation', ], ], ]; $app['locale'] = 'de'; $app['csrf.token_manager'] = function () { return $this->getMockBuilder('Symfony\Component\Security\Csrf\CsrfTokenManagerInterface')->getMock(); }; $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', []) ->getForm(); $form->handleRequest($req = Request::create('/', 'POST', ['form' => [ '_token' => 'the wrong token', ]])); $this->assertFalse($form->isValid()); $r = new \ReflectionMethod($form, 'getErrors'); if (!$r->getNumberOfParameters()) { $this->assertContains('ERROR: German translation', $form->getErrorsAsString()); } else { // as of 2.5 $this->assertContains('ERROR: German translation', (string) $form->getErrors(true, false)); } } public function testFormServiceProviderWillNotAddNonexistentTranslationFiles() { $app = new Application([ 'locale' => 'nonexistent', ]); $app->register(new FormServiceProvider()); $app->register(new ValidatorServiceProvider()); $app->register(new TranslationServiceProvider(), [ 'locale_fallbacks' => [], ]); $app['form.factory']; $translator = $app['translator']; try { $translator->trans('test'); $this->addToAssertionCount(1); } catch (NotFoundResourceException $e) { $this->fail('Form factory should not add a translation resource that does not exist'); } } public function testFormCsrf() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new SessionServiceProvider()); $app->register(new CsrfServiceProvider()); $app['session.test'] = true; $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', [])->getForm(); $this->assertTrue(isset($form->createView()['_token'])); } public function testUserExtensionCanConfigureDefaultExtensions() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new SessionServiceProvider()); $app->register(new CsrfServiceProvider()); $app['session.test'] = true; $app->extend('form.type.extensions', function ($extensions) { $extensions[] = new FormServiceProviderTest\DisableCsrfExtension(); return $extensions; }); $form = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', [])->getForm(); $this->assertFalse($form->getConfig()->getOption('csrf_protection')); } } class DummyFormType extends AbstractType { } class DummyFormTypeExtension extends AbstractTypeExtension { public function getExtendedType() { return 'Symfony\Component\Form\Extension\Core\Type\FileType'; } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefined(['image_path']); } } src/Silex/tests/Silex/Tests/Provider/FormServiceProviderTest/000077500000000000000000000000001516072260400246555ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/Provider/FormServiceProviderTest/DisableCsrfExtension.php000066400000000000000000000010241516072260400314410ustar00rootroot00000000000000setDefaults([ 'csrf_protection' => false, ]); } public function getExtendedType() { return FormType::class; } } src/Silex/tests/Silex/Tests/Provider/HttpCacheServiceProviderTest.php000066400000000000000000000036011516072260400263260ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\HttpCacheServiceProvider; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; /** * HttpCacheProvider test cases. * * @author Igor Wiedler */ class HttpCacheServiceProviderTest extends TestCase { public function testRegister() { $app = new Application(); $app->register(new HttpCacheServiceProvider(), [ 'http_cache.cache_dir' => sys_get_temp_dir().'/silex_http_cache_'.uniqid(), ]); $this->assertInstanceOf('Silex\Provider\HttpCache\HttpCache', $app['http_cache']); return $app; } /** * @depends testRegister */ public function testRunCallsShutdown($app) { $finished = false; $app->finish(function () use (&$finished) { $finished = true; }); $app->get('/', function () use ($app) { return new UnsendableResponse('will do something after finish'); }); $request = Request::create('/'); $app['http_cache']->run($request); $this->assertTrue($finished); } public function testDebugDefaultsToThatOfApp() { $app = new Application(); $app->register(new HttpCacheServiceProvider(), [ 'http_cache.cache_dir' => sys_get_temp_dir().'/silex_http_cache_'.uniqid(), ]); $app['debug'] = true; $app['http_cache']; $this->assertTrue($app['http_cache.options']['debug']); } } class UnsendableResponse extends Response { public function send() { // do nothing } } src/Silex/tests/Silex/Tests/Provider/HttpFragmentServiceProviderTest.php000066400000000000000000000027311516072260400270710ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\HttpCacheServiceProvider; use Silex\Provider\HttpFragmentServiceProvider; use Silex\Provider\TwigServiceProvider; use Symfony\Component\HttpFoundation\Request; class HttpFragmentServiceProviderTest extends TestCase { public function testRenderFunction() { $app = new Application(); unset($app['exception_handler']); $app->register(new HttpFragmentServiceProvider()); $app->register(new HttpCacheServiceProvider(), ['http_cache.cache_dir' => sys_get_temp_dir()]); $app->register(new TwigServiceProvider(), [ 'twig.templates' => [ 'hello' => '{{ render("/foo") }}{{ render_esi("/foo") }}{{ render_hinclude("/foo") }}', 'foo' => 'foo', ], ]); $app->get('/hello', function () use ($app) { return $app['twig']->render('hello'); }); $app->get('/foo', function () use ($app) { return $app['twig']->render('foo'); }); $response = $app['http_cache']->handle(Request::create('/hello')); $this->assertEquals('foofoo', $response->getContent()); } } src/Silex/tests/Silex/Tests/Provider/MonologServiceProviderTest.php000066400000000000000000000165661516072260400261130ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Monolog\Formatter\JsonFormatter; use Monolog\Handler\TestHandler; use Monolog\Logger; use Silex\Application; use Silex\Provider\MonologServiceProvider; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * MonologProvider test cases. * * @author Igor Wiedler */ class MonologServiceProviderTest extends TestCase { private $currErrorHandler; protected function setUp() { $this->currErrorHandler = set_error_handler('var_dump'); restore_error_handler(); } protected function tearDown() { set_error_handler($this->currErrorHandler); } public function testRequestLogging() { $app = $this->getApplication(); $app->get('/foo', function () use ($app) { return 'foo'; }); $this->assertFalse($app['monolog.handler']->hasInfoRecords()); $request = Request::create('/foo'); $app->handle($request); $this->assertTrue($app['monolog.handler']->hasDebug('> GET /foo')); $this->assertTrue($app['monolog.handler']->hasDebug('< 200')); $records = $app['monolog.handler']->getRecords(); $this->assertContains('Matched route "{route}".', $records[0]['message']); $this->assertSame('GET_foo', $records[0]['context']['route']); } public function testManualLogging() { $app = $this->getApplication(); $app->get('/log', function () use ($app) { $app['monolog']->addDebug('logging a message'); }); $this->assertFalse($app['monolog.handler']->hasDebugRecords()); $request = Request::create('/log'); $app->handle($request); $this->assertTrue($app['monolog.handler']->hasDebug('logging a message')); } public function testOverrideFormatter() { $app = new Application(); $app->register(new MonologServiceProvider(), [ 'monolog.formatter' => new JsonFormatter(), 'monolog.logfile' => 'php://memory', ]); $this->assertInstanceOf('Monolog\Formatter\JsonFormatter', $app['monolog.handler']->getFormatter()); } public function testErrorLogging() { $app = $this->getApplication(); $app->error(function (\Exception $e) { return 'error handled'; }); /* * Simulate 404, logged to error level */ $this->assertFalse($app['monolog.handler']->hasErrorRecords()); $request = Request::create('/error'); $app->handle($request); $pattern = "#Symfony\\\\Component\\\\HttpKernel\\\\Exception\\\\NotFoundHttpException: No route found for \"GET /error\" \(uncaught exception\) at .* line \d+#"; $this->assertMatchingRecord($pattern, Logger::ERROR, $app['monolog.handler']); /* * Simulate unhandled exception, logged to critical */ $app->get('/error', function () { throw new \RuntimeException('very bad error'); }); $this->assertFalse($app['monolog.handler']->hasCriticalRecords()); $request = Request::create('/error'); $app->handle($request); $pattern = "#RuntimeException: very bad error \(uncaught exception\) at .* line \d+#"; $this->assertMatchingRecord($pattern, Logger::CRITICAL, $app['monolog.handler']); } public function testRedirectLogging() { $app = $this->getApplication(); $app->get('/foo', function () use ($app) { return new RedirectResponse('/bar', 302); }); $this->assertFalse($app['monolog.handler']->hasInfoRecords()); $request = Request::create('/foo'); $app->handle($request); $this->assertTrue($app['monolog.handler']->hasDebug('< 302 /bar')); } public function testErrorLoggingGivesWayToSecurityExceptionHandling() { $app = $this->getApplication(); $app['monolog.level'] = Logger::ERROR; $app->register(new \Silex\Provider\SecurityServiceProvider(), [ 'security.firewalls' => [ 'admin' => [ 'pattern' => '^/admin', 'http' => true, 'users' => [], ], ], ]); $app->get('/admin', function () { return 'SECURE!'; }); $request = Request::create('/admin'); $app->run($request); $this->assertEmpty($app['monolog.handler']->getRecords(), 'Expected no logging to occur'); } public function testStringErrorLevel() { $app = $this->getApplication(); $app['monolog.level'] = 'info'; $this->assertSame(Logger::INFO, $app['monolog.handler']->getLevel()); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage Provided logging level 'foo' does not exist. Must be a valid monolog logging level. */ public function testNonExistentStringErrorLevel() { $app = $this->getApplication(); $app['monolog.level'] = 'foo'; $app['monolog.handler']->getLevel(); } public function testDisableListener() { $app = $this->getApplication(); unset($app['monolog.listener']); $app->handle(Request::create('/404')); $this->assertEmpty($app['monolog.handler']->getRecords(), 'Expected no logging to occur'); } public function testExceptionFiltering() { $app = new Application(); $app->get('/foo', function () use ($app) { throw new NotFoundHttpException(); }); $level = Logger::ERROR; $app->register(new MonologServiceProvider(), [ 'monolog.exception.logger_filter' => $app->protect(function () { return Logger::DEBUG; }), 'monolog.handler' => function () use ($app) { return new TestHandler($app['monolog.level']); }, 'monolog.level' => $level, 'monolog.logfile' => 'php://memory', ]); $request = Request::create('/foo'); $app->handle($request); $this->assertCount(0, $app['monolog.handler']->getRecords(), 'Expected no logging to occur'); } protected function assertMatchingRecord($pattern, $level, TestHandler $handler) { $found = false; $records = $handler->getRecords(); foreach ($records as $record) { if (preg_match($pattern, $record['message']) && $record['level'] == $level) { $found = true; continue; } } $this->assertTrue($found, "Trying to find record matching $pattern with level $level"); } protected function getApplication() { $app = new Application(); $app->register(new MonologServiceProvider(), [ 'monolog.handler' => function () use ($app) { $level = MonologServiceProvider::translateLevel($app['monolog.level']); return new TestHandler($level); }, 'monolog.logfile' => 'php://memory', ]); return $app; } } src/Silex/tests/Silex/Tests/Provider/RememberMeServiceProviderTest.php000066400000000000000000000066751516072260400265210ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use Silex\Application; use Silex\WebTestCase; use Silex\Provider\RememberMeServiceProvider; use Silex\Provider\SecurityServiceProvider; use Silex\Provider\SessionServiceProvider; use Symfony\Component\HttpKernel\Client; use Symfony\Component\Security\Http\SecurityEvents; /** * SecurityServiceProvider. * * @author Fabien Potencier */ class RememberMeServiceProviderTest extends WebTestCase { public function testRememberMeAuthentication() { $app = $this->createApplication(); $interactiveLogin = new InteractiveLoginTriggered(); $app->on(SecurityEvents::INTERACTIVE_LOGIN, [$interactiveLogin, 'onInteractiveLogin']); $client = new Client($app); $client->request('get', '/'); $this->assertFalse($interactiveLogin->triggered, 'The interactive login has not been triggered yet'); $client->request('post', '/login_check', ['_username' => 'fabien', '_password' => 'foo', '_remember_me' => 'true']); $client->followRedirect(); $this->assertEquals('AUTHENTICATED_FULLY', $client->getResponse()->getContent()); $this->assertTrue($interactiveLogin->triggered, 'The interactive login has been triggered'); $this->assertNotNull($client->getCookiejar()->get('REMEMBERME'), 'The REMEMBERME cookie is set'); $event = false; $client->getCookiejar()->expire('MOCKSESSID'); $client->request('get', '/'); $this->assertEquals('AUTHENTICATED_REMEMBERED', $client->getResponse()->getContent()); $this->assertTrue($interactiveLogin->triggered, 'The interactive login has been triggered'); $client->request('get', '/logout'); $client->followRedirect(); $this->assertNull($client->getCookiejar()->get('REMEMBERME'), 'The REMEMBERME cookie has been removed'); } public function createApplication($authenticationMethod = 'form') { $app = new Application(); $app['debug'] = true; unset($app['exception_handler']); $app->register(new SessionServiceProvider(), [ 'session.test' => true, ]); $app->register(new SecurityServiceProvider()); $app->register(new RememberMeServiceProvider()); $app['security.firewalls'] = [ 'http-auth' => [ 'pattern' => '^.*$', 'form' => true, 'remember_me' => [], 'logout' => true, 'users' => [ 'fabien' => ['ROLE_USER', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], ], ], ]; $app->get('/', function () use ($app) { if ($app['security.authorization_checker']->isGranted('IS_AUTHENTICATED_FULLY')) { return 'AUTHENTICATED_FULLY'; } elseif ($app['security.authorization_checker']->isGranted('IS_AUTHENTICATED_REMEMBERED')) { return 'AUTHENTICATED_REMEMBERED'; } else { return 'AUTHENTICATED_ANONYMOUSLY'; } }); return $app; } } class InteractiveLoginTriggered { public $triggered = false; public function onInteractiveLogin() { $this->triggered = true; } } src/Silex/tests/Silex/Tests/Provider/RoutingServiceProviderTest.php000066400000000000000000000065221516072260400261170ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Pimple\Container; use Silex\Application; use Silex\Provider\RoutingServiceProvider; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; /** * RoutingProvider test cases. * * @author Igor Wiedler */ class RoutingServiceProviderTest extends TestCase { public function testRegister() { $app = new Application(); $app->get('/hello/{name}', function ($name) {}) ->bind('hello'); $app->get('/', function () {}); $request = Request::create('/'); $app->handle($request); $this->assertInstanceOf('Symfony\Component\Routing\Generator\UrlGenerator', $app['url_generator']); } public function testUrlGeneration() { $app = new Application(); $app->get('/hello/{name}', function ($name) {}) ->bind('hello'); $app->get('/', function () use ($app) { return $app['url_generator']->generate('hello', ['name' => 'john']); }); $request = Request::create('/'); $response = $app->handle($request); $this->assertEquals('/hello/john', $response->getContent()); } public function testAbsoluteUrlGeneration() { $app = new Application(); $app->get('/hello/{name}', function ($name) {}) ->bind('hello'); $app->get('/', function () use ($app) { return $app['url_generator']->generate('hello', ['name' => 'john'], UrlGeneratorInterface::ABSOLUTE_URL); }); $request = Request::create('https://localhost:81/'); $response = $app->handle($request); $this->assertEquals('https://localhost:81/hello/john', $response->getContent()); } public function testUrlGenerationWithHttp() { $app = new Application(); $app->get('/insecure', function () {}) ->bind('insecure_page') ->requireHttp(); $app->get('/', function () use ($app) { return $app['url_generator']->generate('insecure_page'); }); $request = Request::create('https://localhost/'); $response = $app->handle($request); $this->assertEquals('http://localhost/insecure', $response->getContent()); } public function testUrlGenerationWithHttps() { $app = new Application(); $app->get('/secure', function () {}) ->bind('secure_page') ->requireHttps(); $app->get('/', function () use ($app) { return $app['url_generator']->generate('secure_page'); }); $request = Request::create('http://localhost/'); $response = $app->handle($request); $this->assertEquals('https://localhost/secure', $response->getContent()); } public function testControllersFactory() { $app = new Container(); $app->register(new RoutingServiceProvider()); $coll = $app['controllers_factory']; $coll->mount('/blog', function ($blog) { $this->assertInstanceOf('Silex\ControllerCollection', $blog); }); } } src/Silex/tests/Silex/Tests/Provider/SecurityServiceProviderTest.php000066400000000000000000000451061516072260400263000ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use Silex\Application; use Silex\WebTestCase; use Silex\Provider\SecurityServiceProvider; use Silex\Provider\SessionServiceProvider; use Silex\Provider\ValidatorServiceProvider; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\HttpKernel\Client; use Symfony\Component\HttpFoundation\Request; /** * SecurityServiceProvider. * * @author Fabien Potencier */ class SecurityServiceProviderTest extends WebTestCase { /** * @expectedException \LogicException */ public function testWrongAuthenticationType() { $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'wrong' => [ 'foobar' => true, 'users' => [], ], ], ]); $app->get('/', function () {}); $app->handle(Request::create('/')); } public function testFormAuthentication() { $app = $this->createApplication('form'); $client = new Client($app); $client->request('get', '/'); $this->assertEquals('ANONYMOUS', $client->getResponse()->getContent()); $client->request('post', '/login_check', ['_username' => 'fabien', '_password' => 'bar']); $this->assertContains('Bad credentials', $app['security.last_error']($client->getRequest())); // hack to re-close the session as the previous assertions re-opens it $client->getRequest()->getSession()->save(); $client->request('post', '/login_check', ['_username' => 'fabien', '_password' => 'foo']); $this->assertEquals('', $app['security.last_error']($client->getRequest())); $client->getRequest()->getSession()->save(); $this->assertEquals(302, $client->getResponse()->getStatusCode()); $this->assertEquals('http://localhost/', $client->getResponse()->getTargetUrl()); $client->request('get', '/'); $this->assertEquals('fabienAUTHENTICATED', $client->getResponse()->getContent()); $client->request('get', '/admin'); $this->assertEquals(403, $client->getResponse()->getStatusCode()); $client->request('get', '/logout'); $this->assertEquals(302, $client->getResponse()->getStatusCode()); $this->assertEquals('http://localhost/', $client->getResponse()->getTargetUrl()); $client->request('get', '/'); $this->assertEquals('ANONYMOUS', $client->getResponse()->getContent()); $client->request('get', '/admin'); $this->assertEquals(302, $client->getResponse()->getStatusCode()); $this->assertEquals('http://localhost/login', $client->getResponse()->getTargetUrl()); $client->request('post', '/login_check', ['_username' => 'admin', '_password' => 'foo']); $this->assertEquals('', $app['security.last_error']($client->getRequest())); $client->getRequest()->getSession()->save(); $this->assertEquals(302, $client->getResponse()->getStatusCode()); $this->assertEquals('http://localhost/admin', $client->getResponse()->getTargetUrl()); $client->request('get', '/'); $this->assertEquals('adminAUTHENTICATEDADMIN', $client->getResponse()->getContent()); $client->request('get', '/admin'); $this->assertEquals('admin', $client->getResponse()->getContent()); } public function testHttpAuthentication() { $app = $this->createApplication('http'); $client = new Client($app); $client->request('get', '/'); $this->assertEquals(401, $client->getResponse()->getStatusCode()); $this->assertEquals('Basic realm="Secured"', $client->getResponse()->headers->get('www-authenticate')); $client->request('get', '/', [], [], ['PHP_AUTH_USER' => 'dennis', 'PHP_AUTH_PW' => 'foo']); $this->assertEquals('dennisAUTHENTICATED', $client->getResponse()->getContent()); $client->request('get', '/admin'); $this->assertEquals(403, $client->getResponse()->getStatusCode()); $client->restart(); $client->request('get', '/'); $this->assertEquals(401, $client->getResponse()->getStatusCode()); $this->assertEquals('Basic realm="Secured"', $client->getResponse()->headers->get('www-authenticate')); $client->request('get', '/', [], [], ['PHP_AUTH_USER' => 'admin', 'PHP_AUTH_PW' => 'foo']); $this->assertEquals('adminAUTHENTICATEDADMIN', $client->getResponse()->getContent()); $client->request('get', '/admin'); $this->assertEquals('admin', $client->getResponse()->getContent()); } public function testGuardAuthentication() { $app = $this->createApplication('guard'); $client = new Client($app); $client->request('get', '/'); $this->assertEquals(401, $client->getResponse()->getStatusCode(), 'The entry point is configured'); $this->assertEquals('{"message":"Authentication Required"}', $client->getResponse()->getContent()); $client->request('get', '/', [], [], ['HTTP_X_AUTH_TOKEN' => 'lili:not the secret']); $this->assertEquals(403, $client->getResponse()->getStatusCode(), 'User not found'); $this->assertEquals('{"message":"Username could not be found."}', $client->getResponse()->getContent()); $client->request('get', '/', [], [], ['HTTP_X_AUTH_TOKEN' => 'victoria:not the secret']); $this->assertEquals(403, $client->getResponse()->getStatusCode(), 'Invalid credentials'); $this->assertEquals('{"message":"Invalid credentials."}', $client->getResponse()->getContent()); $client->request('get', '/', [], [], ['HTTP_X_AUTH_TOKEN' => 'victoria:victoriasecret']); $this->assertEquals('victoria', $client->getResponse()->getContent()); } public function testUserPasswordValidatorIsRegistered() { $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'admin' => [ 'pattern' => '^/admin', 'http' => true, 'users' => [ 'admin' => ['ROLE_ADMIN', '513aeb0121909'], ], ], ], ]); $app->register(new ValidatorServiceProvider()); $app->boot(); $this->assertInstanceOf('Symfony\Component\Security\Core\Validator\Constraints\UserPasswordValidator', $app['security.validator.user_password_validator']); } public function testExposedExceptions() { $app = $this->createApplication('form'); $app['security.hide_user_not_found'] = false; $client = new Client($app); $client->request('get', '/'); $this->assertEquals('ANONYMOUS', $client->getResponse()->getContent()); $client->request('post', '/login_check', ['_username' => 'fabien', '_password' => 'bar']); $this->assertEquals('The presented password is invalid.', $app['security.last_error']($client->getRequest())); $client->getRequest()->getSession()->save(); $client->request('post', '/login_check', ['_username' => 'unknown', '_password' => 'bar']); $this->assertEquals('Username "unknown" does not exist.', $app['security.last_error']($client->getRequest())); $client->getRequest()->getSession()->save(); $client->request('post', '/login_check', ['_username' => 'unknown', '_password' => 'bar']); $app['request_stack']->push($client->getRequest()); $authenticationException = $app['security.authentication_utils']->getLastAuthenticationError(); $this->assertInstanceOf(AuthenticationException::class, $authenticationException); $this->assertEquals('Username "unknown" does not exist.', $authenticationException->getMessage()); $client->getRequest()->getSession()->save(); } public function testFakeRoutesAreSerializable() { $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'admin' => [ 'logout' => true, ], ], ]); $app->boot(); $app->flush(); $this->assertCount(1, unserialize(serialize($app['routes']))); } public function testFirewallWithMethod() { $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ 'pattern' => '/', 'http' => true, 'methods' => ['POST'], ], ], ]); $app->match('/', function () { return 'foo'; }) ->method('POST|GET'); $request = Request::create('/', 'GET'); $response = $app->handle($request); $this->assertEquals(200, $response->getStatusCode()); $request = Request::create('/', 'POST'); $response = $app->handle($request); $this->assertEquals(401, $response->getStatusCode()); } public function testFirewallWithHost() { $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ 'pattern' => '/', 'http' => true, 'hosts' => 'localhost2', ], ], ]); $app->get('/', function () { return 'foo'; }) ->host('localhost2'); $app->get('/', function () { return 'foo'; }) ->host('localhost1'); $request = Request::create('http://localhost2/'); $response = $app->handle($request); $this->assertEquals(401, $response->getStatusCode()); $request = Request::create('http://localhost1/'); $response = $app->handle($request); $this->assertEquals(200, $response->getStatusCode()); } public function testUser() { $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ 'http' => true, 'users' => [ 'fabien' => ['ROLE_ADMIN', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], ], ], ], ]); $app->get('/', function () { return 'foo'; }); $request = Request::create('/'); $app->handle($request); $this->assertNull($app['user']); $request->headers->set('PHP_AUTH_USER', 'fabien'); $request->headers->set('PHP_AUTH_PW', 'foo'); $app->handle($request); $this->assertInstanceOf('Symfony\Component\Security\Core\User\UserInterface', $app['user']); $this->assertEquals('fabien', $app['user']->getUsername()); } public function testUserAsServiceString() { $users = [ 'fabien' => ['ROLE_ADMIN', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], ]; $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ 'http' => true, 'users' => 'my_user_provider', ], ], ]); $app['my_user_provider'] = $app['security.user_provider.inmemory._proto']($users); $app->get('/', function () { return 'foo'; }); $request = Request::create('/'); $app->handle($request); $this->assertNull($app['user']); $this->assertSame($app['my_user_provider'], $app['security.user_provider.default']); $request->headers->set('PHP_AUTH_USER', 'fabien'); $request->headers->set('PHP_AUTH_PW', 'foo'); $app->handle($request); $this->assertInstanceOf('Symfony\Component\Security\Core\User\UserInterface', $app['user']); $this->assertEquals('fabien', $app['user']->getUsername()); } public function testUserWithNoToken() { $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ 'http' => true, ], ], ]); $request = Request::create('/'); $app->get('/', function () { return 'foo'; }); $app->handle($request); $this->assertNull($app['user']); } public function testUserWithInvalidUser() { $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ 'http' => true, ], ], ]); $request = Request::create('/'); $app->boot(); $app['security.token_storage']->setToken(new UsernamePasswordToken('foo', 'foo', 'foo')); $app->get('/', function () { return 'foo'; }); $app->handle($request); $this->assertNull($app['user']); } public function testAccessRulePathArray() { $app = new Application(); $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ 'http' => true, ], ], 'security.access_rules' => [ [[ 'path' => '^/admin', ], 'ROLE_ADMIN'], ], ]); $request = Request::create('/admin'); $app->boot(); $accessMap = $app['security.access_map']; $this->assertEquals($accessMap->getPatterns($request), [ ['ROLE_ADMIN'], '', ]); } public function createApplication($authenticationMethod = 'form') { $app = new Application(); $app->register(new SessionServiceProvider()); $app = call_user_func([$this, 'add'.ucfirst($authenticationMethod).'Authentication'], $app); $app['session.test'] = true; return $app; } private function addFormAuthentication($app) { $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'login' => [ 'pattern' => '^/login$', ], 'default' => [ 'pattern' => '^.*$', 'anonymous' => true, 'form' => [ 'require_previous_session' => false, ], 'logout' => true, 'users' => [ // password is foo 'fabien' => ['ROLE_USER', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], 'admin' => ['ROLE_ADMIN', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], ], ], ], 'security.access_rules' => [ ['^/admin', 'ROLE_ADMIN'], ], 'security.role_hierarchy' => [ 'ROLE_ADMIN' => ['ROLE_USER'], ], ]); $app->get('/login', function (Request $request) use ($app) { $app['session']->start(); return $app['security.last_error']($request); }); $app->get('/', function () use ($app) { $user = $app['security.token_storage']->getToken()->getUser(); $content = is_object($user) ? $user->getUsername() : 'ANONYMOUS'; if ($app['security.authorization_checker']->isGranted('IS_AUTHENTICATED_FULLY')) { $content .= 'AUTHENTICATED'; } if ($app['security.authorization_checker']->isGranted('ROLE_ADMIN')) { $content .= 'ADMIN'; } return $content; }); $app->get('/admin', function () use ($app) { return 'admin'; }); return $app; } private function addHttpAuthentication($app) { $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'http-auth' => [ 'pattern' => '^.*$', 'http' => true, 'users' => [ // password is foo 'dennis' => ['ROLE_USER', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], 'admin' => ['ROLE_ADMIN', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], ], ], ], 'security.access_rules' => [ ['^/admin', 'ROLE_ADMIN'], ], 'security.role_hierarchy' => [ 'ROLE_ADMIN' => ['ROLE_USER'], ], ]); $app->get('/', function () use ($app) { $user = $app['security.token_storage']->getToken()->getUser(); $content = is_object($user) ? $user->getUsername() : 'ANONYMOUS'; if ($app['security.authorization_checker']->isGranted('IS_AUTHENTICATED_FULLY')) { $content .= 'AUTHENTICATED'; } if ($app['security.authorization_checker']->isGranted('ROLE_ADMIN')) { $content .= 'ADMIN'; } return $content; }); $app->get('/admin', function () use ($app) { return 'admin'; }); return $app; } private function addGuardAuthentication($app) { $app['app.authenticator.token'] = function ($app) { return new SecurityServiceProviderTest\TokenAuthenticator($app); }; $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'guard' => [ 'pattern' => '^.*$', 'form' => true, 'guard' => [ 'authenticators' => [ 'app.authenticator.token', ], ], 'users' => [ 'victoria' => ['ROLE_USER', 'victoriasecret'], ], ], ], ]); $app->get('/', function () use ($app) { $user = $app['security.token_storage']->getToken()->getUser(); $content = is_object($user) ? $user->getUsername() : 'ANONYMOUS'; return $content; })->bind('homepage'); return $app; } } src/Silex/tests/Silex/Tests/Provider/SecurityServiceProviderTest/000077500000000000000000000000001516072260400255615ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/Provider/SecurityServiceProviderTest/TokenAuthenticator.php000066400000000000000000000045441516072260400321140ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider\SecurityServiceProviderTest; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Guard\AbstractGuardAuthenticator; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Exception\AuthenticationException; /** * This class is used to test "guard" authentication with the SecurityServiceProvider. */ class TokenAuthenticator extends AbstractGuardAuthenticator { public function getCredentials(Request $request) { if (!$token = $request->headers->get('X-AUTH-TOKEN')) { return false; } list($username, $secret) = explode(':', $token); return [ 'username' => $username, 'secret' => $secret, ]; } public function supports(Request $request) { return !empty($request->headers->get('X-AUTH-TOKEN')); } public function getUser($credentials, UserProviderInterface $userProvider) { return $userProvider->loadUserByUsername($credentials['username']); } public function checkCredentials($credentials, UserInterface $user) { // This is not a safe way of validating a password. return $user->getPassword() === $credentials['secret']; } public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) { return; } public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { $data = [ 'message' => strtr($exception->getMessageKey(), $exception->getMessageData()), ]; return new JsonResponse($data, 403); } public function start(Request $request, AuthenticationException $authException = null) { $data = [ 'message' => 'Authentication Required', ]; return new JsonResponse($data, 401); } public function supportsRememberMe() { return false; } } src/Silex/tests/Silex/Tests/Provider/SerializerServiceProviderTest.php000066400000000000000000000020221516072260400265700ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\SerializerServiceProvider; /** * SerializerServiceProvider test cases. * * @author Fabien Potencier */ class SerializerServiceProviderTest extends TestCase { public function testRegister() { $app = new Application(); $app->register(new SerializerServiceProvider()); $this->assertInstanceOf("Symfony\Component\Serializer\Serializer", $app['serializer']); $this->assertTrue($app['serializer']->supportsEncoding('xml')); $this->assertTrue($app['serializer']->supportsEncoding('json')); $this->assertTrue($app['serializer']->supportsDecoding('xml')); $this->assertTrue($app['serializer']->supportsDecoding('json')); } } src/Silex/tests/Silex/Tests/Provider/SessionServiceProviderTest.php000066400000000000000000000064521516072260400261150ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use Silex\Application; use Silex\WebTestCase; use Silex\Provider\SessionServiceProvider; use Symfony\Component\HttpKernel\Client; use Symfony\Component\HttpFoundation\Session; /** * SessionProvider test cases. * * @author Igor Wiedler * @author Fabien Potencier */ class SessionServiceProviderTest extends WebTestCase { public function testRegister() { $client = $this->createClient(); $client->request('get', '/login'); $this->assertEquals('Logged in successfully.', $client->getResponse()->getContent()); $client->request('get', '/account'); $this->assertEquals('This is your account.', $client->getResponse()->getContent()); $client->request('get', '/logout'); $this->assertEquals('Logged out successfully.', $client->getResponse()->getContent()); $client->request('get', '/account'); $this->assertEquals('You are not logged in.', $client->getResponse()->getContent()); } public function createApplication() { $app = new Application(); $app->register(new SessionServiceProvider(), [ 'session.test' => true, ]); $app->get('/login', function () use ($app) { $app['session']->set('logged_in', true); return 'Logged in successfully.'; }); $app->get('/account', function () use ($app) { if (!$app['session']->get('logged_in')) { return 'You are not logged in.'; } return 'This is your account.'; }); $app->get('/logout', function () use ($app) { $app['session']->invalidate(); return 'Logged out successfully.'; }); return $app; } public function testWithRoutesThatDoesNotUseSession() { $app = new Application(); $app->register(new SessionServiceProvider(), [ 'session.test' => true, ]); $app->get('/', function () { return 'A welcome page.'; }); $app->get('/robots.txt', function () { return 'Informations for robots.'; }); $app['debug'] = true; unset($app['exception_handler']); $client = new Client($app); $client->request('get', '/'); $this->assertEquals('A welcome page.', $client->getResponse()->getContent()); $client->request('get', '/robots.txt'); $this->assertEquals('Informations for robots.', $client->getResponse()->getContent()); } public function testSessionRegister() { $app = new Application(); $attrs = new Session\Attribute\AttributeBag(); $flash = new Session\Flash\FlashBag(); $app->register(new SessionServiceProvider(), [ 'session.attribute_bag' => $attrs, 'session.flash_bag' => $flash, 'session.test' => true, ]); $session = $app['session']; $this->assertSame($flash, $session->getBag('flashes')); $this->assertSame($attrs, $session->getBag('attributes')); } } src/Silex/tests/Silex/Tests/Provider/SpoolStub.php000066400000000000000000000015741516072260400225300ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; class SpoolStub implements \Swift_Spool { private $messages = []; public $hasFlushed = false; public function getMessages() { return $this->messages; } public function start() { } public function stop() { } public function isStarted() { return count($this->messages) > 0; } public function queueMessage(\Swift_Mime_Message $message) { $this->messages[] = clone $message; } public function flushQueue(\Swift_Transport $transport, &$failedRecipients = null) { $this->hasFlushed = true; $this->messages = []; } } src/Silex/tests/Silex/Tests/Provider/SwiftmailerServiceProviderTest.php000066400000000000000000000075161516072260400267620ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\SwiftmailerServiceProvider; use Symfony\Component\HttpFoundation\Request; class SwiftmailerServiceProviderTest extends TestCase { public function testSwiftMailerServiceIsSwiftMailer() { $app = new Application(); $app->register(new SwiftmailerServiceProvider()); $app->boot(); $this->assertInstanceOf('Swift_Mailer', $app['mailer']); } public function testSwiftMailerIgnoresSpoolIfDisabled() { $app = new Application(); $app->register(new SwiftmailerServiceProvider()); $app->boot(); $app['swiftmailer.use_spool'] = false; $app['swiftmailer.spooltransport'] = function () { throw new \Exception('Should not be instantiated'); }; $this->assertInstanceOf('Swift_Mailer', $app['mailer']); } public function testSwiftMailerSendsMailsOnFinish() { $app = new Application(); $app->register(new SwiftmailerServiceProvider()); $app->boot(); $app['swiftmailer.spool'] = function () { return new SpoolStub(); }; $app->get('/', function () use ($app) { $app['mailer']->send(\Swift_Message::newInstance()); }); $this->assertCount(0, $app['swiftmailer.spool']->getMessages()); $request = Request::create('/'); $response = $app->handle($request); $this->assertCount(1, $app['swiftmailer.spool']->getMessages()); $app->terminate($request, $response); $this->assertTrue($app['swiftmailer.spool']->hasFlushed); $this->assertCount(0, $app['swiftmailer.spool']->getMessages()); } public function testSwiftMailerAvoidsFlushesIfMailerIsUnused() { $app = new Application(); $app->register(new SwiftmailerServiceProvider()); $app->boot(); $app['swiftmailer.spool'] = function () { return new SpoolStub(); }; $app->get('/', function () use ($app) { }); $request = Request::create('/'); $response = $app->handle($request); $this->assertCount(0, $app['swiftmailer.spool']->getMessages()); $app->terminate($request, $response); $this->assertFalse($app['swiftmailer.spool']->hasFlushed); } public function testSwiftMailerSenderAddress() { $app = new Application(); $app->register(new SwiftmailerServiceProvider()); $app->boot(); $app['swiftmailer.spool'] = function () { return new SpoolStub(); }; $app['swiftmailer.sender_address'] = 'foo@example.com'; $app['mailer']->send(\Swift_Message::newInstance()); $messages = $app['swiftmailer.spool']->getMessages(); $this->assertCount(1, $messages); list($message) = $messages; $this->assertEquals('foo@example.com', $message->getReturnPath()); } public function testSwiftMailerPlugins() { $plugin = $this->getMockBuilder('Swift_Events_TransportChangeListener')->getMock(); $plugin->expects($this->once())->method('beforeTransportStarted'); $app = new Application(); $app->boot(); $app->register(new SwiftmailerServiceProvider()); $app['swiftmailer.plugins'] = function ($app) use ($plugin) { return [$plugin]; }; $dispatcher = $app['swiftmailer.transport.eventdispatcher']; $event = $dispatcher->createTransportChangeEvent(new \Swift_Transport_NullTransport($dispatcher)); $dispatcher->dispatchEvent($event, 'beforeTransportStarted'); } } src/Silex/tests/Silex/Tests/Provider/TranslationServiceProviderTest.php000066400000000000000000000146211516072260400267650ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\TranslationServiceProvider; use Silex\Provider\LocaleServiceProvider; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; /** * TranslationProvider test cases. * * @author Daniel Tschinder */ class TranslationServiceProviderTest extends TestCase { /** * @return Application */ protected function getPreparedApp() { $app = new Application(); $app->register(new LocaleServiceProvider()); $app->register(new TranslationServiceProvider()); $app['translator.domains'] = [ 'messages' => [ 'en' => [ 'key1' => 'The translation', 'key_only_english' => 'Foo', 'key2' => 'One apple|%count% apples', 'test' => [ 'key' => 'It works', ], ], 'de' => [ 'key1' => 'The german translation', 'key2' => 'One german apple|%count% german apples', 'test' => [ 'key' => 'It works in german', ], ], ], ]; return $app; } public function transChoiceProvider() { return [ ['key2', 0, null, '0 apples'], ['key2', 1, null, 'One apple'], ['key2', 2, null, '2 apples'], ['key2', 0, 'de', '0 german apples'], ['key2', 1, 'de', 'One german apple'], ['key2', 2, 'de', '2 german apples'], ['key2', 0, 'ru', '0 apples'], // fallback ['key2', 1, 'ru', 'One apple'], // fallback ['key2', 2, 'ru', '2 apples'], // fallback ]; } public function transProvider() { return [ ['key1', null, 'The translation'], ['key1', 'de', 'The german translation'], ['key1', 'ru', 'The translation'], // fallback ['test.key', null, 'It works'], ['test.key', 'de', 'It works in german'], ['test.key', 'ru', 'It works'], // fallback ]; } /** * @dataProvider transProvider */ public function testTransForDefaultLanguage($key, $locale, $expected) { $app = $this->getPreparedApp(); $result = $app['translator']->trans($key, [], null, $locale); $this->assertEquals($expected, $result); } /** * @dataProvider transChoiceProvider */ public function testTransChoiceForDefaultLanguage($key, $number, $locale, $expected) { $app = $this->getPreparedApp(); $result = $app['translator']->transChoice($key, $number, ['%count%' => $number], null, $locale); $this->assertEquals($expected, $result); } public function testFallbacks() { $app = $this->getPreparedApp(); $app['locale_fallbacks'] = ['de', 'en']; // fallback to english $result = $app['translator']->trans('key_only_english', [], null, 'ru'); $this->assertEquals('Foo', $result); // fallback to german $result = $app['translator']->trans('key1', [], null, 'ru'); $this->assertEquals('The german translation', $result); } public function testLocale() { $app = $this->getPreparedApp(); $app->get('/', function () use ($app) { return $app['translator']->getLocale(); }); $response = $app->handle(Request::create('/')); $this->assertEquals('en', $response->getContent()); $app = $this->getPreparedApp(); $app->get('/', function () use ($app) { return $app['translator']->getLocale(); }); $request = Request::create('/'); $request->setLocale('fr'); $response = $app->handle($request); $this->assertEquals('fr', $response->getContent()); $app = $this->getPreparedApp(); $app->get('/{_locale}', function () use ($app) { return $app['translator']->getLocale(); }); $response = $app->handle(Request::create('/es')); $this->assertEquals('es', $response->getContent()); } public function testLocaleInSubRequests() { $app = $this->getPreparedApp(); $app->get('/embed/{_locale}', function () use ($app) { return $app['translator']->getLocale(); }); $app->get('/{_locale}', function () use ($app) { return $app['translator']->getLocale(). $app->handle(Request::create('/embed/es'), HttpKernelInterface::SUB_REQUEST)->getContent(). $app['translator']->getLocale(); }); $response = $app->handle(Request::create('/fr')); $this->assertEquals('fresfr', $response->getContent()); $app = $this->getPreparedApp(); $app->get('/embed', function () use ($app) { return $app['translator']->getLocale(); }); $app->get('/{_locale}', function () use ($app) { return $app['translator']->getLocale(). $app->handle(Request::create('/embed'), HttpKernelInterface::SUB_REQUEST)->getContent(). $app['translator']->getLocale(); }); $response = $app->handle(Request::create('/fr')); // locale in sub-request must be "en" as this is the value if the sub-request is converted to an ESI $this->assertEquals('frenfr', $response->getContent()); } public function testLocaleWithBefore() { $app = $this->getPreparedApp(); $app->before(function (Request $request) { $request->setLocale('fr'); }, Application::EARLY_EVENT); $app->get('/embed', function () use ($app) { return $app['translator']->getLocale(); }); $app->get('/', function () use ($app) { return $app['translator']->getLocale(). $app->handle(Request::create('/embed'), HttpKernelInterface::SUB_REQUEST)->getContent(). $app['translator']->getLocale(); }); $response = $app->handle(Request::create('/')); // locale in sub-request is "en" as the before filter is only executed for the main request $this->assertEquals('frenfr', $response->getContent()); } } src/Silex/tests/Silex/Tests/Provider/TwigServiceProviderTest.php000066400000000000000000000124501516072260400253770ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use Fig\Link\Link; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\CsrfServiceProvider; use Silex\Provider\FormServiceProvider; use Silex\Provider\TwigServiceProvider; use Silex\Provider\AssetServiceProvider; use Symfony\Component\HttpFoundation\Request; /** * TwigProvider test cases. * * @author Igor Wiedler */ class TwigServiceProviderTest extends TestCase { public function testRegisterAndRender() { $app = new Application(); $app->register(new TwigServiceProvider(), [ 'twig.templates' => ['hello' => 'Hello {{ name }}!'], ]); $app->get('/hello/{name}', function ($name) use ($app) { return $app['twig']->render('hello', ['name' => $name]); }); $request = Request::create('/hello/john'); $response = $app->handle($request); $this->assertEquals('Hello john!', $response->getContent()); } public function testLoaderPriority() { $app = new Application(); $app->register(new TwigServiceProvider(), [ 'twig.templates' => ['foo' => 'foo'], ]); $loader = $this->getMockBuilder('\Twig_LoaderInterface')->getMock(); if (method_exists('\Twig_LoaderInterface', 'getSourceContext')) { $loader->expects($this->never())->method('getSourceContext'); } $app['twig.loader.filesystem'] = function ($app) use ($loader) { return $loader; }; $this->assertEquals('foo', $app['twig.loader']->getSourceContext('foo')->getCode()); } public function testHttpFoundationIntegration() { $app = new Application(); $app['request_stack']->push(Request::create('/dir1/dir2/file')); $app->register(new TwigServiceProvider(), [ 'twig.templates' => [ 'absolute' => '{{ absolute_url("foo.css") }}', 'relative' => '{{ relative_path("/dir1/foo.css") }}', ], ]); $this->assertEquals('http://localhost/dir1/dir2/foo.css', $app['twig']->render('absolute')); $this->assertEquals('../foo.css', $app['twig']->render('relative')); } public function testAssetIntegration() { $app = new Application(); $app->register(new TwigServiceProvider(), [ 'twig.templates' => ['hello' => '{{ asset("/foo.css") }}'], ]); $app->register(new AssetServiceProvider(), [ 'assets.version' => 1, ]); $this->assertEquals('/foo.css?1', $app['twig']->render('hello')); } public function testGlobalVariable() { $app = new Application(); $app['request_stack']->push(Request::create('/?name=Fabien')); $app->register(new TwigServiceProvider(), [ 'twig.templates' => ['hello' => '{{ global.request.get("name") }}'], ]); $this->assertEquals('Fabien', $app['twig']->render('hello')); } public function testFormFactory() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new CsrfServiceProvider()); $app->register(new TwigServiceProvider()); $this->assertInstanceOf('\Twig\Environment', $app['twig']); $this->assertInstanceOf('Symfony\Bridge\Twig\Form\TwigRendererEngine', $app['twig.form.engine']); $this->assertInstanceOf('Symfony\Component\Form\FormRenderer', $app['twig.form.renderer']); } public function testFormWithoutCsrf() { $app = new Application(); $app->register(new FormServiceProvider()); $app->register(new TwigServiceProvider()); $this->assertInstanceOf('\Twig\Environment', $app['twig']); } public function testFormatParameters() { $app = new Application(); $timezone = new \DateTimeZone('Europe/Paris'); $app->register(new TwigServiceProvider(), [ 'twig.date.format' => 'Y-m-d', 'twig.date.interval_format' => '%h hours', 'twig.date.timezone' => $timezone, 'twig.number_format.decimals' => 2, 'twig.number_format.decimal_point' => ',', 'twig.number_format.thousands_separator' => ' ', ]); $twig = $app['twig']; $this->assertSame(['Y-m-d', '%h hours'], $twig->getExtension('Twig_Extension_Core')->getDateFormat()); $this->assertSame($timezone, $twig->getExtension('Twig_Extension_Core')->getTimezone()); $this->assertSame([2, ',', ' '], $twig->getExtension('Twig_Extension_Core')->getNumberFormat()); } public function testWebLinkIntegration() { $app = new Application(); $app['request_stack']->push($request = Request::create('/')); $app->register(new TwigServiceProvider(), [ 'twig.templates' => [ 'preload' => '{{ preload("/foo.css") }}', ], ]); $this->assertEquals('/foo.css', $app['twig']->render('preload')); $link = new Link('preload', '/foo.css'); $this->assertEquals([$link], array_values($request->attributes->get('_links')->getLinks())); } } src/Silex/tests/Silex/Tests/Provider/ValidatorServiceProviderTest.php000066400000000000000000000143321516072260400264130ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\TranslationServiceProvider; use Silex\Provider\ValidatorServiceProvider; use Silex\Provider\FormServiceProvider; use Symfony\Component\Translation\Exception\NotFoundResourceException; use Symfony\Component\Validator\Constraints as Assert; use Silex\Tests\Provider\ValidatorServiceProviderTest\Constraint\Custom; use Silex\Tests\Provider\ValidatorServiceProviderTest\Constraint\CustomValidator; use Symfony\Component\Validator\Validator\ValidatorInterface; /** * ValidatorServiceProvider. * * Javier Lopez */ class ValidatorServiceProviderTest extends TestCase { public function testRegister() { $app = new Application(); $app->register(new ValidatorServiceProvider()); $app->register(new FormServiceProvider()); return $app; } public function testRegisterWithCustomValidators() { $app = new Application(); $app['custom.validator'] = function () { return new CustomValidator(); }; $app->register(new ValidatorServiceProvider(), [ 'validator.validator_service_ids' => [ 'test.custom.validator' => 'custom.validator', ], ]); return $app; } /** * @depends testRegisterWithCustomValidators */ public function testConstraintValidatorFactory($app) { $this->assertInstanceOf('Silex\Provider\Validator\ConstraintValidatorFactory', $app['validator.validator_factory']); $validator = $app['validator.validator_factory']->getInstance(new Custom()); $this->assertInstanceOf('Silex\Tests\Provider\ValidatorServiceProviderTest\Constraint\CustomValidator', $validator); } /** * @depends testRegister */ public function testConstraintValidatorFactoryWithExpression($app) { $constraint = new Assert\Expression('true'); $validator = $app['validator.validator_factory']->getInstance($constraint); $this->assertInstanceOf('Symfony\Component\Validator\Constraints\ExpressionValidator', $validator); } /** * @depends testRegister */ public function testValidatorServiceIsAValidator($app) { $this->assertTrue($app['validator'] instanceof ValidatorInterface); } /** * @depends testRegister * @dataProvider getTestValidatorConstraintProvider */ public function testValidatorConstraint($email, $isValid, $nbGlobalError, $nbEmailError, $app) { $constraints = new Assert\Collection([ 'email' => [ new Assert\NotBlank(), new Assert\Email(), ], ]); $builder = $app['form.factory']->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', [], [ 'constraints' => $constraints, ]); $form = $builder ->add('email', 'Symfony\Component\Form\Extension\Core\Type\EmailType', ['label' => 'Email']) ->getForm() ; $form->submit(['email' => $email]); $this->assertEquals($isValid, $form->isValid()); $this->assertCount($nbGlobalError, $form->getErrors()); $this->assertCount($nbEmailError, $form->offsetGet('email')->getErrors()); } public function testValidatorWillNotAddNonexistentTranslationFiles() { $app = new Application([ 'locale' => 'nonexistent', ]); $app->register(new ValidatorServiceProvider()); $app->register(new TranslationServiceProvider(), [ 'locale_fallbacks' => [], ]); $app['validator']; $translator = $app['translator']; try { $translator->trans('test'); $this->addToAssertionCount(1); } catch (NotFoundResourceException $e) { $this->fail('Validator should not add a translation resource that does not exist'); } } public function getTestValidatorConstraintProvider() { // Email, form is valid, nb global error, nb email error return [ ['', false, 0, 1], ['not an email', false, 0, 1], ['email@sample.com', true, 0, 0], ]; } /** * @dataProvider getAddResourceData */ public function testAddResource($registerValidatorFirst) { $app = new Application(); $app['locale'] = 'fr'; $app->register(new ValidatorServiceProvider()); $app->register(new TranslationServiceProvider()); $app->extend('translator', function ($translator, $app) { $translator->addResource('array', ['This value should not be blank.' => 'Pas vide'], 'fr', 'validators'); return $translator; }); if ($registerValidatorFirst) { $app['validator']; } $this->assertEquals('Pas vide', $app['translator']->trans('This value should not be blank.', [], 'validators', 'fr')); } public function getAddResourceData() { return [[false], [true]]; } public function testAddResourceAlternate() { $app = new Application(); $app['locale'] = 'fr'; $app->register(new ValidatorServiceProvider()); $app->register(new TranslationServiceProvider()); $app->factory($app->extend('translator.resources', function ($resources, $app) { $resources = array_merge($resources, [ ['array', ['This value should not be blank.' => 'Pas vide'], 'fr', 'validators'], ]); return $resources; })); $app['validator']; $this->assertEquals('Pas vide', $app['translator']->trans('This value should not be blank.', [], 'validators', 'fr')); } public function testTranslatorResourcesIsArray() { $app = new Application(); $app['locale'] = 'fr'; $app->register(new ValidatorServiceProvider()); $app->register(new TranslationServiceProvider()); $this->assertInternalType('array', $app['translator.resources']); } } src/Silex/tests/Silex/Tests/Provider/ValidatorServiceProviderTest/000077500000000000000000000000001516072260400256775ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/Provider/ValidatorServiceProviderTest/Constraint/000077500000000000000000000000001516072260400300235ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/Provider/ValidatorServiceProviderTest/Constraint/Custom.php000066400000000000000000000011431516072260400320050ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider\ValidatorServiceProviderTest\Constraint; use Symfony\Component\Validator\Constraint; /** * @author Alex Kalyvitis */ class Custom extends Constraint { public $message = 'This field must be ...'; public $table; public $field; public function validatedBy() { return 'test.custom.validator'; } } src/Silex/tests/Silex/Tests/Provider/ValidatorServiceProviderTest/Constraint/CustomValidator.php000066400000000000000000000013571516072260400336620ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Provider\ValidatorServiceProviderTest\Constraint; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidator; /** * @author Alex Kalyvitis */ class CustomValidator extends ConstraintValidator { public function isValid($value, Constraint $constraint) { // Validate... return true; } public function validate($value, Constraint $constraint) { return $this->isValid($value, $constraint); } } src/Silex/tests/Silex/Tests/Route/000077500000000000000000000000001516072260400173625ustar00rootroot00000000000000src/Silex/tests/Silex/Tests/Route/SecurityRoute.php000066400000000000000000000005221516072260400227200ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Route; use Silex\Route; class SecurityRoute extends Route { use Route\SecurityTrait; } src/Silex/tests/Silex/Tests/Route/SecurityTraitTest.php000066400000000000000000000045301516072260400235500ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests\Route; use PHPUnit\Framework\TestCase; use Silex\Application; use Silex\Provider\SecurityServiceProvider; use Symfony\Component\HttpFoundation\Request; /** * SecurityTrait test cases. * * @author Fabien Potencier */ class SecurityTraitTest extends TestCase { public function testSecureWithNoAuthenticatedUser() { $app = $this->createApplication(); $app->get('/', function () { return 'foo'; }) ->secure('ROLE_ADMIN') ; $request = Request::create('/'); $response = $app->handle($request); $this->assertEquals(401, $response->getStatusCode()); } public function testSecureWithAuthorizedRoles() { $app = $this->createApplication(); $app->get('/', function () { return 'foo'; }) ->secure('ROLE_ADMIN') ; $request = Request::create('/'); $request->headers->set('PHP_AUTH_USER', 'fabien'); $request->headers->set('PHP_AUTH_PW', 'foo'); $response = $app->handle($request); $this->assertEquals(200, $response->getStatusCode()); } public function testSecureWithUnauthorizedRoles() { $app = $this->createApplication(); $app->get('/', function () { return 'foo'; }) ->secure('ROLE_SUPER_ADMIN') ; $request = Request::create('/'); $request->headers->set('PHP_AUTH_USER', 'fabien'); $request->headers->set('PHP_AUTH_PW', 'foo'); $response = $app->handle($request); $this->assertEquals(403, $response->getStatusCode()); } private function createApplication() { $app = new Application(); $app['route_class'] = 'Silex\Tests\Route\SecurityRoute'; $app->register(new SecurityServiceProvider(), [ 'security.firewalls' => [ 'default' => [ 'http' => true, 'users' => [ 'fabien' => ['ROLE_ADMIN', '$2y$15$lzUNsTegNXvZW3qtfucV0erYBcEqWVeyOmjolB7R1uodsAVJ95vvu'], ], ], ], ]); return $app; } } src/Silex/tests/Silex/Tests/RouterTest.php000066400000000000000000000175441516072260400211300ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\RedirectResponse; /** * Router test cases. * * @author Igor Wiedler */ class RouterTest extends TestCase { public function testMapRouting() { $app = new Application(); $app->match('/foo', function () { return 'foo'; }); $app->match('/bar', function () { return 'bar'; }); $app->match('/', function () { return 'root'; }); $this->checkRouteResponse($app, '/foo', 'foo'); $this->checkRouteResponse($app, '/bar', 'bar'); $this->checkRouteResponse($app, '/', 'root'); } public function testStatusCode() { $app = new Application(); $app->put('/created', function () { return new Response('', 201); }); $app->match('/forbidden', function () { return new Response('', 403); }); $app->match('/not_found', function () { return new Response('', 404); }); $request = Request::create('/created', 'put'); $response = $app->handle($request); $this->assertEquals(201, $response->getStatusCode()); $request = Request::create('/forbidden'); $response = $app->handle($request); $this->assertEquals(403, $response->getStatusCode()); $request = Request::create('/not_found'); $response = $app->handle($request); $this->assertEquals(404, $response->getStatusCode()); } public function testRedirect() { $app = new Application(); $app->match('/redirect', function () { return new RedirectResponse('/target'); }); $app->match('/redirect2', function () use ($app) { return $app->redirect('/target2'); }); $request = Request::create('/redirect'); $response = $app->handle($request); $this->assertTrue($response->isRedirect('/target')); $request = Request::create('/redirect2'); $response = $app->handle($request); $this->assertTrue($response->isRedirect('/target2')); } /** * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public function testMissingRoute() { $app = new Application(); unset($app['exception_handler']); $request = Request::create('/baz'); $app->handle($request); } public function testMethodRouting() { $app = new Application(); $app->match('/foo', function () { return 'foo'; }); $app->match('/bar', function () { return 'bar'; })->method('GET|POST'); $app->get('/resource', function () { return 'get resource'; }); $app->post('/resource', function () { return 'post resource'; }); $app->put('/resource', function () { return 'put resource'; }); $app->patch('/resource', function () { return 'patch resource'; }); $app->delete('/resource', function () { return 'delete resource'; }); $this->checkRouteResponse($app, '/foo', 'foo'); $this->checkRouteResponse($app, '/bar', 'bar'); $this->checkRouteResponse($app, '/bar', 'bar', 'post'); $this->checkRouteResponse($app, '/resource', 'get resource'); $this->checkRouteResponse($app, '/resource', 'post resource', 'post'); $this->checkRouteResponse($app, '/resource', 'put resource', 'put'); $this->checkRouteResponse($app, '/resource', 'patch resource', 'patch'); $this->checkRouteResponse($app, '/resource', 'delete resource', 'delete'); } public function testRequestShouldBeStoredRegardlessOfRouting() { $app = new Application(); $app->get('/foo', function (Request $request) use ($app) { return new Response($request->getRequestUri()); }); $app->error(function ($e, Request $request, $code) use ($app) { return new Response($request->getRequestUri()); }); foreach (['/foo', '/bar'] as $path) { $request = Request::create($path); $response = $app->handle($request); $this->assertContains($path, $response->getContent()); } } public function testTrailingSlashBehavior() { $app = new Application(); $app->get('/foo/', function () use ($app) { return new Response('ok'); }); $request = Request::create('/foo'); $response = $app->handle($request); $this->assertEquals(301, $response->getStatusCode()); $this->assertEquals('/foo/', $response->getTargetUrl()); } public function testHostSpecification() { $route = new \Silex\Route(); $this->assertSame($route, $route->host('{locale}.example.com')); $this->assertEquals('{locale}.example.com', $route->getHost()); } public function testRequireHttpRedirect() { $app = new Application(); $app->match('/secured', function () { return 'secured content'; }) ->requireHttp(); $request = Request::create('https://example.com/secured'); $response = $app->handle($request); $this->assertTrue($response->isRedirect('http://example.com/secured')); } public function testRequireHttpsRedirect() { $app = new Application(); $app->match('/secured', function () { return 'secured content'; }) ->requireHttps(); $request = Request::create('http://example.com/secured'); $response = $app->handle($request); $this->assertTrue($response->isRedirect('https://example.com/secured')); } public function testRequireHttpsRedirectIncludesQueryString() { $app = new Application(); $app->match('/secured', function () { return 'secured content'; }) ->requireHttps(); $request = Request::create('http://example.com/secured?query=string'); $response = $app->handle($request); $this->assertTrue($response->isRedirect('https://example.com/secured?query=string')); } public function testConditionOnRoute() { $app = new Application(); $app->match('/secured', function () { return 'secured content'; }) ->when('request.isSecure() == true'); $request = Request::create('http://example.com/secured'); $response = $app->handle($request); $this->assertEquals(404, $response->getStatusCode()); } public function testClassNameControllerSyntax() { $app = new Application(); $app->get('/foo', 'Silex\Tests\MyController::getFoo'); $this->checkRouteResponse($app, '/foo', 'foo'); } public function testClassNameControllerSyntaxWithStaticMethod() { $app = new Application(); $app->get('/bar', 'Silex\Tests\MyController::getBar'); $this->checkRouteResponse($app, '/bar', 'bar'); } protected function checkRouteResponse(Application $app, $path, $expectedContent, $method = 'get', $message = null) { $request = Request::create($path, $method); $response = $app->handle($request); $this->assertEquals($expectedContent, $response->getContent(), $message); } } class MyController { public function getFoo() { return 'foo'; } public static function getBar() { return 'bar'; } } src/Silex/tests/Silex/Tests/ServiceControllerResolverRouterTest.php000066400000000000000000000022341516072260400262250ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use Silex\Application; use Silex\Provider\ServiceControllerServiceProvider; use Symfony\Component\HttpFoundation\Request; /** * Router test cases, using the ServiceControllerResolver. */ class ServiceControllerResolverRouterTest extends RouterTest { public function testServiceNameControllerSyntax() { $app = new Application(); $app->register(new ServiceControllerServiceProvider()); $app['service_name'] = function () { return new MyController(); }; $app->get('/bar', 'service_name:getBar'); $this->checkRouteResponse($app, '/bar', 'bar'); } protected function checkRouteResponse(Application $app, $path, $expectedContent, $method = 'get', $message = null) { $request = Request::create($path, $method); $response = $app->handle($request); $this->assertEquals($expectedContent, $response->getContent(), $message); } } src/Silex/tests/Silex/Tests/ServiceControllerResolverTest.php000066400000000000000000000047031516072260400250270ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\ServiceControllerResolver; use Silex\Application; use Symfony\Component\HttpFoundation\Request; /** * Unit tests for ServiceControllerResolver, see ServiceControllerResolverRouterTest for some * integration tests. */ class ServiceControllerResolverTest extends Testcase { private $app; private $mockCallbackResolver; private $mockResolver; private $resolver; public function setup() { $this->mockResolver = $this->getMockBuilder('Symfony\Component\HttpKernel\Controller\ControllerResolverInterface') ->disableOriginalConstructor() ->getMock(); $this->mockCallbackResolver = $this->getMockBuilder('Silex\CallbackResolver') ->disableOriginalConstructor() ->getMock(); $this->app = new Application(); $this->resolver = new ServiceControllerResolver($this->mockResolver, $this->mockCallbackResolver); } public function testShouldResolveServiceController() { $this->mockCallbackResolver->expects($this->once()) ->method('isValid') ->will($this->returnValue(true)); $this->mockCallbackResolver->expects($this->once()) ->method('convertCallback') ->with('some_service:methodName') ->will($this->returnValue(['callback'])); $this->app['some_service'] = function () { return new \stdClass(); }; $req = Request::create('/'); $req->attributes->set('_controller', 'some_service:methodName'); $this->assertEquals(['callback'], $this->resolver->getController($req)); } public function testShouldUnresolvedControllerNames() { $req = Request::create('/'); $req->attributes->set('_controller', 'some_class::methodName'); $this->mockCallbackResolver->expects($this->once()) ->method('isValid') ->with('some_class::methodName') ->will($this->returnValue(false)); $this->mockResolver->expects($this->once()) ->method('getController') ->with($req) ->will($this->returnValue(123)); $this->assertEquals(123, $this->resolver->getController($req)); } } src/Silex/tests/Silex/Tests/StreamTest.php000066400000000000000000000022251516072260400210710ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use PHPUnit\Framework\TestCase; use Silex\Application; use Symfony\Component\HttpFoundation\Request; /** * Stream test cases. * * @author Igor Wiedler */ class StreamTest extends TestCase { public function testStreamReturnsStreamingResponse() { $app = new Application(); $response = $app->stream(); $this->assertInstanceOf('Symfony\Component\HttpFoundation\StreamedResponse', $response); $this->assertFalse($response->getContent()); } public function testStreamActuallyStreams() { $i = 0; $stream = function () use (&$i) { ++$i; }; $app = new Application(); $response = $app->stream($stream); $this->assertEquals(0, $i); $request = Request::create('/stream'); $response->prepare($request); $response->sendContent(); $this->assertEquals(1, $i); } } src/Silex/tests/Silex/Tests/WebTestCaseTest.php000066400000000000000000000035231516072260400220110ustar00rootroot00000000000000 * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace Silex\Tests; use Silex\Application; use Silex\WebTestCase; use Symfony\Component\HttpFoundation\Request; /** * Functional test cases. * * @author Igor Wiedler */ class WebTestCaseTest extends WebTestCase { public function createApplication() { $app = new Application(); $app->match('/hello', function () { return 'world'; }); $app->match('/html', function () { return '

title

'; }); $app->match('/server', function (Request $request) use ($app) { $user = $request->server->get('PHP_AUTH_USER'); $pass = $request->server->get('PHP_AUTH_PW'); return "

$user:$pass

"; }); return $app; } public function testGetHello() { $client = $this->createClient(); $client->request('GET', '/hello'); $response = $client->getResponse(); $this->assertTrue($response->isSuccessful()); $this->assertEquals('world', $response->getContent()); } public function testCrawlerFilter() { $client = $this->createClient(); $crawler = $client->request('GET', '/html'); $this->assertEquals('title', $crawler->filter('h1')->text()); } public function testServerVariables() { $user = 'klaus'; $pass = '123456'; $client = $this->createClient([ 'PHP_AUTH_USER' => $user, 'PHP_AUTH_PW' => $pass, ]); $crawler = $client->request('GET', '/server'); $this->assertEquals("$user:$pass", $crawler->filter('h1')->text()); } } src/browser/000077500000000000000000000000001516072260400133335ustar00rootroot00000000000000src/browser/bundle.js000066400000000000000000000017331516072260400151460ustar00rootroot00000000000000window.gitlist.codemirrorTheme = { light: 'idea', dark: 'dracula', } require('@fortawesome/fontawesome-free/css/all.css') window.gitlist.snapckbarLongTimeout = 20000; global.jQuery = require('jquery') global.$ = global.jQuery; require('snackbarjs'); require('jquery.redirect'); require('bootstrap'); global.twemoji = require('twemoji').default const prodDir = require('../../package').corifeus["prod-dir"]; global.twemoji.base = `${prodDir}/twemoji/`; require('./js/network.js') require('./js/gitgraph.js/gitgraph.css') require('./js/gitgraph.js/gitgraph.js') require('./js/tree') require('./js/treegraph') require('./js/markdown') require('./js/clone-buttons') require('./js/paginate') require('./js/browser') require('./js/index.js') require('./js/file') require('./js/theme-switcher.js') require('./js/commit') require('./js/breadcrumb') require('./js/commits-list') require('./js/file-fragment') require('./js/change-log') require('./js/todo') require('./js/global') src/browser/codemirror.js000066400000000000000000000037671516072260400160530ustar00rootroot00000000000000require('codemirror/lib/codemirror.css') require(`codemirror/theme/idea.css`) require(`codemirror/theme/dracula.css`) global.CodeMirror = require('codemirror'); require('codemirror/addon/selection/active-line.js') require('codemirror/addon/mode/simple'); require('codemirror/addon/mode/multiplex'); require('codemirror/mode/cmake/cmake'); require('codemirror/mode/clike/clike'); require('codemirror/mode/css/css'); require('codemirror/mode/dockerfile/dockerfile'); require('codemirror/mode/go/go'); require('codemirror/mode/handlebars/handlebars'); require('codemirror/mode/htmlmixed/htmlmixed'); require('codemirror/mode/javascript/javascript'); require('codemirror/mode/jsx/jsx'); require('codemirror/mode/perl/perl'); require('codemirror/mode/php/php'); require('codemirror/mode/powershell/powershell'); require('codemirror/mode/python/python'); require('codemirror/mode/properties/properties'); require('codemirror/mode/ruby/ruby'); require('codemirror/mode/sass/sass'); require('codemirror/mode/shell/shell'); require('codemirror/mode/vbscript/vbscript'); require('codemirror/mode/groovy/groovy'); require('codemirror/mode/erlang/erlang'); require('codemirror/mode/ecl/ecl'); require('codemirror/mode/coffeescript/coffeescript'); require('codemirror/mode/clojure/clojure'); require('codemirror/mode/diff/diff'); require('codemirror/mode/smalltalk/smalltalk'); require('codemirror/mode/rust/rust'); require('codemirror/mode/lua/lua'); require('codemirror/mode/haskell/haskell'); require('codemirror/mode/markdown/markdown'); require('codemirror/mode/scheme/scheme'); require('codemirror/mode/r/r'); require('codemirror/mode/rst/rst'); require('codemirror/mode/ntriples/ntriples'); require('codemirror/mode/pascal/pascal'); require('codemirror/mode/sql/sql'); require('codemirror/mode/swift/swift'); require('codemirror/mode/twig/twig'); require('codemirror/mode/vue/vue'); require('codemirror/mode/xml/xml'); require('codemirror/mode/xquery/xquery'); require('codemirror/mode/yaml/yaml'); require('codemirror/mode/protobuf/protobuf');src/browser/grunt/000077500000000000000000000000001516072260400144725ustar00rootroot00000000000000src/browser/grunt/less.js000066400000000000000000000110761516072260400160030ustar00rootroot00000000000000const fs = require('fs'); const fsExtra = require('fs-extra'); const glob = require('glob'); const crypto = require('crypto'); const path = require('path'); const cwd = path.resolve(`${process.cwd()}`) const prodDir = require('../../../package').corifeus["prod-dir"]; let lessLastHash; let lessFiles; const filesLessCache = `${cwd}/build/less/file-less.json`; const lessSettings = (grunt) => { return { options: { sourceMap: false, compress: true, }, get files() { let files = glob.sync(`${cwd}/src/browser/less/**/*.*`) let string = '' for (let filename of files) { string += fs.readFileSync(filename, 'utf8') } const lessHash = crypto.createHash('sha256').update(string).digest("hex"); if (lessLastHash === lessHash) { grunt.log.writeln(`less hash is the same - ${lessHash}`) return lessFiles }/* else if (fs.existsSync(filesLessCacheBuild) && fs.existsSync(filesLessCache) && fs.readFileSync(cssPostfixFilename, 'utf8').toString() === lessHash) { grunt.log.writeln(`less hash is the same in different process, using file less cache - ${lessHash}`) return fs.readFileSync(filesLessCache, 'utf8').toString(); }*/ grunt.log.writeln(`less hash generating new build - ${lessHash}`) lessLastHash = lessHash; const pkgFilename = './package.json'; const pkg = fsExtra.readJsonSync(pkgFilename); pkg.corifeus['css-postfix'] = lessHash //fsExtra.writeJsonSync(pkgFilename, pkg) fs.writeFileSync(pkgFilename, JSON.stringify(pkg, null, 4), 'utf8') grunt.log.writeln('The css postfix file has been saved!'); const generateLessFiles = () => { const themeDir = './src/browser/less/theme'; const filesLess = {} const root = './node_modules/bootswatch'; const watches = fs.readdirSync(root); const themes = [ 'default', 'solar', ]; const excluded = ['fonts', '.github', 'docs']; // css with random const themeCss = { 'bootstrap-default': `${prodDir}/css/bootstrap-default.${lessHash}.css`, 'bootstrap-solar': `${prodDir}/css/bootstrap-solar.${lessHash}.css`, } for (let path of watches) { const stat = fs.statSync(`${root}/${path}`); if (stat.isDirectory() && !excluded.includes(path)) { themes.push(path); themeCss[`bootstrap-${path}`] = `${prodDir}/css/bootstrap-${path}.${lessHash}.css`; } } // -- css with random // less with random fsExtra.ensureDirSync(themeDir); const pathFont = 'https://fonts.googleapis.com/css?family=Roboto:300,400,700' for (let theme of themes) { const less = `${themeDir}/${theme}.less`; if (theme === 'default') { fs.writeFileSync(less, ` @import "../../../../node_modules/bootstrap/less/bootstrap"; @import "../default"; `) } else if (theme === 'solar') { fs.writeFileSync(less, ` @path: '${pathFont}'; @import "../../../../node_modules/bootstrap/less/bootstrap"; @import "solar/variables"; @import "solar/bootswatch"; @import "../default"; `) } else { fs.writeFileSync(less, ` @path: '${pathFont}'; @import "../../../../node_modules/bootstrap/less/bootstrap"; @import "../../../../node_modules/bootswatch/${theme}/variables"; @import "../../../../node_modules/bootswatch/${theme}/bootswatch"; @import "../default"; `) } // console.log(less) filesLess[`public/${prodDir}/css/bootstrap-${theme}.${lessHash}.css`] = less; } // -- less with random fs.writeFileSync(`./src/browser/js/themes.js`, ` const themes = ${JSON.stringify(themeCss, null, 4)}; module.exports = themes; `); fsExtra.outputJsonSync(filesLessCache, filesLess) return filesLess // grunt.log.writeln(JSON.stringify(filesLess, null, 4)) } lessFiles = generateLessFiles(); return lessFiles; } }; } module.exports.lessSettings = lessSettings; src/browser/js/000077500000000000000000000000001516072260400137475ustar00rootroot00000000000000src/browser/js/blame.js000066400000000000000000000000411516072260400153600ustar00rootroot00000000000000/* It uses the file-fragement */src/browser/js/breadcrumb.js000066400000000000000000000016321516072260400164150ustar00rootroot00000000000000$(function () { const $gitActions = $('#p3x-gitlist-breadcrumb-git'); if ($gitActions.length === 0) { return; } const $gitActionFetch = $('#p3x-gitlist-breadcrumb-git-fetch') $gitActionFetch.on('click', async () => { const url = `${window.gitlist.basepath}/${window.gitlist.repo}/git-helper/${window.gitlist.branch}/fetch-origin` try { const request = $.ajax({ url: url, type: 'POST', }) const response = await request; const json = JSON.parse(response) if (json.error === true) { window.gitlist.ajaxErrorHandler(json); return; } $.snackbar({ htmlAllowed: true, content: json.message, }) } catch (e) { window.gitlist.ajaxErrorHandler(e); } }) }) src/browser/js/browser.js000066400000000000000000000067011516072260400157740ustar00rootroot00000000000000$(async function () { const menu = $('#p3x-gitlist-branch-list-container'); if (menu.length > 0) { const menuResponsive = require('./menu-responsive') menuResponsive({ menuList: $('#p3x-gitlist-branch-list-dropdown-menu'), shift: 130, navButton: $('#p3x-gitlist-branch-list'), alwaysCalculate: true, }) const { default: List} = await import ( /* webpackChunkName: "list" */ /* webpackPrefetch: true */ '../list' ) const mainId = 'p3x-gitlist-branch-list' const branchListId = 'p3x-gitlist-list-branch' const tagListId = 'p3x-gitlist-list-tag' const debounce = require('lodash/debounce') const path = window.gitlist.getPath() const baseUrl = `${window.gitlist.basepath}/${window.gitlist.repo}` const search_query = window.gitlist.search_query; const urls = { tree: (options) => { return `${baseUrl}/tree/${options.checkout}`; }, commits: (options) => { return `${baseUrl}/commits/${options.checkout}/${path}`; }, commit: (options) => { return `${baseUrl}/commits/${options.checkout}/${path}`; }, stats: (options) => { return `${baseUrl}/stats/${options.checkout}`; }, network: (options) => { return `${baseUrl}/network/${options.checkout}`; }, blob: (options) => { return `${baseUrl}/blob/${options.checkout}/${path}`; }, blame: (options) => { return `${baseUrl}/blame/${options.checkout}/${path}`; }, treegraph: (options) => { return `${baseUrl}/treegraph/${options.checkout}`; }, search: (options) => { return { url: `${baseUrl}/tree/${options.checkout}/search?query=${search_query}`, post: true, } }, searchcommits: (options) => { return { url: `${baseUrl}/commits/${options.checkout}/search?query=${search_query}`, post: true, }; }, } window.gitlist.browserClick = (options) => { let result = urls[window.gitlist.browse_type](options); if (typeof result === 'string') { result = { url: result } } if (!result.hasOwnProperty('post')) { location = result.url; } else { $.redirect(result.url); } } if ($(`#${mainId}`).length) { const listBranchOptions = { valueNames: ['item'], indexAsync: true, }; const branchList = new List(branchListId, listBranchOptions); const tagList = new List(tagListId, listBranchOptions); const input = $('#p3x-gitlist-branch-list-search'); const debouncedKeyup = debounce(() => { const search = input.val().trim(); branchList.search(search) if (tagList.hasOwnProperty('search')) { tagList.search(search) } }, 250) input.keyup(debouncedKeyup) } } }) src/browser/js/change-log.js000066400000000000000000000013671516072260400163200ustar00rootroot00000000000000let $changelogModal let changelogHtml; window.gitlist.changeLog = async () => { if (changelogHtml === undefined) { try { let response = await $.ajax('https://raw.githubusercontent.com/patrikx3/gitlist/master/change-log.md') const $changelogModalBody = $('#p3x-gitlist-modal-changelog-body') response = $(' {% endfor %} {% else %}

No result.

{% endif %} {% endblock %} src/twig/searchcommits.twig000066400000000000000000000007731516072260400163660ustar00rootroot00000000000000{% extends 'layout-page.twig' %} {% set page = 'searchcommits' %} {% block title %}P3X GitList{% endblock %} {% block content %} {% embed 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Commits search results for: ' ~ query, path:''}]} %} {% block left %} {% if commits %} Commit: {{ commits | length }} {% endif %} {% endblock %} {% endembed %} {% include 'commits-list.twig' %} {% endblock %} src/twig/stats.twig000066400000000000000000000056031516072260400146600ustar00rootroot00000000000000{% extends 'layout-page.twig' %} {% set page = 'stats' %} {% block title %}P3X GitList{% endblock %} {% block content %} {% include 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Statistics', path:''}, {dir: branch, path:''}]} %}
  File extensions {{ stats.extensions|length }}
    {% for ext, amount in stats.extensions %}
  • {{ ext }} {{ amount }}
  • {% endfor %}
{{ authors|length }}   Authors with commits
  Stats
  • {{ stats.files }} Total files
  • {{ stats.size }} bytes {{ stats.size | format_size }}
{% endblock %} src/twig/tree.twig000066400000000000000000000206661516072260400144670ustar00rootroot00000000000000{% extends 'layout-page.twig' %} {% set page = 'files' %} {% block title %}P3X GitList{% endblock %} {% block content %} {% embed 'breadcrumb.twig' with {breadcrumbs: breadcrumbs } %} {% block left %} {% if enable_editing %}
{% embed 'modal/modal-commit.twig' with {type: 'new', title: 'New file', bodyTitle: 'Are you sure to add a new file or directory?
If you add a slash to the end of the "filename", you create a directory, otherwise you create a file.
Please, make sure you use a relative path.


Note: The filename is not created on the current tree browser you are, but that actual root of the repo.', wrapForm: true } %} {% block form %}

{% endblock %} {% block buttons %} {% endblock %} {% endembed %} {% embed 'modal/modal-commit.twig' with {enctype: 'multipart/form-data', type: 'new-binary', title: 'New binary', bodyTitle: 'Are you sure to add a new binary file?', wrapForm: true } %} {% block form %}

{% endblock %} {% block buttons %} {% endblock %} {% endembed %}
{% endif %} {% endblock %} {% endembed %} {% if files is not empty %} {% if parent is not null %} {% if not parent %} {% else %} {% endif %} {% endif %} {% for file in files %} {%- if file.type == "folder" or file.type == "symlink" -%} {% endfor %}
.. ..
  {{ file.name }} {%- elseif file.type == "module" -%}
  {{ file.name }} @ {{ file.shortHash }} {%- else -%}
  {{ file.name }} {%- endif -%} {% if file.size %} {{ file.size | format_size }} {% endif %} {{ file.message }} {{ file.lastModified }}
{% else %}

This repository is empty.

{% endif %} {% if readme is defined and readme is not empty %} {% include 'markdown.twig' with {'filename': readme.filename, 'data': readme.content} %} {% endif %} {% endblock %} src/twig/treegraph.twig000066400000000000000000000041671516072260400155070ustar00rootroot00000000000000{% extends 'layout-page.twig' %} {% set page = 'treegraph' %} {% block title %}P3X GitList{% endblock %} {% block content %} {% embed 'breadcrumb.twig' with {breadcrumbs: [{dir: 'Log graph', path:''}]} %} {% block right %} {% endblock %} {% block left %} Hover over the log to see the full commit message. {% endblock %} {% endembed %}
    {% for item in graphItems %}
  • {{ item.relation }}
  • {% endfor %}
    {% for item in graphItems %}
  • {% if item.rev is defined %} {{ item.short_rev }} {{ item.branch }} {{ item.date | date(gitlist_date_format) }} by {{ item.author }}   {{ item.subject }} {% else %} {% endif %}
  • {% endfor %}
{% endblock %} tests/000077500000000000000000000000001516072260400122235ustar00rootroot00000000000000tests/Gitlist/000077500000000000000000000000001516072260400136425ustar00rootroot00000000000000tests/Gitlist/RepositoryTest.php000066400000000000000000000020031516072260400173650ustar00rootroot00000000000000prophesize(Client::class); $client->run(Argument::type(Repository::class), "grep -i --line-number -- '=sleep 5;' master")->shouldBeCalled(); $repository = new Repository('/tmp', $client->reveal()); $repository->searchTree('--open-files-in-pager=sleep 5;', 'master'); $repository->searchTree('-O=sleep 5;', 'master'); } public function testIsSanitizingSearchWithAnyOption() { $client = $this->prophesize(Client::class); $client->run(Argument::type(Repository::class), "grep -i --line-number -- 'foobar =bar;' foo")->shouldBeCalled(); $repository = new Repository('/tmp', $client->reveal()); $repository->searchTree('foobar --bar --foo=bar;', 'foo'); } } tests/Gitter/000077500000000000000000000000001516072260400134615ustar00rootroot00000000000000tests/Gitter/ClientTest.php000077500000000000000000000056301516072260400162570ustar00rootroot00000000000000mkdir(self::$tmpdir); if (!is_writable(self::$tmpdir)) { self::markTestSkipped('There are no write permissions in order to create test repositories.'); } } public function setUp(): void { if (!is_writable(self::$tmpdir)) { $this->markTestSkipped('There are no write permissions in order to create test repositories.'); } $path = getenv('GIT_CLIENT') ?: null; $this->client = new Client($path); } /** * expectedException RuntimeException */ /* public function testIsNotAbleToGetUnexistingRepository() { $this->client->getRepository(self::$tmpdir . '/testrepo'); } */ public function testIsParsingGitVersion() { $version = $this->client->getVersion(); $this->assertNotEmpty($version); } public function testIsCreatingRepository() { $repository = $this->client->createRepository(self::$tmpdir . '/testrepo'); $fs = new Filesystem(); $fs->remove(self::$tmpdir . '/testrepo/.git/description'); $this->assertMatchesRegularExpression("/nothing to commit/", $repository->getClient()->run($repository, 'status')); } public function testIsCreatingBareRepository() { $repository = $this->client->createRepository(self::$tmpdir . '/testbare', true); $this->assertInstanceOf('Gitter\Repository', $repository); } /** * @expectedException RuntimeException */ /* public function testIsNotAbleToCreateRepositoryDueToExistingOne() { $this->client->createRepository(self::$tmpdir . '/testrepo'); } */ /** * @expectedException RuntimeException */ /* public function testIsNotOpeningHiddenRepositories() { $this->client->getRepository(self::$tmpdir . '/hiddenrepo'); } */ /** * @expectedException RuntimeException */ /* public function testIsCatchingGitCommandErrors() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $repository->getClient()->run($repository, 'wrong'); } */ public static function tearDownAfterClass(): void { $fs = new Filesystem(); $fs->remove(self::$tmpdir); } } tests/Gitter/Model/000077500000000000000000000000001516072260400145215ustar00rootroot00000000000000tests/Gitter/Model/Commit/000077500000000000000000000000001516072260400157515ustar00rootroot00000000000000tests/Gitter/Model/Commit/CommitTest.php000066400000000000000000000037241516072260400205600ustar00rootroot00000000000000 '209908f247194b1adc836f2e50f957cb1f11f41c', 'short_hash' => '209908f', 'tree' => '0a1f6638ccfc6d6b34be8a913144304355d23cc3', 'parents' => '6e6951114ccf7b162e2a57b0462b39ca972f476f 1e8fd833f71fd20f8b176c79c705b9f096434126', 'author' => 'The Author', 'author_email' => 'author@example.com', 'date' => '1347372763', 'commiter' => 'The Commiter', 'commiter_email' => 'commiter@example.com', 'commiter_date' => '1347372763', 'message' => 'Test commit', 'body' => 'Test body' ); $commit = new Commit(); $commit->importData($data); $this->assertEquals('209908f247194b1adc836f2e50f957cb1f11f41c', $commit->getHash()); $this->assertEquals('209908f', $commit->getShortHash()); $this->assertEquals('0a1f6638ccfc6d6b34be8a913144304355d23cc3', $commit->getTreeHash()); $this->assertEquals(array('6e6951114ccf7b162e2a57b0462b39ca972f476f', '1e8fd833f71fd20f8b176c79c705b9f096434126'), $commit->getParentsHash()); $this->assertEquals('The Author', $commit->getAuthor()->getName()); $this->assertEquals('author@example.com', $commit->getAuthor()->getEmail()); $this->assertEquals(new DateTime('@1347372763'), $commit->getDate()); $this->assertEquals('The Commiter', $commit->getCommiter()->getName()); $this->assertEquals('commiter@example.com', $commit->getCommiter()->getEmail()); $this->assertEquals(new DateTime('@1347372763'), $commit->getCommiterDate()); $this->assertEquals('Test commit', $commit->getMessage()); $this->assertEquals('Test body', $commit->getBody()); } } tests/Gitter/PrettyFormatTest.php000066400000000000000000000030121516072260400174660ustar00rootroot00000000000000assertEquals($expected, $format->parse($xml)); } public function dataForTestIsParsingPrettyXMLFormat() { return array( array( 'valuevalue2', array(array('tag' => 'value', 'tag2' => 'value2')), ), array( '', array(array('empty_tag' => '')), ), array( 'item 1item 2', array(array('tag' => 'item 1'), array('tag' => 'item 2')), ), array( 'value', array(array('tag' => array(array('inner_tag' => 'value')))), ), array( "value\x1Bvalue2", array(array('tag' => 'value?', 'tag2' => 'value2')), ), ); } /** * @expectedException RuntimeException */ /* public function testIsNotParsingWithoutData() { $format = new PrettyFormat; $format->parse(''); } */ } tests/Gitter/RepositoryTest.php000077500000000000000000000542421516072260400172230ustar00rootroot00000000000000mkdir(self::$tmpdir); if (!is_writable(self::$tmpdir)) { self::markTestSkipped('There are no write permissions in order to create test repositories.'); } } public function setUp(): void { if (!is_writable(self::$tmpdir)) { $this->markTestSkipped('There are no write permissions in order to create test repositories.'); } $path = getenv('GIT_CLIENT') ?: null; $this->client = new Client($path); } public function tearDown(): void { \Mockery::close(); } public function testIsCreatingRepositoryFixtures() { $a = $this->client->createRepository(self::$tmpdir . '/testrepo'); $b = $this->client->createRepository(self::$tmpdir . '/anothertestrepo'); $c = $this->client->createRepository(self::$tmpdir . '/bigbadrepo'); $this->assertMatchesRegularExpression("/nothing to commit/", $a->getClient()->run($a, 'status')); $this->assertMatchesRegularExpression("/nothing to commit/", $b->getClient()->run($b, 'status')); $this->assertMatchesRegularExpression("/nothing to commit/", $c->getClient()->run($c, 'status')); } public function testIsConfiguratingRepository() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $repository->setConfig('user.name', 'Luke Skywalker'); $repository->setConfig('user.email', 'luke@rebel.org'); $this->assertEquals($repository->getConfig('user.name'), 'Luke Skywalker'); $this->assertEquals($repository->getConfig('user.email'), 'luke@rebel.org'); } public function testIsNamesCorrect() { $a = $this->client->createRepository(self::$tmpdir . '/reponame'); $b = $this->client->createRepository(self::$tmpdir . '/another-repo-name/'); $this->assertEquals("reponame", $a->getName()); $this->assertEquals("another-repo-name", $b->getName()); } public function testIsAdding() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); file_put_contents(self::$tmpdir . '/testrepo/test_file.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); $repository->add('test_file.txt'); $this->assertMatchesRegularExpression("/new file: test_file.txt/", $repository->getClient()->run($repository, 'status')); } /** * @depends testIsAdding */ public function testIsAddingDot() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); file_put_contents(self::$tmpdir . '/testrepo/test_file1.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); file_put_contents(self::$tmpdir . '/testrepo/test_file2.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); file_put_contents(self::$tmpdir . '/testrepo/test_file3.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); $repository->add(); $this->assertMatchesRegularExpression("/new file: test_file1.txt/", $repository->getClient()->run($repository, 'status')); $this->assertMatchesRegularExpression("/new file: test_file2.txt/", $repository->getClient()->run($repository, 'status')); $this->assertMatchesRegularExpression("/new file: test_file3.txt/", $repository->getClient()->run($repository, 'status')); } /** * @depends testIsAddingDot */ public function testIsAddingAll() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); file_put_contents(self::$tmpdir . '/testrepo/test_file4.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); file_put_contents(self::$tmpdir . '/testrepo/test_file5.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); file_put_contents(self::$tmpdir . '/testrepo/test_file6.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); $repository->addAll(); $this->assertMatchesRegularExpression("/new file: test_file4.txt/", $repository->getClient()->run($repository, 'status')); $this->assertMatchesRegularExpression("/new file: test_file5.txt/", $repository->getClient()->run($repository, 'status')); $this->assertMatchesRegularExpression("/new file: test_file6.txt/", $repository->getClient()->run($repository, 'status')); } /** * @depends testIsAddingAll */ public function testIsAddingArrayOfFiles() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); file_put_contents(self::$tmpdir . '/testrepo/test_file7.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); file_put_contents(self::$tmpdir . '/testrepo/test_file8.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); file_put_contents(self::$tmpdir . '/testrepo/test_file9.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); $repository->add(array('test_file7.txt', 'test_file8.txt', 'test_file9.txt')); $this->assertMatchesRegularExpression("/new file: test_file7.txt/", $repository->getClient()->run($repository, 'status')); $this->assertMatchesRegularExpression("/new file: test_file8.txt/", $repository->getClient()->run($repository, 'status')); $this->assertMatchesRegularExpression("/new file: test_file9.txt/", $repository->getClient()->run($repository, 'status')); } /** * @depends testIsAddingArrayOfFiles */ public function testIsCommiting() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $repository->commit("The truth unveiled\n\nThis is a proper commit body"); $this->assertMatchesRegularExpression("/The truth unveiled/", $repository->getClient()->run($repository, 'log')); $this->assertMatchesRegularExpression("/This is a proper commit body/", $repository->getClient()->run($repository, 'log')); } public function testIsCreatingBranches() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $repository->createBranch('issue12'); $repository->createBranch('issue42'); $branches = $repository->getBranches(); $this->assertContains('issue12', $branches); $this->assertContains('issue42', $branches); $this->assertContains('master', $branches); } public function testIsCreatingTags() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $repository->createTag('1.0.0'); $repository->createTag('1.0.1', 'annotated tag'); $tags = $repository->getTags(); $this->assertContains('1.0.0', $tags); $this->assertContains('1.0.1', $tags); } public function testIsGettingCurrentBranch() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $branch = $repository->getCurrentBranch(); $this->assertTrue($branch === 'master'); $commits = $repository->getCommits(); $hash = $commits[0]->getHash(); $repository->checkout($hash); $new_branch = $repository->getCurrentBranch(); # $this->assertTrue($new_branch === NULL); $repository->checkout($branch); } public function testIsGettingBranchesWhenHeadIsDetached() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $commits = $repository->getCommits(); $current_branch = $repository->getCurrentBranch(); $hash = $commits[0]->getHash(); $repository->checkout($hash); $branches = $repository->getBranches(); $this->assertTrue(count($branches) === 3); $branch = $repository->getHead('develop'); $repository->checkout($current_branch); } public function testIsCheckingIfBranchExists() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $this->assertTrue($repository->hasBranch('issue12')); } public function testIsCheckingOut() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $branch = $repository->checkout('issue12'); $branch = $repository->getCurrentBranch(); $this->assertTrue($branch === 'issue12'); $repository->checkout('master'); $branch = $repository->getCurrentBranch(); $this->assertTrue($branch === 'master'); } /** * @depends testIsCommiting */ public function testIsGettingCommits() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $commits = $repository->getCommits(); foreach ($commits as $commit) { $this->assertTrue($commit->isCommit()); $this->assertInstanceOf('Gitter\Model\Commit\Commit', $commit); $this->assertEquals($commit->getMessage(), 'The truth unveiled'); $this->assertInstanceOf('Gitter\Model\Commit\Author', $commit->getAuthor()); $this->assertEquals($commit->getAuthor()->getName(), 'Luke Skywalker'); $this->assertEquals($commit->getAuthor()->getEmail(), 'luke@rebel.org'); $this->assertEquals($commit->getCommiter()->getName(), 'Luke Skywalker'); $this->assertEquals($commit->getCommiter()->getEmail(), 'luke@rebel.org'); $this->assertEquals($commit->getParentsHash(), array()); $this->assertInstanceOf('DateTime', $commit->getDate()); $this->assertInstanceOf('DateTime', $commit->getCommiterDate()); $this->assertMatchesRegularExpression('/[a-f0-9]+/', $commit->getHash()); $this->assertMatchesRegularExpression('/[a-f0-9]+/', $commit->getShortHash()); $this->assertMatchesRegularExpression('/[a-f0-9]+/', $commit->getTreeHash()); } } /** * @depends testIsGettingCommits */ public function testIsGettingCommitsFromSpecificFile() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $commits = $repository->getCommits('test_file4.txt'); foreach ($commits as $commit) { $this->assertTrue($commit->isCommit()); $this->assertInstanceOf('Gitter\Model\Commit\Commit', $commit); $this->assertEquals($commit->getMessage(), "The truth unveiled"); $this->assertInstanceOf('Gitter\Model\Commit\Author', $commit->getAuthor()); $this->assertEquals($commit->getAuthor()->getName(), 'Luke Skywalker'); $this->assertEquals($commit->getAuthor()->getEmail(), 'luke@rebel.org'); } } public function testIsGettingTree() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $files = $repository->getTree('master'); foreach ($files as $file) { $this->assertTrue($file->isBlob()); $this->assertInstanceOf('Gitter\Model\Blob', $file); $this->assertMatchesRegularExpression('/test_file[0-9]*.txt/', $file->getName()); $this->assertEquals($file->getSize(), '55'); $this->assertEquals($file->getMode(), '100644'); $this->assertMatchesRegularExpression('/[a-f0-9]+/', $file->getHash()); } } public function testIsGettingTreeOutput() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $files = $repository->getTree('master')->output(); foreach ($files as $file) { $this->assertEquals('blob', $file['type']); $this->assertMatchesRegularExpression('/test_file[0-9]*.txt/', $file['name']); $this->assertEquals($file['size'], '55'); $this->assertEquals($file['mode'], '100644'); $this->assertMatchesRegularExpression('/[a-f0-9]+/', $file['hash']); } } public function testIsGettingTreesWithinTree() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); // Creating folders mkdir(self::$tmpdir . '/testrepo/MyFolder'); mkdir(self::$tmpdir . '/testrepo/MyTest'); mkdir(self::$tmpdir . '/testrepo/MyFolder/Tests'); // Populating created folders file_put_contents(self::$tmpdir . '/testrepo/MyFolder/crazy.php', 'Lorem ipsum dolor sit amet'); file_put_contents(self::$tmpdir . '/testrepo/MyFolder/skywalker.php', 'Lorem ipsum dolor sit amet'); file_put_contents(self::$tmpdir . '/testrepo/MyTest/fortytwo.php', 'Lorem ipsum dolor sit amet'); file_put_contents(self::$tmpdir . '/testrepo/MyFolder/Tests/web.php', 'Lorem ipsum dolor sit amet'); file_put_contents(self::$tmpdir . '/testrepo/MyFolder/Tests/cli.php', 'Lorem ipsum dolor sit amet'); // Adding and commiting $repository->addAll(); $repository->commit("Creating folders for testIsGettingTreesWithinTrees"); // Checking tree $files = $repository->getTree('master')->output(); $this->assertEquals('folder', $files[0]['type']); $this->assertEquals('MyFolder', $files[0]['name']); $this->assertEquals('', $files[0]['size']); $this->assertEquals('040000', $files[0]['mode']); $this->assertEquals('4143e982237f3bdf56b5350f862c334054aad69e', $files[0]['hash']); $this->assertEquals('folder', $files[1]['type']); $this->assertEquals('MyTest', $files[1]['name']); $this->assertEquals('', $files[1]['size']); $this->assertEquals('040000', $files[1]['mode']); $this->assertEquals('632240595eabd59e4217d196d6c12efb81f9c011', $files[1]['hash']); $this->assertEquals('blob', $files[2]['type']); $this->assertEquals('test_file.txt', $files[2]['name']); $this->assertEquals('55', $files[2]['size']); $this->assertEquals('100644', $files[2]['mode']); $this->assertEquals('a773bfc0fda6f878e3d17d78c667d18297c8831f', $files[2]['hash']); } public function testIsGettingBlobsWithinTrees() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $files = $repository->getTree('master:MyFolder/')->output(); $this->assertEquals('folder', $files[0]['type']); $this->assertEquals('Tests', $files[0]['name']); $this->assertEquals('', $files[0]['size']); $this->assertEquals('040000', $files[0]['mode']); $this->assertEquals('8542f67d011ff2ea5ec49a729ba81a52935676d1', $files[0]['hash']); $this->assertEquals('blob', $files[1]['type']); $this->assertEquals('crazy.php', $files[1]['name']); $this->assertEquals('26', $files[1]['size']); $this->assertEquals('100644', $files[1]['mode']); $this->assertEquals('d781006b2d05cc31751954a0fb920c990e825aad', $files[1]['hash']); $this->assertEquals('blob', $files[2]['type']); $this->assertEquals('skywalker.php', $files[2]['name']); $this->assertEquals('26', $files[2]['size']); $this->assertEquals('100644', $files[2]['mode']); $this->assertEquals('d781006b2d05cc31751954a0fb920c990e825aad', $files[2]['hash']); } public function testIsGettingBlobOutput() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $blob = $repository->getBlob('master:MyFolder/crazy.php')->output(); $this->assertEquals("Lorem ipsum dolor sit amet", $blob); $blob = $repository->getBlob('master:test_file4.txt')->output(); $this->assertEquals("Your mother is so ugly, glCullFace always returns TRUE.", $blob); } public function testIsGettingSymlinksWithinTrees() { if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $this->markTestSkipped('Unable to run on Windows'); } $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $fs = new Filesystem(); $fs->touch(self::$tmpdir . '/testrepo/original_file.txt'); $fs->symlink(self::$tmpdir . '/testrepo/original_file.txt', self::$tmpdir . '/testrepo/link.txt'); $repository->addAll(); $repository->commit("Testing symlinks"); $files = $repository->getTree('master'); foreach ($files as $file) { if ($file instanceof Symlink) { $this->assertEquals($file->getPath(), self::$tmpdir . '/testrepo/original_file.txt'); $this->assertEquals($file->getName(), 'link.txt'); $this->assertEquals($file->getMode(), '120000'); return; } } $this->fail('No symlink found inside tree'); } public function testIsGettingSymlinksWithinTreesOutput() { if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $this->markTestSkipped('Unable to run on Windows'); } $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $fs = new Filesystem(); $fs->touch(self::$tmpdir . '/testrepo/original_file.txt'); $fs->symlink(self::$tmpdir . '/testrepo/original_file.txt', self::$tmpdir . '/testrepo/link2.txt'); $repository->addAll(); $repository->commit("Testing symlinks"); $files = $repository->getTree('master')->output(); foreach ($files as $file) { if ($file['type'] == 'symlink') { $this->assertEquals($file['path'], self::$tmpdir . '/testrepo/original_file.txt'); $this->assertEquals($file['name'], 'link.txt'); $this->assertEquals($file['mode'], '120000'); return; } } $this->fail('No symlink found inside tree output'); } public function testIsGettingTotalCommits() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $this->assertEquals($repository->getTotalCommits(), '4'); } public function testIsGettingCommit() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $commits = $repository->getCommits(); foreach ($commits as $commit) { $singleCommit = $repository->getCommit($commit->getHash()); $this->assertTrue($singleCommit->isCommit()); $this->assertInstanceOf('Gitter\Model\Commit\Commit', $singleCommit); $this->assertInstanceOf('Gitter\Model\Commit\Author', $singleCommit->getAuthor()); $this->assertEquals($singleCommit->getAuthor()->getName(), 'Luke Skywalker'); $this->assertEquals($singleCommit->getAuthor()->getEmail(), 'luke@rebel.org'); $this->assertEquals($singleCommit->getCommiter()->getName(), 'Luke Skywalker'); $this->assertEquals($singleCommit->getCommiter()->getEmail(), 'luke@rebel.org'); $this->assertInstanceOf('DateTime', $singleCommit->getDate()); $this->assertInstanceOf('DateTime', $singleCommit->getCommiterDate()); $this->assertMatchesRegularExpression('/[a-f0-9]+/', $singleCommit->getHash()); $this->assertMatchesRegularExpression('/[a-f0-9]+/', $singleCommit->getShortHash()); $this->assertMatchesRegularExpression('/[a-f0-9]+/', $singleCommit->getTreeHash()); if ($singleCommit->getMessage() == 'The truth unveiled') { $this->assertEquals($singleCommit->getBody(), 'This is a proper commit body'); } } } public function testIsGettingCurrentHead() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $this->assertEquals($repository->getHead(), 'master'); } public function testIsGettingBranchTree() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $this->assertMatchesRegularExpression('/[a-f0-9]+/', $repository->getBranchTree('issue12')); } public function testIsGettingBlame() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); $blame = $repository->getBlame('test_file4.txt'); $this->assertEquals("Your mother is so ugly, glCullFace always returns TRUE.", trim($blame[1]['line'])); $this->assertEquals($repository->getBlame('original_file.txt'), array()); } public function testIsAddingFileNameWithSpace() { $repository = $this->client->getRepository(self::$tmpdir . '/testrepo'); file_put_contents(self::$tmpdir . '/testrepo/test file10.txt', 'Your mother is so ugly, glCullFace always returns TRUE.'); $repository->add('test file10.txt'); $this->assertMatchesRegularExpression("/new file: test file10.txt/", $repository->getClient()->run($repository, 'status')); } public function testCommitWithFileNameWithSpace() { $repo = $this->client->createRepository(self::$tmpdir . '/testrepospace'); $diffs = $repo->readDiffLogs($this->getLogsForCommitWithFileNameWithSpace()); $this->assertEquals('test file.txt', $diffs[0]->getFile(), 'New file name with a space in it'); $this->assertEquals('testfile.txt', $diffs[1]->getFile(), 'Old file name'); } public static function tearDownAfterClass(): void { $fs = new Filesystem(); $fs->remove(self::$tmpdir); } private function getLogsForCommitWithFileNameWithSpace() { // 'testfile.txt' is renamed to 'test file.txt' return array( 'diff --git a/test file.txt b/test file.txt', 'new file mode 100644', 'index 0000000..63edbe7', '--- /dev/null', '+++ b/test file.txt', '@@ -0,0 +1 @@', '+Modified line', 'diff --git a/testfile.txt b/testfile.txt', 'deleted file mode 100644', 'index 63edbe7..0000000', '--- a/testfile.txt', '+++ /dev/null', '@@ -1 +0,0 @@', '-Modified line', ); } } tests/Gitter/Util/000077500000000000000000000000001516072260400143765ustar00rootroot00000000000000tests/Gitter/Util/DateTimeTest.php000066400000000000000000000016021516072260400174420ustar00rootroot00000000000000assertEquals($date->format('Y-m-d'), '2010-01-28'); } public function testIsCreatingWithoutTimezone() { $date = new DateTime('2012-10-10 00:00:00'); $this->assertEquals($date->format('Y-m-d'), '2012-10-10'); } public function testIsCreatingWithUnixTimestamp() { $date = new DateTime('@632988000'); $this->assertEquals($date->format('Y-m-d'), '1990-01-22'); } public function testIsCreatingWithUnixTimestampAndTimezone() { $date = new DateTime('@632988000', new \DateTimeZone('UTC')); $this->assertEquals($date->format('Y-m-d'), '1990-01-22'); } }todo.md000066400000000000000000000045701516072260400123560ustar00rootroot00000000000000[//]: #@corifeus-header # 🤖 P3X Gitlist - A decorated enhanced elegant, feature rich and modern private git ui repository viewer [//]: #@corifeus-header:end ## TODO * Maintain Silex * Localization (twig, controller, php, js) * Sometimes, I try to upload a file like `grub.png` and it does not work, while I upload a different `.png` and it works, weird * make sure new functions work with Windows or disable some features is Windows * treegraph pager * diff by file * pager not working right with commits * search has no pager (either of two) * Basically, the twig "for" is not cheap => expensive, use AJAX and web worker * search.twig * blame.twig * Search, at work, "fix" string has 1221 results, use AJAX and pager * Blames in gitlist on composer.lock has 994 results, use AJAX and pager * In submodules, if the "submodule" and "path" is not the same, it chokes (it should work the submodule name and path are not the same) * Works * submodule "path/name" * path path/name * Not working * submodule "name" * path path/name * In submodules, the url cannot have slash at the end [//]: #@corifeus-footer --- 🙏 This is an open-source project. Star this repository, if you like it, or even donate to maintain the servers and the development. Thank you so much! Possible, this server, rarely, is down, please, hang on for 15-30 minutes and the server will be back up. All my domains ([patrikx3.com](https://patrikx3.com) and [corifeus.com](https://corifeus.com)) could have minor errors, since I am developing in my free time. However, it is usually stable. **Note about versioning:** Versions are cut in Major.Minor.Patch schema. Major is always the current year. Minor is either 4 (January - June) or 10 (July - December). Patch is incremental by every build. If there is a breaking change, it should be noted in the readme. --- [**P3X-GITLIST**](https://corifeus.com/gitlist) Build v2024.4.105 [![Donate for Corifeus / P3X](https://img.shields.io/badge/Donate-Corifeus-003087.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=QZVM4V6HVZJW6) [![Contact Corifeus / P3X](https://img.shields.io/badge/Contact-P3X-ff9900.svg)](https://www.patrikx3.com/en/front/contact) [![Like Corifeus @ Facebook](https://img.shields.io/badge/LIKE-Corifeus-3b5998.svg)](https://www.facebook.com/corifeus.software) [//]: #@corifeus-footer:end webpack.config.js000066400000000000000000000133561516072260400143070ustar00rootroot00000000000000const config = require('corifeus-builder/src/utils/config').config const webpack = require('webpack'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin') const minimize = process.argv.includes('--mode=production'); const mode = minimize ? 'production' : 'development'; let minimizer = undefined; const prodDir = require('./package').corifeus["prod-dir"]; const buildDir = __dirname + `/public/${prodDir}/webpack`; let devtool; const publicPath = 'prod/webpack/' const rules = [ { test: /\.js$/, enforce: 'pre', use: ['source-map-loader'], }, { test: /\.worker\.js$/, use: { loader: 'worker-loader' } }, { test: /\.(css|less)$/, use: [ { loader: MiniCssExtractPlugin.loader, options: { }, }, 'css-loader', { loader: 'less-loader', }], }, { test: /\.html$/, use: [{ loader: 'html-loader', options: { minimize: minimize, //caseSensitive: true } }] }, { test: /\.(png|jpe?g|gif|ico)$/, type: 'asset/resource', }, { test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, { test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, type: 'asset/resource', }, ] const plugins = [ /* not needed, as require or import will import, but it is to stop automatically all, we rather employ the import instead of webpack new webpack.ContextReplacementPlugin( /moment[/\\]locale$/, // /de|fr|hu/ /hu/ ), */ new webpack.IgnorePlugin({ resourceRegExp: /^\.\/locale$/, contextRegExp: /moment$/ }), new HtmlWebpackPlugin({ template: `${__dirname}/src/browser/layout.tpl.twig`, inject: 'body', chunks: ['bundle'], publicPath: publicPath, filename: `${__dirname}/src/twig/layout.twig`, }), new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional filename: !minimize ? '[name].css' : '[id].[contenthash].css', chunkFilename: !minimize ? '[name].css' : '[id].[contenthash].css', }),]; /* plugins.push( new WebpackOnBuildPlugin(async (stats) => { try { const newFileNames = Object.keys(stats.compilation.assets).map(file => path.resolve(`${buildDir}/${file}`)); const baseDir = path.resolve(buildDir); const baseDirList = await utils.fs.readdirRecursive(baseDir) const promises = []; for(let baseDirFile of baseDirList) { if (!newFileNames.includes(baseDirFile)) { promises.push( fs.unlink(baseDirFile) ) } } await Promise.all(promises); } catch(e) { console.error(e) process.exit(-1) } }), ) */ if (minimize) { const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); devtool = false; const bannerText = require('corifeus-builder').utils.license(); minimizer = [ new CssMinimizerPlugin(), new TerserPlugin({ parallel: true, extractComments: { condition: /^\**!|@preserve|@license|@cc_on/, filename: function (fileOptions) { return `${fileOptions.filename}.LICENSE.txt`; }, banner: function (webpackBanner) { return ` ${bannerText} For more information about all licenses, please see ${webpackBanner} `; } }, terserOptions: { compress: { warnings: false }, ecma: config.ecma, // todo found out if mangle use or not // mangle: false === keep function names // mangle: true === drop function names mangle: true, }, }), ] plugins.push( new webpack.BannerPlugin({ banner: bannerText, include: /\.css$/, exclude: /\.ts$|\.js$/, // hash:[hash], chunkhash:[chunkhash], name:[name], filebase:[filebase], query:[query], file:[file] }) ) /* https://webpack.js.org/guides/build-performance/#source-maps plugins.push( new webpack.SourceMapDevToolPlugin({ filename: 'sourcemaps/[file].map', append: '\n//# sourceMappingURL=./[url]' }) ) */ rules.unshift({ test: /\.js$/, loader: 'webpack-remove-debug' }) } const webpackConfig = { // watch: true, devtool: devtool, entry: { bundle: "./src/browser/bundle.js", }, output: { path: buildDir, filename: '[id].[contenthash].js', // chunkFilename: '[name].[contenthash].js', // publicPath: '{{ app.url_subdir }}/webpack/', publicPath: `auto`, assetModuleFilename: `assets/[hash][ext]`, }, module: { rules: rules }, optimization: { minimize: minimize, minimizer: minimizer }, plugins: plugins, mode: mode, } webpackConfig.ignoreWarnings = [/Failed to parse source map/]; module.exports = webpackConfig

WS]!\ם RRӦMB\; ]TK uG{K U eoTF/#ʼn@afy]#NvڵJw/pLJYG$8ݵLwM_9L쥹[1 O>KV,h Nnzυ7@%] ^a !;0ڨMwŝFNmZYw~Cw9SnRܥ; eKǝP; ̓X6FwGw$gnP̭BJqj欫8"b#:vI Eɤ>U2h(0jmY0A" 5.4w8$)Z˟ r|Ne e,@f)+W.L Zf]{@SwsNV ŝ̭RX /{u{uPSWZ9 )xP$wOg,7^dZ6ɍ&9CBJ3:턇gцrӈK).֝lJZ> |Ke~a?Y]jͲ;7A0cxFc!X_wizI!_<?;P?Px(8UםQtg5 \s&R/l}ɺJ)![>_wC!D1=B>"(~Ҕ!D(r0C'&?K⯿8VwȽoȲUκ<C}rq's+*[YW Џ !/8=pX8a[Vk3tx3xgG+bgD,ɹP\ ܘۇ}u@/ rS)螲ug- ^>KdA1?qTjƛ.'Lq{opY18wR꓋;)BʓZ_lIm췅k{Ͽ|zQ^\.Y3!@ F$пuXֻWPvb( B( xY/|"yq85{bٯι%y"Y%9pKr6 II&9WRwM.IYEASJ:cRf . )tFJ7=uuGi̪ s+@ ̭ǤCﺢJwdO4)RwνRzfsiTcW&־?\wJ1r4̭)0b4Vg]?GAS~H _wB_*tԸ2_wdRuMoLZv(YanH1?g}úS (}vQRXНQŗ^e-By*Ysk9k;J{upVh[R`nh̭4>{= (}a}oBLҝ/R%^iZaź sT tgi4P)P!)Tկ΁ %+7tjj(B,e ąR֏xi8Y]INn&9Fcտ;g?37ש؋s B}W{DEjnߊ/Puugi.n&9Fcn^z  rIJYBqs` D_y qukkh4GwJ0܊ј[|DJ4g}s {Ȯc+t$,-eonV^IY]pؒy=v$',Z[BL&jjLh4=ڿ']MѰ6 _ͷ#_!D,h'ky tDdg]pnK->Y=O ]x9r"; NE?;0۶y+CA#u$ؤ;գt=dI4ZCFXViY)Kd*G57$w\hM2zyѪɽK3AaU!2̥B9NunOZ>TwPBI@In4Jr1+v΁ KNa9t2j 8m=~r]`ĸճO,ה*ܝޖXygAqbT,ѝ2ྐྵeugAjjͲƛ8^5֗C(Ɂ(ɍFIN* rzCBktɲo ~n@!םZT}؊_XlvQkEh!%+}wZ3gis=ֹ_}In%9:NPHE?& #TR7uf!@9F6Z8H^e̛h/; F76tr6;KG?Hh䀹6[=tO4NݺsƜ*|ua'J;Odryݚ(Nt_BNѝ$0U?yolW $lSmC*]:5j;+TC]qtce"[qJ١ѿiE/n:E>I_ror6)JfuG_k.Xd?̈%>\$>XqG&M;كnղq 0tJT?-H{0]rpl)In46(t@QDԱ[sǟ~Mwpd,ƉE4K'lνEy{%lZ3Xwt0?Hhm)b< r:FCwpk-?oݣ72ٻkY/nܾq,^b|O#G75vC(Ɂ(ɍFIx۞y+Ju@QDԱ-Bhͽ g?Y]b'VW?b1~uD$)rŌ󦕉Pxq\!ʖ;Y55莓NP)Py+t@Q:@}Ic\w)8vʜU CaN2w4GMŋA6GǁGH;OV)TnYۃ9񥯏J6; ~ᢳt IDATuDyh [.rIε&R/l}ɺUO?2>Rڵs;=h$=7PΖuoɿ,Z8 2j }'dF) ugbʊkhO'Ɂ8In4N nOםEQ1nUO(vBw||tuo;s? ¶%ٶaKE^Q㧐|TBI@In4Jrc(X;/; !;I,ka?$ ~m}aCviㄴ}JqToM,}3{d ݑɇ!@ F$ .۞\{:Pa-WV{ҝ4Viߪۃ*Ezh TC}S>`bقr,.rJr JrQ%>AAuS!!, |ʜ[Z.?5S}Ϳ3N tb#zzܼ"auz\LԪTuexشY\bcoCI@In4Jr[{K c !*tL\/(xe+O/jgkȂ:Yܽˏ !)PWKcq[4"t j UCm139C99@ F$mKt@QD%cRѝβyw>(0l4!,jㅓQ(ǏHh[)t@Y Kج;]$)/O9n'^?y ;s?)Ǐʎ\}i^ [^;{ ! dxo޼@w!tG@vPHwH'{ENGo>7,~rwգt,@WEf~-x_ԝUߝEn{ -ݻTPH\}F3;pF>z0Uڷ[D(9INIC.'(}"HnН8tSo ; HZz|"sa fU V R(}q]ͳ}CMw q 'U; 42/t_Zg\-w(ǻ oHʥt|jCѼAA#-;t]ZVU3RXv,HSc_U EG¬JZY(Ɂcp>ZݟX20td9%9YW~RIvx,Q3Qatg XVҾUE9l)In46M$PmpXu":Nw~Y5xFI&dxg\;'$0#sUVvPwHɲCYP4Rw ξhu'z ZEf~-|ag̭Gpp eppd.2Mݞ_~ rmXARSuT?o[;KO(6\șU\ ŝFId/sW rz%ĵsΘVളԝg`t{+ Y?_Ϻwr8wrP20td9'Ɂ̒ʺis {(}U}^6]Q; Ip"ߺ:=hxd[V$R$8IdW̚;gf !f ++B; |UsOޜHiO bj9; ̗;s?S')Ɂ:xP20td9%9~J嬯~Cwd?$}('tgϱDOKwxz^tG(]Ŏ\ ^ [^zbBC,B$tgAψ|&Itg@q܇Pae_BpkvŐsÂ^oZ; +I&$J._N YB\;!=fª8S^ܶ~er޺,l@ lMr M%;g]F9}>5g]Gae_B0e@H^S};²< b7[1+ &d=pȷn!9 *&-تjvӝQ$R`hl9²欫zQL@YjְBugV7W vp;;/_/΁#O%κIn46Ɂc{B!@GB}s0_p9eIs?dQVsvn !!<}bAk 'C8A!w|5B+S+2Ų_>"_cOo{P(rL1Lz4\ ŝFNӔy@A6sUomxRSug`88j9CvĪ)19k'Z8~4l)In46ɁOH!(~99yGB>0䁀"QOFd?8&N@ $7'!>,**bۘB Sfo>Ͽ%Bu`- Wk*InHiڵ}E剂@إeU˿3X& .cjP; MrI&$asE=(.WT'q!BHKwfˏ;pս{ůUahl)In46aOWu'7Pf]1yJr"ʽ綰"Q#sNNqq'w;1< rt s%Bʈ(XE݊EdD46ɍ&9FcA9 :G<'p?)ɝOnT; 1܊ј[Q(%$Ɵn4<{sx^eF$R$7%9\rAA.cXYB\QJEP726ɍ&9Fc.C9 GZIcׅιBwݤuVXSKwMrI&$KP#(ȑ6̭Bׯ НƗQ;܊ј[R`nh̭@3q9Ҋ@?Ho9>(-Ҋh@ F$& r%9_2')rYH[E"ҝf$7%9%(ɑe rdw7yu/riNnݰ:Y 0w;h\܉,GfQ#c׮`_;)Jm/W0w;h\܉ GQ#[%[kdn~_9ΰ k/s$7%9%(AЇZI'22;2}!cdFcHMrIv^ІMr,RFtĶѧschl)In46ɑ8 V̭5EzM@Ixú[1s+@ ̭8܁Qgҥt!JUZPHh q9\Mr#m vN@:$֯ܜܶ/6ɍ&9FcP5$+8-FFpo^ $7@ lMrߣPU[)8A*tܚXBw1܊ј[-q9\.f НHڽ _p@ F$q9\WTZKya #$+= נ$7%9%(}rFAN;S*,AE[bŝFN .4wrGAWNB]/;*Us>~fsמ2:c>4MlCMlז8N 9gn7uћ|ڦA=t_TVB3VB3R;8q C}g;`·;`DDrCkC'0Drg=:q~Q'h->4HH"yh"yq wB5N8q?;`'y|qgh2|qgh281 ;a:S{㪾a?S>|qgh2|qghsq ީw3`f>Ms>τan%4s+an%4s+##@NX"9~{E#*lek3<3`DDrCɇN'>lL_>ܙ0KAs^G>DŽd<4a<4C#9$ј៸s1~ z;w1a$&9d$&㴇@N+[?O}Ŧv7~mSw0[ d[ 㴋@Nk0\#1:;`-;sLx"yh"9d䡉k&>9bNT}g>P>1`<4a<4&N9cuEsXշs3/-R(5lf2lf|qK ̭Pt:~rՇj]_ Ufn%4s+an%4s+}i7a_uOT [lHH"yh"y89&ÀML>5xAN#^O_ZK$M$ <4|I8@"9 PǏ^w;y}cGsUUC!C$M$q0a`m+^V)]wFP!&8)'`L̻0 [6m^ &CHH.Ëaz욺ǽ Qfwvx"yh"9d䡵8qնmo:{;EqV@Ӕ;?n{~٢9[/e̾O|lCQ~Ctm=('})HH0C[ErXHW_rr!Gә8Su7toicnj8KaWmywy^%9BYM^[^r_iCm_n]%yXc_%9,{zIVg NiKrq#̭t矘 U'wan%4s+an%̭#2DrXޣ?SWt:U*=~N,݉OC!C$-p$ǡ9d$Uu'&-cG%{~4U7^^6CI6C I.CrMrXgvN'U},g#\$6CI6C I.J's+2GzO}QU;vFQ~20ZqVJ a%+2aӦ/,7UM%&CHZ#8! $76=Nrh3T}4MlCMI.j 6ɡ?gO;n; Uw` 6CI6ù(+:85#C $3/8Yw؉UC=wݾu^]~%qH$%$&9d$CȡDrZ_OM;:T}RgGulgUүE"9d䡉!785'Ca󛿼w^16֘pގ]n񓪾_DrC!C$o,q@ irϮo?v\Q=ToGT-# CHH"y94HNە{昅?6waUCEr|Uէkq2DDrCȡ!ڶM'qvo眢(Ϊ-ܽ7T鬫F,cy{T}JV8 ̷vʠ۶RB$f$_}wn,/Pu$C Wmywy^%9mU>ݗ.ܼѩstF,?Xo7Ͻ5&/$/aiݻn9Kk/aI8KZǡrhs+]S՝?zLU= Y{rGLά~ `n2̭fn2̭Ԏ8 %C[ycT}CҝxxEW}J0VB3VjCȡ̭z[?,uםX9 Vgם~]IUү!̭@̭@ʉp94Zon/L\ 'a/rϮUү!̭@̭@ʈ@ gnu'㧞~O+D&+nu.LV}LF0VB3VFN r 뿲|ⱛ'/~EsXBekߧ>~̧7 Z#[ s+[ s+##C 9an/LS/Sܻ痯\Xz9U߲̭@̭@!1EQu_s_w/;FsݿszqṶ@̭@! 1EQtszyp):#>C~ݵnwsVqs+an%4s+aneqJ $zy/䶱#ʶ&O~_}eGeu)Ǐp޽?zao'T}j5(`n2̭fn2̭Mȡ%$=bهu:cGT}Sӕގٿ-{~gwq/!Kм$ /ɳqhZKrXD7޽f&'<t|J_Ϟe+12$Kr|I8PyVKrXB7޽[է'8Wjo~n쎽oXgd'U8~%yh^C/"CK B^2z݉n킢(÷N߾5{[|)ǯ|[/!}{~}Շ@]M?|I@]w>y5|iՇ@]M|(B>@E?gsEշ@Stf&~g?37sNg}7 LY>Wxl}7?bfU4L_/;O8{D|uW ?hG$ǁ(ry^LLMLuGY4kƬ[}O-;g,rEw_ُ?%yh^CFK^ 0?3yeO^|WLc^Yt:y]=ovu*w=wLgZK"9d䡉k$(ʧv_toNs@^r䰴]%yXKrxNy;Wv>E*#2wn9U$ d[ JjB *')<42DDr8@jD jA$R"yh"9d䡉 5#!)<42DDrKjH jE$R"yh"9d䡉䴏8Ԕ@ԎHDDrCiq1%H䡉!&8Ԝ@ԖHDDrCɉK@ jM$R"yh"9d䡉# !')<42DDrǁȁFɁHH"yh"9' #!)<42DDrKH E$R"yh"9d䡉484@4HDDrCiqh0h$H䡉!&S8p9X"9C!C$M$q h4H䡉!&S?8@4HDDrCɩqD BɁHH"yh"9ǁ`r H䡉!&SqH BɁHH"yh"9'A @8"9C!C$M$gtq 0I$R"yh"9d䡉 8'a@J$M$ <4!\BBȁDr %&CHHt]By8D'@J$M$ <4ǁȁVɁHH"yh"9 "!)<42DDr@G ZE$R"yh"9d䡉䬂8@HDDrCYqh/h%H䡉!&qh7h-H䡉!& q@ ZM$R"yh"9d䡉,B( @$"&CHHNB8@ (Dr`"yh"9d䡉8r@J$M$ <4qC H䡉!&8"9C!C$M$oq`)9"Dr %&CHH 8rr%@J$M$ <4<4q G XHDDrCC!d@J$M$ <4<q_9@Dr %&CHH89@Dr %&CHHh8J + )<42DDFVC X!H䡉!&78Z9*@J$M$ <4qVI$R"yh"9d䡉&@"9C!C$M$%q`r5ɁHH"yh"y" HDDrCkA$`@Dr %&CHH^)q`rɁHH"yh"y%qaL$R"yh"9d䡉#% @0"9C!C$M$ q`r!ɁHH"yh"P& HDDrCɇB`Dr %&CHH>P8# )<42DDFI H䡉!&80j9@J$M$ <4|Uq*#&)<42DD"T@$R"yh"9d䡉}$TD$R"yh"9d䡉&TH$R"yh"9d䡉@ HDDrC"ԅ@P"9C!C$M$/B&Dr %&CHZ#8P79@@J$M$ #8f9@K@J$M$ z>s+@JhV JH_*N3[!ԇ@ADr %&CH8r^D$R"yh"9d!,I `Q"9C!C$o4qe ,I$R"yh"9d$%,H䡉!78@_rDr %&CH8}HDDrkM`Er&)<42DZX1ɁHH"y@@J$M$ qVM `UDr %&CH^)q5X5H䡉!WB`rD$R"yh"9d#%09k&)<42DɁHH"P @@J$M$ |(qN `Dr %&CH>P8C!0p"9C!C$q H䡉!8P HDDrWE`rJ$R"yh"9d+"09C')<42D@H@J$M$ |Y8#%02"9C!C$_8 HDDr"P ɁHH"yQ8HDDrhy$@@e^ϼ(HH-8HDDrhY$ʉ@J$M$DrqH䡉<Ԋ@@m@J$M$\vrjE$R"yh"9d8$P;"9C!#H$-ZɁHH 8&P["9C!\rjM$R"yh"9d4,4@@@J$M$DrqhH䡉QH.(9!)<42jqG QDr %&CF"8@# 4HDDrȨI$h,FɁHHGrqFh,H䡉QQ$h<FɁHH#8!4HDDrQ$C  H䡉1H.@@"9C!cH\ PDr %&Cƀ#8@H9@J$M$ErqrBɁHHk8 %)<42VqUIDATM$R"yh"9d0@@x"9C!H.9 )<422\UrZC$R"yh"9d,qZG UDr %&C!8-$:WmV^8sNQgU}P|l9Xs7umc@um=ӝy}U}@@+]]z@QEΛO< .>KrXJ#v;><_%P2̭fnչv Omh-VɁHH(rɁ䡉P8/Ɂ䡉䴜8)')<4P9$Dr %&28,F C@J$M$%qX@ɁHHNp8,G %@J$M$'(qrrXHDDr9d@J$M$'q%@Dr %&p8@}ɁHHNCR9HDDrF`Dr %&8@ )<4`-rX%H䡉Ԕ8k%@J$M$fqH$R"yh"95!0"9Cɩ8$@J$M$"8 @$)<4`r0H䡉䌈8"@J$M$gq&D$R"yh"9C" 0D"9C0qFA !ɁHH΀0*9HDDrHQ`DDr %&J8@#$)<4 9HDDr$@UrHDDr2q@ɁHHq@ɁHH!q*&)<4P9ԀHDDNr H䡉%@P#"9C[G:fDr %&8u%@ @J$M$O:Dr %&%@ Pc"9C r9H䡉a94HDDIrhH䡉%@ "9CG&aDr %&78M%@@J$M$=qL ɁHH^W'W\94HDD׬?#@ p"9CB0r@$R"yh"yqE  Dr %&WEprD$R"yh"@@J$M$q H䡉&@h9%)<4|XqO Dr %&8 @p"9CEDr %&8"@K@J$M$_-qZG ɁHHR8@-#)<4_8@-$)<4H䡵/"r "9CkO$%@J$-~$eDr %7@@,I$R"yh"8A %)<8\$Y"9Ck~$@J$\VH &)P@J$mp\FD N$R"yhk80B90"9C[}$ɁH#8T@ FJ$R"yhGrq@HD\*$ɁHґ\*&ɁHڋ#8Ԁ@TJ$R"yh/D{~[@-p򹝝Eo73ټ,_oy:_Bէa=n?-ʪo}zOܥEQU} sMQWv:/ZZɁH8Ԏ@ԎHDqrDr %78Ԗ@ԖHDFZZɁH(8P{9P{"9AA A$R"y@c@c@J$%qhhH"##)qrDr %WJK K$R"y%qrDr %84@4HD򑸶(+qr HC%a@"9ɇBBPDr %8#@J$qI BɁH&8@%)|Uq 4M$R"@x9HD@+@+@J$_8@HDE@@@J$?8@HD(qrDr H.%%Frqh5h5H,@ @@%\(r(Dr`#8<y"9 q@ɁTH.B 8HDrq`9"Dr H.,A XHqeɁT"8!d@!\@H<}$Frq`rɁT"8B9 @&\X`Dr Uq$VI X%HUq5@$R#8 k$Erq`rɁԐ#80 9@jH\ `Dr 5H. @0`"9P$@ H1C" HVq!H$R+8 C&>#809@*qFD$RKDrq`rɁ!\1`Dr }z?d\)@PCN>(]-@:׮?-8- IS[OEQo$T r [6&TL$6@ D &DrhqNr!2qnr!"qr!qr!qrɡqjN$&@ hDh !DrhqIrɡqF$:H h Dh*DrqrɡJ8@ 'CqrDr%q  FAD D$aaqrDr$q * (AL L$a5q6Z@$B h !@""9,GheDrX8F9@ J h)Bh7DrMh;DrI@ iqri q|HNl88HNL8/&""9,N `Q"91,M `I"9&<e48@@@HNG /"9 ?ԛ8HN=@ԋ8HN=@TK`mrD$8k'f"9%09!38#00"9%0X9%38'0p"9%09C!38#04"9k#0\9C%:8'0t"9+#09#!q@H,N`rFN$`8H~8Hv8HV8H2w@@--!P#9!'P39"%PC9##PS9$!Pc9ݽTe](86Ɛ@ 0/0cF+lBIbb($vnB0_1 ZHF#Ξ9g9M~y2Y"yˉ8&8@ qZH uD#R9$qh-a8-'j"yCq:@ Du&9 q |q:F SD! ט8@G tHFq:L  3Moi{y^&R.]Mmޗ䭦Oy7rNsAX?wSK4=M `l ^.o'jzˈ%2XرK-#ZbC`J<䱦2qc妇zN public/index.php000077500000000000000000000015311516072260400141620ustar00rootroot00000000000000get('date', 'timezone')) { date_default_timezone_set($config->get('date', 'timezone')); } $app = require '../boot.php'; $app->run(); public/web.config000066400000000000000000000057631516072260400143160ustar00rootroot00000000000000 scripts/000077500000000000000000000000001516072260400125505ustar00rootroot00000000000000scripts/build.sh000077500000000000000000000015041516072260400142060ustar00rootroot00000000000000#!/usr/bin/env bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" TOP=$DIR/.. set -e version=$( node -e "console.log(require('$TOP/package.json').version)" ) pkg_name=$( node -e "console.log(require('$TOP/package.json').name)" ) name=$pkg_name repo=$TOP/build/$name pushd $TOP npm install composer install --no-dev composer dump-autoload --optimize mkdir -p $TOP/cache #npm install npm run build rm -rf $repo || true mkdir -p $repo for item in "$TOP/cache" "$TOP/src" "$TOP/public" "$TOP/vendor" do echo $item cp -R $item $repo/ done for item in "$TOP/INSTALL.md" "$TOP/change-log.md" "$TOP/LICENSE" "$TOP/README.md" "$TOP/boot.php" "$TOP/config.example.ini" "$TOP/package.json" do echo $item cp $item $repo/ done rm -rf $repo/src/browser cp config.docker.ini $repo/config.ini pushd $repo popd popd scripts/init.cmd000066400000000000000000000013471516072260400142050ustar00rootroot00000000000000@echo off set CACHE=cache set GIT_TEST=git-test del /s /q %CACHE% rmdir /s /q %CACHE% mkdir %CACHE% del /s /q %GIT_TEST% rmdir /s /q %GIT_TEST% mkdir %GIT_TEST% copy artifacts\config.windows.ini .\config.ini pushd %GIT_TEST% for %%r in ("https://github.com/patrikx3/angular-compile" "https://github.com/patrikx3/onenote" "https://github.com/patrikx3/aes-folder" "https://github.com/patrikx3/ramdisk" "https://github.com/patrikx3/openwrt-insomnia" "https://github.com/patrikx3/gitlist" "https://github.com/patrikx3/resume-web" "https://github.com/patrikx3/service-manager-tray-for-windows" "https://github.com/patrikx3/docker-debian-testing-mongodb-stable" ) do ( echo %%r git clone --bare %%r ) popd composer install npm install scripts/init.sh000077500000000000000000000015321516072260400140530ustar00rootroot00000000000000#!/usr/bin/env bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" set -e sudo rm -rf ./cache mkdir -p ./cache touch ./cache/.gitkeep chmod 0770 ./cache sudo rm -rf ./git-test/ mkdir -p ./git-test/ pushd ./git-test for repo in "https://github.com/patrikx3/angular-compile" "https://github.com/patrikx3/onenote" "https://github.com/patrikx3/ramdisk" "https://github.com/patrikx3/openwrt-insomnia" "https://github.com/patrikx3/gitlist" "https://github.com/patrikx3/service-manager-tray-for-windows" do git clone --bare $repo done find . -name '*description*' | while read filename; do echo "$(dirname ${filename:2} | cut -f 1 -d '.') test repository." > $filename done popd sudo chmod 0777 ./git-test cp ./artifacts/config.ini ./ composer install chown $USER:$USER ./cache chown $USER:$USER ./git-test chown $USER:$USER ./config.ini scripts/optimize.sh000077500000000000000000000005231516072260400147470ustar00rootroot00000000000000#!/usr/bin/env bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" TOP=$DIR/.. set -e pushd $TOP sudo rm -rf ./cache mkdir -p ./cache touch ./cache/.gitkeep chmod 0770 ./cache composer install composer install --no-dev composer dump-autoload --optimize npm install --unsafe-perm npm run build --verbose rm -rf ./node_modules popd scripts/release.sh000077500000000000000000000023731516072260400145340ustar00rootroot00000000000000#!/usr/bin/env bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" TOP=$DIR/.. set -e version=$( node -e "console.log(require('$TOP/package.json').version)" ) pkg_name=$( node -e "console.log(require('$TOP/package.json').name)" ) name=$pkg_name-v$version repo=$TOP/build/$name pushd $TOP npm install if [ "$HOSTNAME" = "workstation" ]; then /usr/local/bin/composer install --no-dev /usr/local/bin/composer dump-autoload --optimize else composer install --no-dev composer dump-autoload --optimize fi mkdir -p $TOP/cache #npm install npm run build rm -rf $repo || true mkdir -p $repo for item in "$TOP/cache" "$TOP/src" "$TOP/public" "$TOP/vendor" do echo $item cp -R $item $repo/ done for item in "$TOP/INSTALL.md" "$TOP/change-log.md" "$TOP/LICENSE" "$TOP/README.md" "$TOP/boot.php" "$TOP/config.example.ini" "$TOP/package.json" do echo $item cp $item $repo/ done rm -rf $repo/src/browser zipname=$TOP/build/$name.zip rm -rf $zipname pushd $repo #sudo apt install -y zip zip -r $TOP/build/$name.zip . popd if [ $# -eq 0 ]; then rm -rf $repo else RELEASE=$TOP/build/release rm -rf $RELEASE || true mv $repo $RELEASE cp $TOP/config.ini $RELEASE || true cp -R $TOP/git-test $RELEASE/ || true fi popd scripts/web.config000066400000000000000000000057631516072260400145270ustar00rootroot00000000000000 scripts/www-git-optimize.sh000077500000000000000000000003451516072260400163540ustar00rootroot00000000000000#!/usr/bin/env bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" TOP=$DIR/.. set -e pushd $TOP git checkout -f . git pull chown git:www-data -R $PWD ./scripts/optimize.sh echo PWD: $PWD chown git:www-data -R $PWD popd src/000077500000000000000000000000001516072260400116505ustar00rootroot00000000000000src/GitList/000077500000000000000000000000001516072260400132275ustar00rootroot00000000000000src/GitList/Application.php000077500000000000000000000223221516072260400162070ustar00rootroot00000000000000path = realpath($root); $string = file_get_contents("../package.json"); $pkg = json_decode($string, true); $this['url_subdir'] = str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])); if ($this['url_subdir'] === '/') { $this['url_subdir'] = ''; } $this['debug'] = $config->get('app', 'debug'); $this['date.format'] = $config->get('date', 'format') ? $config->get('date', 'format') : 'd/m/Y H:i:s'; $this['theme'] = 'bootstrap'; $this['title'] = $config->get('app', 'title') ? $config->get('app', 'title') : 'P3X GitList ' . $pkg['version']; $this['filetypes'] = $config->getSection('filetypes'); $this['binary_filetypes'] = $config->getSection('binary_filetypes'); $this['cache.archives'] = $this->getCachePath() . 'archives'; $this['avatar.url'] = $config->get('avatar', 'url'); $this['avatar.query'] = $config->get('avatar', 'query'); $this['show_http_remote'] = $config->get('clone_button', 'show_http_remote'); $this['use_https'] = $config->get('clone_button', 'use_https'); $this['ssh_clone_subdir'] = $config->get('clone_button', 'ssh_clone_subdir'); $this['repo_paging'] = $config->get('app', 'repo_paging') !== false ? $config->get('app', 'repo_paging') : 10; if (!isset($_SERVER['PHP_AUTH_USER'])) { $_SERVER['PHP_AUTH_USER'] = ''; } $this['http_user'] = $config->get('clone_button', 'http_user_dynamic') ? $_SERVER['PHP_AUTH_USER'] : $config->get('clone_button', 'http_user'); $this['show_ssh_remote'] = $config->get('clone_button', 'show_ssh_remote'); $this['ssh_user'] = $config->get('clone_button', 'ssh_user_dynamic') ? $_SERVER['PHP_AUTH_USER'] : $config->get('clone_button', 'ssh_user'); $this['git_http_subdir_calculated'] = $config->get('clone_button', 'git_http_subdir_calculated') ? $config->get('clone_button', 'git_http_subdir_calculated') : true; $this['git_http_subdir'] = $config->get('clone_button', 'git_http_subdir') ? $config->get('clone_button', 'git_http_subdir') : ''; $this['fixed_navbar'] = $config->get('app', 'fixed_navbar') ? $config->get('app', 'fixed_navbar') : true; // Register services $this->register(new TwigServiceProvider(), array( 'twig.path' => array($this->getThemePath($this['theme'])), 'twig.options' => $config->get('app', 'cache') ? array('cache' => $this->getCachePath() . 'views') : array(), )); $repositories = $config->get('git', 'repositories'); $this['git.projects'] = $config->get('git', 'project_list') ? $this->parseProjectList($config->get('git', 'project_list')) : false; $this->register(new GitServiceProvider(), array( 'config' => $config, 'git.client' => $config->get('git', 'client'), 'git.repos' => $repositories, 'ini.file' => "config.ini", 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(), 'git.default_branch' => $config->get('git', 'default_branch') ? $config->get('git', 'default_branch') : 'master', 'git.strip_dot_git' => $config->get('git', 'strip_dot_git') )); $this->register(new ViewUtilServiceProvider()); $this->register(new RepositoryUtilServiceProvider()); $this->register(new RoutingUtilServiceProvider()); $enable_editing = (boolean)$config->get('app', 'enable_editing'); $this['twig'] = $this->extend('twig', function ($twig, $app) use ($pkg, $config, $enable_editing) { $twig->addFilter(new TwigFilter('to_id', function ($value) { $value = str_replace(['.', '/', '\\', ' '], '-', $value); $value = strtolower($value); return $value; })); $twig->addFilter(new TwigFilter('remove_extension', function ($string) { return pathinfo($string, PATHINFO_FILENAME); })); $twig->addFilter(new TwigFilter('htmlentities', 'htmlentities')); $twig->addFilter(new TwigFilter('md5', 'md5')); $twig->addFilter(new TwigFilter('format_date', array($app, 'formatDate'))); $twig->addFilter(new TwigFilter('format_size', array($app, 'formatSize'))); $twig->addFunction(new TwigFunction('avatar', array($app, 'getAvatar'))); $currentTheme = !isset($_COOKIE['gitlist-bootstrap-theme']) ? 'bootstrap-cosmo' : $_COOKIE['gitlist-bootstrap-theme']; $themeDark = [ 'cyborg', 'darkly', 'slate', 'superhero', 'solar', ]; $twig->addGlobal('theme_type', !in_array(substr($currentTheme, strlen('bootstrap-')), $themeDark) ? 'p3x-gitlist-light' : 'p3x-gitlist-dark'); $twig->addGlobal('theme', $currentTheme); $query = isset($_REQUEST['query']) ? $_REQUEST['query'] : (isset($_COOKIE['p3x-gitlist-query']) ? $_COOKIE['p3x-gitlist-query'] : ''); setcookie('p3x-gitlist-query', $query, 0, '/' . $this['url_subdir']); $_COOKIE['p3x-gitlist-query'] = $query; $twig->addGlobal('search_query', $query); $twig->addGlobal('theme_postfix', $pkg['corifeus']['css-postfix']); $twig->addGlobal('prod_dir', $pkg['corifeus']['prod-dir']); $twig->addGlobal('theme_dark', $themeDark); $twig->addGlobal('version', $pkg['version']); $twig->addGlobal('gitlist_date_format', $this['date.format']); $codemirror_full_limit = (int)$config->get('app', 'codemirror_full_limit'); if (!is_int($codemirror_full_limit) || $codemirror_full_limit < 32) { $codemirror_full_limit = 32; } $twig->addGlobal('codemirror_full_limit', $codemirror_full_limit); $twig->addGlobal('enable_editing', $enable_editing ? 1 : 0); return $twig; }); $this['enable_editing'] = $enable_editing ? 1 : 0; $this['escaper.argument'] = $this->factory(function () { return new Escaper\ArgumentEscaper(); }); // Handle errors $this->error(function (\Exception $e, $code) use ($app) { if ($app['debug']) { return; } return $app['twig']->render('error.twig', array( 'message' => $e->getMessage(), )); }); $this->finish(function () use ($app, $config) { if (!$config->get('app', 'cache')) { $fs = new Filesystem(); $fs->remove($app['cache.archives']); } }); } public function getCachePath() { return $this->path . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR; } public function getThemePath($theme) { return $this->path . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'twig' . DIRECTORY_SEPARATOR; } public function parseProjectList($project_list) { $projects = array(); $file = fopen($project_list, "r"); while ($file && !feof($file)) $projects[] = trim(fgets($file)); fclose($file); return $projects; } public function formatDate($date) { return $date->format($this['date.format']); } public function formatSize($bytes, $precision = 0) { $size = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; $factor = floor((strlen($bytes) - 1) / 3); return sprintf("%.{$precision}f", $bytes / pow(1024, $factor)) . @$size[$factor]; } public function getAvatar($email, $size) { $url = $this['avatar.url'] ? $this['avatar.url'] : "//gravatar.com/avatar/"; $query = array("s=$size"); if (is_string($this['avatar.query'])) $query[] = $this['avatar.query']; else if (is_array($this['avatar.query'])) $query = array_merge($query, $this['avatar.query']); $id = md5(strtolower($email)); return $url . $id . "?" . implode('&', $query); } public function getPath() { return $this->path . DIRECTORY_SEPARATOR; } public function setPath($path) { $this->path = $path; return $this; } } src/GitList/Config.php000066400000000000000000000033371516072260400151530ustar00rootroot00000000000000data = $data; } public static function fromFile($file) { if (!file_exists($file)) { die(sprintf('Please, create the %1$s file.', $file)); } $data = parse_ini_file($file, true); $config = new static($data); $config->validateOptions(); return $config; } protected function validateOptions() { $repositories = $this->get('git', 'repositories'); $atLeastOneOk = false; $atLeastOneWrong = false; foreach ($repositories as $directory) { if (!$directory || !is_dir($directory)) { $atLeastOneWrong = true; } else { $atLeastOneOk = true; } } if (!$atLeastOneOk) { die("Please, edit the config file and provide your repositories directory"); } if ($atLeastOneWrong) { die("One or more of the supplied repository paths appears to be wrong. Please, check the config file"); } } public function get($section, $option) { if (!array_key_exists($section, $this->data)) { return false; } if (!array_key_exists($option, $this->data[$section])) { return false; } return $this->data[$section][$option]; } public function getSection($section) { if (!array_key_exists($section, $this->data)) { return false; } return $this->data[$section]; } public function set($section, $option, $value) { $this->data[$section][$option] = $value; } } src/GitList/Controller/000077500000000000000000000000001516072260400153525ustar00rootroot00000000000000src/GitList/Controller/BlobController.php000066400000000000000000000071661516072260400210170ustar00rootroot00000000000000get('{repo}/blob/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); list($branch, $file) = $app['util.routing'] ->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); $blob = $repository->getBlob("$branch:\"$file\""); $breadcrumbs = $app['util.view']->getBreadcrumbs($file); $fileType = $app['util.repository']->getFileType($file); $binary = $app['util.repository']->isBinary($file) && $fileType !== 'image'; /* if ($fileType !== 'image' && $app['util.repository']->isBinary($file)) { return $app->redirect($app['url_generator']->generate('blob_raw', array( 'repo' => $repo, 'commitishPath' => $commitishPath, ))); } */ if (!$binary) { $output = $blob->output(); } else { $output = ''; } $extension = ''; $pathinfo = (pathinfo($file)); if (isset($pathinfo['extension'])) { $extension = $pathinfo['extension']; } return $app['twig']->render('file.twig', array( 'binary' => $binary, 'fileSize' => strlen($output), 'extension' => $extension, 'file' => $file, 'fileType' => $fileType, 'blob' => $output, 'repo' => $repo, 'breadcrumbs' => $breadcrumbs, 'branch' => $branch, 'branches' => $repository->getBranches(), 'browse_type' => 'blob', 'tags' => $repository->getTags(), 'enforceCodemirror' => isset($_GET['codemirror']) )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', '.+') ->convert('commitishPath', 'escaper.argument:escape') ->bind('blob'); $route->get('{repo}/raw/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); list($branch, $file) = $app['util.routing'] ->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); $blob = $repository->getBlob("$branch:\"$file\"")->output(); $headers = array(); if ($app['util.repository']->isBinary($file)) { $headers['Content-Disposition'] = 'attachment; filename="' . $file . '"'; $headers['Content-Type'] = 'application/octet-stream'; } else { $headers['Content-Type'] = 'text/plain'; } return new Response($blob, 200, $headers); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->convert('commitishPath', 'escaper.argument:escape') ->bind('blob_raw'); return $route; } } src/GitList/Controller/CommitController.php000066400000000000000000000216241516072260400213640ustar00rootroot00000000000000get('{repo}/commits/search', function (Request $request, $repo) use ($app) { $subRequest = Request::create( '/' . $repo . '/commits/master/search', 'POST', array('query' => $request->get('query')) ); return $app->handle($subRequest, \Symfony\Component\HttpKernel\HttpKernelInterface::SUB_REQUEST); })->assert('repo', $app['util.routing']->getRepositoryRegex()); $route->get('{repo}/commits/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($commitishPath === null) { $commitishPath = $repository->getHead(); } list($branch, $file) = $app['util.routing'] ->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); $type = $file ? "$branch -- \"$file\"" : $branch; $binary = false; $breadcrumbs = [ [ 'dir' => 'Commit list', 'path' => '', ] ]; if ($file !== '') { $binary = $app['util.repository']->isBinary($file); $breadcrumbs = $app['util.view']->getBreadcrumbs($file); } $pager = $app['util.view']->getPager($app['request_stack']->getCurrentRequest()->get('page'), $repository->getTotalCommits($type)); $commits = $repository->getPaginatedCommits($type, $pager['current']); $categorized = array(); foreach ($commits as $commit) { $date = $commit->getCommiterDate(); $date = $date->format('Y-m-d'); $categorized[$date][] = $commit; } $template = $app['request_stack']->getCurrentRequest()->isXmlHttpRequest() ? 'commits-list.twig' : 'commits.twig'; return $app['twig']->render($template, array( 'page' => 'commits', 'pager' => $pager, 'repo' => $repo, 'branch' => $branch, 'binary' => $binary, 'breadcrumbs' => $breadcrumbs, 'branches' => $repository->getBranches(), 'browse_type' => pathinfo($template)['filename'], 'tags' => $repository->getTags(), 'commits' => $categorized, 'file' => $file, )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->value('commitishPath', null) ->convert('commitishPath', 'escaper.argument:escape') ->bind('commits'); $route->post('{repo}/commits/{branch}/search', function (Request $request, $repo, $branch = '') use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $query = $request->get('query'); $commits = $repository->searchCommitLog($query, $branch); $categorized = []; foreach ($commits as $commit) { $date = $commit->getCommiterDate(); $date = $date->format('Y-m-d'); $categorized[$date][] = $commit; } return $app['twig']->render('searchcommits.twig', array( 'repo' => $repo, 'branch' => $branch, 'file' => '', 'commits' => $categorized, 'branches' => $repository->getBranches(), 'browse_type' => 'searchcommits', 'tags' => $repository->getTags(), 'query' => $query )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->convert('branch', 'escaper.argument:escape') ->bind('searchcommits'); $route->get('{repo}/commit/{commit}', function (Request $request, $repo, $commit) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $showLines = $request->get('ajax') === '1' || $app['request_stack']->getCurrentRequest()->isXmlHttpRequest(); $filename = $request->get('filename'); $commit = $repository->getCommit($commit, [ "showLines" => $showLines, 'filename' => $filename, ]); $branch = $repository->getHead(); if ($request->get('ajax') === '1' || $app['request_stack']->getCurrentRequest()->isXmlHttpRequest()) { $diffsInstance = $commit->getDiffs(); $diffs = []; foreach ($diffsInstance as $diffInstance) { $lines = []; foreach ($diffInstance->getLines() as $lineInstance) { $line = $lineInstance->getLine(); $lines[] = (object)[ 'type' => $lineInstance->getType(), 'num-old' => $lineInstance->getNumOld(), 'num-new' => $lineInstance->getNumNew(), 'line' => $line, // 'line' => utf8_encode($lineInstance->getLine()), //'line' => iconv('latin2', 'utf-8', $lineInstance->getLine()), //'line' => mb_convert_encoding( $lineInstance->getLine(), 'ISO-8859-2', 'utf-8'), ]; } $old = $diffInstance->getOld(); if ($old !== null) { $old = trim($old); } $new = $diffInstance->getNew(); if ($new !== null) { $new = trim($new); } $index = $diffInstance->getIndex(); if ($index !== null) { $index = trim($index); } $diffs[] = (object)[ 'binary' => $diffInstance->getBinary(), 'file' => $diffInstance->getFile(), 'old' => $old, 'new' => $new, 'index' => $index, 'lines' => $lines, ]; } return new JsonResponse($diffs, 200, array('Content-Type' => 'application/json; charset=utf-8')); //return $app->json($diffs); }; if (isset($_GET['delete-branch'])) { $branch = $_GET['delete-branch']; } return $app['twig']->render('commit.twig', array( 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'browse_type' => 'commit', 'branch' => $branch, 'repo' => $repo, 'commit' => $commit, )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commit', '[a-f0-9^]+') ->bind('commit'); $route->get('{repo}/blame/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); list($branch, $file) = $app['util.routing'] ->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); $blames = $repository->getBlame("$branch -- \"$file\""); $breadcrumbs = $app['util.view']->getBreadcrumbs($file); return $app['twig']->render('blame.twig', array( 'file' => $file, 'type' => $app['util.repository']->getFileType($file), 'binary' => $app['util.repository']->isBinary($file), 'repo' => $repo, 'branch' => $branch, 'branches' => $repository->getBranches(), 'browse_type' => 'blame', 'breadcrumbs' => $breadcrumbs, 'tags' => $repository->getTags(), 'blames' => $blames, )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->convert('commitishPath', 'escaper.argument:escape') ->bind('blame'); return $route; } } src/GitList/Controller/GitController.php000066400000000000000000000125161516072260400206570ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace GitList\Controller; use Gitlist\Application as GitlistApp; use Gitter\Repository; use Silex\Application; use Silex\Api\ControllerProviderInterface; use Symfony\Component\HttpFoundation\Request; use TheSeer\Tokenizer\Exception; class GitController implements ControllerProviderInterface { public function connect(Application $app) { $route = $app['controllers_factory']; $route->post('{repo}/git-helper/{branch}/{action}', function (Request $request, $repo, $branch = '', $action = '') use ($app) { $repository = ($app['git']->getRepositoryFromName($app['git.repos'], $repo)); $hadError = false; try { if ($repository instanceof Repository && $app instanceof GitlistApp) { $filename = $request->get('filename'); if ($filename !== null) { $filename = trim($filename); } $value = $request->get('value'); $email = $request->get('email'); $name = $request->get('name'); $comment = $request->get('comment'); switch ($action) { case 'save': if (!$app['enable_editing']) { throw new \Error('Editing is disabled'); } $objectResult = $repository->changeFile($app->getCachePath(), $repo, $branch, $filename, $value, $name, $email, $comment); return json_encode($objectResult); case 'delete': if (!$app['enable_editing']) { throw new \Error('Editing is disabled'); } $objectResult = $repository->deleteFile($app->getCachePath(), $repo, $branch, $filename, $name, $email, $comment); return json_encode($objectResult); break; case 'new-file-or-directory': if (!$app['enable_editing']) { throw new \Error('Editing is disabled'); } $objectResult = $repository->newFileOrDirectory($app->getCachePath(), $repo, $branch, $filename, $name, $email, $comment); return json_encode($objectResult); break; case 'file-binary': if (!$app['enable_editing']) { throw new \Error('Editing is disabled'); } $objectResult = $repository->newFileBinary($app->getCachePath(), $repo, $branch, $filename, $name, $email, $comment, $request->get('override') === '1' ? true : false, $_FILES['upload-file']); return json_encode($objectResult); /* return json_encode((object)[ 'filename' => $filename, 'email' => $email, 'name' => $name, 'comment' => $comment, 'upload-file' => $_FILES['upload-file'], 'override' => $request->get('override'), ]); */ break; case 'fetch-origin': try { $objectResult = $repository->fetchOrigin(); return json_encode($objectResult); } catch (\Exception $e) { return json_encode(((object)[ 'status' => 'error', 'error' => true, //'temporaryDirectory' => $tempRepo, 'message' => $e->getMessage(), 'trace' => $e->getTrace(), //'$filename' => $filename, //'$value' => $value, ])); } break; default: return json_encode((object)[ 'status' => 'error', 'error' => true, 'message' => 'Un-implemented action "' . $action . '".', ]); } } } catch (\Throwable $e) { $hadError = $e; } finally { if ($hadError !== false) { return json_encode((object)[ 'status' => 'error', 'error' => true, 'message' => $hadError->getMessage(), ]); } } }); return $route; } } src/GitList/Controller/MainController.php000066400000000000000000000131561516072260400210210ustar00rootroot00000000000000post('/json-error', function (Request $request) use ($app) { return $app['twig']->render('error.twig', array( 'error' => $request->get('error'), )); })->bind('json-error'); $route->get('/', function () use ($app) { $repositories = $app['git']->getRepositories($app['git.repos']); $lastCommit = []; foreach ($repositories as $repo) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo['name']); $command = 'log --graph --date-order --all -C -M -n 1 --date=rfc ' . '--pretty=format:"B[%D] C[%H] D[%ad] A[%an] E[%ae] H[%h] S[%s]"'; $rawRows = $repository->getClient()->run($repository, $command); $rawRows = explode(PHP_EOL, $rawRows); foreach ($rawRows as $row) { if (preg_match("/^(.+?)(\s(B\[(.*?)\])? C\[(.+?)\] D\[(.+?)\] A\[(.+?)\] E\[(.+?)\] H\[(.+?)\] S\[(.+?)\])?$/", $row, $output)) { if (!isset($output[4])) { $graphItems[] = array( "relation" => $output[1] ); continue; } $branch = $output[4]; $branchArray = explode('->', $branch); if (isset($branchArray[1])) { $branch = trim($branchArray[1]); } $repositories[$repo['name']]['time'] = $output[6]; $repositories[$repo['name']]['timestamp'] = strtotime($output[6]); $repositories[$repo['name']]['user'] = $output[7]; $repositories[$repo['name']]['branch'] = $branch; $repositories[$repo['name']]['key'] = $repo['name']; /* $graphItems[] = array( "relation"=>$output[1], "branch"=>$output[4], "rev"=>$output[5], "date"=>$output[6], "author"=>$output[7], "author_email"=>$output[8], "short_rev"=>$output[9], "subject"=>preg_replace('/(^|\s)(#[[:xdigit:]]+)(\s|$)/', '$1$2$3', $output[10]) ); */ } } } /* uksort($repositories, function($a, $b) use ($repositories) { $timestampA = isset($repositories[$a]['timestamp']) ? $repositories[$a]['timestamp'] : -1; $timestampB = isset($repositories[$b]['timestamp']) ? $repositories[$b]['timestamp'] : -1; return $timestampA < $timestampB ? 1 : -1; }); */ return $app['twig']->render('index.twig', array( 'repositories' => $repositories, 'branch' => '', 'repo' => '', )); })->bind('homepage'); $route->get('/refresh', function (Request $request) use ($app) { # Go back to calling page return $app->redirect($request->headers->get('Referer')); })->bind('refresh'); $route->get('{repo}/stats/{branch}', function ($repo, $branch) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($branch === null) { $branch = $repository->getHead(); } $stats = $repository->getStatistics($branch); $authors = $repository->getAuthorStatistics($branch); return $app['twig']->render('stats.twig', array( 'repo' => $repo, 'branch' => $branch, 'branches' => $repository->getBranches(), 'browse_type' => 'stats', 'tags' => $repository->getTags(), 'stats' => $stats, 'authors' => $authors, )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->value('branch', null) ->convert('branch', 'escaper.argument:escape') ->bind('stats'); $route->get('{repo}/{branch}/rss/', function ($repo, $branch) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($branch === null) { $branch = $repository->getHead(); } $commits = $repository->getPaginatedCommits($branch); $html = $app['twig']->render('rss.twig', array( 'repo' => $repo, 'branch' => $branch, 'commits' => $commits, )); return new Response($html, 200, array('Content-Type' => 'application/xml')); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->value('branch', null) ->convert('branch', 'escaper.argument:escape') ->bind('rss'); return $route; } } src/GitList/Controller/NetworkController.php000066400000000000000000000121011516072260400215530ustar00rootroot00000000000000get('{repo}/network/{commitishPath}/{page}.json', function ($repo, $commitishPath, $page) use ($app) { /** @var $repository Repository */ $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($commitishPath === null) { $commitishPath = $repository->getHead(); } $pager = $app['util.view']->getPager($page, $repository->getTotalCommits($commitishPath)); $commits = $repository->getPaginatedCommits($commitishPath, $pager['current']); $jsonFormattedCommits = array(); foreach ($commits as $commit) { $detailsUrl = $app['url_generator']->generate( 'commit', array( 'repo' => $repo, 'commit' => $commit->getHash() ) ); $jsonFormattedCommits[$commit->getHash()] = array( 'hash' => $commit->getHash(), 'parentsHash' => $commit->getParentsHash(), 'date' => $commit->getDate()->format('U'), 'message' => htmlentities($commit->getMessage()), 'details' => $detailsUrl, 'author' => array( 'name' => $commit->getAuthor()->getName(), 'email' => $commit->getAuthor()->getEmail(), 'image' => $app->getAvatar($commit->getAuthor()->getEmail(), 40) ) ); } $nextPageUrl = null; if ($pager['last'] !== $pager['current']) { $nextPageUrl = $app['url_generator']->generate( 'networkData', array( 'repo' => $repo, 'commitishPath' => $commitishPath, 'page' => $pager['next'] ) ); } // when no commits are given, return an empty response - issue #369 if (count($commits) === 0) { return $app->json( array( 'repo' => $repo, 'commitishPath' => $commitishPath, 'nextPage' => null, 'start' => null, 'commits' => $jsonFormattedCommits ), 200 ); } return $app->json(array( 'repo' => $repo, 'commitishPath' => $commitishPath, 'nextPage' => $nextPageUrl, 'start' => $commits[0]->getHash(), 'commits' => $jsonFormattedCommits ), 200 ); } )->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->value('commitishPath', null) ->convert('commitishPath', 'escaper.argument:escape') ->assert('page', '\d+') ->value('page', '0') ->bind('networkData'); $route->get( '{repo}/network/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if ($commitishPath === null) { $commitishPath = $repository->getHead(); } list($branch, $file) = $app['util.routing']->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); return $app['twig']->render( 'network.twig', array( 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'browse_type' => 'network', 'repo' => $repo, 'branch' => $branch, 'commitishPath' => $commitishPath, ) ); } )->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->value('commitishPath', null) ->convert('commitishPath', 'escaper.argument:escape') ->bind('network'); return $route; } } src/GitList/Controller/TreeController.php000066400000000000000000000140351516072260400210310ustar00rootroot00000000000000get('{repo}/tree/{commitishPath}/', $treeController = function ($repo, $commitishPath = '') use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $head = $repository->getHead(); if (!$commitishPath) { $commitishPath = $head; } list($branch, $tree) = $app['util.routing']->parseCommitishPathParam($commitishPath, $repo); list($branch, $tree) = $app['util.repository']->extractRef($repository, $branch, $tree); $files = $repository->getTree($tree ? "$branch:\"$tree\"/" : $branch); $breadcrumbs = $app['util.view']->getBreadcrumbs($tree); $parent = null; if (($slash = strrpos($tree, '/')) !== false) { $parent = substr($tree, 0, $slash); } elseif (!empty($tree)) { $parent = ''; } return $app['twig']->render('tree.twig', array( 'head' => $head, 'files' => $files->output(), 'repo' => $repo, 'branch' => $branch, 'path' => $tree ? $tree . '/' : $tree, 'parent' => $parent, 'breadcrumbs' => $breadcrumbs, 'branches' => $repository->getBranches(), 'browse_type' => 'tree', 'tags' => $repository->getTags(), 'readme' => $app['util.repository']->getReadme($repository, $branch, $tree ? "$tree" : ""), )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->convert('commitishPath', 'escaper.argument:escape') ->bind('tree'); $route->post('{repo}/tree/{branch}/search', function (Request $request, $repo, $branch = '', $tree = '') use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); if (!$branch) { $branch = $repository->getHead(); } $query = $request->get('query'); $breadcrumbs = array(array('dir' => 'Search results for: ' . $query, 'path' => '')); $results = $repository->searchTree($query, $branch); if ($results === false) { $results = []; } for ($i = 0; $i < count($results); $i++) { $result = $results[$i]; $results[$i]['type'] = $app['util.repository']->getFileType($result['file']); } return $app['twig']->render('search.twig', array( 'results' => $results, 'repo' => $repo, 'path' => $tree, 'breadcrumbs' => $breadcrumbs, 'branch' => $branch, 'branches' => $repository->getBranches(), 'browse_type' => 'search', 'tags' => $repository->getTags(), 'query' => $query )); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->convert('branch', 'escaper.argument:escape') ->bind('search'); $route->get('{repo}/{format}ball/{branch}', function ($repo, $format, $branch) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $tree = $repository->getBranchTree($branch); if (false === $tree) { return $app->abort(404, 'Invalid commit or tree reference: ' . $branch); } $file = $app['cache.archives'] . DIRECTORY_SEPARATOR . $repo . DIRECTORY_SEPARATOR . substr($tree, 0, 2) . DIRECTORY_SEPARATOR . substr($tree, 2) . '.' . $format; if (!file_exists($file)) { $repository->createArchive($tree, $file, $format); } /** * Generating name for downloading, lowercasing and removing all non * ascii and special characters */ $filename = strtolower($repo . '-' . $branch); $filename = preg_replace('#[^a-z0-9]+#', '-', $filename); $shortHash = $repository->getShortHash($branch); $filename = $filename . '-' . $shortHash . '.' . $format; $response = new BinaryFileResponse($file); $response->setContentDisposition('attachment', $filename); return $response; })->assert('format', '(zip|tar)') ->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->convert('branch', 'escaper.argument:escape') ->bind('archive'); // this is weird ... was / , not working, i changed to \/ , now it works $route->get('{repo}\/{branch}', function ($repo, $branch) use ($app) { return $app->redirect($app['url_subdir'] . '/' . $repo . '/tree/' . $branch); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('branch', $app['util.routing']->getBranchRegex()) ->convert('branch', 'escaper.argument:escape') ->bind('branch'); $route->get('{repo}/', function ($repo) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $head = $repository->getHead(); return $app->redirect($app['url_subdir'] . '/' . $repo . '/tree/' . $head); })->assert('repo', $app['util.routing']->getRepositoryRegex()) ->bind('repository'); return $route; } } src/GitList/Controller/TreeGraphController.php000066400000000000000000000061271516072260400220160ustar00rootroot00000000000000get( '{repo}/treegraph/{commitishPath}', function ($repo, $commitishPath) use ($app) { $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $command = 'log --graph --date-order --all -C -M -n 100 --date=iso ' . '--pretty=format:"B[%d] C[%H] D[%ad] A[%an] E[%ae] H[%h] S[%s]"'; $rawRows = $repository->getClient()->run($repository, $command); $rawRows = explode(PHP_EOL, $rawRows); $graphItems = array(); foreach ($rawRows as $row) { if (preg_match("/^(.+?)(\s(B\[(.*?)\])? C\[(.+?)\] D\[(.+?)\] A\[(.+?)\] E\[(.+?)\] H\[(.+?)\] S\[(.+?)\])?$/", $row, $output)) { if (!isset($output[4])) { $graphItems[] = array( "relation" => $output[1] ); continue; } $graphItems[] = array( "relation" => $output[1], "branch" => $output[4], "rev" => $output[5], "date" => $output[6], "author" => $output[7], "author_email" => $output[8], "short_rev" => $output[9], "subject" => preg_replace('/(^|\s)(#[[:xdigit:]]+)(\s|$)/', '$1$2$3', $output[10]) ); } } if ($commitishPath === null) { $commitishPath = $repository->getHead(); } list($branch, $file) = $app['util.routing']->parseCommitishPathParam($commitishPath, $repo); list($branch, $file) = $app['util.repository']->extractRef($repository, $branch, $file); return $app['twig']->render( 'treegraph.twig', array( 'repo' => $repo, 'branch' => $branch, 'branches' => $repository->getBranches(), 'tags' => $repository->getTags(), 'browse_type' => 'treegraph', 'commitishPath' => $commitishPath, 'graphItems' => $graphItems, ) ); } )->assert('repo', $app['util.routing']->getRepositoryRegex()) ->assert('commitishPath', $app['util.routing']->getCommitishPathRegex()) ->value('commitishPath', null) ->convert('commitishPath', 'escaper.argument:escape') ->bind('treegraph'); return $route; } } src/GitList/Escaper/000077500000000000000000000000001516072260400146115ustar00rootroot00000000000000src/GitList/Escaper/ArgumentEscaper.php000066400000000000000000000003371516072260400204120ustar00rootroot00000000000000factory(function () use ($app) { return new Repository($app); }); } public function boot(Container $app) { } } src/GitList/Provider/RoutingUtilServiceProvider.php000066400000000000000000000010751516072260400230560ustar00rootroot00000000000000factory(function () use ($app) { return new Routing($app); }); } public function boot(Container $app) { } } src/GitList/Provider/ViewUtilServiceProvider.php000066400000000000000000000010411516072260400223320ustar00rootroot00000000000000factory(function () { return new View; }); } public function boot(Container $app) { } } src/GitList/Util/000077500000000000000000000000001516072260400141445ustar00rootroot00000000000000src/GitList/Util/Repository.php000066400000000000000000000157561516072260400170520ustar00rootroot00000000000000 'php', 'c' => 'text/x-csrc', 'h' => 'text/x-c++src', 'cpp' => 'text/x-c++src', 'cc' => 'text/x-c++src', 'm' => 'text/x-objectivec', 'mm' => 'text/x-objectivec', 'ino' => 'clike', 'cs' => 'text/x-csharp', 'java' => 'text/x-java', 'clj' => 'clojure', 'coffee' => 'coffeescript', 'css' => 'css', 'diff' => 'diff', 'ecl' => 'ecl', 'el' => 'erlang', 'go' => 'go', 'groovy' => 'groovy', 'hbs' => 'handlebars', 'hs' => 'haskell', 'lhs' => 'haskell', 'jsp' => 'application/x-jsp', 'asp' => 'htmlembedded', 'aspx' => 'htmlembedded', 'html' => 'htmlmixed', 'tpl' => 'htmlmixed', 'js' => 'javascript', 'ts' => 'application/typescript', 'json' => 'javascript', 'jsx' => 'jsx', 'less' => 'css', 'scss' => 'sass', 'lua' => 'lua', 'md' => 'markdown', 'markdown' => 'markdown', 'sql' => 'sql', 'swift' => 'swift', 'twig' => 'twig', 'ml' => 'ocaml', 'mli' => 'ocaml', 'pl' => 'perl', 'pm' => 'perl', 'pas' => 'pascal', 'ps1' => 'powershell', 'ini' => 'properties', 'cfg' => 'properties', 'nt' => 'ntriples', 'py' => 'python', 'rb' => 'ruby', 'rst' => 'rst', 'r' => 'r', 'lock' => 'javascript', 'sh' => 'shell', 'ss' => 'scheme', 'scala' => 'text/x-scala', 'scm' => 'scheme', 'sls' => 'scheme', 'sps' => 'scheme', 'rs' => 'rust', 'st' => 'smalltalk', 'tex' => 'stex', 'vbs' => 'vbscript', 'vb' => 'vbscript', 'v' => 'verilog', 'xml' => 'xml', 'xsd' => 'xml', 'xsl' => 'xml', 'xul' => 'xml', 'xlf' => 'xml', 'xliff' => 'xml', 'xaml' => 'xml', 'wxs' => 'xml', 'wxl' => 'xml', 'wxi' => 'xml', 'wsdl' => 'xml', 'svg' => 'xml', 'rss' => 'xml', 'rdf' => 'xml', 'plist' => 'xml', 'mxml' => 'xml', 'kml' => 'xml', 'glade' => 'xml', 'xq' => 'xquery', 'xqm' => 'xquery', 'xquery' => 'xquery', 'xqy' => 'xquery', 'yml' => 'yaml', 'yaml' => 'yaml', 'png' => 'image', 'jpg' => 'image', 'gif' => 'image', 'ico' => 'image', 'jpeg' => 'image', 'bmp' => 'image', 'csproj' => 'xml', 'iml' => 'xml', 'proto' => 'text/x-protobuf', ]; public function __construct(Application $app) { $this->app = $app; } /** * Returns the file type based on filename by treating the extension. * * The file type is used by CodeMirror, a Javascript-based IDE implemented in * GitList, to properly highlight the blob syntax (if it's a source-code) * * @param string $file File name * * @return mixed File type */ public function getFileType($file) { if ($file === 'Dockerfile') { return 'dockerfile'; }; if (($pos = strrpos($file, '.')) !== false) { $fileType = strtolower(substr($file, $pos + 1)); } else { return 'text'; } if (!empty($this->app['filetypes'])) { if (isset($this->app['filetypes'][$fileType])) { return $this->app['filetypes'][$fileType]; } } if (isset($this->defaultFileTypes[$fileType])) { return $this->defaultFileTypes[$fileType]; } return 'text'; } /** * Returns whether the file is binary. * * @param string $file * * @return bool */ public function isBinary($file) { if (($pos = strrpos($file, '.')) !== false) { $fileType = substr($file, $pos + 1); } else { return false; } if (!empty($this->app['binary_filetypes']) && array_key_exists($fileType, $this->app['binary_filetypes'])) { return $this->app['binary_filetypes'][$fileType]; } if (in_array($fileType, self::$binaryTypes)) { return true; } return false; } public function getReadme($repository, $branch = null, $path = '') { if ($branch === null) { $branch = $repository->getHead(); } if ($path != '') { $path = "$path/"; } $files = $repository->getTree($path != '' ? "$branch:\"$path\"" : $branch)->output(); foreach ($files as $file) { if (preg_match('/^readme*/i', $file['name'])) { return [ 'filename' => $file['name'], 'content' => $repository->getBlob("$branch:\"$path{$file['name']}\"")->output(), ]; } } // No contextual readme, try to catch the main one if we are in deeper context if ($path != '') { return $this->getReadme($repository, $branch, ''); } return []; } /** * Returns an Array where the first value is the tree-ish and the second is the path. * * @param \GitList\Git\Repository $repository * @param string $branch * @param string $tree * * @return array */ public function extractRef($repository, $branch = '', $tree = '') { $branch = trim($branch, '/'); $tree = trim($tree, '/'); $input = $branch . '/' . $tree; // If the ref appears to be a SHA, just split the string if (preg_match('/^([[:alnum:]]{40})(.+)/', $input, $matches)) { $branch = $matches[1]; } else { // Otherwise, attempt to detect the ref using a list of the project's branches and tags $validRefs = array_merge((array)$repository->getBranches(), (array)$repository->getTags()); foreach ($validRefs as $key => $ref) { if (!preg_match(sprintf('#^%s/#', preg_quote($ref, '#')), $input)) { unset($validRefs[$key]); } } // No exact ref match, so just try our best if (count($validRefs) > 1) { preg_match('/([^\/]+)(.*)/', $input, $matches); $branch = preg_replace('/^\/|\/$/', '', $matches[1]); } else { // Extract branch name $branch = array_shift($validRefs); } } return [$branch, $tree]; } } src/GitList/Util/Routing.php000066400000000000000000000115001516072260400163010ustar00rootroot00000000000000app = $app; } /* @brief Return $commitish, $path parsed from $commitishPath, based on * what's in $repo. Raise a 404 if $branchpath does not represent a * valid branch and path. * * A helper for parsing routes that use commit-ish names and paths * separated by /, since route regexes are not enough to get that right. * * @param string $commitishPath * @param string $repo * @return array */ public function parseCommitishPathParam($commitishPath, $repo) { $app = $this->app; $repository = $app['git']->getRepositoryFromName($app['git.repos'], $repo); $commitish = null; $path = null; $slashPosition = strpos($commitishPath, '/'); if (strlen($commitishPath) >= 40 && ($slashPosition === false || $slashPosition === 40)) { // We may have a commit hash as our commitish. $hash = substr($commitishPath, 0, 40); if (preg_match('/[^a-zA-Z0-9]/i', $hash) === 0) { if ($repository->hasCommit($hash)) { $commitish = $hash; } } } if ($commitish === null) { $branches = $repository->getBranches(); $tags = $repository->getTags(); if ($tags !== null && count($tags) > 0) { $branches = array_merge($branches, $tags); } $matchedBranch = null; $matchedBranchLength = 0; foreach ($branches as $branch) { if (strpos($commitishPath, $branch) === 0 && strlen($branch) > $matchedBranchLength) { $matchedBranch = $branch; $matchedBranchLength = strlen($matchedBranch); } } if ($matchedBranch !== null) { $commitish = $matchedBranch; } else { // We may have partial commit hash as our commitish. $hash = $slashPosition === false ? $commitishPath : substr($commitishPath, 0, $slashPosition); if ($repository->hasCommit($hash)) { $commit = $repository->getCommit($hash); $commitish = $commit->getHash(); } else { throw new EmptyRepositoryException('This repository is currently empty. There are no commits.'); } } } $commitishLength = strlen($commitish); $path = substr($commitishPath, $commitishLength); if (strpos($path, '/') === 0) { $path = substr($path, 1); } return array($commitish, $path); } public function getBranchRegex() { static $branchRegex = null; if ($branchRegex === null) { $branchRegex = '(?!/|.*([/.]\.|//|@\{|\\\\))[^\040\177 ~^:?*\[]+(?app['git']->getRepositories($this->app['git.repos']) ); usort( $quotedPaths, function ($a, $b) { return strlen($b) - strlen($a); } ); $regex = implode('|', $quotedPaths); } return $regex; } public function isWindows() { switch (PHP_OS) { case 'WIN32': case 'WINNT': case 'Windows': return true; default: return false; } } /** * Strips the base path from a full repository path * * @param string $repoPath Full path to the repository * @return string Relative path to the repository from git.repositories */ public function getRelativePath($repoPath) { if (strpos($repoPath, $this->app['git.repos']) === 0) { $relativePath = substr($repoPath, strlen($this->app['git.repos'])); return ltrim(strtr($relativePath, '\\', '/'), '/'); } else { throw new \InvalidArgumentException( sprintf("Path '%s' does not match configured repository directory", $repoPath) ); } } } src/GitList/Util/View.php000066400000000000000000000023411516072260400155670ustar00rootroot00000000000000 $path) { $breadcrumbs[] = array( 'dir' => $path, 'path' => implode('/', array_slice($paths, 0, $i + 1)), ); } return $breadcrumbs; } public function getPager($pageNumber, $totalCommits) { $pageNumber = (empty($pageNumber)) ? 0 : $pageNumber; $lastPage = intval($totalCommits / 15); // If total commits are integral multiple of 15, the lastPage will be commits/15 - 1. $lastPage = ($lastPage * 15 == $totalCommits) ? $lastPage - 1 : $lastPage; $nextPage = $pageNumber + 1; $previousPage = $pageNumber - 1; return array('current' => $pageNumber, 'next' => $nextPage, 'previous' => $previousPage, 'last' => $lastPage, 'total' => $totalCommits, ); } } src/Gitter/000077500000000000000000000000001516072260400131065ustar00rootroot00000000000000src/Gitter/Client.php000066400000000000000000000207071516072260400150430ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter; use Symfony\Component\Process\ExecutableFinder; use Symfony\Component\Process\Process; class Client { protected $defaultBranch; protected $hidden; protected $projects; protected $path; protected $stripDotGit; public function __construct($options = null) { $path = null; if (is_array($options)) { $this->setDefaultBranch($options['default_branch']); $this->setHidden($options['hidden']); $this->setProjects($options['projects'] ?? array()); $this->stripDotGit = $options['strip_dot_git']; $path = $options['path']; } if (!$path) { $finder = new ExecutableFinder(); $path = $finder->find('git', '/usr/bin/git'); } $this->setPath($path); } /** * Creates a new repository on the specified path * * @param string $path Path where the new repository will be created * @return Repository Instance of Repository */ public function createRepository($path, $bare = null) { if (file_exists($path . '/.git/HEAD') && !file_exists($path . '/HEAD')) { throw new \RuntimeException('A GIT repository already exists at ' . $path); } $repository = new Repository($path, $this); return $repository->create($bare); } public function run($repository, $command) { if (version_compare($this->getVersion(), '1.7.2', '>=')) { $command = '-c "color.ui"=false ' . $command; } $command = $this->getPath() . ' ' . $command; // echo $command; // echo "\n"; // echo $repository->getPath(); // echo "
"; // echo "
"; $process = Process::fromShellCommandline($command, $repository->getPath()); $process->setTimeout(180); $process->enableOutput(); $process->run(); if (!$process->isSuccessful()) { throw new \RuntimeException($process->getExitCode() . " - " . $process->getExitCodeText() . " - " . $process->getErrorOutput() . " - " . $process->getOutput()); } return $process->getOutput(); } public function getVersion() { static $version; if (null !== $version) { return $version; } $process = Process::fromShellCommandline($this->getPath() . ' --version'); $process->run(); if (!$process->isSuccessful()) { throw new \RuntimeException($process->getErrorOutput()); } $version = trim(substr($process->getOutput(), 12)); return $version; } /** * Get the current Git binary path * * @return string Path where the Git binary is located */ protected function getPath() { return ($this->path); } /** * Set the current Git binary path * * @param string $path Path where the Git binary is located */ protected function setPath($path) { $this->path = $path; return $this; } /** * Return name of default branch as a string. */ public function getDefaultBranch() { return $this->defaultBranch; } /** * Set default branch as a string. * * @param string $branch Name of branch to use when repo's HEAD is detached. * @return object */ protected function setDefaultBranch($branch) { $this->defaultBranch = $branch; return $this; } public function getRepositoryFromName($paths, $repo) { $repositories = $this->getRepositories($paths); $path = $repositories[$repo]['path']; return $this->getRepository($path); } /** * Searches for valid repositories on the specified path * * @param array $paths Array of paths where repositories will be searched * @return array Found repositories, containing their name, path and description sorted * by repository name */ public function getRepositories($paths) { $allRepositories = array(); foreach ($paths as $path) { $repositories = $this->recurseDirectory($path); if (empty($repositories)) { throw new \RuntimeException('There are no GIT repositories in ' . $path); } /** * Use "+" to preserve keys, only a problem with numeric repos */ $allRepositories = $allRepositories + $repositories; } $allRepositories = array_unique($allRepositories, SORT_REGULAR); uksort($allRepositories, function ($k1, $k2) { return strcasecmp(strtolower($k2), strtolower($k1)); }); return $allRepositories; } private function recurseDirectory($path, $appendPath = '') { $dir = new \DirectoryIterator($path); $repositories = array(); foreach ($dir as $file) { if ($file->isDot()) { continue; } if (strrpos($file->getFilename(), '.') === 0) { continue; } if (!$file->isReadable()) { continue; } if ($file->isDir()) { $isBare = file_exists($file->getPathname() . '/HEAD'); $isRepository = file_exists($file->getPathname() . '/.git/HEAD'); if ($isRepository || $isBare) { if (in_array($file->getPathname(), $this->getHidden())) { continue; } if ($isBare) { $description = $file->getPathname() . '/description'; } else { $description = $file->getPathname() . '/.git/description'; } if (file_exists($description)) { $description = file_get_contents($description); } else { $description = null; } if (($file->getExtension() == 'git') and $this->stripDotGit) { $repoName = $appendPath . pathinfo($file->getFilename(), PATHINFO_FILENAME); } else { $repoName = $appendPath . $file->getFilename(); } if (is_array($this->getProjects()) && !in_array($repoName, $this->getProjects())) { continue; } $repositories[$repoName] = array( 'name' => $repoName, 'path' => $file->getPathname(), 'description' => $description ); continue; } else { $repositories = array_merge($repositories, $this->recurseDirectory($file->getPathname(), $appendPath . $file->getFilename() . '/')); } } } return $repositories; } /** * Get hidden repository list * * @return array List of repositories to hide */ protected function getHidden() { return $this->hidden; } /** * Set the hidden repository list * * @param array $hidden List of repositories to hide * @return object */ protected function setHidden($hidden) { $this->hidden = $hidden; return $this; } /** * Get project list * * @return array List of repositories to show */ protected function getProjects() { return $this->projects; } /** * Set the shown repository list * * @param array $projects List of repositories to show */ protected function setProjects($projects) { $this->projects = $projects; return $this; } /** * Opens a repository at the specified path * * @param string $path Path where the repository is located * @return Repository Instance of Repository */ public function getRepository($path) { if (!file_exists($path) || !file_exists($path . '/.git/HEAD') && !file_exists($path . '/HEAD')) { throw new \RuntimeException('There is no GIT repository at ' . $path); } return new Repository($path, $this); } } src/Gitter/Model/000077500000000000000000000000001516072260400141465ustar00rootroot00000000000000src/Gitter/Model/AbstractModel.php000066400000000000000000000011011516072260400173740ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model; use Gitter\Repository; abstract class AbstractModel { protected $repository; public function getRepository(): Repository { return $this->repository; } public function setRepository(Repository $repository) { $this->repository = $repository; return $this; } } src/Gitter/Model/Blob.php000066400000000000000000000012761516072260400155430ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model; use Gitter\Repository; class Blob extends Item { public function __construct($hash, Repository $repository) { $this->setHash($hash); $this->setRepository($repository); } public function output() { $data = $this->getRepository()->getClient()->run($this->getRepository(), 'show ' . $this->getHash()); return $data; } public function isBlob() { return true; } } src/Gitter/Model/Branch.php000066400000000000000000000007561516072260400160640ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model; class Branch extends AbstractModel { protected $name; public function getName() { return $this->name; } public function setName($name) { $this->name = $name; return $this; } } src/Gitter/Model/Commit/000077500000000000000000000000001516072260400153765ustar00rootroot00000000000000src/Gitter/Model/Commit/Author.php000066400000000000000000000014531516072260400173540ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model\Commit; use Gitter\Model\AbstractModel; class Author extends AbstractModel { protected $name; protected $email; public function __construct($name, $email) { $this->setName($name); $this->setEmail($email); } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } public function getEmail() { return $this->email; } public function setEmail($email) { $this->email = $email; } } src/Gitter/Model/Commit/Commit.php000066400000000000000000000067021516072260400173440ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model\Commit; use Gitter\Model\Item; use Gitter\Model\Diff; use Gitter\Util\DateTime; class Commit extends Item { public $message; protected $shortHash; protected $treeHash; protected $parentsHash; protected $author; protected $date; protected $commiter; protected $commiterDate; protected $body; /** @var Diff[] */ protected $diffs; public function importData(array $data) { $this->setHash($data['hash']); $this->setShortHash($data['short_hash']); $this->setTreeHash($data['tree']); $this->setParentsHash(isset($data['parents']) ? array_filter(explode(' ', $data['parents'])) : array()); $this->setAuthor( new Author($data['author'], $data['author_email']) ); $this->setDate( new DateTime('@' . $data['date']) ); $this->setCommiter( new Author($data['commiter'], $data['commiter_email']) ); $this->setCommiterDate( new DateTime('@' . $data['commiter_date']) ); $this->setMessage($data['message']); if (isset($data['body'])) { $this->setBody($data['body']); } } public function getShortHash() { return $this->shortHash; } public function setShortHash($shortHash) { $this->shortHash = $shortHash; return $this; } public function getTreeHash() { return $this->treeHash; } public function setTreeHash($treeHash) { $this->treeHash = $treeHash; return $this; } public function getParentsHash() { return $this->parentsHash; } public function setParentsHash($parentsHash) { $this->parentsHash = $parentsHash; return $this; } public function getAuthor() { return $this->author; } public function setAuthor($author) { $this->author = $author; return $this; } public function getDate() { return $this->date; } public function setDate($date) { $this->date = $date; return $this; } public function getCommiter() { return $this->commiter; } public function setCommiter($commiter) { $this->commiter = $commiter; return $this; } public function getCommiterDate() { return $this->commiterDate; } public function setCommiterDate($commiterDate) { $this->commiterDate = $commiterDate; return $this; } public function getMessage() { return $this->message; } public function setMessage($message) { $this->message = $message; return $this; } public function getBody() { return $this->body; } public function setBody($body) { $this->body = $body; return $this; } public function getDiffs() { return $this->diffs; } public function setDiffs($diffs) { $this->diffs = $diffs; return $this; } public function getChangedFiles() { return sizeof($this->diffs); } public function isCommit() { return true; } } src/Gitter/Model/Commit/Diff.php000066400000000000000000000026761516072260400167720ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model\Commit; use Gitter\Model\AbstractModel; class Diff extends AbstractModel { public $lineCount = 0; /** @var DiffLine[] */ protected $lines; protected $index; protected $old; protected $new; protected $file; protected $binary = false; public function addLine($line, $oldNo, $newNo) { $this->lines[] = new DiffLine($line, $oldNo, $newNo); } public function getLines() { return $this->lines; } public function getIndex() { return $this->index; } public function setIndex($index) { $this->index = $index; } public function getOld() { return $this->old; } public function setOld($old) { $this->old = $old; } public function getNew() { return $this->new; } public function setNew($new) { $this->new = $new; } public function getFile() { return $this->file; } public function setFile($file) { $this->file = $file; } public function getBinary() { return $this->binary; } public function setBinary($bool) { $this->binary = true; } } src/Gitter/Model/Commit/DiffLine.php000066400000000000000000000027251516072260400175750ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model\Commit; use Gitter\Model\Line; class DiffLine extends Line { protected $numNew; protected $numOld; public function __construct($data, $numOld, $numNew) { parent::__construct($data); if (!empty($data)) { switch ($data[0]) { case '@': $this->numOld = '...'; $this->numNew = '...'; break; case '-': $this->numOld = $numOld; $this->numNew = ''; break; case '+': $this->numOld = ''; $this->numNew = $numNew; break; default: $this->numOld = $numOld; $this->numNew = $numNew; } } else { $this->numOld = $numOld; $this->numNew = $numNew; } } public function getNumOld() { return $this->numOld; } public function setNumOld($num) { $this->numOld = $num; } public function getNumNew() { return $this->numNew; } public function setNumNew($num) { $this->numNew = $num; } } src/Gitter/Model/File.php000066400000000000000000000027171516072260400155450ustar00rootroot00000000000000size; } public function setSize($size) { $this->size = $size; return $this; } public function getPath() { return $this->path; } public function setPath($path) { $this->path = $path; return $this; } public function getMode() { return $this->mode; } public function setMode($mode) { $this->mode = $mode; return $this; } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; return $this; } public function getHash() { return $this->hash; } public function setHash($hash) { $this->hash = $hash; return $this; } public function getShortHash() { return $this->shortHash; } public function setShortHash($hash) { $this->shortHash = $hash; return $this; } public function getLastModified() { return $this->lastModified; } public function setLastModified($modified) { $this->lastModified = $modified; } } src/Gitter/Model/Item.php000066400000000000000000000010461516072260400155560ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model; class Item extends File { public function isBlob() { return false; } public function isTag() { return false; } public function isCommit() { return false; } public function isTree() { return false; } } src/Gitter/Model/Line.php000066400000000000000000000020631516072260400155470ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model; class Line extends AbstractModel { protected $line; protected $type; public function __construct($data) { if (!empty($data)) { if ($data[0] == '@') { $this->setType('chunk'); } if ($data[0] == '-') { $this->setType('old'); } if ($data[0] == '+') { $this->setType('new'); } } $this->setLine($data); } public function getLine() { return $this->line; } public function setLine($line) { $this->line = $line; return $this; } public function getType() { return $this->type; } public function setType($type) { $this->type = $type; return $this; } } src/Gitter/Model/Module.php000066400000000000000000000003401516072260400161010ustar00rootroot00000000000000url; } public function setUrl($url) { $this->url = $url; } } src/Gitter/Model/Symlink.php000066400000000000000000000004471516072260400163120ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model; class Symlink extends File { } src/Gitter/Model/Tag.php000066400000000000000000000010401516072260400153650ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model; class Tag extends Item { protected $name; public function getName() { return $this->name; } public function setName($name) { $this->name = $name; return $this; } public function isTag() { return true; } } src/Gitter/Model/Tree.php000066400000000000000000000211511516072260400155560ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Model; use Gitter\Repository; use function Stringy\create; use Stringy\Stringy as S; class Tree extends Item implements \RecursiveIterator { public $path = ''; protected $data; protected $position = 0; private $submodules = null; public function __construct($hash, Repository $repository) { $this->setHash($hash); $pathArray = explode(":", $hash); if (isset($pathArray[1])) { $this->path = str_replace("\"", "", $pathArray[1]); } //exit; $this->setRepository($repository); } public function parse() { $data = $this->getRepository()->getClient()->run($this->getRepository(), 'ls-tree -lz ' . $this->getHash()); $lines = explode("\0", $data); $files = array(); $root = array(); //print_r($data); foreach ($lines as $key => $line) { if (empty($line)) { unset($lines[$key]); continue; } $tabSplit = preg_split("/[\t]+/", $line, 2); $file = preg_split("/[\s]+/", $tabSplit[0], 4); $file[] = $tabSplit[1]; $files[] = $file; } foreach ($files as $file) { // submodule if ($file[0] == '160000') { $submodules = $this->getSubmodules($files, $this->getHash()); if (strpos($this->getHash(), ':') === false) { $submoduleName = $file[4]; } else { $submoduleName = str_replace('"', '', explode(':', $this->getHash())[1]) . "$file[4]"; } $shortHash = $this->getRepository()->getShortHash($file[2]); $tree = new Module; $tree->setMode($file[0]); $tree->setName($file[4]); $tree->setHash($file[2]); $tree->setShortHash($shortHash); // echo $submoduleName; // exit; $url = $submodules["submodule $submoduleName"]['url']; if (preg_match('/^https?:\/\/(www\.)?github.com\//i', $url)) { $s = S::create($url); if ($s->endsWith('.git')) { $url = substr($url, 0, strlen($url) - 4); } } $tree->setUrl($url); $this->decorateItem($file[4], $tree); $root[] = $tree; continue; } if ($file[0] == '120000') { $show = $this->getRepository()->getClient()->run($this->getRepository(), 'show ' . $file[2]); $tree = new Symlink; $tree->setMode($file[0]); $tree->setName($file[4]); $tree->setPath($show); $this->decorateItem($file[4], $tree); $root[] = $tree; continue; } if ($file[1] == 'blob') { $blob = new Blob($file[2], $this->getRepository()); $blob->setMode($file[0]); $blob->setName($file[4]); $blob->setSize($file[3]); $this->decorateItem($file[4], $blob); $root[] = $blob; continue; } $tree = new Tree($file[2], $this->getRepository()); $tree->setMode($file[0]); $tree->setName($file[4]); $this->decorateItem($file[4], $tree); $root[] = $tree; } $this->data = $root; } private function getSubmodules($files, $hash) { if ($this->submodules === null) { foreach ($files as $file) { if ($file[4] === '.gitmodules') { $branch = $hash; $gitsubmodule = $this->getRepository()->getBlob("$branch:\"$file[4]\"")->output(); $this->submodules = parse_ini_string($gitsubmodule, true); } } if ($this->submodules === null && strpos($hash, ':') !== false) { // Search in root folder $data = $this->getRepository()->getClient()->run($this->getRepository(), 'ls-tree -lz ' . explode(':', $hash)[0]); $lines = explode("\0", $data); $rootFolderFiles = array(); $root = array(); foreach ($lines as $key => $line) { if (empty($line)) { unset($lines[$key]); continue; } $rootFolderFiles[] = preg_split("/[\s]+/", $line, 5); } $this->submodules = $this->getSubmodules($rootFolderFiles, explode(':', $hash)[0]); } } return $this->submodules; } public function decorateItem($filename, $item) { $command = 'log -1 --pretty=tformat:"%ar%n%s" ' . explode(':', $this->getHash())[0] . ' -- ' . "\"" . $this->path . $filename . "\""; //print_r($command); //echo "\n"; $fileInfo = explode("\n", $this->getRepository()->getClient()->run($this->getRepository(), $command)); //echo $filename; //echo "\n"; //print_r($fileInfo); //echo "\n"; //echo "\n"; $item->setLastModified($fileInfo[0]); $item->message = $fileInfo[1]; } public function output() { $files = $folders = array(); foreach ($this as $node) { if ($node instanceof Blob) { $file['type'] = 'blob'; $file['name'] = $node->getName(); $file['size'] = $node->getSize(); $file['mode'] = $node->getMode(); $file['hash'] = $node->getHash(); $file['lastModified'] = $node->getLastModified(); $file['message'] = $node->message; $files[] = $file; continue; } if ($node instanceof Tree) { $folder['type'] = 'folder'; $folder['name'] = $node->getName(); $folder['size'] = ''; $folder['mode'] = $node->getMode(); $folder['hash'] = $node->getHash(); $folder['lastModified'] = $node->getLastModified(); $folder['message'] = $node->message; $folders[] = $folder; continue; } if ($node instanceof Module) { $folder['type'] = 'module'; $folder['name'] = $node->getName(); $folder['size'] = ''; $folder['mode'] = $node->getMode(); $folder['hash'] = $node->getHash(); $folder['shortHash'] = $node->getShortHash(); $folder['url'] = $node->getUrl(); $folders[] = $folder; $folder['lastModified'] = $node->getLastModified(); $folder['message'] = $node->message; continue; } if ($node instanceof Symlink) { $folder['type'] = 'symlink'; $folder['name'] = $node->getName(); $folder['size'] = ''; $folder['mode'] = $node->getMode(); $folder['hash'] = ''; $folder['path'] = $node->getPath(); $folder['lastModified'] = $node->getLastModified(); $folder['message'] = $node->message; $folders[] = $folder; } } // Little hack to make folders appear before files $files = array_merge($folders, $files); return $files; } #[\ReturnTypeWillChange] public function valid() { return isset($this->data[$this->position]); } #[\ReturnTypeWillChange] public function hasChildren() { return is_array($this->data[$this->position]); } #[\ReturnTypeWillChange] public function next() { $this->position++; } #[\ReturnTypeWillChange] public function current() { return $this->data[$this->position]; } #[\ReturnTypeWillChange] public function getChildren() { return $this->data[$this->position]; } #[\ReturnTypeWillChange] public function rewind() { $this->position = 0; } #[\ReturnTypeWillChange] public function key() { return $this->position; } public function isTree() { return true; } } src/Gitter/PrettyFormat.php000066400000000000000000000022571516072260400162650ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter; class PrettyFormat { public function parse($output) { if (empty($output)) { throw new \RuntimeException('No data available'); } try { $xml = new \SimpleXmlIterator("$output"); } catch (\Exception $e) { $output = $this->escapeXml($output); $xml = new \SimpleXmlIterator("$output"); } $data = $this->iteratorToArray($xml); return $data['item']; } public function escapeXml($output) { return preg_replace('/[\x00-\x1f]/', '?', $output); } protected function iteratorToArray($iterator) { foreach ($iterator as $key => $item) { if ($iterator->hasChildren()) { $data[$key][] = $this->iteratorToArray($item); continue; } $data[$key] = trim(strval($item)); } return $data; } } src/Gitter/Repository.php000066400000000000000000001235211516072260400160020ustar00rootroot00000000000000 * (c) Patrik Laszlo * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter; use Gitter\Model\Commit\Commit; use Gitter\Model\Tree; use Gitter\Model\Blob; use Gitter\Model\Commit\Diff; use Gitter\Statistics\StatisticsInterface; //use Gitter\PrettyFormat; use Symfony\Component\Filesystem\Filesystem; use Spatie\TemporaryDirectory\TemporaryDirectory; class Repository { protected $path; protected $client; protected $commitsHaveBeenParsed = false; protected $statistics = array(); public function __construct($path, Client $client) { $this->setPath($path); $this->setClient($client); } /** * @return boolean */ public function getCommitsHaveBeenParsed() { return $this->commitsHaveBeenParsed; } /** * @param bool $value * @return void */ public function setCommitsHaveBeenParsed($value) { $this->commitsHaveBeenParsed = $value; } /** * Create a new git repository */ public function create($bare = null) { mkdir($this->getPath()); $command = 'init'; if ($bare) { $command .= ' --bare'; } $this->getClient()->run($this, $command); return $this; } /** * Get the current Repository path * * @return string Path where the repository is located */ public function getPath() { return $this->path; } /** * Set the current Repository path * * @param string $path Path where the repository is located */ public function setPath($path) { $this->path = $path; } /** * Get the current Client instance * * @return Client Client instance */ public function getClient() { return $this->client; } /** * Set the Client * * @param Client $path Client instance */ public function setClient(Client $client) { $this->client = $client; return $this; } /** * Get a git configuration variable * * @param string $key Configuration key */ public function getConfig($key) { $key = $this->getClient()->run($this, 'config ' . $key); return trim($key); } /** * Set a git configuration variable * * @param string $key Configuration key * @param string $value Configuration value */ public function setConfig($key, $value) { $this->getClient()->run($this, "config $key \"$value\""); return $this; } /** * Add statistic aggregator * * @param StatisticsInterface|array $statistics */ public function addStatistics($statistics) { if (!is_array($statistics)) { $statistics = array($statistics); } foreach ($statistics as $statistic) { $reflect = new \ReflectionClass($statistic); $this->statistics[strtolower($reflect->getShortName())] = $statistic; } } /** * Get statistic aggregators * * @return array */ public function getStatistics($branch = null) { // Calculate amount of files, extensions and file size $logs = $this->getClient()->run($this, 'ls-tree -r -l ' . $branch); $lines = explode("\n", $logs); $files = []; $data['extensions'] = []; $data['size'] = 0; $data['files'] = 0; foreach ($lines as $key => $line) { if (empty($line)) { unset($lines[$key]); continue; } $files[] = preg_split("/[\s]+/", $line); } foreach ($files as $file) { if ($file[1] == 'blob') { $data['files']++; } if (is_numeric($file[3])) { $data['size'] += $file[3]; } } $logs = $this->getClient()->run($this, 'ls-tree -l -r ' . $branch); $files = explode("\n", $logs); foreach ($files as $file) { if (($pos = strrpos($file, '.')) !== false) { $extension = substr($file, $pos); if (($pos = strrpos($extension, '/')) === false) { $data['extensions'][] = $extension; } } } $data['extensions'] = array_count_values($data['extensions']); arsort($data['extensions']); return $data; } /** * Add untracked files * * @param mixed $files Files to be added to the repository */ public function add($files = '.') { if (is_array($files)) { $files = implode(' ', array_map('escapeshellarg', $files)); } else { $files = escapeshellarg($files); } $this->getClient()->run($this, "add $files"); return $this; } /** * Add all untracked files */ public function addAll() { $this->getClient()->run($this, "add -A"); return $this; } /** * Commit changes to the repository * * @param string $message Description of the changes made */ public function commit($message) { $this->getClient()->run($this, "commit -m \"$message\""); return $this; } /** * Checkout a branch * * @param string $branch Branch to be checked out */ public function checkout($branch) { $this->getClient()->run($this, "checkout $branch"); return $this; } /** * Pull repository changes */ public function pull() { $this->getClient()->run($this, "pull"); return $this; } /** * Update remote references * * @param string $repository Repository to be pushed * @param string $refspec Refspec for the push */ public function push($repository = null, $refspec = null) { $command = "push"; if ($repository) { $command .= " $repository"; } if ($refspec) { $command .= " $refspec"; } $this->getClient()->run($this, $command); return $this; } /** * Get name of repository (top level directory) * * @return string */ public function getName() { $name = rtrim($this->path, '/'); if (strstr($name, DIRECTORY_SEPARATOR)) { $name = substr($name, strrpos($name, DIRECTORY_SEPARATOR) + 1); } return trim($name); } /** * Return the current repository branch * * @return mixed Current repository branch as a string, or NULL if in * detached HEAD state. */ public function getCurrentBranch() { $branches = $this->getClient()->run($this, "branch"); $branches = explode("\n", $branches); foreach ($branches as $branch) { if ($branch[0] === '*') { if ((strpos($branch, '* (detached from ') === 0) || ($branch === '* (no branch)')) { return NULL; } return substr($branch, 2); } } } /** * Create a new repository branch * * @param string $branch Branch name */ public function createBranch($branch) { $this->getClient()->run($this, "branch $branch"); } /** * Create a new repository tag * * @param string $tag Tag name */ public function createTag($tag, $message = null) { $command = "tag"; if ($message) { $command .= " -a -m '$message'"; } $command .= " $tag"; $this->getClient()->run($this, $command); } /** * Show a list of the repository tags * * @return array List of tags */ public function getTags() { static $cache = array(); if (array_key_exists($this->path, $cache)) { return $cache[$this->path]; } $tags = $this->getClient()->run($this, "tag"); $tags = explode(PHP_EOL, $tags); array_pop($tags); if (empty($tags[0])) { return $cache[$this->path] = NULL; } natsort($tags); $tags = array_reverse($tags); return $cache[$this->path] = $tags; } /** * Show the amount of commits on the repository * * @return integer Total number of commits */ public function getTotalCommits($file = null) { if (defined('PHP_WINDOWS_VERSION_BUILD')) { $command = "rev-list --count --all $file"; } else { $command = "rev-list --all $file | wc -l"; } $commits = $this->getClient()->run($this, $command); return trim($commits); } /** * Show the repository commit log * * @return array Commit log */ public function getCommits($file = null) { $command = "log --pretty=format:\"%H%h%T%P%an%ae%at%cn%ce%ct\""; if ($file) { $command .= " $file"; } $logs = $this->getPrettyFormat($command); foreach ($logs as $log) { $commit = new Commit; $commit->importData($log); $commits[] = $commit; foreach ($this->statistics as $statistic) { $statistic->addCommit($commit); } } $this->setCommitsHaveBeenParsed(true); return $commits; } /** * Get and parse the output of a git command with a XML-based pretty format * * @param string $command Command to be run by git * @return array Parsed command output */ public function getPrettyFormat($command) { $output = $this->getClient()->run($this, $command); $format = new PrettyFormat; return $format->parse($output); } /** * Show the data from a specific commit. * * @param string $commitHash Hash of the specific commit to read data * * @return array Commit data */ public function getCommit($commitHash, $options = null) { $logs = $this->getClient()->run( $this, 'show --pretty=format:"%H' . '%h%T%P' . '%aN%aE' . '%at%cN%cE' . '%ct' . '' . '' . "\" $commitHash" ); $xmlEnd = strpos($logs, '') + 7; $commitInfo = substr($logs, 0, $xmlEnd); $commitData = substr($logs, $xmlEnd); $logs = explode("\n", $commitData); // Read commit metadata $format = new PrettyFormat(); $data = $format->parse($commitInfo); $commit = new Commit(); $commit->importData($data[0]); if ($commit->getParentsHash()) { $command = 'diff ' . $commitHash . '~1..' . $commitHash; $logs = explode("\n", $this->getClient()->run($this, $command)); } $commit->setDiffs($this->readDiffLogs($logs, $options)); return $commit; } /** * Read diff logs and generate a collection of diffs. * * @param array $logs Array of log rows * * @return array Array of diffs */ public function readDiffLogs(array $logs, $options = null) { if ($options === null) { $options = []; $options['showLines'] = true; } if (!isset($options['filename'])) { $options['filename'] = ''; } $diffs = []; $lineNumOld = 0; $lineNumNew = 0; foreach ($logs as $log) { // Skip empty lines if ($log == '') { continue; } if ('diff' === substr($log, 0, 4)) { if (isset($diff)) { if ($options['filename'] === '') { $diffs[] = $diff; } elseif ($options['filename'] === $diff->getFile()) { $diffs[] = $diff; } } $diff = new Diff(); if (preg_match('/^diff --[\S]+ a\/?(.+) b\/?/', $log, $name)) { $diff->setFile($name[1]); } continue; } if ('index' === substr($log, 0, 5)) { $diff->setIndex($log); continue; } if ('---' === substr($log, 0, 3)) { $diff->setOld($log); continue; } if ('+++' === substr($log, 0, 3)) { $diff->setNew($log); continue; } // Handle binary files properly. if ('Binary' === substr($log, 0, 6)) { $m = []; if (preg_match('/Binary files (.+) and (.+) differ/', $log, $m)) { $diff->setBinary(true); $diff->setOld('--- ' . $m[1]); $diff->setNew("+++ {$m[2]}"); } } if (!empty($log)) { switch ($log[0]) { case '@': // Set the line numbers preg_match('/@@ -([0-9]+)(?:,[0-9]+)? \+([0-9]+)/', $log, $matches); $lineNumOld = $matches[1] - 1; $lineNumNew = $matches[2] - 1; break; case '-': $lineNumOld++; break; case '+': $lineNumNew++; break; default: $lineNumOld++; $lineNumNew++; } } else { $lineNumOld++; $lineNumNew++; } if (isset($diff)) { if ($options['showLines']) { $diff->addLine($log, $lineNumOld, $lineNumNew); } $diff->lineCount++; } } if (isset($diff)) { if ($options['filename'] === '' || count($diffs) === 0) $diffs[] = $diff; } return $diffs; } /** * Get the current HEAD. * * @param $default Optional branch to default to if in detached HEAD state. * If not passed, just grabs the first branch listed. * @return string the name of the HEAD branch, or a backup option if * in detached HEAD state. */ public function getHead($default = null) { if ($default === null) { $client = $this->getClient(); $default = $client->getDefaultBranch(); } $file = ''; if (file_exists($this->getPath() . '/.git/HEAD')) { $file = file_get_contents($this->getPath() . '/.git/HEAD'); } elseif (file_exists($this->getPath() . '/HEAD')) { $file = file_get_contents($this->getPath() . '/HEAD'); } // Find first existing branch foreach (explode("\n", $file) as $line) { $m = array(); if (preg_match('#ref:\srefs/heads/(.+)#', $line, $m)) { if ($this->hasBranch($m[1])) { return $m[1]; } } } // If we were given a default branch and it exists, return that. if ($default !== null && $this->hasBranch($default)) { return $default; } // Otherwise, return the first existing branch. $branches = $this->getBranches(); if (!empty($branches)) { return current($branches); } // No branches exist - null is the best we can do in this case. return null; } /** * Check if a specified branch exists * * @param string $branch Branch to be checked * @return boolean True if the branch exists */ public function hasBranch($branch) { $branches = $this->getBranches(); $status = in_array($branch, $branches); return $status; } /** * Show a list of the repository branches * * @return array List of branches */ public function getBranches() { static $cache = array(); if (array_key_exists($this->path, $cache)) { return $cache[$this->path]; } $branches = $this->getClient()->run($this, "branch"); $branches = explode("\n", $branches); $branches = array_filter(preg_replace('/[\*\s]/', '', $branches)); if (empty($branches)) { return $cache[$this->path] = $branches; } // Since we've stripped whitespace, the result "* (detached from " // and "* (no branch)" that is displayed in detached HEAD state // becomes "(detachedfrom" and "(nobranch)" respectively. if ((strpos($branches[0], '(detachedfrom') === 0) || ($branches[0] === '(nobranch)')) { $branches = array_slice($branches, 1); } return $cache[$this->path] = $branches; } /** * Extract the tree hash for a given branch or tree reference * * @param string $branch * @return string */ public function getBranchTree($branch) { $hash = $this->getClient()->run($this, "log --pretty=\"%T\" --max-count=1 $branch"); $hash = trim($hash, "\r\n "); return $hash ?: false; } /** * Get the Tree for the provided folder * * @param string $tree Folder that will be parsed * @return Tree Instance of Tree for the provided folder */ public function getTree($tree) { $tree = new Tree($tree, $this); $tree->parse(); return $tree; } /** * Get the Blob for the provided file * * @param string $blob File that will be parsed * @return Blob Instance of Blob for the provided file */ public function getBlob($blob) { return new Blob($blob, $this); } /** * Blames the provided file and parses the output. * * @param string $file File that will be blamed * * @return array Commits hashes containing the lines */ public function getBlame($file) { $blame = []; $logs = $this->getClient()->run($this, "blame --root -sl $file"); $logs = explode("\n", $logs); $i = 0; $previousCommit = ''; foreach ($logs as $log) { if ($log == '') { continue; } preg_match_all("/([a-zA-Z0-9]{40})\s+.*?([0-9]+)\)(.+)/", $log, $match); $currentCommit = $match[1][0]; if ($currentCommit != $previousCommit) { ++$i; $blame[$i] = [ 'line' => '', 'commit' => $currentCommit, 'commitShort' => substr($currentCommit, 0, 8), ]; } $blame[$i]['line'] .= $match[3][0] . PHP_EOL; $previousCommit = $currentCommit; } return $blame; } public function getShortHash($commit) { $shortHash = $this->getClient()->run($this, 'rev-parse --short ' . $commit); $shortHash = trim($shortHash, "\r\n "); return $shortHash; } /** * Return true if the repo contains this commit. * * @param $commitHash Hash of commit whose existence we want to check * * @return bool Whether or not the commit exists in this repo */ public function hasCommit($commitHash) { $logs = $this->getClient()->run($this, "show $commitHash"); $logs = explode("\n", $logs); return strpos($logs[0], 'commit') === 0; } /** * Show Patches that where apllied to the selected file. * * @param string $file File path for which we will retrieve a list of patch logs * * @return array Collection of Commits data */ public function getCommitsLogPatch($file) { $record_delimiter = chr(hexdec('0x1e')); $file_patches = $this->getClient()->run( $this, 'log -p --pretty=format:"' . $record_delimiter . '%H' . '%h%T%P' . '%aN%aE' . '%at%cN%cE' . '%ct' . '' . '' . "\" -- $file" ); $patch_collection = []; foreach (preg_split('/(' . $record_delimiter . '\)/', $file_patches, null, PREG_SPLIT_NO_EMPTY) as $patches) { $patches = '' . $patches; $xmlEnd = strpos($patches, '') + 7; $commitInfo = substr($patches, 0, $xmlEnd); $commitData = substr($patches, $xmlEnd); $logs = explode("\n", $commitData); // Read commit metadata $format = new PrettyFormat(); $data = $format->parse($commitInfo); $commit = new Commit(); $commit->importData($data[0]); $commit->setDiffs($this->readDiffLogs($logs)); $patch_collection[] = $commit; } return $patch_collection; } /** * Show the repository commit log with pagination. * * @param string $file * @param int page * * @return array Commit log */ public function getPaginatedCommits($file = null, $page = 0) { $page = 15 * $page; $pager = "--skip=$page --max-count=15"; $command = "log $pager --pretty=format:\"%H" . '%h%T%P' . '%aN%aE' . '%at%cN' . '%cE' . '%ct' . '"'; if ($file) { $command .= " $file"; } try { $logs = $this->getPrettyFormat($command); } catch (\RuntimeException $e) { return []; } foreach ($logs as $log) { $commit = new Commit(); $commit->importData($log); $commits[] = $commit; } return $commits; } public function searchCommitLog($query, $branch) { $query = escapeshellarg($query); $query = strtr($query, ['[' => '\\[', ']' => '\\]']); $command = "log --grep={$query} -i --pretty=format:\"%H" . '%h%T%P' . '%aN%aE' . '%at%cN' . '%cE' . '%ct' . '"' . " $branch"; try { $logs = $this->getPrettyFormat($command); } catch (\RuntimeException $e) { return []; } foreach ($logs as $log) { $commit = new Commit(); $commit->importData($log); $commits[] = $commit; } return $commits; } public function searchTree($query, $branch) { if (empty($query)) { return null; } $query = preg_replace('/(--?[A-Za-z0-9\-]+)/', '', $query); $query = escapeshellarg($query); try { $results = $this->getClient()->run($this, "grep -i --line-number -- {$query} $branch"); } catch (\RuntimeException $e) { return false; } $results = explode("\n", $results); $searchResults = []; foreach ($results as $result) { if ($result == '') { continue; } preg_match_all('/([\w\-._]+):([^:]+):([0-9]+):(.+)/', $result, $matches, PREG_SET_ORDER); if (isset($matches[0])) { $data['branch'] = $matches[0][1]; $data['file'] = $matches[0][2]; $data['line'] = $matches[0][3]; $data['match'] = $matches[0][4]; $searchResults[] = $data; } } return $searchResults; } public function getAuthorStatistics($branch) { $logs = $this->getClient()->run($this, 'log --pretty=format:"%aN||%aE" ' . $branch); if (empty($logs)) { throw new \RuntimeException('No statistics available'); } $logs = explode("\n", $logs); $logs = array_count_values($logs); arsort($logs); foreach ($logs as $user => $count) { $user = explode('||', $user); $data[] = ['name' => $user[0], 'email' => $user[1], 'commits' => $count]; } return $data; } /** * Create a TAR or ZIP archive of a git tree. * * @param string $tree Tree-ish reference * @param string $output Output File name * @param string $format Archive format */ public function createArchive($tree, $output, $format = 'zip') { $fs = new Filesystem(); $fs->mkdir(dirname($output)); $this->getClient()->run($this, "archive --format=$format --output='$output' $tree"); } /** * Return true if $path exists in $branch; return false otherwise. * * @param string $commitish commitish reference; branch, tag, SHA1, etc * @param string $path path whose existence we want to verify * * @return bool * * GRIPE Arguably belongs in Gitter, as it's generally useful functionality. * Also, this really may not be the best way to do this. */ public function pathExists($commitish, $path) { $output = $this->getClient()->run($this, "ls-tree $commitish '$path'"); if (strlen($output) > 0) { return true; } return false; } public function newFileBinary($cachePath, $repo, $branch, $repoFilename, $name, $email, $comment, $override, $phpUploadFile) { /* return (object)[ 'filename' => $repoFilename, 'email' => $email, 'name' => $name, 'comment' => $comment, 'upload-file' => $phpUploadFile, 'override' => $override, ]; */ return $this->changeRepo($cachePath, $repo, $branch, $repoFilename, $name, $email, $comment, function ($client, $filename, &$outputs, $tempRepo, $normalizedRepoFilePath) use ($cachePath, $repo, $branch, $repoFilename, $name, $email, $comment, $override, $phpUploadFile) { // array_unshift($outputs, $cachePath); // array_unshift($outputs, $repoFilename); /* array_unshift($outputs, '$tempRepo: ' . $tempRepo); array_unshift($outputs, '$repo: ' . $repo); array_unshift($outputs, '$branch: ' . $branch); array_unshift($outputs, '$repoFilename: ' . $repoFilename); array_unshift($outputs, '$name: ' . $name); array_unshift($outputs, '$email: ' . $email); array_unshift($outputs, '$comment: ' . $comment); array_unshift($outputs, '$filename: ' . $filename); array_unshift($outputs, '$repoFilename: ' . $repoFilename); $basePath = FileSystemPath::fromString($tempRepo); $repoFilenameItem = FileSystemPath::fromString($repoFilename); $normalizing = $basePath->resolve($repoFilenameItem); array_unshift($outputs, '$normalizing: ' . $normalizing); $normalized = FileSystemPath::fromString($normalizing)->normalize(); array_unshift($outputs, '$normalized: ' . $normalized); array_unshift($outputs, '$normalizing type: ' . gettype($normalizing)); array_unshift($outputs, '$normalized type: ' . gettype($normalized)); $validPath = strpos($normalizing->__toString(), $normalized->__toString()) !== false; array_unshift($outputs, 'includes current path in search: ' . ($validPath ? 'true' : 'false')); return $repoFilename; */ $wasItNonExisting = !realpath($normalizedRepoFilePath); array_push($outputs, $wasItNonExisting); array_push($outputs, $repoFilename); array_push($outputs, $normalizedRepoFilePath); array_push($outputs, $override); if (substr($repoFilename, -1) == '\\' || substr($repoFilename, -1) == '/') { return "The file can't end with this file name: {$repoFilename}"; } else { if (!$wasItNonExisting && !$override) { throw new \Exception("This file is already existing: {$repoFilename}"); } if ($wasItNonExisting && $override) { @unlink($normalizedRepoFilePath); } @mkdir(dirname($normalizedRepoFilePath), 0777, true); move_uploaded_file($phpUploadFile['tmp_name'], $normalizedRepoFilePath); if ($wasItNonExisting) { $command = " add . "; $output = $client->run($this, $command); array_push($outputs, $output); return "Created new binary file : {$repoFilename}"; } else { return "Overridden binary file : {$repoFilename}"; } // echo "path is file "; } }); /* File mime type check is not implemented. $objectResult = $repository->newFileBinary($app->getCachePath(), $repo, $branch, $filename, $name, $email, $comment, $request->get('override') === '1' ? true : false, $_FILES[0]); { "filename": "2017-Electronic-Diversity-Visa Lottery-Kriszti.jpg", "email": "alabard@gmail.com", "name": "patrikx3", "comment": "P3X Gitlist Commit New binary", "upload-file": { "name": "2017-Electronic-Diversity-Visa Lottery-Kriszti.jpg", "type": "image\/jpeg", "tmp_name": "\/tmp\/phpzGVxqY", "error": 0, "size": 125931 }, "override": "1" } { "filename": "krip.krip", "email": "alabard@gmail.com", "name": "patrikx3", "comment": "P3X Gitlist Commit New binary", "upload-file": { "name": "krip.krip", "type": "", "tmp_name": "", "error": 1, "size": 0 }, "override": "1" } { "filename": "corifeus-colors.txt", "email": "alabard@gmail.com", "name": "patrikx3", "comment": "P3X Gitlist Commit New binary", "upload-file": { "name": "corifeus-colors.txt", "type": "text\/plain", "tmp_name": "\/tmp\/phpxjBzT8", "error": 0, "size": 133 }, "override": "1" } */ } protected function changeRepo($cachePath, $repo, $branch, $repoFilename, $name, $email, $comment, $callback) { $temporaryDirectory = ''; $tempRepo = ''; $hadError = false; $command = ''; $output = ''; $outputs = []; $trace = null; try { $temporaryDirectory = (new TemporaryDirectory($cachePath))->create(); $client = $this->getClient(); $repoPath = realpath($this->getPath()); $tempRepo = $temporaryDirectory->path(); $output = $client->run($this, 'clone ' . $repoPath . ' ' . $tempRepo); $this->setPath($tempRepo); $normalizedRepoFilePath = $this->isValidPath($tempRepo, $repoFilename, $outputs); $filename = realpath($tempRepo . DIRECTORY_SEPARATOR . $repoFilename); $command = "checkout $branch"; $output = $client->run($this, $command); array_push($outputs, $output); $message = $callback($client, $filename, $outputs, $tempRepo, $normalizedRepoFilePath); array_push($outputs, $message); $command = " -c \"user.name=$name\" -c \"user.email=$email\" commit -am \"$comment\" "; $output = $client->run($this, $command); array_push($outputs, $output); // $command = "commit -am \"$comment\""; // $output = $client->run($repository, $command); $command = "push"; $output = $client->run($this, $command); array_push($outputs, $output); $command = " rev-parse HEAD "; $lastCommit = $client->run($this, $command); $result = (object)[ 'status' => 'ok', 'output' => $message, 'outputs' => $outputs, 'last-commit' => $lastCommit, 'branch' => $branch, ]; return $result; } catch (\Throwable $e) { $hadError = $e; } finally { if ($temporaryDirectory !== '') { @$temporaryDirectory->delete(); } if ($hadError !== false) { $message = $hadError->getMessage(); if ($message === '') { $exceptionName = get_class($hadError); $message = "Received exception without message with type '{$exceptionName}'. " . $hadError->getMessage(); $trace = $hadError->getTrace(); } return ((object)[ 'status' => $message === '' ? 'ok' : 'error', 'error' => $message === '' ? false : true, //'temporaryDirectory' => $tempRepo, 'message' => $message, //'currentdir' => getcwd(), //'command' => $command, 'output' => $output, 'outputs' => $outputs, 'trace' => $trace, //'$filename' => $filename, //'$value' => $value, ]); } } } protected function isValidPath($tempRepo, $repoFilename, &$outputs) { function resolvePath($path) { if(DIRECTORY_SEPARATOR !== '/') { $path = str_replace(DIRECTORY_SEPARATOR, '/', $path); } $search = explode('/', $path); $search = array_filter($search, function($part) { return $part !== '.'; }); $append = array(); $match = false; while(count($search) > 0) { $match = realpath(implode('/', $search)); if($match !== false) { break; } array_unshift($append, array_pop($search)); }; if($match === false) { $match = getcwd(); } if(count($append) > 0) { $match .= DIRECTORY_SEPARATOR . implode(DIRECTORY_SEPARATOR, $append); } return $match; } // echo 'tempRepo: '. $tempRepo . '
'; // echo 'repoFilename: '. $repoFilename . '
'; $basePath = $tempRepo; $repoFilenameItem = $repoFilename; $normalizing = $basePath . DIRECTORY_SEPARATOR . $repoFilenameItem; // echo 'normalizing: ' . $normalizing. '
'; $normalized = resolvePath($normalizing); // echo 'normalized: ' . $normalized ? 'true' : 'false'. '
'; $normalizedRepoFilePath = $normalized; $validPath = strpos($normalizing, $normalizedRepoFilePath) !== false; /* $basePath = FileSystemPath::fromString($tempRepo); //array_push($outputs, "$basePath {$basePath}"); $repoFilenameItem = FileSystemPath::fromString($repoFilename); //array_push($outputs, "$repoFilenameItem {$repoFilenameItem}"); $normalizing = $basePath->resolve($repoFilenameItem); //array_push($outputs, "$normalizing {$normalizing}"); // array_unshift($outputs, '$normalizing: ' . $normalizing); $normalized = FileSystemPath::fromString($normalizing)->normalize(); //array_push($outputs, "$normalized {$normalized}"); // array_unshift($outputs, '$normalized: ' . $normalized); // array_unshift($outputs, '$normalizing type: ' . gettype($normalizing)); /// array_unshift($outputs, '$normalized type: ' . gettype($normalized)); $normalizedRepoFilePath = $normalized->__toString(); $validPath = strpos($normalizing->__toString(), $normalizedRepoFilePath) !== false; */ //array_push($outputs, "$normalizing {$normalizing->__toString()}"); //array_push($outputs, "$normalizedRepoFilePath {$normalizedRepoFilePath}"); //array_push($outputs, (substr($normalizedRepoFilePath, 0, strlen($basePath)) . " $basePath")); if ($validPath === false || substr($normalizedRepoFilePath, 0, strlen($basePath)) != $basePath) { throw new \Exception("This '{$repoFilename}' path is invalid." ); } return $normalizedRepoFilePath; } public function changeFile($cachePath, $repo, $branch, $repoFilename, $value, $name, $email, $comment) { return $this->changeRepo($cachePath, $repo, $branch, $repoFilename, $name, $email, $comment, function ($client, $filename, $outputs, $tempRepo, $normalizedRepoFilePath) use ($value) { //$originalFileContent = file_get_contents($filename); file_put_contents($normalizedRepoFilePath, $value); return ''; }); } public function deleteFile($cachePath, $repo, $branch, $repoFilename, $name, $email, $comment) { return $this->changeRepo($cachePath, $repo, $branch, $repoFilename, $name, $email, $comment, function ($client, $filename, $outputs, $tempRepo, $normalizedRepoFilePath) { //$originalFileContent = file_get_contents($filename); @unlink($normalizedRepoFilePath); return 'Deleted ' . $filename; }); } public function newFileOrDirectory($cachePath, $repo, $branch, $repoFilename, $name, $email, $comment) { return $this->changeRepo($cachePath, $repo, $branch, $repoFilename, $name, $email, $comment, function ($client, $filename, &$outputs, $tempRepo, $normalizedRepoFilePath) use ($repoFilename, $repo, $branch, $name, $email, $comment) { // array_unshift($outputs, $cachePath); // array_unshift($outputs, $repoFilename); /* array_unshift($outputs, '$tempRepo: ' . $tempRepo); array_unshift($outputs, '$repo: ' . $repo); array_unshift($outputs, '$branch: ' . $branch); array_unshift($outputs, '$repoFilename: ' . $repoFilename); array_unshift($outputs, '$name: ' . $name); array_unshift($outputs, '$email: ' . $email); array_unshift($outputs, '$comment: ' . $comment); array_unshift($outputs, '$filename: ' . $filename); array_unshift($outputs, '$repoFilename: ' . $repoFilename); $basePath = FileSystemPath::fromString($tempRepo); $repoFilenameItem = FileSystemPath::fromString($repoFilename); $normalizing = $basePath->resolve($repoFilenameItem); array_unshift($outputs, '$normalizing: ' . $normalizing); $normalized = FileSystemPath::fromString($normalizing)->normalize(); array_unshift($outputs, '$normalized: ' . $normalized); array_unshift($outputs, '$normalizing type: ' . gettype($normalizing)); array_unshift($outputs, '$normalized type: ' . gettype($normalized)); $validPath = strpos($normalizing->__toString(), $normalized->__toString()) !== false; array_unshift($outputs, 'includes current path in search: ' . ($validPath ? 'true' : 'false')); return $repoFilename; */ $existing = realpath($normalizedRepoFilePath); if ($existing) { throw new \Exception("This path is already existing: {$repoFilename}"); } if (substr($repoFilename, -1) == '\\' || substr($repoFilename, -1) == '/') { //echo "is path "; // if (realpath($normalizedRepoFilePath) === FALSE) { if (@mkdir($normalizedRepoFilePath, 0777, true)) { // echo "path is not existing "; touch($normalizedRepoFilePath . '/.gitkeep'); $command = " add . "; $output = $client->run($this, $command); array_push($outputs, $output); return "Created new directory (including .gitkeep file): {$repoFilename}"; } return "Failed to create the new directory: {$repoFilename}"; //} else { // echo "path is existing "; // throw new \Exception("This path is already existing."); //} } else { @mkdir(dirname($normalizedRepoFilePath), 0777, true); touch($normalizedRepoFilePath); $command = " add . "; $output = $client->run($this, $command); array_push($outputs, $output); return "Created new file : {$repoFilename}"; // echo "path is file "; } }); } public function fetchOrigin() { $output = $this->getClient()->run($this, "fetch origin '*:*'"); return ((object)[ 'status' => 'ok', 'error' => false, 'message' => 'OK, fetch origin is done. You may reload the page, if is is required.', // 'message' => $output ]); } } src/Gitter/Statistics/000077500000000000000000000000001516072260400152405ustar00rootroot00000000000000src/Gitter/Statistics/Contributors.php000066400000000000000000000016351516072260400204530ustar00rootroot00000000000000getAuthor()->getEmail(); $commitDate = $commit->getCommiterDate()->format('Y-m-d'); if (!isset($this->items[$email])) { $this->items[$email] = new Collection; } $this->items[$email]->items[$commitDate][] = $commit; ksort($this->items[$email]->items); } public function sortCommits() { uasort($this->items, function ($sortA, $sortB) { if (count($sortA) === count($sortB)) { return 0; } return count($sortA) > count($sortB) ? -1 : 1; }); } } src/Gitter/Statistics/Date.php000066400000000000000000000007501516072260400166300ustar00rootroot00000000000000getCommiterDate()->format('Y-m-d'); $this->items[$day][] = $commit; } public function sortCommits() { ksort($this->items); } } src/Gitter/Statistics/Day.php000066400000000000000000000007431516072260400164720ustar00rootroot00000000000000getCommiterDate()->format('N'); $this->items[$day][] = $commit; } public function sortCommits() { ksort($this->items); } } src/Gitter/Statistics/Hour.php000066400000000000000000000007471516072260400166760ustar00rootroot00000000000000getCommiterDate()->format('H'); $this->items[$hour][] = $commit; } public function sortCommits() { ksort($this->items); } } src/Gitter/Statistics/StatisticsInterface.php000066400000000000000000000002731516072260400217260ustar00rootroot00000000000000items; } /** * @param array $items */ public function setItems($items) { $this->items = $items; } /** * {@inheritdoc} */ public function offsetExists($offset) { return isset($this->items[$offset]); } /** * {@inheritdoc} */ public function offsetGet($offset) { return isset($this->items[$offset]); } /** * {@inheritdoc} */ public function offsetSet($offset, $value) { if (is_null($offset)) { $this->items[] = $value; } else { $this->items[$offset] = $value; } } /** * {@inheritdoc} */ public function offsetUnset($offset) { unset($this->items[$offset]); } /** * {@inheritdoc} */ public function getIterator() { return new \ArrayIterator($this->items); } /** * {@inheritdoc} */ public function count() { return count($this->items); } } src/Gitter/Util/DateTime.php000066400000000000000000000034571516072260400162410ustar00rootroot00000000000000 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitter\Util; /** * Fixes the issue that the $timezone parameter and the current timezone are ignored when * the $time parameter either is a UNIX timestamp (e.g. @946684800) or specifies a timezone * (e.g. 2010-01-28T15:00:00+02:00). * * @link https://github.com/klaussilveira/gitlist/issues/140 */ class DateTime extends \DateTime { /** * @const The regular expression for an UNIX timestamp */ const UNIX_TIMESTAMP_PATTERN = '/^@\d+$/'; /** * @param string $time A date/time string. * @param DateTimeZone $timezone A DateTimeZone object representing the desired time zone. * @return DateTime A new DateTime instance. * @link http://php.net/manual/en/datetime.construct.php */ public function __construct($time = 'now', \DateTimeZone $timezone = null) { if ($timezone) { parent::__construct($time, $timezone); } else { parent::__construct($time); } if ($this->isUnixTimestamp($time)) { if (!$timezone) { $timezone = new \DateTimeZone(date_default_timezone_get()); } $this->setTimezone($timezone); } } /** * Checks if an UNIX timestamp is passed. * * @param string $time A date/time string. * @return bool Returns true if the $time parameter is a UNIX timestamp */ protected function isUnixTimestamp($time) { if (preg_match(self::UNIX_TIMESTAMP_PATTERN, $time)) { return true; } return false; } } src/Silex/000077500000000000000000000000001516072260400127345ustar00rootroot00000000000000src/Silex/.gitignore000066400000000000000000000000541516072260400147230ustar00rootroot00000000000000/phpunit.xml /vendor /build /composer.lock src/Silex/.php_cs.dist000066400000000000000000000012401516072260400151500ustar00rootroot00000000000000setRules(array( '@Symfony' => true, '@Symfony:risky' => true, '@PHPUnit48Migration:risky' => true, 'php_unit_no_expectation_annotation' => false, // part of `PHPUnitXYMigration:risky` ruleset, to be enabled when PHPUnit 4.x support will be dropped, as we don't want to rewrite exceptions handling twice 'array_syntax' => array('syntax' => 'short'), 'protected_to_private' => false, )) ->setRiskyAllowed(true) ->setFinder( PhpCsFixer\Finder::create() ->in(__DIR__.'/src/') ->in(__DIR__.'/tests/') ->name('*.php') ) ; src/Silex/LICENSE000066400000000000000000000020511516072260400137370ustar00rootroot00000000000000Copyright (c) 2010-2017 Fabien Potencier 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. src/Silex/README.rst000066400000000000000000000033611516072260400144260ustar00rootroot00000000000000Silex, a simple Web Framework ============================= **WARNING**: Silex is in maintenance mode only. Ends of life is set to June 2018. Read more on `Symfony's blog `_. Silex is a PHP micro-framework to develop websites based on `Symfony components`_: .. code-block:: php get('/hello/{name}', function ($name) use ($app) { return 'Hello '.$app->escape($name); }); $app->run(); Silex works with PHP 7.1.3 or later. Installation ------------ The recommended way to install Silex is through `Composer`_: .. code-block:: bash composer require silex/silex "~2.0" Alternatively, you can download the `silex.zip`_ file and extract it. More Information ---------------- Read the `documentation`_ for more information and `changelog `_ for upgrading information. Tests ----- To run the test suite, you need `Composer`_ and `PHPUnit`_: .. code-block:: bash composer install phpunit Support ------- If you have a configuration problem use the `silex tag`_ on StackOverflow to ask a question. If you think there is an actual problem in Silex, please `open an issue`_ if there isn't one already created. License ------- Silex is licensed under the MIT license. .. _Symfony components: http://symfony.com .. _Composer: http://getcomposer.org .. _PHPUnit: https://phpunit.de .. _silex.zip: http://silex.sensiolabs.org/download .. _documentation: http://silex.sensiolabs.org/documentation .. _silex tag: https://stackoverflow.com/questions/tagged/silex .. _open an issue: https://github.com/silexphp/Silex/issues/new src/Silex/composer.json000066400000000000000000000037631516072260400154670ustar00rootroot00000000000000{ "name": "silex/silex", "description": "The PHP micro-framework based on the Symfony Components", "keywords": ["microframework"], "homepage": "http://silex.sensiolabs.org", "license": "MIT", "authors": [ { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, { "name": "Igor Wiedler", "email": "igor@wiedler.ch" } ], "require": { "php": ">=7.1.3", "pimple/pimple": "^3.0", "symfony/event-dispatcher": "^4.0", "symfony/http-foundation": "^4.0", "symfony/http-kernel": "^4.0", "symfony/routing": "^4.0" }, "require-dev": { "symfony/asset": "^4.0", "symfony/expression-language": "^4.0", "symfony/security": "^4.0", "symfony/config": "^4.0", "symfony/form": "^4.0", "symfony/browser-kit": "^4.0", "symfony/css-selector": "^4.0", "symfony/debug": "^4.0", "symfony/dom-crawler": "^4.0", "symfony/finder": "^4.0", "symfony/intl": "^4.0", "symfony/monolog-bridge": "^4.0", "symfony/doctrine-bridge": "^4.0", "symfony/options-resolver": "^4.0", "symfony/phpunit-bridge": "^3.2", "symfony/process": "^4.0", "symfony/serializer": "^4.0", "symfony/translation": "^4.0", "symfony/twig-bridge": "^4.0", "symfony/validator": "^4.0", "symfony/var-dumper": "^4.0", "twig/twig": "^2.0", "doctrine/dbal": "^2.2", "swiftmailer/swiftmailer": "^5", "monolog/monolog": "^1.4.1", "symfony/web-link": "^4.0" }, "replace": { "silex/api": "self.version", "silex/providers": "self.version" }, "autoload": { "psr-4": { "Silex\\": "src/Silex" } }, "autoload-dev" : { "psr-4": { "Silex\\Tests\\" : "tests/Silex/Tests" } }, "extra": { "branch-alias": { "dev-master": "2.3.x-dev" } } } src/Silex/doc/000077500000000000000000000000001516072260400135015ustar00rootroot00000000000000src/Silex/doc/changelog.rst000066400000000000000000000322761516072260400161740ustar00rootroot00000000000000Changelog ========= 2.3.0 (2018-04-20) ------------------ * added support for defining users provider as a service ID * fixed error when HttpKernelRuntime is not available * allow setting custom status code on exception response with Symfony 3.3+ * made CSRF extension work with Validator translations domain * fixed Security provider context usage * dropped support for Twig < 2.0 * dropped support for PHP < 7.1 * dropped support for Symfony 2.x and 3.x * added support for Symfony 4 * added support PSR-3 log levels in MonologServiceProvider * exposed AuthenticationUtils in SecurityServiceProvider 2.2.3 (2018-02-25) ------------------ * fixed validator integration into the security provider (order of registration of the validator and security providers does not matter anymore) * fixed compatibility issues with Symfony 3.4 2.2.2 (2018-01-12) ------------------ * [SECURITY] fixed before handlers not executed under mounts 2.2.1 (2017-12-14) ------------------ * added support for Swiftmailer SSL stream_context_options option * fixed usage of namespaces for Twig paths 2.2.0 (2017-07-23) ------------------ * added json manifest version strategy support * fixed EsiFragment constructor * fixed RedirectableUrlMatcher compatibility with Symfony * fixed compatibility with Pimple 3.2 * fixed WebTestCase compatibility with PHPUnit 6+ 2.1.0 (2017-05-03) ------------------ * added more options to security.firewalls * added WebLink component integration * added parameters to configure the Twig core extension behavior * fixed deprecation notices with symfony/twig-bridge 3.2+ in TwigServiceProvider * added FormRegistry as a service to enable the extension point * removed the build scripts * fixed some deprecation warnings * added support for registering Swiftmailer plugins 2.0.4 (2016-11-06) ------------------ * fixed twig.app_variable definition * added support for latest versions of Twig 1.x and 2.0 (Twig runtime loaders) * added support for Symfony 2.3 2.0.3 (2016-08-22) ------------------ * fixed lazy evaluation of 'monolog.use_error_handler' * fixed PHP7 type hint on controllers 2.0.2 (2016-06-14) ------------------ * fixed Symfony 3.1 deprecations 2.0.1 (2016-05-27) ------------------ * fixed the silex form extension registration to allow overriding default ones * removed support for the obsolete Locale Symfony component (uses the Intl one now) * added support for Symfony 3.1 2.0.0 (2016-05-18) ------------------ * decoupled the exception handler from HttpKernelServiceProvider * Switched to BCrypt as the default encoder in the security provider * added full support for RequestMatcher * added support for Symfony Guard * added support for callables in CallbackResolver * added FormTrait::namedForm() * added support for delivery_addresses, delivery_whitelist, and sender_address * added support to register form types / form types extensions / form types guessers as services * added support for callable in mounts (allow nested route collection to be built easily) * added support for conditions on routes * added support for the Symfony VarDumper Component * added a global Twig variable (an AppVariable instance) * [BC BREAK] CSRF has been moved to a standalone provider (``form.secret`` is not available anymore) * added support for the Symfony HttpFoundation Twig bridge extension * added support for the Symfony Asset Component * bumped minimum version of Symfony to 2.8 * bumped minimum version of PHP to 5.5.0 * Updated Pimple to 3.0 * Updated session listeners to extends HttpKernel ones * [BC BREAK] Locale management has been moved to LocaleServiceProvider which must be registered if you want Silex to manage your locale (must also be registered for the translation service provider) * [BC BREAK] Provider interfaces moved to Silex\Api namespace, published as separate package via subtree split * [BC BREAK] ServiceProviderInterface split in to EventListenerProviderInterface and BootableProviderInterface * [BC BREAK] Service Provider support files moved under Silex\Provider namespace, allowing publishing as separate package via sub-tree split * ``monolog.exception.logger_filter`` option added to Monolog service provider * [BC BREAK] ``$app['request']`` service removed, use ``$app['request_stack']`` instead 1.3.6 (2016-XX-XX) ------------------ * n/a 1.3.5 (2016-01-06) ------------------ * fixed typo in SecurityServiceProvider 1.3.4 (2015-09-15) ------------------ * fixed some new deprecations * fixed translation registration for the validators 1.3.3 (2015-09-08) ------------------ * added support for Symfony 3.0 and Twig 2.0 * fixed some Form deprecations * removed deprecated method call in the exception handler * fixed Swiftmailer spool flushing when spool is not enabled 1.3.2 (2015-08-24) ------------------ * no changes 1.3.1 (2015-08-04) ------------------ * added missing support for the Expression constraint * fixed the possibility to override translations for validator error messages * fixed sub-mounts with same name clash * fixed session logout handler when a firewall is stateless 1.3.0 (2015-06-05) ------------------ * added a `$app['user']` to get the current user (security provider) * added view handlers * added support for the OPTIONS HTTP method * added caching for the Translator provider * deprecated `$app['exception_handler']->disable()` in favor of `unset($app['exception_handler'])` * made Silex compatible with Symfony 2.7 an 2.8 (and keep compatibility with Symfony 2.3, 2.5, and 2.6) * removed deprecated TwigCoreExtension class (register the new HttpFragmentServiceProvider instead) * bumped minimum version of PHP to 5.3.9 1.2.5 (2015-06-04) ------------------ * no code changes (last version of the 1.2 branch) 1.2.4 (2015-04-11) ------------------ * fixed the exception message when mounting a collection that doesn't return a ControllerCollection * fixed Symfony dependencies (Silex 1.2 is not compatible with Symfony 2.7) 1.2.3 (2015-01-20) ------------------ * fixed remember me listener * fixed translation files loading when they do not exist * allowed global after middlewares to return responses like route specific ones 1.2.2 (2014-09-26) ------------------ * fixed Translator locale management * added support for the $app argument in application middlewares (to make it consistent with route middlewares) * added form.types to the Form provider 1.2.1 (2014-07-01) ------------------ * added support permissions in the Monolog provider * fixed Switfmailer spool where the event dispatcher is different from the other ones * fixed locale when changing it on the translator itself 1.2.0 (2014-03-29) ------------------ * Allowed disabling the boot logic of MonologServiceProvider * Reverted "convert attributes on the request that actually exist" * [BC BREAK] Routes are now always added in the order of their registration (even for mounted routes) * Added run() on Route to be able to define the controller code * Deprecated TwigCoreExtension (register the new HttpFragmentServiceProvider instead) * Added HttpFragmentServiceProvider * Allowed a callback to be a method call on a service (before, after, finish, error, on Application; convert, before, after on Controller) 1.1.3 (2013-XX-XX) ------------------ * Fixed translator locale management 1.1.2 (2013-10-30) ------------------ * Added missing "security.hide_user_not_found" support in SecurityServiceProvider * Fixed event listeners that are registered after the boot via the on() method 1.0.2 (2013-10-30) ------------------ * Fixed SecurityServiceProvider to use null as a fake controller so that routes can be dumped 1.1.1 (2013-10-11) ------------------ * Removed or replaced deprecated Symfony code * Updated code to take advantages of 2.3 new features * Only convert attributes on the request that actually exist. 1.1.0 (2013-07-04) ------------------ * Support for any ``Psr\Log\LoggerInterface`` as opposed to the monolog-bridge one. * Made dispatcher proxy methods ``on``, ``before``, ``after`` and ``error`` lazy, so that they will not instantiate the dispatcher early. * Dropped support for 2.1 and 2.2 versions of Symfony. 1.0.1 (2013-07-04) ------------------ * Fixed RedirectableUrlMatcher::redirect() when Silex is configured to use a logger * Make ``DoctrineServiceProvider`` multi-db support lazy. 1.0.0 (2013-05-03) ------------------ * **2013-04-12**: Added support for validators as services. * **2013-04-01**: Added support for host matching with symfony 2.2:: $app->match('/', function() { // app-specific action })->host('example.com'); $app->match('/', function ($user) { // user-specific action })->host('{user}.example.com'); * **2013-03-08**: Added support for form type extensions and guessers as services. * **2013-03-08**: Added support for remember-me via the ``RememberMeServiceProvider``. * **2013-02-07**: Added ``Application::sendFile()`` to ease sending ``BinaryFileResponse``. * **2012-11-05**: Filters have been renamed to application middlewares in the documentation. * **2012-11-05**: The ``before()``, ``after()``, ``error()``, and ``finish()`` listener priorities now set the priority of the underlying Symfony event instead of a custom one before. * **2012-11-05**: Removing the default exception handler should now be done via its ``disable()`` method: Before: unset($app['exception_handler']); After: $app['exception_handler']->disable(); * **2012-07-15**: removed the ``monolog.configure`` service. Use the ``extend`` method instead: Before:: $app['monolog.configure'] = $app->protect(function ($monolog) use ($app) { // do something }); After:: $app['monolog'] = $app->share($app->extend('monolog', function($monolog, $app) { // do something return $monolog; })); * **2012-06-17**: ``ControllerCollection`` now takes a required route instance as a constructor argument. Before:: $controllers = new ControllerCollection(); After:: $controllers = new ControllerCollection(new Route()); // or even better $controllers = $app['controllers_factory']; * **2012-06-17**: added application traits for PHP 5.4 * **2012-06-16**: renamed ``request.default_locale`` to ``locale`` * **2012-06-16**: Removed the ``translator.loader`` service. See documentation for how to use XLIFF or YAML-based translation files. * **2012-06-15**: removed the ``twig.configure`` service. Use the ``extend`` method instead: Before:: $app['twig.configure'] = $app->protect(function ($twig) use ($app) { // do something }); After:: $app['twig'] = $app->share($app->extend('twig', function($twig, $app) { // do something return $twig; })); * **2012-06-13**: Added a route ``before`` middleware * **2012-06-13**: Renamed the route ``middleware`` to ``before`` * **2012-06-13**: Added an extension for the Symfony Security component * **2012-05-31**: Made the ``BrowserKit``, ``CssSelector``, ``DomCrawler``, ``Finder`` and ``Process`` components optional dependencies. Projects that depend on them (e.g. through functional tests) should add those dependencies to their ``composer.json``. * **2012-05-26**: added ``boot()`` to ``ServiceProviderInterface``. * **2012-05-26**: Removed ``SymfonyBridgesServiceProvider``. It is now implicit by checking the existence of the bridge. * **2012-05-26**: Removed the ``translator.messages`` parameter (use ``translator.domains`` instead). * **2012-05-24**: Removed the ``autoloader`` service (use composer instead). The ``*.class_path`` settings on all the built-in providers have also been removed in favor of Composer. * **2012-05-21**: Changed error() to allow handling specific exceptions. * **2012-05-20**: Added a way to define settings on a controller collection. * **2012-05-20**: The Request instance is not available anymore from the Application after it has been handled. * **2012-04-01**: Added ``finish`` filters. * **2012-03-20**: Added ``json`` helper:: $data = array('some' => 'data'); $response = $app->json($data); * **2012-03-11**: Added route middlewares. * **2012-03-02**: Switched to use Composer for dependency management. * **2012-02-27**: Updated to Symfony 2.1 session handling. * **2012-01-02**: Introduced support for streaming responses. * **2011-09-22**: ``ExtensionInterface`` has been renamed to ``ServiceProviderInterface``. All built-in extensions have been renamed accordingly (for instance, ``Silex\Extension\TwigExtension`` has been renamed to ``Silex\Provider\TwigServiceProvider``). * **2011-09-22**: The way reusable applications work has changed. The ``mount()`` method now takes an instance of ``ControllerCollection`` instead of an ``Application`` one. Before:: $app = new Application(); $app->get('/bar', function() { return 'foo'; }); return $app; After:: $app = new ControllerCollection(); $app->get('/bar', function() { return 'foo'; }); return $app; * **2011-08-08**: The controller method configuration is now done on the Controller itself Before:: $app->match('/', function () { echo 'foo'; }, 'GET|POST'); After:: $app->match('/', function () { echo 'foo'; })->method('GET|POST'); src/Silex/doc/conf.py000066400000000000000000000005211516072260400147760ustar00rootroot00000000000000import sys, os from sphinx.highlighting import lexers from pygments.lexers.web import PhpLexer sys.path.append(os.path.abspath('_exts')) extensions = [] master_doc = 'index' highlight_language = 'php' project = u'Silex' copyright = u'2010 Fabien Potencier' version = '0' release = '0.0.0' lexers['php'] = PhpLexer(startinline=True) src/Silex/doc/contributing.rst000066400000000000000000000015161516072260400167450ustar00rootroot00000000000000Contributing ============ We are open to contributions to the Silex code. If you find a bug or want to contribute a provider, just follow these steps: * Fork `the Silex repository `_; * Make your feature addition or bug fix; * Add tests for it; * Optionally, add some documentation; * `Send a pull request `_, to the correct target branch (1.3 for bug fixes, master for new features). .. note:: Any code you contribute must be licensed under the MIT License. Writing Documentation ===================== The documentation is written in `reStructuredText `_ and can be generated using `sphinx `_. .. code-block:: bash $ cd doc $ sphinx-build -b html . build src/Silex/doc/cookbook/000077500000000000000000000000001516072260400153075ustar00rootroot00000000000000src/Silex/doc/cookbook/error_handler.rst000066400000000000000000000027061516072260400206740ustar00rootroot00000000000000Converting Errors to Exceptions =============================== Silex catches exceptions that are thrown from within a request/response cycle. However, it does *not* catch PHP errors and notices. This recipe tells you how to catch them by converting them to exceptions. Registering the ErrorHandler ---------------------------- The ``Symfony/Debug`` package has an ``ErrorHandler`` class that solves this problem. It converts all errors to exceptions, and exceptions are then caught by Silex. Register it by calling the static ``register`` method:: use Symfony\Component\Debug\ErrorHandler; ErrorHandler::register(); It is recommended that you do this as early as possible. Handling fatal errors --------------------- To handle fatal errors, you can additionally register a global ``ExceptionHandler``:: use Symfony\Component\Debug\ExceptionHandler; ExceptionHandler::register(); In production you may want to disable the debug output by passing ``false`` as the ``$debug`` argument:: use Symfony\Component\Debug\ExceptionHandler; ExceptionHandler::register(false); .. note:: Important caveat when using Silex on a command-line interface: The ``ExceptionHandler`` should not be enabled as it would convert an error to HTML output and return a non-zero exit code:: use Symfony\Component\Debug\ExceptionHandler; if (!in_array(PHP_SAPI, ['cli', 'phpdbg'])) { ExceptionHandler::register(); } src/Silex/doc/cookbook/form_no_csrf.rst000066400000000000000000000030311516072260400205120ustar00rootroot00000000000000Disabling CSRF Protection on a Form using the FormExtension =========================================================== The *FormExtension* provides a service for building form in your application with the Symfony Form component. When the :doc:`CSRF Service Provider ` is registered, the *FormExtension* uses the CSRF Protection avoiding Cross-site request forgery, a method by which a malicious user attempts to make your legitimate users unknowingly submit data that they don't intend to submit. You can find more details about CSRF Protection and CSRF token in the `Symfony Book `_. In some cases (for example, when embedding a form in an html email) you might want not to use this protection. The easiest way to avoid this is to understand that it is possible to give specific options to your form builder through the ``createBuilder()`` function. Example ------- .. code-block:: php $form = $app['form.factory']->createBuilder('form', null, array('csrf_protection' => false)); That's it, your form could be submitted from everywhere without CSRF Protection. Going further ------------- This specific example showed how to change the ``csrf_protection`` in the ``$options`` parameter of the ``createBuilder()`` function. More of them could be passed through this parameter, it is as simple as using the Symfony ``getDefaultOptions()`` method in your form classes. `See more here `_. src/Silex/doc/cookbook/guard_authentication.rst000066400000000000000000000143631516072260400222510ustar00rootroot00000000000000How to Create a Custom Authentication System with Guard ======================================================= Whether you need to build a traditional login form, an API token authentication system or you need to integrate with some proprietary single-sign-on system, the Guard component can make it easy... and fun! In this example, you'll build an API token authentication system and learn how to work with Guard. Step 1) Create the Authenticator Class -------------------------------------- Suppose you have an API where your clients will send an X-AUTH-TOKEN header on each request. This token is composed of the username followed by a password, separated by a colon (e.g. ``X-AUTH-TOKEN: coolguy:awesomepassword``). Your job is to read this, find the associated user (if any) and check the password. To create a custom authentication system, just create a class and make it implement GuardAuthenticatorInterface. Or, extend the simpler AbstractGuardAuthenticator. This requires you to implement six methods: .. code-block:: php encoderFactory = $encoderFactory; } public function getCredentials(Request $request) { // Checks if the credential header is provided if (!$token = $request->headers->get('X-AUTH-TOKEN')) { return; } // Parse the header or ignore it if the format is incorrect. if (false === strpos($token, ':')) { return; } list($username, $secret) = explode(':', $token, 2); return array( 'username' => $username, 'secret' => $secret, ); } public function getUser($credentials, UserProviderInterface $userProvider) { return $userProvider->loadUserByUsername($credentials['username']); } public function checkCredentials($credentials, UserInterface $user) { // check credentials - e.g. make sure the password is valid // return true to cause authentication success $encoder = $this->encoderFactory->getEncoder($user); return $encoder->isPasswordValid( $user->getPassword(), $credentials['secret'], $user->getSalt() ); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) { // on success, let the request continue return; } public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { $data = array( 'message' => strtr($exception->getMessageKey(), $exception->getMessageData()), // or to translate this message // $this->translator->trans($exception->getMessageKey(), $exception->getMessageData()) ); return new JsonResponse($data, 403); } /** * Called when authentication is needed, but it's not sent */ public function start(Request $request, AuthenticationException $authException = null) { $data = array( // you might translate this message 'message' => 'Authentication Required', ); return new JsonResponse($data, 401); } public function supportsRememberMe() { return false; } } Step 2) Configure the Authenticator ----------------------------------- To finish this, register the class as a service: .. code-block:: php $app['app.token_authenticator'] = function ($app) { return new App\Security\TokenAuthenticator($app['security.encoder_factory']); }; Finally, configure your `security.firewalls` key to use this authenticator: .. code-block:: php $app['security.firewalls'] = array( 'main' => array( 'guard' => array( 'authenticators' => array( 'app.token_authenticator' ), // Using more than 1 authenticator, you must specify // which one is used as entry point. // 'entry_point' => 'app.token_authenticator', ), // configure where your users come from. Hardcode them, or load them from somewhere // http://silex.sensiolabs.org/doc/providers/security.html#defining-a-custom-user-provider 'users' => array( //raw password = foo 'victoria' => array('ROLE_USER', '$2y$10$3i9/lVd8UOFIJ6PAMFt8gu3/r5g0qeCJvoSlLCsvMTythye19F77a'), ), // 'anonymous' => true ), ); .. note:: You can use many authenticators, they are executed by the order they are configured. You did it! You now have a fully-working API token authentication system. If your homepage required ROLE_USER, then you could test it under different conditions: .. code-block:: bash # test with no token curl http://localhost:8000/ # {"message":"Authentication Required"} # test with a bad token curl -H "X-AUTH-TOKEN: alan" http://localhost:8000/ # {"message":"Username could not be found."} # test with a working token curl -H "X-AUTH-TOKEN: victoria:foo" http://localhost:8000/ # the homepage controller is executed: the page loads normally For more details read the Symfony cookbook entry on `How to Create a Custom Authentication System with Guard `_. src/Silex/doc/cookbook/index.rst000066400000000000000000000017311516072260400171520ustar00rootroot00000000000000Cookbook ======== The cookbook section contains recipes for solving specific problems. .. toctree:: :maxdepth: 1 :hidden: json_request_body session_storage form_no_csrf validator_yaml sub_requests error_handler multiple_loggers guard_authentication Recipes ------- * :doc:`Accepting a JSON Request Body ` A common need when building a restful API is the ability to accept a JSON encoded entity from the request body. * :doc:`Using PdoSessionStorage to store Sessions in the Database `. * :doc:`Disabling the CSRF Protection on a Form using the FormExtension `. * :doc:`Using YAML to configure Validation `. * :doc:`Making sub-Requests `. * :doc:`Converting Errors to Exceptions `. * :doc:`Using multiple Monolog Loggers `. * :doc:`How to Create a Custom Authentication System with Guard `. src/Silex/doc/cookbook/json_request_body.rst000066400000000000000000000054441516072260400216060ustar00rootroot00000000000000Accepting a JSON Request Body ============================= A common need when building a restful API is the ability to accept a JSON encoded entity from the request body. An example for such an API could be a blog post creation. Example API ----------- In this example we will create an API for creating a blog post. The following is a spec of how we want it to work. Request ~~~~~~~ In the request we send the data for the blog post as a JSON object. We also indicate that using the ``Content-Type`` header: .. code-block:: text POST /blog/posts Accept: application/json Content-Type: application/json Content-Length: 57 {"title":"Hello World!","body":"This is my first post!"} Response ~~~~~~~~ The server responds with a 201 status code, telling us that the post was created. It tells us the ``Content-Type`` of the response, which is also JSON: .. code-block:: text HTTP/1.1 201 Created Content-Type: application/json Content-Length: 65 Connection: close {"id":"1","title":"Hello World!","body":"This is my first post!"} Parsing the request body ------------------------ The request body should only be parsed as JSON if the ``Content-Type`` header begins with ``application/json``. Since we want to do this for every request, the easiest solution is to use an application before middleware. We simply use ``json_decode`` to parse the content of the request and then replace the request data on the ``$request`` object:: use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\ParameterBag; $app->before(function (Request $request) { if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) { $data = json_decode($request->getContent(), true); $request->request->replace(is_array($data) ? $data : array()); } }); Controller implementation ------------------------- Our controller will create a new blog post from the data provided and will return the post object, including its ``id``, as JSON:: use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; $app->post('/blog/posts', function (Request $request) use ($app) { $post = array( 'title' => $request->request->get('title'), 'body' => $request->request->get('body'), ); $post['id'] = createPost($post); return $app->json($post, 201); }); Manual testing -------------- In order to manually test our API, we can use the ``curl`` command line utility, which allows sending HTTP requests: .. code-block:: bash $ curl http://blog.lo/blog/posts -d '{"title":"Hello World!","body":"This is my first post!"}' -H 'Content-Type: application/json' {"id":"1","title":"Hello World!","body":"This is my first post!"} src/Silex/doc/cookbook/multiple_loggers.rst000066400000000000000000000044201516072260400214160ustar00rootroot00000000000000Using multiple Monolog Loggers ============================== Having separate instances of Monolog for different parts of your system is often desirable and allows you to configure them independently, allowing for fine grained control of where your logging goes and in what detail. This simple example allows you to quickly configure several monolog instances, using the bundled handler, but each with a different channel. .. code-block:: php $app['monolog.factory'] = $app->protect(function ($name) use ($app) { $log = new $app['monolog.logger.class']($name); $log->pushHandler($app['monolog.handler']); return $log; }); foreach (array('auth', 'payments', 'stats') as $channel) { $app['monolog.'.$channel] = function ($app) use ($channel) { return $app['monolog.factory']($channel); }; } As your application grows, or your logging needs for certain areas of the system become apparent, it should be straightforward to then configure that particular service separately, including your customizations. .. code-block:: php use Monolog\Handler\StreamHandler; $app['monolog.payments'] = function ($app) { $log = new $app['monolog.logger.class']('payments'); $handler = new StreamHandler($app['monolog.payments.logfile'], $app['monolog.payment.level']); $log->pushHandler($handler); return $log; }; Alternatively, you could attempt to make the factory more complicated, and rely on some conventions, such as checking for an array of handlers registered with the container with the channel name, defaulting to the bundled handler. .. code-block:: php use Monolog\Handler\StreamHandler; use Monolog\Logger; $app['monolog.factory'] = $app->protect(function ($name) use ($app) { $log = new $app['monolog.logger.class']($name); $handlers = isset($app['monolog.'.$name.'.handlers']) ? $app['monolog.'.$name.'.handlers'] : array($app['monolog.handler']); foreach ($handlers as $handler) { $log->pushHandler($handler); } return $log; }); $app['monolog.payments.handlers'] = function ($app) { return array( new StreamHandler(__DIR__.'/../payments.log', Logger::DEBUG), ); }; src/Silex/doc/cookbook/session_storage.rst000066400000000000000000000061261516072260400212550ustar00rootroot00000000000000Using PdoSessionStorage to store Sessions in the Database ========================================================= By default, the :doc:`SessionServiceProvider ` writes session information in files using Symfony NativeFileSessionStorage. Most medium to large websites use a database to store sessions instead of files, because databases are easier to use and scale in a multi-webserver environment. Symfony's `NativeSessionStorage `_ has multiple storage handlers and one of them uses PDO to store sessions, `PdoSessionHandler `_. To use it, replace the ``session.storage.handler`` service in your application like explained below. With a dedicated PDO service ---------------------------- .. code-block:: php use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler; $app->register(new Silex\Provider\SessionServiceProvider()); $app['pdo.dsn'] = 'mysql:dbname=mydatabase'; $app['pdo.user'] = 'myuser'; $app['pdo.password'] = 'mypassword'; $app['session.db_options'] = array( 'db_table' => 'session', 'db_id_col' => 'session_id', 'db_data_col' => 'session_value', 'db_time_col' => 'session_time', ); $app['pdo'] = function () use ($app) { return new PDO( $app['pdo.dsn'], $app['pdo.user'], $app['pdo.password'] ); }; $app['session.storage.handler'] = function () use ($app) { return new PdoSessionHandler( $app['pdo'], $app['session.db_options'] ); }; Using the DoctrineServiceProvider --------------------------------- When using the :doc:`DoctrineServiceProvider ` You don't have to make another database connection, simply pass the getWrappedConnection method. .. code-block:: php use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler; $app->register(new Silex\Provider\SessionServiceProvider()); $app['session.storage.handler'] = function () use ($app) { return new PdoSessionHandler( $app['db']->getWrappedConnection(), array( 'db_table' => 'session', 'db_id_col' => 'session_id', 'db_data_col' => 'session_value', 'db_lifetime_col' => 'session_lifetime', 'db_time_col' => 'session_time', ) ); }; Database structure ------------------ PdoSessionStorage needs a database table with 3 columns: * ``session_id``: ID column (VARCHAR(255) or larger) * ``session_value``: Value column (TEXT or CLOB) * ``session_lifetime``: Lifetime column (INTEGER) * ``session_time``: Time column (INTEGER) You can find examples of SQL statements to create the session table in the `Symfony cookbook `_ src/Silex/doc/cookbook/sub_requests.rst000066400000000000000000000120421516072260400205640ustar00rootroot00000000000000Making sub-Requests =================== Since Silex is based on the ``HttpKernelInterface``, it allows you to simulate requests against your application. This means that you can embed a page within another, it also allows you to forward a request which is essentially an internal redirect that does not change the URL. Basics ------ You can make a sub-request by calling the ``handle`` method on the ``Application``. This method takes three arguments: * ``$request``: An instance of the ``Request`` class which represents the HTTP request. * ``$type``: Must be either ``HttpKernelInterface::MASTER_REQUEST`` or ``HttpKernelInterface::SUB_REQUEST``. Certain listeners are only executed for the master request, so it's important that this is set to ``SUB_REQUEST``. * ``$catch``: Catches exceptions and turns them into a response with status code ``500``. This argument defaults to ``true``. For sub-requests you will most likely want to set it to ``false``. By calling ``handle``, you can make a sub-request manually. Here's an example:: use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; $subRequest = Request::create('/'); $response = $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false); There's some more things that you need to keep in mind though. In most cases you will want to forward some parts of the current master request to the sub-request like cookies, server information, or the session. Here is a more advanced example that forwards said information (``$request`` holds the master request):: use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; $subRequest = Request::create('/', 'GET', array(), $request->cookies->all(), array(), $request->server->all()); if ($request->getSession()) { $subRequest->setSession($request->getSession()); } $response = $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false); To forward this response to the client, you can simply return it from a controller:: use Silex\Application; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; $app->get('/foo', function (Application $app, Request $request) { $subRequest = Request::create('/', ...); $response = $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false); return $response; }); If you want to embed the response as part of a larger page you can call ``Response::getContent``:: $header = ...; $footer = ...; $body = $response->getContent(); return $header.$body.$footer; Rendering pages in Twig templates --------------------------------- The :doc:`TwigServiceProvider ` provides a ``render`` function that you can use in Twig templates. It gives you a convenient way to embed pages. .. code-block:: jinja {{ render('/sidebar') }} For details, refer to the :doc:`TwigServiceProvider ` docs. Edge Side Includes ------------------ You can use ESI either through the :doc:`HttpCacheServiceProvider ` or a reverse proxy cache such as Varnish. This also allows you to embed pages, however it also gives you the benefit of caching parts of the page. Here is an example of how you would embed a page via ESI: .. code-block:: jinja For details, refer to the :doc:`HttpCacheServiceProvider ` docs. Dealing with the request base URL --------------------------------- One thing to watch out for is the base URL. If your application is not hosted at the webroot of your web server, then you may have an URL like ``http://example.org/foo/index.php/articles/42``. In this case, ``/foo/index.php`` is your request base path. Silex accounts for this path prefix in the routing process, it reads it from ``$request->server``. In the context of sub-requests this can lead to issues, because if you do not prepend the base path the request could mistake a part of the path you want to match as the base path and cut it off. You can prevent that from happening by always prepending the base path when constructing a request:: $url = $request->getUriForPath('/'); $subRequest = Request::create($url, 'GET', array(), $request->cookies->all(), array(), $request->server->all()); This is something to be aware of when making sub-requests by hand. Services depending on the Request --------------------------------- The container is a concept that is global to a Silex application, since the application object **is** the container. Any request that is run against an application will re-use the same set of services. Since these services are mutable, code in a master request can affect the sub-requests and vice versa. Any services depending on the ``request`` service will store the first request that they get (could be master or sub-request), and keep using it, even if that request is already over. Instead of injecting the ``request`` service, you should always inject the ``request_stack`` one instead. src/Silex/doc/cookbook/validator_yaml.rst000066400000000000000000000020501516072260400210450ustar00rootroot00000000000000Using YAML to configure Validation ================================== Simplicity is at the heart of Silex so there is no out of the box solution to use YAML files for validation. But this doesn't mean that this is not possible. Let's see how to do it. First, you need to install the YAML Component: .. code-block:: bash composer require symfony/yaml Next, you need to tell the Validation Service that you are not using ``StaticMethodLoader`` to load your class metadata but a YAML file:: $app->register(new ValidatorServiceProvider()); $app['validator.mapping.class_metadata_factory'] = new Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory( new Symfony\Component\Validator\Mapping\Loader\YamlFileLoader(__DIR__.'/validation.yml') ); Now, we can replace the usage of the static method and move all the validation rules to ``validation.yml``: .. code-block:: yaml # validation.yml Post: properties: title: - NotNull: ~ - NotBlank: ~ body: - Min: 100 src/Silex/doc/index.rst000066400000000000000000000003741516072260400153460ustar00rootroot00000000000000The Book ======== .. toctree:: :maxdepth: 1 intro usage middlewares organizing_controllers services providers testing cookbook/index internals contributing providers/index web_servers changelog src/Silex/doc/internals.rst000066400000000000000000000062341516072260400162370ustar00rootroot00000000000000Internals ========= This chapter will tell you how Silex works internally. Silex ----- Application ~~~~~~~~~~~ The application is the main interface to Silex. It implements Symfony's `HttpKernelInterface `_, so you can pass a `Request `_ to the ``handle`` method and it will return a `Response `_. It extends the ``Pimple`` service container, allowing for flexibility on the outside as well as the inside. You could replace any service, and you are also able to read them. The application makes strong use of the `EventDispatcher `_ to hook into the Symfony `HttpKernel `_ events. This allows fetching the ``Request``, converting string responses into ``Response`` objects and handling Exceptions. We also use it to dispatch some custom events like before/after middlewares and errors. Controller ~~~~~~~~~~ The Symfony `Route `_ is actually quite powerful. Routes can be named, which allows for URL generation. They can also have requirements for the variable parts. In order to allow setting these through a nice interface, the ``match`` method (which is used by ``get``, ``post``, etc.) returns an instance of the ``Controller``, which wraps a route. ControllerCollection ~~~~~~~~~~~~~~~~~~~~ One of the goals of exposing the `RouteCollection `_ was to make it mutable, so providers could add stuff to it. The challenge here is the fact that routes know nothing about their name. The name only has meaning in context of the ``RouteCollection`` and cannot be changed. To solve this challenge we came up with a staging area for routes. The ``ControllerCollection`` holds the controllers until ``flush`` is called, at which point the routes are added to the ``RouteCollection``. Also, the controllers are then frozen. This means that they can no longer be modified and will throw an Exception if you try to do so. Unfortunately no good way for flushing implicitly could be found, which is why flushing is now always explicit. The Application will flush, but if you want to read the ``ControllerCollection`` before the request takes place, you will have to call flush yourself. The ``Application`` provides a shortcut ``flush`` method for flushing the ``ControllerCollection``. .. tip:: Instead of creating an instance of ``RouteCollection`` yourself, use the ``$app['controllers_factory']`` factory instead. Symfony ------- Following Symfony components are used by Silex: * **HttpFoundation**: For ``Request`` and ``Response``. * **HttpKernel**: Because we need a heart. * **Routing**: For matching defined routes. * **EventDispatcher**: For hooking into the HttpKernel. For more information, `check out the Symfony website `_. src/Silex/doc/intro.rst000066400000000000000000000026241516072260400153720ustar00rootroot00000000000000Introduction ============ Silex is a PHP microframework. It is built on the shoulders of `Symfony`_ and `Pimple`_ and also inspired by `Sinatra`_. Silex aims to be: * *Concise*: Silex exposes an intuitive and concise API. * *Extensible*: Silex has an extension system based around the Pimple service-container that makes it easy to tie in third party libraries. * *Testable*: Silex uses Symfony's HttpKernel which abstracts request and response. This makes it very easy to test apps and the framework itself. It also respects the HTTP specification and encourages its proper use. In a nutshell, you define controllers and map them to routes, all in one step. Usage ----- .. code-block:: php get('/hello/{name}', function ($name) use ($app) { return 'Hello '.$app->escape($name); }); $app->run(); All that is needed to get access to the Framework is to include the autoloader. Next, a route for ``/hello/{name}`` that matches for ``GET`` requests is defined. When the route matches, the function is executed and the return value is sent back to the client. Finally, the app is run. Visit ``/hello/world`` to see the result. It's really that easy! .. _Symfony: http://symfony.com/ .. _Pimple: http://pimple.sensiolabs.org/ .. _Sinatra: http://www.sinatrarb.com/ src/Silex/doc/middlewares.rst000066400000000000000000000104071516072260400165350ustar00rootroot00000000000000Middleware ========== Silex allows you to run code, that changes the default Silex behavior, at different stages during the handling of a request through *middleware*: * *Application middleware* is triggered independently of the current handled request; * *Route middleware* is triggered when its associated route is matched. Application Middleware ---------------------- Application middleware is only run for the "master" Request. Before Middleware ~~~~~~~~~~~~~~~~~ A *before* application middleware allows you to tweak the Request before the controller is executed:: $app->before(function (Request $request, Application $app) { // ... }); By default, the middleware is run after the routing and the security. If you want your middleware to be run even if an exception is thrown early on (on a 404 or 403 error for instance), then, you need to register it as an early event:: $app->before(function (Request $request, Application $app) { // ... }, Application::EARLY_EVENT); In this case, the routing and the security won't have been executed, and so you won't have access to the locale, the current route, or the security user. .. note:: The before middleware is an event registered on the Symfony *request* event. After Middleware ~~~~~~~~~~~~~~~~ An *after* application middleware allows you to tweak the Response before it is sent to the client:: $app->after(function (Request $request, Response $response) { // ... }); .. note:: The after middleware is an event registered on the Symfony *response* event. Finish Middleware ~~~~~~~~~~~~~~~~~ A *finish* application middleware allows you to execute tasks after the Response has been sent to the client (like sending emails or logging):: $app->finish(function (Request $request, Response $response) { // ... // Warning: modifications to the Request or Response will be ignored }); .. note:: The finish middleware is an event registered on the Symfony *terminate* event. Route Middleware ---------------- Route middleware is added to routes or route collections and it is only triggered when the corresponding route is matched. You can also stack them:: $app->get('/somewhere', function () { // ... }) ->before($before1) ->before($before2) ->after($after1) ->after($after2) ; Before Middleware ~~~~~~~~~~~~~~~~~ A *before* route middleware is fired just before the route callback, but after the *before* application middleware:: $before = function (Request $request, Application $app) { // ... }; $app->get('/somewhere', function () { // ... }) ->before($before); After Middleware ~~~~~~~~~~~~~~~~ An *after* route middleware is fired just after the route callback, but before the application *after* application middleware:: $after = function (Request $request, Response $response, Application $app) { // ... }; $app->get('/somewhere', function () { // ... }) ->after($after); Middleware Priority ------------------- You can add as much middleware as you want, in which case they are triggered in the same order as you added them. You can explicitly control the priority of your middleware by passing an additional argument to the registration methods:: $app->before(function (Request $request) { // ... }, 32); As a convenience, two constants allow you to register an event as early as possible or as late as possible:: $app->before(function (Request $request) { // ... }, Application::EARLY_EVENT); $app->before(function (Request $request) { // ... }, Application::LATE_EVENT); Short-circuiting the Controller ------------------------------- If a *before* middleware returns a ``Response`` object, the request handling is short-circuited (the next middleware won't be run, nor the route callback), and the Response is passed to the *after* middleware right away:: $app->before(function (Request $request) { // redirect the user to the login screen if access to the Resource is protected if (...) { return new RedirectResponse('/login'); } }); .. note:: A ``RuntimeException`` is thrown if a before middleware does not return a Response or ``null``. src/Silex/doc/organizing_controllers.rst000066400000000000000000000047501516072260400210360ustar00rootroot00000000000000Organizing Controllers ====================== When your application starts to define too many controllers, you might want to group them logically:: // define controllers for a blog $blog = $app['controllers_factory']; $blog->get('/', function () { return 'Blog home page'; }); // ... // define controllers for a forum $forum = $app['controllers_factory']; $forum->get('/', function () { return 'Forum home page'; }); // define "global" controllers $app->get('/', function () { return 'Main home page'; }); $app->mount('/blog', $blog); $app->mount('/forum', $forum); // define controllers for an admin $app->mount('/admin', function ($admin) { // recursively mount $admin->mount('/blog', function ($user) { $user->get('/', function () { return 'Admin Blog home page'; }); }); }); .. note:: ``$app['controllers_factory']`` is a factory that returns a new instance of ``ControllerCollection`` when used. ``mount()`` prefixes all routes with the given prefix and merges them into the main Application. So, ``/`` will map to the main home page, ``/blog/`` to the blog home page, ``/forum/`` to the forum home page, and ``/admin/blog/`` to the admin blog home page. .. caution:: When mounting a route collection under ``/blog``, it is not possible to define a route for the ``/blog`` URL. The shortest possible URL is ``/blog/``. .. note:: When calling ``get()``, ``match()``, or any other HTTP methods on the Application, you are in fact calling them on a default instance of ``ControllerCollection`` (stored in ``$app['controllers']``). Another benefit is the ability to apply settings on a set of controllers very easily. Building on the example from the middleware section, here is how you would secure all controllers for the backend collection:: $backend = $app['controllers_factory']; // ensure that all controllers require logged-in users $backend->before($mustBeLogged); .. tip:: For a better readability, you can split each controller collection into a separate file:: // blog.php $blog = $app['controllers_factory']; $blog->get('/', function () { return 'Blog home page'; }); return $blog; // app.php $app->mount('/blog', include 'blog.php'); Instead of requiring a file, you can also create a :ref:`Controller provider `. src/Silex/doc/providers.rst000066400000000000000000000205731516072260400162570ustar00rootroot00000000000000Providers ========= Providers allow the developer to reuse parts of an application into another one. Silex provides two types of providers defined by two interfaces: ``ServiceProviderInterface`` for services and ``ControllerProviderInterface`` for controllers. Service Providers ----------------- Loading providers ~~~~~~~~~~~~~~~~~ In order to load and use a service provider, you must register it on the application:: $app = new Silex\Application(); $app->register(new Acme\DatabaseServiceProvider()); You can also provide some parameters as a second argument. These will be set **after** the provider is registered, but **before** it is booted:: $app->register(new Acme\DatabaseServiceProvider(), array( 'database.dsn' => 'mysql:host=localhost;dbname=myapp', 'database.user' => 'root', 'database.password' => 'secret_root_password', )); Conventions ~~~~~~~~~~~ You need to watch out in what order you do certain things when interacting with providers. Just keep these rules in mind: * Overriding existing services must occur **after** the provider is registered. *Reason: If the service already exists, the provider will overwrite it.* * You can set parameters any time **after** the provider is registered, but **before** the service is accessed. *Reason: Providers can set default values for parameters. Just like with services, the provider will overwrite existing values.* Included providers ~~~~~~~~~~~~~~~~~~ There are a few providers that you get out of the box. All of these are within the ``Silex\Provider`` namespace: * :doc:`AssetServiceProvider ` * :doc:`CsrfServiceProvider ` * :doc:`DoctrineServiceProvider ` * :doc:`FormServiceProvider ` * :doc:`HttpCacheServiceProvider ` * :doc:`HttpFragmentServiceProvider ` * :doc:`LocaleServiceProvider ` * :doc:`MonologServiceProvider ` * :doc:`RememberMeServiceProvider ` * :doc:`SecurityServiceProvider ` * :doc:`SerializerServiceProvider ` * :doc:`ServiceControllerServiceProvider ` * :doc:`SessionServiceProvider ` * :doc:`SwiftmailerServiceProvider ` * :doc:`TranslationServiceProvider ` * :doc:`TwigServiceProvider ` * :doc:`ValidatorServiceProvider ` * :doc:`VarDumperServiceProvider ` .. note:: The Silex core team maintains a `WebProfiler `_ provider that helps debug code in the development environment thanks to the Symfony web debug toolbar and the Symfony profiler. Third party providers ~~~~~~~~~~~~~~~~~~~~~ Some service providers are developed by the community. Those third-party providers are listed on `Silex' repository wiki `_. You are encouraged to share yours. Creating a provider ~~~~~~~~~~~~~~~~~~~ Providers must implement the ``Pimple\ServiceProviderInterface``:: interface ServiceProviderInterface { public function register(Container $container); } This is very straight forward, just create a new class that implements the register method. In the ``register()`` method, you can define services on the application which then may make use of other services and parameters. .. tip:: The ``Pimple\ServiceProviderInterface`` belongs to the Pimple package, so take care to only use the API of ``Pimple\Container`` within your ``register`` method. Not only is this a good practice due to the way Pimple and Silex work, but may allow your provider to be used outside of Silex. Optionally, your service provider can implement the ``Silex\Api\BootableProviderInterface``. A bootable provider must implement the ``boot()`` method, with which you can configure the application, just before it handles a request:: interface BootableProviderInterface { function boot(Application $app); } Another optional interface, is the ``Silex\Api\EventListenerProviderInterface``. This interface contains the ``subscribe()`` method, which allows your provider to subscribe event listener with Silex's EventDispatcher, just before it handles a request:: interface EventListenerProviderInterface { function subscribe(Container $app, EventDispatcherInterface $dispatcher); } Here is an example of such a provider:: namespace Acme; use Pimple\Container; use Pimple\ServiceProviderInterface; use Silex\Application; use Silex\Api\BootableProviderInterface; use Silex\Api\EventListenerProviderInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\FilterResponseEvent; class HelloServiceProvider implements ServiceProviderInterface, BootableProviderInterface, EventListenerProviderInterface { public function register(Container $app) { $app['hello'] = $app->protect(function ($name) use ($app) { $default = $app['hello.default_name'] ? $app['hello.default_name'] : ''; $name = $name ?: $default; return 'Hello '.$app->escape($name); }); } public function boot(Application $app) { // do something } public function subscribe(Container $app, EventDispatcherInterface $dispatcher) { $dispatcher->addListener(KernelEvents::REQUEST, function(FilterResponseEvent $event) use ($app) { // do something }); } } This class provides a ``hello`` service which is a protected closure. It takes a ``name`` argument and will return ``hello.default_name`` if no name is given. If the default is also missing, it will use an empty string. You can now use this provider as follows:: use Symfony\Component\HttpFoundation\Request; $app = new Silex\Application(); $app->register(new Acme\HelloServiceProvider(), array( 'hello.default_name' => 'Igor', )); $app->get('/hello', function (Request $request) use ($app) { $name = $request->get('name'); return $app['hello']($name); }); In this example we are getting the ``name`` parameter from the query string, so the request path would have to be ``/hello?name=Fabien``. .. _controller-providers: Controller Providers -------------------- Loading providers ~~~~~~~~~~~~~~~~~ In order to load and use a controller provider, you must "mount" its controllers under a path:: $app = new Silex\Application(); $app->mount('/blog', new Acme\BlogControllerProvider()); All controllers defined by the provider will now be available under the ``/blog`` path. Creating a provider ~~~~~~~~~~~~~~~~~~~ Providers must implement the ``Silex\Api\ControllerProviderInterface``:: interface ControllerProviderInterface { public function connect(Application $app); } Here is an example of such a provider:: namespace Acme; use Silex\Application; use Silex\Api\ControllerProviderInterface; class HelloControllerProvider implements ControllerProviderInterface { public function connect(Application $app) { // creates a new controller based on the default route $controllers = $app['controllers_factory']; $controllers->get('/', function (Application $app) { return $app->redirect('/hello'); }); return $controllers; } } The ``connect`` method must return an instance of ``ControllerCollection``. ``ControllerCollection`` is the class where all controller related methods are defined (like ``get``, ``post``, ``match``, ...). .. tip:: The ``Application`` class acts in fact as a proxy for these methods. You can use this provider as follows:: $app = new Silex\Application(); $app->mount('/blog', new Acme\HelloControllerProvider()); In this example, the ``/blog/`` path now references the controller defined in the provider. .. tip:: You can also define a provider that implements both the service and the controller provider interface and package in the same class the services needed to make your controllers work. src/Silex/doc/providers/000077500000000000000000000000001516072260400155165ustar00rootroot00000000000000src/Silex/doc/providers/asset.rst000066400000000000000000000045401516072260400173720ustar00rootroot00000000000000Asset ===== The *AssetServiceProvider* provides a way to manage URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files. Parameters ---------- * **assets.version**: Default version for assets. * **assets.version_format** (optional): Default format for assets. * **assets.base_path**: Default path to prepend to all assets without a package. * **assets.base_urls**: (Alternative to ``assets.base_path``) List of base URLs to choose from to prepend to assets without a package. * **assets.named_packages** (optional): Named packages. Keys are the package names and values the configuration (supported keys are ``version``, ``version_format``, ``base_urls``, and ``base_path``). * **assets.json_manifest_path** (optional): Absolute path to a `JSON version manifest `_. Services -------- * **assets.packages**: The asset service. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\AssetServiceProvider(), array( 'assets.version' => 'v1', 'assets.version_format' => '%s?version=%s', 'assets.named_packages' => array( 'css' => array('version' => 'css2', 'base_path' => '/whatever-makes-sense'), 'images' => array('base_urls' => array('https://img.example.com')), ), )); .. note:: Add the Symfony Asset Component as a dependency: .. code-block:: bash composer require symfony/asset If you want to use assets in your Twig templates, you must also install the Symfony Twig Bridge: .. code-block:: bash composer require symfony/twig-bridge Usage ----- The AssetServiceProvider is mostly useful with the Twig provider using the ``asset()`` method. It takes two arguments. In the case of named packages, the first is the path relative to the base_path specified in the package definition and the second is the package name. For unmamed packages, there is only one argument, the path relative to the assets folder: .. code-block:: jinja {{ asset('/css/foo.png') }} {{ asset('/css/foo.css', 'css') }} {{ asset('/img/foo.png', 'images') }} {{ asset_version('/css/foo.png') }} For more information, check out the `Asset Component documentation `_. src/Silex/doc/providers/csrf.rst000066400000000000000000000025731516072260400172140ustar00rootroot00000000000000CSRF ==== The *CsrfServiceProvider* provides a service for building forms in your application with the Symfony Form component. Parameters ---------- * **csrf.session_namespace** (optional): The namespace under which the token is stored in the session. Defaults to ``_csrf``. Services -------- * **csrf.token_manager**: An instance of an implementation of the `CsrfTokenManagerInterface `_, Registering ----------- .. code-block:: php use Silex\Provider\CsrfServiceProvider; $app->register(new CsrfServiceProvider()); .. note:: Add the Symfony's `Security CSRF Component `_ as a dependency: .. code-block:: bash composer require symfony/security-csrf Usage ----- When the CSRF Service Provider is registered, all forms created via the Form Service Provider are protected against CSRF by default. You can also use the CSRF protection without using the Symfony Form component. If, for example, you're doing a DELETE action, create a CSRF token to use in your code:: use Symfony\Component\Security\Csrf\CsrfToken; $csrfToken = $app['csrf.token_manager']->getToken('token_id'); //'TOKEN' Then check it:: $app['csrf.token_manager']->isTokenValid(new CsrfToken('token_id', 'TOKEN')); src/Silex/doc/providers/doctrine.rst000066400000000000000000000104371516072260400200640ustar00rootroot00000000000000Doctrine ======== The *DoctrineServiceProvider* provides integration with the `Doctrine DBAL `_ for easy database access (Doctrine ORM integration is **not** supplied). Parameters ---------- * **db.options**: Array of Doctrine DBAL options. These options are available: * **driver**: The database driver to use, defaults to ``pdo_mysql``. Can be any of: ``pdo_mysql``, ``pdo_sqlite``, ``pdo_pgsql``, ``pdo_oci``, ``oci8``, ``ibm_db2``, ``pdo_ibm``, ``pdo_sqlsrv``. * **dbname**: The name of the database to connect to. * **host**: The host of the database to connect to. Defaults to localhost. * **user**: The user of the database to connect to. Defaults to root. * **password**: The password of the database to connect to. * **charset**: Only relevant for ``pdo_mysql``, and ``pdo_oci/oci8``, specifies the charset used when connecting to the database. * **path**: Only relevant for ``pdo_sqlite``, specifies the path to the SQLite database. * **port**: Only relevant for ``pdo_mysql``, ``pdo_pgsql``, and ``pdo_oci/oci8``, specifies the port of the database to connect to. These and additional options are described in detail in the `Doctrine DBAL configuration documentation `_. Services -------- * **db**: The database connection, instance of ``Doctrine\DBAL\Connection``. * **db.config**: Configuration object for Doctrine. Defaults to an empty ``Doctrine\DBAL\Configuration``. * **db.event_manager**: Event Manager for Doctrine. Registering ----------- .. code-block:: php $app->register(new Silex\Provider\DoctrineServiceProvider(), array( 'db.options' => array( 'driver' => 'pdo_sqlite', 'path' => __DIR__.'/app.db', ), )); .. note:: Add the Doctrine DBAL as a dependency: .. code-block:: bash composer require "doctrine/dbal:~2.2" Usage ----- The Doctrine provider provides a ``db`` service. Here is a usage example:: $app->get('/blog/{id}', function ($id) use ($app) { $sql = "SELECT * FROM posts WHERE id = ?"; $post = $app['db']->fetchAssoc($sql, array((int) $id)); return "

/ak/zFhȼKs%D=áQe+_uMJٌyey[W{2|<~ފ]M}_~_čះ!e&YぜH9Q0d8K6:_9a4{X2pGL_|emR[ԙ y* k*8N^Oe/S|YөK +8.iIt엛?j;/}jcuM.p<` ӂs? x="ј>L bHP31}׮o?i]#y<!} %V94jQCծbU9*fwϻ+/ߴ_Ai#TRfBxlo_Qj7VҷDT1_~Ú=o?1jn$G`q%o9NʵgNgVPQNrkc>wH#:iEmi{;#RzgU1_6oT4hE&$աKxScUL|:\8L*bgNG(ޚn+ ʔU! ${SvZ.ſٻW"j 'i5ӑ+t!@fVPJC/˞9~2xíW6wZ@V9QmϿ~<\_Zˠww|PBG}TGq) y?jeu)|kVxoO^ I\8f)V4/Xivv$HXdDAq_=|!jUw6ҰT=*1U^ƪvzgta]s;I_u}O?lύ?xC^-ዩHp77Y5ZG,e_Ae?"g ctHum-uQ2y#oPi<7;X8cO }0Ysԝ|M3W^Mnz0Rg*3qɭ_>#o&NP\X7UC\9 #˟lט>8;y#~%7[:2 ?>.paZh]ˢOo 492~d{tx,=Uft Ty3_<-J%h؂# +hZg6~s'<><$EAԊX?)^ 2+?-EuZ^^|6Iu;X+qcK&G}k+Xר,o_8'J&eWiv׎txMox'=K.2Bp3+i-_ơ;ƚdzG|>OcJ$诱ܝ@8;Կm\[ɫxk৊ ]u,h6S zMׇR܆.Vt'^N=9m/oK&^|fU+/=fg?cEi1y?hMceob$[٤Lr;G?W}_I/xƫg_Ul6140t)NъW]lR޿'/,K%~y?gca\sث<+$Pdnk3/ŝOId?lZ_Om^C2b05eN~ڒ[NK2%uf}Awx^{}Y&H&3>mzҿe__&]Ҵ}@/,r#M˜rK(a[Dय़ !?HΛ ڿ(dkA) }p:lٺgZE]յ~"N4ݒ:CCvZgu.-cЌJˑG~?7pmWʅ|6?.M8g*0P%nGw Qq}wx@An;Wq A5oSg߃6j~(X]7Zīi?ELLվ([~8ՠ[F}JhH. ?8e|CNi~'S} Ystv+Rh$InI#`uM b53V0У_-ǒ-%xIEo>kmYt{Ʃei`[ds\*`z'/4Bi4W 2%I~sƿԟ5|O) y3ܵS#?jORlmJyM1FeWD[$'?wAKr\=d\W+5ԚZ'uy[\^&j K1 dg_\m_u{MW-qƱ(ܤJ]b'w=Oh&5-"츴-p$B x߶߅lmm5MtrI'VDz+qXM5E%nFkX^VXTNiVՙ)'|3i&7z}Wp5.G|Ni0qKv+E77|UԵ[-Ѯ {U\ʱ*j͍L봜WWhĞ&w7 OK!|Ge稯'5_x U71xBmc@D1ԤiTΣ))Hٴҽ[6wkis"i3wn$(ţ+^I>S o?#JPNz(.iskނJܳj_?x[bInF@X^O h־.~κ|o[>!kHm*Nʃdj0t!ω'jxk@hVV܄Щ'^_ ~=Ѽeiu.XޤQmfE˜z̻'*phERRqj|qwwZ'Rӹsmy9}8˿gŸO/=:34Cp1Z =:ntk7kVaEWGF?2igdb-qI{5/~*~U+$ÿM#]A Y¶֖)|UI x2ne0x/CgIxN~<7cgAcak:pasGlF.Su#BvәV.ҍ>{fXLoHibTeK?YƑ(VF17vaQ9aھ'G_`FxjF(AC:𩯚̫YT=:SܭwIսEKWK=Z&Vm[Tc!R}b*m3V֭Nc5"+S{ㆩXgg%‘۬ 2QJx?i7O?xWWQ4˖ k:$#(*#oC<>=jNq |ۦ,ُ&\}]O{d)X+ۑڳ#k?xOEKXjPۖc5u¿*q0x{ջM"~ 赹A&H'NO58XTRJ2wR۳ڵeEFVgꆯ~muMKndCyyNAvZP[=rIVcgu/xW_-.6bHۜĞ+/4i3i5A5+L3UA<I%^w>Hۼ[{iw*I: VC:Țg|7>'|Yqe, d*soψ724jqE"lhp3/76~ >9x{O2 $anfmz軎Nd⾧-Qe&V~I)7oT''bep>'A?˰X>/:JhBj(hu)8Ӎ}P^(kX\(?| Jwߏ^5|mMEϡ]1i41HGDTk֨b?? x2r:ZJ%(EwO@r29 _[%۵Kp".7íTWzE )pyCdYkbi:ƕJ^ZfkVQvݥ5xG]ZL>rnn#5~_O_|sjf$G!,B۰xk9eJ|% W|y^6"IVUqg*p،qו:!'&rI.&Y)pW{7ڝ\Ewo MF?^(~=h>#5u0"}+Sp ! m*\x_fW`X91>ڜnYG[r7vkɴ֦)'̬Š((k准4=CX.4y.e8XE,}F2b&G9_x7͞eύ}(ӡ?KV`c"Lr/΁_.K#|8W®vc]DEдLȌ:~6IVB+&rL ~]jiJqM8N^B(Т(+=p*((džͫz|3m[QEVN|5}5Q@Q@Q@Q@Q@S7fAZT V:*/Q "Rj^M̒re_o?/xE-3Ǻ@U1;~b6!VSF9s sZn뭼4RJzQt䝖lv|E4n]4'r,۟ wW~Uk6?ۤʟ2Lg>:px\ZЇg'>Wu^:~|Kծ5OVTԮcD7#0=+MJC8<# מCwV,&u8en I4o4ش[zogQZLҀ0Lr~"|hk[[5K 2#nf-׾y+Rkw L7(UMǖ˭_MnYs_|u(X(%$R pQ: x$Mլn_뢌n~`ץ|L}T.]aXjPL0!E+a+?ӧo i|1t4X1]FI%X 8lWN"Jr4ًc'V7:U"vv^I:PO&b|sz_Yu}OL+vpIBH@:s?g߈0i>4Kmm3öw&BEcwt |3+?Tky }G_ 0j}j<- ^'9'VVM3|+toq=洂g*23[gU[ ~!?Ow[ w:* O5]``nn<w ^|;|GwZw 98&zè9߀=i'-?ǂ[ǞM+FJ,pE' A?ik|?k6{[_Eo}1> KĚPG*CHF`;*[_ ~ Đ{mhbnB#}_ x#OZvm -IN2OrMxh ?oV{~c'2:5Vu`ݵN3o*=5m0ŸGgL~&{$oR{q]+fo|-s&x*DA +ptV k__Aap襲__N+$G*HG] U׭eеxW|[I.@ z|}o~(m{e0?-BHR1zҫ^: ^Ԛƛe{ˤmN*w/5-бl%žnAS`G5uwjLѾ%|0~ۨoP+m8RQY|p*r1MJ:꼻ۭk5*^.^]ݏ;C6khF贝A8 vUJ־1;xrEM0IOud!㑌ti+MkMEuq!OdQu|!Ğ"nO}ܨ8bňL \D>2w߱:jQSTRQKsk{5k>CzjX2X%G! ߴ?b=G]vxDqiUlw]3}_7~%m>Ӗ?νo5[1Iqا+L5X4[rN.߃>1z\{o{x? (|Q?w̄@kZȎ6=2FWVt}&AlV葢U@? {kw᫋ݬwcxWpAHfS+j𔷷Yщ_K/Ş۰kyY#eTAhR Z[qY? 5 ÿW֑xGP,Ρ3HD B' o5se|&5|E=FK=SX^`WQR5U_EÎνkٸѽպ컞feI{)G߅V?Fh:g(erNI1UGWJJr94'd>BҿiPsjg>k+_rM/Ռ" dp}AJ.88gBQBRVk bx?E %ҫ?GNҭj_?ࣿ3Is75z Il["毕?O=~#,˴dyG}'ڿ͠炨gӕLiHB? )DY"6L`:sU JkB5!Wψ| )*wz?A_h_&e_鿷 \_n8uBw1VjwS4۸UIRyy}9T9?TNu8zj{1FaFu`y'g?+?h7M}s׽|J\_~LmVN|e!_pqY`hYjեfcЪДZ,MAM|'JgGthp[]=2)nL)#8u$_uk7?-uK'3>UeR$^UXYSRNi+.z6k_&/6(RFFr?¿_Ci_ 4Ƨ2o4R[¶8w5e׺V{vg~~܃bC˕ox pὄC̼@#7߄?j1Xt-@Ң@h˖`$n=:1Gώ7,v6G"]oE ᝜ coZX(#%i*Tœ䢞+6ﵴs$I(. 2GO \\}OZuܙ ByeY`; q_I¿x7XFu>l%%]H pqzw<yHDžv_kYz7LUYHܙH9RkruvjOc2 0r$O媿s־$|tu_g7%G Hʲ,A >;O=H-B w 56V5Nj~j-Na}м++ ~n}kmV F@F\FU>/g/6{oR2ՌZcRuf8M˺7Y8ʐEyAg'wpo+*%QP|_ߩKV87'k~'/rž'?bn+]Ϗ_LmR'< ;o|DxS\xCe@^"$?}.uьb&{Exzsce{M/+⛫>F/.dvs,ª-wccc$xÞ#qq޺6w,3ʌ3QN.NNQg1!Z\ FVZg\7S|yH֬d#-2ŸsD񗈭8~ڟd{M`.swϡ>-Ë_L $dJܻ3~5Ww6|E{oGVv:;X\} >UFxU*4[SrNY}z3IE>W7nww{BcωPyiy:s@[h ʏ^oZMМ G) ^l|7:th:̊."ƌH(}Y@ v#1FPiu>ЫD޹oO|Jhږ@/fӯ1%澈&d5 q.m팩YoQs1X׭JZM_*[zjx\N#h5RVV-W{hv]}; 5o M1WQ`0hy}x&]I x:=gGG.~qbI>O}U' RYjlD1#f_"[~wW.?}rV\"bG^S#|CSI[T_y+ 0yҕEf1! -mnmhU G$ Վ>+kOм+jjPqoȻ2N<ܫEjx\;(s8nOsDC#+Sƿd_z/Ma[ry˴ںVK߫-}MCEg$|?}GE|%_,⿇6-_INmJw6F l dߊџ6DFu"hK~,sK>I6dwoM{%O**7-iݾE;/'5ܯ !'֮d=dKիl|[ h1G4uoh5RBc@O_7GCh464L1-$vd>/~K_~vkS2"V nRNMj5ho}μF 5'j7Z$~ xē@qel AjHHΨ$Ì׫l(z5߅?iPD6 aX46XfufB2z|?sm~_ʹ)c ErX3NZt`{_oZqB*29Ehw}bliޟ HaRSE$|?{`?ʹ??k]k:Fq|- XNXݨeOA_7En!{rMnN k^>MY` 0VN=klҚ:pr:>RZG/ t^3pA,G]xO>a<с3\61S__|D~*NxG@N`TjURpE,lR$$ՒԞa:4)ӒqIGfK\?h s࿄tM3-M,qlEMy2 Okz]ߎ,\G%bE/38+g}_㷄tk 4gzIoo,1qwslƄ@3\֋ &oiv'.:QsqYWs%(ryq1>)pI6m/~"5PgkVM\;.bӀvOV~%| ݠx rڃGI>.\N?NB'F i8EC əDlj nz֙o6RVvI}M2l:ҔZoGkY&|^F=xjOԼ%|0m4kB|VA׌:3V~ <x[L] 2&)n2[,V b_םe>^K|/{߱?'59y9~ o~ڔ$H{ GEϊ G-{p߉|I ik7j`~˘geQV<ԨEՌ[i^^QVBUWK=n9e*r*o%֗y 'I ?ZدᇉCf6=ȃϊoݲFF̽T^JIV< RXRߣ8D;vR0I^FwWF./(;kn:yAQZ՝}W_ >ikii*u̞fOuMu&5+C֟^mH ^P=jg>=].VZ $*=y8KrbNj0mjW%Y6Jpjm5vՒWOzM;Kj _ /?a?W]#-Kk4𲍊ׄc(N7n]G ~/HǗG\QWS\Jۥ޾g =eFzWk}"}N9uc* 0"6NH20+arvVEoFuppTnoYt_Ȟ>6|VGo۲o'"%k2$x-!+/4߇~<5Eie;,ެ,OrMoWZo{_ ;'OsO)|7҂m՞7=4,WF{ڰkk:Xzh>ާMUx.w5r$dfk<@ls WHrFx t1.l&2u4JkZ\8A&t}mxCjΟKsȎ8Z\c;Cq+ȿmYne *ZH@ ϿG\j6*lQ(_[>#kot kkx*BNwGw%~KAc"_cDy0x=Wv߲/??߶quV{!b;" ~X,f*$PmhƤc({8IFmd=!>ޟ^t? oxsNqm$0@bH\~Ý K}mbL0mɑwfWPy`0y/US٦Ycʕ9^8.p襯~7C>׭q_exF}/š-yW6P*d##=+ߊiO+9Ӵox[M. l1a峇8ӜSQM(fTь"S˳ ԏ6k|9&n]L|oGZ?ռa(խ ]j%ؠ6 lH ;e=f~w[ 2%]~;UqD#Ϣ.!WUᇷv}߫/NxL0;mV{|{xw{k' M.9QecWb BMG:kwhY59LʯGվw/.2fyy6x/鿱=59g1_4~O ntP˧Jd^Nz~ ãLӭ:~5O_*j~'~?׼?1{ J2I(ۆ#;q8>E+4}k磋Ps8+e]͛zaukqE4I# lA 5??gxjWZ[/EЈD]g>>.?i\^s^/~g;P ~.O~=6{OcuBVYܒX!rHUJJV_ܓ쾎J%.eDF~~,kόnC ]>Ճf.D"9$AD߇&lbo4˫x"|*Id8BJU!{uKyέ>[˭_}?6~(IU ~+O~&4oi:qM tl# g<}+j+4zr 4z|hKVOfpu-SPF?gv9#caК.l&V\i#׳_M^;\<#L\$ike~|Ꮑ>KЭdEv">@9,{.sISY};@i2BuvTשPjVWQ,R* zHt)+4tK xjK-5t|pKmF)À.}kZ/Km62o&X\Y$=ȯ_?e?/y0I=C2|*00x/T,?}Oqĝg>r,zeCb3E$ x|U\>4):V~wqH :VOkLX7ླ@ w, UO6'y{-> Z~, gP;@軘nf9$dp|+/Qe}s0uPtlz*x,j&?,fL2Ȳܱ8د'7 Fc\m9/=z];__١v yԌ[oap5t䅷YYU$ ? nuTduRb2G`Frj??h EuZ6"uF.?"3\erA=}wԞ T ˙et*YS4lM=V/;r?L|y_-)~ҟ WB~ +-1fg7FJab1OҲ?a_1/?K%T3yݻc뎵k[:rW读Ͳ6#2%'NJ_w?~,ѸJ>|m'D>k/$dV3V#0fnZ>&붽#G|0x9b[K,u(LkZ-/SNr# 2 ][ uOiƁLK[y^=)WA(ܩ VuPmF#Ɯc#>ƃM0x6wvQX\(h95῍_g?gśox\m5xg\*f]"𿎿io5?v~2]>%V4Ѩ—!' RqIfo [.iEi(YrC62&H8P_*8' if{oC8'eNդmn#_}g_n7]4fKkXU 7EFwk>Kkk>{?W.|_}Hva+0:_dΡ ,|RMq *orr{E0CͿ zx:nնV|{xGo:KOW6F-| 9 NQG}͜A??~"k,[<~0< xÿfF7G'Ko\=ׯ/k.w=Gog;^w⿵++~66ڟ[X-5eCrq׸x/ߴk|4nK{H`,xĐ?t yLC^NvV_kkTKC࣊2Q\۰%6~W2 A.>X~.': >n&`t`JP+ü+w6m{wa[Y^.^5]x,e[k{Rqn3^+Y_Vpn9ZqM٥k4>^JUT$PK>+h$_ #N:^Z[CW̕uEI$]Q]캵nS[)qSݫnK?3>#U4^?=y^dfSo/hRs 5Gج#OFZjvڒ `Fۘb'G~Df>5m@6ٗ`mozgOlwwr7΋8deRr' ON-%8&np4qt&Juoɥ۱ G.i3"63FO2PU ;_?ѣ{j~9- qLL?tQMzO9hk/ d[WMV *J2wG7_-.kgB5IW`9B{kN/Q enSJVXr'oۭ5Nh"ttoDcN*edub;+"v˯? A_>;ҬaV7yhwԑƾ&~2G7Ř5- /'Q÷v_|ԟlA#*'^: [N/jvӰ@ z]73J"a}ZjY_S1kB B3mڵz5|ǭ3ih.-cA*AG~?+M[Gj n^&?*zO=?ᎱkJysx~|r0LV!i+K(560ǘ?u*4'VN))-f8ajWQf^͏/Kx;xÍHP Crow ȟׄ-e\cx^5'vn˲ 36NZŬt38Նk*VJŮۥztq6n?L%~+Ўů>7e-g]|;ƾ'4  |tb +|KĞ*_3Ŵ&;C3@}t s⫛&I t !rJ? ]׏kkmWMF{&emC$2ܲeLl mz/ڷ%_^16?0pS_+S 9җ5mϦ`qpx)QF|֋R6Xɮ2'X"+ juǿJ W[?? ZM-Iuuo;z(~|Aݣ_]ooѢiHȆ=fPCS V n-{wҮ/ǕҔd2M+K@$_L&ݣC#?G{@|s><-4u]U.r@x8yXerG #߂P_]۵} {o*hTyio:j%[=^\|D j'׾x°Z.$h`լ'yTd6Mz~w/''KfOqorӫ b,Jvg1NT1yZ^FKS89CM=uόzqC7lkM;,}+֥QVMz?hU(~>!dLJďS~si>v>% iW1r#*sǹ_x4/ xUb,]`g<ц9)&۽o Jjin< _g<|9p!IŠi?}# G_nYZm+i1Q|]a|b{SV-ce  Cq޾czWC~fuF '8e$ m>l.2U4ҽGENlafP2I+' W3s0M5K?C]WM {/V}KOHn$#ݝd_, ς>+5!"XKkf3kYΤX,ykteR-JtkcDx׎.t]޷-68uk?˒d2\O6ŏ7~w?_[^؉Iiv*a1Sq-'Ӗ:}'įxF5/ д Ǘj60Hּ SwʌlDRg{)\J+Z#^Οw0r;ArugOZ5t4ŎS9WIm[GusC" $Ce# _DO |d|FDp#^H7SG~f#YO@MFմXZ®V0ȭ(H1b3oMO1|i[jzKu:a*W d19ʼn< 5&5չV?oM`)Ӕd纷*~]Ϫ|A 7: ]GaBq)Ɗ2OXrz zr|i#&0lva o>PzH>R[QI>^AoE+dR>s 7[ºot/^Ҵ0ķR~I'$֘ڲTSt|kVlZVYԟOYqh`*=:>{K-5/MϏtm+Ŏ%m+E%p*9!$^ Z.U G-#c8O5O}iڒ#;_.Lpd>RC$0=$t_XC~zEυ-~nlL3F(wePA$5cG_Sj20kG+,khٗ%V~nW칹|9__MW`cO|1{o^o#>[cum=}S6XO,,!p]2 :^E|2/_mM?߻e@tl'+Ru1n7,kE)ǒI|gg'W#ԵQfI#$ gE #§'/I_5#F+_xoۭOg Nx~<)EOX%aiЋ䊟=G㶡-sW~]@6tqy|d9.-O->^.[aSڿCklo"N@I{o*ÕV%Wrb)aFywnUvqb]hSt\os~;eMcMco{kqq9ݿ# j^aADLO,cELGjd4* \2RT]լW[FA2UGSJ Vwֶζ_lDmkiGhտ`Eνmݗ|>Ev7/ Rj oF'|دƍ'Jմ tz}N XR?ֿB-ZG_RnOKVԣ-dogc'ᖣ4{W2#>OoCJNt>lX *_??û]L,qsmNHz ~'~pU x,[k p5]J}략zquj v+٭,i]ZtܣR8٥fF;b>Tu|Ɯ!^Ӳݭڔ!NIn_4yKƟf~r{uBh!#ت'_pW~ǿ~ NmVz̗bDbvoRAOV9x^?_!iA|nDs v8ʪJj0q-W]n~eʵHRWK{mn#2տl?|'UE&a6Crl3g*?>_|=-!XNI=I$?| M ƑᏆ }ݬs Žܒ{N?lO'oL? tܫץ7R[E//8JRhugH%G5 i: 9dk>#9'?_ e+~uĈCo-i:qּSgoytK&*N8#p`܎qZ*iB*m[1ѣ EMɧ̗tEOٿP @-Z;S<`e߁$;2{A~>m O' #~#V`_޾g_.[ǜ5 ?@+ _(b^n-ωmo~"o.ir-~u^v%BQ6ܺ4m)g_ ^KO׵B9X5SͼN×'5_?m`M3ĺT>}&v7Fr#UO!Cீ^1kg_R>0O'ME5T>+ګwڣ|O;Or!dF` o9T'7jtֶSVW/NU!=_'|@ׂGGxC%֭K1U! !w`3|yt8|'/+g.%I )gKY1"kc|`gǍFO{N"t;&۵]~RB"eFwdOA_¶+4S8*5#)ԗϖ7NKMQ]ly"X}Υq~"7fXnmYE92Gk-o?VUu rb;Vea_4|=wu¶~U|EңnmF9 *ܨ9]q.$ZD9ѩ%%(5gWRuZSiV]G KWyۤ_#k/MWyE1W~%|F!-5}Qbʫbꡘ;aCp񿅼1cVkiGh؍2I䎕ߋ0X\fES$9UNIKf2jͯe8&ÿ~ȧo\57Of?xOŚwO4}ώo/̽TfSu<)g-oO]]vm03HS=)yTGV|IFY^wVw*O ʖ_}W_%)N9^6?:EWھ&?f0ௌ? (_MTʙEGue, q|b|ҥ1g^|3xv-l5e!KͯF7mS7Ci//w _/,jZq_2X;dbu|818Eb䨤n~x^QJKw^꒓:ON<7x n@6;+9q-'?/Fq}7ͽƾaxLvBg4m?eoT%f[Z"6e$QO$ >3|:\v҅:rK)-|:ݾ:cYԚQwiɩP$Ҽ &җ~ U kzt".)W}~ 迵웠]xBmAK'06H-E zt)͸_B:uhJ#ieQuFVE߳_>;x|/ X?ly?LM/o+75?DҩXIJ.IhS2W(< k 3,He@82E$c=J~,4XȲ_Dr6qgBX_ )r{~ I xwG$sa$+6|LA'i\_s ,D)bp*%8T|zs)t}z5;6m0|r_}X񾲺6{x0byI-$`qɇ?c]CT$N>Ό[L ʿjGhϱ}lVYCy{"1{;^ ;z߄5<V{9?He8`{|'eN#R`I+ײ]Ji'sb=BRMh.^dlZo Ѩ[ZV2>"HW")ؑR1-;{ #X&,y³MY6 ̺[ncX|9eru  BbW$`_įjci<$g*WnJ iGبk[m>?nK~Zݫ%~ëu\ۡ~𯌬ljm*0ZtoH?acXB$h0`; WZw)^U cVm-7bӚ}c8ךaݥyJQj*՛փ4Q__?O߭j=ŭQܐ+\.e9jܣ5(ZINrK Z)!e;f^G}WŵbsujRMNN5AN4c ?6 5][=sObW|O$l{;s_"IhKm>#~#eגD6u+ 쯟r&=~k5D0$dYd8uå~ e8c)SjHTtӋiZŭ}/s%"W$O>'k^1mRh.۴|+7ʬ@6 l {ofR{$G<5}_i=;I/ MmM'ޒViܳvʊ+׫:96{oΔUQEŠ(_z(( _6oPEPX~";ַ+_QEQEQEQEQEO jS7fAZ訢(((((((((((((+KǟFn5]EYLI Bi#kchT- A[=<- k |m]Ů K73"V(t <׹)yglq̻7 ]PKT1ԢQZ$|g|mO׮k^\Zjʩy Hʓ(O^/&_GG{^ |$soFiݑXn۸h|QBW0xR*rRjIRij%njr|7Uu$w4g_m}R־j}M֭i#)@GdVI5Wì,=]O//CX:~ oNEWYQEQEQE|Ҽ?k_[Hq$*p; + V"7e%cAb΄_y|?Kfk-i[=Up`zkpT࠺+RS5%QZQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@"~ Sw┾#/X 6k18V,W=q_]ErapQTbs<ҿB((ůOu? |>m6GxtJ]c@ĀYJg~6Mfo_L.[bnvݱ^EpGo-n 6[i7/}/-!NIg 2+6S^gk<{y IO6H..⪪2FNAv"׳I:w.o}ӽ[Vo+B 0+>((((((((((((((((((((((((((דɭx^gi&:$gP3~0‚wh󿳰}DŽ3~0‚\g<  kK5eKy,XvmZѢ&mG C.jPIQ]XQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE ..5{jѣiZ'p_x'{<% rlᩁU ߌ?kk 5m+Q׮fkVT$)ebBB}k8J$C%8SI+ ( ( ( ( ( ( ( (8ooQɫbcɿ{R~߽F3'ָcoPO5W-L- gLA67ga]/ Ij~!H!Kq`qz**cF 4L0ZrS4 (((((LP!iJix;$R#9~_'m/þ)ЭIK;e3 )6e88բ(V)8kkuZ>|jz(@B((((((((((((((((((c3_~,iXG/ÿ a@bk oﲆ~8UD>5LjGʦnpbrFS](ü((+oůZ/x^OB2Eͺ1l 3}EzyfaW*A'(^IIj="pU"ρo_[2|#͖Ś+[E\[Ɩd圻@N<}Kt5e[2Bٸ |YJx y~? ѧ)-qc|qW|a|~ËWi|{I%DѷmX7O3k*\'CI78սz%b^ZboLr((B=z+~#[QQ3>>Xc_7⏅~!xO>/GFQs P+ΪB |_3>; !O#|q͢9ҿO?/bcB$⬭e[5m׈{s^YWN,,m/.I,1pNeX*r1_ؿ_?~Q\oiV qI_Q쓕ݗ*xxԷ;z??/3G1E/-cuH/Gh!.S1E/-c Cb}X5]E3GD>Ob^Zk?$f }Nw??/3G1E/-cuH>?4l_/ykfb^Z(Ϫ?*!:}~hؿ_??/3_Q#7TTCt!?l_/ykfK"Fo>ਇy Cb}X4ؿ_?~QGD}QQGh!.S1E/-c Cb}X5]E3GD>Ob^Zk?$f }Nw??/3G1E/-cuH>?4l_/ykfb^Z(Ϫ?*!:}~hؿ_??/3_Q#7TTCt!?l_/ykfK"Fo>ਇy Cb}X4ؿ_?~QGD}QQGh!.S1E/-c Cb}X5]E3GD>Ob^Zk?$f }Nw??/3G1E/-cuH>?4l_/ykfb^Z(Ϫ?*!:}~hؿ_??/3_Q#7TTCt!?l_/ykfK"Fo>ਇy Cb}X4ؿ_?~QGD}QQGh!.S1E/-c Cb}X5]E3GD>Ob^Z6?'ǭ$A"oLu>PÏZ%7 }Nw??/3G1E/-cu$f }Nw dڣ)x_χtNQ+gMHH"<Wg+? .*˒*+J4EusǴ\|ٰQEQEc?_սX>_6(+_a>Z(((((A3s\~L+@W=W/trŕnlbіEuʲz`qy<)TWb= y;Ex^r|ծ*Hܴ'*M{Vk}yoX YVXSѕG1yn;/(N拍_ j'ZƽYUe(ǻ1sxQ/=HwmL1gv8pY>eFSU-!)[ɊU!}Eb?ƚ [ֱe,'Ycb:;/ux;^'I_cD(_nXF+ZS'8EծױNQJ힅E?>?izoO6%)0F` FAjy}H3KQTfú5-ty.g`H$RIMMh3chhos{bprrJۥ)%((3] (((((C㵟M~H#m,yX9 eV(Ԩ쑍jӕZZhg᮵x.=6X[Y[Psr;WMW)Iu.SW)S&Pi,!8ǻ1Us\3?x_-}++x$g/Hۀ Y:UU_be(wAx?I;6v 1.'Wox=Z; BP=(ΐ(((((XNlO|hz+¿e*;In r8u(ֆ"M3ԝ (:B_7E Ҕ.}5UCS)Z[}Q[!E|h|xXWk1V-&G ?UIqs{/J#>lv?<%7ݼ rEI|1F0pC~U aRs{>5\mbu5Q]gpQ^ ~ZTi? E+jFf<.1k UYA.棈sT_+AEVHQEQEQUuK.c͒^E) ~8~kf<={;k\Ylw `mBvk W*F~o1j>XM7хtŦ? Vwp +k_4|K7uVlh81p;jrR\JTf{[:+/>'Ҽgkz%ZxdPH  *?F'PKm@3]NN9$֫<ӹ/=-آ&;\cpAdJݧ)%(83] (Qm;Ե^Zi|sq1ڊ2p;@9'Mo __u-{Hdv؅Q;ۭqb1pFmrP{$rL|o*XË(x'i \,Wtj2zׯhd=kzUcZ p[:hW" tE|ݚU|,m6!H# |+6Do[ I YS29n{8f8zPn^}yl%itݮ+_=jM0In.$K3f/c)!R\oh秊֓:4Eyo?j Y4xQ9n8ili\$v4ZUvR?j9^$Hts"N|bzN5#uU::rMwZ|F,Qg]:yz7}HTwG6  P $2v5(>uqaOb.nW=*((((((((5sQm%bnlF$ 0~}\Ӭ9hbib7]Š+]{5Fv0 B3L'fpo۝gQSUE\jvS~}{xQ-'y|1d$c?ZrrVKǖ-utIV4:u#R*qم$Xgv2׀#?5E;g('ztI-\M*39zn]V}E i-C_֖z72}KO@#"B u+”d[N fO|+s(xO𞃨Zȳ4we,#6x = Jφ5M~mǖ\<徽7%lkEE|=ᯊDžu5մخծ#bYpÐ1Zc()E2!8Ԋꂊ(,(((((O4jNȱgi=ي㚉J4'dN.svKVutW~ο=ԅ8Myԫ 1$wQ^Kڻ?Hvo3 ȥ21fE O` &jju59)/'r(ץ5/'(((((((( i ]cCдxI~Em41;C 圪{VnO7ޘX 107'g8jRg5\pfX৛a+MS&uZQEzGQEQEQEQEW/Xkښ]׋aaCq;P"J2n)Sz(,(?M[zN۵܀8Uf8P;y_qg@,&htVDy qXJ#UQoj#Xq;~Mu}_+s(((((^g!^x MdMOɔDv~nTQ]Dgߕ|Š(,(((Ag{xP]3G(&1KEQKS&R8M#j}mK4R`8<:Պ{ꂊ湦SSՍ CNÝBF@=3yGY~5qb4OS $%$+@$A =zq2zsKJBNҕ=(((v|Kӿh|+'?_hϔx4fr1 k2|ԩO')F)E4ܚ]QJS*+_.,>#|&GŧPW$Ec=՝} \Y_W,\(kT&&|WŮx[Aҥ[DW*eefUA9!i.I}jV]FYbu 2}kXjT۲[\W_~˺t? uphPG;we9V/;C5I^ɴNOWedTqԴWi=c> 'G CžH$;Tǵ}ZfF#(a?|MW` oOH[VN.?t~ xQE^"[z*v>Úҧ`TՌWWNI}M褾h B(+oԞ/c|+#_xj_blE!f<.ϔrk˲Nk:7ョB]Oh~,Oׂ2|a[ctP>ѺdGu\8zV4J%vz%ݽRWgqE~| ᯉ<5཯ƹr k3 pvw8~G 51Wg[Z7c*uV=(6 +Oߵizf&K:;T 5z̯CZ<;m{qit (@O_?i/Οjh{VK*p,VaWJE9?])F*v=n~_~$jiz'+N"P{1ESº(QEQEQEWǞ,i]'Z͎=SJKUI17(%uښv׆l770)7nm0yS2|MEƤ$3J7Qjxׄߓ>+N(((+=p*((džͫz|3m[QEVN|5}5Q@Q@Q@Q@Q@S7fAZT V:*&YC(fY:]'GN 3Ҝ!_O|5/ g۬!#y1f>_|H I ->,78}_`}^[ʼ6xwLR^J;+sGk~{&y?iL+]ڊw6285G_9;ey↷,* 0EY%?Z0S/ ?{_ia'i{u6:~_>YBA&۩Db賦y/Nӷ8=+ NwI]i\7# v oJٗh`2>-D{vw1f xAy8:Ա 9'e{]kn7TC,JqpMuGz/uf-e##U1xW_G^[Cg q\ĠJ?s c$o_O'{"mѭ<}hY.Mu<>"g^1ՔuvwU_뺗jƑ&۬dės ?m3τO?WcK#`_c!1WU៶ܴ+FSSit=>QFm5?|=_sZ>_S6k*\3 OJߍEھ'ǃ5?Ie˳>pr{v;/c/{2׵YuNrZYv^W1ʰBIVrE_OShho4Xu =~VI&E66@g:W!~ԟYKK±;,:#zp^(RTo)&Oz~j7Pn%4.D4VPaR5Pab1UNX%}W9a,^/W_z~'ߵFmOFeϋZKˆ@YlV#z1,z&ZjJSwvڒiTwz|EcZJsu0n$Lz_ ΍OdH( c:W]1|]/Cf}Tpw\8\A{דl ZRW݋ |c#(kG^YJ=wNq ?WRiAԛZjNUj;$ϜiN;_Eƃ/As X Ϫ#̓Ҿ]M`K[+H ac@UP=WxƺyW|Őт}\P~}-^n_NMKU{5]y])2V^]}#Wݫgn>(Ӽ)|kq&k+!wS ru:>o| |'gi-[ƒX |5C}/_!|BKoX^zRG)%k-bpؚ2W9ek[oW{g^&=6t/wg?vYO}A_|a+\ʁ䴷"Gf$Y[cUB+?K33^S.^yY<%r^?ql,6e ;k {şn>x!h[UIˆ*fs`pv=. qHhlx??\1[F>ckK!r;n+Ɏ#NU.Se)ʭj;Y{}zv>A|EAke<ۙ$"0 ,z [w]b,o.<%"%7- z)@da0{@O_-;7}@pΞ(?@-HE4P0C+R*rFZ%j3ScqB)ht]!gi>9kVH֭ դ),,JѴ;NL{?u6[?M[WLܹk-ZjgwX)WFAEW{wY<,0DCU$_+mB <[Jamf#q}#*+xxz}M>M~dl ٯmg['5 teyլSb:xmDbYdN(;w)w / g&#H1*OYue],剈fTƾ D2^-ʛJ7]OGO'XuyiYZɽ:NiVzucy \[ΟvHC+b5>;I/ |_mo4@Y@0I#je)sHŘihE%@X4!(K><'Nn [jSj_|aOj~"23Miʾb:/u_oW>YZl:Wwvsd0u+_N~_q dwv | ĞG o|x;{R̠3(3ŸG'_ɖ#B#{k#@! 30%cLI=ڼ?giOw{iG|Eđy 2qj`? )4>UݒVTqy!mma%X1E)sbSNH%jS؟icjѧUJ}n|EҾ*&f[[=lU^)+8" wƩrzmsqp#t֡_M4ϱưzzȣ}>M㇁.'|%Og[{JɢI CIP &˝H=/|UKy34/ƸcZr4qꚕ؄O vz~:K_EeaB 4_x/oLKK?h׍~ ?>uGk^|˗=€{ =(D|N94,0s3p{rI= |#"mOݳmstֹ3Jq:t֋z8QN%yRM/ſh|$)0X$1RAxIRA7ͿFMKHҥߋtZJˆ@YА k2E-4VcTT*_ꐯग़s/{c%g:`Js)IE+ku/PY5 ɨf5(Wr]Hx~ {Ϥ~ڴ09O [I gGcukM89+{m23k^;thW(|4Esx~SElvb2=klύQ|X|g{xS:5zAa1`L`exsukϦ{!Q<߽b}N_/ְU6sI]#h1$CԩtVVխSe:kss([Y_O6}N_'ꟶ?EoHSs-F1BAw{b}/qvbub`} ^)ЭZq5yY1EDUϠcR0җ-m{bϒɵkh{_Şt w;aTia!ݷ'*?39y-k v3yxVU#eIIf3N뿳ȳ| pFnz j0+:gx]~} 0'>h)뻷^#ytWn{O-ݱXQՁOU>%-kk.4M"ڎvy9鑖R}3_;~FĞ5??x_%V]KwPŝH.WF| zTVe!_oUl0=0u-m+y_MoxtG,CrIߖ6V]ѷSo xK{DK*=y)A  +ZPrj|F~gYїlrFT:o~kOxM[zF۵܀8Ubpw$ L.!WFO' L|q|BԵ<=c3ovUb:e,DzFsWџ > WJ_M6EcW71f?Z/7ƞ(⨳O%r!|ɞʠB_=k:ה_baQ|zG ow>[-}z<B׫+$to. -_Hi?-?ë0y~[\!{#G&Z?>^Ìs_{.UgH4>^d@T4ecPxH{ϋ+ۏxw6C 42J$e $v_ru,&H qt>c'ֺ++Kw>Xd}[K?ƟixWOwؖx2=BkgڧGݩjn)<1o[q![kbISq^oo k1D tW#_A>h&ňY-?XU#VU\iI4VZ%}iVsNII4VJo? g\:Rk-60[Ҽ_>4~;}ާ2ϲOXCoy\cm-?:dxkuu'*{+jbf2өDJ_l{>!:_xἻfFVX H_DxXOLYlN2*9bzƿ)eO!Q\Zx$%ػ~uiVRB]U45לϙJjjQs?iv-km3+r[>^zJz/_Lx7hf3UѴȠdBѳҐa =GJsRuסdpe+JUjwkky~Gvj=#ӯW^*5]kws2_4]mWe |cG|/_BeG_VS$ReK(Nz%MA{UޯV3Jʜ['g-%4ùmu[yW #27rTXHV+}cᾑey[mU'S֭(2X!J=[7vIܤ}OXxۭ֛[-Jcr+<;cd=bNȳ/#?6jeӜ]KGN52i5GfIf,I%FNCW?-?c_o'Q3im3HbxdZ7YW$ =COu+m6~HT^X Dz1|3]|aǞ =\7d]>^,|9OëHjy?䌼OVX HTaH>} :ΧfnB=8 ھ.>=i!]!W ڡIul^Dr peIWVRkUyrm?'ImXxw IK-6p{zExڣ?J,7#ۤq^K:kU4,QkQSbب{|6ϋ4i֚_QƱv 2} }!J"!9Qiv'NT&c/ګč{Ꮜ|9'|?& HclěU~~;ÿui0#E"i]"=OJ۫Mo_YlɵxF|<;^m_yww6[4~Nī=^_Iw#9 ~Zď Oi_ K@XıM #!f/+*2!حFUWu}lq(Vk}_5{[xO5mn7mVG@E7_i_\|*|W|VMqu+(tQ C3u^} q-~J~Y[dj F|m}|Szk!|8Kcx6:2ݲCUBВa^ 4 &<[I.8s9R11^3w|1KW|+*1!wXA,RW D>_xf@<%,W1ʣzW KKY,-_s G0<}vrۖ+8 퉮|* kY3cy>tMUx,)=;?(]O¿ t_il|Eu$wRFpJϣ3}@#5:^}~ᮒ!'0p qsNvR|;}8(2],2v*ˣ?<-"zF /u N;fpv.z.d_3VKoE {HY#bG&Ry g} O{H77gFШ8Fv0I' GÏBV 7˶4/`('^. P<-VzZǎ J qjۥ{;ڷuo~"LVRTV {aC<}>(,|I-~/6ܬQ9&5Ep@%pűX)RC'(=;g߷n?*ũ%A3%? uq㘇eo6 7b^b/k?ڡ?b>o?s횽<F~wK'Bѯ vv{iL$gA yR\GL\%׼9Xx\\~͋(P2> s^OUam^$8f=79c|m|Z[n%Qk}SEvb(ac]J6ru3[&ӕz>ӯER\[Қw]Ñ2_j-xcC,@vȰ~WcFD/'Xp_/y`F0kj:ܖû8=cAXUqZ4hKYjWc1U%Z +9fGҿ5h?|/2`-lǛs1\%@;~.l^%mDŽ_9d&mJQiT袊ϣ?:?_? /_GoVzӼL7]O?o;.F1S422ۅ}ATHk?f9~HR!{60u w+ۣ*#g$~#n=bŰ֩/h͞N3UQ+?7_ju,,,}̗\1v;O 77l('{VgҎ{mgl|Q3>wSFFrU7gh;??fO Mnd+CS? i:/=SZ]Ty\.w"#^yɰYTU~?mpڹ%F)F5Z/ۛmS^y{:.m[~'OZ<o?UYftUl+dG=+Ͽj/3e|uK;6KZ SMڿ}C[>{q|@{Pi+ٯ ]M-j{u>(*I/|߅~QxMmJiΥk+ F xXdW?&xVO]kYcKxng7 aw^Q7*QaMm[k+~W<Z8Z5fo}3PSҵ48{}# & wݐ{~^5&iq LGs\OZŝfpHn}1y) uj'm|{MkVUmhHݝ刭B59bz%Sb3 hT^_^]zhyO_|J׀_᩼HwlؤFPGr A_Aڵ^jZZXY,qf>k/yv@Cws-NS K>GW_<?O(ʹmuiZ+j)ۻÜg5kV7(=}.8CUT|׺}s,Iy Sڍȁ&#ƒӍ2n|?da_~ KͶv8UH?IxIͿ>$|>-,gڕG(C+8_Eo;XMԼEc[+-vcAo#n{W:ܿ$KD5<2~OUIyM^mB^o ťCy!\3^\Y|/ /IIUI.XKJjFUWy[WxՍFWuJ~^/A Xg_F~П~+K)GU>n;js ׃u]|<+yEh>X}w(?vcX^7 ;?z[/yњ^k鶚} keiA,q  Es8Լqxgw߬xx@Q_V{5}+/{w@oV1fp ,I>kؓ5pby׈-88(as| yXX=K珩AmhEoZfSBoݭϹY+)|E WMqq*fOұ<Q|@>2^!5r A{ͭQA 3J^΅?]ɶc *xjOw97ZZVMW{HOc冁kk|En27?HO+'{G\m%ї)Qm(W|hVH]gt$ Mۯ.;nl%VO_J^PXO֜wT-e~uǡ<+&=v1=|#;g3GKڣ/<:[vv"PYˣ `coy/O|f3, Q0JT* Fy뾷:qyծ %{kyroutSMz>Lm[K/W{?4{ c8`s*__|Q- =FU(KZψZWďE~j{Yx└FPx!Vrq{4)a#_MvVJi4yό jِIYQWv2;gċ tO]kK,c(EY]*P;_Ŵ_mb)tN^IGe}=g#nSdZERh"]mXV8);(⧈ǸB_PO'Ί(X jm: Km!lgq_+x/߄s[k?F_ܤqMbfM9yI?[WL_ xƭ{56 !h&A]Ҽ\]JZBT؟P*Okk_ݾ|w|K%O,w#,JSqھumcO.lY36 5߷&m*yV[QtRGGukk''bE ?݊X~ ? xzib兩>e̛Z V tUgΜyvik }D>Ǟ),^\\:z1%@w '1sEt̐= 38m|I>_uG_mG~0sjOGK}<̾uaTsP[wG`O?7;_ 5R|D jwO?ٞM^\֤P}rcq4ըPq9+z*o>WU={o|5X^-lH 6 G!F[z:XEY&Ә~,[p1w`/l@Z^AzXeJ1}<^^5Mʴַ՞8ҔҞZ],oh?ͩ[ +XiM/1'cJCՓE6.Lћ^.֦TY;CY1ߴfs(\~2@B4jDm-Py En~ǿ~'kǏ\Akǥ[5&2@ yVޯkwu?g?=W:O kZ\$ Ke|FȀ+pŁA^{7=Wşςu=nI&dhY/"+=IDS|okMg麧k-V˫hrqk8nH }?4MG2B[Ď5BmvA`\*cjTy=Թ^5.[(V*ք}+Vo_ntQE}!^A@ce׈ulJ3;<I=~ʯo)6>Ci fR5>#H?93F0-%9(1^#h IhFKkVXۜyA#8ᕰvЂמ|8_J}:UȺ"W}*SV/sǭKZ/sdf/ώxI$2icnLgjp<@>cM|r5/z~$dd2 ͑!r1j߶jѡ[FG.i#E?J \ѕlezGK]g'15 Uvջ5=~oⲸa̞Zk KI"qs5#W@sWj6_7kpHZ+'dao&lo,<7a7!QBU:/|/=⟀{i%ԓcTfP1mx @#+Imx^83k?%X\\8Gxޥw8P *TVx㻽PGC=W?Ѩɀı*ʱ_F5{dմZ=?#aj~ŭggNKZl;jZiP=}E,~nIFkڗ/9Oo&7[ R5}+]MEݽRЕk]]}G컣|K_u,kȏ @Fy#+`I8Ms /.m%6i 27Wf,ܚjO_{ޡf^N DH=Ma3˅k+9I{G럶v_xg<{5q4U If\7NOо1|>2_5xg󭳐 n22U،E? G$u;n8)I;P2BpwU{Ǐ7~Ot1NU8HГm=6ˬo~?@ce]:0ʲ=E|SW~]5'G7lU >)kEd[~`C%y|v]fxVK>Y!vۉ7q$w515,:}ץc1'Xyr[KSc|Sbڟ>>t@\+;W> zWif@0=Uf ٿDZȋaa2:kfyf? 1a.{qZQj8LJ̯k{t|>`*9Ù]+{tKCZ+kx{Džg?t Yd熯m 7uoynn7rWՉܐ+ؿx㷊K*}O㶆CB]ѳ`utcLELLV+'ktFf?T>XM7+@|T = o<-\E+Q#HP.rHQ^h|+_[*?2idUĐI_MCsgѻ%-ġN7y1fR~zWEj2$J\mlub*5+Nn[7nIimh 6ڗcvH+*Bwm?xj5LvWn^9.T :1~ͧ<V1VuVѪ *9$$P>y:rJdH2\xbp4V&Uyneek7m, Tvc'YM+Y~c>*uҭMȵi<&݃EGB/7^(ZE6dk<#M1Q˄ GڷM 'lQ[Vkq61('}Mo^ycc>Xtjg J|pmu~;y~Cៈw,xO6G1hsmV 7pYX+9XnʻBWşS8[(>¥H҃7dg5?/#3Oq"z{"fBRю<7?ún@->-Š_G%yQ%}Ňԏ]yxJ6.z/՞6WNUyWSo(~OоXh\ڀC8r ڬT1ӽy~U|j>_2vİԳTԲ;?o:Ψĺے1M~u4Ѽr"2=AE1cU&I.]#,Ve+BTI=wmƏtzx_ɹfJ8GhO ϾRd-nc''A=20 U?UF.u"5ܲݷ @ZWK 'jcӴ1{GC>Z1> Vj:mwmb:jvj7[]>;\i^LB+ZׄrqL  \iMj%VI`dvp @>_ x5'״}0y:sNkvEEIWTQ3|nj֖'.EΫg%[_v~dP1Q{f^ݐB6k/I/j ~]xI__&i`~xӵk6oC~#Mc˟6/Z%[[xNd)-PxksP5ܞZV\`X'npjvW<@P>k o$6POs⇄<7;?i7{ (V 2AG tV3AbcWOT|3<!I)Ƽ!;.r> }_!L4;@3k 9 $c_ʹshԗŞAM֏M/Tozj3]wǩgS^e%a.x.EU_R3n?U~WOK'Vw ?*##Z(N+$>ohV־?,`4~d5U8|BY_<iZ+mK^ 8/DwuX?u~WOcJOU~Q _51c?_?E?(| &'to>܅0ۂ:iE{z-%hvfi9 R;AH3Ǐ]|A%~L_'2n|Mmïo]?~e=)`|-Syњ)!F7콤 ǕO5x{{;uϧ~2k)~y5ͅ,L%گg퉯|> }2kBɈ#Vݫc1(~Ö:  W5X'+?o׌Eo_fsl; ʝ:#g=]Nv]}O I88+<3=VQxiDQ^.-%kA K | uq$eyny:/V9%-/gtmRrU%|156REPX;}_A)h1=[id[t1!R4\1 @䁓_#3RO#x<2q&ppJ3 x#d`Eqg,noq*&l˟? x'߆4 =3M`a#U'Ԛl%>i¬ElL梥)자[ov];SU2_f NӵMSu]ǩ1xd_)#r~fמп5+H)uhy?5e]s,<NNq̗C?jo~E  aen,u0W<, W|>= W׼EۛYu 7wIV",b6$rW=sdb7Em^F p?}^Nib:o||oRHtNe8x2N 'GZ"p {Dmc+I_ JqVvmk_/|+[?9һG,+*Gg z }k.o$u6B=k $_D5}?toE}&?40+թBjRDN)i-/wem,cMךS};~ڗ< kΏ'knn3ĀIRH+?jOWIu#:ODS2LŤ"3 ~e&WŝCI޼_ ]&ga kl0a.JT|jNVjIYwWHX_şZ}㏇ mn6w;e2 ѧ:ߵu_kĭ޽[l#M~}b?? qN[BnyJu>/]g%ۜr־vgysW\[$Z7Z=&<xí}t@SRI.+.0'OeNiV(uݞ¼ o k7ia]ɝDY㓀_G uwE|/ ZƯzڿ*;_K~џ o>0 t넵5m=ᶒRBy@tR<~~ٞ$|/\fT@" ~[1YxlUie1lR]y)A|+SWp1-7$gnkdن;:5 N0u4=I&nm4!Tiw>?o쏢?Cao&/o0Y_FT`K' xGo⫁u' v!^O޾еMki4af6l 8;A@ ,؜dsZ1wsK2_N/D.r줓=y)&OMWHow焿h/ox6Z]"=|1>YKϸ7iRO⒭ ]P)$^:|#S׃R)^%%*nKI5˿T|'ؗŞ)bm?CuMN;UV) bbqȯf_/VV/A>TG$nu +8/,t)JZr|pӊ[9l \-uXPJ~g*O5|z|[Oh)#]1 q [? zO? mJ c<0e~3g֡/`q،4珝K1|aޮ_|#'.%}iBOºSFzC5mFuxzjUec?w^7YWKg_񗃴g"\[  C@GJVÞll#|,y=(w/'/|Ϛ?v3|#+}z#+(`}@^~>5m,Wz0 jYR=zO<5xC5=.6OkrsP@"G;cy#N`Yֹa42C$w[z&rc'r4RmZމh4җSuK]cNghQ,Lp0W3bmsR xBu4?iiZT;hK $OXo;y$2du#X#*Sj=Nhў# *5RZvUmcO|3xG5-5g8$e8vR8 {|}}s^ӵԳuINI6 )#<-K1j2^7^ۚkP( Gqa-TIF;18<1t UTybtZt80c 59btݕϏ][tQA%@Tܓ|Z:l+ѱ$*Tdq_/@|}{cK" F尹Jǒ̊r{2sɮ ^cq2g=<Yc'.kO>zoE<_w@oveU>>>'/UKy#e_+p;]t\ַ~-m Ѡ왷#+tij8]Z}ņk X0+Ѿ 7f_ xzKe-ZY Kc<=pUfmEkxkqyZ|ɶMwu 'm#XB]xޛC ]}#6lc?M;Oh?6bu'x'cVT;K=\k΄7"Oޮ>4!cE)k4M V~Ӛ-F'xVAkC*"p{gAҾۮ[]/93g@ VrK31n{: k'y?7-< ,-''y?7-W>?kںgYԝO%VA,Cda_l^[I̒B%FO2둌Gc\??#6j fF 788}jqxy)^v}:t./F;EB"Q:+=c 6>}^$ᕔAAg3a{x]oZΰRD YKm9{G^\uKiu .fӼO2Y՘$=*0}W%h{WGbٖ&th% s-ez~$xKexE֯3+[ڄ7QH'n޾k69AMxGÿ:hl̬Wl0s[7 Y񞕤}ĺ2__}gUYr)Tt1)Բqݛއ]L6+*ʜ%wfk5̚_WZT|\|2\y_MoL i|y/nSW9{.#^PL߁?U=}sB#ֵ9Wm+(kWu|ޥMnšݘXDdI ltRRtkObUMK{f=|K>9|Q^k-ͥsd"ʻ Ns/ם|+s>xBցƒF.$KVd&b}G4J38i6VR>TqV ..lWl6ev-cjv?< 蹉6Ct!oE}FNUﶡŪURZ_ڣm)צfϛ{״x?^>*𖉭>u+/ !y~djsgg|hm5el4H-6T^z촍*Al+8(U\Is^8byrNܫgJ*84rMo6fx_x7XӮem3H2A p2 >ўu  uj1S1:Wx-C-JmB«cw3ۙm|mQEuRRfaX5n/)v zs_no:Ү}18=}+~Гk?]~3uq kHU$IJ60IaxXSQz7}uplv*En*G>/bdnxCő87 ,bEO0wIXV+KtW~/"y_Xd|;CG6kwy7I2UnO̤O5vo]@\5q2[˩\<4ae5qoV՛dO NnK{uhM;tSӴ6yx]g$l pPzul5hz=skCOCKmd6A>מ|B~V#)-qr0lrbaE$ԧ/3ST>V}kGi#o?) mV*R okZ:|;{p8mX$F=U\}y0}S?Oto }UY?qiJWVsjapَJBӕ޲ӦQ6P#$v!YrBON3E}7ᏍWMkm..XD=q~2R@OáҺwLfwk60jZeysܠtz=Ao/ն/0Ŝ{kYaq3SmY/7ayZkڳZ]Y>_ࡺ',A]2iȅ|xJ7a/|HOOͤk6zmc X)~O=Oj k#z+i6kcso<$*2*,J<va]Gu QC+) UӪ%)7uO^`08-*ќ4Ksg~2x"SS+Tiw-4R#z853||jƟf[}ɍ?a`1'|۶Ltzs>o⿇N;SJ2ϖs^xԕ)*.Ҷ1*3iF??Z >;^I4dY\ݵs޽+KygDHU IX>|0ͷ3a۳Vt.ŘI'[:oiV7qQ4G`UG# QU#J*PXьj%wѿy|8o[uuGmqujЍJ+s(l8+?a$Z 3C_PԭNP/]Ulζ"!wͧ4VS7?57\ +q,d >f[iUҼ=c$ZẂFd_`0/߃Vw־YnSOev#zb|FKZ\zt+mf14Ib'I\gg5Ո֯u4U ޝGn+ •[Vwm{5c|P ׯ5:ぞynȈrrq@98 R| OcRLx;Íš~KG834z ՟oj_Z]x\\\3#28=z%mG5^xͽY QbbWެ+)4V2[-m54R *I8'_/\hZ'a7ڦmڎ2)Fa/*0vn߃L3L$Ia7mdF6^!`$\JNAϦG ?~t\xcð ?H} } ?-r}cRȃQ2yl.d"0\ k~0 š<=meV݉g>OsONʣ}/v[O0]JKʡ )i{ɭ# qoùJ"]/V% ~|O~ʰܠ Q0wnu>6.÷45}*|+ AxgXRh|Qr l[X;o}-EXL]e\F|M;{/ź Mr9%]@k"8=[y7x1~5D!c#.߅u?f ]C^Kh1q,HBce'2qw4M^mp"UNI=(`jjZqnu3eaI8m߭䵺<5| 6ei`cV2DnJ3ھi~+io;)i:InR-ኤhN +O?IK?eW/$}ܐˁ]>,,<+xnPcir\ YΒv!W$=+VN*[|NLF1`7Jz駞_?¯㯆)d,ڦsg1WxT_ ~<9ºjv59fZAo ^2ͅWWF$gpC_sWʶ~. DT??ǧxMs ɮnQZ9rp8c^65V4ٝ7 ME)X+Iٮݟ>kWIm7֭dwÒc'vfr)<'ke Xn C~ |9eZ3eh$ ^Kؠ-3_Tσ~7C]~kopݕbPl>Me6W]K5*R|;l?e_Y~˿|wƗ)[_yp[<$n$go5/iG=IqtQy8hL+AV0!% {,Cq I|К6܉<@[kfa PqVަ0 7rkwI몳Q&:w{qP o] qc6⇅xbrx5DoUodLAL}a$XB TyxG8|aK-h.f!{ @+^hshoS 76k^W:7hZLMӭ!`d'=&h$UǭmiO jGHR>쨞KOE R{zW:?-ZpC4wW άl}hz43UԴ5BH_FR0k/?abhT淇QX7`ExVx[8ݧug[Ta+TqRk|~R!p tGz оpҭ}2V6OVcݎI-KM,.,oaC#VSKRTN'˲*YmZ9ЯR'{.-CxM]>X}8%eR~FU<:_פ>&¾封E ;_URÁ^~u-Esnh- "}`Wφ~Iknۯ27M,2ĚX9TbvmީYS ƺprE[nMmV]Hrrtl/ oNH&ogQ]K]qc%)yv 8劺qQw>2?> ?Y}\?> /GM{Z7ڦ`ڎ2һ0yҭZj%`gC^k䭩/X|;x{_ ;F~9ۆ'Q!=zW> .'-.С>Eh,Cc8pZ?kB<&nSy}q"}N/ Rqn᥆a*3kc1GM"C6zWLoqzW hG֡&mHpnHFY:t$稯U!~>wᖵs$cw,H䝊W?[bf⚳~ۛ0劥ٸ+ç|H𽯇'"FGul$Db ` }yo>2M:G,BU<Up})ib? \s5cd_*9m*?Mu1!Լ3M1ݰ~1c9⢆OͦKmm53`tTqji'jZfXߴ'| 4YѴB쁄o!^9['i澦Fx7ou-i.mXAtu6 ;wc- A+߃>/XkWXs, "8833^=} |ZH75'0+Ծ*]&m3ZG.1*VnM, y-a ׊U =<Xxg'bkzc-1{>KKk+hm-;a098'񯊿, .>(|gk[ ;nj 99uJ΅;&۞ni3<5+&kgSOxW;xRvUp%wR*#ȿjoC32Mt[pB{*UjT;w*U.x+uRwEbF#pې7`WR<k] -DžVV-#i2[#LնEy[Вjqwi$Vq/ _>8}jFPȀ (9?b//sXYh<]/'/|͚2!밪zΑi KϱKkV\$dk\⺣ѩ8J+>]l?`ur ~_.-/'LᮞK6eeU-Fc+FX|<)Ot<<& b_ qG%f(mw-It}/M]4w=IO5nT+Kht!*x Ɲ ,P#?~Wm۫S8m[>x׃~-|?\\RY Y܎\NFWX[~Z6G$:/ۊI^72# .d㨯jԿa?:ׇomom:DOGWx'>oǣgHѴ;d=Yx_1r&謎/1NrEoy5Ee}^? + DgaTFLDܲQ¼:)!|7k:'F-:ۙ"й@9 ~!~ >&kjdžR=Rf5Մ[4z!XFOtWU'k=uk[s[t֪o#5 $:̚o6'Q~uG܎|׊k 5/M;iP;1yh߆C_|I?q2٦uv?+)RWg)KQJlSNu4ilV|OdҾ¿_C{Iekuv!w?0q@> v#'n!{}&ApbHS#{Ct7;t'7ZAo#9Q38U~˿ >jK{q&%#!rBuky6sX8oFQ{sk^nky'Ÿ~cf Ӑ'v2J}t6utA\^ "h5BDr 9w1r޵*Z gf#]-_`=J3⾛oVhMNF>h[A|1zEڦmmc_UC wV8< ㄛVikc~-K6” 7$o}ϻO~|#{kᯇ+khI" &?4r~_Ndž#nwڧǟ=<3yyzuqY9֒n+(򼶮r"JM%ۤWGſQO Zd!*K6ᦀ>-8~őo cG^l_hB\þd%Ò{ā[hc˵$.qrjc˵]>O@ag{[Pt=NiWhe09, & ƛjJpGWk%J,OޝϢ?<_? /_GoVzhT^k5=TKa)p<_xxԛkY# ;ck8YcWF2 WoRlbu= ?B;dX߱_h)|!o%lj<6C'Qe#̫FhB[TIU_PeӖR}bׯSm^Wo௃<#cƺNOj"^}gU]rE?*׊εJS]wc0U85hJ]$__:41V]}ey u* 2 9G~W746{K6YU n؏`qrºzE5UxX,SO3~>.FҴFVU!V"'4xv7,Ѵ:٭oX]8#?Z&T+K) 8 ׄ_~Ÿ/> q F# ¾RгyZw]o}9\Tqw+RmuՓ=¾;玡Ú柮k'4uΈHf|bSE;hkQR|9UOLgxk)e7w.s3bpS]ez 3.ZZcՌjTZMkmW>,{|W=3G!ե>v]nV1Q_Wxogeir?6ht keMyb-֦.*-s$kx݉; ~.eqsifE8-#1y7K(G:^y} ~PpMݯK[>~!WIZ>5xs? t5k; wKSӯ&Xh#F ;w_) ujk wVQf-CYI q^f5FHuזͨOoC>*k_W-#O.-|'ʘ18+ھ_c2iwz:dBim,v7 {Mg|-6KBM{ YY@9-AǵwRFFȪ+ PEz\-ZQ9sMm`u¬I{J[-,Ǚ|1 Դ.̶QȍgyYQN4<{>eحцؿ+c6:?xo1-u-~q#N!^Bvdpv5_ QW[G8q8x◆g="gI$,N[=kڬJ'i[OS1*3i};G+;|d `\J%̶e[< ڽ~=o߅^Mw^W.:*U*sw#:7wo/$/u<13÷ P̷\{~2[ + 󿇿#Zt{ku-{}ypHO WҞ21(E{Ӳ SЋ;]CaikXD*U(VG|U7s↣jZ )jI7 u<`";:DuV\tSm6On,x') _? \ڴww>ZO.|K,|v۱앯~ Ȼt8;㷏QZV i$OGk$2c.Ňm+ ]# hQTvZ~,]M<{džT2H>c.W$hw{-}\Z'hZ#[/ Fnu@hUA''57x{Ɨ,SNk3.H0)O+(5hۛ?xTɦS,~jZ|  /|S}[Շ#/{Mu(~c;lɲE_CPs⯆AN5]%I$_:+ {~>bL틴V#ɂYgfbI'>EךQKѷ )v퍟x;U_3|[aڤO!Y|1jV>&|'H~[ Dm+(lO0N9Ox7G}h`Tlc=k0}fRc |)HI)T)bI' ڌ,qtiQJ7x㩨Үk_P6f/ky`;OBqߊ@N"J|N[ixkÚw?hE4>{?*bXW<2X◞ 8mr;uOxgA~g ?Va߂Pʒ'0e?ڷmħCNJn|6gGWjw˥*$ 'oKW_g Bk _I˻{Ō BQ^>$:&o3P{[7yeܤ0'A 9Ë[NVV[M;fnq]pҳV=m"i8(>I~ kWK=U NN#̌vOD?,#kYyjwQiq4$q1>W#;o1/cդ,mA${'RGqixះ~!x[8?8sd:=+[&&2N䰰 6%q_e?7|7cx~=3HO. h!FI$IbI$I$MQ?<:t?1g^Gpy#2  Oƚ~C&q_ stoݶ^ }Bړ~xdI(|=~aE6់;%L0pոcc85+#ö ]~M2I9E#3:O8W3iqvx0\X o{y 8SPFI5ww%*uJKx]U4)^j2YZ7)q&D3-W[TjG$ ]Oo X\m.=?د(*Q0hSfͰ*kUBU(t=yb~iY%cg*ɨnmV7K }fqj[MF'@m\ yn1?Z;Y]̍Hʑ2=c>{Pr%Һ*NIA_wGezxb)JҦ̺GW?.n[Ok CG&k=0z 0 a"vZkw#0N>pjQ}.3R'\D]-c>nc8P'I0hoZo M3tA,\F%clwe[-u mMJ=$}M{3E[m1h=q먧eJV]heN:1zEJ=ß_ /IuK>E3Hb;r1^~ ^C%72^Gc8p#l]&%ntZRӮ˚1$r/S \jRۍz_WaNOVj䙏qX\EJ^YF6՞VNlw,a0{W> ׽_Z7-zMw {T ǫ1IZz7m#~$R3'lW31?{NdM~?U_r9'9MNO鴾KCOJ I)YKW<9xHҾ3ih,N#u h~`z{_|!Mig)4s< cQk%+W-E~-tsK4~x'T./iSݰ>T_P;+اz/x㧊ݪkso#r"ɟV%=p_G|SObxb24;AH:dWCVi%+@{:OZlL'?%ԯJÂ]-*4xO_ 44h]Oӈm'yYβg{Ɵ^K|E*G\$'v!@n8f_xPϪ_>B7qg? >?#TEwM%Fã(rUXv`u K--k|>elRwk]z-TmsCZ9͝⅞d O"0|hҋz|g_Z<1f_k.$SK0f`q#^]Z뭇Jj/݈TMZ[C`??e}^C׹xº_<9h:ݯt76cǽQaT@_xf3Ggx%]1#3zo7Xo;o0XU;qmC7 5kȉ@ުșԘΟ ttvE=OrIC#k0mn%_wח 3Ͻt蔰y¥J)?+e`)ի_WI?}]StOh]^}[\EJFA# ]"HQ]QgH.cktt_ i:d t}Y+*m3gWY\:2J{qy0Mmټw^7&^/<3~=򄸷^=0GJ>xZÞѬyvovgfcv<W~wg^N_;_Cts7nλdp?"2}cھȌц #جz֛;>h@pCHQpYk~|OI/4DӮjWz_~ Ac- m!fǝ2iq|K0^]L6/N4+vwo+iSƫc)G Pәە9ڷM `6OI^ ~8桠vmo0=F!ESᇆm=ݝiv,trI[i:evAp:ԓ=jNX(ɷwt*Җ+1[wkmҲ_3_)R_k- @z{~'|M>Gh#Llr0Nbu'Z-KX#5jW9WM$?/cA[ 퀡 <z>3xmJNƺơy2C$UEbI$ұ)~?~2^E{GyĂ5Y h襑9lW&۾V8p\vROɻfRB=B_ٗLż-'q5>4&71/em$y~^L v5ͼWD*E `^ { /$A{Z:@O^?+ZzTl[;њp3V{+?,(x·mZOsv'c?Ī8$d`-vL=kL-4^k#sm 6\O7>x Şn6ݛ4"ѐ 6Nyrj7_ iͦi\5ܱēl>TQ:aשRRU-}# իYFW4ҵ;$?4>-U㛸|7ms(rl.v3^D~7+UҵU,tMAeP.FHW_?|HW-c]}<{"XO;MVT-֡ mJy.Dl:Gb21ֳ}Z*NKmz8ZT(魎׉GO.Z"7X@ MAN;WR> wg`0N> }H3ĞҼa݄v'@9z ]3VsK Vݞm~>5m,Wz0 jYR=z76\b.;6QsfrxUK$qgrs,$>:E~m$}M 3hq&[78(^1QJ+*Q]((+gxjm]Iue.^VA[,-"+/[X&<,I+ֿ^ጿ⩸I%$g(4hJ3t_?F bE+#p!P>|5O@]̈́ZYڴM$-rhpF@ Q>4.^ۈrEyhzǀ|5}჻W:ma)WךCi>84{ʆlʎۢF8Y`sӁ]'ટ'7|qgiVXO*".,U$qɯkpN{,:NMiY^ʱ4VO %'^* ,b>$aT)?pUG"Nۯ?uzy'hJ:~EXT.G{[?E誫YVf8Hw/ه>N;BNSMHO,Lݘ[cs>]clBi9i-;R44ǂ|Xz?>&_k~n۽3} %÷zE4:vps>8A.Obkg _K:wLҡ]B$IO+O?>ͱ g4oI{Q7m^xԫ:PTI_o/' U'hgE@ÌkռWjڿ.Ѵ=n-Jpc#4e8{?+w]:  :m$ja^oh+[Xsz`v\B%VH;NW `Wk6_ה:mNQ$iM%m"eV5'5ϼGit{~5HB,-^d )(dFG 7?|Wznuk}F- +-`ؤ\31x^/S_^X{7 0ra"8g]|59JNISʜfT].ZJ6N?P???6+}[SGLVF2= ~gxLG~Mt ^{KRQe<1ַ~0~߲WrX/k +o-vè ?31F~0VO[Y{N[m{t}mr( a76>þ+,/.]/Qm̃!F! qO}iB|,_nfu(a׭Yrp@$@W7-G?2_Yս9ZA}e:\/ڤm#VԈ8 pF+3;,_VSI:^hn_|ME-8]mCs$ |Cχ|@'mc]N8TUXp$#_>Vouj>MŭΙc$r H waqV?!{XC4knNrF>۸`zb' 8쎖OkМ 14ZsUtIVj|li|)t) tgJ4Io|I%JpvdW%~a~ٿ5Yx _Mg VrɈT|xls{q\QùoCʰӺzz-omB:nNsZ*+{qG= ^8 ?KP8'/:ChM{9mgݕ @,ʬ ,xG{K<{}'Þ>w BTn%$ ~RPwO3z;B׎?'b}_]K{/5oof" {)'־'c󌪪nJQME:Yũ4~1S5ϮkڛW~JZ/5mcIӬ}:;dXPl}2p+WY_ZڮϪC( J=#_)x#I]RF'uKX4mG jG2{,*kQ<1tEUWO,L/%RjsE%N˫mV{JZv2Zu<{LYBmϦvW5WwjkIa x5{x$FƟTO7o|=o[olwzm# 0A |f;9QDݸ[Ƿ}Mk|n;#Y P]8JJvm5)5AJcUΜs>2м}oV4{uQ,2r q_ 5?Tψ7_-l FՙR8c!&r=ʁ>~ϟ <+e xz6eȳЪnbrׄY$g%Wj3kkZQVFd`qfwlW_JQM6z/y':թQjj93|-Jş|Maqi.:K&Y'a"4=vd!CI47mSW&M*Lokls A5_l7{3񕆣pTŭ'u%**"|'R~^6 G5?*Mx\n Ȯ,fX Ӓ~VRinkR:%4>]G|9O ċMнj0֮#YFSAߊ V ۧ0SFS[OAcJmrv?a iuQ_z*<m7aĊKۧT7/Cc[A F%Hec0<7<2/uT':YMkkK$}0eQEJiY;|Zog%-tGNf \#\ǜ `WD|6X4wM\ɏccd0_:\ [oq_c)4&WR0Tw_5xAJ[Q*iX[I^Q 쯀s:9:WH(K|.qIߣGDQ$fviߴ$4\ju _ "a4Fu( `7g~?n anRi^1@{>vx -xPӤX#Kdwfe<eYl/ [a$շ<}lhh ԦytGi2CTF*p+ k *sߏdr>ݧ\+tZǥz+fK?6>}&'mfب !'#Y]qcTV{ꮿEtQEyQ@Q@]Ǵ\t7_/W=@Q@Q@<3m[Ճ/jޠ(EzwnVN|5 ((((*7w? ʧo]xKVsZm.oIra#px ?7^EvqVQOkd[&?vnf?IݟL?/c&?vnf?IݟLl'Kñx ?7G3$nצQGcAa?f?Iݟo7g([1R0prO xkºZd RHm UpTNzec>)bcP `+dTVRsw}qcd2R) 5? g |Fx^MB5ZK@k wR^Eyr 3mDө(QϰQEQEQEQEQE?g e<9k~Z %XԒx*sk޽2+8ӄe)j1t*VrQEQEQEQEQEQEQEQEQEQEOX|Ai7}f)W8p+רѧZ&q v]j%(4gJR8G#-~ xZ5KL.$c س`y\ _`Q_C癞O)O/Jv[}:P?;> l_>E%s`pJ<d CA݅[Ѵm s9Wv7gOuW6/3ԭ)Jo޶nFJ+`/?go xg= +Y /-gU=X8#Py҅F"u\\wuŠ(M((((=;ß0UaEz MTkU1r-kQEhlQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEbx°ºs{{akD`m>QUb22 O5Oƒ@ūheiv4v8]׼MU} +S`(ѾxCþ&]K^jzt0܇`$T;eV9'$y >0|@ּcMiD#pU_Lg ;tW3<`n4ZJ&%_Oie#.XJ5<"Hp.c^s]=,׵ OᧃiYeGb%,IנQKxCMi'.gvN\hy3$n w7uV?ُOñg@ѬgO jKvdp?!\%x@2j(mnV^FN4V3 *"j/՝֌N$Z#?LO f-:CHMFE"ț22#5G> xsĺPx&T30@!!Af82cV5xqM&&(ҧh?f?Iݟo7g(Ol'Kpy3$n w7uQD){8v<o7gc;DM("=;g w7t1M&zekf?? _3c;DM?&?vn2?/gǙ1M&x ?7^EُOc&?vnf?IݟLl'Kñx ?7G3$nצQGcAa?f?Iݟo7g([1R0py3$n w7uQD){8v<o7gc;DM("=;g w7t1M&zekf?? _3c;DM?&?vn2?/gǙ1M&x ?7^EُOc&?vnf?IݟLl'Kñx ?7G3$nצQGcAa?f?Iݟo7g([1R0py3$n w7uQD){8v<o7gw|RQ<9BXMz>oi+YXxgP{W_EgS2VJi_(Ej7_6(+_a>Z(((((A3s\~L+@SY5,*bp ڎcƲ_Fjī'z՘IY#et`YNAkwOmkVWvG5aO\T* : ^+q^{n;n #q;E5~ةui7p[[L@fUy2p699$h]Av:Y/ɰceY' NO 쫢|^!e4 Yvv# dp^G=E}\xLCSmwSRum/puhzMжt+Ȝ֤r$Ѭ0ʲ=A$LRM1S% f8.5;;K&mdI"c}q֋-TU']uZm3PaSuA%I&ԕ6vOq*A cs#U;=Z=[Ȳ.}2Z$h:_OkcTIt/a@'֙/wJ֭d̨~^8?:ΧQQmUm]QEtAEPExSb/_Z5V ɂ̐2H'c|#/Ÿjo>Y]Y32ҹluJE ~qE2)xđȇ)?6kmvG{kRZ*kڵ6@>Um'zN3Tv.\}vK^2Es wޛvKLm'49(GvlQH`9EY2+d4gIP^[iqwqct8D8'T1":r\ƏjN %m˕$㒀~5IJ0n cVR9J kSԭ+wap88##'=zv&gw d!8.G]ܥ)NT*i]ogU{BMi.az;Q*3\ӵgӯoxfd봚ә^ԽESQEQEdB֟5qxi3rKr\wfTSCj!Rp gQZ\lob-`]*8Rrrx?g?|PoSKK <ݾo*&fщaxE.X|m#vL)95䖭J:jH`9ZwbmsM[9IMkb{2TaEG=ViR$7HFǍ[7/ZF'KҠ1ā$n g'S S9o'e\歊F:Rn䯯}!EWCq ~;0U$&NEEWH^Re`>V\37g&vikĀmsRNQ٨."I!5.HUTrI'+敦x ΧZJ)xHDmn)-?Uio-bVddPy_GK He-ukVhB/`5e9AJ T8ʬydWe5t5[fQ)qW9E\|).Oz7C_nRBxSm[N?q˂żZڷ,TVP)0pLl$7\,3+/v.FHG_ME|Pӗ 5MS^[ȥ!*,\6x<<:$o[^~ϳ?^eL|!RT M~U{~(Օ*t7U>xiύ^6= C c0F$+| C^.>8E^q<i:nw0ā,S+íg7iFq :m$ƙ/e6>595{Kien b>^8'S{[9}_oȣ[{wQ_75>*_gWMsYTcl+ČzoQhW=,V&Seo>lX_񫕽u]=CĚF?{YY͍]#`=)nk a_4c.-Y pN+,~mV-C[ݴKK~c_<>}22HІ9!e\W"*_骴w_=Q]'XQEQU5ZGο8.%X&;V!/-a6WQnɷEOƽ W&xK]z!a9WqBK!VYI8$s5<|'QR%V:9:cF% Knek4-2#,{'C_Bui>5K-7>pnn#5Aj\ݒ6(uoi K-8w )nJ*Ң-x`~VX\:Ў LI'rI- wM JF.w:*1&i&Nlokr2B\kmsN*9"E$I*$Q%GxZTkr2BӤJJJƵH߁k/?w9Nr j??}qP0_6S)96+NenY8Ǜ}eTrV䛎۩EWyQ@a5i>zW%#=XάK%ЂkNu1o N7QW}eHcy$u4(I>Yj7l2[ʲ(l~u|XY/^臯?|A$ƾ#ff8 [\h% w OO o7Cz+;K&4ZG%+N+FSOTz)+p>;j |/ j ✋uS.V,,?<1Y[TV _\X2R# ⟵߄m[AbOc ,v8 _Z4)ʬJ+ JUm+s>_Ruyu .B腥xU$INAҒi R]GQ5 0L܈ CZ.vŅl7)zaIɦ䖭䣫fij +.Z.w[^8fD֚e {E 彩yㄷO1Q5r Z*n@ ,FNIWyC|rKoAu ȏ$Pyŋ}Z2WvKgN:\m$.thA& =AjZ~촽:-,,K{x#XE > ]WwZA$ʐy$`u$m5Kq=7p@ GQq_(~?ԼIyςo7_"ɆokVٙc6Ǧ$'kJpt^=yΝ7*QE{_zu sC" $+)RV<35嶕p*c2BZݭ"I͢ۊrVaETԵ -D=̫đKzcw9Ǚo"ȿ4a+c ( )H쨊2Rk3NV]5a{paI~2Z6KN͚QP^[< ΙE7K;BC}|znNztV~7&>-YeY -Df#n~o{sѝI{H[tZ*ik{(((S62Ũ6*W)b+B%E'WB ̛d&(W^ږgtwqQWfn]@vX\:S渊=ȱ'M֋ \sw6\\I^_A9o“R4:cL7G2.h/QIKL$I5SN,5/mQYBA|1\x^Й_\A̩ 0#ס~m)|8V2s8A\1Ĺ]+ٽyźn'ٽ=6ni6y1YxDRtƞ;E] >3rKvjE#0U,rI(Z+" :8]kB5VgOJ5;NMgOPKK[VD19T|i7^ռEim݉ W߱/8GC%!|ɞʠBdZ等p WKwG5|[^o)jϰ袳:S'O]Jͯ|5t=ТkRefnDecS5fbTd8z_P,pY[hEszj[{ x%InI#`W|~O|~D#"ajIK;軫#(jlאת{W6z曨KmiZ\E2fWt#*xgoٳBQ70|G6w,[GX$JH*sιΤz͇ZW )+.hcX;~ΗHdϦs[K[V*YhvS]\Go 10*3׊KV ˴W߱oÝwZn z(|q .U rO}oy"hp =xb)Ƭ6g.OF5.U-?[ӵi%K+[Njb̮S|CFhw epmu67g< I#'+^!`7w0b傦8)nU [.ai֟}\̽7P߈"WjiMI]QLaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPW_/W=] {KUPEPEP yV`g}ڷ(?ޝk[/ӿ?hj( ( ( ( ( o]rA3stUnj&?MBCւ&S b $f@v}h"qpՔwS<iu~~ ¿v# uO>;c1>#S&S9g?4D\jqHozxai?ʿ!Ѝ<nUݗK|.mn(-9FUy@~`kd05xwzb9(*p+k<¾ޯbXY~gPc1ny{l3__^k GQRӴ_:kC!;c0,LPz~5| ǭOLmcpnb 6T$?f?e}[W *5ZL¶T*hIYOD~d?>Oon>IvT _π֡xe7d]p ^g Cr.mu9,G\vS]#/+w6HOEpH8GjG3Cߵ?>/ DKVV|<1AF;W|C:|[K+W+?K= 3-؜4A6gf{/ؿ/xBXmRH xx63]Ǖ 7 ___%ͻ\4*%I]Hm>ڸOQǯO|` _ʺ٧YB{iYrja(5S[k48wa(Kkk>Ǵ7~wı uko @F΀WŚeY~Ծ=~!kw~I7>JȱL ĸ QsLs$?bYB+?%%|M) %W3ʲO5iVP5kYk{85Z#;Y-KO뮇) lt?7񍜉%ĚK|pf:d珥k"iu/,s(g\kxGtYG\zk/-21]mll#o6ض*TvIr ҄isumD“;]ǣW[O+Nk-»HrXd߰߃>*E45mlO݈־ɨ⹊rDruסW Nju{|V |E,D{v׹-W? V:i>eӃ@.}VhԛZUCNUj;(珏! ҦsI~xO` {'XP~eHNZ$$?v?/.Ybj~X߫+?m^0ռ5Cok~#95ݔV@Jc}7ῂjyz~nɃˑ¢BvMK^"7/GW1XdE8vLV%6:88=gzsyC/yAo쏧>MgBl-b0dn#Yh/3o VknA.ѹ +ۃ> GD<,_QP7"H8\a纊V~xQ`$#q2CUU"[uXaTpB͜=\gy| Meu[Og n[Kv[h8xw'ֵ.|e}L#DdXta 5[j)keøYzpy >JWiK0^U4l 3xG ­">^k CxKq!G??b0xU" .;7ڥn,W cSUɷ{z=m 8|.oa}k12_:gk89sp$SڇI^aa~)^2,- .mIQ+SE#0E,*OA_B}XTq\E>Lr$뵁((_ Ծ&j:o)m8{¿+៌G_%Z_\oQS̒v<8 -&?1m^?sb̬cR3k?nJXΚk?nkJS3º!m/O,&~g=)V_t Uxwȟ}s_-F!շ-wTH%_f8%>[/~ ǓZޣKht[UwTrX2Vic!B~=CY<ֿd-Bx@evƤrkmc8"=`53Ē 01+^շb'jv.lj~_|6x绘h}[4cy.:\N_ox,X+eTKFH|g81_?㧋|# |9%ӼAFMb,1"ϻ-j}79|Qk h[=ib1Slڲ^^qXڊ4=|(_sQ?6>|NBdDmNv?ࢿ e־:ӕRY9H##{ؿEIu;; :+w3s_t^5𶭠jIXjvZL${P+<˧B]^Vz}Y~㲙Ik{Y鯓9ρ^)FS5W\/*:=_,7ɺ{6I H#\857'kuM#ªFDwvf5ijߌ-;Nv<TKSvE\T,& ;KGϲ Xxo–,Dj>}k uO˭6۬ xdUzoiyl~L<,]=#+yi2ao5}oz_[Mo[-R $te4?|%b|jĭf{/LwFH|u@v|J'gsޫsΌs)xm8H#:/_ׄ%x.}\HfIO&CT'V\2I$u%i?!mdEfDf ğ@Ir##ì4%<ڷε{XIaVVH{>Kiˬj1xdLFݜd\Z|P&-Vq !=a[ω+3 w{3zU\hJkkyNkF.z+%{ &0|u,.~9^2I,&0%ynZd[B0-㷉CF~P|5ºzog$4<@ܱxsLJZY ͌6T5i>-Ausk:~slHKx8!I+ja |h),2Imu~nT῀ߵ///|׺s/ۦ6*B _U{';8 z출)VB I~G҅ F*5h->AEPd4cV` {א?'wR׬fDӼVy;=v`Jx5yxv0C A6"? RyYi5j2 ź'įi8j# [^2,QH7F i&wŭY5VUV+nRv67)SU|%QW۫f o6f}sŚ͸u?I7"!qFqz[0d8!`%vJϝ|W{>7#.f$I'HОۜϽ|}:σo>(|ZԵ udOK% o**a'9m9e,/c('a/?fI]E"qu) AsЪktn؜M8Ha0F{#hρgL]'oJFĶdiel'q!#k+)}{?c<5_ 9F B}T~~^Ak3Iqwg q:W5Yc;VFu?>" ZAÚ|q8j*t=VO=YfuOmGJ;S+ugΌ^_3v{c?٧>{VmW306XgsZۊ $P0ZRԡw`hN2^{Z};hPmTMhדo :C+:YV9xUs^7ƥw~#Rk3ǬW8 w=k>>CkdV7yW"/ ulhx:ݓh}?a LJY,F$FL"S)b5Y)#*GltV_WVjfYJ܀B?5O[[mn6 ;` O|Pt1t9i*wѭUQ7%K٧un}wށ°mx])Do*J0Ҿf|`DןR[-qX܏:TSzwj ]yLf)7;- B? 3~v7SxÒj-ٰYfF<ZKXmf̆7CєTWJ:#(aF=s=7v1JGw2xW|Ar.4hD#le(;Hu$<<r$_>RiJu0iJԥ]#~}onw~g$-Ĥ `+^wZM o+ĺLxdy彴Xf\gʶ 'Gz-~._8K;]}O&#xߊ4|8%yŖpd4gvRERF[8 (W/~ kw^"I#^9wK2`6*8s;xݕd+y9(Y#` iQ_fQO9ceWEP_<3|#{h]gRL_ 8fw{ y?W&kxMk^#mPOhh`~ǷQ JOKƯo*g_f?Y'f/|{Դ>0bY9ʜ+իJQ]jtG/?=5>A b7rgsڿBkoIz5}^FSӍhEY* #i+%Ri~PO:<#O:$PԠ%]!&S#HLt$]7qpjMeWRbdHwQ⽣? |h(kMXfMo  _0Ak#|*}Ĥi$({e1XyDNJ^69J:(*i[Ux{'jzg_蚯ݢE4=URF&|;vz'Z,n3c0$ߥxDx^,g~.ҢiRTܮ$(o_k=|7$pY`#45MKu?f|o~ x%B;O\,dk۲-eK[}&I t D~=?ab(TU^rתchqU6zY/-G*xWG</[ms %SOp'$W}~*L$)WuݕӄT\Z4eyN7qW^N>"|H¯ &cӴF㗕qVc@M|oX4^{l!cnW}I"p:GJr?Lho.4ȍU2Y:04ka֬n#&pt7-]ďI? ,>cYO#.K`H|uZo$yIFIt9v n8e>2]| ? :(;9w"J;wڪxQ4xW|A⥟Zo`C yʍCmTgouQI%{]rwt|di{'VQQI)?^xGÞdw9۩wh0{s7B ߦ__ tߵMNQZY刵Р8>_~9'mY巊S{^(QQҺ#1S|t^cW~麑Ԯ5XCcdGCX~'ËGBTS>7ls2l舫ɷΧ,I^j7Umi`hK#ģyUm%{OŸK㿆>ª\]ʣ $xԸۉ7cޟNε}cÒ*2l3,GFA aF}C=u4x&N&ТX|Ÿ=ڼ 8*o<- o3ķwrj)zoKί][F񎚟iXAG=3{φINE$;]Fl@$8$8W]ak5[B$LR4%I'Z5֏궪 7 2;w)#8#q^,=nz^gnG/kJ՜VBĚ[<'}Afk8[N*r>e>9 {?_o#}>OvLmXuo.+ib X<,櫫xg3m99`+b''}Y3W|R>!Ǻ|WZ4bb\nXnÂxcʟ,4-,Kv澗]vM c%+ys_FurO~ oi:/MFk1@'RA+Fo+gL|E񷎴X!xcLmZ[uHj<,{t.=y%RVz}1Cz?nMU\synq,v$+}o7z,>1M-4\J;~_@s.zq^I7TڧOg|ZeyըQW*'ma(+}Y$ڽor?~ʿ [*\\S >$t+65>(Qt L"TՏFې= | .?;J?Ʃ3ᥬH^ qnK|IXk_~+}bO)G Fx"о o xsMu=v;B[ZgH>G2cqT=uvGnO:/}Z,?⹮{nsڳ>յ8DV\?(8|+/ak/|K֯K5õY[jIf  ;ȯϯxĚuY#я' { v WaU:c{Ż_϶gZSjc{^=tv"c Kό4?|lj~{+Zoʌ g #+xyyxZ..EK,I c$*FK&Mh/ KXDSGpy+:0t^t?6?iٳ? ~.|;tgZW*]kCc_Gù~orn/8O_oW'SM&^ -:IMѐ!#_g SPMWKþ-Ӣko:Tۉ*[ `y]SP\:qhhor SPx׍~ٯg` V ]]]v^QH8jp*Ft84ԵVv]I¥,?MI^6}[)V/tB`IS|/2_Փ7Ŀީee6XHK"se`7. ',@?? 3r6xoJC QBY Na^5uvݷ1/4ƶ\,yٷk^j)yeԦMWaT^asWE} *PNGѣOMREt>Tx6-s}}Bcq/qߺuX"/%e!7Wduc\4q~˾3o@ $?@C'aCs)$ڂo;~GOgiU+/ 5&c8[WugkL/p8SJ R{u?Gg *g *GSK >_P_[Q-nxR5hn@0C\E|3 6;$/>@ލZw9KBGJ|XY/^臯c?7 iycMM7OmJ5G\Aŏ%25z $']%tc[Fۖ_=q!Syeum埵gg"|54+mE-e-&̮yUa3>~F"m[M1EbWnoqf@?.iMVp+E;tX*PuQ\qm I]CE{}uu|-o2\ܿ ?緈?9?pRQ_w־ޮ\> 0k_Ǟ77 idy0ELʽoZoωßQx~m:}bYO}nd/-ݕXreqkCo @VXc#Uď;x_i U}*'rA $*TNVi)'"4b2ʸjSNQOM|<#ݹ,7.KBܚ?g5_i8u.2w{i>Rݛrv݅lw_>Iu⮥ [xxbk{xf Yp*)l~f` тm OF4hUr[7ٵjl3;J6qokf}g_~ݟct%ڋfF}/º-yw6P*d##ZԀdr)k+$خT<ŋ? ]lyʲs>㢫?{x6Ho^i٘F&C zWZi?kOڛLyf/q;&H?xG0o E,QFQaT+ƣيu=#lx_i_1i|WӴvl}Yݯkj>+_OeI'Kv>DJBcf#\']3 W9^OH{]gu/,?_ŝKZK}&6C;]=UO\#5iP-ۥK(9=5UZ{x/Fwov~n|3M6ͩxS31"C@sˁ/K[G% .I'(~r>,kNiҪ F$,ʐvāgo ϶Ϳ+uI#UԥB/1kxE^@K]T0(5Rןuoۆ0i*7Ov|Y3z_xoWQ֮G+p+]2A[ 3XGQXuVgq&8fOFzg||~ Xo Ipo8IYљ[>eTnH$3]$ΟS6WWu5KaV55ѶIO:8MiBnM$yN׼]__P70×bHE$+B@߇<'-=VWQ2 D}EUc_\d`-S[}wIԭ q Q2Ȋ/>&|Ge࿉W a[yladJ$v2a(kkT8sӏ7}zҧOeo+χ?_ Eյߌwiri=-C69pgV-> ֩^-Ԧ;~j \kWWO /LyaP]1 $?> O MSFUF{ β̣*#8g//Ž&ԖX7#}p~LHHh 31u$ׇa|Do)7wj֝|[XWGsr{ZIv?Ćj?٭50M]w($rI5kwD'}EKYR,C-*szI6B):=*N+Rʂ7=n}pXzG[۹O/(G|15iK*e陲@ϥ~W:BCɫF%R_p>;j>zff{k{<WOtQ鼑}|1VR݆-ٳʼ֬(;=ZG֩CRtݞ;_>'`Ϋ^F&70*sgf5+/qm=5&Ԋ-*͵yE X:RXd5xCukm.Y; ;]Uv9l@1K7 OP\/uqd`rNZhߓ}o'wXF՘$Q<C>;z[6~?w_ }cDXnc%f+2zo)-?tbp(k^A|̭ lTmD W<Jex)oJT 0i=ޮ߁~Ÿ37^cLdBS$<{ou/7P8 nlB"#\oRј}]dʋܢ c~bk9؞JPC/ pTzw<ڱXu Km;s|e>K?u;{%ȆEt(;( Y?f=o׍5;CO6 y} L^3wإaKgQ7:֎3}ߞ+BUӣ3t߰NJ|U8}{%K#ei! eYT{(v/ɒ6i8XA,k'.W/PO[3$sKbBHڏ zq?WˡZZU}a ӯ=ZcqO~ѺZg@:ÍÏTV2R:W|"k!wxSM,cy$ݘ0;Wc],;- ,-k9{~oG|G~,oҺ| 't}O>.w:ݶڕLJdjzp^)RRۏ }^6C=;?lZJyy5Mzv~gOߋZǎxg3^j^(b}@Qhd*;VIWxoU AviJ^FI1?O|H/<;Y~5/ ilߴ|7eh+3Gܤ0 @W-֌qys>UmޮMLׅLq|''e~Z/ W#:fmlߵZURWzxh_uluŤx3X2{k':CW&KmM<"bC#`p{5EQtqi*jJWIoCJ0x|ΌcERRRM;]].Ǻ~|3Q\xM sfE'vT~};࿏5oɩ՞Xr)P5/E|W |^L—<Rюf=R{ٷ_f$.ڢķne2vF>~|h/r 1Km?+/ȏ\覯kӧE҂l>ql?:f7_G,iڤvq5K V sτm_2_,k"6nVfz ju.i[DH-b#;hDIvGq[ dQb?b_ x>|0,WӠ-Nz  8xG;Þ3ݜ:XiRsH@!c;[#@ k1{D\5Oi7O/z=q?oǻkK>|3]_4 Y>D6R &E2 {GJ ;./7p7r:($_/,ll~%qxLtbv'l~EڏH^vOrx[I-8PP댜g׫h_</]C]A}|AF10Sz~ĿMKAoX[}?yz_}a9o;:kgu_OOa0 \+w>xT__ &b9.$;J2:`/|K;ּWXBZ(s<LjaڳQc{ߥ3ʪє.}՛w>gQb;rx[2ܘ}i_ ޙ0 m7NKkxdQܞ$kMkMeH݊- TTIwxG Oܺ߉J׭|d 5E?_z1>=mٳWܝy 4xsrK;1f<ܜ)M]韷j Z:|ZﻶI)"I9'wu} ,uK916B |MRRxz;fWkEbR1P¾ʠ s"ZqKN^K^Hc|?{mM](nE|q_[~̟o m ('n_0W~̟o m =x|p.E8L=.mRbGwM^t[ ԭ%_ˑ 688c_~0!glI3=™bn(;z|C#REDOO7NiJq7}V4e8ML¾"ҵ)uyy<:_#*+*(b5F*7{|% "jSexE}c |e /J+7k&O/aJWI~>ɯWĞ!V]E܋;=pPϭ{VOJ=z8{:R]_K?՟|? ݕ?"88}_z뮡_oW3Kni~gG..|=_uOB9K$4{P˗kyEuivS G;H6Ӕ?zg_4k{/[͡ciٸK} *;kYd? iVnICeQZyFUc-Kqbp&jm ZK[d{/:lA+i% 9 `ln#8ԟ|3{-߇tۋ/LKKޱ?d/Z|;/=z,}[wgF8lV]zt~~;|45ɪ%% <9ϥ}Gv5S \}u^p?xGHncMm_[W.S=* 8<8J8Ms~^]Ox2|$aM:K8KS)55'%zm>zm1?{5R%LD#R-k< Q=\HdC'ԱYiQ_K?Ld_+6}7#'99v7%ee.ߖEW{AEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPW_/W=] {KUPEPEP yV`g}ڷ(?ޝk[/ӿ?hj( ( ( ( ( o]rA3stU矴'e[O6Ş?OĿƽΥ5V-ZqNT_ynHYʿ >~Ͽ_xž#fMsH"2<% N$S#?_C(Cu Vc^v\ _Wi5K -],nꪣ$>T.nMD,Xqqٯbppr'z~j#ꟴoǿ@|>| jK_jW"'Q݂88F8+ |5#c;]EDUvf/#.@vtT*UYIMZed| hUu79kh$E z[ Qw5 R?a?Wh?׶QC}$$E#ǭ}E:HVN/or`iRɾjwm{g_>.i ]l~dDDw \m#k:*xb7ӷ{t~EASk?!B`Q]Giul/ZUտKg[ʈ$9;sc,Kþ𦃧h]| mo HBZѢiN^DqR•jS/ m/WM4[ \G ]18<ѴUb(CJTjla(ʅ_Gɺ//ڏĚe<xQ ĺcDA[gqp+gOۖ8H. 9rpx=9Ƣ^ҤM;v޺TxUQg)Eջio[sj+JD=γb^6m%J%[y8ႶFG߲ů?|?mk{A=wCBU(NG}9Tx{S_'GRԮXmm4d^?P|3x7s𖏮iVm:2Gg\e?B+UsV7ݷCUXZ]-K|W|Ho%6 FƜ0%K}hU ?\|AVe8aͅWX@3CtWG*mIKv-:hz|0SnsN[Nߵw<+7 7e5CuIP&O>~6O  K).ɨj&UR2j1k+Tu̴"pJ9w |թ:5奬<^T]@$ v4Ww{>>RoK]>V Αo/|>T I$XEI<؞6rr>#!`1:4#+ssL$xT^a;pq}WEyEՕXNQ'.G<:Щ(I5goɣm}3xo OXE֡Ra8͏v {trZZ"LF{ԴV\0ʛ|OM{ieϋ?kٻbO2kDnw-]2"ǓW?±o5$jp)u̟4v肽*8Tk_r"[C*ܯm|\|k"gdCc} H $c~%~ WS]k N!_ -xFr5X'ozIYZߊc~{ՔSVi5o3ԟ~~>h7z~昦 i[̕;( W_Q=Ι[[ sG{*uwNCں(`dJI+Y߂A}M(RM/#O׬v~au ؼ%0bAu;ArE3Ƕ7)|=K+"p-8 ,5M]5R\{^3&<5M[{|sρC%j$zBݘkcd{piB*QTY5\Ta}<(%U*1vðaYq8/ڗ^_F]h>qd`GQC_[^\sPTYRU(Ԕ9j-Yg fP>goU^&u&4 n[bXzp)aCq]^21.R9<[zpֽҊa! *)8%3`aO5 8%=_~ҿ>%xOڟ}&Sܐklc_05c?:voOӼ?-iyoyI wP/'hZyj78՝ۻk4rFwz__t+otS㖁 xSHmm;].&vdX]N@5ًOTm+CQ5[Ja\ů:_5r_FO*"qdt5Q]3jEJ靕)Ƭ9>0-7V~~!nјixВvyN3P~'h-meö, ʹ1Uۈ8#+Yd,9mnkx'hӝIJ-iK6gANڜN-䵸h>/v5s[/az O|V?~x_{WO6hw|DA8t= Ί9}8ӧF1ƍ*›FQEzg~~^~СKm ~95_ɢ/M#YՕ|CevS |u38~.|7NqxZׇRh"*Ӓ n_Wux|,U%)Atꬻ#έ|LMWUe?G|VZ4[_xcOa]+R[(nV# 8k//^+ ]F(L1w >WCrQYK-g*sOG6F2aRQ:sוk| rƟWSCv Fy  A瓁ՉqqwMnv00r7'E5Ϟ>?4Lc*d7C0{[l {?q+Z4y<<\k ,~|gO7epXeM3݊_SEN -%JE}aSm}/^k +gk ; 'Az|*vZ_BUЩ#7gawIGߪfxĿ+ZS> _o-_nhBKcrO5]k>$>tK=>U3T*Yd,\}Ï^ X[(ԓK$a˖хY8dV>Y_F!unècXrg^dXf}*萻f쯁f zdn`hU(TnoШ%w~﷧C?g+ψNIxNŸk.@|2pFr@ς8CG?Z//t}['7d7E |S>qNI_M<iSVNQm+|bOh[X@\.{P^ud wJ~( ÷^ ${,!"*duB>Sh +Ia*ʺmI+ivfBXSjI[N|N> 4?5(iE+[ebC|V7V^zn⾿ԕJSV~zS+*jJYi揘eٓ^&mY]|\:ۇ`df`8 ?Ὲl|?Ehr:TA aDld`&3WU}Bü4[I̿1<Q{0| 7߃ iyZvn71ܓ[Q^bbGEF*'>+ݪ6!܏<23߃j?,>!𞹢Zx Gp|yữ7XѬk٢RLe]Jx d22;ɞZ߀.%G; K! rs.$Ua1ѧ%%4>s1(baZjqO>~o_k~$(g}[S~=JE_d$RfUn&D\r^GÏ>2|{Ӿ*T!ݎz"C]1l%N_v4TޝԌ M'[^U|FVGomuKv[[Rׄg e š7 I$IoR]˜QWܔVً{_m>kZ[&oT浯x9:i~<-4/e] G$pr $^'g~~'I"oxvGdE̥ԣ7Y3 Ǟ0~kaa*6֚ӯWV^u#T/>x~6=ԪcCҾ{kM=`M|DuT.60';آyQmʤo!aöVSD?dJ<-uyWOx:G}&Rnm8ϘR9sԞ1_W9Fr;mV)'U'Tn;k/nI'A6>)xKJq,?Β/<:xӼexSῇu_E;-k,vfH?(a*jt;僔F[]-Q;c'őIqqV3q_E!kưZB 4R4I$  \pO?{C.XysBwjqᲕ+OWq}o<;oM=ӼIӦd.Wo 0b /Fq -0֦NeVYA{Zӳ>k~Gm:^Dz} g`9a <})Eч Hzovμ.{o_OCe_΁c kxM񫩑:oe2 <]A |/%Y [ϖw=q㣗I(V} 8i/eVj)ߖ^0n߂2 Z;Gظ[T0lVEWPyk*+*,1%RsGd4* \2RTI<=2\YCoRч*9ViS蕍J0tJ g+[jI5P$ϼdH*$ረ|sߎdV? .nkR @$B'uf:[gbM[[{|kN,PcGiơTgyy^w3I[XΗj3{k ԁ^Ez5µ'FKFzeZw|}6[xծ!xc7`8Hsk(ᡅ졯߹ OIQZ}YoOٗZOƏZ+}j2,T+!`s/ oޅXysڋD%r= s>_@c^jWfevPAu+!##$o—7kKR "a OpN9TUUe.Uϗ jփEv*]yG}żYb1 #f៴%\>7m;@UQHPxzu{Y}atQ%,?aռT~-6GmRys߇z(5O[:>IRrY;Wڏȼ56ev5VLm#u-?^~ bzw}2Gv!Q\F=kj+X 2EnAמ&IFsڷEmʿ_8~)~)#]uӡunPRTb0#UI})? 6v\YMI73F 'kQ]8|,08uݷ՝x\<%'Fovϛa^-;^_d_]j( c]ىT+(Ўheܼ&:Ms?iσ2uKxn;]Q%I#8V@̹< OM|?~xi ;MZ1B&FpO_j(ԫ7Z|91tkW*JZ~'j\_p_GYbTx\&  /w79[K Rs'iu~^>m~xý{L~}ubL3ɍwf'`9S9?ψ*|Nkz(ar ~NN| ?qxF}BڡT?v7/\u(.Z1 {(ſa۾xJɸ>E/D)|~7~ҟ 4%)9J["(*NSlK|g~~'I"oxvGdE̥ԣ7Y3 Ǟ0pl~*~j V'ON47x٦||Bˡi <5g&BaR0Z<+۞k?g7~Y:w=Oyw4bIXNNp=&8ENܥ>I$g5}Jev^I$n~0 Yx?H׺iL0lC̮_IPg HDepBj0ZuVޞ1 (ڝƆ{0dvY0kmNϑ^3oC<185Ʊ)7٣8T\#?5/߇>ҕcZGu@k柂 |[gVsŧ:-xݱS(Xcm}{^6 Z.jFO/WͤSߕuBlɘErN׷/Yڐ߉mo]FL乆k海Wd, A$Q B{W*h?>?|G& esqs\Q5上Jp4kCN#diJJM[]b*%Mc'oJ+O~$OM>*qys=eu5ItA<^2 >?JWo-\nW1̪Tr8W!Tn:{r.`E|D4*G<LjԴb\)z$>|zeu/j~ץ?'*}2;EP&r=šo58. ?U1#*93} ѵ8>ͩi%crH#k[AG eMI%=_K":q$[M OC6Q\fG6 C5Ԩ@ o}{EsTu9E׵ۦrVcRJֶtsܞ%zK+X|Lf;U1TmV1Do"]@*3ؑڽF5i:35o3<=MSV}ϋ| ڧ^|)='U].-U95ۯ_x5ggi#{&L983럘qEa<;$vrp/ ҒJ6$~~^~СKm ~95_ɢ/M#YՕ|CevS |u38~.|7NqxZׇRh"*Ӓ n_WuaVӪxL NTۛuV]4|!:=s~/ƞ }זg.8ggbG.3ڋߊ~)h:=|C6]V𛇎mJu+Վ pV_sێ_B8_}Om4~zu_|Tl7v,.#*7?u*=h{KU)8MfI}=Eg 挪Ԕ]vcxεYO'k_+ǟx;B؆;dlfd*1,zfâ1XXc(5I::xm'm_4[;m졆T;YcPFGzW7\>ZMƳyb=6sǚr@ wP7tΟ57N.ZQ߱ 1uJx\HC<}|Kw 'n4QSB0J"0xahƅ=ok𮫨zd֥onkÍL0 Oa_?~5ǶGu&$ ʉJЭ'˥S:HV ] (/~=|>@7F ؗ˵[ >\g#t/k? 5 | ol]'+{ *TМLe])Ԕ%$k[mg/_m.OgoW7i0`^Om'׀~ݿ|gIt>ѿ%.$_C?uv_S[AݝӉxZvi+^](ü ㎍፬l6YX! 3(dx 1׍Uo#>n]CpA$Sʟ)産9%'vѿ /"OB(dI}ۑ$pTHmQEtapAӃ|ՂCJO_d߉__EQ]2F)8% gdQ1FnܶS?>ҷ>,?}$kIhHW[U/кǎ-<{Aм.!卄lP.Rsilߟ+o?~G}jM̚mlpkym scp'f٢XXbmYۍB0QjZw_&忴gPAum0 R=zV+AӨZ1J^¾+~hv}xŵQwYU9|'{㟌|Y%e XseUBK ı=A֊FvMytg).6u7o6r><xSW ,|"}"o|bZ{~߳.'|!c;ip]O+䓴' E}Eo_ Uc'-.vwgN' EE^2pVݝMi~&џto|b4Rv'kmf1UŷB߈~)|??OWHʬxֽ)ƕJm,5i6۩IkiKo&?c8| o*_X>!Xç[gO;Z_ |M_oRf,<ҙz<{ߗfITU.x7ğ~dxIVC,S!]6e$ずf-Ư]IkH>p2,0NǶ0{By澮`iJ7mSyo9m(qdߚQEz'~uxύ?ooU]ĖJw Bx!$9F7C>!~Ӿ 3iJԮki5MB7U&X=3M^&\^-QanD+Ug(^r۪z>;ʪN'{iu4xiw}Q aĄJG%7Oh/0ӭ@* $f]ʝ(R„nl[LFPiŭ]O!6~πYյ;{k2RpDl q[q/?5_ [k~uLؿ?#|0n?1M{@ҷ+wQ>*ռ ]K|Q"pDF prO<0O*i+$e$<ՔmY},|g?Fѵ䰹T2yM"*AS6g<>Cakd. +|ā1 /wwqw~w!et>-wӣ>k^.ͣ]C<dlT#x{/?^Lkc6e>k;lKtg?f?ŏvwh&rrYX8MC]+Ҭ~z嶦$LEdAâ%GRRPRդկN TjʚQjNK.>:_Ǫx[ekɢb X"rijf'<9-xCqi7_ &[SVܫ%U2ql3_VQZI:A~=um,+_[~m[YY–֖,0ƊUV(Wm 4boi)(`G;q!N0|_a趾DŽb/He8mV[ cDI9㏁uψ =^!ƼeNv;!ݱTA+/|Z~vk^XoGxXȃw wʒ95ӧS4ϘB<_n/gn$? 6<iOjFyjWWR[I,d9vu~ݮ|F|/g?/i%R{]FU4>w?xx5_7hc፸d;I 1W$.4*+8)ɵ--өYVQVtdK{SᏌoC־hVvM-nZ? U=nJKHdʃg}EkGWOֽ Ҫ,ENf{o}ֳ}=Vppin2"͐ |ǧS_1Կ|\_ޗqͧ"#VVW*˸3>qXbi*SoKkbpQTj7k{ɖ?jx, 7ks~(l!hv+5Ќщe³lQE<&IJʊYJ>H _ <.ѝBI A@f5 58t+z/W^iRpy^Wݾ#ҿb/|?t%{;! KBH^M55DPj@:QXzQwaG B#RAEVHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z(((((A3s\~L+@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Ǵ\t7_/W=@Q@Q@<3m[Ճ/jޠ(EzwnVN|5 (((.~mmnv p(׈~)x[Mkkr41JBƴ<7M;79t\RGmj^1(@!@lpy=rM[_6_E.x죈ḲA=&A3s\~L+@r?m7_^0m^ϡZv1U HWebWR|u U)5L>Tww|}ѯxG-Zwm6FG_b|gW41My+z~,ZkP|I_ ir2kjg2G-`SӔToOwC vǍu4 2ZEqpg 9ڌ 4MjĚ--ޝoյ:FH<W7 ]W_O,K|/%.o>zZFֶ}MQ$KS㇁ i^7vFX z:moqռSCFA,w_ ?!y㯶|Uw7W\V&ٵEi<1ɰpq/ɲ}\LEk.I(-(n{R Ootg G)>6VѕQsq9mVf 9aj ¿ZoMl:*D>eWr9<t#sGwssIhץ-v>7gү<_.o_ǦYYb5b2Ȯ9eE!YH h/<7ğ uCs+dTc\` qw̸2XY>ZjO*_ ;'exO*+?m/c^nҬnmhRI-A(~5ȱ2׷-HOn빭:L_3~ο'1|ju74 nT"a.bQ_Injǿ?hxF[hŤ"lL,,2/k_G_x\f=ʽM*ʓM!6X瞫WK'aaV {XSWkIhc*u7>(VxǾI5h>Z_kX"S#'&Uk沼*eM'&ۓZw{%6V4>ע{P'.Q4Ow^BK./&O3 y^`_WW~i J~,5/_a۽zI*OFW>^.abLxn#՚{} #8sEQ^qg9~xVĞ*"Ѵ;VEefT.Y޼7\?g>2?K!'/a}k3DLq*N}¿L2\<=JgI*|ȥw̽z8Rt>wF1}/ xEֵ (n0$@4_/~ 9Ӿ%9柪Ecu MbcT n8#owxZjZ5&Lt-2 uUTD$tiՓQj+A5xRw%NۭjK"rFWl$7`Ac?i~m\MHUQب#p>zr|7>- .wmW̿m~>$xv4>XawY8 x"9fEFɯݏF}kV:/t-s?.؁vldpIxc"qf4yT5Z]Rr-t&WNpqE|W_E/$[2opv1_i|>CZ?;v/t]ZnmVH*Gb_;cѧ:SvR8n~O屵:Ш[m?m#A-H!J8O1 Š |^?hZQ'gx{ Ktџp7j"\cSSb| s%?FRM;Y"Xqm7LaF舠'+Ư |}c \u1I kYA8aАA5_o #xsSsC+ZcK2 U¼!cETRj6vst>cK<kW~Ddb6Ȫ WW_߱-s]A}[Z$/k<32I+׵}9Rş|8ԭ6Gv!0D8,̽?{M8\]M/S{+/nQ*wgQEQ\ď'Ca`擦\bE8p8=kZTZiCy4vWgGE|[L<9/kQ[Z}¶7^lƱ|ƒhv &i~ OU;K|W$Vc0۲@v\ ԕZJ Kޜ#wo/zיZYV5?ºQz}wWR,Q"v>k/R+~cj؅dlg~UVn8 3^&Us pJ;sJR"rJ*gW?o Zg]|6hdr>eKvYXn~8du]H_SϚ어hca䔓MIJ/gEף*HW9|_[g/M~f YM2AX/.saF]~A~ӿg|z3}OPi^FT )1aO?}IIFV` }nzǽ~a+Rpu*FNiդ+rWmvC8ROe϶hbK|\kB[Z$1DkVʑ́@XX|ڿ:2NmY_ޔ`Y{s"O{?2|bb󕗥j7z#~&o>t;_ ki:M&5$c:]_dž>!n߆M^#-dKnڒLfQv:yawTMn5mwnouk,RXt'f7PGpNF+QD|7?^%eE Y;q^E4~/Wľ0Iukf+Eʨ nNs_+ 4هCO6_V6Ym}ՙdx )xX.S(+VK=oDggCUkS4۩^M[MKQl4OhcaIup®mf?hggVt$YT6ø3_ <e ᬿ$h77nfic|H,Yn1~k%p2o9ӛWrIGVT:O}}aY;be)U@ Ww3m ~8,bGlG(@Ueba!ݜ {(+'#i^IF@dANwh(gLTrS<';7&wM%tIөvtQE|1Q_*ҿ4!6W!C_M[o]ȭY@)^UcsGp4fީ$IwlΥH\g~0>YgX96` 8iGsRt5fӖ YUu&Xs!yWl>մ/ՅōՒ\I [O H@o%}]7ciԌ(N2S$W[#sVbݴW_g푠~ii^+Ο>eݰ;* |bGkwOxvk_ @u̐_]dw|3|OJjiymi)I9kSq}wuW V/e+# 6Ga@\+ 9I(]I$ʜM^GW3+6NjKu=JΞE]rB(T|~*Yn|5u ]CVV&@qA;dסpaQ&bs#}yWdN)=+؋ċ9moEHd*>[R`.5pfyV3'll9dkTOgM>T*FYX][uH[ReK*ϴ g3)]vc],r&aðPBJdgTջ_#9F'~JD~~޽s K!>WP#֊CRSaa]5kM%e.KIX?=KF|@|I ? ^n/%a)`F==+ z~_u kZpL: 5Nʮrov﹆R;Mj?h +D'B f SoC3[y u˦Xȧ J vw,!u"ꗒmqS豐qٝkժTG I/zOˢG_V6J..i?.=‡m]Efc+\c|ϻZG%Aegd؊,5Qvf`N&0K줥d9*x_a%.T E|FC\Z͏2e +6y8ͽkN^1j:0mJ׳M]wWJkyw 7I$nd@xgP'gH|"XmuV ῶz֋W5 aw8a̍\7,> <|I/3G GLS\4z*HZV,0I#j㫙B+4g}KZ>qN5amnVW|⏈/kS߉yZS]F}5XdA H+P!LJlo)૯t (3yj7t*k6<)/|(ֱK2dU0$*qtڦo{[R3 u*MQu%u+k״Q^'cE𶧣}JҤԤ#UO$nU0Oj^<]yb14~Mmg#>)O鷶^]I95Fe0W9ⴟ׊<5 ?_^!E3y1Y8 7~3ܺg|7gk5O]4ZϮ謯xM_uwX[=/O.'nvrIW:ïׇme1˻Iq >P\Z鯋ޯMxu , =M&}wE|O iE|K=\yQSa'\5:88(ҕkhb(ѕm}tQEuEĿKw/~ o'ojF2 9 vH'")Q;$r1TR}%>Nk Zw J>݉$I._P^VaiW)y6xۃ*(bbtOfx|mSq24?%x?t[k{-"eMA&c$< >a+I')X Y7u3 kݘWxJm;ŠC;vtHN:d⼌6e~M)lOKhxXLS2mKdݢz^\_7ƏxC2%ly={z>;|R5~xޙ-$t./fvgvb)ƗJ4~{Go%jioAm{w[v/ZK?W55wڛ̱ad_V6 k)3rW{[qI£{rw[m(?l"!!R $ I x.O|mv~|Zf@Br6?jڮcQbcL_><hiVh.6oT95mN14KGZ.+ϊ|uiZecm{⟄phy1Kut;k=&#\@A_!MxK ^?y prUZ&䢣kۭ$y ׎6G5^o}5ha}X.RMn.$j cex⎡}7OW:1 qVhf##ֻaڌޯdoGP0lmUZE?&'4~_#y_ō7Vw+GmcpH `3.JdsYcxƭs}߄DIY\}(@ `)eOvvcif8y;-/gZ߉m7\[ʳA2 #3u# Rצ{!EP^  !^k= ɮZ%ĞXzs֟^'g Ck~m2Xy 1 +ѩV`TvHVvݞE|)M?d:_8BׇF>&gWϿhMLm3W*M$;V} gr奎Zjm7WᣙaTړ]+E>-|[xcDM/}3?R4M-NaFvI]FHj¿ hڸ5YԦ(xza~=2o9g/Xxmm31KOoW+$#k17L.ûg]1Uoc.*ݢv=֊>'x;[le'%إquºZx?ψoz&mI(1)23le<*=ZgTjYۿ-Ϭh[ľƟbNĀ7rA#qVX2R# X|U,Mn_&VG잱4^Ǎ&xkh-MtL2Hfq8<+OBr5wG Ն4ͩ9,0^ OXyjRR2Ne}K<:a$ck{M5c)I 3.eJ_#xog&--`Q[L;&^jСyIqxh{JoIh/|N mNso/Fc(^_9Οf'<%;kZdIV6ƻH,*25Z<|moLC59zo;O5_>1ԥm7,XIq+ˁO~ܗ(|:l>54̹Ep#a[IK'Ӧn`J{ߣm>wjMGⷎJ6)euVUu!CF #~9|w? 4p+->k<du$ e uԽսOATzZz=u1W@u9/Oڞ>tg95!H}> oO!o{ 2#8Ζ:iEM_S*9EN-jJQ\_O|/cM]^}*q7$] q,;Wj_Ng~ |I歯.33W峀8$i[C'WsLF? iY~^ߟMϨ诖_QHE'Ԛv&#}+k[_UMcE$T14s컦2X:Kk/_%؞;^§SsC5+HG8S~~^|CğxLjK[p$ Ae$c"aRvz'gg8f9%'f읚~N=:g:K<}k1C?c P5& VU)7d»K׏_)q aRX}\Ak 洹FЮ$KL?\̰m6vm/Wk3l%9I9;GFm'ұa/ï xW˦AMFl,ṛzՏ LtsFK.<A<<9;6Z_NqxIy|l%՚n28\;N6^a *]4ѵ{i{t>kMI%o`Kyvel ?'jVVm^򅸍bUY!<0=kꟇ>"|Y'WI|7D^J=n#i$uc)tkc,{_:JBp2x Sz#<+[>(9"8Y]@$0E"pԥV{#?_=/?Nj4E'A&?+;P"b׽W~ͿJ:s/>eˁ@=7n+Zhɮ Y[w06ۂF*1Fu(Ὦ)z0Omr~]mdz]m->_ xf~2&3:U 1  'h#7 vDin鐒)b)Viqtq})^?>[ȫ}3Zo ;:Fկ-&Bdw?տQ_?<}`ZxO7+i3n;_OxoVCTt˻Sy [!<0>6kN'Y{MZهߴ?Mֺ;8`E&Wqv` 5Rdu5L4&uQ_:`wǀዯ;fr۶2U+`9` ݁OX&-=Ŀi~E 6es<ɟZc&znm/VZ'Mұi>> oB!4##AAElץ)%(Z2SJQwLL-miCDPK1=?ٿhK7x~3mɵivʑm,;Q5~5_'|pj_hR{ `RLk4:|)a f IIӭtݡͽvxLF;Rv5yKW?l⏋ m5}oM;]"5)iWgT3d/dxW㾆44l/&4G 7`2©rw[=Mo8F\}Z^ӡq>1x77%'_9ݛwjׯx:uoY20C*N21xO|/ďQ?^'n靋)K Nڧu1\)NjϪkGb|VjO~,,t}'VwE(ieO拦MQmYm67sBHd}ņG@Ur;o? _^U Y%:ppI]mM\Eib>A$һnV:bS is7+ݬzߋ k,".VXZ6}@|+| ?mco5aZ^6E kVE%J@5_?|Ubma'(wSAF'as J5%$nZWWH5W?,eI.&L\׀>-$>=sk\<3\Gbx|M">!\#+bFPvAw*Xç9~ _|=W݌>մF8"PE I<ŽWaNk1F<^kz~c=u}mmct;Vz*??؟{3> ď.aVخ^ݹeCAS7ֽJIFXg>jSQ򵌟lO=ߙxD}wúzp]b0V*[A;W?| cx{WÿqxSFdCX$ #ן i٤ӡ?ޚF%nvcj15+ΕNW F+7jo:~!bgd|[ ]:ϹM@PNG=9J}]OZȴLHztU؜;~gO~%|:^ov5>|P̒1h~b|Wm/> 1pE5FD;A=Ik~g4y>ę@;8w$ ڳEAGyc)J{ycw_"|=MOWa9C>.,pO^.3U,Z%Ook?.4;iM5t8qC o 3yCC>$^wxGFHoUtJb8g.Qw5KR89bnewts*yZewX{7M/1.OC YM?jo7|#;𒯝7ڦyKG<+ w=kgo+C+qiwdf+7#apT V+TQnku ^Ԟ髯+sh#t"P[@Ms)9'$$3>o ԼOi(kIwf$䁓ZѫKB^szXbN[{:z+]~0מfa eRA+w`2q^>~v?Oھs>t僪WJ sS0dOѴqpE͵I6yjڵ^jZZXY,qf>k+ cP \BmB;F#n8 aڌޯdoGF'CYlm::m>s$ 2alz׸n-@|RgtWnP!Xzp?" k\ #YFW巕ӿykc1~+/7w>W¿Al%be8lJzY,k_>\KN.=bB@lu!_pkgai{;_7orvN+[>Oo+fgC.|rdvFcf[+5+8.f5)`"0ʰ# +D|C3'>- ]2(ʧ!U>bs:VhG7WMB8hsJN{/7c|=c>-#ۭB{|ƪ?^ʎ"0ear?hٟᦡ{7;Zvڲ*,ͧI)$ L(&q J]5~9(b0Ŭ&)E&Ӎnw=ƞ?í$~&֬KYn ` 2?m/hc5ե2IϞ*Ѡ7u0fJȊU[e.;f.}B1_Sxyk i7,UKn8tuPTq9qL(ŵ2/WQQ}ݵY}Y[6ZOմ$h\::Â?&}K/nG!krHC*eEAFǫ޾_<17WLcm\8 #,zdu$Շ®bk\|q=صkoc(}b5/7?lj$!v)xS^m}nEɅLH 98WWeuZ|*4n_ QV|\N~c_6>9?xl |K(daFK"}P0z5͎Tn6z#rfY\$&mǫ?_A6Ɲkg(%W8t`XgVkS$ [$Z.,ai.$2O>rNV3妇KM.iQ_%鿶/WW|+KqhV; G`>U#8?y ')uIB\ T-߼C1NI&;42m%'i;&I&Տ(nTi$CE%.jV_~\xO}j1s 3#EtWRTzMGV'G ʪeIH֊퍨ʲOMv,<$ 9a2 rk{饷6hHCK*om5eaqqrm4~"vy/Iuܶt=ʌ3o "ji%m[]G-Ǣq5'm &x&KQ_l6&+nOxAtMwKݭtiw̑m k3+޼qU0M]eGW f]ONΊ_ڿgjMf$^UI^4v'dUb{5ORo4Oi_XԖV]#+G+Җ.ԡRrWI/Ϣ=cFXSKe=KsW~ ߉7|[ۍ6ddgQ]~|;ctk^M'2JYݽ3v~T`151T*I c~f+>?hv?:Z sλESu1 ;W7ֹWQQJ.8cCFך.~Xk[ˏ pPٺ;®[0$GP u/῅A BKDbFu&JNEm{ksu߉Oi~Яuj-;Kqu9¢@*iw5u+y,ЫY6فk収ZQ_ K{RhR= Lf#GI&9c/q^oo. uqӏ7{ytxǚ/? j$زS|p1 k2uo,W荧Jj _BJwoGPMSnO[$۷{$> oae?ŗ~ 'PWYf2|H8^j)g7t5j֎"x{Jr{PQxֶ2x'WIj>{ Xؚx\L~X`sCGP+{rG8+`3^#f|jƛ;ž)ѯc-D~ հ7p:cҟg, c~f+[7־q%v_C)`=ym3|{a#my57Vn^Rsb3,%VyJK]߁~!xwfR-_LZBpJ2?:Ͼ|##I𵤟h3^\3;~ jv>Ү[+D8`KV +kDZ⚋־lcQvW캳h_ڻ7\G9<\ wg8m{|ml#)fLn x$A6y8٦N0gږinsȖQ,:]<ۆPde'>9|&7i7>_\ۻ3*kcQ&[7o[lM| I%Iz;[^M>4;*9tZhҮ!ݜ2АFgcw?:0iVnf $&u/se Pʚz E=:L~!?>2yb#!aY9!xzJh&~ֶShʷUÇhgr# pZj[Mt.9fxlEEJ-jJEQEGqq"J^I$8UP2I=%<]V!GźMog<20저 ݂2_մ_i~+^j#|:G$(dYYXgeovvcYMZNKV};Equz~7Z#4uoj}J^:g{7uh=L0{b=W4j~=xönu@7J.WCN5Uo &k;~Ws(>1M|)q) yr%8Anݶr' 267gd^8#9Aѻ;'ٻZ3~!j^ Ѽ_M5hi.ȷaш;q'i7xm4FK,ŴwpB*6W^]pE%:oI-9N1TUJRKGxD~^6Nt弬Ԑ VXv |)Am v˨DF Ks}X]qkΤeJg帚c:)?>5|?"j μo#~oHbg؅* gU_i3hn.f6+¿A,ʟKq_p4~e1(TU$ӛsReinf+0u#&}=eEmV5K(n59 ]kV?M|'`OWؘWco;(QEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z(((cvT}{?g㏅ggncwg"`=q܁@֋o:=ZU9Cmbz{>K=J{ j psq2SG\os[6pCq(Bv<_"*i{ ڣj($?:cHqO9C_Fh?ӼC/GHGogW7 ]W_O,KxnNdoMkIam!=G;~]=B״]*KkeV1$aX mː7`+? ?eZn<5{t}MG.n-+/?\u4ؑ;E>10YQu*\_[k8wf\ 8KO٧GuDQ,ʍLQø,D\jԛѨʬy[]/mRZKm?#$/,) =u^l|L0Qsֿe;Fxt}RB>e.K} xJ_uRu74 1^Gr4JJ8|t;k\ԠyltVw`X!8f c{xc/#S_Ōgofw}vq>o/W8׮cW/j`e(5%{ɥk-h ~ڢR~v|!o_)&xg]`h!-#Z6˃$qזV~^4KY`C\Rݴ_AW2+#(EE˚N*.Nɧgk5}5:pQjW (=:ϖ?g>2?K!gïٿA? t=oZUi!Y$y+㡯??g>2?K!~2>?M_eyVmrw\kv<e+{=O| Y5Sxwރw8oX,VIj嶩}Y\E3񵷆͵tlB-)됏kO7N_ƚ-'rٖ%DG(̀_s|vtg?h7.#pbʉm7M95X)RY[gN1QgmwoIr_3?&OEcyZWFCcH-X˲2)2u_>®֫m'EĐ(ݰ3H*HR_%goe{ɧnVÞ߲7[YK-rv--|}U|d+-֐[3 m=ܛzϣ0_r n~~4=M)KA{;a??_ڣt%M'?'eW%|G+|Nu;8۬]Y==c}:~h~~'KeMT2Xi"#~__տf-BwfKլ6 ?rkm//gƞ"o5oLLlmnYyRN\2|;tɵWbDqpgt)6'ITDQ||olږ%rZ Ÿ_c^i/~&^L9Ou F5=iֺƟua{wVWQ4*$VR; ~jx'\࢞5 '8Y,nʒI|=O[)Ҧ9&|ecTŎG98/``itQr֑*J[eJOTόc7Ɵ,.csxa˳? S`I|sǠ↷n^vEԯ4$A Neϊ4`#AB&)*{BIԢPRi* .LO3 }Y_ 5~:??fkk0tMgKE^S"nRW׾ ࿈ךčCp[ڿQ$! _x\jJKNlE*|H׀k?Dsӊ_ amw@X]KY^:UEhM|#{&|/;V:]^o$w{n`rO Uێ1Ze9~ 3ҩSȩFrQ/5믇#ueۢ٠E:eW*jr㥇Oڃo?:F 2h`̍wca9guK-bnl.ྶn[J!q^a,'d9[r o[B0G'8A_Oo x4+ n&H o~ˌu!N[{/%.o{ ?JdY$5Mu*jԻET5k={I47P{#\+V> MZ99X͹<Fa=yY#YduWFYXdz+K:$ e/MIpBHjXu?ß:QE $VXX meTOJ4Sj4[J*jOTχ N&-ݯ^(@1qr+<m N|Iw=ĭ-ɸ%Bw5\#ԌqSQEW.1z+hu o>">uO+u< .`cJ0#97e|Nf'n=<=py|_U.qV=+GWϟ? ߆˴RZ-["ES1q'_*fXRQFzS\BQkEjZ?) * Cf6󔏻jྭcu/ڛH,.Q7DM,`*'>l躎 G:ƚ^Ek,w@\і\@# c{Ÿ5O>]x.6q4 "Y`˰g &|/*PqjV\*E$SiCV<<2e>Gk/۠(op|Uq0xZwG߳W>VF?_O)>ywsm1_=FhMwO5=U4FqRW{IFKc"/>%Vt,:I"{3?eOIRμ`aȣFt%zF)\(p7`Sǿ_ \_ZyIɈKxTmA#~W?7Y|SόдKp7׌#bx cwM W:Vsë֕[{|s鷵ϼh Yx/%C 8Y&x{Q_+ ?y?ڽ|/~%tjV_,&}'OYgt1c9 @o%upت h U}6ѵ岿)EnoګoWǚ!DHҡ3j n7uEP屼88uPwu;[ONZK 1nI;Q0}kKDLbm-nlP[>[6@=Fk |wxwV?Nм?\R*5's3`aH5ViajbU r5)kav["̢ܹڟ9$o .LIB꽃4_ʺ*';gᮅK'v~Z=Lrz!>?K/ D՛R,RWRU''\t$z /l<]SCmLԭdIQ|-HR}AZn?hmj;]ɧh0ϗ@ XQ_9_C!OC6\5 $\ &Q+ܦ[<-\,SR*|pWkKix+KsR>B7+/–%7pe8;X$gXKp@$b9qI?~&a=Ӱz|3y)W{KQE~\v?OOŃg?S[Gw#b;ɈS[t>vAmʠ?!_M9_5v:Lѫk :Fl8n#Y8 ~-0_-o<-=څ,SR |;e/)foY$q楜Aꥃu| )*wz?AFfO,*R§?#3YCxgWe)#aA |ǝ,LiD꽁1O:?*Z=pA5DoFia䇋=u`q/>_W=g?g߈[pd׊?|u?iZNyڅv.Ẏ389;{&O8t* ۿ  |F.m;-3^!m\۸ gk~Fi~>b%8.(ԍ$x0_jWN߈>_Z56h[0*8RG#?Z;Ckk+ѵ}POy.2#ּ\>Nܧ=jQ[FK[vMuGJ+ƞ Ѿ!xf Bűa(<7P:jͿU[8EzͰo?k)-|^x[LHYP|=+jJ E_N՝5FS6]mt)oCHfk 6YUKfFcQF3+"> ׽O3*P+̼p+MsEo(o|Q+oF|·۲$pkѿcx5ٷIy4B|g0u;k,5jYxz֓2٘2X\Cڍf>ug- 5oaYΚnoWP"=GH {(u/'eKDab`E|gR#.}|A`Ֆ[+yF9DWo9-3gvExKkʽ6 ;e)Wuֵ[>Ԧӵo^K)"OzE'O>#fСe#" (m't_ @5 ZYjM,V$x箹1kS̵>,H-5X[è\[(g$eI$FOz$J4TOxQF zqhph70wf9V&E@v⾙ko4IwO+*ewW-8XUTium:1 LcYANZm&[׍G,~9V>"KΞb#rFG2Vgk^(2mfY-wgq:"d )g#W2hORO9nZſ_uGLrD'_zW[K iMSIHmvh U#BpN7_:X\Go%ܐ-8)OAޣ8K6'r2ڔcgOoswOx߰|Wa.^.6 ,ěJs :υk/_#5R*4z_P򏻆;NXtj|fP[;b8dÀHg ψ:(Od?b1<Տ&sP8<aRW|_{uu:*KT>ҳOE(a@(ª ?`>X| sEo7^Dj:]耾3ˍngn3־55eka UZ46ji/I'~ˍfq{w{M 4ZNd4tj.{~]B!o?E }_|a}qe}Y^۹k{Z9#ppUA' CeRT-%x9jnxkIiR=||)b%1Tp~Pp=#`P?3,Yd6~ %zѩmJS V5Y*0w[Yԣ,=:\/}_ x5'״}0y:sNkvE}x'ƾ-ѿ~o a6>1lo߶,Z*oO! b[xY푞a8ԩ7ys[Na!I\;?mUiv~ fV<@sܖ1#+ݿkG_3c ˏD\vo R]CRi?&G'ʤw1_u_ |knOӤ~o_D{q1q0wMP_JW_s~~ khSg=Ԋ'`C6O5Ә&uRWo]/?o?k|p|:/Gu_^C^iV eykuwRBeb ̿ ;9Ax{Lԭ"# *dpNq^>67JZ_JYU(Iog_owc ]/kSUI6>chKMSWO/&idV`3+}:9+L9;{޷;/(փm|$M֝@IWF\߳>7W,dE,%Rܑƾn|U5j:SKkc E [np^i>RO3fK%*r `j5<ƬO %S6:z|q|*z]/~.|閗IfU';]⾫Xzڴ#_9K RTN :xZ;hNgivsK=-%*{5ME/|1Wp kٕHE&W>Ui')%3_OO[ou?kft?Iүd6WGcl#}Ὲ>h%]GpȹX# 55!\n/슬>̯/͟"~zlr٨2svau9KxY`կ;J_ tO/{L8_" K)chLRwA0+;_W$еm@,suCb[i+M^_lh xv-v3iOn$0!PGz~#_BIO09$0%OJSu*RQZc׫FUؤUݽ|+7#@"B?Q_26~ >:\% iNqs~= bW9&kZeImS8䶌}I_.ECsϱ["jŽN7FY}BxWN24hia@r#;1ofzg<hߕO %k6ou&эFYھxhP!vzY|>׌ׯ #'ֽ/C|>egQv73rb%nVESqGjsa^^Ԛu%bB\L|yXʴjej0wKM0BLM̢ykxyYxZ[бM|ͬYۭTXG(A=+_P?E"6l?A_!:~-u kl"IWl#9!J1h?(02=-٧]5iKUt+Vۆ/|٬tYȷ2"0+oZ Znm vr1$I]@?H#%}Ogԓ=k>1?E𦟵N 7$'y?1jاEwKW/[W~Ь߳'@quW7/wcjG &y὆v?IϭkʟjxĐ=tlr#ZOKgwF:J+4OEE}m]ɼ뻟Ii/mYY.Ҍ3p=kc_+>Dk Zaំ:MtM/QEkQ\nF3\5+N28C-lmJ*҄O+&_ßx sRڄRR#n"e p_$<=]ZtmX;魨b"e-'gJxaIaeUсR=Ay)BERz׺ZR}w^Mk_oW.& D5G76Ѫܝ(}u{f{-bݝ(I<`W^# );hsV%)%< $7_o& 7Ew"iJJ ~5(tK5K}GPFConv}+Zn4mV\ٚOI݁ !#8#=ly9%H<#%{6 O?\WWB/0, tW֟7k~-cY`Y*XW/?fx[numt{Y% +SĞ01+/J\UǙKs+FTY̤&q_vx],!*=+^&O]էnn7ȣ'=H?E[^kR 2R,pdzmj_|k>7w:Ȇ1";*3ELupiK޵ (9%ݿ]c 'x㿉!gCND(eD@޾ɬO?M'ÚD>Nۥ+܀9fbr$ۯO'}2/(IOY>{'6 (׏Iee4>##ƍgKiFHՂ 맸SS wR%;;Jv)2J_S#aO ʃkcnGk =^vQs_g׵.#>,>+j>J>#_߅b狮%D% }#`z_ |){WNm,$>tf^1!|ܵ׭}W6F]Ӊ~HGy!//qO- Ӕ~F#NFݻ#nݫ_ h?x23I_J?slU psR jz'TKmR^$`lB=~9x/Ý ]ӭ";>kkYdd$#\F=ӫ.^XYٻ]Z/3tIÒ+ϕ뽗cyi:ՕֳT5.vl]O( լmGx /w|7PxZa,.%'ƪ#|}g@|7/VVaKo&Y#蠟sXQ,VKgնMk9pܨpT4Vϫn:jx؟`5yv~gR21~~1,>`o,NmǶ+_$|9o~(խ=OK5YE3#0| YQs\{MmާG-dDA un8?(f<]۹IxVܩr_Nm}%>p{cz?Ke '鶲]îRsU~N/,Z-O^  t氅I0X6Ӄ7N๥cgT[?_qo'xƿIWOeBMħ\WuOO_iqp1-ftC솥ٙ!qdNHEE=d~m,ü6zɫ6g.<#a+©}XMRdUU<; Ek {x x|AmqFUZ܀;vM>m+VXϵx}2™gkk%hɪK% ϼ ƾP֕jZw̾I. ŌJzkYs-Del/D%|DiOi|-ũ,! *OٿeO?+WkZ=}MnUTjk4?Í ܤ7°89,G-L$%]6ϧ1J54~IŧFa_~ߟ6ω|Gt6Zhv1z۸^-~_[M^I$g*/yq_Lσ5 h`͹l|>NN>cH/| k> uIlJy$.z\ZE&VI[whT(&WvH3Q|H>hVSu*"0ȫ$=ٕmω~1zHя;x-#(C3iv~VzĝH^'|/?4-*oiko술 2OrI?n~:|Ƿڗ9P1_oɿPZ>>1yo<+vK.Y f1c> 6RP[Y5:_5M|6vM?ȃ¹ |1eF??͓9ݟ+Kه>.1}5?s<e:M@{c{ɏY]pufxpO>| rKGGdc)a5cNts:6Wo3#J)*5yyB]s?M?פ?k`!.Rs2}+j^׾O¯K?5;_4vyuZ<~KꝽo[W /?jzRF.,uxjS[\ƾ2fYxH>[bW}Ly۶}㷯^:ֹZoإ%H7+RWJKJ}_~ӞHfOa5fe>)}ω:4=rc2m7R@[j18}|?\xjx+ o-iv6Wv&9)fhԥ,$$ _ ~pn_'MźpLCc_[Ex_4nt_+7lMqw_ ;w4=V\e]ݖ(GmUce2\V4}?m Qd6 H@kXXQ"(Uz ~.=ݮq  + r<7a#>HČ$V`QpqO (#QMp`gXTjI}e~#;QsyD9NA^M~]JKI|3o"vd E_9^Sվ.~cxOB:; +G ?P\c5MƊتUB)ѽ#I&轢&w/ixzJ}ZփF1 isּύn3[$,:>֯oo~; 5Fk٘]䑘p@(~m,}c 2,r|W#h޿7DЮu;=sCGc,;PeJ"'%{OSה OO Uywֿe&ﹲ@>g|As?,,ݣЮ&E8) p cJxEz4Pa% U_yx㏆LJ]KiRy g?aź/u9UAπcKZ^OZ_#3qg;1f/Ưׅb?" %Մ{!2"BGw/S⶝|)^׬9']BAJIcP0q_@f k{u:eX4}>\ @`rk ,,5ʴpTafqZw[x$.LxJę!U½Mxm`FYpǀk/~&zN4%u u[=AgXd H8~px6|i a/ᮛ+KU_]qN@}#S]/^g,҅Ҍzsi.kILR uȬȁ{G>p~6ҾI𮌭;\ HN瑽ى>WƟ^񷃴>\/+$mf8`0>|mo<~$iwܬlF@bpqҊVjU%d//x1UzK.]=ώj+w ¿4`Rz-cUNH*WpPI;j_jmSz4-ZN"Z\G5ɸnsxx|m*v>#QԮXUg'aLd 9>WBXԼUq$=ѣKVM'k%߿<\= 8UQ\4*Ih_ؓt_xvH SM͟q߻aڸٷhW|XUwu0't1ۿ(J@|-}@?t|EB;p I;LTv%?)VxDnHS VRU25&_K.T{}3*VEq*nrמxg<TΓ=5#)Kv?{ry otT g[ Fs3^I<|X>薃ֶJJwN[Bpkj9ӌ)7zU[u)BvzO)w8澘G|3E-'@V#R+o7n7mv7.qp_#5aHi z?R*)!YWG*TAW/u|5p=֡]G  #6;Xp'wX{|h;^yS kVqM6(^K{K&d7Yy/[M}g¾&- vqy{dʺQ鹽k/W𯏾~}j_lb1(A*#rPH*kxo$4I@9Ā`IPq^ll$cٮ4_L5}'Ku|+mwA#z`cEY\hE[5w6z%P|&|[b⟇wtskv ]e#%FvZ,Ib5.9ªIۇxVBVvs-Q.n,gQ"?x~]&et, wS6_SԹ}ɕT[5>w뢽\Euߌ_thWkύ^Od6}K+4ir*[q:+5p2Nj}vgKK:IM'hۓo՞žýX~R@B)Bp8㌊k_:?gm5XPmB(%dF8(˿n}{k]ex`_  aԫh8\G6Z֋^]>Ix3G@UU%!,Aƾ [oxEn!O2HtBE7H dםT-Uuw9VKV-h+|]7Lj,|3`-㵏SYۧc;A>r_i?+i6zO.cilᑰ8#=zdž5hfz{y89Pk(ӪV~[}UZSz>k㧋5xw 4W6dHJ7fR93]MwVѡ>x^,[`b>{v|s+B|ElЮŽ1&zݎc;Gzރf=;jTcn;r}g**Wmϖag(ѼIg}E>i?~j^n%+hڼ_ $o'߰_[Z.I?P*+4Mz&ͲmזKyݝڲrOB*-Is-N<~ $~_NAskhh춗חWRB׵o?-?GӾ-l!Q*E_nM6wO-F2o*cH=]7DCⷁtb=wO|аHb ЊזjQA]^UƲkTܔZN-mvg?>6|NLj4{.dʳ+/f)b}=ksv SBBoxkykO j4ŗwMΒڷ9TfRqӓW<uOđXi-IcQV'O2[ :WKPcgJikC|omƳTr7XS|0:ír8on͜cH'~I?WQ/úd͕[}uEX A*So8GjF4ܦ $s6}]JPJ*8'qh)Z3:%ET-]fO͒ mEH}ǰۜJ/?Gow\" w1r0}нZ?=FOٿǫ ~[S7϶k`xEUj;Ֆ8e--qӂ:UY\(AV_c+NXxjmAs4W╿.~3\nf#;P*Pl4^@5}|Xu3Kº Ķpoq{*n#p?Z4ip_WF$R9>[.l^#u3(6?ydNꚕ/<7DT1_~ȶ?9x^5FND$0=ㄢX\]/fyc1ǘ?A֏m(!8:@_[Jf.1u'EthӢ.g;1Y,;iw~je_??`\ivfNL_! 1k J;-YԥBiDUp9ƟE9\dnM|/El |W54,#aHE8k_\CϵhE>s\ן4b#Q\<(BJ\+?C?1д׵o7S-Ԧ78v (<1` 4 jm-`EwI %R 8'8Ο?|D\6uնHLX3mSsWMǯW#F*n(T]t1^^ F*02qnڭ7ߑf]*X'nݮUstۊ-f9|1ΘgG7ו~:.wZ,/זԁs_\xÿO^Hӣ5671>T49bz8k/Œ^8|YxsR֬/&w1:kNT%m<81R1Xծ$˿K~HC)GzuM? koeǖnZGbqTtj_?X̖z_tU q+CFx#oa,l.d/֍\ÂFN7+ @8*okui<l?ԕ x;Y.g1u1)OU)TU)+Y5') ѫEZђݓ[T}X[6WpťM 8ʺ0!H?cߴg>RٮӌэznۏsV4%ek z6~9n7. tȬ7c$yy<$ +̓#z3͓cⵦ E(o5+|-36+<C~W_ gk}.-1}1j\ E.~4#(̓AUeٙ}k0WXX^='ާO_.yJܰ#a_ʾ<+ev,JPrT 9L} /:oKE&M]B #3t 7@F|{CFxkV] Wou}>tt[l6k U%q$q^~*yt~MuO3סK*F\˝5նO=o?pMw?.ʗ=E\r9~GgVHYU)5:tv=F|0jy׷ڄ) b,k>/Mp# + ak~Ms\SօlCF|SIn+g5-?JWM\&EJ?3; +(((((((+=p*((džͫz|3m[QEVN|5}5Q@Q@Q@Q@Ng>"{(Es!m#E3Hӣy\f$ۥo@S7fAZT V)ZsxZxD`UeRrë mo=dOu[ >Gմ#!9Lb$$q/9A}{_{'Zl.vOcOp y)W>"6?׭-mt HyyRH(]'_JaiBu׍HI?uA4qK6+eh[õ,ko?toj]_i62["iJk]TR~a=O?:wxQφ li˭RAgwbFied!ઞ5|I~i<^u=^iSp>wEƌj%eϙ?_ZY]y_|8O_/} w7t1M&z|Wb!rֵ}Sљxo%4޾е')StXz}G 9cstFT c1M&oxO<Mxg> Zd RHm UpTNzԟx ?7^^5+c1YxP7(\#N7%9mt\w%+' S9|`<$6:}( ::FH8'kf?Iݟo7gɣ^kQWjM>QjK?2,>'~67~{|'tn\\d}s_F_ #~-4t>dQQo7gc;DMW9qqURJ^.+~mj??a[P5neir Ė8I=*-G?2_Yo3$n w7u.<⬞6/#? |?d߀:?~8Яo2n7p\M8Zoكo^;ԵFWY5Ȑl} {=o7gc;DM/T&oaJj3~͟,[{k;]vbMu-x,.c;DM?&?vnjJ|yJZݿVex)/w%z;B׎?of?Iݟo7g 51?ξRo<+xW/6ȷyGW5˵{hO__{o9<5_\^d<ޫ䌩"9~Ͽ !c x;Ǻ~c[Z7>Pf,@yop31_]1M&x ?7Uo Irowk{i{\="?嫶⯅2ZpV6Ɂ. ~Y(Wsőd"33$n w7u;__Jw5j(ª@;co7gc;DM0~ec;sW淥&k_#OQOٟf?x1xƟhBǫG" #=<=c /̾a)bf5_r)aMN-1X[> ivVv~񝥥k6iIh td6GǍa"=]}1 w7t1M&xo2v_Wb}柈0~%֦IfrC$FP{ ڽC-| gmInٹbq?&?vnf?Iݟ{<=\Ui|kgt޾е[o7gc;DM?x+F_qO= ^8 ?K?_n_ xJ:eH]_x ?7G3$nг.Zo91?ξK4|=ƅgL1̐.s5`@B|kgu3$n w7uӉθ;VXN9yJoV(EYI%|Y>]ޛ?WuMŭΛe$r H G8uè©gؼ>s8q_x ?7G3$n~c*R&ok*8OۇP'>![ɴ #Aֶ6cRdq[ ࣟxZN8h->cs?&?vnf?IݟgĜ)W :lK~nW^mjtW>5~7xph^7wMWcImQ|ctr%t8*FGW/kKYo^;. /#5c;DM?&?vn|_ùuS+DZnqowF|ci񭞝cvY$P/P_<\|`ni> xᤑ}QNI~1M&x ?7X`2NX*N-w۽}B'?4l?Eqν(׀~xAR"T$ _t1M&x ?7]X31eC8Kx&]Svz8zw*~߳/~,ͼCw67$nR 'IZªx-ܩ$ ۾aĊ7c;DM?&?vnqwe ,U8=k֛_sG ki^ 񆛦F"b$U[޾е[o7gc;DM%D&'|z;B׎?|kgu3$n w7tx+Aɉu O*_Ÿ^8C\mi.$iV4.V䐠g^O/t/H<7k]h¤pœwʥt4NZj:wjs%ŵݮiʌcYHr~-%>]t v cu=AX>!Ȳ<qՄ֌ug].VpZ3Q-֫(?9'8h: ʧ;#=R] M'Yd1i[\*;28;o7gc;DMq>4qJ{wm{ >|tQsc~P{]MǨy[WPw2sPd R=Lj|-Sjq\keh<ѹB %N  co ||C*,I!dؖw83pSvSWzqswuZI,һwwhfbI$IWdY5,~iƝ(()=mBcF#b-*L<GN,dT#YZuω=,m yS|Beӏf?Iݟo7g2B&[ng*|n/|?w~[Ξck=حs4s=/Qφ~'h=_U󼉵+Kd|$2\;6 y#Zf?Iݟ? kjX z"M-rm"\2A#xٮu¹+UyWv{['m;S^\އD?GeL[ž0GҴxaay@c.:~j^m>֙]jZãGy+kj߈^`;G<5K Gm%x+/TS*j_Mo[kk+n[,.ʼuc̺ί>M]uKuJf]ۆps^3ߊ|?ޡk_A+>–B76qڽ?ψtff6r܇#lx/v>4t.- 3g؃qdzW~*"R׽ `=:uEJ)Yw>ο M5υtO.Ky+Np2f&+ҧNN)/#ץFRmZۿMj? wRդO<*)bM|u,j:Rw)962'y5]xa:g&Ѯ4ˇ2MraF=OAU W.Z.KNQRP8Fq[_vv.4/0:Yp5Zd)WbBt漿/]xgER'ܭ=SC7 pgz,)TVkEIY"r%Z3^5$|DkῊ:M(ʳ>X~uӺ6V'K x{6ٚ=;mI.Yy5Q]ӕsm~=OcO{^Uk^۵ywٗ@>$3ki^fѰ߁͞+hR:מFxU O:WXj10heHl5P@ ;RSJ* ԢE52p/_x{&?F?h3yw-裥v7PV7)[FH#r GOE\i i T馡Ese_t7OEh/>6ݙ]G|q(|+:Cqsu*J0:WYFPTY[2:jl[ 3C_?Ὴ,|G gk6Eͽܻ7##|+)ʳA^Eg-J4F1ph5E]KLִ B+1mq9UA5:%gRw6P"?E(*׷W6ԭ&rW^g4;]шi KGBijg/~ .x<3fNϖsqyESJPN+vǃ '*~a$Z׼Q\QϘ+Ob‘±ڮЧ1W?Mj]I;-y '(\ +zzUUbn诅IV])?eDžt Jm.W +#@*zUB:mE+])ХEN ^+mo߉ڴڮUKyc4#wgY'ޫ=OVT|/ΣQK-FTv(<#ֽxg?i7{#GS(wU-kGj -n!W|nYrH +ՙj G?CtO/+sy{v<瞂(8R5d-NbN*)tJ~|] G[ռ#OPngҼO2G$mY+;g ?VW+dG_qK.IEG9~&<7-o\ $8xG[#]mm2vkutoCЃ#yEo 4ǒIvKC(:t_D_q0o3qvi\y_O~5Gtm'L0=NRzy'kQQK Bn[gG÷*4[<oRf[\jZ#kÒю$.s(J(cNU4Ӕ?Po,+9.thd# 2 A w<3wmkp+g_:x].|1ne1-[1urvE'vrssWpxhFuGpH]FUzg~_ow} 7쿦YxCUH5;Ś9%vH0d^ׄjFQꖲZNa`ԩppp}+/}࿃ׇpo%IO 8zWW'V{.:5{;½r=gCZ#ng@䪟ϽzWu*4ǖR^GF,-wU*A5WX>JݴC%$s2E$"VNMQL= MRzv6>vek˳{;3($a$b'?uMVҮ\.TG*AAy~k#m}y4Fl0l+ j5R pzSMI&y+xz;(.!KwX󝙍* 882kdž{N{oiz| om}~ZVN3u#v4)Bn`ڿRo[0S[]+3 "sH+ÿ? {oO]BPA_iWYO ?i:iF508Z)E˻J_<3ú[}K!k{1̍ܤ0 x0}(YެLL>!V5' 3C_߆ |1h?t.DfFURۤfngWWE*xZeNO$M,R_twc?~TYyۜgq>>7TQ]D:̗(l?=+h,..B R(wi\N "^9ڰqqywpҐ0@xQ+(Ni^yN꼘QE4#ZFbYrZtQ'2/-g䦣O,Ǐ/IwҊҵVۯ_3mnE[Co*MSHWtX쯾2yJp˱Ҋ*ŷkipn1I_ccƚ>OjUTyIG.Y1 +!Nՠ’8#X''U)$R(eu#x >!~xP{t&2} G+ިWV/Us*Zx)[ g|y&-c=^̐}ڽ*Ӆ(I/#Jtя%(Xo_/:/{y$}> h|.~||-l]}3=@w$=4VK AT  S?{+\oǥi0&D1}h6ɴOʊpH]>EJp 4=Q_OJcmXb$E(֬QE^ %)  _ %)?Jh#R.3WLӅHM]>bZUceg [#E I8rNk  |U?|W6! mnGR;QDGJ밥NN= ~ß[kfWAv 1Pơ8*%,=* PQec*Zd(߲W jm2V!eTy30G`k8JJRWko/CYS))B2F؋Ow~4[0szWqE Ɯ#'8&}]>%Gz;xdr͵f 2O@a$Z׼Q\,&ۡWcjok~N$ jlX$e3kk|v94Qu6s00]pcw8\<`ƚQNۿ?sĚ$>!X+aGWG' me[GmlQ$c{٢xj4dN 7 BNt$gi7c1$r)ꬤ`c^~u-Asnh- #({{X)[p{jjV98i^mt[h摿r}ؓVaCiW@ m*pr#  ƶ=yVRW.ֶq;sj1Y$§ٲ+:>qcqG}ue3Ins1A'8MzMpxxSV},X0Q{+3/>|?Cɥ-FnbI$׌CrmVoaq3%N]SWQWSFTjA4Ҷ^*i%iiyERe'V7xngL"8wbe=z01"QpW 4liN*.$<]xÐ^ߢ[]:A`;?s:Z6<"6Gbvz׵QYK .W1 :T^7=Ni%[1ս$jZ*ХZ V4O<g ?V ~ ?݅헃kDӧf{s+zWkEE<.II#:X-sҥ)?>#|#ŭ>;/QgyAIb])8#8+`߃67p r!g1A~tQS .z~i\Ҍv(hz&K,-:vCkk8(St(~ WQUWF\Z{x)[LI#^,%u ٷ=8Ό0osNsW~%͢KNm3O卮$UKeؑ8ֻ *Jj,=UP\ZWk]/dkkPmC~}M k#nho㏛5ؿ( _ ,7Ԯ$U#ٶS^Ee,Sdc,U=E˽`Wj߱osUԯLzv,`I<+Z)VIUV$AJ??Iʵw?pi>q>%@z50xjrR8$cO%:tbꢓ[ |TWL^kZ!-ԣ ?or|7qrw'gh IS BSM:,."\iFOI4=MΓmfl!Gkp*WJI+#%e:ŝyRHܬ##\?^;]i~,nL}iI.G R%6]Ht)+lFFȪ+ PExWb'ԤH۝t۩m'5mP+Х]ZTU̫bRUn >=m$|.ǢxLnVK$Ptl75ip}Mӭs7jsNI=hQZ{8)9S^xW1ᗅ)K^kY܋p1He8=AQZp9VTrki)o?r cNuwA.s%!A jF|V!׼K᥼ՙU%h ʣ F j+è{?f{YT]ek[[goȢ@ WC3]X\xBؚ;ve,1:tR)|[4}5ϝu9!{I➚oP|+yJ&[q a¾E6w`s3RM$0o E,QFQaT+ G÷Z~MĚ|)31Sà ޽:4B4*a}S 0[gV?lI|UG;ŏRmJ-J]uUK2G8|)Q߃>Þk{y&m#uwl `]eżWPI Ѥȥ92=Aʶ/E9$*&E0};>,M3\+dڒ$sD" @`2#95GO╇??}Qso>֭|7c,謖 2G UJtO U 22b265O:]}އExթN)k|@50Olu[>28xbQ+4$69z{Qko~"h{5#P,rƲ(p a3v~#x{M6B[ƒmH~c]:}6VV,[[#(TE*pWVïcNJ<ގ/Itk$z( (((((((_z(( _6oPEPX~";ַ+_QEQEQEQEQEO jS7fAZ訢(cƲ_Fjī'z՘IY#et`YNAºQT>{C,ʯ&N'''*At (Š((((((((*zΟ& }l2֫2Gs~t[(c *Ƴ_Eg=7`o$ʲ>NAW)] QE1Q@Q@Q@RPTtsN|BLmqUziꄚj(c ( ( ( ( ( *+l{V =I=):nw0 ,N+رESQEQEQEQEQEQEQEQEQEQEQEQHK1 dU=7Z__LmLtubU95>A,/emesT]-.QEQEQEQEQEQEQEQEQEQEQEQTu>k[{kr%)<GwkwOmkVWvG5aO\T* : l>k[jy95h{#("7KK~yNӍ}xH-GUNQ.2@f/5M?]sP[r\ 4ɮ_-n _aFʕ95R8Y}Ok 3 Cr;5{~~?5o>*ί F,Z4MQyV`nP 'm7L@l~Uk Z[K녑v 0rpexUj0]w-3&cqzrsko4d4Y~5~tm[qnqYJ_? t ޘSi I>IE ~<{4  -ZYƻiWSF4cLZ(GG%wgnu+Kq]C#O᚝cFw`%^/*ФT,B^?6 {}C|  sQi+҅JV)5}dzWTeRZߧ{#mBm^-i>$u33T|Koi8ϯߴ4jWA#I/o$ Ұ6`rst_ I쯒ݮU]p[F$6%fUXK뮾vVs|L~~m+lUϿ,m{㷅9i%p>G|KVDl /I|Yv_Kyˉs䬋`=poKpCJkzwT(JulLoԭ/}βm&`KSS{yȒZ\I7l3H+`x[0k־!<^!>Luʩ fVZT6Jn"+Z;'NOb!)6?*Z}64\*@>7+=ϊQ{ tk(a!$b7b8zS6{߇QWեFܣ+]#nuGQEv_!sxQGc 1A?,q2{W~? 5ҵ>)',RH0j_q`; dRk)W}+&(RK_osΊyF_*\W/C`He# XhV_D%|L|\WN#)F-^;![+>ݖd2:Ƌ՘Ơ,{!Qq$qZ%C~;}b?:QHυtWEgh"4HG,Ť(0FuleJx ] 1JxON<{kNдfk§ %*JWYf8M~z O_O Bq{{k\k:rHzr ~%Jyȶ>8.m7X8cxlTJtFӏӾ3L6uRXrԅOfV#Z& WcA4ncR LyoH?7=UլY$*ٟ#^ y.Z[i25_OOaM9㹋̽B /Ey\F6Jv-Z->}#*V+|{h^ϦR|e' [;]S:̺z-n#ʢ(qŽVXbݿF}&"uAI~4ͺ'#:?g׿TW=}++&z~n-TěN_rY8TBTʵ?'NHoyJsrM}m _.$V48GNinp-g|{vqz~ x^{ǧLa^NG_- zH6f"/g=FK(f1A6<{<ҭUNJZ]c̣WJ4tu{h}6?DtNW[ /mE=85sytx$)v+x"D7;?ZI.<efBzbWfnos#t0k>Wy|9iMF@~HC,8Xt־}{[{̧,$)I[_[;K{|i,#Otյr7xRMkWϿ b_" P_Qӄ"H_̉;H֧}OIe]nN7.]r8*//g}?bQN6*<5zM#Cd]KT\$E]'9q6 =Ak_};Mv}*D!sK~9^ڵ|H]闒T ʳ{@7Fs,}zPjԭnj6|* ĒNAη-i<&~%(Լ5hr6ݼnr*W9s^T&O޷{[ijLDܤEhE*Oܬ Ѓ_3i5-|w}7_23 m ?|OGRԴLI.&?q єXQ=B5n}ӯVq4cQ4蚷_&ϸ"yKoNIE B6}WKc%ú]/xռMbxm|+[3n̲.7c<:Ă8EI'~i|#!oڟǟuԆAu%Cp>csm #v߅߱^7V&ڥbwjmgc޼̿\^m+tx^+YI ǞW|kVt|yw4r0l}qRGu/x_oݬ?k2YE|i0瓏mzou&ם߱cJpSmiKއ46]zu5i'NkUdEt`!_$MNQxĚt JzCg՘a߇"O7쨁A8gp1oG qu5ҿߠZk+aBّC.#>_~϶z>>2aiO~ß>$xU6.78DvAq^GAE%V_]ԕ7+kdOB1Ro\ײK],!)"OzE'/פ_"z8e_á_!oT6[1^[_(~џ50?>?f=wXG}a$p?@t-?:%"-G!Wz⽵gNo/>˿c11F7weϱ߭LaYiaaT_qW,8|=Com KunB*sz?~ӿgOhު ys<'MxҝHW\5y̡FZxȮ5-o-s30qiDifϋ5hQ@28_}^x! 72\%nwg26kBu%%ݾqibqkrN]NX^s:3_ ֞o4i$_1t9`^ ;~~"_هg|:ŤKWo2ؓdV\d0*v=k/ GL|J`\uͿ]u {׉;7Gğu %( _IXl0D;u*FI2V)ʬݔUMsNYu-BOL.ZjvKo +⿀]? |Gj!u[9 *~6|@Ե+9^'UH;\(x9)!cq<>k~<%qmgז߅϶Y6 +ppecQgouoj0<0|ۖ˔-;>~ğziiP+UpI X׫9ƍ(N_$V6TjCF'wk$}եZv N"S%"In3U,Z_?g?>xrIo-EJ'pl7 YX7ls #>+,MV>LJ':5i_{ (W-Hm]ӲǭknhWz6Śibq*KRM7wn&R<18ًz)k}:g1m!NW<ʼIZ?iͧxQ.14cmpc 4yXE(cxu8(m咽_O>q("n>m曆ӾP[qm4wH7$0ea7s|srC2>8$5Eze˃P d#p'3jo%R#rCn|^[ S'׀{9`0>dzLGZp \4?12?}~ſ7/SX,A^iw4.RHaB |UoViK߅̒#IJƋ/oh~7p< wm>^?CwQi+۪'%{t;>8zdĚx_j>FG?a*omff9=qgyUG?w>4qmeXn爐|3L!*s2O#7ih?|5oV"ݰT;,UM|*Zܥ-4׭>Z&s#)96VNosF[O 0!Θ ueGwS Ė44~9\ x>n*˞<׼E{.!A葢Ud>;x7~ g5yж7Vܝ28m]zz؊p tkSsv[k*:xjT+u jGeݱ?G쳢=7I {]@̑d r9_Y|mᎇkcgyŷyRH5O7߇n >i5%/+v(n#w߆v~Ӣ* L3f d`dQ/e_[Xc8ds_g[[sɨ⹊rDru]z[ Qw5 R?a?Wh?׶QC}$$E#ǭzUkԧZ8+:|MZXTcM26_T}^_Hd}[;n>ɦBN;B;רWɟ~+]wC[e\6s'?F ԩNZ/+~5ӡˇW^W%~?gOjxŌ5 gTBO9;/kEP-o5(҆ᡄ+߆ s};gᅆWW,J0eFӀ;V0|Po uUO޵aɖ`0J${׋ vوR"ڶ eWyâG =w־Nվ^$h7x#F}NIŋRʹ*Dj@UQ0jUq5q.-E+7mݎg[[՛_C/򐯆inkG|H 4H%#fi#uBYIcɨm~'ڭ <9{UgjU֍HIJɴ9#V4i.Ҋ]Qmcmq޾_[(EĪd7#5 JlrNO>1ݟÿW>kᾓ{&$Rܮ0BR6l\n+^#5Kº_%z鳬e!gcS׷tC8IK]ݽ#*XjxZ{ť{xW@'%;0aI/ߌ>~4GLSZa@ ۶:~ Q>mVXl y^؁嫗FTtT~:Ż#y6HtWފ[k+d>b"gS #n5joΦl#n5\joTw^k9WR?xS> eܛ2f8u.~0i?=2}eW7qTM:Ws3o5B=ƭMuɦrgk!~FF K R=i2KzGR?c2Q_&?vi$o=?W~~5no5mG.;/2eN_1m9KeJo6NWڿK-/J og< t-YssBDj2o_ ύ? jnmU)H| Ж' :Qݣ3KB ԼۻRN&^%*GE|w9.4z|c̾yb1 Zg/ c1ڍXX62 ^OM7OHm iHnMYPqb0@W5TJ7:q. 7((4M_-mH&yk5ğκSIo_![(GRWEy|bu7Md25w ͒7g`!UFH?k}?c#'F͘zcRNX8IE]Y~)'Yٮi+ Y!<5:)`$㶝}rSV_QQqOk|Ft9&%ܱgs/V=9_D}i i"#ۥ NNNI=5}G(4hc4۱{kmIWOPj,㬔RwbUVNW^wKXZ5Dž!~c±,Kay<` nUI㒸ҾU7n| {_Cƒo,/'6k U -:C &T/S$(:'kot_ڛ[~vMEmȒWFt9);7^+VJP7%'fz?f.!z{)cyKt .'?}_@t8|M>pI[g|XOZ6Gݶڼ7+Fo:: @!<hXxg<xIEwK#fG ЧRH8&vf|W:|[K+߉>-|)u_? ?[jiE ΅#G^/oh~7p< wm>^ ЩNW{&՛ե;ɫEfwbmc#f A'XۮGHk:c_?M_F'ux/P^A\Q̣uuh8-|;*S_ ҝޛh>M{. \)m $IE'#Gֽger|CgOmD'WwJϰ Yf*P>6_+]LU;G|~'pF,9KIt?AkҼK& <ĭ BŧjtF`ɀ ep:tӞ YoX5RVx5;{ſ6zOh |]%O ՘z{xs㎭h3鱖eRNU=a<3CZg?_]Dִ4Z<|md]Kgbjn _CBN==jc'J#PGJʩ7[˾g&3 [5"]o-:[sOAlMd rTW~_~' &mkMm_ؚIun1<@_FC?ڻc7+ǤxCf,诽Wx+啺e=r;^#,7?}oۿ<^*x?mNzm=x^_Qu ZjW;{ĖXf#xoÝKYk{OV:miU쯤z3!^A):K_ߵvde'Uc_,j[l&O^6aZVqkxM6A 2y{*s*r+SoNcƫˊJX:ԓyt~ڟXRIR2zn`*Z |d񧆯kY} d,%Iҽ]y:/f};S AեMͫh>ί࢖s~HA1͎D3u4^KE$p28!@">!xLcm&ao +a/%CP/ RtrM|_kPKn]"WZ}s?]gVb!Wlgj#'|o ~пм;|GzLYJ1$.I$NPs񶋨Xot/g0y͂Bb0>kͧ1R4o"aZ!F%RJ5mc?j_V|{&$Z34j  yc$-g.u4K.]:[xHMە evǦ8=iiv=6/qpţx.HLgG W+qu1SG]n=ѼeN $A@y+~Yg_7C֥E?&_ƹxau.xn.nia@ırrr@_Lao7Nٗ wNyw cL3Ubvx'5H xv2haV3AXJ=4[8oJg_ A+l_kӦ)mp,gBG&)y>ơm#2\m>O/-݊"}:LJG5~֍w_,1ݕӣ~~SQMMoK Skm'zqjܖNN}zWL|GaewOXeaşD\/ǽ{MWѣJ#!4֑V 4q7nRT{q?^+x_fz)LgؗlpfPV3:{e>c[J?B+ӫ/ΑZǮg \c/袵+:q=L=7J)/Q[Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Ǵ\t7_/W=@Q@Q@<3m[Ճ/jޠ(EzwnVN|5 ((((*7w? ʧo]QE>}2kF,bq"^D+`J }C ;#N#dn`+ ( ( ( 2iz]]WAoydkwUU$ŠǞ./! |+^)iz.ڼ k،nP@6bA(ViE%c .8Ju`+ ( ( ( ( ( ( (<:Nc>][F!y$"h gVo-\Ӯ4R~ue$uιS*~W\W~}yy?T}yymQEwQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|]|7O>;$4MTӴ똚x6%~1Xx9;jp02vWOw (ࢊ(((((((((((((((((((;Z-ְ֤gcyubx oi9|Z3|M&xt&Hke۳~*~s˱OִWl4kT~.|$qiԨtF:Q]xQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z(((++^*Ҽ'kƭzPZ;Al j\_.o~&뫈]呂"~I8aT VU?&o((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((_z(( _6oPEPX~";ַ+_QEQEQExwL%pj0oTGkF[wK7&y7/F5aoϵHT3ޮÞ}1MxG*E< 7h|ۖ+ e?&oO h((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+=p*((džͫz|3m[QEVN|5}5Q@Q@Q@Q@O?h IONU3F zOqF8֘`ysgݷt*7w? ʧo]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z(((((A3s\~L+@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@]Ǵ\t7_/W=@Q@Q@<3m[Ճ/jޠ(EzwnVN|5 (((x>UDp§Ip8$@hsFo5t|- ġI1M߉!-+Hm{PW,p tj7w? ʧo]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusQEQEc?_սX>_6(+_a>Z(((? ǂonyR{]y/^WmBVIfἵI#'~8xK-4}ѵKh%mC~__Li7^L|G/'+Ѽ+:mog}7m +WRGo~_-:Yq dms@@?&oO h((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+=p*((džͫz|3m[QEVN|5}5Q@Q@Q@rÆ-:f #؃jL[+Ny@>B}8Ӭ0鰰bprrqEO jS7fAZ訢(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((=p*竡i?ʹ((/jެ yVQE/ӿ?krEzwMEPEPEPEPEPT VU?&o((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((_z(( _6oPEPX~";ַ+_QEQEQEO7ķ:' mFo*GS%;G#tzoi7Mo> N("CxJEү3Dܩar C ö]i6zĭqqu dp;Gzƛ:=lgÿx? (Ǚoc@ߑ'¿>#tE|*)e>"xwwx~Tx푆<ˈd @rF _6oPEPX~";ַ+_QEQEQE?u/a_$K\=Az5s?d ZsjbQ$K&ͪN7gq۽yhM=^7:_%H1q^y[6״ U,f^C&!y1K(O{V/xKXn/ bXXA-zW G6GGRhꟁ7w? ʧo]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{KUWCusW6x,?>G>Ӝ|?>=zQEc?_սX>_6(+QYQQQgnome-screenshotC     C    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S(((dSL95'Q[ZMi%#{{ 4j@sK@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@TrHP QYRԖ<חǖc,TJ)NJ މ. i#kmл: kFXt[wA̓._b7Ni6׭cRP?~#SO ۩1X8L-=@~L¤,3wQzG?ÙD$뷓}=[6-3V& !\ٽG~_[_5Z̮Kd2H=}}g9|3S& !NG='t}i#>l/W_6HVq:ٮH_^~F[EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEhKRXVט@}ۋ˅!f?'ҦRQNRvHBU$vIu(ǖWW S_|B{L6>Mo';jܴ6-7/lmѢ?8Oc1?%ղ>-j'uE՜qc4Ȃ!dz`οf:WOjRktȑ7(fw$($sl5 2|w kZ,mb8H= +hAf~VF|M enY[Hۗ[[z>Ǐ7ÿ^\֖אĩ":)~X b0A_\WD7hBYN#M/$kZfm|%$oSNʉ[${ojhپLk:1:8+J80sDXEo\?V|1(y]kE}3> |fNP #wz{}%kpWS<G"pA5m#a'k~#ml>!/_x7,/W_6Hkך"m_^~FI_?KmSxbRR/υ.*I_pYvGqԜ}Wj6>s}{:[YFM4 %~1xP5qmd'63|@Uqs<5P }E{:wh:pav(w?4+jv6ڊrJEtp+/mzxk/G}R.m$ӌV6KH/1\w"t p=eCnW}O<}AOiHZ+ϏP꾀//jړ MU2*3xIMl lehg@;G"wڦiFG~A%c.}B=3@m[/V_o|'w=[xH5u"&6;q9%ӗTeP=+)/kthoﶟ{IT); mz4h:5=QW@7vʭ> G%mA,@ۤ2T8_|}W57'5Vy.lK)nvJծقQү.ksi%@9@BK? V-$IA!sW~Cц yku:5r8yw_|E 39h~"} 0zuMp yg|n[Mtօ@[7aqhJi577&+͕U$% znij{|(1CE}/X:ǎ^j1j"ث@Ԋh~*x>YlQ._&UxC`^x"Nŏׇ5Yjbbt.@m}Ep sxD׼+u+n<ߺDڧx܊qGNP]STt,46EI5αgXjXCZNGZذ}N1푀>?WA-hPEdBorW~ n޿R0hNiivueu цAWxB4Ӭ4!qϙ%G*Ǵ|ͻ}9}hԿi[/WJ<5LXy!{H'Gcr-Lk>W<Fܹ @=>O:}_E.}~8$q#x'.W|R|5xᇋ<3r[%e$  G˫-Alpe Q3~km%>!xGF#-}{Exi-sTԯ-x"ŖVն?PG= ccUx/ xkXO&&fmi8 \:PtU{}.diFK+kUVs>m<%[XC-a?-;!j]Iư6uO|/fͼAj^)!LU 0o}[ }=PZ[F^x}2+#~ WtRLna=0 qH\W‹? | [nI#VXip^tWlS+/!K" - HSGPWEg |1[1qs DRN$ŏxYmNM>FB8,ʸ'izPYEbxxw|kz&3zuG¿|%k-t/XWQ23hBHPSEEuu Goj]啂I<\L?|,IOh,jцU+'ŏF%ln[82/FHh3- Vqjz(pi2ɰ9S(((()-%d]\iiXY:$==k|52Z UqW7 {\\xE.^OGnϱ^8϶5]fG[v,K18خCˏ_=ժ4La'[ߡh; 5a` , <&5Sǫ%y?C30b3\XWk].7߲~cIy޿/,u,8,AuvHCb~-71 x{_xx-JU &S 'dSbO&k/#ddᑖ6ʋ<+7 /DV[|n#'dH۸O L:>i?+Qx|J9䕵kT>>|M!%n_\Z?OFȮrdss4pfbX;uz7-ㅆP/"9n@~ zπw C{d$ 21R{7EgR5wO:0p՗/(M^3qHfYmd_^ieF|qH83hwچko~$Bp۳A펹ٗ5:DȊd͏8{;ת>Лz)5h@軏$+9}Q-߼?/>ե2)uY߁bIK](&uϴn#wtV1FV++J\r> o׷ [k$x;Mt*HאXd%ItSg!u|C?K#·mxʷS젂6ƹ,[w&|Y4B*(0(|&{gI"|7Zf@*Y{{A%!S6|UeRBҼ`]*=2m5!3ʻ m;s{PΏ4Zޝ{ ]IE$_rX zk?dۏKrڹԕVœ/N6ɯ{ڂhSMkŝ`8>̯mt! 'vݍ_@Bw_%8y?v5't|`o'm|E8AV窜U$ѡ/Rdf^yށw5}s_,uⷄm{k*6}՘q#Ս{ŸZoY8ywVɷ=; 7|ՁcN*G\{y/ϟ-}_/R/ڰk}b>Qm#_pޟ?}oqs*M$+)@<|A2R[ m^DxG*HXo퍠ZVo6j lRhzt}hT}O+.RK 6p]V@rq_3HoWW7z~ٟEٿHƠ 7`?_)6> ?*?FOHv_7?0׵ {@z{I{ ?K?5}CQi?_/~_g jj kZT6I`dOӦG_AWw x> dI]%!]GCKvyK\>a<=|a#><35m>S7l\{>x/< u{}.=>]CHwYK q+ψ?{:uu"Y⿇3ۋ$RE:3[vqk;ƃ]]}EPO/.l.,d A@5O;>&>xLsk9~;G{_ƏwuӾߤ_ ~{}0S :.g-&SӮ%9 dPr|]KWd+۝ٯd+Hh_%m<[ɣ:ʣ7c ׮a8]B#_!Vm[T- (?B[5ixQ%b" ÑOJ[ z7_xOwN-Dќ4jC{|WQ,5ءyˈ2^H "1<}kh>Z>{5ޫ5DEw0.?~ Nស]OIuMEb, U[ $9>o~]A:40}8$YppO@wKN$bT'r^ go/^6 cf)mO^!z7w^+[Fոq^p7b*">ѯ7kÿ^MQ̈ `67aێiy ZL}Mj~>Έ6in.2$SOpk<#V;Tq,hN`1?e1@񧆦"jk3) y ^pzW1:gh/-6{'榀:+"UH2<0'W~$ڗ;{P(^<Nv߳> xVX1r(<}8P~Poc6%/1#ß7{vif#wbUs@?~$h|7>I+s4, wvT]7H:~e˻a&گ|~U}x3StiE=h`_@ zi ?o x߅oisڴkx v Ƚ:1^-ou {.<=]/߃^ck5j^j,aRȨTbmM.t˥]4#%t<1 s[?'7WoIyX"eOʸhOڛJg _|kOouY Tdr3Jº gf6?-fQgN1Kk4]⯀mms8Ux?ŞoAt*c8@?#ٱ|>}u/ViiCi78!ݜŞ_w7O.~Ǧ%R… =[f|44%5&FƷ`A,F0h?|`σuZ[-"H 䝹.P\|oŸ{Ú?5 $(8W$p17>kTNy\IînGp>xOJƁwk6yar^6fSفҀ>4|;'?xN+nmY)=r<WKuľ𥣉-QN%!$,}1}]oo i 1D5 `@IEPEPEPYw ,d#Lt(<_ui)# c_R[qǹFIn4O~/: UA/0I-od#!{JzQMtσ|ex΍tַG̱mluAQ5}mq/>{Tita'[ߙooYѮM/tqOq@5|E\u?rpM9kGXh̿<ߎ /DV[Bd7U$m+ω^v_:/G zǃ?j3@خrAOލ8m-+y? q=5hbUL,=;[g\v]*' m'em?}W57.9i[{3YSk۴Mm~Z4=m~\WMq_YJ:PXꮾ&nR}XAG=7|CqI%.#2-^WQ@Q@|?X|^.$.~aΎݓ'⾊>Z{Fkxƚ9&#G[]~o߉:ޏi^ rY\O(`FWzFwazg(`W&XI9ꧺ^c>co6m0$Y }aE|qW㯍xP?7, )6D=QA6g,~wкP<) \לq^EyS-&{K{`FUXJK9 BH&$;{(K7#jýve7 XOz>_𮣩xa3HY-ݖuy*a:׬Q@$x{s=-4fb̶ qw5 _{?\󯅾=KKM)&ychUIdS=;-3~ 5>-E $}ݽz(~z|e)VIg%cfc*0!%H9)/G&"qcѱ DX }+EyWln%m[^1]@I8'q;xN+{-^#Wd k|?wڶoDxLm؍|U؆{Xib䤈}AuPʾ;\s>O8OmxB{$gֺ٧P&xG_^fְ]* ދ;_玴[l羚-I$uk必 VxY5 m"yoW:p`t =KߴD6ϤxJ#]@}2Iplw>gؾyj7vKq>\IBy9 ccSƞ46M,y,DPE{G\,IizXD te#}WͶ?τ7UE6Z xN/֧f|WlE:h##yFO􎇢xoGuaP˾.{V|aZmBY'?h}HwHJ2fƟ]3V/ <@CqulT "tPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPxkuǼVR2cܕB>?ÿwefe6+( RqW9_~kϧxsOγcq$~tʅ'.z(8J(o?gO,M nnheD3ݿb=0{>sP񽟋43VqP^y \l w+7_x]_N^H%ϑ< 7̠7h:ՌZ8q A |72:g.}𛫉&Xă*(V4M͓,wa囅7,p.ijJubġEyg_XUAS\yGC}Ҩ ( ( ( ( ( ( ( oth7:.i2੖1ݵ/̄{VCA3YZlfa $|Dƕ fE@9F޷m-b (('VþF-;O>ϟ#yY@tP)㿅o~"DSe0{Rǵs^~x?SPk[|R^L# ĮGc (èX6opsڼd y >I{ OH|?m666+{t=7'\Ťk)XbR|? ̏++Wl,,̾ܒNQEQEQEQEQEQEQE1pCOYZ@(t UC=u'X΃g&"?lߟݷ+&r+:M n_G<>dU\5-~}5]ϟ|Oډ>:4; s܏{ZJG5 uСOMRcq D8sN_՗$SҖ8B(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((i=kZ_t\kZ_t֟?@(֟?GOP*OQi=oUִ ??:€-mi=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t\kZ_t֟?@(֟?GOP*OQi=ri=kZ_t'a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"-a1"e>Vϕ_.~mC|(ڇ#'l/Q[/Kտx7=o??Pz-[ߥ >e>V€CQG j_e+T5{Tgha\20@\j|(ڇ#CQG>ʹb֐3hp9V>e>V€CQG j_e+Gl/P?V~6mC_o~(-[ߥ <F?x7=~R}|e+@\[|(ڇ#CQGOϕ__o~( v?]B`(Ϧ¿< ׻i:j:mbX.G*+KPŸWK(aSI>rҷM}O\j^WMŕ(bTմ]^ ű8g VhD9F5k ˺Lg5/u7tK#Vz:ע|?=7^e w9/},ue4{[LrZ~Ao\hqq,;1 v"i"vu.N $UErM7 )3,;K/aOn8+mY N!KTfx4۩#mV8{_ Asf3ȡTozFX#$;-Gt]̗Z=9yѮWATҡ{wdG 'sR*ny,X?ƫtJT[}Jf1ݟWkԴV'RҗQg_Er&db$b5mnM7i#Gy4W';6i !]}3Sise;ZLny?(kMi=Ǒen9PwUkoƗeFn >e5Z /y,~ʎg; T. L1] p (ab}\U34fG sAs!W3TuЅ,m\ Ul>h?-oG߂!آs5㹯"?hĵeWt(7@c]>kMCl< z䖫4ucH#nA pwd|__ŷ[Mc =OA&)Hln;XFg c_&?U*i'YYHlel3|7q=*cT?fgsxO2N0ѣ1U޹|u }њ>bxiξ[}GGUGEQAAEPW?sЅ^пi\ !W/%B/E om,KU='\mX(ZUw:B[J ~, Lmq,nP'o 4Kõp@b|7Y-8\uJ `84tEѯ-R W$<}yӿLFIHg='I!oUW :Ӷ1q9 zwann#gmClֿADX TV89#~'f2|rUXfЬo%qm%p=8]&/kʌ9t?δ-ϗb}d[B 2)Ċ IA2jɫzȈR]2I7|w*@ZaD](x[@VFЍR䵻kk z.It{6<;g>,70Oi']%R4{MSgbWA)uthAPyk_Xk.$vCzbٔCV/^sW`sޗZzy+ܦDv4:!bU dy,W?Zt+mwSԟKOJ/ 爱 yʴ/ MEiUp3 ֥k([z~"xoOKy [% R\[hk.;wg4(u 7 FNJJ֑5يf6cFS,՚Q*#ZYcn@"\rO_Gcimw@((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+ !/_οD !/_΀>ɣ&;&l+o5m_z:tiltqA{O;U?THuY/4WSYPo!F*zҁ_s'A%ҶlYbvFɷr0ߢ5~7x7g}jV6|yׇܡ<TЀkuY/4[+e(d=FGc@\5WB7o>տ+A0 .G Q&m\NM7u욥Ѕ[TlP2ʼn?bkOU[P!5 <-XkUjV͵z9~#gnu~/>ўÿIҵgU[?Z ͆WT Ǧ )o3sqccYee'#9_ۨ@~m|?>D5kH>;:gudP@ndQ@FfEndQ@Tt߇k"j%P2{&CUk2>s_SdP!Lȣ"̊2(Lȣ"̊2(%VJ\ '-ҫ:Ԫ(( Zի_iw˲G?Ҫx\ώKye;zq޶*ޏe|W~2 EYذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذGŇ_LoG"gFذ_?VK{ʪڙb?"7 ?hm7lfeN6oU">Zu1zSd?Q?د/wE? gPc7xG b\?AΡþ~ЃC( l{}>BVuH@Xd?Q?د/wE? gPo bw1Ic"q`OQ_? gP??AΡȋ[Vf,=*_A=~þ~ЃC(|+:$P?#~}+G;?Y?"?أx__? gP??AΡ߶A=l{}r|+:$QBVuH,~F(d?W;?Y?"wEc1I3G05'ᮩ'<[K}"K/{)\19%;cZWGKJ?$"Mm4{ { XlE b8@0T a@hQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEǯ('> xz}ߌEj;}9 q7«`ڻ¿&0jVK )f Ge =~4hqy%W9cz' {v?ۭȔׯ\)I&\[}DrȔׯ\)I&=z(_%|SGMsozˏ7"Q^9qJ&#>oD}DrȕOMi4ϵG.?|G=z+⟴>h kׯ\zˏ7"W?i4}>_%#>oD~hI.}^9qJ?G.?|_@\[}DrȔׯ\)I&=z(_%|SGMsozˏ7"Q^9qJ&#>oD}DrȕOMi4ϵG.?|G=z+⟴>h kׯ\zˏ7"W?i4}>_%#>oD~hI.}^9qJ?G.?|_@\[}DrȔׯ\)I&=z(_%|SGMsozˏ7"Q^9qJ&#>oD}DrȕOMi4ϵG.?|G=z+⟴>h kׯ\zˏ7"W?i4}?@I[:b}g}_G JKMԭu>++h. pʌ28 " o/2=ǽ~->"j^ o_=^ &8n쇅h(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@V|D|#kC3O >?ڙIE9>ʬNev u_܃rp<ׇ*Pgâض}.ֵjךs%ԛt*d;ԙ.a>K_%sWT+G9sQ+s毈k??|;@=OHsWT+G9sQ+s毈k??|;@=OHsWT+G9sQ+s毈k??|;@=OHsWT+G9sQ+s毈k??|;@=OHsWT+G9sQ+s毈k??|;@=OHsWT+G9sQ+s毈k??|;@=OHsWT+G9sQ+s毈k??|;@=OHsWT+G9sQ+s毈k??|;@=OHsWT+G>8[WޟLE2 E2}(S(LE2}(S(LE2}(S(LE2}(S(LE2}(S(LE2}(sB?뮙k:s 7?뮗h?B ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( >9bWo\G/"^?J¿#(??d ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( %[z)_'_oڽL]",_T~ElQE|Aڿ&tAk~A|}npɋ>m\ ;Mȣ"Gnu7"qzg>3kk@^@o>O>Q5ɔU?cMnھjHuṐ7ح^Qz,oȄ# Y\>沏,{ at6ZNMD߼'^9)u=*EkMF@-Mʰ7V|AX- Rq_.+%cy%*3HNЀIǭ@&7S-崔F@JډGUM6^~VwCҜlެ8nZǺޫoܗ ڡ"q'bT֯Oo/;භyq*SZVM;S_ZUMgs e~FE%ƥuW$0wc&uIy-Ȓ)|岐=(n.gGq FBʅN=pj;ux4˨LO4C98c U3:Ƶk=Ο_Ak[g#?1P@h;u[+J;[Kynd;RP 95. ѵntnnh@wQѦQUFI>VEzXڷIlz|̠PN7Sr+SF=:E}(7u}CM.{+FѸ3^&О4ե ;#s-Ɗ]JF.[ Os7Q o:4q?QLR9UtS]S(ɎƒYJiI(Х>hoki=}nbh}Ti-tkxl}p*Czڮgwwk^\ٌ Ck?"FnEnQ@FnEo?0M/o?/M/4~QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE~%>G^ѵ_$1#NK$EI F++ψ?0S%x9>eI&7pEK)EB)V3OS_K5o jj𶫨i5"?uxc$ nho煴biYdVC^>k.KYBI\2;Yߞ S?/,'Gg8gۯn|rg~%Μ' /Rbt:g(\~?_^m{-kv6whAyPIӽtM45nypi)Y~g=6?JUńzl׍2h.VN 5)EIlNN((((((((((((((((((((((((((((_~뫣x6:eY<g͎zW{zmiPXܠwz2ӼMCydUnYB7Wo ]LȖjsɧO1_3jb.[p~&#YWw, kK_]ϊ/Z-5$ 9V5b@K3(ChMiRzW|\<Uc:*LA-/vխNy0LF:DKb?~kZK/6<{_W_,RX O_c b9]~y_ObhkٵtQExaEPEPEPEPEyi_ xFk ^ZD[IN?:㮯X~jN0jeQ(Ռ~vM0u+]<=5׵OTfQZAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPExi\#\Vr\Xci#E3acs]_FOj zmLV=x:z,q4]ĕ^y^"_ Vr[}1|`~MN/LW0i3*ʻ] :MhSu$^G,X16T_{-=LxŏoBM}>y VyʳEtGx1(U,=%}lcḵPK^u螷v>OoH|=:HaH]~$+4lIVS_mߵvk~5R.dA+c~^r1V"jx[A^-u#\_ėt֎Ur(? +ʾ.~3r:ך(a鱉= B{n`Olכwh*:]魌^IhpzXּZrqEuXnqj8y8g/kh?ŏ ^ΫIoBhYJMcGסa]ђRgZ\=IQ-VkQEQQEQE6Fڌp3S)('Q^C4r-SXaوFݒJu#V l<.!Zpvk( ( ( ( ( ( ( ( ( ( ( ( >9bWo\G/"^?J¿#(??d ( ( ( ( ( ( ( ( ( ( ( ( ? C֙.JeW %P=I;~?+;R׏k|f{}!K/uuK^&#e9]CxwR{ri)dawpAVu}C^i4>I`&S?_x+וoNVCC;˩a%/+Q\'f|gRaӴ8) cr+oi ',%GC/T`>w9V֮޶M/-Hg/%B-X*Cd$ÆSBzݟ,M>4Z mo|yrHܣ`F$.=bT*Bi };QEAQ[^)^;}sNM/`I!|qT]Aw Z(QEQEQEQEQEQEQEQEQEQEQEQEWԿN-M|_R:k/O6eﴽObN(O`(o(7N-c6֟(7N)cVLE74fGW׿L~8k+ ׿L~8k+j[I~Lʯ½W挏~^5G//3c=ܖ֚|6G!Kr ޼ad_O~5Zii֤RS:JYljW<3}߉^'u=Fx\HJ pE}c)<-梦 V;o'DҒA$`n5ac7㯮c(-/cмcF/?W[iڇ Ӣo&* Qג:|ߵ,v.3g\$*8*#ў3W?jC_'ơh떑~UWAqp?E5+bZ[ז*Ә|q~|Qdž{}NRKB $vwv:+4}"ԍYeVayp+_xz^$]JhU?ʾ^ު ^v 8,#±OlSvYMo $==|S}׽wv0ϚwDžx dEc|W|6~ҿu|YrYqR׾4-Z9VWh~Qa´t减ڔu?qJ5Jy=|7u+N=䒰yR꧒J'_'#[ɻwQ~Mâ_< m.LwCi#Fx;16A;GX!b\oa_掚{Jfb|M֬e̖'F*G&ƚO++V׌.Di\DzB MwQhTke6}/k4I򂬰ރ~OqVqޏҹ=IK_v_znůS>4|\<30Zx&kW$P\F(xKI:qFi>.*K_VC!A%>HVf>a[uQx#y#K310'9{)8'_&>*)jt~f/ 񽿉5 .H$[HΥUd^aWj[]cLҮwʒ@mAڳQЩ6{뷏RukKN}ke{ŧ­–/&ѧo)Y: FcA+9ӗ}_H|R]g~c.fEoa@ W'灗K'{i[L$\2&C!*= '^1΍2Qws2m`A?c3xUM~пzrH#ga`yZn#fv+59Z/ʟk/ |XCsᏉ~Դa`veU<Lê|B{;;{? kki-q$a&LG@+wkA?f k__kK;A$Q[%*f}pr:"X~եVZ?G비߹Nq}Z4yǯ#4i o,4>YqA#D]1 p"=w[} 23%eHQi\c-׷|6XfaI#(6s_f~_~&|t WC<=11$|~qǨxa+O_ZD3e̹gs^uzRrhKEn_cqNӒ*vj}uI{35/ ~zFN-fIf?{Ÿ6~\%!%i?(a׮rly' zm󼬊0ߦkc^'5OC if XldnsXӕHQcw{ﶟy4#,v`x{_%y;-SdǟTgCKC<>~iz1BAc'?4 ^kU[G=N<16TE&tמ7hD1rp2GS]Unjx#ğxOYR΃8 v3 כ,=-%N۹JIOJOަ3ݵz;t~G5O~ ,W]t EEv"L10\ gkwt]5O{h a,a6Sa_._7n$x?OumgF+N76$cr $s¾&wK# t#Wn dͻ[I-W<\RUeFMRi[hIz&CV(P(((((((((((((((((((((((((_\JuKsj$8 P)e p٤~REL`(1|q+OEa'IjbyWx~[_x56a"٥Mf`#e8C2:5vo? mt&o^ĮmRzTEr ,7/xOV,xufc/;KT)% ꊬNX/s.-c(RˡV5,8)MhemzK,kPop3RQ WcxcM[[^/.􀀬Π#rt!}EF|O[_iw6сݞ&Q ;kz.r4$[\kiO2уkWIq岕ûMʜdrnhR'TY#pUCW k~|Ue_jCpܠci$8_s |Mլ^EZe~`)^Ӕ9/ym\V.:|VZ;x/( ~i6:cο5&oY)I '?;|׌<0^%d{ub PHܑg50m-7s2F[0#+?iH'?쩈WV?5+JItVoK|}U˳6ShNTWm^R񉴟 lỳ7qL<:9#<^s_7x3M<mmg5u W-ԃ\V$8n|C M־!H?g,jNI$dRsb\yceq|.M8эJNrWcW}mowR|B񌚧|Q{b(,`0 ?1uǡOſ4ɴoWp:8' _8#Z8?W9,\7+nsj=aw8X*uawR>uIyV|jxcoMmn~H[Ps3o|~q/ wFBv5y5p7qyH:S:ڃ~dX{@E/lm:1yS ՌpsqMt{6UO p(yԢ}[kyi?ڛ:c8}mKּ3?jؙ?MľBM߶1p+)w`V/)>7|$A'ysP=}>l(ѕ*Qj֏(|m?߄zEtczYEm3HY͆.G@cI ?o`um'/xϖn>X|vlzE]%a9\Adv9|mm4=Bqw另f2ubJuf깨iZktxkb0xhÔWKԷVw{_ hW^㕭ct295?6i<u>]>Soya3nh%ܤ~җ58Kk|VeFT1iJiv_'(B((((((((((((((((((((((((࢟DO`kg~ |)kWvv繐 y p;'\Pi~Ҥ-CPLV=sHR:wrs*҂PC8ӥWTZOi;3qռ3ǫimxє I\0/n~.⿆F5ޮl@2lrH:hd?3ICst\?bD{wlGO(+W:Onco:@뱶s0r^ץ)PjN n>/x:x| t^o޳}oKZtR־%|(/%./4iYzW|M#LV/n iV<\/؟MLAy`%ɷx_)^/?_h {E|6y>3A,_{8-{|^6c¯9A۝ϐaT*nJ/g+mҽlx_OxxW VӒX2@,3 c&O> $C-zǘ 7=3W0G hywLy_qIaՂ/sT$ )V69/ݪz= թJ4M.T?-k ?IorzcKV#($GԞYoÞ-ŭY̌us9 *Ǔֽ{ `Gj~_o5)?(/Yk|ϳ\}?J֬*gA*I'~7mFyya!JWVW}nh}wEW~^QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE  l;)3șMctzr7hNFJ˟'6὿]:*okH>ŸbI_NUD,Lw`;=m=tC^գ/:p#yeHRUh5|fM^Z]e?S ',ßi:QԂ>N_n~>+]ZP[FXeRFY0A?O@'[ TtTkO癮86/xi]=mKD kkx F̠ cڲ#xx>! A!,&T= UN\'3ğ>'ZC*z'k^:l6ȷ bAS?NeeU3ϔ".)$IE7kZ]n'g |5x_i!M&lP۟7p q\g Fk(xGKC-d/)GRR29^{|LaM!y V& yq0 A'<ǞLZyU|d G+ֽ q/g iVp6iMU&)1[wuo\k]'K\ZYiim$ ^o_>jf孡]IfpTlW0E|-kacIu6*N85|}ޒ$o>WK?D*Ry#8^Go[ܜ()7ew-4薇Pxz0WT8lWo[ogƺ?_COSXӵ]'pf#p+hc|gokoujBGpʮlD0n25:-'i5 U6O"D~х+>֐qD|j 7B>"jJ%ݯm7޺>eaPBS\goSZh΋.L'𝝬q&ώ\dglZo#ZZ+nT(9Ry3ӑ3^_!~R⚜~N>ޜqz˙36s擡eDB:m8+]I]4޾g~yXͬI5ޭ-&4D_b3 +OVׅ~(ŢOZBynX  3&T0 _ // Z*͎HǁΛnX~rU(a0nvV]}:xlwrʸx˞̠u+imzYQEEPEPEPEPEPEPEPEPEPEPEP\G/"^?J$OڇIXWzGGQ_EPEPEPEPEPEPEPEPEPEPEP^%5OO3kb6q`FS~3TSY\qo+q #6*0#A[ЩUc9Ǚ.z-Jj:r>~xTM᭿e>;/jYz}6Gmm ,qC H UshCFyk<4"v0&G=QWUXz\xj4]\DT;YVTյ&][3_XѼ|-HnB1 ^qEMIsJahBg77۫gܚu?߇lr鮃TG$́ M WI[Ưjz n fKw ARzdZ^Ǎ>Eh:] pXm NxNae"Y|0ɪ$KuQ|&mX½JR7$viV0ǽc5 >G%Ɵ˹!%1ː7vg?_5{rg1W&l=?j~ iO>FcH騡3#` Bx#:_oWO%).[< UY.j0|JWK~g|߈>'g_h;Eڧ@ۜI`v sPxKE P3p'\$W1O}ƭTV|'g) ]8>A''*Oc_n+xR~,:PDro]HA F ѥRJVwrw[#4TSSZ;Ҍ WkYoǒ[|7_u2SEڲJ9R Fq_Ai^H5xuhq//+@L~q]tnE?hG\j5G=eex$4;X|m_iVZ 4m "2flde'\nZl Z[<- *qiX¶#8$ey?ߴa]T\JF ڤ2uSR2c([m߻iFrbe,ҵZ3isPU5dϔ0E!EPEPEPEPEPEPEPEPEPEPEP_R:k/O6}K٭ؽ?W>CE:(Y?(h>>8[W䝋[5UAڿ$lʁ27RQA"H^|Q{xvMk']N)$@Չ$Cq^mE;M'gmwOO3^9%iKT}$ǃMyƯ*X~Ά+[+D1!9!rORI'I컽|O  |']JLHU)y0!SǢk_\u[P20# dNϫM*E~޺ƥ4-,Z旙 ;JLW|`⿎^$]gWX˷<-9+gO'Rn]c~~Ԟ-cݮ}biaEFMd"`9A^eyKOK1ӚZa/eUw̧ouǣ=a#K46Vl4i,~c|1P#Mx:Zoghu֏f8p+ɨv?z}E 4q jҩFtLW {W㧉 j?$׉DM$+ʌX#)n+hh~{ ~*[.6!*2$ '^F}J+x/[;UeY!C3>=E.TWmܛmО"ik'& y1?>5|-1x6:_|ӲhpB$!׌pH#F/ǿi\n-$Elt-3Ůq_vϪ?f?iՕxk:5:4khXF ͒Yd|Cx)j/xGhn[[e*8#*Z>ǧz{,TM”& E=G."N2ͻk"q^ܯl__ߏ/~!ӬK5LHج s=8;IE %6=?~𮃦hWz}ė-&o3TRdŽ ~'jxGԴw+gFC+)ǡ *7?]zgǏ |McxMqP;>Hy.{q]e;#ki]?"oyjAwwǵx=\w̧_l|Bִ1RG ܷO$jn6f%͞s]6&Tw1i2ˌ8_:TmIZ&SO_Ǎ~6hV}:!ocaRdY0Rmn'g s]4]6+M[IBhgwI(hM.zپп?n/t mcek;3h='7 WZ~sbfe*NasּŠ#6'+C}cHt i62rc x}kW@nQaj8TGDh|aO|Eon7 o n.vZ6<=)Mٙa{X?jo~v>{^'!S`vJ9j({u {ֿC[~$5}v8弙 F#`@8?ZIE$Urwbu%u(FJ(wWܟI]4{_ WܿI]4{@EPPQEQEQEQEQEQEQEQEQEQEQEQEQEQEW/-a?Ji >5o]j> d+KDBGbT<,FX05;~ !֩m)E%e~'oA]#oA]#`{/".EN# 5u_nW3V7O4Mq62HFbg9nx\,(_l~ʆm.[_Gb4|7/<D|N>}Cdn>Ur_GQEuaG J4ams®g_Nю[jr_4+|,vAFIz&U]@$rH~A_i~G5+tDM%iLcxb^w`gWДVU09ͷyG5,,U#S[ߚ)]z!/5nhdY%B˜0a>l|)ioW}:-eY` dŠ`g 8+ڥ飾9iN)F+IYIX%%Gs?i2UWhsWs@ 94߉|PooK u·׾RB A('h9vK kߨ٨)4{kmMb=׾g5o+w6R槩j0H;U@W7_OZ{pmisq\9,']=Nk|>д .vy=NI$NI'M|_0U%m{W~ļSM<RZM$ZEWԟ| o~$]|C7om}zY \.~RyvU}MErb0r]8֍[b2Tl%iFJs>)~zWi }5S C]7?P?5V_R=jP2Hr 1ިI9m{iKwϪJZ\Krs毉|o_|Sekk3L #1rshxE oR'}%˲+ڪ[/8(O7w-/g3j\GZ:0ZI(ͩs$[G(y1S.m}s LVTfbBprG$[/Z~OD-ǩؤ7oW9?5Q]u%*fuasuיɫ=oki|__<'CP6C֜ Dpw}bⅿ:_iH/.|Sf3J1g8WcO4;vmrb獅R95?T%(]ڛM|By&xF9<(Gd=_uo7 iaDC˓m)⿁"'HS2Df# a#VRI{];߱!ѭF$_Ӵ}oyxo?< h?Ǟo h0ڒ:pl 3~0zZub~& {y}ETVJF:Sn7S\wӒ]9=G߄u/۸nA]߳sG$dqOEuҧ4N +/㱵 LXy]EVQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_OPGiaԯXxS!ے2Az_1xfngf KX"d=Ikj9dq([Gcr+xju`W;?4l~֟m5KC?c~ ;o&q믅;YE%dD~&q(>^Ο5]\ Ք<,߈#PJljH~5wPw_M;:h-ީp  WͿ #OG2R26v܁Տj"Ү T9FV́K*.o}K{[NYGwBJ}MХD'xb'e {S_O #RohRb@\ ؤd_FDjPQi=.ou*=8'E)r/u$gǺ/ a>"( p#q|o5[Ÿ1mS@tg{Y rǹH܌9 3}^*9IYڮ$L*8xF8MM(]ܥ&魏>@|^ W,,KGaV8H7A< |9]oÿ78KnAop(""q>G v]񦈲]k/*Dĝ2$s?o{]cWbF@R@h <9.թGI$ֻn}\ƆGW眧rMDChc((((((((((((((((((((((((;[o K ـ##v4TN +oBL5Xע(oO:]h>!{;I>\)8 kS?|3+I>kZPNA }|0ie-ཌ͏5XIFEe%jQK0(T[ku9˿2>x֜Y dkGLe*9S/9kǟ_m~)io?Ƨ3tIFAb#qӜ}si}o-_TQ/3μc-qT F;B4;[~ߗC1m6cS5j+f_GNti1: ,@{9$[TQ_MG5*NIɻݳ_~;E|kmA^f9ڙ!J2W$A_ebm}\_!\y68Mrѩ(DzӱOYEpN*RRۙQ淚oKeĿ~!P4-0ʣfߴ'i:_M@_h<_BQZ(ҌZ1⾶nŦwo=s_ gӳfDll{W o:|_!K,Tբ,O`c5UJ3qmVS0f᥃J5i)Z\I+]8/mW>%xK5Lsu]2- | ]ܝbjeaxg+K[ޤ6=G\W~ǟ>xI 4݉I2~ zW*p)]-m2#|m*:P+[NYrnrjd7oϠ[0\x +=V3hI&Sa۵u߳/ 7M;{PcRzj*+ю )yY%>[ʮQ(IKkkJZ+蕕ϟc(OoMV{s5Q})Fbwf6`9S9~7>xwKжѵ6E;)n\+j* v-دIfϗދ(>h(((((((((((+$OڇI]qA{Pi+ ŸC/|(h~+(((((((((((( #ž4 JQ W>?oO5m"b)5 ~`|(|ogº죳 .m-*^>qx`ÎkMcZڮ]jڌ~R}@;_]C:K'⹇b3;UF.i$?d%=ǚ4Z[]_OuUaN>/ kapcړ ĉv0ԳbX^ fqO)slqYwOB I;%t쭳4+ ~=;Ѽ3y-{GAc2o XWr*H#,gm.Qw|aSv,%a܈A|Ez=J2w}}lgLJ# R6勍|n:~E<.]':>ηI;(FNIIAyOxx;V쀒, APCV~C>5ITJ\/ըNT)sFI.g{w߉ EW]? zCIp[,b3(kg$5|"oįp,%X*+J*(`QEQEQEQEQEQEQEQEQEQE/KfbSm_-WԿN-Mz_/S8DX+( &pӅ~Gǜ~A#i?d?,OܟW]/LE7u$unQMFunQMFunQMFunQMFunQMFunQMFunQMFunQMFunQMFunQMFunQMFu}ϋKw .|\#I݉?~t TQEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@qA{Pi+#??/jM%a_SeQE~2tQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@}K٭ؽ?WU/KfbSm^WK./??D袊d6 (9~ zVWQ\{aSW>>-ӤxݾzLqg"nubuk;\evz{t2}v"?:kO~0'n7?i?kOZz+7?iqMDOOQi=y ?t8&_'?cZz(ִ qMDO?~/gni=kZ_t~8&_'?? 3 O7@XCִ ??:¿o?~/gngK,~!kZ_t֟?_? 3 O7G3o% ~??:kOgK7?i ֟?GOW3o% ~ ?t?kOZz+7?iqMDOOQi=y ?t8&_'?cZz(ִ qMDO?~/gni=kZ_t~8&_'?? 3 O7@XCִ ??:¿o?~/gngK,~!kZ_t֟?_? 3 O7G3o% ~??:kOgK7?i ֟?GOW3o% ~ ?t?kOZz+7?iqMDOOQi=y ?t8&_'?cZz(ִ qMDO?~/gni=kZ_t~8&_'?? 3 O7@XCִ ??:¿o?~/gngK,~!kZ_t֟?_? 3 O7G3o% ~?M[i: έݸ&IU$S;~W|OMLF-*@pv/R8ςF {Sƍn[/O#Q]  ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( >1XM|#񽕺..t;cE,n_IQ8ǹ XU_e;WֿOG#ė߀l?4;cB@͉URFMpG>'1S>]%~I_pv-̨Fףi5pWo 7Goď')-\¯?G_qWo 7Goď')-GaED?%(#KsQ*#h`%gEv~$>O n?FH}{ ? Q](߉OS["Q?x?E¯?G_qWo 7Goď')-GaED?%(#KsQ*#h`%gEv~$>O n?FH}{ ? Q](߉OS["Q?x?E¯?G_qWo 7Goď')-GaED?%(#KsQ*#h`%gEv~$>O n?FH}{ ? Q](߉OS["Q?x?E¯?G_qWo 7Goď')-GaED?%(#KsQ*#h`%gEv~$>O n?FH}{ ? Q](߉OS["Q?x?E¯?G_qWo 7Goď')-GaED?%(#KsQ*#h`%gEv~$>O n?FH}{ ? Q](߉OS["Q?x?E¯?G_qWo 7Goď')-GaED?%(#KsQ*#h`%gEv~$>O n?FH}{ ? Q](߉OS["Q?x?E¯?G_qWo 7Goď')-GaED?%(#KsQ*#h`%gEv~$>O n?FH}{ ? Q](߉OS["Q?x?E¯?G_qWo 7Goď')-GaED?%(#KsQ*#h`%gEv~$>O n?FH}{ ? WտN{ Bmlp!*?~U^)x;k[mN٭#AZP}2}?q eM[eQE»Bg y$8O|!cmLچ&m4ݿ./!,r@^p >?w xDa.fnGR"WO* H݌95.2*q5+ߥޟ-6Rt+V~b}J*5e{-?g ek8%ݴ$Ey7졯jz_ڍ彮R'i%EptW=5w 1*-wD߆x#E"xDk}öfJgh2b9$OzoxJ$m1tgT%-^J'VEwZ؅G v՛Sf[ӴYդ*3<Չ.G4y8Ef־;?g|dD>#uk^Ѯ.GL픒J|1\| }Uၩ]j^F[$Po} >Z*S╝N\Ul ,Su))^pN/[T[X)DU |5oVaϓ!U '>\ujl}ctvyU U\ 1:u%vn齜U]GRd7FRW/ᯇ~ bkLI~v؞8j+#{.m+*q%E;yݾQP_]-bFs zje4Z Sqۻ8ڴz#I̷r:*k!n (+]|Zg/žg.K+eC+J68RK W5υٵ- >&LMcHaErڇ>(Zxf`W PNB<*a x|{J:Sˋ(Um+}VXzU1Ӗv\ޥ}zGӫjqѵ[9Ml37 LG ~9t#bY%rs O7Pkբ1Hֳ2\ +OOe\zIb4<&wkө[OBZi{Zg=嘬6c RpR]e-4zu4v<ȱD,@zj]#Z[+S$e'>j!h^!->=:J\<2M.c$(85ߴ7?}?zy7[i2*cvWuh)T5?yZ߉ɗwmÚm)˙;i__O ڥN R 5|~"OyvВ2=5xKӾ6xkm?& KaHg'is ÿxi Qk%1ǗgZY'-ߥk~G%^UCD2ɞᔾguY<[y֮,nXm"pU2kK_Ǐ y->(x_ڏuҵ;80)rT3k6hBsMފϽo]?U9FiZ)Z7~ݟvY[jV{K=$éEywO1? [kw'I%J ~6~'h'sIuMY$>0g8'')ƿh_ڇ[*3jwe2b1Q;AFNj/_5mFW1O_j2KVVm= [i,\h?Uu_O6vZsJku|7|gxDk4l͎oFeyH,|I<޺ڣ⦭,|?pֿXq$Q@!\H_[y/g{Kys :8jZS\rMޫVm>ĺE,%lcj%?洫/l< Z$?(#uM^7gZ _~1/ 5m*M Zyei烎VYKקdwNN-{tgW-%%N<4m)].٥zi2,wڍʭ?@M\T57Y#ae9z_~̿ \|w/_yZGV+ݨ)pWirO#_kh~" }bZnrp?tg$FZ,.WE:3<ʶגOVvZm$T{MQ^\5Y!fIbBN?G\?i-"rH?Q΍CS͝,8K1$MXd" 'RWOǨ-gvM$zgҏwb7Zn{hn$ʮE'&i$Gk ~;ߕm]H*rYIۆ#;/eEu{=:}Iqu0,䝹'Ku gџG^[,s }!p~S-i%u5fsK!(ЮlЖ9`z\? o"x_֠Iw~f8`g9qhEuiv35;Uf[-B-}pj|O :h5 ,br=k#әtyd~+:`9:r]4OG7:gp -`I['5qUB@2X1_6!O^5{j%LG "𯉾(Lt֞G)e|%p9 pzWWX'jx~(Ƥ(I(- n}7Ph-u[׬pήRB$x|:Óäk/!ԙȣ 6#:ڬx?f]j2=>f!XIV>Ys &5WWq]=VY/-ՒIUT@IV?~*xPDSXuFHqb͏cQ*0*Rè(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>GǖZ-fp%f_S^dx!|O+۽CABcY|D38(`pHlA<>x_jwΧ/Vu׈or7 !\\q3UpF ^m?Z.VSV.NM%RR]5|3(76JLWWeo_wq:K%ǐBML?JE7{P[b/ZIcUQ89T{sSQy MVN857%g~[;dMz;BM5}%kKyd="k6 nn^'|7!|/Ou*P-گH8|¢3#u'+J4k98ے-=oR_}fxS(?Eש4oǬc k/n5-muCm&bdWP8c-F71W[-״B_kK#h}># @̭Ԟ߆.Eyxg_o^0I;q<vҡRIyFV#4b:XѓTe1VF"׼)~ȟgj:Iz-g j#V` |WMt ;G'+/ZόhvVZڋNc_EIg0Oَ˒Ǡ{>_&tVQ}ydݟs[╾$6=AIS{ysWbg'CO>оzCÒŒYVf9,ǹ$+i .uE[s8cA$db/ԓ齵[=J2*ӍuWng.gz ?G? O n̳Rv% D ;H<8 3S~ *Cxt $xӌn7?,~P'wa.sga\:Ɓ@[ p)|?+CKuk[ŚhWZxgv9@ӡRguusa)O "aIA:1M+w+M{;n<6a*wp8wg`߳ v>{Q{:k& :nv%3rĊv󸎼V;BM5}%kKyd="k6 nn^'ӧ^8qÕ뷽}l&3 ޫ`_rtw{y2[f,lq8Kjkz []jDIؙ-K`c7#|/Gu*P5H8|¢3+u'+wዯ^kE[/:hL,ĒNdrOjxjTw^wѫb3L+35MFQN#)%inkN-{š{V~Foė 65fApIOHOڻcy2}|+ҾOMp0Tp[8=wz[n;5"ܤX:W5%앴fjVg'%$*ߕ4gB?n5s_ޗs"&ILd!R}>+5s@'j!&e /#{k.0njg޽/Wn Vu-"[u wH`21ZTլ^_<?c:ki-/еOtMf9˫u0c+v{q^uc~4׉|E 2w^8=2p- j8x[oD #xos!J@ܖ1vsɻ95n9A莓0 tO|O`˟߲ozůhm:Ay4d TFp}+tC&)@l&X䪨(MK j7?g'{`REGEm]-eh\AqbG=p+W2_ ëI%۴.qvp?X~<ċ(5 KZKFρOqAu(}mŻ1y߂W<Zkr"Z@vcϫ Co Zi HIOBNp{S6zfoMkךgԵ;6fA.P3?xcRh-RAM>1qLWI,x: Z &KG`*HW9SW&ז(<((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?|.h<zogVG=_7 3+OJkz=_7 3+OJ%Wޏs?%QWMB oGހWMB &{iUo@\&{iTн?[.~н?? ^ZU~x}[?C ^ZU/x?*<>} /x?*zogV_kz>zogVSS],R.F4W+oMo9 HVx<1g jƏtݲ3XUu`+͏%/48R!n4ѫlr,QeA+(? } /x?*zogV_kz>zogVJUoA?x`~W5Lx<3qw WϞI]AѓOf"6?e]|?^=꺜ZMQ,\:C.@zg|n< >v~/|-Tn,`݉r@o*Ubdn6> ~u)tN]&)NV(ݢG@2W'L8 s?%QWMB oGހWMB &{iUo@\&{iTн?[.~н?? ^ZU~x}[?C ^ZU/x?*<>} /x?*zogV_kz>zogVG=_7 3+OJkz=_7 3+OJ%Wޏs?%QWMB oGހWMB &{iUo@\&{iTн?[.~н?? ^ZU~x}[?C ^ZU/x?*<>} /x?*4?*'[P4NMMd>TkoQ\2]FcD=fkw{=[HԴĶv #FVWo%Ww5#dDPȾt.Os_B~7w3\&;4x[kg87@ F(P|#_+KOė֍oFyXI q/x?*78cHִ =_7 3+OJ%Wޏs?%QWMB oGހWMB &{iUo@\&{iTн?[.~н?? ^ZU~x}[?C ^ZU/x?*<>} /x?*zogV_kz>zogVG=_7 3+OJkz=_7 3+OJ%Wޏs?%QWMB oGހ%oSI4ȏc$6WWҟ ~2xGw^gG[%A#XkC C^u߄j?BHXAsleIш&á4EP0((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((\ּ{"\ּs4dQMC(ȯ;|R_Wd9:d 8޼7%KovEi#e u *~3ȣ"3@dQMdQMdQMdQMdQMdQMdQM?s(Zo);MڧK_L_9ح?&CmSI%GA?)YFGdQMC(Ȧ(ȦɦgܖGk)sd#x 2(Ȧ(Ȧ(Ȧ(ȦOsN/:o_oN/:o_piԿj+' kƝKJg4 ȣ"3@dQMdQMdQMdQMdQMdQM7uޙ*yk5OBG@dQMdQMdQMx2*k>LEyk5OBGU@ȣ"3@ȣ"3@ȣ"3@n'?!ɠ?m_?&u}Aڂx@G=:/nkCj6 }ܟ>:t=ER =k~E3_c¾&ƣeiV3%¸5HѐA b;f+/Y-z35׬ulSx} l|m $]CDٯyaוWSYmhBҥ~kx?ho^ C?xn]b@PU9Rx5~ <' ǿgx>lw%p`@u_kڄkRn[jΣ8*8` ="..StݓZ?;j;}J0=W^ǡuoqY|'{mJ%zo 83V;w¾.mmaqAu!jApp5I~?$i.AR3[>D^@~(𭏍|1K_GZi*A z@Z%̺K_O|o~|e'q__-;Nk[|; fR'(E&4۔_GoOԼ>Ͷ[;]+ː',W;?Q|2[]G^MXQa7tR~'i :`W׬~=kVז΍Fڵ*A\7)H $akiy|%{>edR1?QbSg__wO$??s^(Z*?;MڧKAgn ?_.jUi*u|,oKյ{A.| Ҝyr䋗c 5{~6ſ~&p-&kdgr⤳&۟O.Ŀ<,vI3ظe$}U_)ODϻM[N?[ξѾ-躅+Þ@L6ޡ^9VPy=du5U;CsS«[? u^Xκfi4 IrABR8Aϊ?躞z,bIc(NL@VƟ'/oYxG~qzHRFb$HWyF8uG*pAIR|.J*ޯ?zU#Z/שai/}xR[ X}O5;A8~=xV~ ]Ū^uq;K / krR=%gJWПl|A |S/q{.,5n9C0IU@' u?gV~FQ_v^go!Լo{mlWdS`'zk}(|KcNp ~|McNp#77ůu/+~4|YRҹL}( |9<{wOxW՞ufVʖ p3\5yXmO iKAʟ/$n_MgjS|kNN$LB*[Lk|-Ikjn#IIdp*CCcNJ|;O:.i|8F!W88Fq_N-7j6)ktߋb65c?#0nwڍDa#9*Ŀ@GzSJKOQE_OEW׼u xn%Ԁ+_O:mt'PIlR)]ۿ99r~$kzgǭ/Ò_]hzWv3^'"'u}LgшK;OK?h]\PvG |?))/u6WTg Wg)Oε^z?'S;Ns{ $x \F5O GZrt<ܚ'EJknK,oş,:˩ٗ|7Sj%SѐLX WO-nKh rԤJ23W_o浠qmh>M2DYh8Y>o'ߊ%jzu0l/pX~Yd^{m757V;-~WQRO|࿍/]O<;w1K⌞r '5|B)|,џW'nl]471Ǟ2'm$fvݗFע'>$|?ƚ'|gxwSdGtd2IeFUIrZTT_^_gzMl~zxwÚM#E;൵{sfW_?c\|snVI 2̑HFz\Ѕ%<;3vee*>~ ] I[]!a98eaZҴ OR2M+gJ?tU}m0`&QtHjSCu;:^U屸Hu-+ AJ[?WYʼ"c?~<.@nkuyn?;a_)b5,UdL ԋW~†W7 Ga;,ѽ޿B#Yde͌`u>eo?0M/?Po4ۇ-$|__󽯠h>>8[PY1Ǎs_*UT>xw'ƉZ/OԾǼL,QR<_;Lo/ZWUk@V|i~_n|C{kM>g QW}{L'_?8bG}Q;(~@ ?>2_xvC#ے27erŸ}Jn#{m6ޞo}JrnKrb(=,mͧ|=XIdM…?ت߃F3x 8uS1 bwp`-&׹jM?.?`F^Wϟ ~<7wlHC,s_@Ap8_y[Ƶ{o`? \˥[V'Ps?f^bHeGAWRѩZ_KKLQN+'gϿf_ WV:jb335OᗉsڮɨQ9~ w ҾzxP׼y?.^ǟ k>%ufn$ȕeWB36}+Ε)[G%ѷ.`6Za1r;((tRmzY_7J3C~?uëi { L篖 }Zu5Q|E21쟰g}U߰_}T QEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@?/Waf ; ɠ?4fFM?E~][,淮إ]yKhdTP$)ߞsW~>>?gOڋSqw}ڴ3pW?+ gh4sg|Q]aMV:lJk%5nq@`g8#Fc٣m̻NK;qo|s?:΂֦HHdG.Fs3ϭxh3&}+ɝ{gvtJGmo짒U8hH* jM4nZh J~o>ɣ~_ō 5#ѵ "0 \kܚ2iiyYi/ mu_<:٣4ۘ7`^ũ"#b{FdS!5KO͊D!V%z SQKlcY&=6C&wJJ]W1?hzUo?gOlj6:0V$x`Qx9VkOzb7nYjq{c_4*A]kڝQtYٗ'NNIoQ}>?SwYįO*UF҈0OĀH9(fFMNrnՔVYdѓL&ljVJybNc+OVu GɼP[TIh,I B5{5CG?-A#Oi-IcvI+)*2iӺݚ>5?ß4[oc?Nԩ9`T y׍:.h澺Ԕuo3c+Ʈ뚍帷3( rWX~^$_OzR}e, `INq~4?M=ɣ&Wdi'(M}:{>iKm[Pn[v&j%sfg86(9!HḒ$aЁ֡ɧ/zӿQm>C_Y|#› j"-S| l㬊+&5Okγ}6^f<{Vvi4d!4̚2h+' Ɲ7JJ:'' Ɲ7JZ GƯ8o?4_W5rٮg7şu/+L2hɠG>` x[u4_-0͖ yMo~]eM4\Ioo%*/}eK|agi_khvR mi)y0mU@ IkګI~i#tgӮFl'1PgriHQ2}i|JJz4kokv㥴=gkƭ;!65w-΅E<3`g$=k~mxlMkmk\gF<$7,Ƀu?{RT^{Qi.@5[&2jfio'L%_qӤ|!}OccQ§+5i|1x5t6k,wQ!Tʹ dI~| xY'4#Rcif:cPO_vzޛ!kYhd(HȨ|<;g洓R[O/r1]NlZt&a|[!y#tf"E@X]$r u"[r>9m7C.r_c`Jo0R_0<#v,V.[袊{%'(Qs*V4^Ϭ,?,,O:lW٦dѓY<7)sY/X~ f[x÷;d_B|=Aߵ4 Sy}ӑ9RGпp̚2j3Lɣ&dѓ@r&t}Aھ}L; &pӅ?o\ 5Zğ5U6M}yسqVM{'$w|ڞuc&wQ27 H4 /_Ɵx1Ew .Ќ88 >}CjffI2rNo. t~[Ϛ;o+G@Hި|W|G;ƺvݑ-ۻ)򪅷d_>:֕['Io,$7#yD8 duh؟|`u7h|uJfխXұLX z6mh j`YX!O&ݮ[O?aF^WE}lٷF W$ ESz s,3_Ԑ\Kk2 r`}i4z7+]^Ϲg?$?*$Z|z^c#03X6.gO+?o5 Fo:[q2g.ߙ2j%y')D)Ūx۳_xz, ҆o0G$p>7c_iŝŨ~ȕwŘI&Q6mӛKQ٣4̚2jkO+s \gO+s z(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ۣO+s Z]?WGa⛨%Fn7P!ۨMFv7SwQnnu7uۨMFv7SwQnnu7uۨMF '/ҫ:~(ح$9Z*o;MڧKAg..fn:Kľ/Gnu7unu;u@Fn7PQnu;u@w# Ɲ7Jj8# Ɲ7Jz G cƝKJOuu,ө\nLv7SwQFn7PQnu;u@Fn7PQnu;u@Fn7PQnu;u@Fn7PI]4{_AA|}np?{iɠ?mAg䅛\T۪*uFn7PQnu;u@Fn7PQnu;u@Fn7PQ_WU{a^lH.?bh ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?=ࡿ׊u'Mjoʃu)Wfz.\IoukqmqKSAWE?ېrOېrO@P+ܓGܓ_=rIrI$$Ec܃~Ch܃~CknA?!4nA?!5@X~? 䟐? 䟐,?ېrOېrO@P??'?Ə?'?ƿz( ܓVnuijF彬&GoO_P>1x^"Ggx6k)mkolru 'hv(^zc 7Mh@ď?giyw#5k {kAܓ_=~? 䟐? 䟐,?ېrOېrO@P??'?Ə?'?ƿz( ܓGܓ_=rIrI$$Ec܃~CiM"qL }5@Xe_x⮇z=ցm _# "6hl1|cQ@ˏۛVw*?u[]wF#$W :.[a`X>1`d"FGdu8eey?ېrOېrO@P??'?Ə?'?ƿz( ܓGܓ_=rIrI$$Ec܃~Ch܃~CknA?!4nA?!5@X~? 䟐? 䟐,?ېrOېrO@P??'?Ə?'?ƿz( ܓGܓ_=rIrI$$Ec܃~CkS~=j֡! V3N _tP>ig=[c|$ FVqRC01 _g|s?SWhn*@CFwN=>^ڗ{i׳G(Xc3rIc܃~Ch܃~CknA?!4nA?!5@X~? 䟐? 䟐,?ېrOېrO@P??'?Ə?'?ƿz( ܓGܓ_=rIrI$$Ec܃~Ch܃~CknA?!4nA?!5@XuGokkqsq!ڑEcO/kZ⇌4b{}"6\JdZfC"` o@3E ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (c@+}60OVSx#Phˮ_\_܁$h" {}1Kӧ Why\+5Q@&__K/q|AEsY+ƏM,]ie37_X]i oym5 0}Nc'5K ^uEH$bF3ъ~t[)GzA'Ub1pT]?)¾05x|34#62h?D=x#<@WO4fڲՎ^@}2=S޻((|?!_]sƯ]f ( ( ( (/X~ \+[5]EPEPE柴M#EFo.iZr P,݀Hʍ_ P ݮiv,-,z3¾k?-ց/ m ]$)#+#f(((((*jS5 [@cev( ( ( ( ( ( (//|뻈b<ɜ"&'!Z$I S *a-8ʉT'VdEt`!(QEQEQEQEQEQEQEQLhyebw *ܓҀETլM&7yLV(((((((((((((((((((((((((."I!5.HUT I* [UдKP&{jGY7G]k#LL,3oe1IgN (@xk .K_JH_+f S#Y:z_f55ZӴb&lg˷lz T+G=;W -Cd(Mi1j@y5K ^ux' Q^X ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9cW3WE\1o((((((/OK/v? `x/ArcoEP_#M??2-}q_#M??2-~fW~&]я^Qxßj[△%2d*nX,]q'5Q:p]Ssg=5oi7ѯ#|G_$ZE8YU z]~X~|LJ&U4!W@`>ۈ٪Wa_qu!W\8%s$€ Ӂܦ+5g;G J!آǛ)<޿ysS_G]]:yxI}ӆ=_>"ׂ> -qy<V{s̥@a1/7'oD #%^Aՠ>#9>XFO63GR똬쭣iG(319qv?Z~imOD{h"lr8kcƻ-\~* OQyjo? ݢT573+H`TO,j]%O?ܞex?G濥'φP$Mp"$x;Wض}E˥dSDWpp6~U~_|-3<)=t8"hH1|?PI +gM?ABYI,GLmbrNHRzVnJ4i= nDwo#?jOjAFژ]GWZ]kʹ[̂H慃# ;?)i7 xm8<ڷ{xS'&ͪm53~'j {rz&`I򕘬3w`=Kz7}Ͻ3'+F3}sVqh+5-R]泶G5C%A;oSet95-P]lh0 ~p|&=ďڗ]𕮥>c_j,dg5$pX _qzG)?සxB+}լ 2h@[$#c#/¬_ߝ8z?Hky Yiru`ez1E}HtF-WB56owVS,:;LooÞ0GsQ>#jyԦpXw^7a?xÆfm6k";zV*R]ə9~5r⟄>)&yQ\*I Jw7 d/ßZx{ZN~%F7 ~rX#Q?ƛ-GQУn"kxX y._]:2dG[\w#S?N?~1ۡOvRnO:ΛZ^^woqMxuPBXޯU=*jQE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|"?~i^ʸ[~a};G ־ͯ){Є{nkC~Io!-Vky6B7m5?"/?m58s}뿵= -XF?a9(ނ&6c䌒I_^~KwGIG~^oy~xGz%ukğh!y eN⾱uUkPڋunDJ0L3qtz|+^?Zu.]_GݪK\ࢊ(?'?+ |`3M/Đ0X1+:0 ܕq_=ֿ'÷]*QEQEsƯ]fcW3WE@Q@Q@Q@Q@ Y?._՚_AZߢ((਺6qU][igj"">5xƯHԼ!Ě;AtU֚fNP}hچMx~_}.p1k.b cExurR觱@pY;~&s"R'ėN8Pf*8U8=I$}AE5]dUe!CG: (5%/o(#gn$#Ǯ}N\r.撉'>#l?5 EMB ,Q9rN}?b_W?>wLq!YJѻ1䒌Mx:ǁqxhs1fp?~>&I%ZG"(7<ϮVG=͘ԗ2uVm4 Ş3м iWt0E(r{ʟh5t RXdfTI8 0_8G f?G5E/{K]Oskq{,zL^"2KkcU6g9 z/ G)4k{Ry,۽9F2?5G?$2Xk|4xMh5Opu3HU0\ V7rNӛ]lVt-~iѾ*xAiΓ ֩ik*yHQD_88|CʐAvK#TQ<$O@zH9ߌ4m1|A6eq&IUre?r_i5;Dshe%Fc uZة(g̝{^>nG|0DӼu]n\pV=O`2?nOٗε${YiBHa |g\++%Դm>+r+e\{j;Ǚ{)Oi|י+o?|}uPkxIo<.Y+g?|'I/-7]Hd[MWe? |^^_Ϯ֯u,K^VdefbG')8:6;;`QV}[vcˡY8n֖PaQWq~x>x^. IJ0 ƟHPGI$BoN?di~weɵoDcĞ(<ϫkAKwy(4FX ~5ikxMjY0ly,?K|ވ<o8,vrrjoٗᧇ*~W,8gQB O+_DŽ5xZwԭ,帅Hvx'tYC5gcE5KwO)qpr2!WgƏ1{Mn-&q_%F-|bF[GgoءӮ#EpWx_Ϗ(o|wi O$%4@J"RNcpke'j*}ih6|?:leL Gpy_LNO:uΘo~Q4RƁČ=QI&h-g5Z†If"(1k>I~!h>~g}־O|RψtW2A}ubČ챫zN:e+&zx 鶶Gㆱrn=`&B'-.NnƲJ2PO"x%IC$l]H ⟄>(&1yp$u*߀5_~ ^5gF-40lX$il)t;k?>5x_usZZ/.YY^9|ss_i[= !}H| ~Wo kOwu&6U =ԱV+HD>g[U}֚nЖOE wca*kKW_7yg̽=K?Ka?[Z<+Zߜlwgg9⻍s]Ӽ3ꚵvjdW.8՘~s>x/zIuwc:F `r0+l|Iy'5+\]==I!0FI=^kI*3_4QXA/ƏxfV0fЬ\j {' #;_AO O_ޢ63w>M ..<)\G4zU w*D#xTGW]xΝ4ڂVۿyh2U%ꠌۗY-? o3=[g?ćA։yM ]t6x9CIҼEĺn+Fz&BL+KKO|*/!oSOUv{G^ ۨj5>m<9%"2ƙ>ʪ? vt*KwhVR_s| EqIu ƲP'~(~Ԛ'q|5ˊPaC3|ꦹ_&΁c|Uu8v1(^7uaAkl>ZoU>ƒZhw#bݿ5Ԟ&D-VT*O^z/?xy5/V]YPuh ! p__++D3g#k?n?7ُCǂm4 9d;1$vJ*k4+6i^-h9 #ԝ|dlg}K6!ծs!ppPW c=Oɿ}ு? u &^]t^G+9OChVo+ru6 ]Ĵ[6pq@|3Ǘ_{;RIB@WmZv=2PUX*X"2AEnGc|f|(rtm_[ǨZ݀I2`D,oEFI=gNW7f_ `nbVta/++ٞk_ sFq֕Uj?h((+55tUCvٚ:*( ( ( ( d>/@~ \+[]@Q@|4oU|4oTQ?: o….redR ^~ݿ ۞shȾ-&bjnELc a̹WyV)5HK+˫k{' O r*]oaՀMBd%$Đ3+#\'?lT(`4D}EPmF-/O&B;*O+c@i^d-{ZIo ps}38ҫX'<&FE=Ԍ׿f/ |1ZƛZb4 sMl< AOߏoķgho ooO$j"}ȝw0̲.Hq[563xJKȻխZ]@n>A4EcNb_¾^|&(/t<\#lAS?Zܒ2yͧx7ms}.t 4P"Htds1_`[GzZhB.WQ[n;,?g>W/Zð1H,EX7G~{_-/|5i^І#ԲO* ~~g}5kBw$D3>#zٻAyh$վ!Y+Ǫ[KqX9@7; sk`_f.iY *hՔrcWne5{89lu-Z__wKY -y0E3 |<ˀ0pp=k?h箤'_cݼu~Y|#Co~wԴjzZ p|0n6/9׾A5s<3.,iu$7(0+$)=@Kבj.U} o:'nqq/U4//n|76ȾH#_ d|;}dIIf\jR#4 c܀p1ZMo Ex|qjno N2+#mtu̹f{QYQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsƯ]fcW3WE@Q@Q@Q@Q@Q@Q@2_fLY ?.__AZߠ(Ge[z>G VQ: [< x;Y\U<4;<65Qn\]jS??cmǫBGUHʵeΛyZF7ͤu+MծES)^ #kV%,`ߍP'㵍+O.fR0O!f- ֺ+i7f:O7^t=b^[\d#a]C YU9EuLҜ'> |}iz͗gǗ?;wp3A_m“wB?MoUoWDx3DEK"[ÉYCn3qsO x7g>? ySCJ${1~Kq1\-ӫ+)%:R'ÿK|Uя^Qkk}P!B97'u{}+ww> Eq>RJK#c~( /ha_xzT ! {Vҗ iٔc/OV>jOivIh5 Fݷ6>w{]*"Ҟffb_Ȥl? ~Pjg}J݃>q-ϔáTv*<ƽm5|rm0{iEnv >Yľ0+ H2,LπO͏G\W]yď?wm^M[^gV[)S> xtՍ%AG9W⅏?־-8", Ǡvr`\3/u_1V*X=}[i@[8;7p^ZƾG}!%A/~Ƌll..//|wnNAɧ(EBudoO'瞭7xO |g֖o-Oe0LǾ㖝὞m N,[v*yyOPk5E旨GwB2F ؃\/u hrhgơu2He$ 8Z)|QO/[_tOw}F͛P77#9 tDxpBѥMObom[̉0z{o^'wO\kw4 ;ʎOr'"0? liܩ/)@ y$IsXrJ-nos~r->M.]|Ci~Tlk@V"w9f 7 6|;yqURmw1b6#_Z'VMD-2mu+gٯntv>:]a}NRO$I]ɹMr('ƭ޽ ]$'G?"z<|axs>"wu̙2;B[>W/_MnK$ tn5(F>Kw7RYϤUf߉?bxSӵ OOk:-2$UVẉh$d-ʟ6.EWG[jI#dpn y5xo~ z&aYl&wB33 pI뎕'c\U$2XOd&=[T|%+h`ޛg?[G>k!ۖRMjP4@WT`0J;V;NSBU__c[is̻e,NiBͷ<K'⿉`;AۮaڊŔmESǷz"].tV< MP'xADXJC0A`Ѩ?VR|>NvhVc&3fWo W7m<)=c)2Ƽ#^ kړ޷ 6hb'Q <[7F6[:|ldړMcK.5K{(@K;QF09p+NG=}/>ioGAm GB1.q;|=ͪY>1>D2} 1$Fi8pw-E^-ΏOom`"??X|Q`FWzmZj-qv9OƼޱu?P}Yq>ۉd`9Q_X^?9_Kk/:@? N-ƧUK&#hɹR70Wa]*ᇌ")JͦY)}1'&J 3s1|4KľT*fѰ߁͜ o[::Wܪn *qXF:+۩ϡޥOW^"iYK>c+>yWi9$נRӗ<bxLxSCXR:.e1fnSO'?9ꟲoko #8!N H _Yss;ʒ菠g? (NRj^xni#$W-} i >/j+H-bͤo!BTɎq_V|˖ib_7]~z_ |mxK{4 YVB yS4:MZuR,P[[y$rpTrIIMd{mDh~[$.Q!S#!p_៲?ßyrVeL ꀞ{1:b ( (9cW3WE\1o((((K/v? a/ArcoEQE៶gCCS6ƣqir:+38h$oCڿ"KY]F,bNI$5g|>9| F&cEo41>匠c8| 'XJ+8Бk?G0?c&]W[]os%嶟j55bA9"^2ltſ4S8tNm6ncG,r4̠(31TWS/-u}oR+R4,َ8ik~̿ |c=g$8 #ؓ8ۃiGk~%\Mom?t:S5r\dHT@Krϵxwρ߱>6eC /5\W>ͧYE]bS4 a(`:؜t ,DcWtx?x>#~6"ѕt&w/%apFOȹo؇ |UCje\#>';&wG<9;ÞD^]>GCY ǂO+ʬa#k5[ճG'#ڈ[sogú?[͡Mc;KhkXۣ*?*<.t_҅&5R?CWzVn|6%x+ª#B(s#/ů*=[N.%Xݙ7ԆSFAHk9G0#/J_֟hVa,#ǓbnrXORk[Ӝ:/7%4o`/#mk^MFa SE \78ߴ h~'Z#!SiZFyx'5ǎ?c_~?5 kNNHǒJ#=N2{~6?[r/]{^̐tnN3ӌ =cn[+z*^ɴx[Fu> ?6gHشi T9Ԟ~+o<6`,#ǓbnrXORhso)'XN+Q)WR ~%xRB[F-`ޛHW2*x _=?g \l_G[hns`WsaI;cz|dwmY`]nxg8!Vyۜ{Wh.Džxr{}<ٲ+=tkguSuwRi+$Rze* m6 K;xm`APB5UGTR\# i`.`M⬄eb>wQэu-r}mWo-("H1X޾%~? 0kk^-꺜p- ۘR"Ac I=JmHHHBs\?t&ݦlQm{[%n~A+TW{M.ᬽw-ɖV /9"E@Qq^WgÏ[þ];[.bu̡7V<g>#|1ůaxMҼ?,?:i+qqZT騭w~$*9tcydXE,l _>&OhP^i~T7.,xzG>9¿ zD.%$f9cFfח'xXۛ Em{<0v#=ΤvqKff61N7yh&Ӯ$D9 ЂGß%5Z!?+. ǩ Efe [6rb=)F~^ɩN5:oI[||% ^ k~/4TdD8fc!8Rq=gt}VN78Dܫ# T {/O-^-[GRj讯aѐ;V פG {_~|;5ޠC@Eg(p.2'-_ I.%kûZ.VjnP$q̾ "F*/NVgM?DOT|(ӽ-_N|MKOZ%+_NQ` VPىԞ'v?|!4GKvӾ1nŘyK\[Vec~oSϕ?([ז|TY+|^7<, S]WmsFO^wb\EtۮW#yb@^6W2* 3gIXrEMX_Z55}?+_/x~=ź_r}Xq"F94_ygflg/f,~ά:oG2/3o%~!k/jgzpvm&y%cGϢӚ[7?cnFk0]k5{ն,owms,*cdWDU_F ?)}?b|l|/kvx:ܒ,JAudz9Y/?7loJ}_;i[kO纇h5Sm#0084~>zO |--p- l99+'~ y \ęɂ=NgӗY8쏛?Zƿz=[)ZYY G#,ʰJTe\Ѫ| t_ h%mKH7;Y;&jRd}QEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ O<5Ηɥݰ 2 ~|HGυ-aavP7FRE+a~8|bG|vY!ba{;v9hSykmC|-ѓI4"lQ dۉ͙c!稯(qhV|/_qᾷu{duF4ȟ.2G#|eW\?jO9-B$y.c 8$6|uEJNzi 7Tt߃fM㫟zȶI5ѫqҾ܎sǧƟEsT52[R)~3bYv;WS$omME;-  64[-jϩVt{RӴIAmnUQ5#+?9=/f[Nd0) 3$:( ( |?!_]sƯ]f((((/OK/v? `x/ArcoEP_#M?_2-}qX.n]ZUJC5ap=":|F/ 3Z"Yw /Lw洮-'k[SjR*QO+#W$ Q {|7@Y࿋#W>"$,p[{_+#-$bf>_[mo(KJСTCw5?T$ Phş4{SN[>m#bu = 5rz]ZiX–.(BZ /_kz_uYèKggqȣ!<z_ ǪxU~+i:}\, Y9}^S[QQ-$g>ce}5*W 3ƿiڋ෋~xEMZzݫ3EpF]&Ӄk`gU-"kk{VaHBޣ>_Gྍv~r{Z9q_P|0!Þ=BThW!* #?/_mO fF sLV2G xx#$&0q|;ymOxJwz#tV9nԈ*=,JE~_Yn•C|;,O-0wb\6Yl瞵Oxѫ?*O K,|+,)@63a? 7to rٙFz |_Џ9?ϧ״'~sǣxgHtcswf=Y3xZBn]լg4=(((((((((((((((((((((((((((((((((((((((((((((((((55tUCvٚ*(((((()4da/Arco/v? QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEq>xW7-/e%&F>B$27-u[L,up`GD 9!~Q@_gyGzEم?Ԡ0?cŠBGU*~?Y> 6cM_PW?uː|Ei^n"Cw? OT]ijZ&5C>FjrxQ8$ײQ@Q@Q@Q@1owPEPEPEPEP%Vk kr_f V7袊((((((((((((((((((((((((((((((((((((((((((((((((((((+¿6t_ilTTq]7 -6[͏%lc\sv}+7!Ub??Y(?O V q#*?~\(~8|mZ򚻯6~" RҼ1fD &.+֊m#5 4=V0#Skh ( ( |?!_]sƯ]f((((/OK/v? `x/ArcoEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP; jfj諝55tTQEQEQEQEQEQES%Vi՚_AZ߬._((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((|?!_]sƯ]f ( ( ( (/X~ \+[5]EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\1owQEQEQEQES%Vi՚_AZ߬._((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((|?!_]sƯ]f ( ( ( ( ( ( d>/@fգqck,;b>/O7fAZG]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(𹑵 L̡&e?:髞5c5t4QEQEQEQE՚|;6X9g }KG7w? >/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/G륢9x|-υ?hk" t}_o}.Z(G]h[C/U.dmCS3(IG@lκ kM@ Q@Q@Q@Q@2_fLYGój8h|Ör݁Zh[CA3stT}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-}_o}.x|-KEs_h[C" u@G]tP5υ?>/]-\چfPyzth??К(((((()4ddxA3stUA3stTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEh??К kM] QEQEQEQE2_f< VVk# h(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((([Aֱ]-kXBjh((()4ddxA3stUA3stTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEh??К kM] QEQEQEQEQEQE՚}2_f2< V*| V*((((kN"G g2i7ev4vDW㇅>*jv^{X, N3ד]U&ERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ\֩3:t[ H[G"2R :To}r <[~Tt691 qGyQEQEQEr&CZv?WC@Q@Q@Q@Q@ Y&oy՚7fAZ訢((((((oaU^gwwvv>U*ӣz:pjʪs{$ݵ*+>,xsÿ #̩ǶgXY˘9%׎ԟ ~-xs>ᛙakWih*a9\cG*2:o/;)v#+S((WR}?Ve}%^3oxGvgX&>j5!6dGUL&"Zm4Ӣ+C(((((((((((((((((((((((((((((((((((((((((((f 9$uVwoh8;JSXkECgyoZskO].l"S{Tn?P]CkߡtW#'>`!ݯC|LsxWYe1{[Rx(`Hj˔QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVNI-tgOnY]"K)'jZQY>"fUk=&8Wc }'*~!xgƎk~,csmp=J { *4Y2K4@f'hj+?Ck/iie:̛QIqZQEQEh??К kM] QEQEQEQEQEQE՚}2_f2< V*| V*((+?ڋ/ks[LM'- ;cٯd|io~wMﳺbImBƔo*9KnO M\3qPGԃgv㯇7Zލr..dl`V9WLOL>a!C·eP$(\Ƽ9'ᗏtb``p,TJҧQvW ˻߲tڗrs Zz".%s ڈ;8ÿׄr++/Pmfp{)GE*>|=Ƨmzm!e ip<lz?nO ^R+k@gc*N:cҶy/LandďV? <s;ylhK] WaY^\JGO; ]bNxNq%s+4.j={|k}J|Dh=,IF{:υ__~&hisjs[+1:7=xli2||Hl- fA`LI2$|cpTWgERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE|N&/tKKBq̡\2?)4|2;\iS|u][Rm宏Iq-L2H *H 9[K/&C}T7WS Df Hʰ=rLZ I$98v}-c𮢾Xhǖïߥ|]ǀ|G OX|Cm[Uf;>WjFn?|T6^,~ON|FOo' ѾK2'm#:(((5c5t5h??К((((ddxA3skG7w? EEPEPouȼ1SX9&OHXб H|uO:ŞgIݼr8rX29潯D=|CnZw:EKi(o)fǣg^'0ZJQoU{ZYWWy:2k;^i}mOA<jFȮ$E}p$JyA9]~44%|p$k)[!B.-E##{ `vR x:-vKs8|LѳB\dq14ٟ֟vן %3cߜzzxŏMj[i|8c$Czܭ\6k/4 .a#ՂzR𵴷!PY5~˺FfytA d1 tɯlmPկeq)eT~*h2n[I-.|W~^=<+a$#$~xWԾ-|+;G -,`KxO_Ƌs$ĭa7j!u.[WpWsc2Eψ5.hKxݎrIޜ^_|;uߎ!óvvG8nԜqTvjs1¿ ~_nĚ2]ꗍ(fyYIۻ<޹ز%BPJu9Ojk>J%QR0([Aֱ]-kXBjh((()4ddxA3stUA3stTQEWK~kij֩p!(`YXc=I4O 4g7\okybd8XᏊ]u ZK9bX0pѱ>'7c$^?\Ti~SNKukG}?iaq^o5ēAo1InrpPF'g"hn oU̜y9+$<ķzj&~m>57<k^}iѢ vN#ң?lʽ_Z_ſka6Y[<6̅sFT ^98;׿hϏZ_ дe6lnےO^n 滣-eu3EPqvBᴚ=mH6㏸ݫEBu^ZͿ4~z\JItM[ 6RrIS+f<'f M4jG$guwL|k sbﴲYe Gʪ<ϸե/K^_M-n"LXpbdv Ns1׊kOf? }O|Lо*x|jI ,3.a|gkO8 =Y?77~ co>SAn{n ?wGՓs [)b)~R &}^W|Vo.5-krCn{^^mFDWŬȬfvzW5O:ii%~9_uAe mjvWmoNW+5,;š]5,m,K[X]H V+ PxGKO 䆳]_ { ڶwcdR#N9߳wo~E5TM*Q9qlsTặRJ[;?^cGtb!;XU}7l~/@L+]sL+]QEJmšΡmSOᑹPȭj*dM"g߲Zֵm}^+;xyg,JjZBWV[XXI"Ok'4mAl7&j&ٍcqֽ4DKJSo_f]SOOj-ŵ1Hgƭn֚-o  ;qp^Vp o\(?=C^EiEſ$rխ+ykZ*2a~*əi (̿gys藺ooʼ U RdA~Ֆ|"KLGc4fGy&;Lq#8)URJ0nx$1ߵ/T`ӥD kkfnV  8pE1BFG*Z4QP]W'&QE!Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@9/ƕ.+MVgh5L dd+5t?_A>iΣ,ih qn2̀>#hE6ૌS- e1(+&}GvqKKN:M=m jܐHZᏉZt=\BTgW۴U]rRJ<)wJxKwcx%xPnTL(1UQFQEQEr&CZv?WC@Q@Q@Q@Q@ Y&oy՚7fAZ訢(>,-?CG+XCxhwZ bf0W(>.$i$}"Ud0|5'Y[څ7{gΦkIS+z_;UxkvkTў]Ʃa|D[Z+Eko0Vi ɴEWI?mOOݾ چXZBsj&`:.clǭ}kؗ6ۙ_ʌ.q֬V(SV*^um۶CroP{&r¿ښVC0Wfl߲DTܱw߀|dǍcE^|nTmcc:l|1\r;@5Kkamc9o)>jCm0ƦUn5˪jxU[]|x5<^mEo[.Ο$}j!',a7L{װ|z˥r|O"OR,čF>|uk{H/#!x a\8$`*P*FݭmuyqUJpK6ܺ7m?H<":}߇[讜N_pֲy_80Glr|̚>0ɀY Hіşt_??ReUЈa1>0UKכymoQJژP唪U.mVK^Krի|2cM1g8S.E*3g]Så-\fitR[9i>dGX]z}Es,r 5J^jE{-z1y/ok{/'i:Y&\oi9W2G5zm~ZukŶRv:e)`ܬ6\(}9EjkО]tK~N(xJuJmߖQ}=~ Gټ/?je,./o+K qY|3#-ƖD:w7J O/\(ʀI~+][2֚%r>icPUFcgx6c"O6:vR=|i\ 䵅$haⒺ>vt}gƟ+=k!hZMrE~ tnđB;*o\[J4p&`B(sõ}WE(K%0) (+5c5u5h??К:( ( ( ( d>/@L+]sL+]QEQEx$v? M-{C {ܾ_Wh",&5}υ<2Gbn-`UN@C`V5Є$~ӚxOǚ6zFd) Fsk_>|!ᛓ &b{6<@=p68H}xIYãԺw|%][NXX0xb07Q Ka|7_3߁zfW5(M E8+%ٖQ拏sX˖J]a?|O_@㢵jvFVܡ ;zo~\|Pt=*+jPwvH˞R{^Ed7XxGźZB!D[GGeH#=zW~)B|.O9xWn\ w:})rtl}3SiwyjtO!~О5K1KA?[BF~T+Oe!z`޾ޒ5 : aj]>qw_*0>]CNm[G=7R]IŨ(i!'>Vg +IK1V ((((((((((((((((((((((((((((((((((((((((WGč'gFY-c8$qNψ/~Ŀktwc܉Ъ_66@c=}ōz}'DPKm 2 y *hǗ27]?/@L+]sL+]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEr&CZv?WC@Q@Q@Q@Q@ Y&oy՚7fAZ訢(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+5c5u5h??К:( ( ( ( d>/@L+]sL+]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEr&CZv?WC@Q@Q@Q@Q@Q@Q@2_fLY/Cգ'kzZeW< V*Q?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TO<+o[F  O\!c ((((KgjOmv=Gv5o]O~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?'m}7ca5c5t4QEQEQEQE՚}2_f8?V?|So9=kG~?\7fAZeG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(eG ?*먠G~?A쫮9@ TOQ?ʺ(o7o&c8,3]=s& ( ( ( ( ( ( d>/@L+]sL+]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEr&CZv?WC@Q@Q@Q@Q@ Y&oy՚7fAZ訢(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+5c5u5h??К:( ( ( ( d>/@L+]sL+]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEr&CZv?WC@Q@Q@Q@Q@Q@Q@2_fLY &o&o ( ( (?h/H/TbM-9 ~l҈P[zEϢ>((((((((((((((((((((((((((((((((((((((((((((((((((((9?i>54+B.>..J,6HwsY(=EcŚg;{fM<*V_WUjگ>^_h@[^e;i\v} Eyύgk裳Gִy\|p229tϤU5bop) ( kM] s& ( ( ( (/YL+Z5o]QEQEQX1"~ϳ6k#~3ˌ81gxSTφF soi7ǖ=)Fp]/-~]Q1x%\u(^;s;/&{>6h|#&s&RNL}Q$?CTÞ).f7ƞJp}jt=eM!gynfһi{U^4_{XYDZ󼽙+X\UZxs^YxPw &@4JN:!''Wxty5M{QO^H~goXM%[W7k/i%e6WױZGyq|»csߍ}1Nst +濈_u  hm!m1H.=G4?fO$\H!&"NpT<QH^7?&h?oIwٴymB8hm5i|=K_m|v\uʦ}IM;G @ī F6"kHf@]3r8ŠYNڒ̻ bEQEg\·_geLdPIxJi6 +oJnh1uGܸ9몪iɽ (Š(((((((((((((((((((((((((((((((( YneX-FId8TP2I=%x׈{W1J!e#G㌓2+aWgJMGNn4z](7)$>⟇i?m/HYOpވw4߻G]EyOߎmm}A} RFdY6.6t篵z>XgFu)&i[Tw^;"_5|3QЕcݦVKWU㭯=fږs؂iwm*1dp@29z E[Rԭ4{obK<GrOJc,^ kZZ}z&qjKjҘQ "%{>½7@`Kߴt׌{2VHs'h5GI5:/\E$w$c$dq:ҏku%{6=kQK)xT,2=2*e%]Mz+?gφ}e=N5uOTWx9;QfYKyh᭯J\&֩~2k[gc-#QԟԊI)CLJI$؏Oo:v A믪ifJiꂊ(0(5c5t5h??К(((((()4ddxA3stUA3stTQEQE6I$gv2Y_ ?zaȿl{Im/mFXC*\QOE-)]PO33iT6Z.}*d` 3x5kZǿxAgqh!W:gǀNPǰ: c<i6)E\'`kծgoZ4W?n籞"$1adow+)=>%|5 +m}+ 9۹v2#f/~=Gkڹ爭|/oy{ 7*3NI }3_gGc_jզ.8J( 6rNr*}hƥq. Kwv뷷ִ[g[+-Ė^3'($iR$c`C/Rq?jOZ}7K=[R?@*ķ|5V?>*| 񅆑㧓Sӥ$9F O}ஓEN1%Qp:>̮WFm=4<_$v7CNC##vC͎Ãؚ_^4_<&E-d٠[#!°tF3l$ӭiʨI%O5-G敩qEyea]{KІ,"UdS4grʞz kZxoF=:HE'V?|yex%?b߁M\&mXvv amp~KiIa~JS` %(9rӲv_=j|QԼ]mM?te 䥼I.y<$}+Jm?O5x*F`(Oh%9AiF[ _0y yjH8kc4ӼE܋:0ć#̧ Q],RkUO߾o~<ck}:3i?!#!}+Y|cý7OҼ_jͪAvPrs:|'$?XQiG<qvnoyZIOoT`-庌sjYd3F.:#q\8xɩFZYx?;GozɒN8턄E t'>k7Y-#Τon[|~QeuUwPSWIj%xU3kz_귞iUKdPptʿW>'wjs@&Ls|A`+_Z?|Z2[̡ݜ9plq i8[ky/a7]y5 3-QM HE$yu_5߄?4 gLֵxvs8k~9طdi-L:VụO1GH?m} 3MK99_P±5焎 ^~F;zpZ9߲º.ex8m.|7kf=~+m{ƺkt(2(pac$dg#|_"P#*?%oֲ> 6um >e T z ެբ`J2Wg C5n:JpI^^ROi}+zwIn5 x#_*d1[cAtb0s|yS3-[3v}]_ZW[K[pI gbǝ'>BGCESvԜz ɱYc< c:~RKHϯ*=O^.ͿA6kwe$E18gY1o޿ğ;JhKͦ/>pdhnb M#7Ûx>xb$Qv:"PmLF.GjrM+c9O TrqMn׹_Ga< K<=:Ժ{7Hfd*/8+NN@ǿ8^.?&L/ҵiD2~9&@p7ω?'1CFYgXd5Ŝś*95߶'?𽿊!x;"Pc]sW^5|MObe7i&ҍroV]F' Q49\KFmzt?H7[xú^g욅WpD \?"J+MQ:q6QE#(((((((((((((((((((((((((((((((((((~!|3~(i o>5f2vx'o]]YxJ{"9 F [WTK; H̓M'E'󽥟jIo/LJ>[E;gԊ}2:H,Ǧ?e9u|DmweFr@~,GjF>|L$::Eȶ&K8·I'b⡴S_-?^էбE|AѾ0xn n9;tPF|`}ug89 OLR4(v8_bOA5ߴw¿C7>/͌>" %~͸4J3Ǧkįxூ4O-Uk6٥tBUQI8$pR%_+nU8mg/OŷhI q 1?mGd u|Ѽ-6[NYI5KM-<&t=ZwA6<Ӹ)(k/2}X(((+5c5u5h??К:( ( ( ( d>/@L+]sL+]QE|sGFw dpU{ٮ T#us)F80_úƿ.5komiq f#$R:^Ɵ>-|D:1y6ԔҺ Y7O'bos_%jZGIJQ2 F}X;Ym.ڱNXp^/u9yZx&xIu-:l-vB[v\HJR;+}7ɂm#F+fOPuYҽ4QMhͿ/ɟgG^ִef$:5^!Ӽyoq\\B%ĶJ1$|CA+o&oÏkVJpGp _,~tڗy!xRw]A?wtNMv ٤6W^ MVmKdET# 8~%|+j μMiYr>p6tzHyy;j3(;JJ6ߺsWzmٿӭnyfhBTlɵQߪ_wφ~!iVZsXYAiDaPg%6G"'kam3A{H{]#ξI]jLWsC$A'fR Wfc[㥭on6Cqpu Wm㖹S$m纶l5x9n}s?#]BS4K|"O{5%Rw{ KxLHȡK0ּ;"4m15aAG؟^I'rM|7G?'HCmkT[@qћn5-{Iw_9.z>>~qtX|&2{`r}{-V3\_|>+U4׉d5kkCi)sa y z:Wg2'ƍ5iyfo-7nl/'?LV ݠ]EKO]YDukYWYwF,c0~a5C^_ǯڛMҭ:-6e|_6S+B qlkJԹdRdd}ֺnaxfZ{lݞtg?"V9TX{]_$d+>~ <峏a][# Q_wRnt[xt/|5o?[YAu2Tr\פϾ8_jؚXKfaI ҄YG k~+|??VvwX޽KJݜt{W w-4rG<39N_8= e|)׀']_\ %Mj_; _tb8΁xw+y[[| fܫ6XF1xM>B6 %1 . 1$VDo*化B]Ӕ_>lyaQn+:xB_ |C5™ǘ?k?d~,Tۊi^K25Gh ~f{ c/?5W/xoޕ߯XdrsqN}_Ww_'v{Xb,\ƁKO|O`˟wZxº>/}g F?#_?)bQ{- m_/4GZ.VRw *OVg?uˏjr~kn: $b߂2za@>?A~0-?x1I dx>@Ҿ%x2Zv ([QHn{Dn]RZ|>LVGsxI CZMKᶮokCƗ95*CB޼y3xvF\rp{uZ  >[~ #5O՚{I|$y][z?NM&=neJDb;3sЊh#^߉-#mHA=kz2+~_I=QEIAEP-kXBjk5c5t4QEQEQEQEQEQES%Vi՚7fAZ諝7fAZ(ir{9i Ш'dV2JIqn-4x?nZ.8bNwFs5u8x|xPI_l |ߍ}Ei.M,,4iGtnb[2nGSɍӞq^J:j~<:BA1"I8_YQPW]MgiNWgmA5$q]0]@xּK>+(_.˹}]ϡh7Lr})su)2Ǟ1(xRnK>KQI}s@~CXjz^W,SˊIL yR $0=--|qԴ|e oP9M 6ඉwկʵʦsuy<^E415{yQHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^Q2x/ŶQ*qfcȯWC2%'J׫QEU (Š([Aֱ]=kXBjh((((5o]/YL+@Q@Q@>>nR!)=E3<\X3I$Ҕڎz.Fpkj*)U~e׸qNaMCO$}o>'?F *'o-⿋Z [[Kq-#y }8ua~k_< ^tl/h;"t ҊٸeBXtjp9|el湩| F>[v<_'[Z{k\؋ͷ#9S0˞V=[^wK2Y(@c(*i._<S 6+KZ}NڞY|5GXe2M;f\:rc\,u\=귰|H2Ť,]N}k+8hGi{Ljeo(R^k~8 t^֮Zq^eH#$q־]D|-=iqx~gbX"z,9ѯSڻViyw2;AFt,⤓<da%jK]|/?~1}N񾱢U{M]{?`vWhM1,!X! (U)쬅쭩5wn'KtRkg:ogsvo$d` {WI{OoTQEQEh??К kM@ Q@Q@Q@Q@2_fLY &o&o ( ;y 5!G*J)osQ^uӂFk_7짪5ž<յe1#^aʼ8 sQ|@{1-sy4%N"0<`s^(߲/6Fu7n<5u1\ mO:]>"麕mqG#Ҽ?w/?]_|;]v|ss(!ti+xoO?g%Kk6ވUUA=:ר|pKx/Gl {` ۳Z6q뎵4PIt@oOR^)5t_I{pe ۼmWx?m*x0j˨i3Y<,tch2y^E9zuVNٺҼOiEJ i7, ǵm8q<u&KJ>t߳}݊cq3^56jw] Ao%N;^>QҾ>E~ERٷ"Zkz}okM*vXtn9//C}6.ѻ-*).^nO)6 Mr+]\F"_jkXKCo46f4-dghz/Ad_Z ?Z}g} Fa CHض5?? i5WfU2z0}ogz K[Y">''$ԭ*Zzt:>d#Cz]MuYC3I *sRּl|c]^-YyEİGPpOpF 'q_GQIgu)i~RtST?|Yj]dGk&;E7k׾(| !|;𵻝)t]aל6N<hߴt]Y_.̏;dv| n~~&ՓZ-q8˜` d{iߨnERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE/B(|ؚc#=b+??KxC_ѵonch5ea-'$`SFrp3_EJwǐ|!{{Toe׼aF 23 u:vQP_Lğ%'=h>Yo^5ľc tfڗ>jHNQXHZ7L/5Ri8g̷>|~63д=S~ ѭKI55%>˅-8?Mkk>%(cHR6H!I`y'5TU]Em-/#ƚď jCɢ7 IER"&XPajZI%-keGonǚ먩<21Lj~|iG>%ĺA| 2Zφ??W.aMB'~tU'enKV|uƿJX/oiJtÃF lds_HQIio"}ȭmb(!E8ע}i3k4vDkxBBt* '>E).t|5󏀟 a5K+53U@*ҹ~Xռ-w\5q$$O@!_1^׵QW&)>Eo:zs]DG摜(_%zթ<C])mtnH ˁ~T%d+3&mơ^r&ԳFe*yV{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V{Kra>V°|:"(UYF꫖5c5t4QEQEQEQEQEWK rsF G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| ?1( G+b~x| GE_@E5T(QEQEQEQEQEQEQE՚}2_f2< V*| V*(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( kM] s& ( ( ( (/YL+Z5o]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW-kXBjk5c5t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*(((Bַ7ƕRӅ\bo|m7zwk$o*NY'.c=qr9 :( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +=WG>/|G|->+bh R{`IaҲeO̚~ƾu9-)O @89##I4oDN-Z>_ Ŗp}'YAIb/_^|IAn`m8ՆVlpGPSO[mOTW| oźOkf.=QEQEr&CZv?WC@Q@Q@Q@Q@ Y&oy՚7fAZ訢((oVw~(%/%d2 b8źաHg`NcEu)bTp>i&&b$(wI[KuTW0ǾiR7HG]㸌I,g#*? QqDǗ ++X%xYuҵ{1e,^ hg?}e>Nyi$}"FbaRI' >-b*դ^Egpٓnk+mSlV f`2V9? Sִ6}ma8]LXJ 7ʖ*Zjqeu t@qViӋ +!|a|,[Ӛ;~.2gnsפJĬQ_ ~՟grׅqȓFFrB LdZ1WM@f>$8ҿ#dٷ^<;v(TX9T+O0VU9ѮWn@4Vk2ܡ>sЗS i)%>PZRVE|^׾4kv6 ܒa< {|pXl((((((((((((((((((((((((((((((((((((uT7ݶh8H[us.;5)W;x?]?!/x\B+0c+ܛ̶=(QEW-kXBjk5c5t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*((Ꚕ>wrJZTdU,p;)7ev4vEoTOC-}Ow+^x~{EQ40ҾX?Ð UM5uBmjփպBD"@!qJq_O G~&5^?\ԼCkX kR)"K"=${mwطyI%o Ifo[D0p0bp}0;Ww_;~5Q^V 28n'%+)&=Ǩ\ znLW5Rژm( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9xu/Ka5vZXbS4`n}k?|X_[PӼ`xKLk\H琌H#1G'4FtLfUg*̠ ¹_Cow7:@5ht.xS7:qmFҖBvVSK'mBN'|E awB2ߥyw{ZTxVi QiŊ|twog߳ǒ7x<}C3 GFXcgm=VMzm̓\cf;|a|Fֵ&NhZ2A `~E|+/ 6dlj>G.#MszvkEoÏU9_{(C (9mCZv?WC\!c ((((KG7w? ּdxA3stTQEQEqx!&>6+ __I{ >-Ͳ"[O>q ֣3icוZUcWeh{kW=lSS=k绳][>|4+ /o*%0qO=N+heg_~2xHǪ;9a5W迴T8"̗P(9}8n;sI[Z׋u_ڍQ DL͂:gW$uwh_'}OgxΜ&9^HVֶȭ:~z/|A&᛫[Y6,qW)!s ״Dw{s=5^3y{į|Jx3E| 6I {KlxĮ%w028h|$YR hv+_1%E~`p} yxuZ*i]mOsͤWUKv_}1kuYHsٻ 8Of>:[/kzqHO{ie4eU%AL#q>3LI5)"*G) jAcoW$ٽ6˃:639'u#K5ɫⰸZ9E5!iŷe-R?+c_IW̕ :.pRI=k;F?<kש~q?Jk O |fҵ5Ω`3_)3$gʄڏJoud~|Cė߶7cgYMXڳ1ګA#,:>uRSEޣy_X<^0;N!.g$ҷmw>hMk?rio!;d44s8σ?ᮟokzε"[7$H}؂:ޟ<K(XZrK9",?fxb=N6;eClFߓp'4c3 J+ە>>yb<19s-to/~Ku׉>~2|.5)/ ƒ7R~BĮ@*(T㷇bMAVr+#F~5~ܑjntGz.#iۙ30cZQ.!҉siY?+i|=*ke(^{w5hOoSewķzXEyʫuYWʋ9*_O'=|,MV2Le͐V%A| WԟO/yWI/cW4#vwT3mn^֕TWåivOMcOl<=i7j*\ bx olo2|JBZ(O +ȓRWj6ϭ`q2^L=;?~^*bٽ-@?0arw?|!us%ƛo_G# ;ȫrt'd & yzpr># W8o2.RppVKemJ?!#!z7Y.hw-5mثʌ̉SQ ̟cbx~Jâk64L|dR6!WSI:?K/RXN)_k}o5F%X ĶMwPW1~8ftߊ>M*X͗6{nex;b `fj~9xWON|zu;it}fPI"3˷5 luinkG`j ^q+Imu_̱{啾MNf9+Jcj~_ĭ7]ʴ ̞C<;cA݉'Mz?/:'3,fmsM2' bx䝾G,8N4MnkF Ab/oƥ0uվo+G+dF "ة?vw/nK Rּ%W?]Tj[UO'薧%Vv[ĐA(*Z(Oࢊ(((((((((((((((((((((((((((((((((((aY%OMM_?P322-D+s[\Fwq ikus\] jUS#FI } h6fc,K5Ʋo(}a|5_|*WL-\]I5yY~-GwƓq[r-ɐ'J $84_]_7[kW:Lu bID%2rr=ZfVZ|c%hH;d#a3ߏvu[?6څ$D!Ԋl/YWˏE{F|6DbR>R{?(]m(0([Aֱ]-kXBjh(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()4ddxA3stUA3stTQEU-kK\ F]J2]I1ӺRs_mx6>2+~Tmmx=W}_Pz>#j;J-+Ft{f-?rdq[kk-ո+ #فVτ# 6M9DWT6?a+%ڤ;yb}OEM%+h(0(((((((((((((((((((((((((((((((((((((((((((((((((#~> iE-#yް_/+ qjd3؜׸QD}݁ۙ ޙGln˒AFr1x/|YrZ 5tRKO?Oe<:q{tdc{vQTdERQEh??К kM] QEQEQEQE2_f< VVk# h((7ĺ |;ho$v$T RAd~*oG(:<>"JU`=ueq0Uv|mA]#׶h5'ԱOxm`{vMAJ_%W3dwRQRPJZ?3\fccJ\k[5|;kw6X+|ƪ?uP1_w~Ȟ ?{mqK YF,j ޸{u4ZV䦕h޷u12wvWy7ٯnC}Y$#L$ ;zquM{g9!@I|#Q[,=?~yK1΍*i+n|G)WNj6:uId9ħ z1 [kuMvyxTg%gTQ).oJ%)ۙiu_?oÿiZP^xytx \ X$ޭfmr$]cn]JBIPeH% { Q>oݯ{3œ"V掺|N-f'9@_B|0Oៃƞ,ټɥv/4nw?km-<͏>剒yGAWmEgGþjPI4i,^"Rf^(ME,!Դ5*èG E|Ѫ:~j 5X[3g,Rqɯ(_ĵ*MYTiA=KudU q?s0l*;S/YZ^ZڭGO FQ]&9˞VQ#NQ\v"qRzڤmJHm Qc ;WWi_mozֿ9c ,fz_xn>1MC]}q;X f챮4Hwdrǽ{%԰r.[}癔+SȦ\M;sGdn۷nzuǵyG?oŸW@5ˋH: $Hs;ױ[ʌ'UV_S;BL5) ]'E2:߷}χmmg޻ |9grh~&ɛFY!p0r2~ WUEg-tT+կڦiRi|Qw)l"r5+!6~~w8;>=7L8<˗< `WoE4p) (+5c5u5h??К:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( d>/@L+]sL+]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEr&CZv?WC@Q@Q@Q@Q@ Y&oy՚7fAZ訢(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+5c5u5h??К:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( d>/@L+]p.t:[22G }?Zw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@M@;{kMtTW; 5?&Iq4Q\$ǿ?&=EEs_hw@h??К/+MjrNLqŸOր;+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:*+wG$ǿ訮wkM_hIq4M@;{&= 5?&:* kMSM@;{Ե93!~Q|7qk֞ x~ #c,c$%j.GTWS|9)X"ϒl6i0kмU/~5{iI$NI)Z#b|b)/׏fY x  Ңƿ x[V/MnX㶒LnP@;;WѾƝ Y|?>c,"ť]Uǩ맯= #IvB\(8-5o([Wo/:kmӬaUny 7@,I_M}{^ZG "}y<$JI)KDJ1}mU5;;YV"&g9'%S~YJ6۳NS3@푭\QVЭ%yؑ$_n~..-+ɾ{N1U6 22JJ6k+S*ʰ9o[<[m8ϥrw|MK3@t՘?|6'uԮ|q~Lb?ҲWo_igQQ'*(oVt}o QjNiN/iCH}'UzzO^qCGJZ77X%2NQH/]itSXPگ,6610o#pAۜW,^樕s%AJi/Tk]EyD|=>xo۟ܿȎI c~AN5GW9Z^Hl`hdGRX%5_R?scH6][M-׷Sթ3O&/Zkۡ9f GG${^v}'zs_߳z<s!ѡo7w3nScc}³x@^ǧn" CY8fu!xU-{'{XSc˖fy])/{5~xGy˧xwĺv}fg;`?6}_M2n 53G%~ j'ᔗI狑s#ݏ0m,WKٵ5}__S~QBW蚷/g=h=xN$hl&,|}k~*G!?Y|>e,B>O#^Ow~ çKB[m$ۊ-qZtKs85t}ωʛXh`TswkKk(;+L8bt >5xC6=ׅQz i#h=7#":Qr]/S*j *RֵWZuk{jFW+C?>]VK-I#PNFI^+௏WqY.ILp3cPNY'8~^_cqΝ_c/c)$vnx7/~!Cs7=n+fT#$ tu_E/+_ĚŨ]>6}*3ڪ. Eft#xʣevOTW|4|V#tmiդϕgB<>Nᯃ,ln.rGLYGVX:}>ȩ*hE('y.\3O{WiLAe l<~ |XW:]B8Hn8dgFҗ:wa*PI9][۩Q_=鿷wMBmo쑎̈́_;?^ZmipXܠwzaTq RRf,fW˭2M\EVQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE%Hci$ud4VO⏍v:VpO$đZd=>B\(8-䟎l>67yku2n 0T=+Ծ4|`OXj0Gk|=ꡱ\KOEW=n}JdkarH 3x^Ųj:/^5+G# gl“xok}K9qu8 *r=r9uDE%Q@r&mCZv?PCEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPLY%Vh# kw k(+7ڳh>u4Jv1D-}JME6ƓI;ddYbJ:0e#;k;} .QD%Y",1z{/4jťޑo)*2`{Wnԇj_ ;G/y+X}ETW-jn[?|'ᮗ[i7gsz1}U3k߳m!s%޺P^X><|D'hhϝYp{R?oe+<#N/Jr.r,UU5=;iE%-=9! ?:5!dj6Jl`Q gksĵ<Kn$@~ ɧtw h7So̺UTRȩXo?OJ6?UtoxwC61wvLN>o'oa*n?MxM ϕ%g_}#wj#ռ=;x)VOu55# d$Cco nF$z}³u eׁt.Io|itG4vvF3{ך~*mY׍>IޙkMmg?9O{>颊+#P(((((((((((((((((((((((((((((((((((((((((((((((h:mơEeenf 5n>Zx zMϙ=Q A$$B5 vk'u?26$ݨ΍h$ e`Gi?mOiUG@JQ/+Woo B"(U¼ΧXVq*c!`8~Zz~&rIi շ`nPq$_'GÓ+o/:ŗO?z[ Gp''rk1q4J6̕ecM[ <,a]ITm-KV}1W&үZ/ʅrM| }o5|nu]^Qk@bPH\ p_$<kG^|<ޜ7_/ymi/> /^*'?AHURx.ƭ"_}Z> #<6w|ѵY$_^e2bH9$aۃҼ4՗|$Ʀ f=Wuo-{84㰞[_6xYv7M*2i7tk.۲gv>0~ Bg:pttElyp `_BKH~g/]|7zkk>acz;(ˆM'A_j_-V貔%wKUyg{^UL5?vܘ#/uea^}oò]Mr?0VPpKWXZ4SqR\hg&6~<|g^-շ4NfP wU )B)A[ֶ&%^nVŠ(9((((((((((((((((((((((((((((((((((((([Iv41wM.fbrI%9$UEr?| BWU]=g VH$j:*aS@Zޤ.~ Xa% 0TE*j(` ( (  kM]Mr&(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((/OKG7w? E\7w? E@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@!c {Aֱ]EPEPEPEP%Vk# k^_f< V:*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (  kM]Mr&(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((/OKG7w? E\?i\]E>adBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEtTW;BEa'-PEEsa'-QBEAkXBjkʺ&` v^?tQEQEQEQE՚7fAZחYKv.l.0N~(w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?訮w>$?>O[#~O[#>$?論5c5OBETʺ&` v^?tQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( kM] s& ( ( ( (/YL+Z5o]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW-kXBjk5c5t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( kM] s& ( ( ( (/YL+Z5o]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW-kXBjk5c5t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*((({?k3jšg3.X*\6͜{Һ(ϡ(WXȍׁr4[Kc(y-M$dz#RZ|/G0kzҪR( Y c^I׷C~$ᧃoEym5ݽ@vVo?<7qY\X ZJ,[<0_|'ִxBšC%E"shٔoPA Sӷ?a%:QSo6&u=QHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP7㯈kè>i '$r Ig _jCTtrR!VޱBlc 0<:<]x>uKú׫^rcfv{h/o:oq ]HE8eܱ89j7efL,=˗RU&ڻ>ѢyoAJլ ,M7) GB|߶~ }}S@ &}l;?$H[לc4c zOg~4{3)&kߡQjH|)w fa[ DȡNG͒9g s!:I':C]O[x2i*|>Yz5tNsE|Y ^/~E調xA׎+gړcM6iH$ p^7n@##3 >"~Μzَ|/,Ez^~+J2M{UkK"𶑡*7rfgnȣ{[d['FABnFy2)Vlv3՜<-98lݝݬVsleWMZjNQNKM^V|eB-iBX\0Xv`Az[l2MzVCS9sVvkki?^&mtk2vܾ Q9PMy>+~ǜyٳߥ|߶w,7[$^~a <o>M}?~|.vw>ǵ|f;[ t~,43*JMSSͻ>ᯉZO5]fF}k>~ɞ=3? P5ڰhH.;FT:W~<;KmF)5=f+: LO@pqr-{6w;|;%<|0-O*8^R[E|T'[-16~_b<mo:,0X⑹#뜁ֹOXsopR|I̠*gk.P"tJkk> oj6WsԨr\Tl~*|2񭎟ugekC ל~S%u,NF֌!bA_MV{R+X}!e >a(h(^c RhSOҴ}CLOn`[nyj_jڵ՝ƭ}sif35!!GpqI6GxY4ES7QwOJmFT)}b~}4ݥ䴷{9VSF%w웻R't_ xNڥv-(qn>lH|߷_|i]ucj~yYeob }77ֽ,F:JG>6r܇0c:j~wj)>mk}E|3~'<)_ G1CiXUZ7H93 N(WJWGcbWk(Š(((((((((((((((((((((((((((((((((((k.}KUOwIq;UהxNmGAN\'$ĶxITI3/o|JgiDy2E8ê{Ş,ҼZشml[Is*O$t_*:k믳 S83\[?oo/*k ?>_uƫ |N jQU_KĀ~t\=+o/6VPm2غ%v1.I $ף&ENAcA*"ǖM>j\Mu5袊Š(mCZv?WS\!c (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((K4o]W;o]PEPE/!&$7e3[Wsݣ0*dSeEs4jC]c5k5>dl2zW~˺ĝSZWQilok7w;QWOvwUm#b9grfݸij"NfpA1-OG!Z'$} U;(~+!$ʏޓ#>*VW_mJծSYw|H޺I vRbIQ4R&fr2+u}WToV|4ꐡ!pNJ8_ @ wy&9 U~>/~1jw]2nn/,6c,d̠d*ocºeƥg5ؿFe'2$'?]Mˉ{7T *78G|=xgᾥiWM$ax]H#>SN> PўERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWΟu>࿅2}:j[>R*]]| k:kPoL6W:,Ir67>H`zBMz}.{66[ư‹qUME[Ŷ(C (9mCZv?WC\!c ((((KG7w? ּdxA3stTQEQEqx!??gtq³>(eWk;G- }"( иUUI_6> /i~7^43s-h .nFq+汘㽛Z:m_C g.$Rҋ<:;Τum ~>mஊwbϝ)G[o?ed:ɸk9>֊|оnݙ*uWA_Mc[7eV88\*S[RXg)_z`0 *Jy;^pu_<}4mRڋ "xل*#v0s^gௌ?rҴMR{vP̛wr iQ۽M|?fuF׆ 'RрT ǎ+g?>i tohd&hc]@=s^2YkwWV*^Wg#0!R~N~ңQvj*QVsNa?럔#4kO~ݒo5֥Іe1OlX h]`ןF. 7GɟUV:y7 䩇nRZt~?Mg]mq&Ηk7|i:+^[_SWzmi7m~m/o4GR?"k Pu '^04mO$w܅aR?cA{8 X$i^nt.?*59\nIoKOOm[^]SP[7ڧA\WiֺSK $iYX8:ջ'e;N&ѵOE, [쥂9ڸg&/x?HWE`@{TI-Nk:|kKvڛXϙa_t\|MjR4ZY4&`z*Y7<<]MYi/s:ٍXZ.0JJNmɷmzߵ7pQ p=Ъ"6X*2sF+hWO[~er)(?>@$juEpkg!9#¿<i|YhG}<_i7<bfBdsע~׍eKLEK׏g_ $湖a1`n;\zWK|r\Ҭ< ACI4!BڪXEG n< Ϡ5JOљ|yCF>Jxj ]$rȍPO3W|SxxkXС4MJ[uvd.'lB< _I_G=gweV#nqg p֣/JqQ}4Ƨ\z_mo!~[$"O7?m` ꢽȫ57.N3TQQ⟁\<1+m/\,%Z2{U"xWϿ &|^ -~'im4lLx$:n*;a' ־-|1?+ BNePX_߇u2o' #0E]1ֽf //6OmK=So Fq٤K&]WdPn K뫩|>+c?Cj 寮 uk͓lqN:?ioizdvZ?#@-mɝv}}MIK5:Yd^Fa[„@< q7K?O/ėnK5 QRPQEW-kXBjk5c5t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( kM] s& ( ( ( (/YL+Z5o]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW-kXBjk5c5t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( kM] s& ( ( ( (/YL+Z5o]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW-kXBjk5c5t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*7mbVY cֵ4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4!c k-„@\ºZ((((ddxA3sk% k/4*P>Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4W-kXBjkq}/UP$J<8[Z X)o6K' $|7{.'ËFM_Y7uv<알c++i.['.knETQEr&CZv?WC@Q@Q@Q@Q@ Y&oy՚7fAZ訢(+母_'>W:bՌw6иL1fU t9|cs^.l{k`E꒾}+''^ 5H'Z(lP&}x,gzkbk Z~Gш ~:xc㖁&IK>ݏM 0$kj_oxV\\ Y2]-ۧ5 x5jMNi f+*xz*RsWh+cy{3u|Wו x7,dm5YCqkͯ lix;+ T6[Dٳr2KղF||ja:Se],mL0EΔ~'g9mߴWu薺 =ג>O>5!؜W j4V֕xi,KK1;UFc-{W[2FpՖ\'@fk^kį7^^yWN( y2r}zV K~ᅂf(XDc"F<ݫ Iψ=^"SҢ-Y)ʠ<{]P|ft=F&}utdLaFRnn#o3ӆ e>mw{CLӇXi.[O+*Yn%H-C$v($ z:Ȋw+ ;~1x~ş |]iy:qoѐ>?TNqWi7nGzqZ.TMM>po"ͼA&o^xkK%hwHڳlࡗ&~i1Y}DRF^;%z?gxŚ5.ghш;Inq*8=m+,t]G6757"LU XO? SN}/zL3^M$@܂NI3z?9~՞.No+HUد(F݂/^|thN\\I^w`r:=EO Mu4ѿu;^Eޏv_`/$o[p>a+//X>T\XjI.d*'#8Ro<``1= aԬ4}vA_UϨaZU#)Ec%f<3_mMs cZ湪~О;{o N<9 6:}PDI]Ì`i džUp Tya€ RWCs'؆cJ'-ݫ];lE \}:8Pm:gtWߴGU'/OʑpS߈Idn qʪpFr@2y><_x\ӡt\?D!zIC{uifԗ4 JvrKOקJu 6>ϻ(&>9kBiţ[hU% t;XFzqڛ=[Ú~qO}JQm.^bvh'm[2FPպ6 biKҟ3}ofmAE|j>4|YdbeBH0GW '/^@_6.mAbc`L!Br*e5=$Tmu:TSP#3>kmRޖ>?~_~|s?MF]Vk.* J$O )iJwVviy##Ugh.頢+(((((((((((((((((((((((((((((((((_,AJךMq9<FύaPC_HאxO~7lfӵ cQHtTP(3яZ#HB_}>袊(( kM] s& ( ( ( (/YL+Z5o]QEQEw|g7ZM4r4F%2$ =~5~Ws+5vǜP2ȣԀT1_wW`IiKXÚ.7 .r^)v W^.k?ES-yOgJ3ҒN\\\Ego,ʐI*I=~ K oMJymɆ4'N gsh?Zdxϣ [7Q麾fpӶ([RTJk3RIѯVOS[ws̓-Us**wk_Mw_"ēAº_HѰ}B}Om o٫dkB=ڢd7M (j:/?7vm6[w^C7-|!<+im_ r_;$Cd!UXSq^^ Z9ej2+/Ow2pUs\:Ɣi)?崵#tI5kQK#Fa.C|zs]ƯJܷ6; KTuח*|S.Op,*գ9I;ۗM^?¿r?tuT>"FᗀuX3ki"șdw*J @O'ZuZ@O3X%œX?c_\|[Ír+Zm,X2#WKS啓Fec3ԄI*rպy?|?'~&x]0NT9Bz򏛏o9k^Nh"gm5߮[Yn]–!WH;֦nֶ69POL׆u-YZf xЃ؃b9n?}~~K{_[_Kc,t?VyAi#&4 -.eI1x) 7?ah̺uXWSqڭ]~7 u2[;GجǮ6B>[{ݴ1[ٮ<;N*%~?hj᲼T+T3ǖֻ/Bk9> Y=י~џ|NJڼ~VQHf1P Fp:g~,ixzi`Y_86O1m>S`'&V޺Ie/K^0S̹'{zmZܮ ,[H.)l~ >{[7mbG@pO4##$~5_7xkDVhtˏ2ft;W~~|GԼA:-ݝΟ%GO3!Q!]pU«]B-7=jq  ?+QM~VomO6}-$  f@3׳~Пu/u jO%6MqUc@ys_]s_CB׮IƠ9CӚ4gw>r? s^nXBa˦|OwĿv^75 *fys[be|ߕ}_O,RέyɯF%ax J;I.MQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE zO*g~}-I=_R9-dʉ0nswq]J?$oj~~$m|7{G ua]i4w nFB)6/-m&7,dg-n{_H^ZútZ]k) #y1qaZJv}"b[xF𷂓WÿX4n9f;I''{.=7@ii GS|~_N⾥MBƥd5S7_C糹7\owhPYT=)uK2^b7(([Aֱ]-kXBjh(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()4ddxA3stUA3stTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEh??К kM] QEQEQEQE2_f< VVk# h(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((([Aֱ]-kXBjh(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()4ddxA3stUA3stTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEh??К kM] QEQEQEQE2_f< VVk# h(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((([Aֱ]-kXBjh(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()4dr^%b̒41;jx+T y♄m^9{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{K ͇Wq|Zo~(ǰ+@??97Ua>V{Kx^uԵ9HXK\QcdE 6sq]QEQEQEQE2_f/ GxfIYBϵu5k.W)L@i1q|G'6_*?/Qa>V€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaV€297TsaEWՑ* tTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( kM] s& ( ( ( (/YL+Z5o]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW-kXBjk5c5t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*((((yRT~&%̶;8aL ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9mCZv?WC\!c ((((KG7w? ּdxA3stTQEQEQEQEQEQEQEQEQEQEQEQEU;gO_[[HpIT$zJһAES$((((((((((((((((((((((((((((((((((((((((((((((+5c5u5h??К:( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( d>/@L+]sL+]QEQE{0e,.Tg]տ[']CMmyyv`#i1'iQWr}ῌ^ u&-ݒ9Ul+G%yEςӓ*𶦲sKΧp===G7_gwzͺE%䋵er38*ܿ}m'ooFK]ZUq3k'':iS@lIc(eb(yǾ1_*~?tߊ<7Z=g1dN6!yNivs1Q3Mr1ò5걃o/v_>+#@((((((((((((((((((((((((((((((((((((((((((((((((((>&j:*-֔xX#=z//i<#k TY O=ʾQG_&G6jW(LQ5D4w{~dMT'‰.mJT'}Ssq޽+;'c|~H秷aEVFEP-kXBjk5c5t4QEQEQEQE՚7fAZחY&o((WƝvkuw,S7X\+AO YKɽ'9Uv#zw~bIo^臯gĽ&SOi{Hxe3{Wfnc*Xǚx6X y>.a-{~ohCPYn-' _?3|d~OQu;;}[SMM(]H HTty7Lxg%SjmefUcXqڳj ?f_jf_iVsZ$H<;Pq\Oc^,TӞ:Ngt.dAHu8gn+UкKkF-cx/hQmI-nuex'5ZFo}:ąc5_|m.xJspH}[5Wij|iɧx+HԟNm $6gUB;xFP[CgK;]:.rِ`20 9u'W"v~Kua&.%4azpO{ZޚtOҼbw;FC6嵵ԭI"rϻ }ɯQJg%*|٫?,aU'ꝏoz.5F֭/6p] ܌cGjeG\~ FWZ׆tA~\}$#0b?ξD?]{5XIa7LoKң%sf~_xi\^y!CQ;\sҽƟ<?xMw$7 %e>b=\'<&} x{S[-ŠHEU!sc|ɨ|u_s▏Yy&қ|SywUGE㢎WT<=*Qåv^xf%q>(s95dw}}'Ikƻ yW >k㶶K4@f'˟ׄZFQS-})_*rFWQ^^Dž&xmieq$[!=PW*-^qlOG8<6rP'/}ZQWk^} ~ AG$.8#vTc='5gK_V%H6à%fs_7|-,n.f/#6tb5V_N{` t/̶nZSԠrKK*C2A?iUhׂ7zÙ>*:x*o 6W5]&mD?hJ'%l*q__Q.!҉ |8뇵:#bD;3H GBk 8^[TpYgd[$w3R67:V[k} T~&M/t/]\[H$EV>#g=xU{˦[-,{W`b 9VΝ}I M$nYѲG">c9W 6]ml'2:4xFڧA!ʦg(?-}?wo_)f8dz}AY_ -ź^|v' 3l3~>Oh1'i \F $[+1@S >q?Oƍ_GᇎmC&mg Duu#g޹fb{OpFԫyKFԣu{;^_>= z4kd-oF ⼧|+#iV:|ڒ.Fc }bs/e0Ӥ֯s#]ceI8jc+T n*]4|֬9K* 9IIh @ƞo=VilgYBFOx_<5^#KrK땈2+;C:\[Wϝg6ѿf+@k3z*㩛8IWP.VbPpѬ D+ZVQ}~/-41!FNV[IMOAm5=Qqg2țU$t#_./5VZ/u Z|wK}ny1c*scc>2nךXsJøk8G^ )ݫ=tϽ9][-b08J餢mЪ(󀢊((((((((((((((((((((((((((((((((((((x~ETV+&$!6ȇwu zO*ΧQz<Ϭ귺zF_\<̫!,I${ס|l/^j:6,J#fTtP zI?.*::d/߫gxCoI|˹A|G/a,x\~5mw!/Vlnmnbhe$nF0pOJ^ϗrky MѨjVU֜1$1#JIcGď\WƚX\X ֕- Q(f9ϵz+V-֚Gd.g{/ܦϭz7eod;O w,~}[n1S$cǝyBWV8}KgĿH+7s}NOt:C~ϱyL$r'.z(ڱ^ G#6[uT醏p`vK§EoڜEaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP|x3\}ZLZd9{9$s?x9|1xUXV/)8.Wtr)F\ Q(+j^o{\_̷/ٕͱrgQ_澮xCw+?VI/@؞ýoҒ1V(Š([Aֱ]=kXBjh((((5o]/YL+@Q@Q@/$6%zg k?j+XmzOK{7}oӳ>;ѣU~MsN0u#ceM,2d\U+xAˍĚzjzUVݝӕ!BH##ӽs  /웛3ހ I#ϥyr*kN6vҾ._eIq^<[>OO}wvxLIu$Vr,|Bj]kּM'}Bck{OJXm.\@Wq5'e?|A.p Nv%xcCK[wIH0~,`{zҞ~<=hqäjm\-Wi 3q |7 +🉭57òEYη6ů!N!K"v8ˬR׽ݴ|s嘼j,{H;F-$>-/_y'ż%qx䶸,wAq2+#xa}YEK pJKrzu>KƝK}Z(1;Ib'\d/|&oᅼs-jG O qqu*T[m]~ПeT*ceZ5)EƜOGmwozM|=7k7Pi,2 s ס?o(@`Q׊Wwvmjڬmo*HώWZ߉tϳ]A$f\ ǵ} g]%~ M+Řj^O7*zkt#BK1u{*8+%4o.ExSgduu7G5&V׋g8ޕ:fc=h889t7716C9_ح$Ji|%glH覣Uc0󌚻vJWVC `zԤ &Y{Ϛхj{|p? O^MO HH.i0M}}{}rXVˈv.Pyf9#&YG Ѓr©)^>dw}/ZV;YxZ^1jAYpPzz/?0+|*Hӣ;댱z9$+ FU+Vٶs(uҜ&Ք7e/zx-*᷋#Ե OKDDR Ĝc6:6C>| o㏛< zZ\*Єv+FEyN)rTP4c+l+pBu⢵u*mۻz+W&/=ַ[w[^Fr?v'A<c_L5h:BDgGB7 r9t:FeaAExc/$Ԥisu,]08p>t~;sǡeܵy%ӳxo-<c7KYYQEzgąQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@sǎ<9}_nVWkR_~_Yjըݿ4mMg aQ$RScOhu-cO}UcHA5?+i x̊\H 20;a<H s? Vʅ\?xOL֣}DJ[_̾^*>epǂzZTnKMBVxڎ>*Obk{[=( pɯw?o}.&o9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9߷xw?o}.*(w?o}.x뢢9/ jfe 1U-K\!c ((((K%ọZOIivxvu5o]}ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğGۼI@uQ@ۼI@t}ğ]ğU<.Ҷ$@]WlG]mr&(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((/OKG7w? E\7w? E@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@!c {Aֱ]EPEPEPEP%Vk# k^_f< V:*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (  kM]Mr&(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((/OKG7w? E\7w? E@Q@Q@W@ k<v1߭ Vz%Q@Wj|!<qwpO[9MQ!FEnåC(((((((((((((((((((((((((((((((((((((((((((((((((((uoź<7*Z3xl֏ ;**Zkq^X]C{i(s$Ǩ`pjQEQEr&CZv?WC@Q@Q@Q@Q@ Y&oy՚7fAZ訢((|N]cV۴F GTJq7dkJJ'+]^gDoc9U$~QƢuŠ(9ŠV}6\Z=Bqw:.m:3^,Tu YB:a+u(ц"6;vϭQEjrQ@Q@V7YI'vQsJRKMGPX[jv]YEwk2h::cQE(oaU^gwwvv>U*ӣz:pjʪs{$ݵ*+;út 7Yݤ-㺁Je$qZ5'+4QEQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ n4O?d;I1yӞ+Z +'XnkmSYۛn'PǭkPEPEP\!c [Aֱ]EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQES%Vi՚7fAZ諝7fAZ((#8Фk7?c*0nckoQOE-4ҔlϤ0~Z7GO4׽GTpAÚ> ~^4K;rUZq3XgL5I5zoN$MI.HIfrl tM)T}R6K 6-͕HH*ppGj7Ë?hW~ kxW" JʅqmWSMbO xGU,yr"E5? +k~6x+㗏]IqUiF})>vSg}=_:ok~%мg.'C_`5Uic߹ړ۰QE%Q@!c {Aֱ]EPEPEPEP%Vk# k^_f< V:*( (9:ׅ~Z@vsw ]"f\_?Zgٳ(c r?C{ w}CiY_p}]I,agKVqk%V_͞^"_G'Q^v/wmٽ:-/} Z]oڴhRA܁Y_j| M֩ȂO=U5=Fbr{߲+??kt)o&8ގ0bZ/4Ϩ7x l.[6 ,6ڪ@:V̪VS9;6E՘b8_^4U骑m}tڴnux7U ӵV-Y"LgGּIxw@+mtXMķnE 펹O ň1s}YtftKZOl;T\#=޾ռ|ZmJ;Xd7}y/'8^08b"S׺\sF>YǙME^^ o(#-ºޱkNA 8 ?׃;44y.̀] pr22E|s_x %yț}-܄8|buu hK<7nhF ozX uJ e+Zvחf}øLণUԼ9S>zj*xC`t7B$ͼ@V#S5^Jx7÷ʾӯcH #Ԋ8h$jBB2|y?ixgHXq\Xi!KVsRKM6:Zyty= T}ZSyjzX|}:xR8)#qfZēz[kv#N彔t8M*}:@}#O'}C÷9ԴW>E]Fq\{_#56UamJːU  "V٧Lj.uM>>ҠQN*,3ªD|Wgw?biK4acf+ :qQtu;N~?~"NJot3%\kte˸7$-|{7xRށ5DI)m`FO>*o[ZX[[b}$Ald@c>5A~lKZ8c12棅XZJ6Y549^.q$-՞>U@p&k,"yb5 Hb7K^%171,Gj(Fq|Ӵx5MQ"Dwqʇ[>mԵghex7ug2I^yt9~Sʞy)ƥGSS{>_55ݥNԕUdIV kwmk:Gkxr%ӤaiEYHץJ|?IbrB|;=ϫ2.?1XNJ/WZ~>~>t-t=Ɏ9ycAݘ5/ߏ-4jnh|9$ib'W痉>,Ryt_Zim#8qsԯxwF+ЪCgKu${,\gR][.|d2<2x9b+JRN"ޖ_Q^QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEWSMn4å_]\w:&kodP1=ΊM_qc/ =gZxcH.n/.tMϦp8OZ__CÂH7ć[=_ÿJ_xkGEO_ISWҘQ>)>#kw>!6{3+ŵ#^7Zl?d]aVᯤwKaERQEW-kXBjk5c5t4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f2< V*| V*(+'ڔ/5Bo-,=#raZT6EE٦ϝeߎ>'kڼVvY9瞕䚏r/kJ+Dҩ o[p;n<)^k_T/D=)k~+S>̩{SQ%U\6*O@㢴R?;^`*@((((((((((((((((((((((((((((((((((((((((((((((((((LEׂ/[)[ٶ$2R;h_O~ GJ֡M6_e->`=3O]Lk G0?)+o#߂oڧt'@Ksoc1_1$d@}7EZYEt'[QHaEP-kXBjk5c5t4QEQEQEQE՚7fAZחY&o((O⯇5|=hZA!H`7@lm$t kٯY4/.%n5knLĈ@8=s)Q\Zyx3$PNJ J^  jSwߖII+_Ư' mX,RHқ 8:9==o-yO|NNXkD1p9b;d5垛i[[Xm!&!Vk*Yo:Q~3pVSRS~rVm܏o";}fﲪ`XȌE{Wj?+Ca? Z-]o#vxGquՕ^U\GԐkQQ | zpoɾƸ%O8ɸs([{.y׸?E~^o#k-6$ӮL Ҡ =Z06\ 9 *YgVRZ5\~SKps˰n7!F6ۿEk}6w\׾"JO9ĨWW;&zR=2v5CWj{:50ˆo0,3p^T*P ݍ*][rrd !BП,׽ҫaԩV#+yסNWs^I'C3\<~|6.\@-~ CO.:rzQI%zs$$KE wOG,OcS>&߳Ļ3K`N{20T%żWQ4SDFRE hXbx͚U=ڷ7 ej`tjS ,N6W~eƷfk'uvgLk*^/:V_gV.\lle$UÆ9cFkϧM[C,$3/Б'N2RKJ{mg KTӊn]~~bW4iϡhm0&H N ݗ88,~;'Dx~iqʹ߻mk0ܨcW!$i4e$Et=UAǰ*6zbB?k{kGE.7'pḲi;rI[n}i]O/OI)^|N6dVXX 7Ly[.Ο$}j!',a7L{Csi~]1sD 3D=*g黧kkK*kT̫R'kGM|m¶V7n Gb4GܹV YXO8k#%j #X{qsU Rџ r~C_C;<%;ızN),$Yq|O) r]??ZP;''2EGsWvudET((((((((((((((((((((((((((((((((((((((((((((((((zƱe.QncC$pЮ$H6݈PPqWó{߆;kIA{[4$ܹ#8SuzۗekN/|\uLJ--qu;-橈N(ӽ[+cVPI'-Rw(<((((((((((((((((((((((((((((((((((((((((((((+;y'TԻ#UQ$$ÿ]/hR/~a# FB9UaEy7ix_Ŷ]j-5Hv`;QB9l;u ( (  kM]Mr&(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((/OKG7w? E\7w? E@Q@Q@||9!ij`iQ+t4R70'2kMC7|ͲiEsTP{j.~'s|~PMn6V8H0`}[xg^g(cF~}+cźw->$=ubEՒ7IN7c>k+?mioj(U~Cu1NKј?./.|(4wےVWUf8P:+wI7tIu J~Ȅ)#k#o iß}JTㅴxfٟg_03pV4OC5zk{=>v2%Lr 0x+/ee 9'ܞIIeH"y$u4(I><}?Z$m3x`{rU_qKdP #TG&xF"iD?.89+)}~=xf E˷WI=]rqWMUc.)>ERQEh??К kM] QEQEQEQE2_f< VVk# h((?xÞ6׸h A k?Z&q./l`c V 'ּ][,6xwkV@$Ctczٔk.Jjn:F_O0O/Υy(ƥ[_kJ 4Fk0;=2k Kv \Qn?bU3Q$+'mڹنkؗ]*2C}y,ʽUgOTxJK=m-k_TX|7(:VI6U |!-mnm$oF*9Ex7?k߉<+kxϕKK;PFtb_`>^%ğMn!X,E5%ֻ?'-|#Ƣmiy1U" kVc(. ZtTr)ɱx#Vtq\\ֵkrlXOĽ6&[mͼ7v@$p}[{XRvbDch|`\ Ñ%Ր퓧A*y;yN_CɞT0v }Xj`teO)qbR?{QKL}m/8z1]O*z[se8tpѣۤ׽kۙwV+(((((((((((((((((((((((((((((((((((((((((((( (֚NwsoGv7ھr<= wG_E/Q.M77&> p@T~~}O&O/hm8^aksO]k|I'=}'BLQ۲?|:>,4 Te?4~gnA_\W͟ *5T[p$KVe(C (  kM]Mr&(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((/OKG7w? E\7w? E@Q@dš͵c}50 $`浨M>v~|AN8n4F,68ǥa|cScl^kXod߅enIR{5m֍37ĺeɽ*7q9KN|㴆! qXG^E'gיK#Jgi3HdFܲ.z:#V,6*L"Gg\l!*g']xi5i-N'?h-mX==+< 4]>&pmaH8 5EL}ظ.9{R}4>U~ xsE%$jL:QrN~ 'č;Ta pj,8F#a۽}QE5'vwO|hΥτ[}RXTs5~ C:凉a5"3E(t“fstM{uOٿ?߈rk;Vw0>$xnHLk<-[]DCu]}* #8A& x/ )y8ɿ{Fw 8S)|dMbODvꄂ4AYzu*"ѵI]Orѣ+*2HCzFkiVzmB;HRcŠr%).0\IQPXQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE_:}ֆuVxorBBk<s>:,6vù9by&onn<ϊ>,j$Kx;M4cI8f8?Jj($(C (9mCZv?WC\!c ((((KG7w? ּdxA3stTQEQEqY`uZ_3) 0#|K_95-'6&w& 1V_ꫜ EyX"Rqx][&')Vge~U~ʿo|#DYS,>r)@C++3`ylc?m~8-aH!vQT*u,r+߉ڼ:uM<2qu+ ꊇӨ׶9ҕ4Qn Bڅ;I_ͷ@|տf<9gK8--ZxfHBIwe\I9L ax|KWAm-}ig= ȝ" F+.@㨯=d,K;OOcUJ*nze>'N7SokogjfHˈ獘rFN}k3.] u='zgV6%Cf(6cfUx!K&50ui'5޷]|MC٬m<=G]1ͭB!r$qO_j?<:V_廗RGB0Q,x `ْu<]ra^x./pNK\JX 2Fs޽}-oqu7 n}XZ>pna[mB ;  ^u_o.crvi#1WQM;+ QHaEP\!c [Aֱ]EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQES%Vi՚7fAZ諝7fAZ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((5c5t5h??К((((ddxA3skG7w? EEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\!c [Aֱ]EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQES%Vi՚7fAZ論m*Mq,f$,jnlX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ U?4lX_ -CZv?WC\]dgF 6C)#ss]QEQEQEQE2_f< VVkֺ\5P8S4T,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.QT,?a?ƀ.W-kXBjذX>uW՝2 tTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE՚}2_f9 Z$0%*`޶ҿ"?O&o2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע9? –cj$Tu WI\!c ((((K5]R1ĥAÌK/YL+@ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?>Ƶ Dȏ4'ϯDz(#=+}#_k^OJ_G"zWGע2?ҿ"?WK}SU1]:`+[Aֱ]EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQES%Vh2< V*((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((([Aֱ]EQEQEQEQE2_f< V((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((([Aֱ]Q@ Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@artifacts/screenshots/p3x-gitlist-6.jpeg000066400000000000000000012570531516072260400206170ustar00rootroot00000000000000JFIF``XExifMM*1>QQQgnome-screenshotC     C    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(<@(((((nu-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEME$hY ֠_6;{xi` ^ovK,}" Vl?#aW{=ϪJ8/+} YAo/< z \rEsA>ibex`1n"X\T9g}rb><((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((() RQ&@m7M&giVjYU@I_\GooM<#Abz+~3XU(W 2Ba|C|SY U^d>"nRP«(d]{&6L,˨鰨qgv}gyyJ7J byeo/<׍~W> ZoW2~G^g_^˚o//OK=ś3({;=o_3YB.׍| ׀\i36!骭iڽwŴ˵q|UU*kWpjnKmiZ!;%"f31\3n0XJx70f"X\Tyg}vb>8((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()ұdmI*}so*`WNkisKY=Oby)KD'x>__Yyn?¾u袿b*՝? aG|v͟U.kMi}n 9V^ú3Jm ,犄}I_MkۧS~U}}qk}xcgpcՕ3y?/Z_k>/:[o,.#y H~_׉獬t= &y%x·}Ƒ3b)%꾡jSZ]·.׍AVkW,u^gIXn!ݫ]t T3nJ٭߈| }GǓC6 Qw?3 b%Gqїh+f]QEWa>$^NV—S!ufku?~O*HL4-R>o%?v=ҋvP?*ϋO? 4^,W[i4Ww$YeV#fNJNNɍҚգ(hdKqA[>@idRQWd$_%tEWu24`{twc|B~>9mSE᷐F5};qH*y^vN+8ք.Tv+÷QMF"!F.2G?f웫uQkDȑ2|8%~`srIm\(G /^}t2Fw)1ZĿB:;dڊM#(X>A>Rxzgnы@(K[Bԕ4ӳ (? xgVihzuƫݿes`9'L +?.qYEsii~ M}<~φDZ?'ce9dx6I"]M}C_2j >I98j; $ 5d +꿆_ ~k?޵?xD6|C+Mm[!01g޾UU,xQs]v-O|7G=FZ{qg%w#-D W_iƸ|`tRWBifQ_U2[;YVV!ԥ֒ZhCnܶX >.]YQ1QT@QEQ]-_xPWxZQ|ܲR޻ՅsTQE1oO'"\ k\ _j/Ab= mt&۸i sV26jNJQ_`|Og@n>Vp¥)V| hd)cbe ;3,FQ * ( ( ( ( ( ( +?c?~/ x୼&ޛvk+g!/ xr),RաI28m=~f5뛓| (((Y>'ЯSGϐϸ޻5RQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE9hQ[[DJ8Y*[/~ 85Q6x>Rdq+ͳ(ek%vKj5a.Xy>]  qyx}fU/={(8ʮgv뜿/exhp7ݰP\k7@Gks |K:[vp#,qapxG>=S ֞ /۬eT15,iEVmëN.+6S~1Ւmnv?-[[ģ|dώ^F&?aZn[ vΚљ'@73{_ԍzGzUv:z7#ASo^#aUzB3ʞGЂyYmi2Y[8)8eazweثW=קfg8,qEON:&%?5cKk:9gs-~Xx_߀,~,gkx=EGY#^漇Eߋ|%k̷d+ ?_>^̲x]j/~N:}\ݔt>X4}RkKV{ik /Û4y[sLg{ҵg5+=˵q¼5U掰{{@5_o%}7 K_-w k H1K6e$9J=V;w>#@:od/kZsg%ŅY1B$2k(f8Q>m.`?2w'%/"@-c$6v3̅VyH%PN~f'uF*J|w7Eg@vjq[0W2;09p{34"oz(`5Ű|,ƤVцRҏ_΋\|~|BȮd s˸BM>)9Wnß~%nVf2;T޺*CyS#7~'|ߊ,X-~?mW8`u ~h'e{Է`Yϼ+ǑɆrOs`>|7IyoWYx[  l-_wƍ{W ^XdtF i W2_M·Es.[/j>,o^KNv夑I?n՝Er~;0~ͷ?jO|r.5mjGv?gfhaNTcoVloQ/Lӯn-&hSH"Wi;ͨx[šc .,mDI*HSbLqX/WI.u袷ixk{yc6279~,΁yfv~䰶ǝ $QHsw??x^_xuz&e&8FmǩrJGx+>o_u] K[fLˀerv|ޙo~?VT\5t-nA<ѩI\F ,9g_Fϋ ƟuoG?hգHB7k>iIO]9c3_79w\:`=NYˉd|0wt?kia3+kmgieFRF{dWoB/>KKTmX2~78 j-%caxI=OgTURNZZ}Q(=|]4cSa^ž:|StXt+[˹-n%]2.qzg5c:6|]`]@Y8qӊinw^HoWcUQ$0+o1&xMZ_ 7OfO'Z\噖鬄1<>Gtou& ;/(6>Uɼܑ13"8rsH.t,enInYm0G!XdcАj|rqu׍SIW1Fǧs" pwڧڨDx%?dn+힡), VppMءG}k5:~7Pɦ< `E9}CQ av3-6|ɻk:Pd]t6BLƇ6tVWl]kZ3avVw8rN!V4BI-k{iVhfCGR ]ocn~L>%>o|9uq躨\$dXA ژrJfbĒrO$57es .c_:=IV0yD̤d8%b#VQ'.JŨ[et(@%ָR\V:A|w>vlMK-5=k鰰(e X yÿ-j,΍qY[e唳O<^#',{ץ|Q|Xsk=Cvy}L,쁫#hddudu;YX`:+*ދSKM!$lOW1l|FƃmkW"A$Vw݅# j0n?f_XxG5N=BHD27ƿ]~eD⏊%|O\wH\ $>\ 3Q 2Fv4a|p~ |׈Rktdx}ܩl  KWkė2k6]е94G0y* 36:+RAT]vw%I噑 vzUSq蚑I)Ga?[}v+?}pގ5Rz1bku?%wӼi]('p o_ cE-rGk~MXQA+/|?xl jz~m*Ȳ۳9}= $IU~ik(|)GKiri(2CG4d$ pA&Ex~Ӵ[MMHk$q #ٕ{c_pKt?|WcbԡH؏a3qU_K8MgŻ)UnQiTQq~$'-f|Px~ҺyUvov/F}3^ZMyz.ȲuX3qRF>8Jփ{.isd#yu23)\n6$~9k+~SM+}NL3NAYG1gry<%xWͥ2-gdn # $>>:.ºt``:U,FB,ڡ0k*[{MH`P$>G?tf ? ⹬n5}X!OQcjK*KW^#FO*=_Ll_V gg]"E7w6z`s^u/z/i]%ֵ+i3#;pfn˞ժE{j6?MJhٿƟGO Bviީ|;X ,, {kl`E:k:KE+d1K#]VK^:ưi%;йE4HO|7_"x_oĺ{麽m ʲᔂ# z'?^yٺZma}h%>T*8$ @5/_A񯀵VWXdF\:yğOo Sj,:!QFGG4%f]c:r e!yg_=;W76ow84633#7"Kwڭƭ;9w%PG@G4I$Sg|f~%nuKe2\\i,:]^WGޱǶl uPwXQX5j5B}GIůts'Cę茮[o@S7U> .ѴR}n셹1_-q*\ve.gM)F6S[~;usBMP<=ȶ gbP c*3?x[^6sE2?)_zݯnft]G!W9sy˻Bo6[q9vǦMgm[$CEWaQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE<' < pd F:7y9+$Z'ȶ58-  q}v}[2u?Jx{KG,HT q*:|V"m9H c-.cKu2Zl#U!~NYgSK.g}6VI.(*IdS铀~3AE.KL}J$pr] Af2N/I#d#:dbcW4UMsFW.1l{ +BVH㨯.kIc{.o<{;2Ib|7 {_? ʟkt.e&4nM)#TRILSqlPitϊٮjgLsy|m۷18[߲g]|)^_X=&m=e܀`eՆ9>&.xX+Zñ:=,}|Z>d_{LmCOy o U I9} ;ms^D|_ >-xt:MtTʧP~W^Q|3C|@yi63=3OX.W£ ~!TEtFK].~"isxl յܑx70(,x_1W7i> Kk?"JYO  ך|+~mQxIK-AZK[w@X);AX¥yw5/+.ȔQ_]|O_- =?ݵ4gi,|%Y<[JJ-.J-??XܚxwX돸zt5~|=_'ty-Ρ0ϑkO3py"@-iZ @/侽{r'k&w¶@;VNJPO_L.+^5$ l~"b,x`IO)da(0-~ONjn-E)He"<A"in+7^ WAwꦭ?>:i}'nb%Y]MQTHQEQEQEQE~ O}CW0KeL6s _Ndٗw|1KZ*!е> k"\'9m-r|>OҘ_/3%%{X( -ۧM6M #M:HU|_w6MŧGwU@g? ߶>kG Uehnb&ByA Vd `eJg_ 5|PVPM$Y;pĜp>"?%_S>BM5Ɇw W%S=BfFgyMEfQz/I@M"{ A4/Ot~~Z}?B4Σ20b}H袽6 F{K{ihAtaw+?F9lV=cḒe,6G#| ē^#%<9Zxbm]%v+Pdpp?g0W>Irۮt?͸G5ЭYm˝dv޷ӮZꗐ99"Pb>x"Iڗ A8dn̹dW> |Dvu.#Az0Gv\yܰe2>LO(?g?>=kC4/)V_D6L`wlA܌csWxQfiX#ě;Q 8WX vkyˌsL W)Fd_v ޽O}!vqShW$~;RMԨ'ovQh#b:/&J_O#"וX(|f};^$irekm8@ WQ] #F.:)fc2Imcm t=KL5夐HV`8f{yX$lYN _SIO(gka .X 7Xd@͂8Ĥ SA]O/g;ӼUXM6ImM.=j~#M^|g%sm%숢IXĨѶ`$7_$zHt9mm,z|s_Y?ׅu[6kH{p[(s1V$ͩFQwNJ'5>y5H cr8bم3A'xU>(mۨx0 RrUC||Ӽs?>אַV(ȚQ݁HX5Od}W.IF|V:n$sTROĸ7>g$:#CW-q\6O3۱1T< c%%ts..+W #6><6~!Kꆿ*/W~7\y>Odv'?\kEJ;ZRZ>-q`xyM{+}#jVHB(v37l|k}'xLӵ &u!kQso O3f,C&Iܫ0:1GZg4 5`;W=w$;A8YQu94j>>..O_s-5(wuzoehjzmei5f۹`7dAUxпT,D94Fd|wΓ^:Mci*ͻ'Sea K-69էUeaYk#A^1 AYt_V1iz|r[`Ud( pQ޽[W{ǚ_5z.fim-Aqlr"o4\0c2@5u9KdAM.hs_N|9|YtbF]>F,D+vq'7uqnM ׬ZXpYYN:<}1_3_+V;hs3Fw*,$ İ<(Wx<=uh6#OkX4sM;ɱQW= VF gOJwEXsIYH|T^XGһzί/ >_# x[wvSiV>n-n7  zWoZOG$Gor|@$r %x*.<ޝo4hH 2I^7|d?ņ xKy 0r<QohXuti_Ϙ.>O9o)]+_7("p\zgԩ=IWa5;.n l_?7_zέ(/R*Co K"/rW~swo>A6LF|Č>;Ef|WڟJ_~!RO_Yh$d鶺W37݊9DXnH\#獾zNxgvz-gWΚvVoa6+&@-%ᘓUJ+?n7Wim?k&*$FR% à#98߱?>9h~X\&\\S1b v՗/hh菠?ࣗۻ7S2;[NX} 5NYnJm[ºm(h P{=j+pnB]d`rG(G^+'?O~*5_jvuouo+r-Ͱ+ISdIT&!ڷǂPrں纛HH+$լ, w~^oIxU׾YA)  [Q\"٫ o.:@Zծ⸚`ȀD̡KdƬU5vc*rsvGT.#_~>}v?_ڃ×pWN$52[JxFp3^ Hx[CMJ{ TU[_K~Z}e>!وWsJ~ҪVHVf.u Zї+Σp{Gcċ8߉RL:be@ƪ|o|RG{3p{y/ i&D429'w𵬑gj]Vz%+$͝ψgXR$-GWx ?Jce\mDGR= M m컶_{z_E y릭K'R&ռݯ(\xkMVd?f w+ r= M9*reSNqW m,R:I1|͖(SښFAxt8//w?Z__ cxO_(j:~ql-d;IdeOs O?(xq_UicLQ(V5E|SUl/vgz!k:W<_!F]G/MM"7.:O)X-/-qγwAg(RYǭ´]Ժ Q]g0QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEo;^ zwZOetya)(Z6\_'+*Ir! HAk+AS?$icPM&",BAsԼf\~>xË| B>Fp}?~:>1|DѼ|D{ȐD#iAԊC {:;,K%{Q c'^ßط;rHZ&d(H>d @%QFr}(KX|gև_$д"m!& d?{[J7~1|Lmc6O[g+xxj>Y5k6]˧Lvcs'7~j?EkWl_0߁hk?`]A?uR/U<J&XX'hHz}26#*~Ŀ?d?^u'>~"<fuz_CAg#dUUO~ - 2#Vk)N?]&'Nb_|oْ(URjt}/j?h-a>3x+񍯊m6qfuEP|B&y\&E $<ʣ KZ7[ifdӴ%9RW` 1,@_+DߵDŽL Z/$Jv,]x3qQ|Ay @O}FH?]danA?|e|BJ#K_\;j!GlW> F܏ 8Ք퍴H~6k?կY<)`҉Hȏ>4 k*sc*LBMߺ~F|ݢi Rƞ9KacGF =@E!?_|-cW DZu 6}()I7 yǀ-ס>$7<dkI$JrUNGxrZM,!#q U1h"יsm`]^/66K6q$m9D8WEϭ|a$o k+ GPE~obB]/CLk8tk6[L fU~v:\&V,"u ٮ#y33Rm{ԊI;YU|?|/e<7&Y>NC+ vFb~~GOσӼOd5=Lgyh=A'mOR^ ]w56^&4#3x_{AoxoUѵkp;Vz+"{nfgi%V,$I5ưSCדS\%K4Y݉f'I$j*(Ô(((((B3LeRR<w (YK${ׇ _mGI/=SS[_ٷ.q3aOF.:Am@-MHo{w{%H#__Ϳ|'ۯ3a]0,v]{>g'$md%wӬ_Uu"Zcs-O.RHR ע|٩ 4{oOG}9D~ΰH]cΜ*_(+F^YϧMku 0HeR zkaq>!NNQ9ngvT^^]~_XxSW)h˾)HdnS$S A4fi#.Pͦ<@w`=Ս#f}4ũ|Gc38q?qQvo2y{z*¨+p:bkX8~ dyok5fej:5)if9fnހzSmǶU#N*1VHY֛QOV킭:+C (j^-=#Pҵ+v u G^Wj 5֡rG$QKd7&f|u_\qr˥^j(9 6Tj+զ5NX<`'2zYSQyIoq-s#4L$09Ѓޣ|k|G Q&KmSS5p ؀pH^MrQKmQE1O~*x?XUOsҩ~"_ T#opZz*ybhfecZ|A%u^o&ido1$*(iK*b['*Mr\Ϲⷍqc9DkjsIJ@pg i#_Ey^ JE&tyJy!Ah X(b53 {wmhwnMAE%2;#?y.)Rkft~/ψ&.쓄t1! ((x0x]e#ǩLe2!`$rI5Et~q|Sxv+ :i:֢R2a d~iIF.9%$EzhO_|?}kLӣ;hcq!+_DKxR#F(cG*;?[+^ ԎK ]}+h1ʍPpj (QEQEQEQEQEQEQEQEQEQEbPff ~`z(kۍBs5d˱MCEQEQEh]e8 }j"^_]}՞fpL* *͆ydB0^FCUD:kn<&r((((((((((15%Buw? >(I)LݥݰzzE5Rupc0tqԝhcJ_s]tO!;RXd2 ||4I]nlOq꾣%XPrJ[2ke'^Ͽׇ _mGI=SSSٳOŷx+ Jf]E!?t<G^}YbtO }:Gq[p@|%6ۍRežzފ?^|>8.5RյKyWrv';_uҫa9q:7SN-UUw75ߗz5qu3ny@; 8QRTbJ7RzlӨ(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((*6\ԔP)mvÿ 5қnvG2sڲJv 筇%h/=N&7%ӳﮮo/g{N^G<,qcdiԕI9ݽ݈N0(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?`O?"b OXO=ù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?aB'V,?~QG֧wB'V,?DŇ؊( ;DŇXEZdWsX|y+~b(S~;|y+~`O?"bE}j}}^`O?"b OXOù OX?><Љ?_QAxw?><Љ?G0'ǟ?a">>>0'ǟ?a؊( ;Q\gPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEckv ; QM&ݐ6hQ|cG$f~I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8G${6I8^yo1}|DShlNG_ R7G/w% uAn_^;JAa}}E| H?wA׎;?}x)/w% tR7G+o+_^;JAnV'W?wAdžhiMzq$~RE&=T#~'U]/RtkIdUp(((ČN>{mWO \ZʦlUT )QYQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@|FKN_Wu'!-;]IZC[UsWnn#]ɮOxsImf| H>9#Z%b;"0iz?͍(Au5qh#N{qE=_6q}Ϊ6_2]4/]1PJoQ֮1qR{&koult%q!O2 n+ߌԢ[Ҭa  ҹ(H]GS z@5Iۭ2fϏBh>7r cl\@9*=/Mt"Ki@cg8NF:s]!K鑢E?.|M P*U7Jr]#[AEH]^97+pH^+S^6 8ԥ̆M_̣8?z/0QiKCGJQJN۷~%֬dtж,y%18-}kռA6dKXY n*2w(#O`'WwFE}f~4պ6lZ|¿Nt^ 񕷌''ѷk3CxwJ6#-v> V .6&+y\I+6z]tQEbjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE'!-;]I_M̟ou%i=o(8/;OO.o1o?甄 {} ǐV/XL 3\HrIQ{i2]7O_ݣb_ QzүG¿|ĻG}mO4|Jfb ]nc>Q8yV]*C'{kdH0A߽T>M݅QLAEPZ^ӓXa'n3?γjΛ}&T3 @Q^#πR_LvE3>u4Oam>u([IFN+Sxm/t'L,C@qQ//6cȞx;[B}kuP&9`*V^#m̥dw O N3'2j*ҡ;bm A`=p>jjxQVsQ@_|O%zy_$WVs҇‚(XQEQEWO \]p$A=̪lwQEdj|@|@ŎK%ĶX4ky Azb)gt&9jZW= i#?R+9twW4CREޑO1A^EZNjCjyď RjgtHa'^6O[|)Lսۮ?^EJG){=rh>EFp}q\oSxH:R[dcZ_'=~khͫqr$:/XSjGH 6?叧AZ-׃42I۶FgoCֽJ;[M{#.A9PF y75mΑwiJe79޽v[%yuOQh/t-Vd7r Wwb.ߴM`݌f|L[~; k[$8HR#Z᭤>ҠKy4RV_ȮWѢa^Kco|)bҮ5]kE=q9^E|<5OĚ{DmI34M? c2j_T|ciѵ ZcF:t WOַByo{<\KLѼ7ZK|sO\V<3KPn/fD naލ%wM8τv:om`uBc 0pk.J_WwY5rbo,1z=\No<vy]>]ny&XM]io+nJ|+ޡͬڍ$Ӽk<{zB<+ oV׵]KL6vVEC7ǭ5iz}n4v:WE+axZմ.4m?F̨a_5?R /tG*2r:qi{3xCZLԡb=G*ٔYUO_^T 4,QHQĚ0vEP#I/o@? $B>J zPPQE ( ( I!+ğ"M(B((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((d%k +]$!9EVQEQEQEQEQEQEQEQEQEQE_$WWO%z`=(|((EQ@Q@q>'ǬJpX~@JFPC/u*.VD̊OhԴT~B &?fFN.=O Uhw&iI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$wI8YBo>/pi7Q &?fO G!ZiI8G$wo>/Bhw ϱ &?i7Vg!O E/>Ɵ$w"}ȇ(\PLuBKණ5?}{f1[?tvV΢tW0x/?>ds9<fT0x/c(_`O_5G3G9{9<fT0x/c(_`O_5G3G9{9<fT0x/c(_`O_5G3G9{9<fT0x/c(_`O_5G3G9{9<fT0x/c(_`O_5[[HZNZq/?Ɨ2g>Ǥ| {_z H0%qi]EwuV6[ư4UP0k#ЊH(C ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( '^i3'1%6cG'؁M+)(ׯa56U81w0 -C.U%_)cX^G?ax[])}ax[]oth=} 2G,/ ˣ|_U|CEcX^G?ax[](no ?Q 2_G({w{e>/*X^G9C۾-C.T ?W4Q>ote>/*!P,/ ˣ|_U-C.U r}ax[]oth=} 2G,/ ˣ|_U|CEcX^G?ax[](no ?Q 2_G({w{e>/*X^G9C۾-C.T ?W4Q>ote>/*!P,/ ˣ|_U-C.U r}ax[]oth=} 2G,/ ˣ|_U|CEcX^G?ax[](no ?Q 2_G({w{e>/*X^G9C۾-C.T ?W4Q>ote>/*!P,/ ˣ|_U-C.U r}ax[]oth=} 2Zo4k?O٧I1|_7:mWVmqnIbbK=}Ep_ I¾uѩZ?rT`9U#MI]Q@Š(((((((((((((((((((((((((((((((((G-qn}u+ +>2Ɖnob ocn[rM~0xǚď]%.5mVIMw? ;r ǹ_c'#WQ oi+ڊ>UE7?D|*6Ǹ}e?r>Mw? ;r Y}ܟh_S|O9G4G¯)j({_c'#WQ oi+ڊ>UE7?D|*6Ǹ}e?r>Mw? ;r Y}ܟh_S|O9G4G¯)j({_c'#WQ oi+ڊ>UE7?D|*6Ǹ}e?r>Mw? ;r Y}ܟh_S|O9G4G¯)j({_c'#WQ oi+ڊ>UE7?D|*6Ǹ}e?r>Mw? ;r Y}ܟh_S|O9G4G¯)j({_c'#WQ oi+ڊ>UE7?D|*6Ǹ}e?r>Mw? ;r Y}ܟh_S|O9G4G¯)j({_c'#WQ oi+ڊ>UE7?D|*6Ǹ}e?r>Mw? ;r Y}ܟh_S|O9G4G¯)j({_c'#WQ oi+ڊ>UE7?D|*6Ǹ}e?r>Mw? ;r Y}ܟh_S|O9G4G¯)j({_c'#WQ oi+ڊ>UE7?D|*6Ǹ}e?r>Mw? ;r Y}ܟh_S|O9G4G¯)j({_c'#WQ oi+ڊ>UE7?D|*6Ǹ}e?r>Mw?:?d*'įU׭I? (Y}M,8,.ྴe'dAU7~!|mkcs=LJFwg@9V<`HM3R4K9D֗Q$ȽC)PErU3EQh(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+/L[⾶ ~#k_V5a#=(8(((((((((((((((((((((((((((?e6;|P36F׿W~4ۯ֯eRQE&EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPǟTge& =Gn- &.+ qQEsQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~N|hř3ǹ6~o X?*|(nB+;Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((A%c]":A%c]":sO?+S(((((((((((((((((((((((((((OfunzQEIQEQEQEQEQEQEQEQEQEQEQEQEQEQ_ ~縒H䶍;+r=d'&C'HT}䏼(-~6x ~*QX]kIm mªc`װ&|VEա lM=T?XJ}^?c„4u_N( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>;ɿ{$ˊGɿ{$ˊiM{nq4"2 _g5<%VDVn,Lpʟ+}q2(Mg_O[M kfM=THW;qo-ĐO4mJz}lvwSL/^Ym-ܑK4fogTߴz$-ESY3Zeӆhc%W@+xGiąFY<+ JkM{rAaY: 7m5NսSE7>)hRBʌf Te8 x.^wiZer U= +اܧEtZ/x\i-͹}©k3*Ǫ t C̪*_eӬ澸[ʁ SZ o6x5[vٜn@**_oP{J.>2*Š((((h_^^)nZKAETQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@QE}X}MҼy_ IM3C# BeChH9joOݽ vFS_(Q(2~^%m(+fK[&<{G*[g"7p ޵?g:ռ=C,$T,+ #ޣ٦+vmV8xlmIԿ+RMln=P/%ׇ46,VI8BN'r*mjs@C}`V~y`AAZ.Nܯ[TaeRME6,^kBQX3MY.4CV\pH*HzVg%>EZj$vj^(5 ( ( ( ( ( ( ( ( ( (>;ɿ{$ˊGɿ{$ˊn^_;C|)+@Y2y (;"Hc[ /Ek.4*M_^-͜an<%T/wc_njt|1]g7Kv!``YVF VrǠ/.Կ|ru ƃkVpꐄ4/~݄w 2 _vDiroj-jw1\UDODA0N2UXx^֒r6i%}22H ?W; [㎹6"#Ʊx23*v1mst=-p٥ao0~5_[_LVNV+xj}؞Ue.xҋ򽬿3N+U%Ѥw.wi⫕/~k~eYSawMqߵeg6-o\w,,EI$ $g FrX I;rORְ{1ƢN&)|'O h8$dϗK[pAk\Ow%m{&]#VQT{e9IYFj;#_m:?| }w,ER˶C-'QCOOsYUgk"mOgJyl#jiU\Z掏n`>d^OSފ(G~ iѴ0+[^]_˒6ɆRH#`1֛gٵ{[h,,A*ۜ%fVo"QJ]vw_|E}e"|!C'g{GR!UKKh|˒=8k jGoxC!IVY〰زݿ 7`Y{qUo_k}NWmO k^<|/  VIa0Ey7&9#wNO>:\X~ltmN=J 8}rm hԢ)^"4&mOF_o-1qkfGkD%#-=jgW3je l]11qc^sxG'fI4:{m,FvU$kN)ȯ`Qe9YsrN+:W Ե絋iьii実ʪ+i۝CYΟmHTF 1޷iqi|_g'iiwryWV#rUI5ӌm5f䞋O|KE}KDwů:g-ckp[ [8dU)#2'jrjZwf (3 ( ( ( ( ( ( ( ( ( ( ر$Um_?/4$q_ ;0۳ШN((((((((((i"$o)DMo_I+xݿ*c/5 $bק c/..s[DvT7kмDi~6Ү2-ĎOx5j!O2] sl8n^#+6.k`XHUL w\95%_kI1ruK)d?֪בsygX8rڬկ}?JƟ'k?j'[GY?G w'uK~^y GاPRk+D]o?M+:FIv׍x?/p0[mec/ʨ=^9沄9#<>&8,='R5Qn}'E|xhnxxoF8`AEz/욥#ݺٳ ; BJ.1R1Z:*NFkt=Gs?x!um^1q0UW$xێ7~'xKֱs#ĂVoT(8$szUT*Xɿ3YE<<3Hث+A5\naҠhfDoD2j2_AUJ-8Y>%|?`uKW6`nuJAGjZٗᇊ>&maTd%~ON8aڽҼ*ocG!і6.5-gugߪW+jZ^̶T kvՏÝ6=?Km"$Us{_{k\&;~ak;{6l`Q.'`9y]C1>}*W_+Wfk+Qӄ#9GI;(ӻg௏z|f闲i-7{oRşN]+^:ő²OfSv蚖wjpH^Dm$pA=E zN*ظ-HUgt.fz+i=JIGXerky7AoO izt=7%̈1$WxiÞ.WN߁;9h9M.jֵgWpԼo{Neuqur|B2РqX5G/f^}lZf% FS\ḵ1l3MbMO]yw x%mJH,b9KXd ;ƺ߄>-xV]*'#)`*6$2י8;F\>nWmϦ( uZ>=տfڶ-cLmP ~;>x0f.&2,HaF(TԮkemU^<^TUMI/>*կ4 $[6 [#?}_(^5/-U6Ek-T}j/ kq(bpBvi{(6/ib]Y*E%ʭ|ڊwKwB׮UKtI`U+ϵ{eRV0acN=N}((((((((((((((((((((((+'ŚMνWNk Y!sٔs߷4IQWim~mDuk uUG?Rmk7khlp0z_#xuۭ+X{k[V0{k&(a۹FexڐMvܗGoF4{쵖䐲B!wtʜ{Ef|&Ob2\Oh$OfOҍ/ZoN'Cد̝/K{ y..G1.Y >FwBX ,H(!8y}OkӜ'Wĝm]דoqE]KzH D@bOdt?WƾYm.NHl{šEOk{CrڵpV+WKs![iT7 HSvŏkį>:t*]U~`9c޻_ ~1۹;tW1\è#v~<2~!ċr8=pOZnP~?Siy]u(7Y֭WCmYeY,ۻ?s"7.#N~TS$-N^eӧ7\uz? Ş4|3߶h/ڵpFI &8FmLiYJH#85yy٦+Tjno~ uII| ɛ#u%6 s/? o^=VܽC''d]]~ЗVxb-+`zsmVϢo4ggե^5O[Vc+4W-GNRjݝfl܀ * ?k/5?Ѭ43gH둟jAY^ǭS7ùQRIF++yEy=/I^$MwñlR!pX8+zLk;8c){Iӕ9&R=֌( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ww_<(N (syuzyM^^,W/ ~~%St[4"CSII8>K?ρzΦ.' -Lxi%}m0+,3nb {1?ŷs|I_c.[1ΛfS"į+ ?p~2xm 𿍴Mq"I.э]X$SM#[ haܩ?/[_gxd*DU5Y>!| <6;3ූњtIiѾcNU>_-&UYAy#>m ׼'%{ĸf<_"Zмi:=E *\xN=W㞍FNy~ŔlӚ[~L'V9ό? 3~:ե񇎵k ,+,J/ʸ |? ary'w ) )(Kq6KH%{#2#t㜶ӞwuoF]kCc]Zyu V_ cYBz;m@+HN[~uus=%\[%j^e n%pҰl??ƿ*uOk)*w=_$xV7ԖP7muld A\w}cZk*iXd 7~8ٟA-q2Se8H`=p!Z?vrk^!!ύ'Rِı|_shZ}H.oRZY`aq?> ^R-5aSI k_Tk^7+\틽w3f4+[{[sm PX)$=54~#ҵ$2ˁ}~?_U4O)iS{xVN10}2ъQ_&19t3?5?iͪnHne#bIW7U^3D y[H` =~WE+kN$cp؁F8|GZMB=> eąђǶʝԥ&Qv\ WH^*ërDoc)HY3^Moء8!HU&TORF}pk,)oE^Q1ok0OrI*%Sm ~2v_ ?Wt*%Gg#⇃$/K9K.f* WxsڷCkt=K &t2Lj+Քj5 q8tַ3Gk/d3\.v81O?~Q4.'iKKޭ j],ȗ 0ٌdVT䪹=mX8a\]W0 |@vGrw_uosĶաu2\ q_q۵w 3i75+&N[&kgHF# V>2|7 vn]بm x{\$*mo05eҚmFN)z[?E NU57/$? OĺeIA"Muef[q@֪!j`k6F!-[܄G+/4Gg̷HCU$rpEy6絅bUV滔`]ews?gweyԎkJ_JG[SJ;ɿ{$ˊGɿ{$ˊ:,~w.-^n)9ӊ^ #Ѯ%]-q+cx,d .>O G|Ug Vư6B" u`$*X;WTӍH; 8CwPuk/u;O$K3}WY}EZ,Ω.?HT{f?_;^ {ƚ-MG4E7##a 21j |eCڦ: 8#&>^ӦVÏ!RXHh@%\gNpWikIYRkt߆*ּ} P팾E֣ok~-)<95 RL>1|H}'[-sS}dC[ YA; rIwN_ե/(9Š((((((((((rg7_,iI~WO&ō3I"WŽ6*(Ӽ((((((((((kH?Jb72[J_oK77ҤO*y}#=|3_m& 6W8mlWm4I?|& j\&[6c4D 5Bj>;2W*TU{_OyWyoh$7vhz{/Pm䵻K UPA4>"k|[_U;3$Zy[ӡ7.@HqС9hk_EGwZ#w\0]xnl~%hxh&?>{(oGwE 9ܿAcIiџ1X,n[ZqjRWۺ#|I4A=ͬ!"h"DS}^ 2|=!-~T6v(Z'<%ii6]w a|=Rc|LW?ק|*&swgo]+h6^(o4F>3{B:+ 7gNt wƱQ\%؟3G־Zeơt{XY T*N}֕vYEjH.#(w AxkI>qk:Džu'~j{He " Tx xt_;]GZ\7/)B~>x7Z_]$Ek pQhi F@x_8چ-sՉ7cӃCҮ i]ք,Efx'85/+x6WWvФR8'i tEޭ^|x4HOg8{߽>m{!ߏW[qľWZl,7+8gG/]xYFU1bqlJ.k[)pL*jrZQwV} axxF| VEIG Kg0)/;%(/_8J8{kJ'?kٿ:ƇjZMق[gel*X־_p%O/՟< (>((((((((((((((((((((((_ t+gZ=&.2Cz?~ŭc៉CmtToGe* O ~WsOІ2NQnOWWKg:dm鴤rYF9`sUt?-F%R-)juw>~0VX-cr姧=h+oz2%Ml߄T,oiЧXjpnէ\0,!.7*z |M.76YHϧ^")9%'duX:څ'R]-zK=_w嘙3[)%'f|eb쒠$3 +V9ں?iOX!^y"EV>4y?Zeď84X|//cƼ[Kh<m^FPDꐫ 9~t)UPk}:[{n2Mdf+_/[\J @PH &|)mgP3ȑ؍ I8+O?Y^ PCf !#n11 #W-HG=mtvm /?YK I7m՘,`KeISzFH{%|&w˿"[yf;[%9O,ds@< W$llUl,%%&)+JPͫ/>P+Š((((((((((((((A%c]":A%c]":sO?+S(+> H~jj0]#*+`O;zz(z2o|S_Y$>O?#g{~5/Znx|-k 4144'y$*\Sӡ{=3/|TVݹLךRQO1vQ=3ūwڷȘy FFy+iԬ{kYx$3Eh*&7|q?K|Y]ck&7*GIҚl^+DFݻ ۨ*R%>~ VzHA،ƽgToJ/A_jK-ʾzڦy141!۹8 9"}[J~𝌖:27 8$y$ůqR=֟{9/"Ҽ/u fͯV7VbI $`@~8,5:lvhh IzVզr^W↕ua[Oϲ66w2xWOi'o[xzg\Y0H=k頿GeyQ[>߅xe<%>~O־񦝫4ˬ ($w7 7Ώ6 屲n7HrH#k7khzq}ּ>,OL4a'Eelw?hڮEӴ yL,r\dx g=I$TRj[6ѷ׃^@X 8b z֖@z-@$qGG*H*~+ʭaI__]hznBvꇞٲҼ9aDp+Hy$裕^uV> ۏ H*²0=PEyo|m\} Th2;U$`+n|ǃ|]oC*| +4aT0Y$4/Am'[Xy#X,d@NO>RqLk$v |ig.q<>LE9f?3W3|BӾ"kVl7PEI;k9=\7Ѕ'⺅QL((((e??kW׀~4ۯ֯eRQE&EPEPEPEPEPEPEPEPEPEPEPEPEPw_D/q#[ေ)pvQF~1/NKϋ|7䏗s_n-bR6{`^8ø }pk(N7"NWɧQ\Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@R??c=]~R??c=]zon# (`((((((((((Ȯw+)t ^xN'mQT%QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE;ɿ2cLHڿrg7_,iIpvagQEEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\K_^xF|+z:{wtF|{WKEuiMvz}f|KUo kgZlk-v=ERއOj5ƃ'kZt^]7eI澔TΣO* 8SJ >W(>((((((((((((((((((((((( |!Ĩl3v/ϗ:M=^7yڽk_ &6?(++X՜>{^e?kqj3<)"KD'nn˔a?U^Omӭb;khT$pQt? IB~wQPzEPEPEPEP_8|po U$VA rP;M+(a"| ɸ?|w@/WQD/p?B_7(_ &…n9__QG3aP;M( rf'?|w@/Q ɸ?}}E=OB_7/p9{ …n9G(_ &s0>A rP;M+(a"| ɸ?|w@/WQD/p?B_7(_ &…n9__QG3aP;M( rf'?|w@/Q ɸ?}}E=OB_7/p9{ …n9G(_ &s0>A rP;M+(a"| ɸ?|w@/WQD/p?B_7(_ &…n9__QG3aP;M( rf'?|w@/Q ɸ?}}E=OB_7/p9{ …n9G(_ &s0>A rP;M+(a"| ɸ?|w@/WQD/pJ5Ԗ &?;+BA?R+z(abexgv>-:?.1m}/uw3ӯJ[P\_[Z:$BG [鞵=t݂(aEPEPE#0U,$B:8` &(QEQP\_[Z:$BG [鞵=nEP0(lr$(uQ@Q@Q@Q@Q@Q@Q@Q@Q@ A"G$#gw( Riㄷ.~[ #x3[;QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEt_xE3Vꦗ~?պEQE ((+?_ +?_ hlT* (*NP}monE Wp~=+ /@Y |;[]V\#ՂӾ 1$ӹZB̳jYf۟Lc9aXiҦh.ug"Vd(L O?J~GǬXMtmpaYׅ[5߳?mtnFdpU(A9}V:_]]8@5>W}%sN8H(sVkK-Z?ᦑ[Go.mӟt) l.$Px @;r:ҲQr =_T0gJΒOY:z[o5>/c(o5w"I u@_c /yq5jwnlF3n1pzqC5W vbS(Og˥2ZyL=fqsϤJã9cup: Ҽv c^ &Iu?5kjsmg`ikFri{ucR g4lGB$?:UNfgubh@V_ ? gsO#UiZr8Ok|9c`':+%$mmnE?5 I4-*gV䍰XmŇ aIF;q%L]_ ͻeXD_jc4k B\ 'cžWr^IY=Qz`ם1Vk&OͲ7ޚ19*·8\n 4(IF*ӽUGᦑ[Go.mӟt) ( $gMg$o E@ I0#`G\_>N3 E>I߳Κꚓ ?ڪ[*ߡmY.Kwkź?fM/|'ZmoF7 u Ս*\pe@0F{w":V$d#FAj68M6yk/-ND0dpǰ-C50 䃒q^ovCn]OYx#E"Wc\q^&O>"ӵ-o컧+5c+x'Eud[j}A'2-Z~\^[B%x8U: C"KѰ`^W62xYYX㐤pģj?Z-tS?/|+_I ČrcFP?WpW/ԎwmzmJ;nP-^M%_BK*2w|5R4cd? I^W3M&;u$V\⠷ԭ.hຆiG b?k>W(׵$k4mߒvY{I'Z>XOִ).-&P4 9-,[-n?2xLt~f FE"td`AEyi'kR8#?t(5eOŋ <W?Sr>Ihz< fuu476%LQA?כ"^A$=3\7ŏ)~/M(lIgHvn޼ WTе/M"34G+gJxЮ'ǀZjk0/&W ]i;); n)>>K?O +. [p< μuiX)AN+?aCOs|yV2:sS4jȍe9cĞ|E 3T(u } zW9YGQwMEs(uo88SXn){*ڵM5˜yfUf㶹yck\=.&BG6;|đvw&/',c*V9kʏG'q<~&xz#nlMYscon|m5M.; Pl 0=Ey>d'J<ϟPnZzDOC+PCЃuYذ[- M>x- r3ݜdY9gxG֗}CQA4e۸dIM-ȧ&4aur H໪+5KY~ NO;y[ `k#z[ԝ6=3_[rRI+I&v::91(@^'֮RQ$Y_W?T;וO;涇dv*èY'֓5<,v8О ZuNnʼn%s(EQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~?պDŽ_5nlQE ( ( OB OB&[((~"|,ן~ ru |eϫxKY͹( nfBr{:.}$G$)TImMK>[F-U;hk]i~%aLbv[ $FѺR$|Gһy& %|pH$yƃW7mCVJ'9 P U9~;4?/G6QUl\UVwɦ񦥨Hdۂg8b|x?fx4?1?WMO6/nm g#w|6#ny9$cV|FmO"C]N7&{{)NN1eqxJ3|i&zk禸O,66=Emi~+qxNQ|'O !7>1iڝJёԼ3o^ü ՐE2)yi' ^7Fu{t-j|Hm l~2^vv HFɽ}MYߡУ xiHHD~`I\#8 +3~WL:ѭ]JX9lG^5mRJziXJ\RMQjV}މo_ ? gsO#Ui]7i -t[o'SKah7a ;/g,?\KxeDRL1A).z=,6kMv9)hg߹U~#n')?x~2\\wlSi3yA kxt^ZEbфszsjKܔ\RRN.+`F;Tgڱ=?2cO]E`x_OK۫sL뎿Kd7QEQ,Iϫ)ּɪhWʻI|卸'?^^e㟅7.U]Opx?|fDi5=6I?zxԦa.#FX;WOqyt [Gys@ʣkj>3T,!`xƒN.}4Z|tV}huܤ lk|7g X^%_*D >؁^u/>Zea"hNq8#[]؝X*Qƺ,C*ňQfVĖOb8g$WOc&ii3#p3XIwi~V4"N^q"N^ i6wQW[GvPۏum3,{Mǘ|w;VY$?CZyM~ȓ7~Iw$PkndZk2'!ޣ Ig^@Rʒ;E-W_>+[E_57G5 k R4WNukSuxPYiB>(',@S/? F߂O?WS?Ow[8L u%|!%[11:;~wui/["٥c|XէAȝi_=K j6V}FfEىw +cⷄaSkbgHق +74T]z/Gy Ԯ [֏nˀl֓M  ]!/ I?$c5_eR|M)FzU+K͏gD _S!_:-mu12.<A~wu5}s^l<;F'< UG]3|<-xM6Z>dy܌ּOIM"bȧW +]ņ^uNr=ׯ_|CX q֡yn\}Q/_꺦{DZ)a*7`A#+N"WA__3"0H'$qg I'lQWP6`6 pG9iIvn/OALNt}@?vTc-&TJ3xQB_x~k=~=3PU0'as^{[&4֭ a{ԭ-J],TH ;ukRU߶tk-eĆ+\,"`@8$O95º4;}*SGs:]g,GsIE/0~Gk=<^uCz+uJ7: HפiilĊ9 kl:Ɨwcp3 M{:Ө%ܨ+Eƾ[6׃m59R ¯O1zl" QTKc|=b=:c`s ?J zqwIQH((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?i??i?;V +S((((((((((+uP|Oa`l F^AV1񰢊)Q@Q@Q@Q@Q@Q@Q@W F_O FYGsyQZ!EPEPEPEPEPEPEPEPEPEPEPEPEPEP_O NO|_O NOL6/|K`˟ } D2E5|CJ;_tQEYQZjIaIyvx:O{Ϣ/p?B_7tW$EwQ1Љd=qsRBI"JN-n(b ( ( ( ( ( ( (> $B>J I/o@QH((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?i??i?;V +S+菄>դJW|F#xdi yp׷q]N/o ]+88{w5|'hq*Tp9JVFZIY.^:x:u&=ExWOoCǥy%Zw9fQE2O^ft[TJj$YCm3i{“0H%iFCBk[|%-b\ʱo,1DBIKvf1U{$/t\CynN8q&Ry2Zvv5r0{{Ezo`߳ޑkYMRIɆS;a8K}ՎxARR74.@#Wy3(7g 5vُ?PHX>Iw6VZ' %3#$` ]'%K[& |ߘ9s6yGZ_ K%𬷋aD|Rq\? zMbPE7NNҷAF>2Wcy:L:ՎJ@rp2# ?74]Ïsqia#XqdtV5r%nES$+uP|Oa`l F^AV1񰢊),ln5;m-!{$qF2Ǡ.AoDAZ#?#ެͺ]ZpΛl< `đ#+wjSr'z8FKpk{2 rT[|ߏbf>lبڤ/nWߍZuѭȟh60${;kd`Q^ ɸ?54g}*(f_.E>X2lTzL(kk(wV +S+i_X"m,g΄ cpN_k'K:TKqo¶A/}>)bnx>cj%PI{u!A j|c#v_ƭ>14*Vws%9]X8?YBJVk'ɦGI^g^^՚9Q@£9!!lxO'DO u8V9Ԛx:ׄ<7㿇)ŋy?k@3rVg<-~$ҬY$=?M^_/cE{?:ևwxnV,m73.i'#G^ug9f~`Lo#}&r_֤8^|-}ͼ?]B$|4w:-WRGÝjKlx9\\\\#qv2y5<ٵ{<^τ:i^O˹A>/~ С۵vIjXA 8Z2s}$4Z[<^7þ |Sg&=e )pN=@'15o·^o /oF-՜`30pPs-lBk-Eux:;/kCrbBBw c>k<)>xB^ ݓrTQtkrW|V>g~K]7R½[b }UGv|gk&^O.qU<3pǜL}}%_;m|MM+Kmne)'[It_ xUPO^V|q=ίjh~9 w! @^Jv]-dBW#k]WqTT6r7Ι'"ƹ=2@/pʣ5G^ ɸ?s'5{tu"Y㑂qqQE2B?A**?A**lmG;_ ?){>%ejv.(ymfKIwrXt$ +?u/zݝȚ nX; %cB"J;"Vb@t:)%gw+4xǸS?oxrw/uVF45{^EGM¾_3W&.lZBƸz2H<ދ>[^?b^-GǨq~ 6WwkKt̯ 3$V9{[KǚQ^{q2i#mŬ TjBwWDӳ ('п/} ++CAER,((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+GGeGGe( 𽇈OAI48f}=_)钽+|A[0#\F'*nџi7diN<ҵ{wMFf=Ż3)y2yrD08\fp*( as}>X.$syvАUR>^סxu/sELSqIRR/E*k/䉗88J)5h>3|'-Z5}!Yqsf?;c-NG;/vτѴify[2'I$Q/z-[R]ܴ8X3>X\fFM 9_V։cž F#"eǠҴVoYi: &[V#*H+#+fKσO\&NGT2VvgUgᎿ>coFEy 㐅39|QgLkCh\杳4Oq^]R&Ҳ*oI*̂kgU F^A^Oa`lkc (_e7#pj=[p _KK W64nwRK}BfmȽ=1^uC><'񇇧TEotإ-Zq#3Fq6V &qm B%32}+WV5ū ;oA]Η^97|yS-ޡ@ $J{R杋,Zo/_* O//"/5LxE͝7QK[3Pvp#=q[ok>vv Gc 9j+,Qj6 _ƭp/CqTLMq)2\aEOs-G_ ՛׷C~4mCl(pnOc:7ۗ1JRܧ8}*:J)3YUrV ((`~d6Z~`~d6Z;վ( ٯJ#ההWo>SjzW@mʬ%H qT W`xFoэZ 7qi6F3͎4 ,}H_ 5 #K!,'7٦xGM64Ua'!9>ǥei2mΏTOcL Yn`6>DrG;_2J.?LW'g\P3-R\巃uǎ [xS5 ,iRGLlQI{~wsБγI 7_yiT_=Y*_Ocۮnnyr3Оa+񵿁h(@,FF u7>/9n?cI|_%H5y?vV^ #%j?,?[xE,1E0Ts {cqO"ZݍyV/c{vﻞM'{9*<܏k/դ~3Ϩn&>۹y >4׉>խ6^|ZSn[eV|?ZEǫSYadY ^hqmL _vO7o _n~=\Lj>!iڷ0t3yH">CgP;ѯAӵO'"of$DD|lzsמdq\ku}sCͰT7M\g`;=$|Mҿo x{![}yHIr0Ei8æVmHYq#5W圥r{p|C5]:IZ+8eh $ ּwW:vk;-K4N _ʹH𿎛W*o^]p]\Ѓ>U~IͬEkr:FXNN㜁B~N1m}M|XMCң,$jVB15G0~5%0靎?jgH]S90 Qmufxv&g k|'8:G6^i^.2>$4?,6?#l_k ]^ uh']<i!V%P9zzF _[k l~~/?w7>ۡJ*>j)sNȈoA_'Zֱ}=su;YKQ\\Ku)i^iX O XͅQL+كD +كD ~3"s!!ȃ_\覯iGb(9@ %cB"J?]qį+~,hY8_$R+k懡]]G!I̷\!1 5CDԣVV3z>ʕAv|fo=>?Tu'-$jO"??txGU7QiPiB1ثđ=@-fxFÞ4P#͌'F84I6_rԕ_UOڑLG"/G7 7 ?k />Xc]1oʁמq9gG< 5Q.ncΪY9;z[>ɯ#[o [ڹ'$Mo?B|^C^&]FcwCu~kw-;^k[ts)IDmaĞQ\I3Ծ!xC|/ YTBZsir?ᴟo< $/W#5OŸ4"~5n#͇:'z`3?<_hna}H,ូwR{{O/m|_G^X=J (aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_0~?X2?-}?_0~?X2?-\w0AEVQEQEQEQEQEQEQEQEQEQEW }Yk+i?lcSaES3 ( ( ( ( ( ( (>?i??i?uo (8B((((((((((((((?A**?A**lmG;_ ?){>%ejv.(:]7=,9c8eaWnyw45j>&ԞTI1tE ( ( ( ( ( ( ( (> $B>J I/o@QH((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?i??j-tlm)(uvlr>QƷxQ[EPEPEPEPEPEPEPEPEPEP_W>c#I5ԫ 2y<?}Yk+j-tlm)(uvlr>Q§Š(3 ( ( ( ( ( ( ([mU?i??j-tlm)(uvlr>w;|QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE" QWwϤ9I'F=+ UAje>!ȃ_\覯kixgWe՜/ՐuIk4̍G 8 \Ī:(9((((((((((('пZ<Í)&w>~j+AER(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((*XxORAG C9z[ٛw3q[)qNG3X*c?<-?Q o?_j~9{8v<cEƫ裙c?<-?Q o?_j~9{8v<cEƫ裙c?<-?Q o?_j~9{8v<cEƫ裙c?<-?Q o?_j~9{8v<cEƫ裙c?<-?Q o?_j~9{8v<cEƫ裙cox]2̛Mo@3]eTZ"XxORAG C9w_7&gTS, k֨v'-cEƨ`/5^E>fOc?<-?Q o?_j~9{8v<cEƫ裙c?<-?Q o?_j~9{8v<cEƫ裙c?<-?Q o?_j~9{8v<cEƫ裙c?<-?Wg߅+4e7L6.=>f)]B+TZ%lu+X-$4r >WY_7&gTS, j/f UUs3?gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǘ蟳t{H2pUdUUA5ƱFaUFQJ(߆|itwvZ޿߹q? Oz3?<-?Q o?_j~|̏gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǐ0x[zs0py3X?<-?WG3gǐ0x[ /#[yk.~Wcq](XQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEAutnOehz+"CɦmO#4O26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƏƋ26OƬkG *F,;J(0(((+ Sۂ~Vs~I2دEUQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE=)(MiwwSIsu>i,JŞGhP1=I$s euh45}ORӑ]Α,EKZŨݸ[J!AbhZ, euVc?RkFIbq@U '_5M3QcC{IPRj[&H8h%"RXd09dH43OP2Z(Ct-o:8'4E69hH]eYNA&o4qn8]~DU{MQf+ygUOT¬Ct98&6 ʀ%.Y3G)_ +h__4&A/$tT$I"r2p7 >AIn+~:a^x/E. h6lpV&NFџ,O5ZʛT(JN+e3QocGݬ{L2vpH 8\/U{_~i$AcE?(JV-sr\&GCkc5{d3:ZUGf pO$k:Ia>tQEQ_gğګVO"VfYd RlEe ω_ş>0Lf .ZY9*IP\svOoND9>g+>㢼g>%;]I/㋈,J;n8>$~_Ax3w>y>cebQ!wU9=GJJWU":m}E|1+;I>DQpTeˑԏ~BCV;mJJb'&'OrsC狺ٍIrZUE|o;RWSi:ozϋ/FB|pv@#.s չ絺yX&E92GhrYEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEǚ?ίU'i!DK^95M衛] \f]q) |1#{k@@\1^?S|tCn6%=pqZ/y_I/>~gkto.[LkNp>_؟|M BD%h42#l'N7d ;<e|V5z3zEϒ>E3S{!u?Ea}z<뗋9 .2XowSn8p啧JrJ7wcؓc DU?h~~ 7Ėz&g9#y9ve{׽_k4h?|UC&nZi~kz]d?;O⯀[vI즜&ՑCgg=1?QV<á-9%q?S|8vP7;o ZQ)9QSHFzM Ho脯k;K$7߇uq/U9lYc'__G5|E'Yty0 y#,#sщ3My'f)PռG4*nt 3 @ݜd_߉>Xo u%d[ݪ a@@fp7"j73MOWCNluHǒo$xϠXS{&o/nu[t׿p_ƭêj~G䷒'GmF8b|3UR*ǒqW:wß(%tVZT7i͋3+0P #vS# ](kIdZ]?ӻ_ jz7ƫxuէYPZD76,UTqhg?k/.vGֳ6* :VP++q 8G򯎿o xcPO6jZ v.!-:e UQzAv)Γ^jOhO_d[4v|L&~3o> i3땈~?;pnjk_<99hV91[f?Wz.kLAee[HBJN(CI-5.UytIdKutH+u\Xχ)G< ^.z)/z _ ?lj->Dվ >m<9(v۾4䒔%e E#koK&ךso8wǠ>+?fN]c.bҝ j;_ _Ե^8{ąHP\DY 97~ +HCͮl!y` 5TcNۭսQ\@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEǚ?ίU' gw_Vӭ4]Qnmrcǯq`Cx:X&$6r0>\R8 Gw(ǖ\>럴 >ᡱ$Qc$2N85G+°S%Ҵ]S7ēO$4Vw&4W/N|-7oكŚ&tO,6|:..^&i7H}w?ρ|3Ygkk8IvnG_zIZ?4u__4wӮ}E=?[|[Ÿ x$|0cӓZ`e5ه⶯utzjV֗0mGw ʑ9PI9y?sQ[vYs)ӿ>k?g|bӼ=x=>'[I"oJ>$~*ѢsoQeO 0ȱ9==_VQYF|j4y̴{ 럳ğ<7'&%qK=܊;6WJ9k_9xOƗeٳ2O[f|> }sEhJv. jVu2+ )'{vړ 픊fnI 㿌1MWM&K;zbkPw`U;p+ռ#5T'8'GxW#[h6HdUvmPp>i~^ӟ^q;rxv溱IcKIlո}Ij9G7څ[޵qʚIj3M:N⟈?Nŭ"6gT(#vm<1ӥ|߲Ě5>᧵PіWBx,2OTI-]ʜT_C@|NҼg =C=]\90+0U$Ř` }EJnIE+$(ɻQEfhQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEn?濏GI5^4[Q@Š((wP>Һ*u)e^( ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((Wk:Ph (Q@Q@ \}tU'SDbQT@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEǚ?ίU'#lޏ _ϥAuW>zQ^QEQEQEQEQEQEQEQEQEQEQEQEQEQE}Wi_qWi_zx(:YoST77k:Tt_ (Q@Q@ Y*͵fQ@Š(FwCX؃r j{VjzE$vW&(VtvY|TJ亘e7ѝe/=&ߨ:3.A׎ {_hp7}=<]zyIEyֽCD^/$?A+593nJw7 u#&Kr5ga +=؉#T"ic8Ijk'-u \]N,? ꚰQREPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPoXZ6ܟ#MoK_a~pbwAEWq}IߏQeoh[$AF XP+Ǟ3u__~vmXF3c$ #=E~z-z^_DHT*h X#}?=o;_ۇ[֘vDV 7D:X ծ㳂Ke]PHgC?<I+׋~˿q?9kzºީNxGkk0j 8 b1-(s/Ŵex _Z'6em3 +'V/$OEῇiNsjL %T>Xt|?fF'޽-XG"@IԢ}uMmg%KZ޺_C(#>c\o hU{k}cvU8ld>^ǡĿLJ~cfQ2H8e^,́fkFQszJQVoy8Q_`/Ɵ;Cƞ ֯-BX)?uXo|=+'웣ILx'I 9&o4ل"G+d4eAR3?i{7mpK#J+~j-<˨K&ʷ9?{1Sn_Ww]֟zӬ]LUW$fR)B]%')Gwɟ,Q_C;OL}gu+y8\*K v#5?| ~#y-g]5t?E231\2wIfF-jL`]o;7!Q_U>Ug?,sASDh@ m+c܀?ٓg/֤kB >$~դ[-kn`nR@;gGbi*-Zyvm;s+S _$?~}W/sj¿fj}+ ҹh(?eo?~':FnLO.C*8b|6//ͦ`lH83_N~s??*kko#[/g3O:Z}qci$ڡ ܶ}+|`_Me_|Ymn{{& S ??ȣ.f{7dxq~{|sh#wLdv-яQ',2U?e|9NqN*6W!|{ODF(ƫ!ذYHȯ?g^G1[Q:-O_\A,\6F3D𮓦o-اX1P G:pQIk'eհw+w [2F[Uec6GQ±(|%_6"]*n̙IVCCrwm7Vku h\AV=E{W/ڻ_>&au6 5^*]j-R6i߿%tտ%~> 2jsRi pCu+_ĞaS]oxSH)}B$]"C`Ggd` Ҹ/fJk x$+絹7,UYՀ$aqӉ3ۢ_רF T=CZ+~;fx3X]/,΅ 2H#GQ/gf &}$$QG,̱*XzRsz$VW^gWڿ ~5GWƚ$FԵI""$*)8LpAt_:$r]m&4HvROm_L;<Š#'ïk$.y]cbִƈi)TqUr:H>.~i2\ A*Ŕ'܇H#wV~6RgבzWϏgٗ,y|P\w$`}@@*đ3]0zoxėAN^9`e}ܦz+IOv7\y^^#bGu$Vѿ6]`B0C2 SW_^7]^(ִ=bQAAtOL7NּگNrOKn|}E{K>|9~._x[^ Tu:d\J)EaEU}Wi_qWi_zx(:YoST77k:Tt_ (Q@Q@ Y*͵fQ@Š(uz#/nEmso\徠񏚺i^ǟIr-Uc峏j֚}*BdAԚ!y.|3W ]s IwIsc=йر1V@j{6?qkzqc1HU'*XJIG:n6cwS~ӟi%Ulv\EYg:Ƈ\m|dhk:}4UrNve&zM׋-$MNG]澛~'&O쨮ss_ b[^_F13:o>,x.X,d rcN)BIR dz©T-# Qj ^f5-V}FJ vBi2JXv`mBNGӾ*H V[;q%ekAv=cc.j_id؅TF\R"Sgh K:FБ}gIs+CNL_SRƔ (7 *9"4SԼAOjVv0JB-=,@4E 9Ÿlk\i/#Y3鴶h3n]kzu6w]͏*Yd'jϥ\##_~~V*Ÿ;~ tSU*++U^\Gi|}&ob3ZqȲ"0tarc$($+>miwh#i36hj+/"|z ; 4cV P)) *R$qҡRJ݊RP^vn> i5 W8ֽ3.h7tk_MIP6ފH q$` =d˿C>w%nmGДTVP]h&eMfI]cEpX+ĐȲT}K{kgO\n{G\+MZ\Y]CynI[y#8O|0)Z==r s8X>b&i4]F8m&YW>RE&i/Xy=gg4ivi~cqk:ɷ=3Wu/lj46hmWr>9ؽ}+?'>k_t$1XܥXiq:&;Iʬ4_yVgAi?jqcypc]ƅY\Ej;V79}3k7"=KTu*g,G,NI5d+z{X.;TXQM=mrڙTJÞB$p*_ϟwnO&|McOĒiA!IIi5co`8t:m^v&EOMKrQTu-Pky"3e!\`H={Wƿ?E}Mgnƒm$ҹm'׊5CwE]`kfMppҾiY{j}R(d8\jWjeb GUP$c\dadEt`!_~S?۱e5!|EF'['  [^X Fc# ī|299nqm%?MFROhoo⬚_~"*)~$vy~vjhO^*[_{_6<9R$`1V*C$S~J2Z6r(?k6><򭿌uݭs n H!NgfU@'#%jW]x4DSMpH|v8*A1NNR"cj+د>2:߇/|K?h-O?zO{D.l̓1 sQrI݇'n|qௌ.47W^d,J2$*88P\svOoNHnO oŠٟm7uiIX睤a^SRe&EJ!EeXbyD`:m}|Q7|;uJGY'1mfY6=jO?e? I5d#]v38MYXe#jCq[5{Gݿ˝v}Ep_~)E?|c}Jf"9HfXgV_b>98KtT&%'JhOŞWl~2VktF!YbXFG'#&ok1gnxݷڜax{I;-RV'nG-[MI#M\m[k:S?f[miIZ@Pyo Jv6px_ W߳o5MSA-PX̛6Rqؚni}\+߳oƯ=|IgڴR[梾f;3QK׼EYvky=\*|8f ?v(㌜u`$xᯀj$ M*K\yQfr+)>T4ri#->~|>_fwnWWFF#cB4fRzEӊoT~(Z+)Qx)-K7z.w%H_Ht_Ocýk~+w -n徕fbَI $O Ss4T(N1}>h|gl<cB<0'J%b)5<RbW7}Cυn{YeV, bORI'5Sg7ИK }Š(,((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((#MoK_DɿMcSIkڽ,/ N(8ϱ?p bJ+ۿ&e 5/j v*zV}-p<뚕OMu 6U<xO|@ndK'8sZ惡Y?g >|4uƸΖWR[-X-eQ?do#%_LJ>xKwt joo苸(qg»UBσU%m~6 +|+n>xjº"jse3K#\PI  c==o;_ۇ[.It[Vɂ- ϵ~A>,ҼmMW/bt&;4r4VXpFpqZaF''Ö0W߶?mgmth-)l"xe$M|{g4x+^n~ǥiڭǖƮ 6` >6]!_xW_]or"41Оֺkz].k5oiJ{1> ~ŽF돲d.-`B:1_~qk0j򜿕$^b+۞u~o8 ^$kEoql o  g!s^7'4GՖ[hU6"PYQhӪTȱx^KuTJOmgT[E?3^O&ER[;NN_Wߵw?_|IXZʒ-`>e#:W~!O<9V@'8!['ckŧ93l٫,kfǒi;Di!wyy$A2}Ͽ>0|ux-,v֛}Q3{k&myaU7$? /ncTt.Oy>xeo y^)>ǿLJI ?| oAq_@|-_P/+,;+khno$fC5lx?^f_Zw^oquL'&` nFq_Px/{ z?W:1T1sԅY;W%E;f4ߺ3>+x35]~Imbَ |18υ<)_|%yYxRi-$+5܎NkgO(G9GQ@wrOmkG jOxN^5q$({Yu+JSO(G9_;7 nݬrM3ȘC]d!]_aN[PwzwM~\-i+v~#𝯊%/×R0;ߌgO^ f|/EM?deW)!@ry$I^ѻ(-%cTһ}?CL/n^\b ~Ԛ;ރ~|f~ kjFr_}dTG0'dܺ=k~$xs?#~*k{k$k1yoU8'U5_x+:,w2E$g`l|\aJ2.uIT֯OOsm 7Cq:Hen2K FRI|'&/%ɬU߈~ī^nMK/-D ȹ*I9'Ə>wxTk߲6GžY]NgF\"TZۺ2_;?9_cNI~ So,{lc jCRևIKYʒ]Gʊy`8uc+UYTyFhիSn+Jc/9?Կ\ώ7Ə=c9ׯ=B{j,U5@bl汾*Y<]y[ړP %yb2Q$$^Z?-yi xv-R*V'g=ݶ6;\MMShפz>o?q?i^xf[?}prF܆mx߆|y'Gz^4ۨݞ܁$lIw# VAxkмԦ}?YC#[*a0kO_ fOz>#>*;W=iJNCP/rwVGޣ+6?Gg-i/[GbաDidEdueGo!s^VhBMS:&ŗSNc$/&1(1fS^់ ӿhg6_MpXီʯ~4.u Dnd36y#ƄGA}MJc'm}UZ)NM5iOU~ hz758|a=iMJ U}3}EH|s,+wڷ4[kzf&`*@|ZRr3ov[w (1>[xŋ+z[xŋ+zq?=zymٹp~kYhckI;%arl~FK}+K5ɤ9 UH>&xMGnTlX㷎u+;!_26XԨ:tΣ' Zō*1!PN*sZ:F-[y0)]7K4Æ?A| |U8"l'jRxYӬ/ uX_xnv6h=kO]^:JF"a p$U xeIo0[r8+>!\-%iֻ'R %ypY$?ޟʳZiƢЗڐYЧ~#T=1|Mޓ&5m\5Mqq{rUh}Wֳuo~{c8ҩɣ4O^Nu4Pf0nSXuCu;ăR'u F V썠,]gO݌Ͼ#_|\v73CYV/_|'|9:NJ4Ȯanjn*.bP)|P߲׈ "?W|i]oW >-/Bɒ4|#F9?k>!/(Jd5 3: 0??$M 8P5:w6aYsV+oxWSĿx'ূu tV)'$TQ%]@ GwTԵ?/j~_, Okh?{kqL?_P2['8t;_Gg{Y ׆W}K$D^te=qdc_ <:aj4+w(#Elx&T? ek~hR~ؗPY~g*'yfn>Nkz_mk̪Gd=> UZ//{~+G꼮30cכ~ž&~/jrzE&f'lpP6⣀W_hcO iGmz jg@T*JYB[8ۦ}ւ55u|˟_CJ~Ԗ?fEIh3)oRxrA7~jK6TQ"Յ$ a+ʾ ğ YsG{ۄR?&m….WnhHNmy]K|e^5ֵ/2R|-#̒yi)XYU8b:3MԿdڊA;Ċ_٭q]\Eo~ʟ6~/5kM@~eI*])g|F|wkpiLoGJ(vx!@'gyyԧWf]WOV*覒}>a)GO5{5Qko C!.sGZO{/=qn_J/nEXޤX > d>;4=wúu,f0EѰF+ RKAY,C%G 譱[=gIF`Oo+^9n?c1-g?iep]>]%~1Woګڧ1sF {H$ԡ;Wi#qkxEᕟ&\Ě]@C'rNf oJ/WTOuR߸^" 뎧x<**SWpk}{5Pv~O>Ҽ5ZM+M`11r$ߢ䔜gLbV[Ijtu?+exV]:|`,({׋i? [Y-ҫhI 5m$KE='U xN[c--vtZE wf1Zߊ?ǍCtw 3v^^]EF)X!`ۃ~.;^ RnwjXzhԂ?O 6CJdn\A֕*J5dګt:q[ߴ~#iv.kۼo6;Ff+5/' S@]3?.oyɑ-gכR?H毽*q h7dE nIρ5{oa_cXdGI転ۍs?-s>í]?81ؾ9h75P7c9Ϳ''J?n/eP1}T+Frߓ_8GEΣocӼeYxVV-i e)\ۜghSEU||n|7O[w³$isrxvznM˧k]ic̴M29ӨJQ]}nsy}}E>xwVCXwg>[2ɟ[#`/_? ⾵/? t/EɪťF@3cv:`/_? ⱏ/ɷ,t\}SS.#hd# 2 AC 'A,Di{d0 @½Mls`h?ycM{Y?+d6χ?WE?z_IOQ|^ 0S\G!ؿmx//m)7&fy4j|:#_]7¶DRUzq}>{ @J"ƦJ-SީN/Eeͽ0\]eP\!@=Ko*_8TXK2  ?W՟QV-~f]ſ5'etts;8/fw,r|4vwr!Cci|9x /Q5o|#|@[}_|#|@[}DC aWSA_5[]fskw.zG=Bھ='^Oke+<`6ܐ+?huoY^@?r  p7}|^ jIe,A= #G f?UFY 립gUoDӲ~ ݥ/`Β+~_y_KuOK$^\Zq|,+_kͅ2hx7ԫPx4 '?vtۋ#!8yiE$~s;+xþ*:ςC"\iwm >W* ҵ>?~7!]MT A-$0_jbTqqZNtNl[ ID6B1(5ߵo -WIgԣRxd vݥO>OW\%-jNmo;? x; w>Dwi$+vck{B_-ŇHt?O>lZJLf,D2O]WtVsZM_&J1V~kRtog$ZDuzVĿ~Ix,tE'5_ SZFGw1,h$_,6?_34CH!uT/wRAdW hZ :%vgHWR\WGU3R/XҔZO߲kM<#8xt~˝/iə[捻cc<1+/gi-b;es^:|:\I9tDӚMѮЈKyd:仴a;)˚SտDZ-භ7Ge&$3KJ!nꢽ/wѥD~Ɇ_w"4n{+ 7oe 6qXbPP8?MAZriYWH'9]?5µuG=z9=e𯖟gI~ n8lzo*_{/uxO5[".5BcTeOFo_Vxil~8mDhaLLzWoVG 10ơ8*$QjwXKJ3N~nͿ|bT+K*iײIFY,v2ik,'3+CcB͎upvj(ʔ*Zz¾+xT=uG,$(}Se_iI";DPY5w\|Nj|KiiazXl%DC㄀!]ضj(NymVNzew }2q^ز!t27bس-π:nUNXXe>דL}OxIu*A5柱>~X@ЋS$eq_QںSFRMPTҎ' |:^_*߳cvO/QD'U>jL?E ?_ e{oiY1I,oeJj#9mq5R|~[U&|g_KuF8$#O9Uk?bq_taH>fbOeo +5ுI?q㹡RXG?|#! 1/6ngiȖӪ#廒2WlAΫri뿙?Ÿ%5J꫕S$ ]U,G1EQ\EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPoXZ6ܟ#MoK_a~pbwAEWqQEQEQEQEQEQEQEQEQEQEQEQE pϪNSWW>#lޏ _ϥAuW>zQ^QEQEQEQEQEQEQEQE>kx+]M녜F$u20 A#=ziՙ/nmj^F%K+d[ֺ 2nzF6ntc3(/j .lϥ*4\lJQo»^3uu\)Zss֝xndhT;u飽)崖§e>^^.$8>kT!hr> H^Oξ$l(ɯ?S^m miNՠ63~.tm<-o/iFDgJ,#Pp=ooSХVHm fXMS[,Rv3T^><1so}8JZ+<ڗqnh|I37Lu WNn`+@8w*Lt0<g? j붟a9 O-r7!*Ez=q%Mlbe)otϝk~jIK ITrf!2}r8kVwoO]\_İH`Hʲp=J#>X=Vޢyͳ>Zex//j>>wK5r @_T`9/_oza,~KjO+XñP~U9_geW'ٮIG}o&~ԾAᖑWɷ-n@ u!R{bǿ/xğ>#:pmd2;/˽/ HPUj%w5'M;+起HѾ-|+ޗMgp ڤ1wm%XˎF9Ծ0~^"dѴ~JS_DH251%t\ysf|!M"vdXX^01u$J):qӗktR6GxY,~U/b4N˵3;d4QS)sIcjtu_NS7b^m|wGub+߉oO&'BexIAأxuqqI/ 'xZ>eosȮ]rỌ}Ohv^& #Rnty-!nV&YB0{%oq\|-cwW{YIK9XpYJu`Yߴ֟5?p7V*r1˱B8c+_j巩Z'̣Kr\\- ]v$_?Uq_Hvrh:EM.ݻCb'>| -OOxZb%=F@KM3V nۼs7Q+Z05?qr]|?.| [j,56wA Y}ǖ+YԴw?>2/S 4g{ X܍pZ3[l? Ѽ/4ܺvl=JQzn"~WݴWJd⢬fړnCo? |owQw~hhoo@W@7FNhR{%+)Bcc}r_|7f;NI,)>~?|[h?E!o GIݩOZ*S٭?h}nyG|YtRO~|;[(tHvYM/;:paIx:Ow701 eueTTJ\R W|'_ ]iMІ DUA 814_x.h:֩Cm,VCGo1#/ U$M]]88Ǣq? Krt1Ny.X5gW?z6xz0[I.wD6X* }Ehor4{AQB ;OWGkot? 42o,'YR_GOu y4~߳cPмs=B=#i$}rw`ubJ9}|I|E"o躜kc2)3 7(cgԹG\t.SGpl$%Y \K{nʬW+w|i??~/|[mfmI z䪻6*O~jx?X·.Wp/*|?%+ :-ci 7Lğ}??4|9jMRM<}mm3FS-4 _݀Cg?j4/ >.bMQnAr%X#9h|ќUy,'t'>)?gA++_օB\ v+6ug/gV26=IQZ9;c?V?f?a~{5_d>iߺ>UR~6wvКt^_Υ9@ 8*++=׿wVNߏS;xV[[ŽnݣQ 2 j~7|a~#u{=>Je{ Ȯ2̩87=7\|OCkٞ/C%di۹`+ayTAEx~ᶙɭPC$*i'Pc~y謡7} e&|>"x5ů7V˩Xɧh6,,l%C1-Ϣ'Q%k%QnlZz^U&bE*9>Yd#7rEs?ۿ?bm|I<ڜj& ڑRAڊ -^E(2V:~J*N-=@m?ƞ8~ 4Vz$'\(u+og$8R't9%(=ɟvH3ᦹmnb׶]T)==+-CE<=s0wkq r6Ѣ hzK%FҌVn|5"~>-[T_iA{_QJ'$a+c99׫~ bKnz_GNu%SwF\jK:/&L=H*$yE'RNoETQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEy&7ōOI%jṼeWG>i`t}ڿ /nt;$ He`yAavh(8Š((((((((((((AT_J^n +=bp%]쾣ts*Gc\zGܵW_<熵($tpHSeЂ\OosQEzQEQEQEQEQEQEQEQEQEQEQEQEQEQE'N,\]~|Aw .meY%R*qxQ_?zt>+ =fqMPǬ7 OyQW(QEQE%fZ?´6B tQE (95duEH=Tzx_MTmn8^A=_&ᇋz=ɷ¿1> iZM4V%;sKƫ[gUEH ><_Ǻ9@f>e:s^a|<__K\) 3vԿg]_ŷ ޣm"yDWE|oTmW> ԥ|'q9$<1lּqwcsf F ƶRq}6Nj=7>,Tg6i6`k\ku&,,bfGKRYWۘr?O ?wDŽk{P,gz>Z}ݿF6˵rz^jIp4LVϋ1xk[hv*\4 Fvq΋xwt32s4 #Qrvt2{۫U1.r9Fɪ_\F/3gZ2-ٱk!mf{G5>3xJ1uf`{\G_U& $jaI\s+ʜMK`*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE?buiu}cK&Դi#7EIWQU8'%f|wUC6[*?i%C:W 1OFom#WؔQwe_0xm?u¯˫FU.vV`p;^EJJJom#QUC6J+_mScu¯;[*?ií j=Nom#QUC6J(;cu¯;[*?ií j=Nom#QUC6J(;cu¯;[*?ií j=Nom#QUC6J(;cu¯6ڮ~Om?5:v\.H_̊־X]:\85?!@푻3SU}⯴*s'nq[ۙۦkhMuwu]/c4ai +\L& 3Տ> 5|W;_=5WYsgh}!5`=spfGsjVcQM4C۠zV7"4^7eGeKxXZk;N .gΦ9OV]7WE?kǼcn)K+[?K;"Y2GI(|f@ʺl{s qg~i> |="$AbN%~WݤD&[6yzFq+`8rZEVaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPPǬ7T_I5^:Oy[Q@Š((_ OVfZ?3N(aEP4Od_"&ޤ_k&[_$q@z1^]> |@\yOA_=0m.<]> ;~iziӊw+R!UQ%]xpv>2ҵV_)ww_V8Ϝ:WhzieqoM$wNO$^ mU2z]Lj.u+5ͣ@}*]R V$a6ď |W1pcncu! tm+0煮?r 5 7_ҸmkIk!7-ih)g)ŚZomwvE$i*שı%P-z1l<'R֮X).<'ڢF"2[һ?xj>SoIoq]#Z;fխg WƇ>~^ghV*4)uHhԷ2wޑ=Ŵ~(eUISSGvZ6i$&W^~Й+ƶ&EVQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@CwʦnoP}'r Ƥh2QV?4i^M[[sK^!xUd6ȸ'qLw'=I)9R&> >zi2<8BĿyqMgGuDX ;W5ݡ{"c7gjOcfCl?wzؖ—Z.õw>ttMbo$ҿec>Ec5-gۮz}|J?Gq,3u?7|Zg"OaV09 {VviKc\?iAIR]%wj&='yǩ9 h~@j S4GgMk_Q=1xq_HNc |/|1X|#}r?=4EZ;pQ{(+o dBջoٗ᭜oc'?o8䣑h-OaMf2O=8~Ta6^Y̗I)|8#V((B(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((YoST77k:Tt_ (Q@Q@ Y*͵fQ@Š(*56$S ꠌQT[\ӣZq>}65z)FWIS&;xI]cFY܀K{M1r/Tur?hboV^,jY*?O_}4)T[ʹ;ŰFsUF.N˵8z\EG%Q/" oҢS["\/"'&r݋ku|~sҋBhe$f=k:+T_MO+_wtyG%vJ93+b^쒊7wWT?ks:<Z+5Itnr(Dw;/ Ep_&//ML P'yg~6ozxlwb4a$+F8#dH1X<5VM$mE.|[ĺ̞$еFDu Cİ!$tI;mq=*Sv]UO (چiڵ6v"'h7ej:Ͽ;oi86`I8MnQ[Av9+X"D7; (Z(Y\c=~߲/~߉]li_d֤[FMۜo\]&RQ\koN{XofǗo$ʲ>N''j_~σJ_hpjZƟ'܊"f OFv.kT;$jME5t`*r$űu+Y]qx/#y36kj wpK3ēFE`Y~V3ZiNm/ݶL-gY mIOT,4KSs[ Rh? StwMfk TEF&/H7j:<+5,D2jOI՘IY#exVSAA?SGq'R,oDr}~A>/BV} )ZquSE$X"(f8ẕV6Oj׆^/nI?٭`T14sF'E`JGjAӿm9H z( +Ͼ:|f|?Fgu̖vj ؙ=_|nx'x%hI"Ϋń~UNvZE{yQ_?|~⧌-5_ \|EdX$;He?di3Wg4W_ƿ?E}Mp,{4(k:W _OK7cXG H$4&ҖɿU%OO,5o77Kmkm~'v f4gH*?#쓫x^,-ַpQz1=ޱ\QK&d4"ro_>¢?_'5o5i9p$ p@Ut9bX06Wχn|FgyΣX.r,[k`@yBN}?F2utr_ֈּYh~,4;^XFЬfB;FhǞ++Y CSgpם9F##)rQ﷟S~/ٛYZƣiP=ԆIer9fbrOMNrM9HFkN]bB+ /m㾔n٥Q+y |S/ Z2GR.OY?7|.co45jٙ&-HԆ N>7.E乽5Jh$~˿CP񧃾6\!kۭ>E4#;y?Oih֞ ! jwd v "N.QwIFJ+S3G|'ŗy1\Y⡷#+1r*\zC_7@>?}[:^yY` GV\ YA=k2/ا7{oK|cᎃ #`-&RVH _3b~$T<]/D>s 刚dpB@#.rBQ^-ߡQg5zzg_(8s/|ׯK> [5;PA  ds_IxSf[ *Kɶ⨤h{ 5'ɣ/lOGq\j-ܵ΢B0JGMA$xPA5?_Hk\ kKT;e*[i ٨MO{n齻tU]/SִMBe'eX}Ajqvfɩ+;:xğ oFݢ۫.%(ʅrut9 |vXI+%2Ӹu gE+T 7$UmQ_>~_ekt9RX`vMKm`@2`Do^4$gs!e`CpQYs'FJ뿕*}~wtW=~$-m][w]R̸.W8 :װ? jڴQC-a~a]+VYU{nV2bf(;s+_oT?l7@??yozuhۏZDQO]^si˹"+[AP XKWþ1|JmGo 5m+ᐤ,ѪyTPj/%|"-/\Ŗƛ\9PYKDF[iBIVcy{>o{D{W)| x&1'K&i|!p@ʧ*Jb_/<&1/Pe5ay;-{R"}E|>0q?$xA ͍1r++, M|ûs8r[[t(OY5MեоRVk=&9P,,A? QId-仺F-N1ڊp9lR\=yOJ+XcQʌߴYU+oxE}:{=kI^[c9]X E*02w>iEE~y#q~&fg%BJps޽O߲GF}Bڝ3c#m\3FspF9o*1%+*Qn}sEW)QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE z*Yo@_꣤ǚ?ίP%QE ((J͵iVms(4袊QEg꿵hϩMy߆< }k3G퍭,93!eTZX:mۚ5uIh3׿d\h3ŧ5%.ZLqq */Oǚ4W@FV9%9-6iS;Wt?e_􏈞=b0L~ӛf-{ج*p3C2KE%}W[=o'~ķ-op~oir2 fc[3Ҳ,~> +TJ:ܻ r2Ar+7Hּ[Dx[׆|/6ݶPH I98+o뚼,Ԗ☤~6 c=^T˧3ɫC :N_{Tcm6;_W(-D\֗R#my6? R5~w_p·E Et?m P|J@05"<8l\u?#ƾ\4S;_/t|7-?vLr\|#?as!b ^K+s2gEԮ<3=iԚ{ $ԼK}r8ݞ۹'A/| Y[{7J8'Ul֔_<S$@_4/>EE; di|?*QXkX; վil~_T02jE-^i4m?hZ7-$Ӽ#:䨒bA<z:jV_0&K'&Ҥ F+hdLܡ{dV_|AOxI5謒Vcɿdo|zM6غVD@ 36Ah"KH~?G=WX} +@.H#Hj%q%tΊnnQ+[c4uIX~~%|2<1hPX]+MK+e21_R>z7ʢR\S*zC4?o}f9XԒ[yPAO,Ba}3z jϛU^^\]--uS?H[avQ6O62%T.ohG]8f[w j?ۋ`~ OZ?,_=/0~>wAhvgD8ROq+'࿋^w!}cEZ5Ɏ1#w.9}igL(W,çIkb\^>k(P)-\}mMCj|8dƾ!OOyQ'{E,lo'_}cIIk.{~y&#p30n8$ך~σJI urΩ.lD?z߅}+FKia%bhhdW6ހk?ㆹ՟p-a]hсm[mQCJوfX6@?6 K|s^*m/~KL;1Jsy:sٹ|XEΣx Pz%K>/|ĩ)"IH|Y7ׅe×xُ-`pv%|ө~~|?0 ΌRRӋ5Ҭ#FqVjI|K?iԵ(h是} ~x:5έ{j,x5)vsHT&ߨ _ +oxGo_J~W+` BevTufᅦx+^V8*icu?>OIy%[40 ck. *ē-2z%ږ˝&$7O4OP~bI]C#7ls>c͖|d?\>K Ẉ, zֵٴ[NjM>`dI܍9#uU҄RS"8^[Xg>_VƳɣ-V%Ccd7Cs?Σ}O\Iy$cF(dfBBO@>_.=J]b-)sw$B6u{A8~:I a pF\r/mV$~Sٷ՗۟||'/w4L9#H99LkWOD%|N?>f_ͭ?+υ?K`k?\̿/(׏/kza~W a֮u_iŴJٛa(;Gl0X}~)VפdkbZuq_'2o,<+qo}C@qԅȮJ3)">>7xǾ']w-Y4r< Yv;X8a_]W?M?iO:ͦmu̼vOuZ9TsӋ~vάcqVig _şxYöZ:Y%wX9Wo{6~Vjz~XK} ׭(ąȭa??ܿȫ/H|o`;ZOiJ|Hվ#v]}M شFHYQ_IǿK Z+*#+%VLԍ'Ό? \dy?P> k)__qm'M/@WEޫp.\ =F{.{?%F|L#nwA>Wٌt7菒ञ.[QN½^8r0ƓWwB;"M҉^7d,?s./('|(<j (~Ok?^^|J!&*Y1*BR~&Zf6^7u߲.4;Gpqݥ&F?(1Wiq&O,?coA?ٗ]oCėyZV=D,@q?ogßA~8o 1w/HWF2.U6FrG > .]49x%??85EX]umakmu0ijC ~f'Z !>)UBCzv!\kjoڙ> e CYi\jdw$,AUwYƚEn~T)Mi|{>|(մa2VilgtJ4;*q9٣ᆭ=~Ⱥڢ=.u[F ;Gjo#^h"?>-^S"GpHti` |/@WtW'EF3%qjW:ƵP)-{i|RZЛ1z_ϫt>MZqo3qw4NEG#~u&-wG1$;/td\I pʲD8z^ ¿o:tXGԱ3__J3OϜ?ķuYkxbl~{_K|D,^08[K0]vf $$ Z2]SZXIy8+¾$/FcO(2'3%'^[hw"~ YX#Irtǘ" Xd`?(kCGcO}##ea2.jK)r/l{ 3\&hΡ]Cy#zF#ЫOfKIizEj: eod^ p;(}gk/|3kb$k,lvy?Y=h|W@qo[kԌ \BW匂K79Ue U/ku*gJ.WZ}i j??ˉ,>F?D5g* W1i0,l0Uc ^F+-d῁E- GXk} L8}_X7'⾇y5h& Er_zT /Ը䏂doנ[R1/%a_-ط*Zǂ<[ݴ7Q%O#+7`\p#1Z(+_iae]a&e&>$ǐGKM7MQ$)B*`1u淦SӪeR߾Zz#_^ 5[kenښCion)MHcH] :zOkWBA$QnET\pU,pH> ~%xVBt 9hź,a؊g m[Pyw%]!'YL}1fQAY__o-u*2t7t6zl(VY7ė#6G7=5=O֣X [R`jcźO<7zvaS¨d$&\,SzEYz +n˚c.QԮcigpĊ2Y+~kk?ĭ2X ʅ~yJ3ݝLvP3EK ><xK|pLw)m~/4/t&v#vbyf'$O_lo'NW~>#?jل0ʧv^S,k{{- h%PVR2#"O1rw9x݂Ok(FpH a;__<~x~j;n`ܖ *6IUvfEI6tu,cv\H*xp}v <-,hF2=+*so^k~ IB|(%ƇK_ |[{|<䀗ҳ'ozۛTQH":s= rRMIgF(B٬&`7wBďA]i7fhL':F uBD[ϔg4բ敜d#)Rt~v>jjoxw৆'YtKSKey6.l)zo?W_|8n$X]Hц< Wmt[5ТHhĖOT[rM.s9Z' RGj C E#: }ִXJVeR;B[-;hO%f.4k9nB+ spmN~ }QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQES]5fbTd8zӫϾ2xKDž :5 )V6;ݽ@䎴י5jE7SJ!l^+ƞHf״fr^F8 ,~kj]$^| n_]iIss+M+ FYIn95c9+'Iؿfgj6^7uns'<}a Prvz?3ρ/R}UwBR+w٠p88#OYt{}/Mg|g,FI'sԚwŏ x&zd@G\ /EKWQ^}vj-kq!ڋw15skMknc(s1$.}N*Z+k>&<:ڦiiPQh0E!L&8'Vp=v/&=֡|@ԦR =9ҩjS/@ĞI49"98 2I :{1iIw+ּUxwogUQ ɮrǒAݪv\`< c:G?|Z$ծcrHʡA3 r{>ףxI3iz}erP;姆t{N--| p?ϋLw%Nh'X̄I9+>%jk5=J#FsN?Z%~uu: -;4TOPkVcM 4/ %p"ǜuOj ce~^Ipc/짡>\5q✎BBO[Q{PdPk55Vz%G?riO4c/nREX q]5 5O`vkIi{$_}mY }@:!8R7mΞoZ=(դ]YٍWK^uw 9Jlee6q^kԮ㲴K)S9SwK/Q^a'Ӧq歫m]IxN[&;V8r}{2iY>%V5{ijhf,ފ~_%ZOJ.[ ·DĚg,Xnգ!F p{kyRPeROJ?GGƍz/}r m/ឯ+ڞ{[}2ɤڬ '$O|jz="7 \/%Hb{gw'!Q=~_noigyOsW__>6y2H/E9E\sG+++ųv^ݷC?`s\&l%{w$3${g}3RZXilv1ܛ{iN \>gƵRWp^۷[yD?8g"j-׷1ZB7<ҶZhpc[˙8cmYƏMYxH632$lWpHT^n ?=w2FS?QY>-Wj1kOssBe0w&YمO<5CU==J->.wl rx~}9$.5*O\7k^:Nk&D1]bO9>j1Dini$`ԓҹ74&q3+/BΙ-|#V6],Č=dpNkv~DqM)})q'lg1PN=9hу )#S.y%cy%`ԓҼ;y﴿7 ui,! ɱުx]|VK}OH7֫IuWdܺi=~'n!%2s]y,Oj44Z3siR>zQʤ.wjٞZiVs{u $IcXDp-A3,ktc92>k~)\`akcܱ=p1[~-+ݍ;Oͽ&xn# 9S*R+YK'UMKVmMơyq"ƿL^_6^]ͭ9bOT W#iFI$ȰX*Y@zu5nSxs|i~ xkW[{={Nc.Ssa +ʾ |ԧ#ommhgf^UI ?{x}Vk+ÝU' )&Aݦ+wO xaoj*dn4(d8׃uĵME&OcV>ĊJ.["Ks袸|\FZ \p>!s㗄n.;I=hnye`ԓRVEdo"ȹFAxg-޷{ҴfHA\mhj?_QwؙJ.6MyZcc63M:nsYbXԦ<+V#%T)׭WNOaI٤g\\wnvh$Gi/Xy=gY~`.$k{@FhUϡ_ ǟeڴk#?tSqZIl7w'_1i?Oƾ8a״f$qFN7$! QҤOxEGǛöi EwgD,Oݗު1Uϥ(چkMw{q+I`ܚ/0SrcZi(ngs5#³] xG(NO9+yw v;{ӣ -yϮjg\iMiڷi;8?B1TQ7*=r)kžQ<LgIv6? m;Hz_2o~EҴ`^j!,F>G Q( Z;;X52P{uIhVq*F*|W֩,Ekm" % '&QIE⌛rOZM"C $TzzVO h\/W0fY;nHs$s94wA|w} }Fr+CKִrϧ_[_ Ҭ 0?=MzŵZt\4Ҹ(ӦNNs\W4+K^H,5 %9axWNy# H5\/3r|vҗQ^HQ1sGkWNT-h."Y,0Jq5_??F߆<]RMϷcmnGPc\gEsE[v^_SUm4=>{w,7⇇RX rֽZT] (4 =fqMPǬ7 OyQW(QEQE%fZ?´6B tQE ( T/ڇ1˧vs8y+$}s^kvͥGK Z2"bc`7NUګݗ|wa*+kBһo^|hԴx<ke{2Q#/?Rq]²ʗk#W 'RkҨ=}FO xUYA5fk%Z64iGZthIoUYF!qˤ_~3YC1NmYw4H`Oʤ:t^Ei&]Nj|=B55V~MN]ZۚWs¿gk>=foE`X9s ~+xZƅa UЏ*fֶiacZkKt5󶇃|}>%x[GIuX ;avEd=+`RƤ`U%mǖ]u<6&)IME;즓-],x7|}~SnGƯ"oN?N6ύ<&V<3x {}QgL V|;Z|Ut{{9+ORL:DGzg?.jVk#7^@#V s^EDd݈ib1TN5 Ӻ3 ,ִj4J~Ͽ?jWO孫 OOt1]d:@p~:Oo 6/| .hqC+"#; 8ׯUOvP}>}u#wuO韟~||t_>(t5ӯ!$&1a S#/1jDŽO"F{` !;Xg"A(U*|[ܟbic䟎_q'ᯎt~[QK]vS־˙*}^Uuv_qG+i-Ox\{} 0#ƖaEޛt^m]1 #+:)I.Kiʬ<ώO4it-3uK0˭IHr0^0`rC^#> =S:>y|!#%WsKwY5'ݧ'{l|W_ueC7sp –M8i5O_x~/6-p}% 'es}#EJ[B)Tʿy7 |\д]&O~9xž mO,s;_Z.m˂׌1j]ڿWVN_l? Ѽ/4ܺvl=JQzn"~Wko2~c&CAH RJnK $Ƽg(ӿ_󹏱\ݚOWǯLyk_P bQtH褎;EcNNfiT+|e aO ^iz]ޙXGHT-yyH\ԺkjG>f|Ww?6/tVzY? ]:,͹  e o ~}ݢWjM^KNZqNT*PAKEn|T~~&4__ ~ Ukxc!VSF9~9)+“!#SB0̌g`g ypq_nZFV$gDysfx=XCK5>թߢ% bzx+w6P+TM,u5^ȱoFUd,7 2#ڔSuf{[˷*U?gm?^ƞ%T|Fns?kY&iM|ϳ&|ߥsߊ?9 I:uF[(6D>iy4w4wC 뿶;Z?oiz| oow6*(Or{Mu uw|9͗佅5 . 2En\ ]@cž }kEm.g}ʤ8j_)xkP]7ź,>eU-emy~GK:cǟnjZ3#W[M%f>wf zLj|Q&7^+X,w3`ddymS 2ʲ\jySZG?+?h#?-QjoNSK^8l~-|3% NC40"ʸ ;q_x¿mqwKqؾbH,1M-UE$vgv݁=>뢵UW/"mG2R$XB(PEm(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV e)eb 'zW/CI׉?oeGG8鶒9{X^ne.0s׭WL-o k&im$zR@zoŠR<{M s53A3- 7W+f=,5ksZ #u*9٘RqzRJ68>q>!x hHNGH`W 䜎ƶu?>X޶m-Ǚqn"NҀwAIWǗWkNx#@A$d ?Q[>(tWk_qx)I+MQ#ᯏ-"xb-N(ՌWg>\ AZKωug^׭ndO3dYO{/<ևzFJy Sњ8?>Iݞ?G=G(C#;k(V$%+_[Ǎ{^$K` mn0$G9+׾j.4qv?yw [ H,:TDMol E9fAoMcྗ wwa@*4R~N+7|wO:4]rT,;m9|>* VѼd7$d|t0;?$Y"%fNv#GǨᎪu mpp|gO߼"YI+sim[((u=k9áF Iu}oٖKW, $XrP? ~~z:[ukyS<~FjqTC4&YH\r߲g9"&hҺV>],6nT}wQ&_ÿth4ċ唰ɬz~W/-㻽G &PLJas-zW¶zvO;-BBV8 }uH[-"boҲj-F(|cd[ʽOGZUmUV$'/\kKCƵ)#! p>К> #XWPi.#B s|hſ? oEqsӟ]gҵ(;in$0?7PZ.~<ƭx@G YOBrByg|ᛍjqnDXrÿ: ݥSݒ IuF:eg|f{_:*k.bͭԛPYi1/ _\_]ƫF!=0;d`@5;JoT* (c'_ ?Wo7y,֑ w;V}CRdž␤Wyܖet Vl,Q%!:ܚҼYb EdEf_A"0t`YNAڒeoS6kl՚H#$4,G$^Sݟ-RLc##l$p03ևWa{wG k}áe~G#?_|\$FqOhɦ/fÉ.;٣PŚt# _~+Ӵi%J!5/^f{LX"R%+& YkȾY|^<|IơTG&r~SE||<9tK֪ _E{mt}OIm2M{>RQtwt|/0#Dž{ƌUFKf_#_:kQ`4k r[l?+矁zO_wCpHLA&Zwږ !Io`RVdțx<t]"`;/Sjw_SxKƠksr2I4 ~)NIK ?u>Ê:ZE4{ǂ o4l?Y?WWx%/tۣǫ{vna"{ew2,6!I*iKs^g&:?՗O5OǓ/>,\I{[&+s,M,gZ?LGRX)Ug9es>&.m|YknaI'8<mͮjcSvcǶ1^wŏCv}y?2檕ԛK0|@රդ-J1lV+o驥ũh4jQհ1c9'=k/.ux[¯r]F8 &̟]qJx7HX|%BVgd eO%?yce^ЧY4Kx#1%wZmɤE ie @P8F =?̘|S#?x=+[ZV\nط覽/cٮ-c9cL}k~/!ґ=R"^Q5ߖ2m4_Cf-$ >9m?ūK?K )-|$rSr1׭wx5=ٕ}:ijZ~xTFy;v#NO_¹/¬uAt}R3I @oYA# /S 7ѰYIŋ_sqzk~|4vsބ n5m%iA{|V𞓥3ro:# s{}Y煭I(ZUlkm~~nD U3eyV0r^~6 o$FHn pr~J!vfO=QOMΐW` >Ɵe}74O\[LTBdl+|#j>0<:Ri׶EU~KcpZf9{bW3WLwdGwAǡ_o3%Q$O"Ǔ/>,\I{[&+s,M,gVe$of:Z$1 7s^1w:pI3۟·o$?[k?Ec<ƒz]?B|abrpF?x lMA ͧv}ٮ,UgP.#b P'fiZžfkW53l}W3>7fm>O`nFrLqT3MψHiw JT1b;S¾;MMDh-e0f ``(匷Vku? O^f\NT 4??~j:iy6mMǒK#v~%~jtlҧK~?e_k:nL]WHInr$fq*|׼? q^ϬpZ#FA ׶xmS: k]f(2k?h#𭭮Z²ktIjHH o[ٻw wQ~%=xMf&%K]į'# \o$ji?E?#Ky#R'Jd;fU='Ew 5![$淘|:cb>"ywגdRS3;th4IG=;XR U"'^[; U࿋mn.5SL<1Et  &&[=5v w:42rdh&8v+>Vk˳_[;0ƅ>{ )D1!ez'_ξ4¾6vlFo ~a[ |<eQrWͺqR.O #W_0+jWM? ӷoxKŞLVp9PXǟZ-7_-4]S@WgCy'=k>iֿ-= w\+gPˠ["G QW+GnZg>?q˴k(xՊ`z~sj+ko!yXE8*.k4|;|Y "Tfo5x@-מZi?|}!v&cd-9_Reu#ZǦ[iSc+­qlzoZ?hZm0XATc_A"0t`YNAaڒYy0נ6*ikَi{=H_v=F?{x/~0x )(s~TKHA># 9)?<'5/'{!.x7X׏ZzY.f]sbRY {[O]Vm¾cٴAC *~AhOX^b% E{:uW2,VI#U$)rӋ]I>bx²\F_ٝq = y.(RfUgPꅲx(/a%Lvr,QgH?_|%Ю?u} !n2?:ܲw3 w>?bKb4w m2? uƙYZ]9.Jm21O֩xZwtW56[ab1=$g\>.Zgg#.,RDln+~[tme~?E;xt_ \kwmm!Tzט._mjqjl`x |~o Qq%K*9:}GO¼7,7~jk^ch`+?{WOݚZ܉{m=w=mFx'L)+{;=s [wuTX}\@Yc"aDtA?zq~_t1&DY1u_ŕ~.  aZhNj۝lGʺo`mjbMS.?Fv?t;hisR098u5>Et|r?>EVfPǬ7T_I5^:Oy[Q@Š((_ OVfZ?3N(aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPY~($ygelݳpqε(SoWGoJyW8۸:?x_Q~_?w#==kj7-Ɋ0x¶0w+ݹ>]-P%dy_qZF/#ۂQ#'eI['my۾?154SRqVBqOVgi>=&!?-a ''$y\?5 jSKųhw-x3^EUkg;UYn_PD- B)'3;UO%Xf8,"Ŗ9INkgrǵO^ ׆塏qO\5~Ϻ},u'+l=3^E562 +}6KhhPGJ8UWk_'|% Mps-@NN0Fzbr;+[^ \6qmF8"4#y$@{WuO _}CGO>y{vgmDWty-ivc@5Ɠ†9 |{OJn.vϋE7 ncAI<fri+ߩy Oď:oXY;o ;zK'zigKR7[.ϹJN:"R|+il" H II=!]ƹqBbZUI@'9RwUn^&OIJ[m"`${=^6eHLw+!ã)EmQCI;;gožz-! X1+k?|7{VyM{RLqHsIZx7P-f_nQiPkWılH*9O[{8"cs4qv ljz(mY*|6S V֯T}Im?ᙺlnE&o|GMG)nK-F+1 k\c|Л)~"޵!b?L׵QMI`j~X]Ϗ>lo|tU>%|%m.ZC{9Fpy ɷ| WZZ,g܃^6>m:v̒{yhQCjQIee}6  GBFAkjk?߇kA|~yk&7s < ;I^F=Yr^2'mk^u[kLw<*$A (w>Un^|_n.t~x!o= zW<'CCI`{[PڰRwf>*ClE(pd##ֶl ϦꋮzA6q@I;yڽ.942)WHe`z O"ȱ}eKyV8c54S琹Um!\KC<pIڼdžn&>֓g+n6G(>z*)s;|voDZ}o9\tkWvK[V5NR61|rp7מZn,4ψ7<k>n1E{&8_ t\\_ڶrNHQOA߄Z6s|Y,xC khar5k^'ӣk?I))8607$Z^HTgsVc#o:ߊA6emCEUEETsץzUs;u $ k d#w =ڸd|;}*]CW!YU#W2 9n|؞Dq?bYeO_@23Fykmr5{y{ĸ|g潪Qՙ^ΟK!mad噏VcܚkN{&?us$ GRzms;uUn^]mZ_\,o ܿMoRUSqVȪON2zשP4|]m-sW:Xvg$qt?< cIwo;~?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏ>?7?­Q@Y~c(ϏTPE_ߘ ?~c*W>?7?ߘ EdUϏcF dzQOO,_꣤ǚ?ίRQE ((JOOLEP0(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((('|=Rokf &y: # +>JП ?x?ֿr]]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@gQ W}k(`]@7_GgZ-{ybN I&VkqVnM#_lֵ[-";~pGgREy4')^gUr˱<˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,Z?>J˹WB|,ZʞmJ`[l~>h`]@ (S'Tdt*I5^:Oy[Q@Š((M جM 4QE ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (1|mh3GäqbZG/a}O_I{]9!K.+jOʋI5%BbΧW%z8TÉnQ]QEQEQEQEQEQEQEQEQEQEQEQE WWㆵWαxMGQ԰ė9ie9HOe1m#'ҾSQ_6!'MjiW [Qֵ+`V 70w>+ 7ķd(D ( ( ( ( ( ( ( ( ( ( ( ( ( (?C?uXPl;7'T:` %_fJ+BJQmP+*9U%G???ʀ&Wk:@EP0((+bS}?¶+bS}?2Q@Š((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((??JgSY+nhO YJDK  (0M0M#HRS?#$EJn;3S??E/ .??L@Ŀ((]g㨮O>$DQͤܮE`U-D)((((((((+%?|_~)/n6oG++ =(@ ( ( ( ( ( ( ( ( ( ( ( ( ( (>`|YҫJ=/&ś*q?=hCWnm-9$(c9oNxuUMgziK?#xo¿mؾ~Wo`7lܻZ_ßkR tmTU90ʒ ׂ~˿q?9k} o~?> ~ƕ5wkb="I'kE)s^[jﵟ\<u^Iqk#n2qR )-'QWlxt=Wp EK8r{K)9rE2Q__[W֞x[Emau77y6dNǣW~ӟe~,_`\=u |v8ܥYN:T}_4n.z(2 O5Gw_W߿J? ۺ ">JJ}|O@+8OhBxOUٞle.pGFE?`Ҟh:U$vŖ5qw?'?H.*1{ƿGċh{,mZIs"Pzr+ mo<|N|EgD}WOR' v+g8NܟOh~*UK#W}𯉿b|LhF46"q~sC9¿_kuϳI]-0 $rsh]}gQ©/+tiEv 7S>3&a!|յ`7Jꅔis5_|/ok6:m k)'ċ$it;c~XιR@U޴Uom[899m[/#ld?~%]+@4֜ns"= 9w: k;eY u ʑ~8B.C{L % UsS8Wrg|\o !ixWd?C_b/+z/z_VOԾ5|Y46Nm#Fod sA9p@q[ |OkMtIHn#Ap!HZO*o^FJ+NW>3[=_pӨF430u 1c ?| ֫K?Qx4uj< 9<T k6Яg$䥥Q^Gh._xV&.j>8R85q5ymg{QVAKbZW~a0k,U~ד!+ 2IQOO _꣤ǚ?ίP%QE ((JOOLEP0(c`zb-Rt\ǼU 䐯^+y]\[0+?rWuiqֳ5ش{F8׻VPB -NJ=3E7@NMr69qqyq FB(Ryy?:זrN e$qh\!t5͊=M'Ljl1̲e$qYۚu~^C\ isjZƣkiЌw{:vb6/zt`'-ugRTvPqo,s*X2A}kZ~y5~I=ϕH٘]8sP>EKqJJ{hoc]RG ,RxU?'{x'Ri=ŕ۷+ʊH#8Tg<XK^5ޥہ=a=WFRmGe%m>E(nfLjt~+f ;iI0 g^/4ji鐕^_LD,IqvfcR牴hj&mi-$E& k#:iقiWMMFg[KV(1;G&iBoy+? OO6(47-z[]B6%4M_fvfvfM&=S@լ:CfnRFGqV|ә_uSV>8l^(PiM', ?N)^M*ưV7nD[g\B1Zr{v!%NhM.Ro=:wwg*ꬤ>^\kk{SQm] rIٲo\o_xAk^Iۍn7<Bkȼ)KzK5V[97d)?\ʬ~#5xzfցPIݷp;G+'ݍm)okox"ng v+JQ7ÙՔK>ꢊ񏈓 {)ZAeʃvn&ݑE~i~)|%y[Ҽ#$G %pr=p?k~ʬ_rxKÒ~ZީoUsڧQA-nǫW3/į ㈼Dyo6ݏLke c!}gMWimly4IF%K$Ư|\'S_2b'#Y6Bqmqr$rϣZO{-l7Rʥ$qU:~]hH96W/ꊣiq.W[ǍJ3ߚo|S`URm;.]O͟wIy>|?OxQJdO/f!xoᮓfCa\]i$(“VusDC_~ٌ~(~_~D|y.y>8Ko¿ <Z^_m D~rUT`L5KJj2{E&,}fuK!ySyjs_ñbxҙ:{s~YĿikźx|JWs9vE(1 ߋT+J+[J)JQѻ}jh;9..{Ь\}W9k>,ß< ɣIɬ_\+)}"ĥ7nQӭC h<ˤx%7é4mAh Fzr{I'}:[)>~H>ǢP5 ⏆9^.|Bcev:e? Gg\Zp:!XY$b9=VJj2)ūr~B8 "6߮GO{Z污rM T88 $TF+T쪻7o;jv>muெMGIּHQGʪ9 c|?m$k2u/2//ވ8{I;-WԹ"3Z+o_to^45N]i>%{+F"DPVP~ǯ~> VÃTF jO;sS>YEEߛU[0.߂vmq-Pvr$K!qUݴtAEN>HIߙ_k*sJJַ\(gX/xú4?^m6yTڄ:]5elW~࿀:5K@3mp̣־kyh?h:.;Oشld/C*n3$vTT~{BOUkmL>כ#X@'mvK3b6>0x]Եv1w 7VU =NOD>N\[w>VVr -|gi~po"ShX`|` d@[c']djJ (3'ko G⻒i$Hlj&?,IrdU͢GgE~K<u_{bvy zVk;#YaCe# Eӊw~Mt9U$^kQ_O?#IZ/3VK)#X >kr7׃#Us件@P,L)S/]:__6'm_|QFv>hq1f&B8tHgCdi'/`[ᗄI9'G$UTfE9{H)AEVfEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPП@%س,_'?_,K%~"WYQ]'N,\]{K➛[j?_ 1kc+ h1$6Oo`7mG7ٺ^ͦ RcF!OW=p2G)[RDq",ױ8Vx#ּ귍^k\iS彏h'DECQ{8VM\G-wOk/ Ѭ;-} KGc KGcq?3G9&/m?s:LaXQ1H`:߷H-Oڣh~$xl;u(k/Go'ek"hc[12?hݬgYDr'Ö0W_"txXѴZ;K;HԴ*X=I&a3+/'}J+4JUiY!C Z_,\u׉OO($ѴqBʷ]5nҽv9贽nJ{9gߋZ]?|{?*pw?1_34?K m7S'+TBˆwf= ?:h3x޶Kkn\[H@N7)CSFUqo:XS5k77` RjQ2ƾ GVS\SS]z?x[EGjL}%XNĉ9&k<}\u7qdHTs*53Jm/TaQ7${_-tx,o$7FsvL߲/ƝѬhy#bcIﺻosJՓǷ-u<1}~q.W?Zo+㶋+Z/u_ jTm핌i#_0Ue( 0V` r?zR> |}5,VkXI^yRx$$qZ$)m[D;FQ_vn‹%PxĺOxE7sh:Q@2"/^*?:V?i~ $&2+chtnc~ ?tos z Zc!KDVn0'p9 } c;Ѿߋ_&w~ x7GO:/io&$;KUZSӖsg['gN݌H7rk?)_]6F >UҌdϮЌ=C{Wu?SKOQ|:C @eM bã(&\e5gdӒV>NVMnHh<)Ja@&2wa `W8<3tU]FwŦ104#ƼR[8t iif88 p&y+(e(E]oþ~ o#=vh{*~ᵅۄ(ITl$,NdTt5~okzm4`%DBggW/~zߋt ]g,ÐK W4c(’vQGTN[i~3mR=o=Eá[fgIVTQ=;;# ֘Gu~Λ++tC2q]&w|evM5孅c͖6]˸pN3yǷ,c.u|hw!_o>{պݟj%f~5G'gï3}iIO0Q#eUc')|֙mk^+}/K+F H='6pѭ+zK枏{~v5-qO? D>>bKIvmˁ ܆^%~՟t=RQlmo&I=yG"=A9;ZG| 7|WVc#[۰pI%A ]!~? u|S~,-_ϱQʒF:0pqyjn0(AZVv|h54[:0$(.Eo!#\/g~2!Ԋ,r 8,(k}+<3L4.&gI1]5 |(|d0ZkKZ5$= Wry'θx]6n#-ѻ5&lq+V :e^͋im0?5M^~]C_2Hp7g6X=' CTdbD 2mRh;o @n"j5O RȐҧ39݌o;x_<- ll>7~8_ I?4\xL[H¿f.aQTQw$/wf:W~?*)*?kqRK~u0VJ|sxUo4{47T{yo~2RTTga_Ai#qU+WqyNqczc+5DŽࠟ iid3dYO_{MZhW-eܧX{U\} cşS-|6 !Q#$acfe=@1_K럱kRV1F4˺$u|Ϳ xC QK-DR}ĎuO_{KݡI.mRֽV;/D߰u|AsVBi|q?(\V,5K*~?m k:]֧&C728V nla׍܁_7M_ 9Vv9(#߶]oȷ%n0r(Pz5o9Ҩޮ~}CZ ie??oO\x""6\LfAr$~x=+?b'߃VIlO6/nM9π4' 9-:qִIu;Xot먚+{ !! \Z◇'YE5fʫ7vD\7FbTߪiQJ.N7c&hw_W iDOV*Ք Ž9>~.k_4i>yZխ[1BpJ';rvWt;φּ_bGeXwsYx?ªOgR4fowZV{RUKJ ~?5Xz1rWq/yn"kYKۚW>д; :Nke 0ƣ ~+'vu$tJ6`G^~|]Ծ-j&+$Pf=ךi_mWQ> [ZjC)es~o$OQҙ6{~ſ t'$>(/501DѷC,Gj,[!Mܭ:2WauI_f^f%o(^ĸv^a]ZO24Dbᙘ7)߶? 0/hw7Fm²^d?:w5k`?h,#GG;@Rݔ={׬NM{pnTn58w11$ֺ>J嵒sQ{A|-^S*.a"}՗`|vaW?W¿^9 kaj J+(6啾\}I׭-u4D?ѢSqw`xyCMX?+?e?7Vݪ&?)F|_M\:tf"-y7?Lo5)'ˏos_Q\7ï O%j"S~2<_}C [3:.h1mYCg;hҊ~)_%Z*R_ ^6Tm|%{_MSQ$/МGvYjYUQO@)⟶G)>,ʾtf4a#!sW4KM^LU޻OuZj9i/X[10c;啥?H⯟a_o儼փj Xw:_4OF r_Ŷƺq6|=?h:~?ܟn߾Ӽ5 Ҭۨ$})ѯ C?nkS^<4>Z7 34w1rt,6 ĸ\O)^Ǝ)/WlT_櫲o-o_5zʵ+->P8T2~/1k>) sgYJ$kɃ BW=.M36i_YG< g".e=(&u^oZt>J۟R]\|Y\cO_vZk/)Ž툶V2c,,Z_iVM+ |)ǖ$WE衘¾쯄f6no^4`K1H}DE?_jG_ %^>[}_ |&xn?\m /̈́?_oG+/xx֮$WWL$o8xrdzR+쟌?}o_`wK FY qөWS^}Xl~6V|}8'dc$tOǚj^!}!mz$E%6ƈ͜w$`g'A*VWqSiJYy+wrY?*¾5e^᷊Qt?5@>D,=k$aR2R2`ޖψ3YwW "f_ Ql\Y_Lj/eDץ'%BԱUbC%2?j^mML֥z 5p@  ^1}2/4.Os{~i^Z88gw'ԁ~>:MfeK $PLSƅe=rGzGU\)_FM7WOkW΋tu.K(# [z%O_x\еZ\P'D@Mp_NsRg X $+ JѤ$$l`w_ORNG(h4?;xk'gkV[66}p=:e(?h'yGb\&/K q.9f! 񯁟W3k>!6Ŕ}S̏r":X0?hV^d_M 5d񅹳|XvY`O5!+W8 Zjhd*pMvoKr?+Kr?+ڹVDS(GVZ{{Yb[wdixh9=+|a/~A]-@ݔw$ܐ+bC)/~9{x_yapiHىcqH=ai'ek$Q}E_ُz OR+V]<+Mh{v Xgou_?|;iZoe vBG=>NV_۾&sq_pkЄ{h*2K_Ov)?_[/E/ Mg+kqO<8A]?hoZ=DмSJ^VM0U`7u?|,Mݝ Pw}R}.}}uVχ>Қ6n4wO-p=XGݣ+Ծ[~:->f|anO~^4~.C>m,u;190 UB3+|}h/Vf<ȏkk:ZtaVm}rxՕ;$ނ$Ǟ+}MwwpsR 6U6Y\Qe ~f7?w~'xOqRK ЖZ1d8J7SB*US_E֓'˼_= e~Ee,cI@>mw@zVLռ:W;Q@0B pͿvR?ݗ1uGw{خm|Olp3Ƞ^d_Vq烕ܵ__9&e?OSKS^:[K+8B}ڮPHB#\~#~|:Ve6\LْT9P?G#Jug:z6z1|#G;(Ѿ̭w D|6j YW!'Ob0\>/m+Zo6S:θ~e0BGJJ}|O@+8B((((((((-WthetB27wdXSMt&Vg׾"> |W_VKUJ$+P.=2EyR_|r|=VN%A!rkh=4t{_QEldQEQEQE}}سqV{__L/7Ui_zx(:LRTsm'>:]ҏR3_8y)/!KT4jov6Y<|A:ѝ|'^žX΄;3WkKg-DA Uu˚ϋK &ܕ#t=m[v6l{UxbKlv+ajH]0I7=FQ"|Oj  n`k8qbpo-uaVω8ul}=kFg[ZӼ uRwɨ<BFݤ=XK֥ѳJ6޵u Ob0,GݬZ4ii~&k'`廃ZXE3 dr}OyٍtC+vך`ߎ QY\Zt xkIV[+;cZ:΋vxqYu漧wZ=Ԏ-sXס5 Fj[?MƲlOǯxN ccEC~> *Z{n^1\ y(Oڗ.ީ- QDPwH@IUJ#qt_ |-Ko>Y%Z34L9*YT*'8-&QR+}~?^FxV{55];T7Dr:e Ђwl|#^hRhxFLZ( IvF'=k)N)ǧaJ*MK>~eT'j((泻횓0͹7rŘ\ ySE?|n𧈤b𕍜vzx%2ÌÑ_TQTI34(:_?l񟆵"5lN N3e?bO'Yd5~}J[{*3Yfbp8~V}悔tt>we7i>2g>\NW*Ix$F1j^ |Qwi>gn+HЊ˖<]vTys-sȿfG6erڦ|mGT6Urvd'<ך|dAuI'$D>񄤵սڟ\1fV>edecԛ֞T_\ x{OC # #$?+ؾ~϶?{\& 11I(u5u'>lf=?M#N$dE *.3j?6,z$oA`r!O{2ۖQ7[sMa ':Ut^i\d;r1cp:()9IE(úWU㣯>+|1Ѿ0T5F@H)k叉3Ouy KXTj0 5=G7YSc w$uY%:b-¬/''| ogRLIn^6;C25n/j>"Eх.T'k^(W:!rM|[x_GzNJ<'W)^_Fx`1A#3 WOqwHgO_j(W7`@I$eNVd5t۽>l553>r-mfS̝$]х)6 B{[{iѢ)UՆ MMEg'앾ErR[W/5MK'.U:A>QIMkfAj:}i:f;adf}8Z.Uz_C]ú=[c[[v8B)|uҫ/㖽EGY _IY^Gנ^KA*K/s)+YxOWE*{uDVViu#*>)*|Y#SѼS,j,ob%G\)WQ|Rܺ>$SU%t혴`Y) ;Z/ iV2$tWBҲJކ7{3x!Ym# y-r:W4QQ)%.0Q|t_r>XmWg4Mu#w( Oʭ܁הx;γxOKԵ}:$cH{2ZpଗK to?3T6}NKs bvOCk_ Λ _i3ͪK$q,r(nIˎuyR5~Ff1^me#BIBĨJ^m\|9oů~zڛB5Rʜzf''R\nVgᏃby~n*Fę7?|L~-nE+M.MUR!,[Y#!*yȯ$?oJDHL'4Vqf\}-gx(дZCR≠q@W'I$њ/>@t yj0Q$v>ҿc?D}/xN_+%ƥHL62^ھ|'o(=5@h wG1m6lzwϕ>8~~)~x.[dA;m X>e22$g -~?ǣkRΓxF)VK=V5{)(GB&{۩i?+xwCzV COv'$_+oC%޸n]cO`ddRd}\@~#:HfĚXs4 AƧN:hFK_aJ qW:lѴnсVVӨњ TXinۮծtdgm#*ng@36Tz_[w3tZ_3s|'>]&M؍!Ē9ēi#'oo^ "c`JEo'#e~ p͹N+] 7&9SW  cg&y~V6}g/?xϊn>)xE6f;{]9@tz.6xWWkYv؏d{>0#3g>ߤsO&"D1 |3+z(*Eӕs9vt:x 'z>WᴖVMA+F8c}EfT+s>./uz&0OfR؁_$x{x>q|6΍MgV@$rN׍A9;A5FN]QRJ>> Ҿ'7>%ž2S|$UUUz袪uQVy|FIxcz}{JY# c #ztcP~  \Iosy]j6rKH F@+(c(9EI|]~: K>!vh(Ц8$5hBu3s_JQJ2qwZ(og;Gl4W.>X °&b7gx}%WZsYƳC$^Lʺfr4\oi)uJߩg| j~rQ[# o!% )a5z/^Yxs÷zuW&$QcHr8<׹NSyͿQ5cz4vܴosaa% $j dq+f)JNrr{*Q[ *J ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<+ŝOIdJM<_n \nc<ؙ267?xP59,5K yFNAWz4pwL̢+ ( ( ( ( ( ( ( ( ( ( ( ( O5Gw_W7ᦧ?"Fj4@$Lvp=vbCGU _uoᦧF}Ro!$"˃"V=QE!EPEPEPEPEPEPEPEPEPEPEPEPEPEPL/7Ui_iǮxǗ?wiIv|cMyz|EW1dt*L@i?濏GI5^K`(QEQE1)[1)@f(aEP;D|P'PeoVWlʿ?x:C6͝=?J2uZ=?k.խ٨}۞} g |ƩybKy#ELHS_f\ X|/_*hc"Z~O nB$it ه[Vh-bS|q %hY Wk+T'Nk;c:EI. # HC0i43f|YooIv>WK\_FkѴd7 [׭9Opw 6RjE}qS{{GTc"Aza]jO}jReD?L18OOb oҗ qcm/Yit\T+7C6 }YHvEg{=:ſ ެ,\wfjkAqBk3ϪYf3ꨛ+t (aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\ď XL)zU)֨M'</WW *~i?d8v</WW *~=c?Ѝ{?G0_O{8v</WW *~=c?Ѝ{?G0_O{8v</WW *~=c?Ѝ{?G0_O{8v</WW *~=c?Ѝ{?G0_O{8v</WW *~=c?Ѝ{?G0_O{8v</WW *~=c?Ѝ{?G0_O{8v B7UFʽi?a`_#^ +o(f B7UFʽi?a`_#^ +o(f B7UFʽi?a`_#^ +o(f B7UFʽi?a`_#^ +o(f B7UFʽi?a`_#^ +o(f B7UFʽi?a`_#^ +o(f B7UFʽi?a`_#^ս/!^%DWW WQGvW]& +hlG b8P0TpX̰(S'Tdt*I5^:Oy[Q@Š((M جM 4QE (9o3 agkƏyX _2_i}u#o1R߉ZkϊxY4*I p_]ZMgAUͽbAӞeH洿jr\yr=6^Z+qrx_XьsKj qsW{}-Gz&-x Q5Rg棟wj#KrP[oKcbP5h!cRr1'Ph $HRBZcU1@|3q_ רzwV0&'!Oٲ܏͋)bT)z&;D/3P4 < +G-6^tA͉4|O{{Z@- Arq_V~7P).!q$S-Aсe;r%4(&$T@:LoN~_ Gh6 Y#^ssȰG8UP2I=~%aEh%< A:ZC',}̈i*N?XOO/xVtuFb32hif Tk\[𥧉/z Pe8b@$cҾrk+oh >?s4ZU:( Xn$rsޮ47$kz))6&}|S|]x[S쬼C6tbY1U=ʑWU_ ~?JUH/N&xGԣm};p}/J3[V(=OGY6& SC5}6qfYblu)##4 Sjzާgia}2@ޚ2ӾҢOjZ''h3\yHO1 ,R(de`ySqա)'dW//ԴmB푉-#LiF~@22OL^?^{\7,#-v]o1-\0x'ᏖYc䮐6+eC56ivhӇ3)Jevt>9ំ\:u]iDvU O[7夫=k4Rʺ0X{A?-_JힳJ(]xrK4` F02piKe}އ5e.Z>V'a \ztgold_-x'5Rt)qg)b#3H)rNr6OIhF;ɿh-8/+_ӡ;HdYcnUсE|?ml-6ůHfc(5bF`B'5[ýko|iMsS|]]OG% `km zFJi?>͘W$tN]8~^PU"8i@ԁ- [7Hn ]+1nH$pY  zZ/2RZ+Wʬ_rxKÒ~UaJB?iϺ^|I𽇍!qE{40p_L#HHPI8slϒ VOh>>?hmwz 81T}#dlQ<Ɵ7"[?% aJ|w.ޯT O!X_ \}u?<xC{ҰcR8#b1j^ 44뫶*\A=䋄\R,hTd*=BPF{[nQN C pP/'~E3F@ ]m(֗~>*.nW`o p9em$b)Iƚy^k:[_t$7oadم|o??hw+[eN| |w־*x;YߋfyYyyՑԞRy$בxmwE_c:{k%6-v,U 4i{or}nmuwjWmwçXeV+U'߃|5K]xM"RcN0H9]+Y~YNny!r+>EagiǾ]jV2"\nVYUK}<՞M^R_j-My5*# ˣN 1r/O'? .5{Z_tBEcԣa:cRԽ\uZw'=k?-|5|UJ=7OA;* c#?^ῌ 5~#C;i:5Sorc#g5)jwou{9Wl~Es~2Oh',-Σtqn3?QX썎lr,F Z~4|Z> ;|W0hSml=q/=O` I>qE~^|kx^ _đͬy,H %#j.?4so?bҭ$Tѐݎ"OJOF4{Yv6.8"^#Q[{Ya&W)__mS:2Et4DSWp`WOH⷇w.ƱWơ(IBRZ*)IB'/VGm9]/mQH:t-sEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPQOO*9T6k:Tt_ (Q@Q@ XX hQEV]Nk:,w2޶ƄfD۶ֵWb5UL{St>#µ,: Oѩ&zn?#RfduDg-Ϯs\7+Ʋ1{+I0hC`˟)f8P2M|-/ۼmN1fpvv'%QIk:}Y6焂ʒyoGa| _Ork~|5Ҿet(ffE$v ~&T1xK ΅vo,ǖ' _]bUa2YF$EAݫ9%ICT~};MI sa={iK# >LOF|U;7|>E?-蠞@xX~hGu]̓]˸[(s,Oܟ|M6+{U .r:gT?V('o4_SFs)[*N^ݛ]{0o E,qFQ`(^mK㞝T/=^F 'Һ?v6zȹd1xg+R[Ȍ:2?5lDe<&XR ;i?h/#4?I{ xLGZ.2{}%km}|pjOm%i#- DUrGRE}?Me<;SV ck-"`Xҿ?fok%=sRoi\F*j'$X4nU}f^z/M~ %~Ţh~&Ү`hEH*01`626}7>{Tn;0􎑼eϻm7cDЛN0ZM&s+3Gڿn+ܿf2~z 6vMEFv_𽂒kJ_%_ohG]WMR\GUo^.0.b0&*-*My ,@zm2On5?.𝷈t}Z ? \Ds-mqduN ߀{_iKolQ:?|?b۵yI8DUn5q-tc 5IGjif|:Ӵ;5[ ;[{%u HWg_{Om=y+̆l O?.x')?\?zk ~gKW#'x#Oů\>#IJ6pw,]ҳwk/inMM^k! ?f~|Mo͸~ ;0O[ߝ)WOr5cKG&x/KHDW168q H=^Ƴ^;M]nwy' +E2.z.b_lg|ߵ?~Kf 2^X JRd[+U$Os_ۧ~5\I-#h1DsM}7 &/<G,h4h%o(13W#?Ck{qij˒`ԈȐ gZN8jj.ׂ4,UG%}̿h^+[R NM"9L$S„g/Oko xP!I#g"+21?bsmC{5vw!R>R/zK'?*ծou rH 5Ƨ $&dfVbȮK|3u xdͥb̂I ĕ` ncӠ e\3[-ż ĜiժSIWW,N}ͫ/S(#&o75 ?eID?piTY$ _)Qh>GIg_\r,9W~1BTFNXi_/I,Dm:մ`~:5?`4dI6}O7<'sC/F)oin!||p_6A^75/s/.=]_gԳ$WO>"v4t>uȟΪ'+5߷5J+U$Os/É~-~<-q}qi᫛ˍjW1w VÐ!8ҿ?dOcxGOu-7L JEpn漯]E_^aK_^臬NQSvkF*x sx_v׳me{/ћWw}EV?ś+KyxƓ `BJ  t_ X*F s$zzjKxVHҼZrБ #q_u6K1~g| 5+CZs|SGzF@H*X|i?w.?XcxG﴿X B?߷WWⴶ=Q)Ty*BR~ܛ-{ُ*itz(* 7?Xy12oCPt߱_Y4.H$Ww:Gh䔷"_OPg]藯~@dnΫ=YcUHz?"D?O200?<ߴ߄o|u.M}>H2(h[o aq?bY!FeP~˕8W9R/ Ebug6q0i-2t㡮?oZϋ|=Mi$ j0\EW睻y9#&)dZqOChu Fa5g\FK.s*YrmO;èFTVk{{-YIg]?H迢:3t1]p,+.1bZuwJOd~33CзP>@k/ Kqe-h(qT12h 31u$RjG¿:GM嶘_JPtȼy__??|)izTdqw/W{&ḿ6>`@ 8߰~!@ɦ% ܙD~bڋ⿉|Jyk9d6igtrڪ1wt4/ьڵgsC0*ռqR!֢k&|A {uJ(п?}>GHڜ]j `lg Hz=3tf* d#|]/[O,M^[iUVcB~7Bb쟪ߩuNmo>Ж-?IquXL9^W\z/^( $Ix3hy.:Ï z:^fc*rOJ&~ԟGOLv~Ϣ8Nȥ]؎88>/Kom#ͼ_ E8Oڸ4"At6 X(-$q 8WDW4>ݿF~rz~eOKJk/K/_*F`.UI 'Ct< >cw_1`t2Wٖ=վ ]htGSnRmq楣+ F2UTF>mπ _vk?yq)|Y0V~'W׿˧_v*ԵX^UPX@UPZ]7c∕e奻hsWɾ*>׉o>}b;_ S ۳si%oث[MZȷi*a80[?-EH8ѦGqӒun%]#o~5C|4@Ѭ#'8x2فmt;گ_zW9|&aBdʝHܻU9}!մ[cX?aL}C}WP&_]Oo2yɏ?oZJ8-{/Œ\&ZyYm("+V Zur ỷc}=g Ͼs]MrTٝ4˺ (4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (o?R\$l yN2hW}z<6Wڭ'lUn#]o0kheg"l)E+_27mxWI/MH ,A,C ~l=׈-37̵^12H6VRIּIjo>;&۶23uxOK.+V8DsGP}5/ƋǧgqM- H{b3ڳ|>ڭݎ#鷿wNhs;5C; cZWqYZYfm> yn#We / ㆙k]tD)~asڽVᗅӟBCE I%'wn\/ -c;yrKV5x}B('&i-kl}AS׵\go,ȱCy*M)%VPnH}wZYA#h̬ś ^kiR$@ܧ|}2Ciemtۏ19?U7yW'7eTW3 kyf`H =k7YΓ_rViVqa}zZjyfE 2PǧxxnXKx7b9,6^Jݯ=$HZ㶋iZ}FJXC=Iq%xs3Ҩ/Ѿ>iZZnzR\UJIgk$wƽz&Rpqv@7.|?F[ٝNB 6\} QqEzhom6L -yT` Eϣ^pWOEr ~:>k{}qM<0Y;Fpq\ sFOڃmc  yc|}X&&g$d3T~c_ڭѡ&-Lm H9こW_~mjj Qsy#j r};t=>+[|2ʑ*+"Ə^p?|vVNYxa29U(N+&k<=:8U?(#5o?,G%8} A/o0nn.aY@$( o oice2K/ݜ~m 1NMy5twi\\cs+U\||E& J<eitEKqBOgm7LK+ !UZkuݘRN5ti(UWh*}*kRдanq!G$xƽ4|V'lq$裿$MuOEy4mjoXMb1vc =qצ{Zu2nm%uAA̛Ep>1͢xKTHu}[MO5cLP]? %XO@E`rQ:OO6ڞwCJҸo՚E:So$#7ɼs7_^A=31y:*OZ"w 7sž+KK Y ̍1]xg }I;Y_rAzA^+|a|]ylMG lv{:iׅ<'vNQe>h cV+#Þ4u8'Q+G&=Bq>:&:g߻tM9I=yώ^ _g=z]Ҥl V80}sT˒DJK'x?wV@c ~x?xvZWJc W}+&NQa. M·s?߇յgI>aU_?SIGI_tfo}{[MC$`x+1 ewS-(^Id8UQԚue&'OTfIM6<7Z~BJVqEu9eg‰gtqfBI^/@Ю֝YY\*%F2SMIK#ÞK=cS[;JR6T3R:Y?< Ay5~ [OIWbq 82OXگ|7ᵷ#TRГCOjn7gˈC"P:]mxo _ݴ?1m!@K`u%+YIjs;#|+tvL I?JvxKQ.՜J8$5?5WZݬ弌/Kj+'kP`$H߃Wf)*IʩA^bBJRW;/^ _,ph$E?\q)42,ȡH2=#oŞu\鶑!m*!+u+ 6;=n(?*i)'nۋWvů {SO5u$Fi HERo'WxODU˩CoɈ: |fg[?•[|KO>\ 9 +.ppx S 5}N+Y\eazPN=V+KKti0 EX ς>* IM0dx )7m6gxwQ|v:8H.}`>vu,,-KO$x"O(on_̻@`Vd8#dqis/h5:-;\A 3i<}K_jTúCeږԌ~rpzvy$ ks]_Q]ItizNX|wo B}N[Hf1sw&?j_;ܥEo;3J+ߘ>M4գ4C@yH %|= t {~, =յ GsqH]2N*Rv/_jnRЕNj~!{ƛHԣ慕@=vqphMf GQ7JdIw:d |?aSMG4P  5,c.Fg)G'W lnv ,vF?(T~0xqRӝC8+sϸ8iZxJK kٮ$]~\tǵB˦2KO^2iWRBC$z` ㊱ ղf)4nۈ#Wvkx_WaPS;e.;>zLJtEj}Fw"F)=H .U%39_^ 8^I8V+? OO#|/H$^kc -k2@3EBRi(R$TWywN Co#Bk.<)B̖W$NWUOyנx_ZZoxURG,ĎsS\Rz]ծ4}BׇHdܧ~"+۝>/Zmk1|ھe%IMST4$ERϋtYw x2>`;^QR#.S2>Ǐ'j"NaiN1\JVKYI?ee wVWvW]2BY^ /4F6<@/ixDVKr*J2CnQg\ǎ>#h#TʶwK&:2\[~АZ\_W[Әv=8J6|L׼uxb;9VgYGWCx\:rV׌C^XxW㇍-Jqoi SldGr}){K&ON=5W?U$m8[b zN^XxIԴŤ*ÂpGbj\+7a 6[y_Eco@`+~9x+T[hF;U!xHGsWqhɆؓ⫟bU0KhrǧZiյDݾ2=N$Wme"<)-&kԚv-æW< du+n= WERTsJ2Mǚ?ίU'`i_κ+|c@]Gg& )+'99r߾g\|i^ԬVPb_dc'v`'Fqۇ|qO[,2%-vRkp72TRsÇt+9r7~Ngw뭶G|^K_~Ųiږ=3r9U Sj2P+!S(*\.z|0SmV_=uy< w͗Rǰý&>6k85(4Ku9xȯXjJ. }8dJkP|e-~Fo?cJaFcGQ^_ǎ>Z]ir}4\M*2X G$yu5TTN)eq5uRZ;=xUu5?21fUBsYA<;ڝ"ӵ ;z|]J̪S9YA 8OԓUβl/q7{mx !?Dg5dbʓ/DܣpGr=̴?|j4Ěm"tcv_AQMTq}:r\>*P(Ԋ猚][ [xslUɏ AT0}zݨdGV_aئܝ&۔dp6w1m獢65Oe?5KMڔ`։ 밍7#|t*a'=9EM$'j.s^+}sVMmc]?Gbvb#-7MO^|em,v1+܇yaPc?0_EWltGWOק)|gnti|;ɹXʠPWqՁ#Czߏc5Z=[Ql{FU۝2x#(ukNσ {zܖ6zROf?ɵU8Ǩw]sR'/wv@qaN=**i*[zܟeg}֖>l5ߵ$iL:sos4r\;lU2ÜtQYs>E*s5OZI|F-i Ҵ\WVT| yoCQ/Ǟ חt͢;ɸ 7 H#:|,run|x/uxGD 7:H`dGB}E{W>hΉLڅ̞~JL`arv$kh%kGWMc濆_Xxu.qқ.LaG9s ʋ$R)GF `=)TJ\ь[h)ۿO/gji6=?=IBe Sv8$LuR3j{l|kk7ÿg5+&}Z+\:Hգ 8S1<Ю%wT7H$Ѓ*$>-Q)+YasoOgO?x>&/+۝6iduƘOC_LEL}8~̟Q_q5o7Zo ݔ uc"S.-n#hAtaR; =J\E앾Hq\ngũ(_mV"ޥ'.Ɉr:3Z~ |wV㟎) YW4CJ5>gTc+uќ=3Zǀu/jv7eEQ6$}־@1~_7.⏉>t]${f-,*rJx>Ue˭$P$x~ x¾&%n }  s兏~M&&ajƫdvmZZQ_[PRm}<# FK-:ma^Q_#kkj⯅r,r88ٴTs;K[ԮTtcெo1FҼ!z6q9w4UKfK6#Q }7R7%I.mWW\̅?(zҥWU54"6]|OVo>2eơ/tgF{d22*H#_L/M*.3mrBSY sE8֜lE*1GQE`l|N~J?57U*_J%\d-~4<-?~A_"(x0*#S= ԢW."Q|>| +|4BӅc5S`:tS_d/ZUo_3=N!Xa!ȯM__OO!*qPvOE7Q+_1{5t۽>x#&ھo[ nr\f^*9Ɵ_J:I'5F #`#Tycw}-EG3_*k&⧄-Xa8X@ }fsСKXy[D_%@^}_Em*o<ſXZgaS~&R`_KІ޾^wGL״mgľ>𞩩vH'p|`A:w4Eg<=x^_ 0iqCo~_#|`|?T>}>Inm<=y(۱}E?hYiRAgrR5Wl'5=VmܨT>uGMoh/tf-浒YE72eTFPȽ\p }coXY—3C ʺ0!EXW]kMnG(]mR#ޣ'&ϖ{[V |Nx㯊k1B7Ȉ2+h֜lS)R=F'N+`(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((¾PvG5e|cݡɧD߭Ikwfp ZxIOxž.K[yR)ʎxoʶ~/jF{b?j1gn3F؉S{U?>.4?^ėM4@ӱf8A^FyzZj|W֗g*y27W5ƟuΩ06 :rǏP(nN/k1%eIb 30=Μc$)BW@x5t<]\0,㶓f#nV>$h׬t-^M$jm’GIz&_ͬfizbBF4 {3ϠP\׿)mB㦧qۛ[y`@⶷wO[|?D!`??Ug ľ/GFp n#KcKź>_i.{ |y'Z;^ ] ݛ4;O ,cmErO'$7yy'HU֯K1Vp>Ik׈>ӢIi7gڅ%wSou{ѥa߱qPG^Ğl.cYKw)} J nO^׏ zRMz[c*7¤0!Tʧnƴ+<^q='9[wĞ) ޴VF䯘͏ / zw~g~Ηix×l!H్X^3]2$[zGM \uѫIm \r}@#[;gȚ_AiUYdQ=-my`{O\+?wvǟ5_ҁk7u- ݹ~_ǧݾN<ٮ>kr7>]oWoO,jn,v rp 3 +HtG8B p6Qumm"l1E<M|υ:Jp8?ZsBRfw95/.tk2s#/U;ߑ:o˩x.uVtY;6@AϾ}8|oxv 1P$0Ha|lu iXXǩ&1^GKʹ[]ԬI:\yc" p="V~=խGv~ME^owae]n|V6q $R~<|1 ϛG(|3~c]X޳%L>ôyy4IERXPiW6 oM2Y<Ƭ|c"I!Oq3 uc)E{MR|SxtV҅WNJ}q~u|s fkIV(=O^]znj4+[6Y`+5|YK&z fŞ(vqE2dV}k̾$Mo g<)M}F<|+HWZvzZkn*ڃD;E{2ƹb{^7OLx+N YsZ~k5m_4@ߴ^SF!8+|+q#:@?cy-qZ\诎O񭥥ts8ҷgޫ(WQo-<cX׵-!2j]>q1%q!$r6Q^_xBeYb`% ׋/|{垘r4XUJ9GSRsOS߫ZKuקmc'>9۩LE 1nj  m3o[u]~[_[Rտ\gm~;'[e=aRrGӠW'e_~6v< $RanTS+hٰ)>_H<F׮w* MTcZB\#}%jrOw[[[yPʲ1\W<eZ}^SYJ"򀣯 쮵 k;xDfa.3W /Can#kUI 8?QXnYrr7yW_ڧ/5Ɏ$h$u'r'?A]W^5 =u5%YAW&gMcڽEKUJS5#ͩjzff=F9>ս^[ikˬ|5YH] ]nX]Jx׭?)"9cb!CNѮbRT9ڃIt]YB^Auy*X ko,w|*tٖ vDpF z^#[Gz\:6I5Fb$[h y+ϵi*WAi4C;{ 6*@pFeFU%A,ԜҼc^&/ Kf6[ W#rOp j6ne&{+wA"N_޻z |A=M+=Op:wz">so"%C*H9/__ďyG?<)ڨi|Ҽo(~ >:[ŶsidO2U@2z5|f|Wcº ess*EJ/7b]\Z6 8 H8N7䅷k/௉5ӫoda g@a wIEjd-䄳 CH$m [6]ZŴ%+PkqsQ{$ g㦭s gC.!Yu V[^ɟacfk'%|O󥒼POF~u_mu=H=.OO.55y?^\kֵofS'FsJ>'0u3^7Y2xL@Ғl m^WmcI$6293rL w%zO֮/֟ZƟnݚko+b 6j ys0<j&o-X_\fNXIy{XR_ p՗59uEΪ];|_/u6ӈ;٥$$z__ir]K呂Rk>gTcW69:֛@ "rr:<7>$Znm]RLHJ> n7Otd\4τq?ic'sE)/r\e_I~R_3y _p =;{U{5c.xRS#[<9 |cߋ^*&6ZDPL#sj|U[ wZ1!*y¨MCnI߹|#|JUo& |A4{ecþ#X,.$AxYxV\o:MžrHo.bl~ 'ƾ_w:x6ڭgq( =1Cȭv[#8W{=_34_ 5{۫wʐo`??f|9V ^Ř2jWD{-COӭl/58ͼVֱ,epBԊo>_7$gjopH) km7yяGk^؟mpWGGSh#| [0=^'‚}ԟ^o|;Qs,qy!X;z O]6[fobr9rR+_og__߉M&NfZX]8#b7|FǚCYk)KBH#HATEryXzVnѴzb\rIojR.P@} տzj]?R#i:]:_g\+2GD5:CjGfZtrFy+Au?-›k@mɏ*%:zǁ4Il]8cOuPOS|]BvsJ>'%l@١@ ϶A#}^OXzTDK=bN\.ݽ={F U3(}X(~~|3tp_EQ˞ >Ƹ7 j𝆚[WLrS~ k{^$|A(EH]p@2wƞ\1kIG}?:/ձ&,K'C61TM~YO7Ot{+XVQ` ϏiXYAysE ٵhr79#^;LO>nmtAW+E7z^_f[PGnc[;@ϸ5ˣeŞ P36H@Pr1׮O<3E,Z_3 s㗊u]P?2 ˙%ʓ[hRԼO> 5ehEUZ˿S3A*xbHloj. e<\׶[ˤDY u$I[zI[1~~"6g3Mg6Ł(}J|?Gk_ieiP]<-S{?-ɖH< q#ƿoѺڤXbkmps*WEߕ"Jk'k]]ƲFѺW~wGg]-[L"3V{>[ZMޡu"ooHO^90򵏈5ilwsh}J-:/g &ִ/QmY{3` t${~WS]Ʒ{hi"&UlAWOqϊ^%ޠj/$ k$ ,Pg_^V~yy* #FzxNk=&W;%#7=+~iZ'^9xG Y6"'SEpv^.mV3yT/+h86*izUcan`(=պ({m x@/+iʖkv 0H#މeڼ[F"FR+F/τz 㺼Z_ƻEիb@??zG[~҆HҽiY Mh%[NA8ڣm ڗƝq̀ߎw5OߛY%c4z.ok{quy(vYJtUtO>[֗u+>N2289*</k ZVsdC#7MYsq}B`kCK8>z(irw0)n-եxJ*$oFPLյ]")N^ Y\g8>Vg{ZowVЖF솞3۱}1׎M/xKIԴu-JKJC݀һj(rn4? _k/5G2!{\a7M~6nṾԀ9HDu{^9'o?zv8]cφo BK+[W2E% r0ĒϠohsuZL[RTRˁҺ:(nU~Razl2A\zFq&?7>Kt= {uQ+Zʯ{>5m7ү帆ݝd-lʯ9G^{ _k/5^E%'Җ̾tiAV[{x%R*x rgZ^jr\ڱdY$ֻ/x?Jl5ko>FSo)kjv<f.b+j.Nt  peD>X׹''օ96عRw8O| pt, ~cZ!VMs?,WsCWB⥹0ƱCHaU@v$|5}lZ=˶S6WivV6//eSr,@8QTUP@P01NJ)lyn=x{Rԥfg 8 < tז5^0g\gފّ zEEmr;@@q 0H#B^&aΡDaKYLp.{^E$vGxS~iuy/5EnrMv>%ޟ}3SϵH{ZPۖǓZzE`msY}8UCpBQgÞ&*]54V+( o?EҭϐbK|= {uUsָV |Kwaqy<_:0$TxuTm(C3AMKy&"} g𭧂|?oX4* XS[TS>_"j:F6un%QGfYծmP`2 X`iKs7Ӽ-ŧvik!OrIsX8SxD Ao-X$AJ $y/3tȚ5d9I8b+Bl<5Eiiݍ?RIsZSrmXJ)jp87]}9 n+>:n~ϽsnI.Z z DWB⥹^KBGc v| Ek?ɯUmj85ɹu%;@ϹEM %K.H1328sz]E_DVsA.6%ݤBP}y3jκvirE8(M`jo簊KZɃ +؎$,PsKMxft͸TqQBvA:%?z_Nvei ӫcncj먡;l _pkƟ4OZZi#ϕqm<9Hg:F--c:ǧ^O> j-bw?!^E%'{~Λ=.=;J[[T9ڹ%f'}s|ƷjwbMYYgg_-rP5EVvƿO`+i%²aK4K/vvnp.ԍ2IIWڳ*N'㯆:(Ӆ!;v *LAjlf;5KU34&=q"j#'⥹66[İHUP0-T(*9U%G???ʀ&Wk:@EP0((+bS}?¶+bS}?2Q@Š(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((LRTsm'DFB䓌tڏ7Mӗ/Sj((((((((+[|;&R-:dEөnuWƾ|O LJ<-tO RfMB9Mr&eaד־ʭeNPI˩g7(=~|׀7wVQW'0}?_D@raJ2gהW?rW1Gu[YSNwGN2+.ep*J +富k"O? 0.\,c&y@V\'fUS5> ٦hWQs%d9 nd#$ ֑䔶Ok"Rn;}Er ~%i| Dg67O(H]IW#ߨ׀|H#qr-\-ޝ}\[Ν69Sq\ۡ)ve+翏fѼep ^+]iy@$rWi~ȿYi7VYzr:Ao.{R%(%(TU]WT˽F-lm"iC}?-p׵(> ]O-]d෡ɑI Qit>ʢGq|F¶QeKMb fYI VsRR)7(̰(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((wI5^:OyA(QEQE%s~IW;_M-QEQEPEPS$>k|'8!B巚=?v& I.e;^1C O|+/L^F0ƪ3ִO/$k^eGj'ᧇRlmϛ=2f~Np>-|Y~)oC(Dž䑒Xwwigd׈~Ż+O`] \ o܋^)ЃI&k9'NRM>|_x?Z Err _ |q{Ǡx XXFuŊŠTD( =?+MƟðGlw&^JogQ{5oVciIN^|H&Rŏ|Z7.֖hࡕd 7ۿm#]e5 jM#lHév^G0Q ^ Wis%|oeErՒ[8={_յ)֣}ZNT)GY2I+i/^1?%Z&%Kj֋ l&uYK ^ Ho脯k;KnUs?IJR>1j_~˫Dεs0BGI@P$ #!xvzV.XU}Bc# zcg =j#Ea T B2IHVic^ 7 $dUO#pB;+IuHޣ)ۿ0b~|PPT >Ӵ(`ѝAxr|f_ ֤-.['yDN0cxKoA"ޝ{am(nG͹U?snx]o15Äowj myz]-[+ۺnv<|WۏxcWW"{o+;XfQHow?|s&ڶ3=İeUedq }SgA(G@|WaizlLζ>A̿Φ*V]61JTO4_ď[|;[y:];IvԶ^/ǿ^+.׆-:(8wg.Ju8V H.e}b9 R?M}'v| xfivϻ6X %v_-[ #W/ O|=OКY-m&9/&̴㓐xoEbktk>ghVQ? |?OR9_s=eG>4_ EduJJҴ,mLѼ(3PZ'h/?ry'̗wyi|-}z+n9D6z1p zkz8Ē3Ps7,jßs_D|e~WƚmKm bp*:M>-Î1BEtU;{+|Οq˷J=ä)܂ iA;Γ\Y!c'(G^=7.;cD'?׃7leB\syP5?cG᪼wk[zO_׿'u]MQkz>yDʀ`p3yGHψ;'$ /_54òioaYkKRQ'pօ$m|=RiڍGeH8=< hOwUԴZgu9o&DqV6G,IYz^?NTOܒǩH:f0E"[i{E{M~ .\swۼNKI o>' Ż?JM9QK#fI%m`>ft?c~zlG[Ld==F zyp^e)sVTQErEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPk:Tt_EQE ((Ju+wP>Қ&[袊(hVTd,U#t5'~'x@c&-uUc3ɷ!%` 2H? ՜д70Gq uT 5t&MY(ݵGOڗ x3oX}Q(m2>ʊX1 wW٧TOcySNrmmG Q  }>E5>y;o_{ o[jn֍oO 097|w[C~(zA}.3p>(>U}KxVv:\4Jd,f2R) 5K޽LO_qƏYܗoo\BchabaȮ!bg?S-{q$14FV|ҌV!?ro>&;\(?l:ĿRѭԬP%uQf N1޽抎oݨvw??>)wx# /Vt[T-<0lRp יT|uP|%񖽣;VԬ#LNֿ;?y1|\/=8@C9|+c^_'|w<=gc@l5:_'~j1RjX {PKc{Uvbf>Uޯ9F}%Ci:~Zd |s=EOF~]߈j|P5XM6D,U$hWVk_w~:xxcE+m%ϛ+FVF9ҽP_sIs9jӱů?fW^,ԛXoGv-VhlJctae8\j =]|-k']wyAN: <jiֶ7Y!QfE _שO/GxII ƶYY-']9Y܃t-?~:7¸KY/ڃJUޅȼk_xqm-oqp6cP=ASeI?ԎGs_6zEl~ZExcߴn㏉nkz.h!bw9灊;aߛo=_^Q]SKx|5OcP`HcIssWZnM0%y{'ltM236F*)Ir8AZ(%);o?T"7}Q|w{z +#@(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((wI5^:OyA(QEQE%s~IW;_M-QEQEPEPEPEPEPEPEPEPEPX> 4R]JCm5I2]iL%ֶ(AEP0(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((wI5^:OyA(QEQE%s~IW;_M-QEQEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPk:Tt_EQE ((JUw0; ެ_ OS)e/xw_]\\?u<4e/xtQp9컯.yk)e/xw_]\9N.yh˺_(sw_G]LJAES˺_?_\Z==RhZ.Qa3 1 OV$@H=Z]N> _+'0zn\6Is~qZh\ƧOKNn6n`3MnER((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((h7,jI-~WO&7ōOI%j 81;+=8пŮe˩\UG0;rҩ'~ü~зx+sɟK8رqvg_+2d2Zށ\:<pBʥVcBy$RN. ;.v_>1"𶵠Fjl3\~ĿG?hOZJw%hbQ@t_`;b}>DZ]3UGAޔe/hjսl9(7R/DyE}Mo?xŚldD Pm/;ryB}vWwNI]?EiXxzQ'J{HO_5 _SI6MwP8e6d*]sNQ\,jڭS޳㯄/a~o.U\IR3A[^)O~xn ؊K#*ʧ9`H h{[M-o;_C|HE]~&/ قn<=v%h}e bGR>'I.kH[v֪s<IヅWr+`6o/V-!+J$wP|W,oc&XJa|`8 8c9E]&( ¿AT_I  "?A.J}|O@+8N»ߍ_izmcyX9?,dr+;g>]<7WM[I=|F^Ng'_-e/KrNo3诰a7ZfK/RY-XtŢfCS Ҿ~uVVIm&R`ή9xM𝏊.B×uY-mpXmY1~FO`W ?*2L%[jxsº׌5%Ӵ"Zak<8xsAW4綾)`wRxB+8|5 xOҮ4Bjml BbxϚlں}-(J;??sQ/ŞcVs]Ge2\+HUe+7ZwO?PηI[\oW?uG>I(:{EiB6|El{׊Ui+N\,VJ0LL` =+i`!_ʬE2ṫ`G5M3Qmm(N<{X淽C-c!F3## yA 6 xA_{8IliՍ|$d⒜\yaJ2k_ E}c~~*|FdIoqԒ9,gE˿/a'-y4F\OE@$珕HBk{_ x[-:=3PΗLfv ȩ^ߛE{9Ez٫ВHouNCgK69In|Eixkq%t;.^2GTi&Lb+[SQxNJwӊmOiBBsk`Ee" &QjqSMQIJmڣZ+Ծ:>.Bzvum6S-$@ AזӌQqvaEU}Wi_qWi_zx(:YoST77k:Tt_ (Q@Q@ Y:(Q@mq;FQ]}~$K+'Q]㹽nxPj(>5 WMWQEa{ Z,,|ə~ۋ?:y&rݽ袦$D\ìJ(eHY=Wf>Y*b ,h'obV*Q ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((#MoK_Q^g'tQEwg؟K8رqvU%ox#WL2hc(B=(:_yΊbıYI9=ɯ ?QI'=}ٖ?NI >lp=9$5'kp z(ZǑS18wN/-`j 蚧mVGhmK=;Dd(Te#??;/A<SiJ]6vKmr8~|CouzJ(=*'>|xm_Km=ݿ.?Yfc,TYS̟=W|ùҡib?ݙD<¼o}}zĿ,K9~t05g| x;4~ycΞQZFtv(B(BATQ\z?G5>Q\OoQEz  'kO ?k9QXߗm.gO#QQ?²VtQX~? agQ©/+(YMע=KZPߴgÀFG_+LRkBف߹Z(G_ ;U|EV'W[?O$"dAކg%N:lʲi7j(/$_GD٭?o}i&MsVcJ1ӊN[?i^i?nFrŠ+詽ɟK֎_G{?nlsc쇌{WUOee6h*ڙVS Xb?|X4~^X)YNzKh y+DVԜ4#=袺K9OGg~S]~i^f]QS#!T3__|r yfwI+c (? wmOIwQњKT eT#{+{?[A4j%Xq؂ASϩ{J>khbHgU:a%5Y#IH|F.ŏ~TQ\46q;o[KsmC74Nݤ0pxiڤ`q^;ET9QZb-QQQgnome-screenshotC     C    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S((((((k6uQZEBRZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (mmg,*yXT\|L?@ZNJWy%Xff8ֵavjCEbo?/\x]7NU87ט+4lIVS_J&*Q[~ǔpal|'/+i+J}J$(93Z'Wpp??_?}FOIUgbrLٯw@斩 sVuHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQMf@6ξXTK}|x;HdfQTX=hݟfv뾞Kf_)ke4Ww2n죧Qq~x#G?k:5ȸa8;0Aioٷ?^.'2鰯XGNͲ?[j/ qTe9?LyY)*rfxtZmvy3[I/]S.믭?,5vBUfxVmS1z}3-/_aqTtZOOɟyYq2i/A-T(^+w}PD|OQӕμja֋GS S +'~yͥ6v&U? yNσ8 ԃC+ۡ&NLf:SM~o>?7fY[[@3ܨIBFH#? [r*ma,Ǚ5q8oR=2{W,%xWizk;Uzrb(37EƗ.Ygpᙣ=H3WT0հ]:U^ 7tŠ4xb]$-#@7EEf8\Gߎ>lyB`OgJx,EJ>w}?Be ~EWQ^MgÛl$X#;^Ow$(>Guᰕxx9?# թЏ=YYE|qv(<Z,dGxcΥpkZ5΍i )n ?MUO6#.tw8eaGcYu-OH>{DjrIkDef)*jҔ*OFݵzPsntW~3tjOc4ƶkܤ6@MIxV^h\F&Fp2{*a )/t2^*DiQQZEym,LHCe# ^_CMn5VEPH9aU OOQ֭N=Gdza%A4+}2o܍1yET']<jK9jo3"8u$ݴ=((('~5VL7LRL13ƉE}S^N-7eE:ǥCrc<-yG[r}[͆F;v;?GӔW64+pPdݡFνO XKPX(Id=ԑZ\i{݈aq2;;(C ( ( ( ( ( ( ( +柁?|YߋWqo& 7eB=}-^aj5{'ɅCiOkP+:Š((]xkȴVR͂\-! ׫%MY)+QPPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQENS[oXZԥcj|S%Fg 2I8Ar_\Kiij)_?JiIWhm w'?WYZ7p#fvz.~}oT]Emm HK;8'Ҿ3}3j*슾~^#Kghd\QY}=@Skɡ>$ͦh*%#МһOٳ?5MS0m"k5dO+  /=r>,OmY_k֣U&̠|o髣PU*F= |Sĸ[;=Jo~UM̬*cWŏi:Qn|Q =I Ic5<1ڣZ4+?hZmtxvq,=ʤΔ1Uk-ߡʮ_/'-oe﯒C uh֭ɹvʂ2vq_ |]xѼ;0iD-6ql^z08,Ӯ浺K{\$2VFzkk+X[H}"_Er|0G5^d5WRߺq7;Gꯖp.;kG~/g/i<>M=ǬҾz߇4?>]KMe'_*l7ǿB+;q3O_ @x}uŢ =Ǭҽ*/ח| EES'6jD_ϳϑHQYN# |f:Ejb9[87󯜩ȲF̒) Ѓ^SS}y7.uٟkfy7(?gOW^0e潱uIE#o?Oz3M}ѭ~ M(֧?*n*xJ֦p|5[oQ2 Z密ko.ץ5!#;//#? л _MS>7Yx/<-K ǜj5}{}xHm^P,meGM|+by$&nTJ#ᯉpgs[UX Tg$L̯ *8#55uLY*ȱg Tܞㅕծ-ǦM#PY? WݖimG_ARTjb(IZ[O)%<;kWCgc M(w>#&#^6ꚞ,1"E y>y?T۽GN|~RTe+z/ 7oڲGҥAK&޻C:`HdwGOk?QmW$oW@'b\lya9\ ¶:&kF?4N8dopxzƞ|yUͳM]Of}+C^-yCz"D9 ,|#^ kѤlE;+ %U+ҟNlwk~_<fYk"(Ȓv#d>o<'c鉈-畆iޑA^i.|\ͮk0" 35gX~] /][=qu9 (T .\>𝾑Ʊ|I rp߳oצj|[mv<-:_b>H?Prs8]ktV A鸗ccmgn]kj;*}&|O gZ[K+4՝]cOD_Ek?i:uKFPۢ(L%KFoIQFq8Ezd1ꈼc?_4**fԗT{(ѩgR)ه_mZoKc ,J;r0{ ĚtCX,aismQ2^[UI'ӭrsEEɤJpXg N)q >.h-ЍK'Tyg, 硯?jOZ/č'L3tVIWbc~e ſor4j:Nc^o[$>kk2¤/î/_JV=/'fקVkH͞!*dzM} >3RÚM, ^cMx]999&zdzMsdK>bw}llVYlMm~9JWI\_'>UJ+1?ǟϤ8 9k?mcgvFC'-\ud 8VUA[eMRKϵ!Aff8~;y%WWviL3E;t7fvNHϡ*wOM}czn+?jԢCwb*vzwckxSH^؍൵㏜C~W W9'ե ߿}:% c*'};_Mbzmڸ gf2|)ugmk1wp̄OZ5cxZdP~)dyz2 =ĚWt mJѺMk(uϡCyL3855%x\b89EG-zq7b w<3x Ҵ}rO~2%.SWÑGXidcŊ1U`R0s?m\V_[#[vndgVBO?{jxZN< }iMsk_쥟Ad}c,%OoqR|&U֚xSG+.͋e=C}|C͘O!/ + A~]TpYfgH)ǛVibuivhcJo~.5бYa"a%W>wk~ ]Ce]@a=m il:kOm5 Yi֢9 Oq:ב4PZ7wbbia{/%7%qit= k?-7ZL{a8sS=#r><'?v->aowmlK X2qdt=Q_He-ۖ2xI D?Jgc5qx(J}bpؘPĵ%;٥mQď7½U [)yUddq5|~f7ךe+5VB:\$K_"zeoz4ۮ.o8ԗvxlǸa\s Kiuo7⭌ui%y<qt"[yFT{j4hj=Z)4' :;Ȯ;ǟ<o]XauFE흲E$/@2+WJm"r#UX a)Btqn]bq8\D(ZgZj}uigtF^yzO`95 5AqH:5{<5uӖKҖI!@n>xºk&ZK2IoOI:`TC`ic1KE+w}Kbgõ ][ڃ^6+ɘ,Qjq˟byZ ,~;Ö>RQ[!<18 ;=c> iZf~5KH/v c$95c+`{[4va? ^xm䲴e;a̲yEm V1(dw/̡͍ʈLa ~5yWF²=O Rj1槻[[F/Oa ZԿw-fb@AםClxKN<Ʒ@5埳/H>0x\WCjʬcnn,Kz|ð}_}Z7^Ю,YơG8)ᲜqIs4I˯…lv6ړP5vE?_|FZwXVH{`9o~8/y%XbޥH5ehOEьWbwFo]6 ՟<3|O}^msslIXA*r㸬f6UW]˥R*ѩ cُGL!{[MoIO7q Z*FJ}Z.MrknQ_}QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETWWP[Kqq*A(dY*I=-xg?Y[9MZ-d+gaQ&8YcTvv?Xz2#i|H,½Ί/\F7H~I H^QrV~ǗGWWV\['d|-Jx,4R08IGLc+uу+ SGs1sῈaIS K 8KXlma 8aQ@P;y# PBKk;rIG{47Xkk:$דP(bÏ'ir~OJ⟋o⧆4ODek?g8_iݒW>4_ZY_~U^!?mh+÷>3יc묍 cf ׽}Dr1*'(B&¬_gKgҖҕw^gR|ZiA2 WA3oC,)`8Mme|M|l/d)V`8L=0{(U ע{ :Y/"]ܤLQhK+8%9FQJIko+ye'ʚwWS׀~՟=j:M}Onݶt?_w-[s$  ym#~6<'m#m}{qxR{pVnU+zKpԼ_ëxSǦ^%2[Kt~QbNܕo-CF/T|k@rtp$8__t\߲ZY]<,:x8MFzw}=~(էDQF?rdu0eBϤR5CfQEsQ@Q@Q@Q@Q@Q@Q@x7~6G¥!mͻ 9RL)"_סfݟ<򂾠?e\A8u:9~5.jecLUj.[{-?0y,^)mJ.ſAmZU{WWCHy0dνS/D|8?:^]|"nh#!'1υf&o[{F+%6/b^^lN#g&ғ6?/ZC2-wM&q&7wVRp=yџ|q&%#e[ }^1Tj*uug٦z41֤ԃtutW<}JxS'!`M vA ]'he :6|g?tyMA=n `N62A?'=jWouKJɘhEէI.}^~~G{-zżL76ʙ~ӐG _<|T4}Jkd}iѤ;\@G^ JQt+lmWN$SW_>|Mc]k;T^͕mݤUKC##HJj<Hhv!zmK[Zkd@UBco]O%NSEҽ/yrFA5=_}-E|]c߳?4#x>kEef2U/Y;v d=\ ڸy]L;dFww7U>u}::*+h+9"]OPvO $Aqr9U`gXc0_UP*)[5;4M0mEKtf:(0 ( ( ( ( ( ( ( ( ( (V&ndn\)W]~ciF$#[ 8Z6*)`_^!m_> ԓjL;oG4 0&?|vq{kp?8?V.2_'K%Ֆ{XHmK`% :s־ne(X`pA XCwa<~E8/ OMFG8ku*)_qa1 im|n X5X KIYG2?׵z|?wY4ߵ4Rc?d{9;xRq^aqjߵQdtxAy9 2I+QaSIX#x QNI5ʓOkُ㖙—[z݌"8"Dq]F ^~%|5>]#Vխ.< s6wu7VIos #&*GB |>[+;&3 O]ˣ_;*MsC;œ  dzѿv}:k[drC*d`pAh>%YǢkrGoxSV@vp:8 D~|J\+­±to>R ~!ϱ<;4eCk+X[H}"_Er|0G5&g«iE"WVs`,G1=_ssZC%.cT#=5|4|-$Z.G qjwaPkI`e]QA׭_m%)&^G5>oΡ}ikEy1E}WbF Z?\o00xnU[߯^]m뙛͸qICB:j5q+NREjr|-_C,enq¾鯆ko.ץ5bCsES)?-Pn|g,gMOeo_TQ\3wcGO>}/ ? 'Ώjʻ%.<s@shv |9yweċ=XH@T.9c1xɤG5죢[#={Lӵ uC]OPkًᾱj<. =F}Gʹ /m/<9-bHkS3)wcx䌎3f/ZU]xIFl>½|F2JRZt *L}%Vi|t|:t)o54~I-8YF2Wەo5sE#INA񜼬;]WZcVԮ3,ҷe̞w$ 8eR?}oK].yL/q~~7|XGu6ql-XxSW gm[Afdյi1ǟ(l' ǢYjI/[o X`'l@G9xP+{;848-mbH-E(TP0ZVo5;JoV?Nͪu|([5 ~x2:X7l=}U_,?z7VPd2#˸AMz^In^ #|Ga\6s|"e|/lzQ_{&6SU.fR? _ihzſ4[ Nу^@09ʲμC'OiȭlZ)8T,݀G5 2VH.6/fsE"cvsdF1 e^Z.z]_}Ok*jKO>C 0ǿfq܌uo0:' >*x7SxG23т>G\ߋhx>M~TQl.T&帬|> 2Wz[Lb-Wӷ[gz) M`~"17cj+w.> [F[xO BQ3u'f$ @5IgzGmav⿰[_ ?!O :^n\_x:]aC{]t?6a?KD? 6E-|soCZS~ŋ%"'Jmw|soCZxz%5ogIK-n.揧~9JWI^S [0\AE,R](deAR3[<Ci5x)֛T,Eg}lC'-\u׆yI:hzՖҭ_a_} ӝ*M?e-yY8Q]:O+ xO2WR<88N'k3G1ml'[| T^7PILwň*듃 zWښ/6=Fqg?E}-x_GcidT[i$B (b3Q{(N+wJt_6x,5%[]Xߋ.a;EXҼ7>28̴R׷TM7࿊m"ϗoD녅U?c]m^t/L&O@eXkiWE\3/Hy>"_![)fa$)ҾokCL֣MA%P29N=4]Jm7Uc퓏W%='K-COcg "+0lH!Nm09?RS)Z_z[ה8Nn0JNrK;V~, {#C矱7WĚn>5XhZ{{w1>1?,Haww.3'#f-%ӧEvD1QFb\1J\EE^-;?&pVB:hտEz$K_"z?eUEᲽX_mJe!bz~*i_Oۡ+]it4UWxkJ5fQfSžnݯ~G5u X5N6sW>=֩_ۃe2z:$j-Ba@f\LyLZ$v;QZ.ͻ}2UqxzPթ]+IZC|^RSosnK_B^p2: |'s|Kums˰0xd! W^At{Cڗ8be9'Ǒ\|^i`TTᷥFh`դjѵ|Ծ?wE|@О?ims qs+ .,/#&1GbA5'/y(tuMIP:$ 3t\q~:MSDKhv(ߪG=(aQSr٫n:i兕Nx{^M+-W?b?'׽Zb?aGGωm*:G׿l]O^nQ? 1kBG7EB}UX5g[o(`V;?xBGwakWE?k9ұ}M')?.}~ٯ5b͊I4U4q"7MĶ+E{UI08\]v]g W->{e%FxP-g[Y![U;oOk>!x&'?^Ge&)80ߧzrTp8X8^#:QݢZkW`t#8~ ~Cm-0hoY(=mFҾy{+_q?WvO/ 8\>п&zU|g6}~brf%/kۋK->O:3[ϒIY"roKj9ԠtC;׾׵|%]=R4ɍDqx'o?4|__j vL6 (8Eʌxk蟄>} A9/,++BIMzv3]9LﴙmM UH?eoUh ||>wv2~z)nUO2d_Sg~<"t*?gvC]z¤U 0Vҏu?u}*KinoeU؀3B5ڷ?hMkK|{^ @[cᒫ\tqkeO(qsO.t:'O>)we6Wp|Jߴy ހ}3xBOAj%pVI'WͿq޼^t+,ʭk)88RxHS-ݯ=g|[c?̣n?~3o+^]?I;e#(g u8nUٷID$$ڤ 'el~`¹۫A_ U+Ef;Ec';~{_Z|>WV¥;{_V?&Aм\e'd$EAWa䃓m? ͠ⴒD̵dVSAk:Zhm þn$um#6Q8W@N|tA/ڳO 2yA>f}RC[ˎOP |%lTWJ5ioItvw;©S)N1W0#[zZ';q[! '8 A  _O|a{þV.,0ڥH1895gtVkkIe@$W6qFD):SM??IԩJSmizM *#8(xnmXr̷:_npkjYКMKfzjEj韚 I&G^#_Q/o t7.V%s~'Ýw5vw4D,?ш8?5s |]E[[(;ww=?JMyc~qQ"7o}7It]mlcL ۢsI9ݽъQAETQEQEQEQEQEQEQEfuj$Sr F.k#5RH?m[IM?Z픣`Ur+[odeVaz>iQO/ízk.ٌͣ'v}=6꾄h,xgs{19g=3_>2b 8 E%|nWUUia4ؕt}Sן6oOzş *ky q"ۡ+᮱Ē^otwSPkg:OK;ImNrl}c~GOzů *ky q"ۡh{j:T_՟f~/c]#Wխ.< s6Wm7VIms "&*GB |_+Zu_S'qF 3xM[w_;J[#+¥±to>+},MId1IU`p۳_g| ,|qeV61nv A_|2A|Q⫝t\*]d_`; n5qQN3.\O{{vUiӍI ﮦG#8v'ZGX~Z4m`EkԩB:jbUKrտA !*j)kS(+~"~}AzhWV_?iB\ƵuU]Q\EP|C|]BkiJSK5yAR}HKwË03ThߙWҔWG<̰Ti/y2%YsΚ;GᏅETMy3y= `{S~(|-ꚖcckC }8ҊYsn}ޯ:K_w|7k+TdieK3@` + g^nWy=٤!qPD7vmsOo24rE ʺ5|;C^]j ֲ\D0^Zm%mbX^EuO6TLx'7IArϟ~&3G1+ tWOi?eHt:5ޥrȉ 7)$mڋ5Rxԗ; 6{^EpibYJ]9#OZ.ԩ6zqa[Eyep9`C#A׿bWO6jzBϐƾp襄qxZ`g/M+QյMI {^m"+ #ܞkFxrKO` =_%%i>S:<>!ެgAhe {H?/.,;Z |11-IN={WWEV+6ccɈDfgxwSѮHu i-exHԩ*H#8=O?}:z5֡tFDr6ݨ=sڻ+8У,Y%?v4$آocqQrKO  ۥx#H;|&0x?f-ir퐫_HUqa긮>*,>%Ul>Ww_3cuwؠgďjUUUBQ:c8)j954\<9$ouII6`cSqzVxUl\ys=]*4G<ϋ^0[- J Z(Z)T k(ӧ)N*[m3~+jVB ے3כ[KU Em?ʾ >ui*U齽/W/֗ntaEWvQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5=&Z{MFվQ,~O߇o7#vs.]OZ)&єS8:NhLӭ"HV$WIY:/? q&iT8L7=O_SL't/CZgD+!Bz$dgڶh=Ni_g^Ki|h:L^i`E]koP0Tt A$:6c#oxmf2BӢԕPPY:t?Z.?:V1h;1*JWB*P_ |!yxoM?z[ud5UNJ2&V1mM Xt=:=N^ZL`rGj~ccmee[KxV8IO\U-%&{c1tx{Il,t2}q/ NN֞`Fܒ-|F0һ +Eo]zvVAEW1QEQEQEQEQEQEQEQEQExOCHkZ67y_o/88ǠDEUUBQ:98'&Z+Xof;yT2:pAzt ڽ6cCcn1!@aZ4Q%U~kjT4r[JPeK,oʰ ~Qi6:V:me|kX($P$ItQ.^K齃_ڙ^ eִ=VVic |ŻӼ1!ܓ-Cꤌº+X+B3j=SUt z.si6cuϺ9ew2['ֵ9E4m >VIl#ue#}jCӼ=dzVkZ),-X;TW\Ӱr[S+]ⅅuOLB'N3p8OJPKEriErKVs$s&ּ?jS5ź݌o&钰KmnzHknOe{]#SWmB=s?w(P (ouV::Ï! +ߣF VH,^.:sN[5QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE-ƌ57-Ō->((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JG%W7 ע?,ҿ!Q f?_ €5謏K4oYC z+#+~i_(^JE[ǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+G=[ߥ ESǰ+E\ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( +կukam1?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fh#u}7iEqٺn?u_M4Q\_nAƏW7_vWFo7U@fj mv>\#7ǿ?=PEEsrf@3Aˏ{\UtTW;.?*Fo9qTQ\#7ǿ?=PEEqX_íBfqFo9qTQ\#7ǿ?=PEEsrf@3Aˏ{\UtTW;.?*Fo9qTQ\#7ǿ?=PEEs1_~f]͵e=TM@Q@Q@Q@Q@# g3O?hk+=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=(=)h=+ƟuM\ώuMEPEPEPEPEP;}#\z諝O=tTQEQEQEQEQEAPxZ*|s Z*((((| Bj| Bj((Rnxh-MW󧙳 uִeckxV49A[CARBgW02 Wꚳ)\(C ( ( *Hﭞ wn0|e ל|%^+ kK<& O`?*W=6(yI`FݛdO l`2tpy QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEAQtAQtQEWR,]>P \ȱ=Z~ύ>>ytM*y..; T}% -#XowږpỳeUWRAulMOuHmKW~gsz_S؟_jlˮZ8x!r6#p>|YkaڞBY[]$[Hj|C᙮m4˕]$vݛ2@P 9QE*ovO]QEq.xsU{oaR(ie?v(@ߊ_> k WNz 3cGz_nE+.hs\~Pzߡ| _4[w 0u J<ړW)h5mW^`QE̖nT}ߋ[_t1aZ.VI)#krS~4-sNm Cַ1#Ue Ǐcx&NCYr5n#=( o<p֩C=P&1xlWs@Q@w WE\w WE@Q@Q@Q@Q@ρ7u?WM\ρ7u?WM@Q@7 ;_Mۛ)`3rFCV7ˤTe;'{oV58zs\/DGooLRs\c[vAhZo >Ƹ i7ZƖ 4 A-s!gb'q(*ï Se~ - ~uV^D_Dj|7}qI5-6R2(Q*qޢږ%ַuYm H1a$N<*S#hkV-saYcs7mi.)'K[j=.X}RĚ߇K| LW[3.`q xOg2eDTcɍ cZT<in FG1^IsV/יד~_ >^+e6"-zuT|(uXwϤYJ-,73$[ aǠu'7xH1vi.@ymkLeO巚hH$e,}oE1fɍPkk~O|_' BGx>4GW:͆i"I#t|k>"OoF :kO̓V8o"?MozmUU(gUÞi>#:lϯLmdQD<$|?jF-i?'DH(/U8 xźLjZtX)F(rFp8GoQY.uOiXVF{TB(qMx_T \JR+gܲk;N(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+髙騢(U|OUa3Mi&|!]5s>|!]5QEqSxSoM_{#xdֳۉbf?&o4%mq 'QGym"ƚ(y>Om?*4υ<=?Jun% }C24}*xmP0p"sܚ_߅G74d2yOh: 81ϷJJ(pc{Zž狠h  #=)I`"ݲFZGcۂ0{;y2EG>( | 8&;?n&>XۍUSIkШå+ImcuԽlK5H>Y ury5\O,z]utx:o?+Hnd] l}l~&b>yL\.<*A}@ O>C &nlgEpxw^5Hy}o`@?1'n%^|Gi^epA>օtui>7azoTi.,č?oj무Fzj(eI"X)*GSZ4QyY'G[ _nġOZ~cZj9"S'jQ@O&1]?3g9\}sxOThaۘ0ssѻ5QBA#xvP#o!rIV9sgg +LFd5=mQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s>9|?#]5s>9|?#@5Q@axď ^x]݀& `y  5Es{υt}G$?xfbK3ē]P߀~TG<):7) ry!k(ovO]s;i' ( w aC+BZѼ ]=֓+K|(\J5߆:x'fฏkI;e0ЂA+?ǟ'睻c=ZPEP;]W;]PEPEPEPEP3o]OW3~Jr?? ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( |s Fj|s F:j( ( ( ( (9E\p?뢠(((((w? s=#c6Q]QEQEQEQEax~O5sI2P}ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGG|IA @|IA }ğG]}ğGU?Q\Ȫwӟk9߰(?!o|"*(?!o|"+9߰(?!o|"*(?!o|"+9߰(?!o|"*(A$-k_sn;BEtTP;BEa'-WEEsa'-QBEtTP;BEa'-WEEsa'-QBEtTP;BEa'-WEEbX~_-rnO­mEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQER3;ڵp} 4na?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4ra?Ə4r1JT`I@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@VN{F^ۨWJo*IE^NƵ7~] Ck]TϹ}u?[~5߁s `#}a:Q\- o9{t}S>0}(O߁s `o=X?>r{z_ξuW' o9{t7~]TϹ}=/_z:+o=X??m?.b?ܾޗe7~] CkG1_soKގm?.[~5꘏/GYEr CkG-LGu?[~5߁s `#}a:Q\- o9{t}S>0}(O߁s `o=X?>r{z_ξuW' o9{t7~]TϹ}=/_z:+o=X??m?.b?ܾޗe7~] CkG1_soKގm?.[~5꘏/GYEr CkG-LGu?[~5߁s `#}a:Q\- o9{t}S>0}(O߁s `o=X?>r{z_ξuW' o9{t7~]TϹ}=/_z:+o=X??m?.b?ܾޗe7~] CkG1_soKގm?.[~5꘏/GYEr CkG-LGu?[~5߁s `#}a:Q\- o9{t}S>0}(O߁s `o=X?>r{z_ξuW' o9{t7~]TϹ}=/_z:+o=X??m?.b?ܾޗe+\-mv8[_#9vZ~ffp+2((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((RA759b4ZugUpmS#T8\r+]d'ϯD=+}#k@_hOJ_ZPG"zWG?ҿ"?ֽ>ƏDȏ5Ed'ϯD=+}#k@_hOJ_ZPG"zWG?ҿ"?ֽ>ƏDȏ5Ed'ϯD=+}#k@_hOJ_ZPG"zWG?ҿ"?ֽ>ƏDȏ5Ed'ϯD=+}#k@_hOJ_ZPG"zWG?ҿ"?ֽ>ƏDȏ5Ed'ϯD=+}#k@_hOJ_ZPG"zWG?ҿ"?ֽ>ƏDȏ5Ed'ϯD=+}#k@_hOJ_ZPG"zWG?ҿ"?ֽ>ƏDȏ5Ed'ϯD=+}#k@_hOJ_ZPG"zWG?ҿ"?ֽj~C{,Cq9wR6чZH# k?eAZ訢(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((3Ŀ | m$50Fqh;W]^\yw3oyܻ$n;|I$}<.RFW;6<9&W (Т(((((((((((((((((((((((((((((k^\rKbͧL}1pA=z~%cWzYͿ_vީ??Al?[ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9&o&o (+jZ:Nu{pH&B$*NWAizm>esulА̻u;?M_ 3|o|Z7l+5k)"},rܨ g+K\m2գǛgoRE!Fq7>Z^-cG[t rkApEl&T5 ]/M]^^LE1Q/w#m~5=GVy,c#^^[z햽kKg(cuM&=QUuMRE/,,m5ԋQ@ׄ&3ʍx">^óϠ(?|dY< q]'znh+r|'?º> 6:SigI$Mp覕I{5v ;&{ZG-?7-hl?nn.;m+ BO9f' z sZ<24W=JK qmok6C?<N$סj[YbM0*~;:+K¿8d\Ld*RscW59O~7_X K *mIҺW>5xeAS[JY٦6D+ESїcjkrSO`) ((+7fAZ諝7fAZ訢(((((((((((((޵?Z)Ӯ. r=2|.ߵObGz >!W?!6RBҌktO33Ej5 NǬT|Q)jF9?fSųj>m-\=@y_U M3Z"Gω.{Q&1K*}qta-/pUYMj{?g zl-}O{yOx=¿?ֺƏi6w͹$[ՆT=km-mP(7ţY6Is{Wρ tOXzvO*.TVg!Y+{+1*1ϧOMwǗnq<*iOݜ1 8? WSkGWy%eW_K_]C+[?Td|=kIEl|$[bZKoǜ3w~Y_Z9UZ^&*fkk= /Zn<86os]׭OB_x .P<#6[}SQIqd2JыɥKRT7Mk%&mgQ^⏍>ڛKVU}CJwF T`2@$s^3Y0upьg^4֖uT'tFQEtQ@Q@Q@Q@W|Ix◇<+m-//} ܩ0v'>f WSWvot[aZ0u*;${ SVEGj7EPEPEPEPEPEPEPEPEPEPEPEPEPw}_w̏oo_(W/"?#AEW(QEQEQEQEQEQEQEQEQEQE1A$MoZ4h?d@UF;Q|5e9j˓N;=,vn E{@kp D|l?t~u|d𝏁&k$6r&m[uShO]c,-Ha ?8m}3RI!Iu0G_EN9#?:kAYX蕮HfyO<׿si`pqno(Q;Ÿ;-Zt~;7†nݝk!U*ɿ:r5.k_|0oCWJȋcs e L3kiaqTZW{]5'%MnQEuEPEPEPEPEPEPEPEPEPEPEPEPEP^+y, ^Vm"G%KQ EWaQEQEQEQEQEQEQEQEQEQEQEyg>FkۣUޕW#GV WZ4(F5CMը7Zkpatcfb3Ήn,:@eڿ;{Q6>M};nyܳ G?  ˲ژʤmKmLV.4jŚkTK[D 9r[ܜ׽4/EF4?7 o#+Ldkլ1.9љHee8 W :Q޶֧G6a̯?W(#~+MCx$u-ŵ۞3݀ / S^xzދ~BqV0~ZgJ4˯xa` 9,>.|cw/6:Џ=Gdz?nÞg:(,>7:&R-NM`zpGNQsXp\M.EWwQ@Q@UkO4mu+&vۻUL$F^zr;M݄/Q_?|L񮁮RjzC%ρo\sia?4}{[aj.x&dl3`n uSdk|Gh== .TR1HT8(2 LVP-penGPń?_Foyrʐz7BZU ~51(S|Z)XVQ9ky;>\-j'jҾ0ϧ4tē}5|s WoJ|?ObT|"d?O0-%{T.X8; ~~~!hol'׭ccAPs|$թ/Rmٍ8R̭mZiLv6Cokd]__h|s>?ŗS>^Lǁ$JRbH%?|#{7xwQF<਻o(nwBuQe:4V5:s8GK,?:}//{mlKJg_ך ea3޾E3[|5uo5錳]s+E2w4)@@O?'K+ ]v,*9\NN+#;3jwU.?@u{z¿]g _AG jC+0){@u{z؟OW$.7Gk +:Ҥ}9DO/:m=Ir k>8na!jA!k~&}yZK=7P{uc81'־}\$M|_gh*(֯IG)elOĖ'yo|%spa46αmH$}>2׃n4+zO5cߦ-ZOm: CgC_.~R ݟ._5EnVsW謲12h 31u&_U_R*uC_ 6sDI[[N&74kO0}ٯh/_)խG7Sv~1޾Gv"-궇6W0YB+rThɫ>[jjQ"[;X`Lw\RE&%d~lZ+[?c7G>k h66'`_lqӌ犿Vו\n?ZOg|<]Vm*o̡\cUH?_S_Fx @ux[[ײ[˶^-7Hܐp:WYx m]uv;_i>iNMfs¹/T~_3o+u xAXt=B{dH~Zٰ{SO;.x᎓ ^ey㉃ ]WZX@XY#A>6Ebm䶐u'pAW4Pȭs]A jS<`QZ~2jwh+N[fnïhwVP 'd.W 2H<_>*aUF t'?JIůWz%G=ΎFm>ݏU76)"/c^>dk\F:UE&U_:ZWqk_ֿq3#ƭ {ΔւM<7vq-{?|#o ̖vk=Ոb޻loO=&+૚M?|!ntCn72<k V͹b)*$mr@ ^ZU{?91wi Vm/YD۹lq/?Of>ˠZi+jáhNօ8Č_xoo,+oAmfMJ;HIYgb](R{j~|2x_ aYI#UQEA3stUA3stTQEQEQEQEQEQEQEQEQEQEQEQEQEQEr!6L-)oCm~Ŀ#xQEI!__ ?3_!+6L)glBWoGO>S:뾡+z>-uگ^l(s_#EJ22vNO=4ȟek:͗KQ[Kd%_^+&ö:Ƒk%u%LdcI\{׎|\cδgw(V5wH#:R@d;1: E@v^-j0PUSm;]+.Vuz*9gMګ}WF~g%]zG,ayfi.ReJ^|soK$3G^kOƟ?+?anxjXl^VvNPĩz%]SFTQ%?qzt-:s; ѱ=pL6SH5.<>+ԛo/s[>ŝpIlCbgog'hɹI]֋_LᰔΖ(y_Ǚ|mg_xjo jWkKy8zO(|U>鶓]=Ej3-Ĝp=#'pk?hy-'EQϰZ5OcK{(ĨWZ._u~G=9׶.9QˍOEV+CSσ VV>0%φ5].*xÀ2| =G##>i?|5g :F=|NO_<~Ӓ sYx.a#^1U0Pˤdx깮wK֯¬d{Yek;m=oƋ+熦fa2- yekÿ EZbSq4mg)fqgs=#©m_x[赬}_C:*Rz'kv{[S<\Fv\~w DQ$9mᛃ8.?+Z}!kgA cj$cLWu[ྈO''!K^N V>gJQKVvֶ~],ΪJBVE'it?x;Rݳ3\1',FCT75?F{aW:\zum987SIBnp&du,sed`T#%`(Qw4]QLE\3ey_OCKSM}>)-dCŬ@GPA[6<=R.V[~ p7}w?ڃKGJcXUp.7Zwl;\ϭsZk_{~:o-?EfYsH}udžtU⵿gmĩJ*m+KO؞2ЧO?:[H[x̒ q |Y-M} jx\V 'R%hd+!@zɍ1u)^t{K]9`7$wu럲-ˏu럲-ˏϝS4IYr땷JK\BWd.?:/ʾK(* 'k lgm1{xdZepffm kg"P\aY#f_ɀ?Z)uH`0DH6#Za)r.W6MdKAУN8i+٨a5πm/gWCo ?j[%bOqs^u >2׬m&_ݾI'O?bBOJKiq`;ۿ t?uCyQ~&b=ʌ%=W{ea>4i-oa`I^zbzVMxO_KZ[}im7Ŭ$@x#^ VQk5?ڿ5Qkc<_{EOZ,ۥBBI`[t)]A1=s<*0U>GTյw:Ό[͋E[Pz^5ȁOi%z\6`kS9Ei-~:}"OoB4e>me&z?1|7ּ[wM+-|@#pEc`Ωrtio#iuHzrSڻ7<bV[=?Fi%S䕤_rn&'㦝X|WivCsg8 qYS:hay~VJ]Ik.NTaV%wŸ:WKqKo4\Yύ>29{qw?Ɲ|!wMMoeq>Sz#Iu#m㓴3۝o>EobYfaø^4z4mO:8Ri97u> VbId('аbωth6zƓpZ}yH=#Gb RAx}+=Ca A_5׀V!dsC ˪bS6I۶ӿ*TN|ѝtעZ fIu2Gk\9ܟkjmCZ坷^Ӯj^qq`=kG&Җb5ocV-}"8\FmO ^7<`vVL{haU>^YIϭϠ!.!Ib`ȡFA~żNI-?k~;g9ChjS7&QEfjQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE퉫xAt˽/P,M>f}sdJTxԵKXAiw7(c FUQ8)ŌüUJ2omy]jSnf9vW[>!×k36|Ey%C14q#[~W^J:TvsjZF\O"kՙRkنCOx Fú,pH؞Py Y[HGm~1N+˿gV1$[U=c~_q6m+*xhXj~gF Vv|`k G^M@W-jk!{_a-~%؏&){Gӡ ׏Or8U;jKsG A*Ə?wZ݌ w&n'|B!G_/7|:Ϫ]y&H.p1W/ֻ_}SÞ#wWҔ:\1$iY=Y[=NydO禭qUUaGO7+k;x//J4ē<82qŸZ3¾$u{[@nwH+K_J^3kaecUiQSI&駥𥳐Wr\ZSi?.7a|3JkfwFU [3im IWOp}$## GLxㆁqo? X퇑 Njd^_0ݛ_>5f(Y#v88&L>&rq{ZIjaӝUvz+|]|f^|d>">y"Yo,UXmfP0OsǗ/SY6q+{]dar\lkþ2=v>Z?^Ý{Bc c]X2{W*ruz'-zL*]4u8?i[&t7fWV\H%c*p2:|0t[[lg@G _N_P/;ǞKIٸl?y[SMhxfkii&x#́\y;bͰ?SJfi7v^HXKWQi/KEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEsL+]sL+]QEdxRiiw=C@$GSe/}CZ8 / V(␄ue#~J+NKv}~Co*/d~~uګ> /SQ7@A~LHEf8q~~ tY/'tvwaG*+誋M.]kmw>5g|/Vv o[bir1^ZZeޝ}\]O +$lYOEM7Vw*[&smn6gy]̩,@rC(%w`ÖQFiO:߆~T{ `0UUڊ-Sq~~w=֞@##c1'ہھC?e?~,Zᦍ6yw˃țFxܯ(%-5Y?wXZG|+7 sGrAypx_ z)xA΍{]BoU8̮cicK1^skK{rKoSTx6Fi7-baHB5炾߲ީxF~%xaYU2X!72295:9WPo#ψ';7<×}= 6Lr N1_C[:/no/"nLP?8i.4Vion!<xM-)ՈBg2=*!of_\{m7CEoMsio-U=U+?lu׮|&~ }q O$guNQ߳εCH]B K3r: fcN-+2\ӔU+2?h('?6ZE-Q\#/(w㧈<smZtm2șS=+߿d ggĶ?ٺ݄S-ů O#6e?+=kl?*~M??c8Vnciuuaq Q.hTd2H[TTr`ߪK/_7?8?bOg<[O;Fl3B۳#wď@zƚ$S #PX *G *~gsk> 3X|Z<]xSQ׍l5<_cv5|C,G}[HHK\+r3tSSZ>Ee[?x63Ecswcy2#Ibu0褠SpJ)I)C8M3[#ĺ!ҮAq"c5ʤ9qAR+oL E XxO-L產ep݁ޘRSIy~v|?-M6iLm^ߧC2@B/#+!㯎w"Zu9ldDJEУ 2qխ2ӊ32|jp\U,KN]W1XO>5o_[Qn P\oD1;<~kŠ((((&o&o((((((((((((((OD=~fm6Z{>#5ޗu1 *đ_x$.p?=L~_Oyi9( _zUhQT曻ߡ\?NpQ-hn]Cg M<KI#Q&F,u]D"Mtx0?3jYU$*K-.MBJ±F 9$*94SI,eԬ )q[D  ¼7ϣ^g? +A`xcuH&TX'WPK_%0 ߿C]*OЙAUCDŽic-ưiUaT8abjJ*k]<-ZtAO.8o}?ÖX?f9QX#W/-DG]'\R!(X+][! s_Ph׆ ޑ+K(c3YE $AjĞ |a G:>SFGJ9iHJdӽշN߉Rh$KggS;c_h3*GW;;V$M?:Koea[{p9P$ ܞ?0nIޛcrV/G ^iICiW_]u9`ゥw.kI^ˮS?Ydk/[ݰ+=(((((((((((((((((((((((omp},Kf$S+Ǖ8J>ϗKwh>$vKWEH$R+ zZ(}P~,]jg=߀5bb{t/e- ;2~xJ<,RL,/mgtw FrܑѴr" 2"~Ԧ3O NIc;@cf*3Ŧ%g(%ӶwױS ){[GyX>8|l< a+S Hl2Hn ٌ@Q/L$t2L@ַt?~zFkZ>M+ԅ'޺)8\-j4e$읭mv9僭Zp$Um_r/WZD>bySWR ҽC'[H Fɥ_{xoHԯK!`̤({=6OzDEMŬv,S9R #䩌SK pmN^ШTX[>vo>#"3MbO~_^=+nb m2ppF9ǥz':0eoՁ#K#z ^~qwa6Y+ўkaK+AGM5VhU~`7P_:<hQ+ImR }s^O¾T@0pGҽ~Et_ 5ӡ 9],#=y4woXx[EN9?Ja4,z饛}^j;v>|o-Ϗ29oAzt=}+黻deka>qq랕qw\xGAyXɦBNKW$ެ ɤǥ#K&²6 yk,F3_ ëg}lwڕ 5q{[S~%] s ,{6 zT|gjEDAqHCzt_B %yam#-c ႂ8'/ؒ|OS^ye]8~W/u]WgTGŴɓK۾BxZK'4ii^M ˤ 1=^xK홳t=.бsogCcNdsX|gB i wxhvs1~PaӒj[TvV֝Zuiڙ*%ơwij]%M0CqDn|TD^⻋4 BI9A~*k_ÚfrzkT2z7~/~kV\6*ж2Gk|aX*\6ӕ[6̌N*MVt΂(=`(((((((((((ۻd~zBG+E{JsS +((((((((((&Z@nCg=kᅬo~.xzjiO쬐.Q3h9 C_R,&1S>ycM{0 rak?x?4_u?m?&_Z -cC}/66w:=ٴ2[, F=r?m?⯉)6wC'P#v|?]<yN'P[o#.)F W~U4[Գ{8p 0l`sxtO/h61i%48)oi,QNNXIk1*b(SrMkǑBqV3ɧ;Oxĺ]bNZ ZNiumf[{ c#,71fP5 o?9t~!]y|6a C݊WעEl6"K_CuY9/uo)`lGXL*DWbzN=Gq*]OB`X,`pJ  xEΧy5ķwS1yg˻ǒO L_ϣxPӭ"G—mZ5(hIs]2rrV?m?f=_?|U EX-RLrLv!ב%_1Af ˙/xܬclֹx_&꬜SN^-MǏ.f&m謕 q5[< V>9W]۷ȸԎ!R].m=[_64d `)*@<^#_/ũc>,X ;@NOʽg[XO/$MRD0L{W3h7|‚NI$5_ fͱ^֊//g%vliP/}ufbvO$kRͲ 7(Pêk}ꖲZCym Cg8KeEt?~qvQ]~;bV*d얪ڽ{G>+ЖM%-ޯ{i۸Gk=JIXPY H@s^mщΥDXn#NqWz߇tZYb}n `3y/^o!ku "6xV Gl>2< l,ӽFӗ浰'ZXпǑ~ַ/;[C#\mQ“"/ |j4iG4dň!F_ `{W_X[jsZ^[wk2 ::t/^5Y^)ON2i n8LDex6+Zߣ篡50V'YMk{㘝s<W83g<ҋ}?]O"$rlO} kZ5,QyK0s==kEEiI6֣}BDlYkpY;I*2e}*x\5*MHS׾7|T<X?V7v[ZZ*HT9'eox቟U^js׎_hT t> o]grL-U$|WKivzՌZs Ioss<ҾnX4Niɻ_MI}|[*WzS]?fsYDb?XzWAl\D>iS:n#7ǥz\E<a&+#A Y_{xoHԯK!`̤+ЖmeOwa Xm^m?E+xIW6w#2"PGVn#6[U`8uNH>I䰼#adBG/~ZTz1p"`M?gW?ex&}O;b;26we?Lz$f$KK=Sⰾ\˺#M6-WMd?첂?CVki<5a'ZA:dA#tEh%U99A7  h4:׉udmM9"S1p@8޽uX:·j^Z>ºuS"-JZ;[ј)ԚӾ=5߉ޓ&k|6 fdPrfSYAKfy9 Jdf 3МWYp':@NA{Up cUUPT`]C C u,vVI+sKVHNIE˫>VZOL:q&ch{ laG\o궚v۵}L7N9簯WG|=DuUb71d\?ҧ'xMO4+ [ۢ#`|J굹r[R=euSWV<=Lj6k+$y&Y|FN9>uKkϏ?Mݴ@&S׾i|BºMڶm(ޫ1W{k[R_ hj~ha!s2EbU8˭u)BN?kV}ߴ><jm68?Pɸke{F|k&塞RM K^E^vFgҺ_x7Bvinn*O#sCӬ4:bkxP$|ߎk? ^5`ܩh֖kht ZjoTұux²\^jZ>M>4m #K{k^X GHL@'#=²fzO>8[D |һm6+[;xm]DGT}z %l.eg}-{==իN[{z[z( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (9&o&o ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( | V*| V:*( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (>PG+ۻd~zB~Q?>_ (B((((((((((((((((9mS::}6ܚPGBpx5ELJ6~њ~xcTyyD1$c¹`_RVldcX->Dvq\]O/R)$muK^iM翯p+9((((((((((cWzY?e/>%EKIgn(((((((((((((((((((鹓p#r=[rx|"Mq1zC_ c7ԣNHm66 _>{%y/GvnެEs6RIYQHaEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP9sMGWG\惩K{cm1̰R/-bK{~?PGEs?97TQ\'6_*Nl?UtTW; ͇Wq|@sa(б _;G2?kk?\!K{ ?Xʅ_ P Eai}ϟe?,B GZ0H}^4G2?khWBT-~QG$>Aa_z#_ P+Qc*vAu?t W/ GZ?(б _;_Q__޿WBT-Xʅj(]s/H?/K_~|+Qc*ve?,B5C$?>(б _;G2?kk?\!K{ ?Xʅ_ P Eai}ϟe?,B GZ0H}^4G2?khWBT-~QG$>Aa_z#_ P+Qc*vAu?t W/ GZ?(б _;_Q__޿WBT-Xʅj(]s/H?/K_~|+Qc*ve?,B5C$?>(б _;G2?kk?\!K{ ?Xʅ_ P Eai}ϟe?,B GZ0H}^4G2?khWBT-~QG$>Aa_z#_ P+Qc*vAu?t W/ GZ?(б _;_Q__޿WBT-Xʅj(]s/H?/K_~|+Qc*ve?,B5C$?>(б _;G2?kk?\!K{ ?Xʅ_ P Eai}ϟe?,B GZ0H}^4G2?khWBT-~QG$>Aa_z#_ P+Qc*vAu?t W/.$JX-'kYG#f?}aGwC(vwy|WvQIQ^>eXΟcEZmL Š(=((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((L\Џѿ!T!cӷң ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB??Ƴ ߐ?#~Ck:ЏB?FgQ@̓.PYJa0޵((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((+ľ:|NHmofoo.(U n8],LueB\k0Z8zn+3Qb7s]mZUrU7׊\]Y\X=)"2׎ݫ8kJ>ZMR;(MŠ((+uNF3Xurn c`R9=޺jة8я3If5kSj(M(+~t~&xWѬlneVe `}Ӓ8=jsN75ojVM3vrEW)QEQE!!A'(hZFH8˲8]*s5Ioh6U',@ 4Wo@]jŢ^Wacq5ժI=22^}TG(((((((((-\xZa3:JI˙;=}:<^"SN*w_#$k; xDRm86;Ock]jZ]ycr3{`.G4wu"]ZIw |@<}O¿|m;ɦeTc=sU2muJTi_U-j<1¼)jIѥ~\_"AԼKǑ-mDu I'^#Qz,{Cxnjb+ jc o, Wb??f_)wE2X\wO J s7mnZlVuvV[^þNԡ1<6wIQۏְ^0oO,Nۮ޺}dX'~GWӫk;AǮWCueN ֒zύ>-h m"յA# {V~Q6~X[jYj8`< x[LDm"*Ltc𿏼 jNOR76nxXV!N7 AWv˩a{)NMmeIgTW.u'dw\'6xK^-DKy$I #*;Sk⍭eP[WxqqFN6n=b$$]5/?_ZfV9K>sWME+y6_c3Ff=?m]-?zzMqXL=xZW*ԩ^|<|NҮ5 mGOa\/Z^' ;1V@AY!I#?O 72|?vG^r<3+⏢8o|b|C2^+0yq 9\im;)=>EͼL}#HJ>1?wOL|3=zv~؆o?sǶ?}<KCR\-u}3&J5J0u4gU!H V9;GOQ_ċ/\okjO bF}FV=MxuUUiSKhV<%-_?uQ_,{!Y>(k=Q `uqZՁ}/Yu xQh@S[M]> e4QL(xoK5tWאxoK5tWоb!pƻs+ZN{5Oq'FMV[#Wb.-p>$ʺk+5+XmeYnIEZ(xBЌWCiŒ zg !B_xNѵq}7"?1~y~u|SΏ0w*6X_ /60g+Kglyj]uKwkh]iM̟1"H@z{uՙ*sK4{uִh1C;1o$c,/$v}B~ۨ{gXէNt^coqdmqYh}Q|3sKS[0m g|9'=W^\JXnd~^1"Y6nvd1;yXYeUvQ"k"þ:_^ŷ- /57 b B<QV6?묟% ^_0/#z▝g?Im#WC>#v e>v5}dda2)?:Γ ūyS -k6?cݺ@ :q_c𞮲(u4’*S/vF[k0ZH%nVZh-Ā{t洒!j(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVbVQEQEQEQEbQEQEWG/Cxះ|~oZO|VO\s)<*uihUhΜ7k_5b$l?-xX$8h2mcM{τ~thnb)d%AMsAӼMMjpL0̻b;ȯC 2E9B\OGi^^ާ sXi4UoN凈5 2+92M EbFό>Ke{9b+͹U\r˟4`>{?z7|3KKMa$a\ kaIɴJQJRwOr׊Sd/Yo1q2궗o*[vg!g"~W3|#8Kw/xS}FHm\ZJЙ8'u{,ñ%24́c0Qw'ykX5fw{y~p/z_o$ 9>hifeZu[\p95CßĹѴ:Up7/kʣ0mS^uhTI~Vh&|exE4T ŵYTdWW{rG=־}=+?<L/98\@ *@Z|𗉵u)p^Xd8 co ok[.l`__=Ī1 ;kԥ+rm}vKVBTW+ims_\Mx.mNԮV#2GNOPi %Cyc*Ǝ2+ybk)v:4Ui Klaxo.1:֜Ԯ`Rke0sL&:CoxXGӡ\߇gfC%^NG1>fc0x-UrSuM5{uo^*Zi8۶g?c'EGY?>kb &wCәXJ *}u]ަ ͪ<2s]?*4\7C`k p]=߱xw4cU6G X@Ԓ@j|HtI[a!D(a FFռ#?ḹҦ]R $vf xFoeh<6FG.9'Ҿo6[߷-{>x_o~:}xRSoswpJ 9#ہ[ oKw{cxQG!39OßOMoJ,X۳Bd+!`q/,d*@ :1_i`j*BqQvUoEӣ^V)=m6Ztz͝WGsm"X\20pE|N'??R*oOHA_w&m!r4l$^c]vj#d儹<ו/ejɷ$Ky/F)QgwwMvWO|s6[?5eWVM ,Rtu9 d{V7| xEVgE```0`s5>wxotm=(bDӼHyqXju]'Uʟf,tX[2C-릓o2ttK=Kouͭwt "?:OE0'˶yr71?m:Ȼl15oXt[y\F삧(W &A(P,z?+MʥV@\~8+_2y]GE=˺/领;XV8b1DQ=t[Y=T$'?:_ SczvPK$NF*Az)_ ]Vӧ͏ҽJ<>(4# &9VHU>rxK5oGxQR{?xm2.É&cÐOo'RL3McdKD v?Y5'P=R!m%M)chٕp|#+ށ ɸdӨI~,)f?OR>q XocxE]_%MSqwmf95㾴5 1Y,6L#-敽__īޟ|7dB<'u$ 0Wϑf#nox:.o/(h:&Lҭ#]RIɫQ^d)NQQAETQEQEQEQEQEQEQEroFԮy'; >H-Ϊ^_[قEuP}?OҬ㵴`acAQ@ޱ{mGTԵ,miaJzd~x+_IG  ꨣ ö5>Rbr}IZTQ@Q@r* ,[ZH⅋CL<=Z Z]ݜ w#D=0U(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((wnb!*QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEYYִ((((y15E>ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy(#k|ȏy)|"EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQY$c>nC:עyf<)A a=?hA?MXk訮wkq}/G _&:*+{\K54 a=?hA?MXk訮wkq}/G _&:*+{\K54 a=?hA?MXk訮wkq}/G _&:*+{\K{ˠךuԟ90AiPF"5HZl̟u3&4(bF1>u3 UHsېj_A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ C[ܿNѮ.tQ|۾\z?ʀ:({ZԵDҭenq:hs{#p_{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5{\4Q\͛\VY[7U>ֺj({ZԵDҭenq:o G᛹ܿ@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ a=?h{\KEEsXk?4Q\ _&A?MtTW;5kq}/@ʴSNܬ=ϱ>PEPEPEPEPLW_|r:.9R"Yyywbǹ=M6Eӂ"~ᘌ*QOm%/Oo% ( Ep^Eoo<#K31MKizMKir QFFA~o?1ӷgg H??zx)\Mƣu\HvQ)fcK}asIkyo%g U /og {iR3 Eqic'gy H??zx)\}S> O7R":(}A/Oo% ( EptQL?܃K??;^7JAQ H?;w#?,w?zx)G/Oo% +a~X? R"^7JAWETϸ?3 Eqic'gy H??zx)\}S> O7R":(}A/Oo% ( EptQL?܃K??;^7JAQ H?;w_YB+䈆;1څi+Rozx)G/Oo% +ojkU?_$Inݜ}޵DpY_vAqic'gy H??zx)\}S> O7R":(}A/Oo% ( EptQL?܃K??;^7JAQ H?揤ڥh7#Y zO J~Ts|J'ga H??zx)\xsVoURݶȪ8QᤔN6~Hs3 rpi~3 Eqic'gy H??zx)\}S> O7R":(}A/Oo% ( EptQL?܃K??;^7JAQ H?;wi;նӭ{nvZu# WN|3K;*>6PO^MyN88FT}.eUYxk}1K%@]g6_Vx5Q@_|^:F{OLς:py֝go50Fu8]Iփ{f4js)U]Nf*xIdP;fzn!?*Ëa4y:܄{8>SEķ^>bKE1~@Wy)g6؄oc_iZiUj˯nytpWӧԚww|V8^:-0 Dd1ӏSY:iyJїpNk 3Q f~_iiQºe>yAJ7NݺuC/TUFINvm<ӹ|?$>.죻oon/ Z⏇b&w Iudcw_nn~*x+TN+o$V/,3I5 jq]mZ8l> ORݴt[Wuᯅx{Xխ?miл@FGx\-{3_ Et$$`"(R\ѥ(VYs*i;mvJژ7 aO #n*/\$}:q~<gHgݞzo⮧oǎ.0bb8e_ /U٘}R_#=FG0Rj.q-]Wz0\TiTеݔZ63W,tv%ԁ7l{O[<1\&5bK8n' ֺ"Po-vOš]փ2,%X"M99&EZŸ(QI d`|w`Z<FeB\؛DpҧɀJ 7=$uKmZk,&ied įwr=-ucu"\$qȹNǎ⋉.I+,ǿk>%9d8VMhѝ%)]I=,~,>*!Ÿ,՝޷$r6 Ӵ[xßj]4-4}J1+; jPk$Tz2ӯ^H7Q] pƂb諌IXlmW}qp 9"K?.3^5u5Bcяؿg=b[sI6yρ$$$cgZ8OEh+ ԧ.fՓm$n!uEVنf -us]ΡKnq]>-p>@pM~#C}Ӏ*5ė^$ef'yWTe[^F#9N]d掠w:|1>^)fF _qcYY^9]x:M}sJp qv.䉼Ek73jM*^30k'VpEX3jseb qZnGg56~9۝OyV^͍JFv˭SݩGi97v3eY%uB񭞣%mhDםZ}ƓqewCs䍺{-|e + p1]OcUd'|{` SJ\ɦtkwAԧ>uSK)I[[mG ]"kG{u >7^=zhEt7A fԨ#G^qI/u}|uq\!hZ1ie^i|3hZ֡l,H|+Cz/(;HmBm2[] ?!JXЦӿĒmkgխJ]Z-5nYJQRM^=9잏Wz9׋5B%/7h봖9^%C*4r` ~[oj5l A #j~mVK2Q"6¹%Fuau\m{m{l?:Xeumm[gQlI;{+F=6&*UBcnP#9& \_Lch r2{yWAG\Hƃc%p,A?o>6Sʇ}ЕZ8XURVb0򧫍u 3?û-!tAN3q>sZkZJ_on3i,s =[PLc4fa#aHV'ÿ Zk6 zMm,MYʧ#k֝ݺX槁ҧGF/'&ʮ]ӻS OI'ۢGfViAt_>}_bbM=sKo;]&_ <$#??(jTܣ-eNa8-eJtɸCaב׮M&s^G]=8GU6k;L]7' s{}k=iY?^]6[2BOݵe{$ֺui>?a{npRz7]]R_U<¶./Mw Ik q>t4ݟ뽇\7k{ȋFVʚRnis`!ZR;UZ4޶鯖JCԟCYЖ5jg 89^+Yïi[rIF6FO|Ǒt?dox2Y#Ԉ žO!n*֯ZSVy7xs'wty]-[3›xKrT\$eڑJԏݦ^O[kK8d),s hS Cn>|.Dh$.y:A֪^I%@~ʃJt#F#MiUwo'5^uc6O5k *'{ɢ#c0ȍW9vOWWt<; {gdc5وER8;s7畁FTk֭nDխO뱛|[-CAu2w)%_%`]8QԶu:OY%@c?Ŏ}>ᛙ!|IИTX3X%pʦ"4˟oDX!C*h:?JwV|~/}_VݰAfIҺGxid[Z5$%\ Q/u fkJʴҍjhhB99|S岋_}m!x?T'|@uw[ z/(9OJK2^.R7BX3"P)'ӽG ZͦTdWzkE8_|=eŞgQ]ַ)(cֺ)hPۯ|Yg_LAf4{ 1Y~8nɥ]OMcXDg]nxⴰ^j׷^ Ż,1U< [4*O7-]2+vB1nQKK_Kw1b'BE;9Z)/Nf'>MjTMi!tꤟQ|w&9ⰰ]7?ֽCr?6_\j0}W h$Yo;Ic'*}TM?zۯ#iUR֋]׹}[0"֮)dUa1IȪXQpknoKgѻY$hnexڬ|+&6uoMzoߴZ(KǟyH?5JpM]z8\6:erIԌtm4z|%ѴI\񭖝0ciV2{3@c-1]/ |3d|UZbh fGVnʠ:WO х|Qw2g|zMϯ1W~_~8oW`c$aeT'P++_> o<.kv79bhϓ?w~3u Z9x+>pk5 ]&{l5Ă8@2Y|cYx7>%x\\j>k""T\:o!Xdo*vi |-M5j58}gs`(=(\tm^\ZLg老>0mFXkaq4`8M=ԑ]oG R=/>/VX]%D>˚o3x;ޓ=oSIv 'cߴG3់F'yM6(?4q@H|,3Zh};ERmnt{kCG= >̝N2qv j© TM!<'" C5S? ߄_fxA0qtTQEQ\Z|;6{Me5, m~52\Ȩɨٝ#}X0I)nd̲| xEߒ|Svh:MϮ<ߥx7?Ě{y/ZMeff ʃ7THbiOk=|{p{ ~|\mO4dڎ˩◄+T,u%!]$Dǐ ـ5mYiwkkf_8?1+ļ7|'4|2𔋍OCf2)?<(3 Y22hgu֑.kXg_?6⧦=*&"vA>g σM<(d졾Xf#|k" ݲnཱྀg;[Sۂ+[ִ-Nh5EۡWޜ; p_O"< 5K0mac&ɏ}m9+roC+ӄ{W4QEAaEPEP\p?뢮vGm?W;c#\J諝P%tTQEhgaF&=;CF뎵-ak#T2:pU8U!='7Uz 4т_(VTy%}3_Ggp,cx V4oYdoODyW|#%nKk?lO?[?m7 |L\R)F~%煥cӸ;FT1\}k޼y /jҵ? ^\ˌlv#"iJz~v*V0}+~t#%VuKO2܁I?)#5ze|gix浶}ெ){2^'m )0#,T.x kQf4(>ntWZ4oiYYq0KKپh e e Fp9e-ԼGޥ@n..$*@9$$f^wxqϨ= _q=RKo8!UaIq^:ֺCU_ItZA?* @`UH$qޚN[ u<37xN []Io$0iv\ O =28$^Q~ھ/ZOa",QA-z)_i}o4[@!O$C^2}z:x?׿0הPW2xWU>[f NS^]!UzUko+G_E_|^eOi^amYC \&(AH޲?ko3|g̅lt0d 2j|wۊ?O,+ ю=d}(b~Q"IGWC4?(Gnm.Y/'ݰ+ZEjZUܠ IVXSЫ) yf:f5_h^LfxXe?C^[%;:|W6vzËYp)B!+` T1W6 R_qxWYBx4El2H@;v5uI??Uot[xh:b\ GN37˒H #ڨ5OۋǾ ZOg ͨ{4 N2 _/8_^?>MFF x#hb/]Φ/?P կtFMjܙrb-=}9{KcQTu sOҴ[^m.G4.cS|w_Ÿ YHbX 0 <9#/Pst>~ah<]uo|ylC22DnUI`>mT㑐>i>⾭v (w? w? ((((袊Tr6|[>.ѯnY6CN+[ƽao_:liFM(<0=tbꪽR u8Ir_|<խt?iMp'x+G]@ ,lUHQJT!*PԧCGE̥~JǬ>[͠Oqi|rT>٬>6fΛO i6mIu2iߞqbyy0ڎO.uQMƜc))+e~J%fk.lc3qA= U>.{ߦ[D)Q $QZ}Z=}z}~>-ޗmN4{^)[Ͳ#C s`ilYo\ylXlH͟ǡ0^\iKV5ɛG1j0U)RnKKz/>FyN,-x7RO@zWHb:M6(Ƥ-ݗ8bgRh4kA^gZvK4mGLmu 1`Aj)V]٭S] bI+4kG<-LeѵfwnEsҼ&%Y՗?0FGYTTSOvVΪ`# gXᛓ:޵yO2>/kmt輋דבuZvnclq@\u;+Rh:rw8p*ZOCo/O5_ J4]G»ž3jxMuhu|RZoeof$|r? + T'8okki;)f2Bt>OףWWw: >' +$InEv.?[~!qbs<\Vm :R|nQsVmYgnTyŷ.kM=8A5? lYSbxu<'Zgkh;I8@rU Q{8\D1Xx;ײv=_:[Z՛E.|0A?S>2{=wš\nFoB8$ҼΊ6'Gu5kuѫھ=_oCKռ{+{6Fgwq'{WMjӯ9aWV=<:+[[mHƶ1ե!W4kג_XxSbb'r8UT%(MĪPtN3O]o4[ ƚL7gtU~q@lkZ,X\xseX{Ԃ2G54V?SKnnԪ.x$uzv+xZ:Фtg#O|+}/b͆,?2q7c(8NMopdiwgi 70Lz|mqbN?Q+ n&[H$8Ԟ'EiNr+# ֊) kb.X^[k*:?Jo^E"|@̑(Ӎ%ּ'ENjӏ.TԠemWVk[>4JnO}(lt'0f|/Nuuj7 >[`tkΨEP;hs5ny{F>̱iwy h8{Ս;AyᛃFF Oͣ8 I?y}NRp6[O0q#Rf}:F]rơq i3GaqKL23g0&Q]YX')93m7~4~s_ƞg a=6~}VC]xÍo4%]Uk7cpX=N{Ex_y%m;͌."y*#^_E7y&JQk?iJ2RwoNV^G|=$t&A,]h99P8 QS ?g>b&=H)זP)rMK2I?kN2IZEiSc M-|?u6歷Ƥ*z.jg7">ԭ3%~\c= WQKqVqRM{[/R8E]md~}Ok<h߄㺞L*<Ұ!vcMbx jr]x~ ,6ݰE#9/چ_ p0FT Ȭ`a7ɻiuꝷRgݓ-_UVq]J{m3YqT|m|V|"TqLJ,4+>=ST@|ʾ\Dda3^mju]YIYѣ*杹mZfجT(UR:何K״TXShio6{+&vW<L+l,|3h;T66{{{W#EvS{6-~g[픿u)nwKxQ|&2DBޣoz䨢!K}/ZuW{37Zzsfouڵfs~hxwF%EWAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\-+w̔QEWGkljNgZ (4ˡyAJ33ur_ϋZ$Z^csIHWAnI W?i?' w>%x6̸h1Y仠$:IPkؿa>\[|*w-}#T;F>9oHVnO9%k}^)?u7 >ԝp( S^&onjkZ?qUMyGia|s|/"x_ឯ5XH{d%'L6FHe_ُM|wdY"ϩe6Aڈ $"n$'PgxxF{L8fp>x3Cڱa=6|9m^ kG7\F>TN6CTҾ|{:] j7˺=OQYJgϋϊtԴVGuч*#Б_eD|>~X^SA%EF0T,@.f ?m/_ $vr:;HrU#uʖ\m s[AVkѱ$RJ>'^OuwtA$$1VND~唿4K/xBY,j=H€,`8=M{׃?oo.`hWNcC$2BԶҍV"3 ~!׮`6yqd–P]P>P@#*NpiGWu Eo,|u]'Z<iKh GPFGcA¿~w;Nಜ=f#>uEJ;\ʛr\U=cA7W* ~]o/3U>;nm?e OyvyV'WNqo㻫;}¾ }|7ծƝYŽU{T(e^?[?ƏįG|$舫kM?Ji[{hi"6o?< '/x Ao \l9{ֻ*k~r8Q|mo|^=]S~ nS`m|сU?d\4wş*3‚W|o7D/Ax#.'ï|hĆK1j^-}\?iik 1[BPR4T +O=tU:*lv?I]s?;j$(g_6~~K+m[]5Mn.{xB"&0Tgf(Qz}E"uχ]m9imVKFs):TgWԗ:,U7-?yg$__]}nУ!Q}7Ki~[G^eo\2?x}k-7𤑸üH]W5>uY~xG>1_m.Z'?f1WT~Km|~,ǝxf1X ?f?ҹ_?य़/`YҢ3R`p #uNMvX~)VG̥!oy)^76֝8u{[ U(Ԩ]#_*4sƲ*m*YO@5d7bX`wc`yx(.kD~:9ط>[QuVy˲DIE>2A^V263$BboW7>SZvZRPʪخx`Jf5r=c W=kegM֑Z[G̥DB~ҷ/Ox+a-Z6o+ǵS;*$׌~?OO7Ok-?Ne8UImHUF-_'3/%՗nlZv`xϘw58IΫsVF_7?l&6zO:|))r3Os5 d+fCnͰ-u$wb~l;v5Kƾ6|#ޠ<. kno2i[#@~:ַ1$#G$R  _~KOlmxU2 qȥm8;M}ۏkX#|y[w)-a~VR]^yߙ=cg{|!ύE{qZ\\ 3 nL\y~_>mQiժߢ>l @χψĺl"拧k7ڄc*+Icnw >k[^79a^WVL _ŏ؇ZO[Y-a}Wq {7~_ 0|_#x['>D [~T6i( (#@0@ (9[C2WE\-+vGmCW;c#\J(oطO{KNF s#7ib=/9+>o;ŖJ/kd7a &m>֊PK|8ҢSD4fshFf B&:o+G_E_|h?hb^HoAOkn"&ey&(@+.>.A<<;"`y3o8}Ez/*ll-6 ~wCx>Y1-ˌnFi'?nݒTkvRĄpsD  tI)M|MMlOTW2|-퟉W3ZLdUG=j>)i{{7VPGIQ\eT}f-sQNM&ME'l?k y;UE圿a^Df$*;vևI?Oi?n>'jM1Ѫȧi&:' aڌpV\ }h oVUu*~ k04Z^ x DcRg4izmttJWVQc8|`g7kQ_R]Uź)#b8z-w|b$^kK;#?^__R+(aGۊ&_T 8n?fiZ[}r٣b9RRU8 r?K?/oɳ Z2VxS^ToOTso'߅R _V짐JVF?SXlW xb.#IueEs+ JKEz_ůw?aMBb7X:$P(= "d#-Cnjo xö˦]Z mĂ!]Y *N?bop m9mXo.|~_ |6=(5 -ΈLFS<҃_njh>xމ/eBo3Co`r1@rP_IVqҒIiv˖o[%AETs9L?-]s9L?-]QEQEQEQE|;v=rxl%$v>=qp5 3{~,G ҫQΕ^TZ>_O/l|E}Eۿ?c+ (_SK_xQG:O_>Š??WQN>u?}nӯ%폃诼(w~?O/l|E}Eۿ?c+ (_SK_xQG:O_>Š??WQN>u?}nӯ%폃诼(w~?O/l|E}Eۿ?c+ (_SK_xQG:O_>Š??WQN>u?}nӯ%폃诼(w~?O/l|E}Eۿ?c+ (_SK_xQG:O_>Š??WQN>u?}nӯ%폃诼(w~?O/l|E}Eۿ?c+ (_SK_xQG:O_>Š??WQN>u?}nӯ%폃诼(w~?O/l|E}Eۿ?c+ (_SK_xQG:O_>Š??WQN>u?}nӯ%폆4.VX,fp\B+noPI,@Uzƽ󱙤pj<=e}4idQExQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@s&]d[C2PEEP^-H>4OmBPp.Gg S)p?K>2ԼEQn/lO0]EhdB/$0?_H@Q@5LFq:u\Y@C(F@<wIiz6o&OH!$ڈO5E? |!]k_tM7]n5KM:w>UC62ry5QG[OV䭿dR?(@q\gV| iZ񬱓W (:[^5OGZז6QC5d]T9$ݢ<(((|M!m]s&]d9?WE\ڇp+(Ϗο?ߏ7lk?\tmIJ4N,r ?o/Yz7 (SE$|?hm3N𿎴HqF;yd ,J-2|'|+hgM65 T ZQ@`~g-TaU>88>ⷨ? <+%ÖwM3꤂T1^EWb0l7^$k+5xlbKya惦xKM4M[Nb[Kh?RnsʹOٳW5DԴ߇:b":X^f:Isc8gأq_aOǵNx^-?Xh)EQ\?m_]r^,Ŏ}Q iYm@ϥ{ryrRRͩ\ӥ4Bi֫z%D̃ _q||fok_˨>i7G[HąW#5`rpbk;-|vqE-WgtW˟ߴK|&\A֑]`xN7.x(:Н\xmrJ6kQEET5 S<3jkiw +12xkFR4Z7S[[_S uo!Tc}E<{ֺ+HdE'bIwn^ZI-yc+O8))jlr,F Zgi2[ʓ\݆Dh6@BG*+evމ%o߈Þ۷CQ_&Ŀ>X5˻]gIF_ò)<YFxʜdj[^׬$s۱A*'PAc>68kfQ_2~,<.u 'onmݴ'5s02hbYvv5U+TQEyXQEQEQ^{ǃ_kźٖL =ہbLd(cX<;cľ1vݭ\|2&pqP_1%u2EK+,q31/5OZk/mcIri%Tbz`r9_3D iowjַpM#/Ȯ:5]6ɯ4Kv|(Oc@E|y-\ޭZ!E6pPW"|~K|5K=>\d%m.` QrE}+@$Hci$eDPY&b_i%ZĶ%`(r۸^st袸ϊ_4?RӬ%em5%W yuQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ_8_3V,o[3$:Dl*pyW ">_+kPh_ p8lkwiXVa<ݒz j( h|1[֡}6)6Z5ܱ0*Wv@u=ZɗRO2}.#in~䌕$ qj(%S|8 AuWStd_F{fxO ĺI隵wd[e;Er(xW/_\vk ;`A<(#o]>I Kͤbï V_i&Egh֨OxO ĺI隵wd[e;@WK x}kE"(;a1F2~=#E6}:$7yOql֝㟄~YVB'&B‚@74WU?Vt(]cR v`}R(j( )L<)fw8 $WX 55jqm|KO3r=QTmX#8iT޼G)},i˨Wpz( (4<Vsj)%wyAfY$(lH#(袾}׋_ kz9=:i\uڀ>`|~?io./mVx0 n<V7[x zϥiv]HDR8Kχ4Ŋj_iui2~^KE|'2G/-m5@8,e {Wx/o Z.n*{AX <(r+43">Zlj g,G &ӥ=yi$9=e+[Ÿ|24m5XF ,葢O@MuW^ ɦRkKH1YЊ@YnozW.x0H g۱=0O xIgz^'夂H^AukBx'5Ĵ]6' -xp3hѨm Xz<q|vI{g9$az޽X2R GC@ E|\ែŗSY_hK_2fj ;Z+yj?*K+Lxՠfs{&ȸ Bq @EygƯ[D^3}Uek_I>@>3|~~|b 'u5攷/jd Xm`Fm@wERxfT.xvZYïdw503ziHsoܹv.+ppuB 5^ 7tŠ(S` |Y{$n4p6H[QS5N\-YByƊiO XrVzfeHyWhz]. KJq;2uaZIkOxU]6_+((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((/MTk?ӯa8qR9͝BY VK>?żL~>zv=[t[ĬSrF>QVGQc9< 5]c; ǡ-?^Gx?Ryw8;3p ?d//jG\$ȅra}_ÖW?Y?_8Xe}_q}W$P0'$zܯ=ӾxOyVw5ٙ$@qx.z8ɪ/vf5j)TqeҞKHXΈO@lPhQ'Q4}GMI D3D>)H t~;P/t39IUd$ 6 k)r(Ot#Gq)]eߍ^4iO(KydT\ǵyiqM:F7B/^㶃~"Io[n@bcW NǝCBMգw{ϲ(҉Gb 2xTvצyˊm%:ӿhO~gA/ xN]+6AXԢKRIWq{u|U={Wֿk7Rtvr' LV )QQSI&tm:&կ?2ƥihg$I S^M|^xI xvX^ "% lU0#:`fgϤ|WA/u{! S F{׋j׿dXVc?IZ*N1吕1S\hףWM5ʯms3^P:޲|5c&=*@YE u0`߲$'|Y\O(-'GК Z^ ]KNc%c@*鑑ҾZ!{7 ks=:$˹f%'s\U/ ܴ>4Ohz3$]A%8ܤ}5?MoxAbT?̏?]w'_ M~>~"_>"٥Av#&2pU'Q^a].kwEy .B wKd>vE:jjgŢ+`*YgBuFQo]z$qgoWnMj]Qs y-!$vka|hf4m'e8-8wQk>&ej #b}BG f7$ _||B M@_o/ï7Z)|sz5No?Ua&Yg~}tڿP?3M_l~:㦠e?-Ѓo/gɍ~~ɟm? m x,+_gerx~gG?G^_N?ڙ~x(xbxw"<_/cvgi#㗇t/ IC^"ԦgV8É#%br@x?` _ϋ#Ŀ-s䉰ۄyf~x*bL,4 6(I>UȌIZ~~:uvGY$5A0EƏ^"4_ ;mRgԮԜ#")ce $W;/ tKþ8=IKo6UE$?>,_M7oDL?#{ '{~h+~,eğ/&žVC_U?o+ǟ;GL?^e*L&$r7kj?9Ue~Pm'-[xcT gcͤ"Jc8O>Þ-O*XDNLLB{mW?,07IV c ҷo7 ~>?}EZQ:xGԬf{{ie!IVSPAu;wNW]%airta5;;^+x~,rdp]ǎ`?> ~ 94vZV򾃬ot'l' ҿg,Xx$YfJzB+Ծ:j/Fs˓>őԈ>_%3)hz>#|\;;;kֺ ]nČHu⟶)7z+ӷ.=w?¿AϥxGM\^M$JA;C38Pp?4ۋvX<g$,\GnXh`{ǽ|wᏈs7mvA_Wd`;OC>bO?-W-k@HfU8?61Zï64o(o֍څq7A|81+_&ޥqcShC+$W}<:j Po{k ˘{s+I z x-'L }y8k6Լ}{oV1-Ӽ{UdiP9WΟ85 ?A7}OMXz !?/ϐ8|' zZZҮ3L$2:Gz~( x֚nT7bKAhVetk$v𲴶?\$#ybB?JOHx_jڅ6ݕǟeFA 1U7Y:4fַHUFX,kJc>&A7,n|}quW6s+H9U~6nAbqO>2hi676ڎ e +mqxSúNoOz|דIkn5ĆT%*WZ[XCwY h*. A9aU;ڼeްR;tYQn QOaW>7X=Ku+̰]G,e 줌1$`I4ğ^ Agis/Yݗ[-)\n 8ܹ+#>t/z}vκO xž<մ“J-u]I4j4(P8_4A>#|%qkgYnQiwP4hIY'y( Gmh:\o,Yc~pp:0k@;2bOxEw(>8<|.č.Iݬmnn!$'W`=H?W_ Q51V)#QSoL tX浸x?^ va)63vU sz݆-ޱk7:6%J9$ʬv,x_J!osg>A,*5h̜XSωg"Ngm!LS|h ՠ~U9Y[͑H_D3g,QVm2E~QFq _lu-~fW_G/4oҾ^KT wN&]B/ԟWM,R;N+GjJ.kUmg` ?*ޣOSP.&7ö;K O#ȠD_JG/}ðYBhQ*+4(?b'5?Q?7>*InqGsmfKmI. 3f*Xuk? d#:MZFW$2(_@?J^y4?{HXGH ?Y_?᧭goMp@į >2m]bhSx.13(e wdr+'+| az"-FXMq=: :_s_INZҋ~E-zy_&)k( x5lG |~k:u7~UuXb'pDkw: W5|7`Q zUɼƋ$||ׁ|?ZHMo>2f"K(qJ?_o> I-+G[}&mkis'>*^\]gFB(lpSv=}]|pOv U5˱ndDPq?O_%nx_{$1n?yyM}=Eyύhu4OxKuhd{K ;xA_XYJLmFveV?b|tfY>8LJ4}Ƀ2K1WnAɯ/<}>8:P a?kcſ+aYct ŵRk%$)zG! NO}[%ů~]fVrb~FOrOLmj]Wf1duHcҀ8 ei:h~t-Em$ .[ÞҴKFK{HP6,I$1$I&GkC?a񇏼Cxŷ"֚ٵ6+V<ȧprqȯp>r{={Os^ړqw' '¬{W[( h1ŭ.nqc+W/4g{x^?|/ j;YD{,sM}Y@7ٗ2 ,e޹73]:܉\cגFMqj ~R+-z'Ԇ0?3HCڽ[]Ǿ-ok .z2sa^ f?P/'7Eee EEf2׆^%͜?,JH^$ uP\OpI [),c]uvxgm0Yl km,k3бu0 70ϧڥٳ@:lhcnBXcv۷zW_?C9B"S2~x|0SZ!]T'}Cնuj/"ۿ|IJˎ6UAQMֱglh$$u)_߳{_zǾ  xZH$LnoUF1;_.t(Cc>&ԅ|ਚBm"zWmi7m~mo4GR?M|NǿWj =Ct˕Wd YH T]èK<m(g^Gʑ"r獾+ٿf?>x+y";?s ο~,Ө[I]_#^>#N0$S߿h)콫jZXi$E2I1%P#zPh:ַiE_Ԫ۽K(&p7!esȭ@π]cm F DX&ۍ{Gj߀ρgk~#ڜ-j:Z]\ "rĜ( x'qyZAda3ϰyqU0s=7xމ[s_Yr(#aSA@5^ a|g_ n<=YZ&j dz$Lj5; DѦIF'jK*%EY~'x#zHIamȔxu=|=J_Fw*TOuEgmpkχ9iA5/;1Df%aAOP=>L|maun\ijvN2)S؝޸?'?ψp7HdlBE@:ߵ<=<9dzeȚZӣlO)$$ q^_¹?꿵a鶀>Tqsx7}ەw2۱  ygo7u=")`Ұee<A 5ƾ~?|[R:v,^u6JJ;8KD>5x+Nr/jֿiUxI*6n\G~s/C~%_º/*N .v1݌gMy_fݦ:T6"ݏJ=HCy_wV-fHov௫D|`0T?<1kMe,t+o)(pEz3_% sw|FWƐ7UWĚZ #B'?Eg8N.^8 }1S?Oh޼/aӼ9id2M.;hmlW?W? kzOtȴ_}/"I+"%He*I8GP?U#~ykգ xMt]Wǖo)#`^rg" $oO-}Ma'ÚIOIm1˷>>.=r^Kl3ZIcu+׿k֮[~Zk:JQ_"|5_٫ 1ySoDY-р?ؙYT w5N7-SEỤ| hdp=4<'luq׋ mL!J89\i_~6Z]KX-1K>O^[sKWE$:gۯ?%F }A4tkk(k?Y55Y>61_@eW x&-uf2wP+rz1U_?I CfS+Sc)vXЕXnF|8nV [4X>5` E񶖺Aٓgkz0؀k^ރi6-m3l_1)99=k>~W C mCDeL\^< *Ӗ5%IsX%NUl6M7WC<; x'^nI}'sgjڔ8 Dv[H~ -f;qҨ][#׈~מ)𧉾ڥzR̪UNޙ:Tgyhhi拏nV/[N6['=6< >j0i@^¼Ek֩(` m^@$}kٴ]*?9;͞Kdq߱i$w@H#]pZyuzܣ5}ϹJէm$徿q:=oiy/ʮ8qɩ5,;r5㶊<'CfIxW\n qt V*~B9^ud=yj1[3Y'z|MiI{E-]g#:iSQ-ߪ[& J'_f[5X? @q9׫Ǭ7lo~}5uʰPa+FRjjZ7t+i5rZKݶZ]OaQ_^ Z`yrtei? [&⼉cqM!rAxF|]%}vGV!Ο - 2ݿ~ng>y'O+iyr5OC˫K괨kw~|^o \jV^D&Iu=y4kj_gO2C }H+OĞn}p ȌR}p{pA@5׀|y~;%<\kH| b+Fd=rk`(z:YǫZtwb1U0c-[=O[VLסPklɿq8r{gpk^>AsV^w4F1ت_ | q{;OYoW8l|vם,=fm6wMmt:uin{z;S?m:$4ּO_ȏKH$;B#IܿKҩHPZgШH Ԯ>)|i4 )JYp$aO_Zi}ZF"a5訠¿|=?W3S5ɾ6Ce pJqk+sLmp\7N>)ԫZ7-m闚U/HUE8*{j w6ܰ\H Eo8=x454T@UU xn|ϚRj׶#\Oֱ F-~m!L,|JR= < 8<&=:a:v1. 5|U'ϋ ^9```vs؏\c&G9kyjzYr,J}8`իٍ VTN*-(s:tXZ()){Z[?GV[kD -^4$v%PƾgO]鶷W k҃* |ܞ8>}Vo{i{h60kh ٻֺ? _Zs=s Lne C÷gp8NeJ0Q}կ{h^R{96=?^l.,u+;r2%8l?ºe:/8aUGP7:9+RiMNf9ve|?ԡ\kz,)oʘaѕQ]9dmeiTqG^mWX]7APOw{uៅoQ?66Fg|P?h:Ë.m򝱅g@.z5]p> o?K V 2/] \#q*q^{[ttף:qX9C⧵>.|FQg.KLWw :MxK ~#Ra8naYCV_؛ZsjZ֣[Fr-@XCFa}鶺>occo%ڨ`+Z< nnNRkYlr)ѯvWv|v}/}_隭r`EXn`:90{oş:3jP|In6nݹ?pc\_?d? Zt+BĜy\z[,N]˰*'mynk_uU ]\E(FVz/ڕO*hVy;3>GP'ھį7Q?ԚTvI^mW>WWch׍6Βovޭۥά7RontKdQE|x7դKmR'݊XHkk3w] R;Ilcr!F4EhO$M6UnЖ"s6d'ʾ/Ew' ={)z<~2|-Ǎ|_[Hc)m1-]+"l8c['K?M־? ;[jZW؝o, ˜)+~\I_gO_ĿM?xVUq[=棫[+0w't [#G ms`-7pxx,+]pebZo4~WU׼oZPm0w$ gk ğШH] P-YecOãiBO6Sas#鷓~wo>n&;yeQ$̎=?a| W>P6K\;OtzS\z󯋿`o8V[H%[/nR1  mtMZHtlnb8^E~>+mcWF GLtX%VDe!0ypKGvϠk%g 06SC[V(?\4 ⽗T~~%o]2'h<29A T؏_K\W`dHFXgx'Rįx%o\qkc~v,XZÿ 4X񏍮ݯx\N]%~\H;vObK9[-B@H 2p;@ 9d_*:DUpp}AE~o|ocabEL_ڒ<[k9n SEk.a[/VI)4_q^U( V<5}6A&s]rI'ɠ ;]_O/,cYEteYX& "h LLѴM#Mzgc yF;Q@,I8I5rx{j-WWm79!C~zi~<-y-^CU NdIA{~}./^H~|!gw?e F Yf *:rGW'7~CW h:b7VNPJ-R@8zkMIu n2$I`{m/LxPРӯ;6/J8e$2N@>_2~k xŕ•[DJ@s!=+Js ~1vm=`֧xT<ɞ@6z5 xt]fI!}A*lG H|ub<++Դ<,Ó{PPk>$>Y'} 𦗠xz;Oa#T=XI,y$z懊65-RWeo%KK THgR:ע)3Gԟw_vZńi/mʁdU`Llʾ?PkXHΉ+/4nR6&R8WzO?:G;˭/L|GɞVQUO! 8^Eg&'<3kQ3^xnB;f$@Ԛ]ۛ=kc4p }B}~M][ƱF?!^-?'RZk&%9pPܑ^?#yok~%{ kmOE~dSAe_6߆K^3&_\fhOm7=8<{~~O sJѾ"Cӏ[mOv* (>9ŤZ7™ںj^dYdSȝnw_iٗ&y;b""pҼ+oGoi^+|Aivkiݤ%]Ps#r.߈k ,T p3uT&]S-+c㉙dvFf{W\M֙][fP` [kuFc[ӾFl 4(68vI5 |]֧ZjfPѡ\L͹|nEvaxȲFd2=k 'صm5k]xyuk?˱iyF viHA}k7 CVM''s@*ɶ3Zio_¿_4J׵ٲ" bՉVے23sW} 4/;-8EiP  @~?iO}6 I.,g1eVVa=M׀ohI&CC.R# 22_V% 臯GgNN6zUZ0b7flj/;#'ď  V27ۜP=yIi_fWzW4^;3El n8gWӺ_WVIwqdBЭݹQ4Dа#pFA@G&l3i|+5D)wMPSzKma%X1E+>~|Qx֩[VZS6D,UrNz}sc?6_xVOjFڂQvƶs.6YaYxvS9Oyι_fuk`@#z~<=-:WFʸ3r9 EiXڦo}iW_2\\K# N&eH;yuľ5a[IhuMTIskrOx6߂t/ i`?Hʊsc2}ɠ <5K"=p[D7Ow1,Q'9$5.OX|HŪi0ѽ58y_L'~߳G?imHӼOXN4Q3(R̍0;^MC6h{_ O!G31k(6/~8|bf4kKdG\yZoר|0v8OF⛝KIς+ۻfi\0[u$`Wо:3·._&ɭC9VAkvgW ctZ|^ 4F`c "}F^cPJĄ;ǖcܟt?L>*׵ 7oxJ(CYI9X$l`xמ/Ӿ$|D=asG f/ ^>s wp:lFC=< r]x[[2 ŤxI>'g}i'ug'kq=ٶ~76S-1Dž{ߋ. ܬqݖ9c,N8$dY:]RB͇J.c‹28$PO=.K(/[BTМ zbO}[U<1}7\mݽ>qv'qMk?&sN+K3Е 3м#]>/|Y?SM:Ȱ˵FwV8Ǐw7^#ռEe-vb=.؅8x\=8:T&iȴ /Wԭ/dQu@5/uoeK{aDT)dPU#>_oٳZO^-~*jȁ7ʈCOң-~5eFWU zc4ceul,zg&a<Υ Q sO g]85ܾ42 W2~&θ һe</vq޻^ZkFC5 !2~PII VewxLl5YTC4#‘Gʩ#=36I_q|H5kl{9-qW=W~hq%Ԟmی| ' Q2sk"ɒGQ@|q[+[X,zL2 -[gv`'{WvoD:-㵷z$hUG+?t?~'iEp9I/)܉QB}K_UP_?I Cf+cI>aL?4#7`o~RDO̼1^ᏄƥKK+[;Z5;Ug? 8!Pֶ&~Ϻď[knT^f Ióof?Z vB/@ =UAN;}, JSQN u[i+קțmJ˾q~'aO!H7;%uYFS>~mOPִՄ[Gbc!6y`i@ \iZu{ $7,$VKsMI;7}ѫJc{Eqg C|}>u[[g^ cf֐C5o O^XZ|9OصΡ}K2(sh7X_ƢOi_uʤ_K 3o+Wnc*%2b;M٧X- 1W  ~ [jiR׭[ԭFX¬m wZ>ךq_jEQ6\w8@Iإ#$ch ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( z~c[c⶝WLˈw 0y&9? _><-Dad2ۥF%YO(¿^`u /Oa.M9Un9힕tW^SYW-aZqt9OO4Mg"M:9EۗO8utQXըMKWT⢺QYQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEGq|HXB.yƽMTk?ӯa8qR9͝BY VKȣפ[Q5} F׈o.![,F y+zvh((#|Yr<Mя~~rs_7|%2VQv-c)ߏ3nN>:v2ӣWMErݧY&3sSHPW׷nҟ ~(mG]l,%9*C݆Fn$cSqrN %axѾ6=nWo97Wnx]?&K đ(8nt?/s,ҞHp+g:պJ{fv|<w[ڃ##Z|u~/J Cs`?+ש rt0T5JN 77N2}%NIZw"ƌFK1־Y0{LbwUo ?Jgo}*CJnFY2yCw{Kv,w*gDMk<,9R*SOY4E'<&1aܣ%uwv}#^3Fjgi|M| ȥEd}3Oo,<C[򬬢29݂RIR+xr_qRonD]I\cUǓiJ_[+ӋI/z-ߗю4i4%˿|Köޖ~ KGu wFNGWR_+i~vs(Uϒ2IdO<ị^ymY;$I=~φN-`_>?%?+H羷v{Es~" 6rzvcU!FF쒾ힽLT0a*dշ}yz;G"ZLpT${ω;95ZV+7y '5|_[M{m{×5vk{Vu*U`$UgE_=2L4-(Wygֽ:RqӦtW|xowð {_3%|sdp9$$yf~Ѻ-G\Cnyi]#pz؊ )Ɯrvўlu:U%)-UOk5B&SmXu"VciҾKs`e ݣܮy{GN z xZkP;Xs;QrE}#_x;ៃ>#~ط7𖇡O^\i:l6Xc]?گ."yXKpd}R▅|Q6a&u/TVӚ~(~ OY:{oo_yh>Q3^c)jI}_utt,ogtգ^{}p+ο#Zk^ZkpSo=qF} 7$N}>K WA8&9xE[>81j ־?~+_kTS$Jrh9k}(7<_Z|V̳goe_O ĺQ隵wd[epzW l|e6k oZ{-EcDP:Wo?R!/Z|}o=Ě젷x o?OR~|Ҽ-~ |$!r:I#DŽ^%ڕ n 4l 83'=+gLjyGyT"3 yjwHv>6֙~/[ږ[ѽ|]NHJ(j~x? &/Hg$Urȃ  AoؗDuwvĖmĂ<Ɯ$ך3tG<o\)FI_ u}=;^%͜Oc{ lHRH$c c]#46-a-!(U<ù<%?X }vw4o`5Wh ЇVqg|T߂ ռai&;a1F2~ kv> /^HSq.@Q _c~οo W*|S ޷VFh缻$h:Orp@t|7mNza$IzPLAs۵xZgτ H4MBhn6I >=7K,4]ILm"U/8ex'(n_m3qlaYH 22WG_~xm<5fSp'_WkߵtjiZkmO hs pN#V(^|)|Mi|#&Cmz#?ae`#խ 4X~Ze|#௎7sSVM͋w}Mݣtđ8r#9xJ~{kzYepƣ'+oN~Wÿ?6^);Mf8[e:onVmN/mD57er"cjnVsZ/s-`PxEzŸ;ZWs*I`r3HS鑃2*+ORJ8}.- .s5ן F>(h_+AK溶F8eby~mKPt64HA!A,x q>:xƞ#Ў#Gj4cqڊ(2ddIiZh-K!oI/#v~+lIszhJv_ i_I` evG nq|%ykᯇ-|pO Ok7v% Ev]嵵uмq^B HRT@`G+  ^":C0xZ{5l$U;QTp8?A=[x@5"P1v"\Vq6?NcO |!:&"yUܴQflpz@U?h:冿j=~ms Ȫ~! |?fL;tXwvbR(A/ྦྷ7ڄ:#|wu70=="&hŷx/%a~ki6Iq+7OFrO'O;|Qzt{ 0p_BG hExťu>ˤXW0HlAx?n6foo _Jnh7  $sҼ Y"\xw1YԤn+,~0xV= Xy+k*$XeYpTяNVG=y9X꺲5״FʱHAq2:ֽV^z׍|/xJ/ x]S7k,W`G/?k>07cVeڈg8ƒ_[x3\G u!ahwLnOL0ROZ|'' 2wp@`P{P_P gʶ > ڠdk__a<%̛8eɮXjtdٔS9% П|YGi%$mqo'S"$z8< +aa^/5:+ӒkZ+ͮ?hχV"IX˵RȄc¾2 jj+mVQZЫ(:q]lˑ_Q^ [rDֺeDG #$]7^x7Z@7Mohgh++ڋOw]3\д^ẍu;tBhƋa_j/9۹Cc= $oO-zON2[\]l .APW5>.=r^Kl3ZIcu*|cC|EYT.fX=I'l^JiOMDQJ\wSw[z Zq^ۤ:m闖rH.eY"OFVRA8/ߴ7(Q+=*dH <p 9mZ;myk;yOpr+{SFT"_6K695=?v=yn 'NeJ8-p2$c*{/Cހ=XnmdG4LHe#9ȩkOGF]g7oo\ϋuJ㠯Jko>!-3:}Èⷁ%gf'`'z<~1LOKUe9>`z`  Nvk7?kӮ3ld#8`P{P|/| Ëjp:\kdoHhX f>'}=_ h?)?o@`|?ռku'<7qϳŦ~" -hoǯ YhZ6d\rg#*k=u2O'!6(܃!ۀҿmo:m.yj]@2B}ko>I.ouَe 瓻wF8q ֯?jo_GOG4-F-du]MoІGqhß )5kVzi f=GVc:WY~mE7m嵻dS=֊&`97jݽJpsڸ? w:?]av=˽8۔` ?Zj+ϼğj>5cObH0`0MUI|6Iťx6Z2Kus2 vPGB@z]yHN?u׈9 :`R|0>|dxUd 8$*3d*v5O_)hZo'.QRHrEnyA`Tzu-RE/ ,lm5̂8Qՙ57Oſ~º$k5Y$*Pk y|4p\,L8b<8>V zds][zUv-l{A$")f8x Jȷ# hxºΕSZ^6PO| AGS4>{QTMv d {Y7u^8o5;W/b g> <O >-څmv q:T8@V Oį~'Х}#RζX6e*yY:|<;[hqU@|ckܼ]|0х}Ne#i*(Z|;_)<#^jZcTv42{uuvcXۿ kk^ 8"k~v {}_v}W'/"wo$1ch;|7x[񜺌.W2̲ObC2f43Gq KHЂ ௃~q?vw}s2 $AlA$W-[TZi0١;?wlqDsާ Ex3/no&;k .;h5sr$ހ(|/voXlܒBݒ6zk ;Jon,cc-:6E=(?tkI62#bFOA2+.?mhZ7x+Opj"ֲ7/z^*ޙeؓ2@MiЮ}&gqM& R8䶏A_0Xi"a$T# /T4]CN5 y*0ʲ;_$0mORkkr"${~IA/,όso۳~vn@,d ůxT:V5E"3I1V`cV9*rxyd?-t_hu9p? _>-M{yh<7oy>H\)"GA2~1Gy4)q*,:dqAs&[LJc<#c65FkpGtOk|0)CzvAƾF75N.Z=mLcyvTT~ў;Mz+9Y#O4qOEsV+;1Ḯ濏Iɶ_Zv$g~?4:\[3<+K96A_G^XEXmObrz{N#w Gq̪v ǩ;Fz*ڀ+%.苪_ine]6k!%f 6$zד/OxGNbon Vt(p{W7ŏ.,7zOĽKNhm(R3Eq~&|bWYU-IbC? VOm> ׼LK,bK5$*qVC_Ÿ z,K]7L"S@ {UoMVԴ&, Z[;FZ)`2295[?ۓ᷇)|+Ji{5fr= ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?4h -Kc^ -J U}}M:o?g;op WNO $˸P8WB;5~e|eo\۝(9YY|ĸgSKP 9 Y$E^W J+M|. {]/"T@kkLvxQEQE'y_XWWg_-}VS+۱[(}x ڭfI4{,FH?l?@McÕG5)vYmSR1e;4o_ҭuZo(Vr<Ѽ(0I<?j/V? 1.$xF0FTq^>|@|qDKkP#<5 =9PklY^*Q4nwv#9n:,{*u䤞ܶ}6^29j[>.u+XӒI"h+6+xJv Ɖ6k*$=~5W߃-"B ZF?Of]]ZwV)'SV\r;`Tu*~ҌZz;{uN|#պ3xh}&_xg÷. ߪjMRrQӦIn ՏV]?2imPzd IЅw_ƭ{-BjP[ vmyw N3$v<K،7ڴaDe5? ۫+# cGBrmɷ.]:NY<_D<7Gŭ;ŝKծu'9c}iKX]EouLU2#ş|]mS[5hn5 8[䁔'9džkZXOuHmfHـ8N#*y/y7n_܋Ru:i_^n?b]J¾#K-ٯc*ɭ_R᎛iKM%Xl[O^=8-iZjr]$q@ r³6Ѵi7Q2²?>kj\INjwnK5d=G-5WsC|!(D}2 9Hs^5ri0 {@Kmʺn柩E|{az5W1GJ[+]zQiPGjWfw0 H,n$v;)٧u)7鮿;'^6']=V?# 6FAС}VO4߽&+rc#?>/_Bx/xvQѭAu_쩯G7|J7wD6cxD`st;IUvN ĭ&w,.(ȿ^kIqs_^ZkgooGR.w>_>(ȿYa)ԎA}uъ'; GQyQ-}V{WuWIkqY)H%˞ې} }EJt(=Bm*Hv$0$3 Jj}~e`Z'|\t>Rii&WV,8A?S_`Wcƶ>VO7OъA4۸{ Wە|E ヅ_RŕJ2u QEQE| E]oZ߰J%(W/ްz~פQ-{yw-?$v =*גebPŃ#5F/4a'G}}c՜½C?eR|9iڞps{6Mܯʙhx?5#H;Cۘ|3Fmq3\W^,i_A~O^B nҦG.Δ?`d2}xo3\gKLZ >)֭ܜ[VY@D(C_2.|Zk..es#/ sD+v~j~m#~̟{ɺb u߁:o!>v-Z$,0^/}r0/ ܨ[7L+@mS/6 Y6[~ؿg e&sak?o?RƯ%OLW:UB#lIdχs|3 }>1oa:$Ք2ڻ.G| kεf7A#p=WҴWCAӯSFtpPȑP}ǭC/~|.tsƗ24V#͹8#%=~h^tVo:7|CP-Kx^<=aӴ +t'$DS53/y+#xv¿x~ 2;*W?L x-wפ7Rq$I""Q$S )_fc֭6q'z7-mx x̎$Sk_;UL.oĮ &ac u}cbWQ?a3׾~οo W*o/[o }žrE":69 ~:mi|kP:}w(B~^ _p^"x4JDep[=Ouu 72oo $V d'~jYڷu/}Ffɦ\G4 [dc PN3k¿??e]>_߶.I.p%ЁwVc=k>54yЂ{pO\WП~gz/~e?y7Xl!k%FKOq"iOqƟ'dis911oBUQ=h/*W ?]kO۫ǟ'VM/?$t*Aė 2%I0|| k{]χoZΧ4tzQޠC._޻~~dr2d~hSSKS钢4RѰta wE<=XiVy66ŒvFW's>.x3Lvi[ Vm!7`z A3[-Ʊ}oi[neP@dbq,ak5B$JQ bxI&𯅦k'$O x4Tn!vpTX?TS;z함~#m6Y.P;#t!lzϤcѬ#Qt2%$$PU >$EVV 2NA_HgI.?G `'Jßg#׉% RXUeܬ*#b?G `'J|3u]J3svTtP:'@3Ѿ|> \y 1WW|#-[<ŮOÜ/fcHAྵi[ƾ!$Y@HwN}G{ʞh?6z.+IO.%H\@{O$?{Kwo)nI%QВ쐩MABkOڻO|Cuaoź1]2Bo:%?x}% ]zX݋v@wǘb4~ŚQ' %'PݎirK.H,X^T7ū'ox]{zĢk~Y#@1le}_\ɧp[ s^?xj|1Zi O9K~ Kֿij:m$1y6J^|ۙ#E@JE g1O{:}(wY%%~kZV|B*[/Ai]ՔW̐;0Z6 _^g~ҟMݤF+΍_aV2288+NSvҺ|1"ґ:ڳᾑ15l`Gs aWF#3Ё]o˟ oiDok4rcv@%B}Iڏ^> +{@ΤUcWn>ưlW;HW9 &2=FFx즕y}Z'>:u"Ptዏ|$埆tУ c؜8$rIn"J'dy[0hYʑ\ƽsH{P]O^\@1;f{W~oH|NXKD: ښ9)%vթoo_2$adJ%Xg;xj_1r-tlɜVc#@O#>dOkͤμ ^/ Mip/&;Kl,9#5VKy Y~-B *@:/ɐ;g?aW_P _H?OWb+jVo/cѧ:u9UwD_H襪_7υQ]EZ>$:3In.$0НnS،Wo ',xoVpkWо%S;v+4]úMgaj8`aUGԓ_TA-h\WP G +wl?ua#~Ep26=X:5m;>}yVݖJu7_{=M9lhd2D$#z9j|Q'99N|]_j܁uV"ח`nuoAsxs~bifZ wyDq~2lG*jjn3'RgᑾVwpvi-Oa&=wkIY#exVSAA?mB|oG[)A׵|7 eS+uWX0>Wfp{w֏XZ_sZg~}S+Oh(io xŚNohuhsy$,pc5c!Kx[mF{r;qBA!\ciq+Lț\QoxaeG4>Z7VBMm~4=G\]R('irɹU@s_=~蟳߆"]:ITKan-}$r裸}=_ۋIVAmGa(SIb`}ɟ|2 7?:9Fu4',Hbf9IetUY> =[^Qik G>M|Ko1]9Э_D >Q_c'D-Z lWj^x'<#TbQKs4`&VU=Bl|}?ࠞ[qMesq?5_OPҴ Gu*o($'?%|1xSz4Gw YLZ|U᛿euHǖc0lvL t?(|##. yVC(p`8'."Ia5.H@UP2I'z+?īh(fasvn0=Ƥn_ZZiOxMgռaH64RDZ_0FN?a ʿW?M|Qx[v1\ d3>nUN23`?]`z=b^^0z7 5K/u'DD2y.6ܐ(oyo÷iٺp8䜝ۃd|Sx'V9i<j͠7GxB8c9<,]7K#[tX V}ϪڽҞ8AO$>9i[r-:B>:g,>&j6C@iRVMFda$Jz|/xU~=itVԦ q(H,WZsğ O7[ݵ)\'M׉|/[YRi֓^HXй⯈k}YhjR,7@d?|Gue߇:5/  !(?>4x6 "Yb-5 K! / ?2+'ھxɼ{ƛ$+?*χiK_ /gwZ=\/\,_$OZO!?ZH6 ڄ6ބ{YA>+olBW_?|T_KBH,+🃢vMn#3);scPx|DOWU ̌+YO Alo"j~(GY=dѼsUk7vn$k#Hƾ0zо$J!h#di$i]# z睭H ]wKrWq[[I,/_)HxKe|G ֺ}3O!b?hP>i==+'/iv8h6>;uVϭra3v+p|?Ṽeƫ^X?ږA|Iǵg| km?T7^e< NlzK/:GiïoI^G0VeB%╓'zWr|'<$7Ȅ2pt W@{_/~^{Wq'B}@|FoD__To6mL$_'+hmb"hC8lj&}/I"-KM?{鲿*ܔVե,Q@<4_?#B.llPI{zdt*L@%[_v?|oG}WmokoK,*" d{qTž+haFY;nRм9mW+`̼kA$p}TK_@#o"t*;HP2}X'$-5-kz~i-zGl{W~:.SoX#zQ.4~meO/L5UltY%'!Xc|Z-v^#AIc7ޣ9.XrN $57;H4%iLn!H^M>yG־ⷾӼCe:][ R%Yʒk'] -|aWYCqm4D#Hp$ =>_&`_ΏqMʺ/B}<GmkُWU[][X[Gʳ9,D迲_û<=AGfnnqYݦdou2m! E]oZ߰J%(W/ްz~פQ-s߷w۩П ë('{;y a xV;Q'Lg#퓭iӴO#lK{R7c8xb9eE пZkZ5T,`582x+_-vFXlu){jR$a9a@\Ӻ#_xKLB/ۓd+t;G\uT&-Ož'|?&mVpLc$22ǁ@ȦIIbu70<qOk9>-)S>Vy/G/Tk17 p\a_zT7:zuܼ "T,`>FJqum~N@k8hj_ۍ1~.J2nWI.B%We1Xˏ|I ~1x%!7Wirym8v53h~>(dVhʲ$.I'=>5|o _]溹#Nҭ~kBsE䌷A#kHo+Ou'⾎KH#6%#T7z^ Ʊ4>6[ii9ۙO@a_We4mJ-5kءGcz ӠUxC)<#k?ojQj:z֓AxdYRÒA*Tǽzg/Z/+צ1i|[Y<wf!@猚_^O:櫏NIrT, q5念Ϗ4x_VmKJ;a<^7&$=7PZ}[⇏!Ŋ46QeO?oKpm]g23G+/ ~(|D:N4%I gvFUO:|'+䕼$Kps _Jk~/xSwJ2YoCݤqfC '_wO~XumA̢XIn|L57NsXJ1\;އЫR;">Q7AD_LC⦯b!t uRZ?2-@ʸH9e~7}_S?EK)oZ>DB{{|W]?-5~%Þ/RMF!KYŖ  W}i<$: j]sU$bP||qZ5G]Z;mb*Np"|&>^WTaS;FhDu,+W [kO·Ń| }ßcowi?.15{ ھ/`AEx>jŪX9dE0RdTo¾ЯaeUQP2~%^xg^nKKy1?h/G~ #McS3ؘ΋~ߵW/fF1&A$l8u t0UHn'7*|[RW~pVxc4%=@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ǽ_5cRsF>_:?zGڬOohr>+n ( ( мMk}ޡ5DdC*9d+Шxa8S~fS Q\[yo-$J$E `PEKEağuMJK#S4%m,k˜0Rkc2xOឧXգ+a>^E{U3ƭ/a:ow:~i_ xZWtu%{G'׼\x='h:?*Dtk'6u% p*ǀeiv:g*|Bl}e$  ևzzj(!'EfR#?Pk~ | }Rt;CQSQuiR[.c=IE ~x> KSVfwqp4U <^E?exLuxzuK&FVY$J(<%O|sk?? bQ_Oy<,wC; fT? a-}Ep?> ojl3:˩H1gmr><xOxs]־t?La9 WQ@'Sz|wkϏ|jìxuڮ182k+WIho Yw ndrJE|->,ixMoOYk>d"@mh@c۹'q|QΕcJ١a BYH^EyO( /usÚpz~,# Q޸=_?W0xz`K6ped.ƾ9 /g iph="+hO%by,I'(x ~׵MO|K-VO6L&E"68 jzo[Pq뜝N3 ()_ OiiTC #qʰv$EuP_읭xoID~6xL"O*6i! -cv?f|mBA\ԉ7?/nrۈg'^Ex?5"xsίj5֐dE# br*0æNAz'~:@OLk" k:rAڊSm"MC6k('Fgw7 8M"FM2dr/K|Z~!P.#,K VPV g}Eygͥ_x#+94}0\>V~^:֗kľ9U]9S)Wa;^Eqih~ ѦkIi]t+~4vOrb7kFxp+?C49@o7_3=[X+~*x?Ok;QmaH0x=Uh>:EVq`c>CEW |3sol6z⺺q>S.>F=WZ0 7A{> +^Ui{%q;0lOC5J)+}JUjҴ[IkZԼ[1{3 ]FD[d>4PA^o i/[#pAbi틿ޙWW(svJ|BzTQ췧xxXcRŎ P{;<> uLj}Vuy}@7mD{i%xف8Gx"x^_Ykd0J~:ݢ6jY^]_̨aS{jyÿE_Ej Kgb00 c ߳[Z<@vmm-~`Py }O$ש[isﭕ#?~˗{Zֱ"kT<0lS \ogx !imBJ@pÃ3zE}EqL+_xLUK O99 |k{gxZΝw,ZkOk(70gH`r0zp14Pc/ |~-̳-+{[i+)r2=<[hkxXK+[qk&袌0', eIWK-+T^ghHct|. dq"/ڼO ZDڎoq $lj MJ5PbalG5/?sBFP{4GI}e5g|zl-W{7{f1Ƀמ_׌|]~#W~% !fc ~y(kto/ xV.ݠR3y`yb-Hy?<lpIJie6du/4Oo]j^YrZ"gp>Ey}?7?no5-Co6X3 @OϒY?zEPuύZ[tM2m>M*L/+2|P+(>Rwok)Եkݲį#!['}Sm"ٔP~Ͽ?f jouK;}#$"`A:sjůٟ?% 1iZr7Ii& 9r{b|)𷍼}2|CHJa$e 6w@+φ!0xhVݵg45sc\gh 'o;/}v7i"=TWEebKu? OZ?f@3 OQ k׿d>3h3LG8.2;x=Mߍm|[xOb6$mc42`.u4Pw_5K%\jZ7xI&-Ğ.I_Km'䡊9qn=ا_+h9յMJ!ԯv9d#(y c+@ 2 Ac{߈0y+M&csb4dIs}EyWoٷ5=CIڷR[Pq뜶 9 WEyſ?4c 6G"Fx]daH'9{k#,tKXZ4mb[X9ܡ-=^ES45]&+2[Z%@H :oV]èܤdr |'τ|qQxa1Z3"cic}IEy,3ȸ\ٛ@|'q68OaXA֣}cu}i-ă!~˓( TB5PS2EK`T fX¶A0%Y{̀f yVV 2;05 _BFJ$b)S+@_+|! ^aO<6\ًTGFXdr0@_T֙]W,Um%gug# 2tVv(Т(((?/~,4=6>/,ʂ}~B>*'K^>#InnU]{r:Z+;@?xK]ͣYwT\*~fU?@O^Cgy\<]^[}dH@p\gWPEr-C-y 95;~¢|;CO}rAԮ5_.vo{}"{AFpq+D|/һOau*9@1?(9'װPEq/xC߇X~kY#Y[2cew|?4FCjֱ[cn#@tQ\)h^tk#[-$)G=H P_Ex?l}c^-+3D..e22):QwcxjWڗ56~(e2d|6Xdt~x? &/Hg$Urȃ  A=bo?)x6sRY=2HG9!I khWA:5m"܃t ?(Y`g <'k/xWFd:ve v,jv;Xq@VO|W#AJHm|rANH=nMP$5_\pI {vs?<7Gv5moI[f?+@da`:(WA:5m"܃t ?(Y`g ƞѼCYCle]KnVWxqAռeٜ]A]2]@AA8'`ֿ_ڋ_M}PVVwqztG!cv st@Em̂+kxYd xWgmviv~*lP=Ƈ뙑~U#|,|`֥-q [ڥchB@44Q\'ů !i]-sĿ3}qHmmL,=B+<\r;ZQExm|5F4(tA..Z)gZ+ļb2񏊡ĚG3*E[ dc¨.6'I(I5ׇ[Zա"º\ځs  t_ i|do4euVi{ 1H qFq(]kzxsNueZj7i ٕb9Jq}tBy +@(((njO[j~5 K;u.|ȍ [A&lh_x󝻔63 QEQEW^ ?{W[]G7&V&؅d;p8DY>O<+&F'v/̍_np38@Q@Q@Q@W|@č)/(w]xn7:}z Vj(xςu1Ro)ӈ`⾋+tx]->L.wOpbeyڊ🉬i]:iڵ7UTakPEr- M_62IQnHЕ/#, S].Y}w&Gj:3-Q^{σ>6^xjmš7K,.-7סPE|'w|r26Ss~(-N ?O=̂8@2Y q}K_xLb\iwIp=q ^omx;\֬UKI!=FEv4QEQEq/xc7/ #B#r`QY^%/Mg};V٤]b#Êՠ,|b +zmi6{˹F'$^GyWxvDZ8$T=PW9}šŶJųUe 20ʰdq]W+ -}6CNֵ$rJXZ wPXu jX$:-˲s@^(:+| e|G1դ-,H%vrpUT=WxeծuMBU,%E w87(t?۫&K kww`=ق>8k*(+_χ>fMi{[ :kJƥo sZZ+?m|}VVӠ2ZΝ59U[i h(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ڷ4]RxfZ$NMS8H65 f.&WyZFc#1,Nz澬csawũtk$XʾOo@z?f^h %$0pŞՈ%}NM~M?P-UI!TUNE~Ĭ"[袊(+k_h6+x.,8Mʼ1⼿QՊeߎ~Ϛ7UixVKxm/ #T⽓+N7\M[_J<&5[rz6 O9ʽw֋S (}F֬KN Tȡo <;lkdqAi弛8\\stGYcM7IҬ'dbIr_W?ͭkwHETp;8&aGR:7<`2<7FxDP~Z]̶URxO ? QӡXu(UWsd'F J}CnŸ <GVǺ}3-x~_FO =[>Ya0ʿUB-?N.m&ߚ3ɭ{l=Yɫowy׉~4}.~7MaG$k?g{U񷋵~*FMeJA<?v>O\XxO0žz-ߑj8iJ{Dp_O>swq8awھ?y ԭ5|[nv&@ȃYxoI 'l,G Yխa*Mo#SW6J6u]K+81t,æ?@OO]~[][ $ 0A8ʿ6Č6 hfC'L ޶`g|-l+{#Z#G)9'g~1wE_i Pʫњ{t_T[߄5}SO}o5pJ~ ?h75-BSqY-Gqھ'wr}yt"Sj`x"VvGɸb/f/G]~.Qw xb "N?q#_ n^6PDFYLxSA5]Ξ yV6t/ߴOxv&,%c0 ?:؊0 ieʦ5s\^*n Ӕ{ڶ1^[qʂDNC)~-qi9忲-A?HWa_֧jʟf}u9{HF}I-'w_W_H}G ^6SVC;5Ҡ^Ω3i Վ+J\:jȳjO>Y^[IVi'%m2F2y8 22OsyM!މ[ cC+_Pµi⾪K M_~vәЌ\fZI,oܿ3O^6=KY.#%y Ͼú|AOS:<>Ԛ#jtA+0t)Txݤo#l*ќ$vMo?0+Oh(<;~5/ox/Zvd{u{UP,Q) yg~פQ-dB|s[ַ7&&҉h7Ea:FӁV}+п/o-?GD#T}qy5{$eC/)s޸&ʟ4_c* >rN=&=c ɮ3 ÷sGK>lk2($d]-Vv<1)wT O7ڋ>'_6t TwDޝ0B9CWA258/-l`;9_KRK N㫣fs8æf^u݆Z~"5[›|׍ <+5/s#x:PG{g ]H5JϾ"#Qq-1h* iŬE^P8$`0L=>gK_߅NXҢI"PDSěA;\63^O dn&d?5%?2}&'?}ρ_KSľ2Q_k="ƿ(+_M)k?_l7?m^+ɶ3~E-z|.W;+G!ͼa"B#zƯ%OLW:UB#lIdχs|3 }>1oa:$Ք2:>xǚwn^uIX#0qm}sSo iռmizYmmT䎄¾?kڇ.'ŧ^.]4ࡑ#b8.ݶz?7Kx\f|;qtbKLAORYcNzk?# čaEI#Fp{$?Kx^<=aӴ +t'$DS53/y(rWHM m XKDa2-,YOԐKֹtkMkě_4/3GvR= {ǿ lXp5G Hh&>J={V?/љ4˛$k` c* pM~P}B[ -^y"d5Vh |ς95={ݵψ5׹3`F>TEWM|FoD@:ɾ1_KH_G^XEXmObr{W&}/I"ઞt4OW+yI>~i~{v}h59@yA8'hEP;W@ 4\GW5@hԯpc;.0ǎ:ߋ-g;]ҷ̖~ᶶwiٯ(7AD_LC⦯b!t uRZ?2-@ʸH9e~7}9C㧁> |i;mR4v*I#HF7B,pFMt>*I}J*#I-Fʂkt]5accoY'dhUry8P9Ὧ~}kHKssy~{y6ś8S_ CGi/ $Q Lc|,vƺ`$ ^AG؟z~>|J`X|@A}C]H%XRvPy9 x/ziM6O vKOw G}G%8 IS _?z6 Wm;PU;Ee#:(e0@}N_هڍIq}{p7Hg=p1X5Q[Y~R_È-5nHOy[5|u܍26zAZO~^_~x-._[qX˔Sf  cR?xKHWcyɐ[`ps: 9Pkeo'U0?U/`{ֻ*)xK/ό5=9"XpvYp> E!O>;{?5U=9>+/Z;Iw[^M*XgzoM\UigOྷcdv`BOWéxXEO).'G)*?H|6ŤxcŖ֣.!襎NkD~?~,*-Ή-:#<;=XǴy&|k~4EJDIuey!]H|1؞>n,{{2nbd>&_^g~ҟMݤF+΍_aV2288w/QVvѭuO7^*N󶾞xo{R=;N,y#m;y=A'kW~՟ _ᎡCc;cº1Fzg\}#Mz#{Ycs'*MV'x(㰭r+6WMy "<5k^Miucn?hχV"IX˵RȄc¾2xrC:UvhQ1NY9$W7VriM<-4,rDeHpGc]zz)٧+ZJUgveӧQh;_u?h3AM\/w ,!r㑴zץY^~]jƛk"5j챱?~ưFȶ s&r;Z)X!NH(ap0wowvŅZrVN>޿y?<#ך,dl%I8،KcYmk~%7~iMX$` zs־h \M^LwYx(>Y;IrFk'ȳ'[*HU(t_ v;S0XS 78m뮺d,.#EE[n~mM[gkwϚT}rXWW>DUw?)jM%s|E^ճrrVǹZ#>T֋o7"Ӽ+ɨKgeu$.}p dow`.NŨfYZrGS~kϼQ>,xoVpkWо%S;v+4]úMgaj8`aUGԓJjxZ1Ijz7僚:ҭQ6?-zg/߇h?'鍽ko_<7+[KcTOO2&G/uoş f {E+%ߔ9%! W<;?i腬>ͬD?o -GJp{FZp(SSokϪZoӿ[nq}nj΄ӗGfӯo3ִwJJuR 0No/,Fm<Ϸ'$dEUUBQr^?ڏj=}RrǍJJa/jK }^}JK{Y++i|WB44vܤ#'I/c}e_(m?^gqjWf[NA2mݞsp澬D56Wee9 (i]h<ܾҫZ͵Zu(Pem&t#:3*;A qַ(=^ExJB\GyI? ,FB>9#h0/5]u6&HdDʈFRlw |?߉ϋ4 o>2ѾIX Iki&C"7V(t(XvjBtPxIz}Q䉭t[97 GpH"o? oƀn228WQ2W?Í/?--"Q-T <\nn*P;c_z'@|2ሗNdl[ Exx(3@GsH߄?o=lf[}/-d2ϽiO)hKO\״ ֒nvl`<~5jz.˻ٖ8=OR{_|5_٫ 1ySoDY-р?ؙYT w5uxnMDž4Sfrlxܟ$Eu>y7 Nciڎyoi($U)Tee$*Q6=`qOs@_ nUN2=CѿcYMzd0w2g*$++ҴuK}7LΟ}p8IYى Zσ~ 7 ?eNӆO$'vkڛ:K{VmQޭ)h4I$QԬh\WÿNZW- }@Y\ e%7~WuT4.k|{m.?Pu/R ^GVy6Iw_Ct?iiiZ^axfG`AY8?Ş[M4%zeMÿ(eţ٬6]zɠv\63p9s >^3{V_134(XI$3Cwmom;Ua ڲ2@qmIZд;M1:dҼ'}wo&j.!o-K$J'.YxW]Q?D0 FfS&w\Ơ_n/4WOAjIX&m-mڠ>j4AwoR61#O:ΏXj:s=F$ ;p־_`UFíV#Ke嬍"K(x#WxB*OIѤͥtR[+ vA p(_~'<-{M{X771؇$:D| +U~$_ ji^(M mR\bА3\|G ֺ}3O!b?hP>i==+'/iv8h6>;uVϭra3v+p|?>a@|>-5yj7Od$1pIUW kv> /^HSq.@Q _5M_={&}/I"C<~د$UG >p9]F;Cm`7S;Gr`vS@y5o⼟{'oZt=I "~ɩxVִf-2ݕ@DŃ6ef<4_?#B.llPI{zdt* +"ď&$?@b?|_4[V| kTk6P-MwB <{ᎋï ʳ[h C+ʰ G O Ƒk{[ ڹ_2VI+3ێ+GwM ǚ͇fmF-:; v%vDŽݷ,36^|ckܼ]|0х}Ne#i*+ohOɠ魫}z= 3>??ol7&'bP`;o4Gi់9>{xl`B-(@}vC6Zzge˨Eyi3(- *T$3)c_AuiSN47ZC66YNe7 MCX5iH St=%GP;W|no޲͊Mi~ !عc$9Ckeow34i:K3 4ҘݞB;u| Ǥ}H3?z7"HzDž-m.eEyR'PÐ>uoj{W?>.|go/,:o'helv~5m?M>?Z!t0t_^ys@SD/Ԥ"I22ra$=q_tQE 徛g=Z4#EfbxI5j?r|W[1ӜdEe3߸<}_T$X~د$T>>|:_YK!w߷fݻڙ:ɾ1_KH5? |\Y5/Ƙοd%vq~yݍN(x:+ϳ[{V 1y"Ar`Yh&@IH"2:F* CN/xW/5W|!h"H|֎Dcx?bOn/0<-OYZY T*A>_$JV"kŇ1_!w u\>'h7פԢt9m'T#rȲ$T#zzYZİưE> ;J-QhQ[ʹ->rH_W|b;jħ᷉<#i& i+܉ywuL|w[uK?># CJ;;4QnR8BTf-PkW,\MFI5XǦ_{iz%Z6p閰-6JBo/ٿĿm3E]J@{wc'H_ v|%k\:}oMUB\ Kܣ) =~w?߅,`ָeN#O$]ôvHLg~W}x }GRfh̚esM 5\J18&L(&7_&Hkɡ\ծ⼉t .0'8h?)Gl`Oh74rNLJ6B޻oǚOٗ:fO?4%l~_[e $wgz(X[/d-Yᅎ<'eڿ-f{?>fk aRge#Uؤx5}/1~> I(پ=VL x/s)A_^?Gh(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((#stۈO2@||t#̽Sks++/dz%~=t*/Ww˿KGU+ÓG$};X GGH[TQEQE ڛU[zvA*MEv@ H.!w$иtapE`xῇ&iOV4%Nacr>A"[oj1Ʌ܌WV`3XS*R)EVOSJQ87uOC~ xrċZz6 qryn{oDaXgL~5 g ) ˽Pb]!N2 POv^3^hݢMᑇGVQБ\L^,̩b(78G{iz\ڽ $Td/Ps~΂#b Q;cxf%힍%Gr4ܪGϮ}+4qhǸB;]f(XG[i,K9K;3J΍e،+ƬR*ݷ-{8XfQۭ۹< s٦4y`V ;WO_EC$rBQj}|5`ᆨ⛹Va J._7H7K7O;|/ڣπ?9#}usi\ء9]ŏz5Z-Fe1}Hw;#g cMGoĥ~+gqYu,?n~?Qί"ӗMJzRԭl'-QWԍÎ"=.MCVmlm#]euc2Ms l`էŝu !|kʴÐݫxR>TQ>ŰyL>WRg(˪Q;;+UFn4;G7\\joţ餴>g*{n\A. a]Rsy o)⽇~<AQXȍ2K1O,VĚE֗yat9p%RBJ+*zC%Kߝ~o8Pѯ~etg6qsDe.pK<=lZnmxKNk[^,b`ܑۏZbi#4Y0aq>3:)u6C3!P9BKpv嵯ջo-V:܊:ZݗK$~MZԼY?g5>ho*#| A;>tO'QB3 󯉟o~*xoVխe*mRppѱ'|>Xh{ԨERrV kd_U֦iƝD$W9X;G+,Ӿv`#>(&3vqwcgŸX }ВVhH# !]UV-QR<fJ]9RV/2jU{pJO,G~#~ԴtuKKY5aŋyUGu_h+ YHHᐳrwdyU\F0}~VUy;QE|R7 PΟP4_a ɨ=IZvsMWJ*f{k\ZpxQᖗcx{+=&NR@Php 'wk/^ ĺs,D̒21r n8]y !lQҧ莪Xp$nޕ,;ǯOҭu\mǼzzu %7Jd_ƽ+{kS^dO$(H'izljs5ojw cE]@`34A>մ[}Jk9Hȅk&E]` ME̶~cdeN_Zogx隮uNIp$ G:tZo7;U PG̒G]/S⾂9~|gT-曦Cʌ`NWtcj%O|sky.$X-Bv,@ͱ'֩ê~? Zo7m>+|+WซY.#@?|׍x.MzCqe'D".E0?JG}m#BMygYu),Qc=8GǟoIkN]֧xxY_2@'$ *R?)m.!Q%jIR |"w >m`]z1%B߉\5e?x?ǧz汬ƪ\:LjYMCpOcc&R{>;d&npFFG m0?g_7߆?+IyOطL߉5=fH-n ƏG:V!*kf<k& e t#z> hG|?4: =62C&eF[BY:n\: /3𽟇|1;d&npFFG "~źgō5tO0mg,B@ m {w4$l|6'Ÿ'3zscO8=2|7<g\ZX8t9 T.ЎZiiZ}W7Q43΁6ee<A @NsXJ1\;އЫR;"d>x.I*YKz"6dVc{߈0y+M&csb4dIsvf| $_j#ImC/rۈgH@? SĚCeea#-dd%_ uMD2WvG#y5"xsίj5֐dE# br*0æNA|7ѵw&_;"I`1-hcú巊zkzv*x=BH {[X1(@FXm|)m{k]:WeYd0^rCZ_؟þ$ž(=nׯXxA#88 |m}_—%ɧJFBxҀ4}Z^lu;DW%e?" .% BZRh~ak pG{"k"t?t0ٵ41H1n<-4+{{P$kڼ'q!HP2pNHKam˷aX#_dl%.x+.ai]R}#YR~]>._5fVdb *;_ط@Q[_Zsn}#s"y  @?aO^x_uA{yViYƾ{K~|u`miRX$p}e2Gܑ\gU3Wu>&{Vt;|)ߞʱ C?el|MW/5oH+-YA|Uk{|/.,t(8}s,}ɮ ]fߴ/lGut}<\}X{taqNˑko.NjmVô?Oڏ^> +{@ΤUcWn>ưlW;HW9 &2=Fg?Z֭5/^Qg סxw={j}:?*HAA؁N? G ~*ݴv=mE<-j*V~qe?9 =.^ /. IdypF=Ͽgc>'E ,QG%ڢFUvk|SX0B`|`߇g.]_E%rǵcz멎nVN[X8j߸ڏ#U<jj>jk_t_i7WznaIis21 X~\hzMݠ񿊮oIW?,bDe@s'1Uؼ&>Ӗp\4^GeuWo;[XcEW:5A5?g7>oC$$KlOq$:3In.$0НnS،W|; /$^%V0k9xf# <>Rm>> wk)a $2M{̰g)> y|pUmygǏ΃[ < VG ~G4{N8?y 9hdA+˭*x =:Щ9Q%G(V jpӬ+ܪS0+,NK4_6S#ק?> 55AޥۺܐWqsVc"Cޝj8mcV,H27fjI;Д}}v/o6V^+TOD|:Ox/ ?Tcj^\n3sw'RZҬ s3ꬡkZh ޱVbXu bf-H5=sLuUо!xOA;i'dJ({[I=קu1 J\Mmu8sP_hz{214QŊ@{e~5_ ',-mU% #tbSn+jq(QcpyOf.`h>eەv.~Xz=5]Š(Š+^f&k W2;ocuPfE@&?M_.J(o<]02Dɣ - I!c즶> z[%icmJn貁ʸM}_?m5Ķϊ|[2̷حf;Emgʃ3`?n|uMc,YoƁ0`-9't)\'Mm|"Ҽ1N%6ّ넆=NbOa@pCVږqd$Lǫ?%;/9Gi}XvQ Th#_v麵n'm=%d_Ib^PZ˪xKš8Krq@_U|=cM]נh2a< yWl;}WG[h-Eqis*2yu9l;}#8;J`[/'_}ww> $lj MJ5PbalG5/?sBFP{4GI}eZ-|-_ SH7|'nO־5{?7:ZY@pƊY@5jMĶ_jtE&p# d^{~^2Ewy]\PD.Et u/gՁy 6{qQv77@tkR?V? /]m{C/MԬQǁI¼MظZNOkac{Y EUz'_<ľ3ѵMs^*C4Iސ=$M{_ $~ r! \;85ׇ>Gu_[Hkk]yV07{1 ׉ 3!\}X8Kھb}FW>>_X]C{esqw,6 #e`pGZڀ  &ac ԭ^Ok&[ml$e3=+ncM];ſ"kzz'[Y !l[@2z?&}/I"-KM?{鲿*ܔVե,Q]OGL+Kyg5CAj²:ֺ? |ů|AP5mh#T%qc16{ 2I^g㯂8w<=m6кvwiaB4X$|oG}Wܞ6"3ݮI6L(؝ϽxßO ><lpIJie6du< ?5]SP`3Ōh?1oJZkG m_"U54;?Y5ky.^\#~яz?c[gx3|?/9ๆy"5h[~|#AOj?ە6.*r(…\Fs0h;5iڶ4(${xt?<E^8Mٍ}oi>iae ĐC tDU =W|>5hoo&4ɴ 40|yC@4~meO/L5UltY%'!Xc|Z-v^#AIc7ޣ9.XrN $?n4ms:5 b[㵻Xb kv dO`ê~? ZN muoZ1H`d^G*H>vr|'^Ngq ŴrpEH ,0j}97x[P<3{_YޛV9$Q AT-~};i}xOƚr;9 #8$g_QZ_cVVm@ =Ez/o_jٛawiL5z8|]k,ƿ4e`AF# d^܂3q@:B|s[ַ7&&҉jd;-Ώ5]*䩚cMrh(# F?Z]/:{_YIB$=O_4_ j孆YB cS#'*ߎеGTR-NGa5uFVelcy=30Ey쓬kch߈:"sYby<=̤pA3@(G5V_'(Vw\4M} [.|O~MAڭ Hde#&/~ V/xGIJӑKI4d.0Om'V{2G:U % (hnYcr} U>~By9Y&+{mOǿ4F!t|+'1V*I7@<GyYiG|$9wGÞxKg/<^3@мłH|N=k_x|O*o:G<ߛo\sVǂ+i_h^it{4y.X4Qj\bg 0~>oTԍke|rSi}ݷ}{Nk/|D.]ŲCp J9ߒֻDƥ,sahwb X1VڸS%_#\. /p>_*F>tOgO*ݚm=3v1a3W{˞s@8P<5x7~6n?)< ۤ1ɀ:>?*hj?`j;Ɨ>"K0"T*o61M{_מ[<\ O#Cs1@|bOOxw_>뚮>cu8Y%mS* H d:VZ͝g O O&4r~7~>[DέjVW6) W6V| CC 㗁|)&MX2X"rb v ϋ<|"| s"y!:`#{k?_ĺ=>;BFՎ {#Gcڷ> IknKR Y( t_gⷮXC$JQ $94I%xsRnOtx`;7`:`2@l t. ~ʺ|m!Z\[]K#F-?7.zs^þ{@DVK19,XOs]K_<q=>:5߇)`L/9@9G`_ |/._ Cjmڅfa!zi:MZ,m{{ΜUwjg3AM_ I#)^$P* Ƞ.}d,gJ CO|j~SOe~omqzl~xQִ_aȗʦלpzץ|\Gߍ K1aux0  ]s@axR~=*_apM#U;yvkHifEӭn 4Xep=z |_0񥗋uuXOkIy|{v$c{n4(q!q}#uk۸LMB<1AX ~/[x⧌#t^HZď# 8{QEWTo|}&1w[yҼ??|qk*ռ?sw'A?j^"OuG`zp =뮢9 .gτt/\Ξ\i:l6";XƠpk(((((((((((+φ!0xhVݵg45sc\gk ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (#y?ʾ $A^)e ?˞~G?h}OE'nŢON$G=:~lSM\M$FbX~/E#EmW߲w7C{%t 21gb0n}NMQEQE|  >1"H"%`IӹߴK c;if#9U ݀$oiP[v.l nm'IN 6wGFP^pK|Γǎ3v-V?+ Gך꽆mYyeqݤ)pzGW1A`S}g wg3kĽ#OE>?gR|^>sLМAjHs14  ,Ci)KRiYfu>aXMOk dI>7s#g=X֩x\>5/k-Ӫ*XqWmϳc7sƭ46v*};E<=;^ަ/)Ix,k+_]vsĸUT 9H'D,ǀӟN?Mnq匟'hc>>)Ƿ= 9 4+$^g'$Ku>> MuoZcniM;$R0wHA ;Wjڥ7-M<ҷEE YCm{8~(u47PFy #ܙDxkίF?0BHI𵒿ZTSjT +]Wއ\^O$:h|V<1;?-|;J(l.RDE18@:Ltk %m{|#Ƽm6v4c ׯL⾄U+O}r݋n-\h%P &{Aҹ|5߆ ԭ'9U  =?bjGJ'R-7"R؜ {xRգsN+I=y\ՇG8wwvg|L.λ#"8mjȒ{OjHǏJ#C8qJ #ӥOXM/+xK#$ٶi~MzvH|54z W*بi4B`.L+TUU<1NN*}8Yh3~?t&xy P8qng2kܫ/ Ij_yXaIcM=񃎵'Ru(RZ4/c Ÿ75ѷ((/ ?.nCcKriڈ2'ڗ-#⯂t/34qUW*koxgTռ]XƱkّ!WHa@D3 * 潟Q{^D>'h}\IkYk4Ұ.ꋅ^O¼/A;ڏ k_Ea:FӁV}+п/o-?c||/jWWVj'# xOWy5߆|!vhgtm fEp}+Yb%.9ªI9K?ZF<ؿs nQYr_NkHx'>gWW};7G\n#88 y쥩%~'|qxSaKVyI:n?čkŭx j٭aMkƄ_a'ڣ<]:ZW|z,.\g(88 eo4~"Ư ABvR0sĂ&Z3%o'Y~yiQO$(")bM _/xC߇X~kY#Y[2cew|?4FCjֱ[cn#_~޿|2Ų\j%ڍ]i dQm5e@_Sm _K@\)h^tk#[-$)G=H W__5UNJQ3H~!ovȐ@'?l}c^-+3D..e22):QwcxjWڗ56~(e2d|6Xd;O#ۯ&еK؆#ʛuW澸b7 Oҡh]3BX4S7~ 'Vm[|\9 ]MeO !LNլ2]7k+(' <+#S׼_y[\{#1LvhDP0}:ɾ1_KHOh7z޿[iMo@9=rIW{);;?&k떱@ 2n?R-jş>3k 5 HI&+tPkm/Dtk]&]244Wh@}šŶJųUe 20ʰdq]~}w?߅,`ָeN#O$]ôvHLg~P\OO +[nAas{c,03uڅV0[ܽDj1RA5cDrjz5k{ksu$f)8 |'k/xWFd:ve v,jv;XqZ石$W 5_Ht}5\56ڪ'(I|Py/'Ə;KVfqutu8; Z j/|g5 BY[Ɨ[MJȅHӭX~i~{v}h59@yA8'hEP;W@ 4\GW5@hԯpc;.0ǎTi72ievI\_.i#Hڬ$!v 7 5p]'+7;"0~a^h¬nφ/Uء8{3"rG+YS|8KZAoѵKy-.і$q$$kC?x>äZ%=rvb͌g?Oxq,1kq%h@[I,P1Px^cx]4Ğ<[eѥ!>"OCʒ8>||P]7k鳵o:2yI@# v_fZKijNInJKU(G4 j|mGwg,m ͫD28= ~?g(OG~5 }^Xieh$fЈev9CO |!:&"yUܴQflpz@Uxm|5&G* ]DhXpAue4xr_5uM?6Jȹ~AAAW/gX?%5f{$DK!`~\睹('}Ǟ* ]%G[cWxX\gz7g%]~ y/ 09xBN:ඹxu}YMCBvҽ3$?h?iBIcy N-q˶G譱 c >ifqG^^\&w1`c _ | I\u{KPκJYJ>P@~VG=y9X꺲5״FʱHAq2:ֽV^z׍|/xJ/ x]S7k,W`G/?k>07cVeڈg8ƒ_[x3\G u!ahwLnOL0ROZ|'' 2wp@`P{P_P gʶ > ڠdk__a<%̛8eɮXjtdٔS9% П|YGi%$mqo'S"$z8< +aa^/5:+ӒkZ+ͮ?hχV"IX˵RȄc¾2 jj+mVQZЫ(:q]lˑ_Q^ [rDֺeDG #$]7^x7Z@7Mohgh++ڋOw]3\д^ẍu;tBhƋa_j/9۹Cc= $oO-zON2[\]l .APW5>.=r^Kl3ZIcu*|cC|EYT.fX=I'l^JiOMDQJ\wSw[z Zq^ۤ:m闖rH.eY"OFVRA8/ߴ7(Q+=*dH <p 9mZ;myk;yOpr+{SFT"_6K695=?v=yn 'NeJ8-p2$c*{/Cހ=XnmdG4LHe#9ȩkOGF]g7oo\ϋuJ㠯Jko>!-3:}Èⷁ%gf'`'z<~1LOKUe9>`z`  Nvk7?kӮ3ld#8`P{P|/| Ëjp:\kdoHhX f>'}=_ h?)?o@`|?ռku'<7qϳŦ~" -hoǯ YhZ6d\rg#*k=u2O'!6(܃!ۀҿmo:m.yj]@2B}ko>I.ouَe 瓻wF8q ֯?jo_GOG4-F-du]MoІGqhß )5kVzi f=GVc:WY~mE7m嵻dS=֊&`97jݽJpsڸ? w:?]av=˽8۔` ?Zj+ϼğj>5cObH0`0MUI|6Iťx6Z2Kus2 vPGB@z]yHN?u׈9 :`R|0>|dxUd 8$*3d*v5O_)hZo'.QRHrEnyA`Tzu-RE/ ,lm5̂8Qՙ57Oſ~º$k5Y$*Pk y|4p\,L8b<8>V zds^_%[_v?|'w|r26Ss~(>gگ|O _%EHc9^wzoL9u#]:(-&ee@ Će>hf'YbC#XAEyo_/4;]]Ceb@HH/yP?e}MZv=>{H&$%FOeQ>:|[bZaC+Hv.~8N@>gi_xw^ 5 2M>[x9=guD'Mo}:Mv]vѬj;G՘I'P_{?rZV/$$l!x w /Iaߎ#XZtm/L$z`85 @Q@q/xc7/ #B#r`^^[sm,JR4Qf'__|sw'y-M9_DVS=*;w?gj9]7ٿo;7n >1xO2ΕpȰI3I3+2XԜrxyS~OӗC:.7ZO\ P/zOvS^}" 'A2O?wDY:0Vz~Vk嶹n!lgl269qixƚ^#}wwrU{;OFI$ bOn/]58 $H? |U=F%vA#?غTw:ĬU}PkkW2!n]r_IKw/ۓ@[?ZG2ծmΓbާ@g>}[Z=ĒBԜaYcEse|x"K?U+ÓxQEQEqZ΍in5UX4 {h4K]o4Mv%W#r|Qh^0u n$8Ȇh "g?s_Xȟ>{ϊ~*L vHTPsu:̥Zzz #Ť5'qqtKk^VҤ,< N:`zl[ҥڋ]mFH8"]޼/,gˤUu6髽Xj*QxAG/f6G .X} ̤WOS᭟o {(<ͷ [+F;՟_=tHݧY".2i|/3¾4Imz0ϖލEjaihiSpTS~w^ ՗VӁ:~gUQAV8_59żVz 0 FTvk v*{b/_4>5 ,M{! 2T/\g=zoÄg;CkɽMT_3*qʛ$f^}.Bi'̷~G\?6+Ż/"c_Ix/}O9oK;Vqy}lI+9`v^;hxvO<-+h$͎̑gO޾otxvYn㸵0 Dva3,Uw`BMBJ- Fױ j>K<֚M3ګRhz=}_v-/~^4)V;SBw&0O}\9+&eWEWQE+M?Xuk~j?o(_h9zK[Q{^D~?>8'<kǢ^Mm*^P:Kn\f:" 2 4WʪxB@ܓrIHZ}׃#y. Q$Acێ>{Ws@!|s៏|oO iiGtJoMT.m#H#S6ߙϮ+oxB?iA[D^CIs&:aW@^?Δ .p*m$x> CG], yvN#'׉*v> E~dO j-ži5 dB5o"?᮰[W?122Ч?z@)aoL֧7>l+^.Mbj"աHH˳pR\W_/ ʅtbQ v@2aj_M)k?_l7?m^+ɶ3~E-nj_*tsXI4*b6ğ)[Lw7?frIYC*+xWylQcyG7}+@|Q_]?t>>-:u?j7A pu >)|z>"nK>_+|+WซY.#@?|׍x.MzCqe'D".E0?Jf;joL׬~ #~ {?LWP@ڗ 1M޿iq \(RNz>kÿ eX8kьQ*J?m0?g_7߆?+IxM_={&}/I" fUύ |[w$Y)!޲) !3cs֚6)U sh-,^gr.{^/Q7 )gOMFW/3[WPss,vI`Kx楞x }GRfh̚esM 5\J18&L+Ul|@ NY1muf8sֿ@?m0 &ac =u}cbWUO:|'+䕼$Kps _hοo W* ğ |;Wϖ9">H<V>^k=ƧFdއ 3HyG'fo5x|S x[2n U*A+k;Þ*%լbv9QWܤv*E|;zɼ}<]tTD!WmǷ>}CDɾЧ%ΧauX%Di#r`PAzx{FҬ",lm㵷$*O' |\g˜$>(C+ nn#$f/|:kUl$!/9_Q]<|3|7Y>m,z$Bh/\aGxj")<9mIW-Q/YmzWp7r u?cY;=Wזe?@ \  [Y5q"6Um1R0M}SGh1s?OG_3u{ޝso,3Q#2E8?$l|ckٯ+[iP`䬶!`އ)|.j:[5'><I-]%Մ*.F`AW`A |E|9mmuB!%kCُ_ _<9k)-t=*7XR@pxSUF;Fv&d\8B#]?'b8ixm|~>rF^  ɝ mќ*^CyCWմVP+BmLHG1`Wᶕ'l5kLҭGޒFݗsݏW+S|hpk>#Ғkn\Cݝ7nxP? úOŶZZ=NO[rOe8Kn^L]T- iUQ0 %Ÿ)oZ="O*Mꁏ*+7x3ᶏxK[靓?*2J|?_i56K}Bc @%KtU| ׉*-,Ir<~b.,Tc|_dl%.x+.ai]R}#Y@"?d}ZDZCĞcI<_?>5~"ץ"X$¼А?>\SiD^G.8UVx=|o-߇_tXgcԖ><"+Ym̑"l"{Wc>lqn;P|+co!|gYKA].j+Hz}@|/LԿiO GFW')K]]}>RpֿHg_YH60[QI0\+a@}eύh74ע7F9g1 b{I>wG[uՕe ByvgR@*+7k cXeilu+L{QuwPxrC:UvhQ1NY9$W7VriM<-4,rDeHpGc^?9 =.^ /. IdypF=Ͽgc>'E ,QG%ڢFUmMS RջjԷsu0i%}3u/Ø9Ժ6ndGz E+1 \U'F Yh2}~'5fUng^/o菐cZ?&4uSks^%6ONx+A<, ʡRhJ ⟰+?uj'k+Q|d1:z;"/$?R/ڛJ_(ÿ"CE-d~V?ڟ~Y|NMF7)Fr+ٍjp?_Q(ޫnO_[ R^ޥ:z=YYL`״R]C"^hPsþ(ΈZcLzħ ǾT`u⏉/kn@k˰7 :Mʠ9R9d1[K-|e;8ڌ}Qzz.|V 4.~{}3G濅&_79"ƪUFҹ/mG  cݥzwGixOVp9Y Qf|MkُŤ #)$10>Ѓ޾cnÝ]ghAq$1DH3:_*Ӭ|r4?{؟i&m>%bC.UhV௃"A\UAm("n^-h?+5F/<֞*m(%0+*X>>ߟPO|-Չ𦃲}9y~׎\w܂8 qi?ZG#KS Fzglڟ;Q<)=O_#A;ɬ|L}h*߇u]2DKc$c1;c:WğNoj>Oܗzvw<+!ϔb0M@dZ$Hy$ *$_=leUmyqs30v7cR}7/[g4' Uʳ0@$)cs/#'Ű_ګ˟&ƾ(ӼmM-[;.g2y*q߰Jkz.|u//Fzk?wXâ^L<}H7~<7 ?pXa8hdNNwfQ~fu#zlޭ)h4I$QԬh\WÿNZW- }@Y\ e%7~WuT5ώ|>,O45`iA2Dɟz#[CÝP?vۅlFr?O<,YjdvdY_<U|=cM]ٕ[M4%{~o3;ծ. L /|ĒI'| -$mB@NXoBD= 7_!+/O?*⋥?^T_O;C7BGI9걨L ?ɴox:Bga0Y;B8>P_t|V2_ fUѯ,cKZ$c3ľwH6/RIG' 6Gb=h#Q׈Vicդ/#H2dJɓ =+H HB]tR:vpkc=/G8Kھ@ɷkg*7}6&zM_ETi_|Gc6ycu1Cw!6e5{u}cbW~E|&b_Z}GnJZҖRQ~/@66(n$=xb2IQOO-HjJȷ# Ox|{nk\_umQlANgހ>uo,|ToO iHѬf𽫕%iX1⸟4~~$Юy|QOfbӣ`2WlxMr;la_]6 ةKMbcD Qpk_*f|'&}%˘dvޚ15ohOɠ魫}z= 3>??ol7&'bP`;o5[K~=<\W x"{&Sƾ4mMmbH!:"*U(|pxP& 5?Cu?le4>X#zQ.4~meO/L5UltY%'!Xc|Z-v^#AIc7ޣ9.XrN $57;H4%iLn!H^M>yG־ⷾӼCe:][ R%Yʒk'] -|aWYCqm4D#Hp$ =>_&`_ΏqMʺ/B}<GmkُWU[][X[Gʳ9,D迲_û<=AGfnnqYݦdou2m! E]oZ߰J%(W/ްz~פQ-s߷w۩П ë('{;y a xV;Q'Lg#퓭iӴO#lK{R7c8xb9eE пZkZ5T,`582x+_-vFXlu){jR$a9a@\Ӻ#_xKLB/ۓd+t;G\uT&-Ož'|?&mVpLc$22ǁ@ȦIIbu70<qO4jāW2C5[f OF$oEe+ c拧iZkvp[¡R( U@W5؟σdO5.y%ߐg?4qcɯ$ c}SCMH`]8,9J p ?Ag_7߆?+Iqpƾo&.6;q?/м;/|@> ~{oB "1F8|_^ MU>|\xc~mq1@|{¿y[ ;EE~r nz+Yx+')wj-/I"P1=|/x᤾|#XT޻Kɵ@\s` e[p/ɮ /f}?Y>5h IFx9T٦Yc>oZCByWm!x)#1 )Re۷Ιؼ1]UTx_UM~),%CpiN '_5kSď,mYBz"]"￲O3%| ~g㧂5xr?)'\l]B6㸉h3</gA|Q`9I%Z[7pbɟ"?AӋ_-7U/^f B=PGj N/@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEGq|Zk;Rz?ʾ Վu[?F>_:?zGڬOohr>+n ( (<+_'g_1z{}3L$Eؒ)\I*?b ,_§>Lj' q}!E{:t(vZts̖Y5s/^[Z5V $1̒y$'ZQ^)n힔bb=GByzc$hqRwnF1޽ +j)”x]iBⵖv GYKEyc-WXJ=J+P]4RM=|0c'.qysk%\tgʪFUTc ;z_Ej+ujɧN4dkZ_ wfL?vnuШCR{jRKszQ\槅E5; L+BXX!>թb=R=X=ƳEhHO ܒGlWQ^̳t>*ϓkyv笿 S\dЭ/r:auا4ni[4kܻ65-̓1X6IV|ľIu=cR#S!v@q#^hvҭ.+ uGzsWfX}Qwܴ % -*Z;>vKyrȯԿb?My# -nz㏮k)75]c7?(b0IA#$ =z_OY,^u2hqf'%KIkZum2MFV|IM˸g#p##zW?b3ƚw~'DNB! ضd=*χ ƏG:V!*kf<k& e t#z֧kZu֟mM x卆YOH ՚(}79L=hגh71Ok!*3FO3OE~7>|?ѼwsiQ40K|0.U@+ e DDI孠/c۔'n+h(bi~.OxƳ+M|t{xgfrJ~1vx[k~(~-/9ZY>9@o7_3=[X+~*x?Ok;QmaH0x=Uh>:EVq`c>CEW |3sol6z⺺q>S.>F=WZ0 7A{> +^Ui{%q;0lOC5J)+}JUjҴ[IkZԼ[1{3 ]FD[d>4PA^o i/[#pAbi틿ޙWW(svJ|BzTQ췧xxXcRŎ P{;<> uLj}Vuy}@7mD{i%xف8Gx"x^_Ykd0J~:ݢ6jY^]_̨aS{jyÿE_Ej Kgb00 c ߳[Z<@vmm-~`Py }O$ש[isﭕ#?~˗{Zֱ"kT<0lS \ogx !imBJ@pÃ3zE}EqL+_xLUK O99 |k{gxZΝw,ZkOk(70gH`r0zp14Pc/ |~-̳-+{[i+)r2=<[hkxXK+[qk&袌0', eIWK-+T^ghHct|. dq"/ڼO ZDڎoq $lj MJ5PbalG5/?sBFP{4GI}e5g|zl-W{7{f1Ƀמ_׌|]~#W~% !fc ~y(kto/ xV.ݠR3y`yb-Hy?<lpIJie6du< ?5]SP`3ŌhtTP;n|cό^=绂Aբm=#x\Nx CXxn%y݈H\bd(s)zTP!/~ V/xGIJӑKI4d.0Om'V{2G:U % (hnYcr}\_|1BoTԍke|rSi}ݷ}{寡0>hAjZΏ{6v- oݫo2Yn-Yhr>O(sF0{|9𽇇|9Ch)kp9$1$ĒI$ܢ>xKm:Y\ؤ1\Z',$e$:c_4#1x[wzwM.Xz+tq9힜ף@ê~? Z7SkZүa'10ʌ⾷ Yasi)e&uՊ(ɿgٯ?^i~կ+iՕv8Pkh9 ֏owee0F&P|#/>z~!@5 {mB3 ۰ڐ}=ERt4&kR[x6N@تS@g]˦hh\(XP>V>l~xQִ_aȗʦלpzץ|\Gߍ K1aux0  ]s]GTsZϤ`h#%4{Ք2R8Ŀ/#~BH+7HF{cX{.IIW:ğdlk#H"=Ȁd'`GM?4L-[Ѱ$27 VSnhΜRoS<>6"Nd5fo_<[|3q _drϼ*:1@o몎GVb%ZniYƦeT% I{+Q^YFmk?-#U>oc_¶2Psk_KS(_ӓSa*+?A s?i',JU=f/(gQQo.HW-+=|R3qM{W;> }떺5"5,?8YA~+W>/ xCG.d:fk屙6?r;Ex▅x[Oq&5{(-By.:ԂuWq_xIg5b4M"Xc#!B5m:׉`}xC[ Cg6[&NheOJJ('Nx'᷊#j^"d`xnK\g,0pqh(&cN◉n<3g>.$~f +tx]->L.wOpbey~&toCjPWkRƮcEdz?4o_ԭ&7yw Ht9$+o=ڝH_X j<|7oSXUcꬤFV++tx]->L.wOpbeyڊ🉬i]:iڵ7UTakPExwl?.}[Z%tx pF k%.[x9=g~? xP_ ij0/< U?0j.{uaKMփڽ u&7#8ȠQUֹg74WV]UzݙV)8>SGZעxjߏ^: E 4feJLP5=QEQEQEQEQEQEQU5}ZBү5+酽/<ҐHDPK qNM$bm%v[?_ZLq$A/*Mѱ{r_|uxCuO r[ZC"S˱UK{tOMzۡ&~:X w8w5jp٫N*ǚ (4 ( ( ( +ڋOw]3\д^ẍu;tBhƋa_j/9۹Cc=EPEPEyŔ^(ZŞg ^\$8\?6πJZO|춼V587ְMż$h2:GsREPEki~-Muq5s1!`6Ĝ~|?ռku'<7qϳŦ~" -h|U3kL׼1u{zrehOBmQC3Mtº.`1lwn83ZQEQEQEQEyHN?u׈9 :`P_:~ߵf⇌*? j~W[/A&8F +(WA:5m"܃t ?(Y`g ƞѼCYCle]KnVW!|Rд߉O]%c.E R75Z_jpXۡkqƣ31h ~<3e!vڼZst2x[1zWRG~##k8?*/ [x9=g~ K¯˭[ܾFv * o H/z F%\GUvCʚhzƱc.R X̳\#$%znkDG6+qtG;|f׃}j[d^쑰 3dWc@Q@Wo>>_xi*@4/,1,p OA@OYx?4wӵk8oE)P:;8Z(+OZCi\-R-4f5c':זIsJE񝦉X× h(c |Xzu]sLffc`2QЀ `7 |37<[[TlΛ$ ;ʠ{(kuYxe+ ̶OG?~ ƃvu[}gGٲAX <@QEWkߵtjiZkmO hs pN#u<+ㅍվsb]sAwh1$N222AAas}}s m48FY $ׂMoHnﴭ+"\xHim@z><5[!oi3x2 QԀ#*GK@BaMPӵB ҧh3%bx|&+]CZ/rN__!QgmiK=R lUU,OE>3uukSP6Uht ogD8 +Ix©6ZX%ov`Fø1 ( xhN2RE;ր=֊[_hcUմ 1Mc1pUVsc(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((75=Tk&?ӯa8qH65 .&YVKh -Kc^ -J U}}M:Q5}F׈odn!k,F y+zv+os I$*Iȯ4W; z}Q@Q@{wéys5gbrQz\~#Y=A+=3X_~^/m!h[2@}x@pdJ R\]%%^UL}zvJ.}nK5*ZIqoB; `|30M2nn#A"(_ČOjC;VgqTXzbVJw^>}۝0NF;zv?>O,,WdR"bdxge}m'<1ƏT!Y"8Vj16f>Ծ n"iqxĚz5ƨ=?L5er;@5Ib5BT E(#z商AX{p0t3Ue5J\JsƯRL$))Ntki%̆4T,z fU <¤(?6 JA-k,R/FV\G?Ps:RX+9œ(%׷iI]Wqo -4V-o5MAR(,dpCo`\ 'sP1D=̗E ,m/wf:/v>`#=ec\lu<)kO!qE!CI@+vA#f T2uO/iMJ.^Su1X5%ѮxGuo\L!?1DINo%u+>Rl ~x?yYjZqgarIP@cdk߳iZI-˅1{ԏ|Pk8q馯uwjuՠi[{GmMFA>I2QGpy|ldg%֣Լ=\irI,!Ư'6]]B愒_t)9IZIٯ4yg+xF ĻWX`8t_>$? |/>ɜ|@LpOa^ K֯{GƱDmʟ=#N#'S!9<ھޓMY~e//SRgў Ҽ^g͞5 Z\EmH8jJ*|5S]eKeszrVirŽ]o˚;SWihs$kÿ AkyZOy}c5r#(9{c~ž4O y[+nE@DZ9i!x'OxWV]ZNr UFNXJW~7Yk$7P1RQ1ةE:42y/i%'ex4R>2GI>U>/i25 앶 OedԊ'[!ئ=Ǚoo$0@]Gv#=kiZl6%|T^@˅z(tk`^-ѫFJ%$cW ؚU1%tD ~=kO|vԤ%jH|7f^3+ZGŁ?tjZ]tK}ڭAxaC9TO+d齓weUԥ̢՟tZ(H(mþg]RVwbŮkfGW]!08'oMGzMO+M?Xuk~j?o(3oY?f#tk8aGa /O;? O[J@fT1N9َ눺+hLCM2$ܒh<'^>|;w4~T:l6v"F@8>\Ego,ȱCyU@$_#|s៏|oO iiGtJoMT.m#H#S6ߙϮ($::jw73:ivjۯ=I>_Mg|Pw-_S[5~L)xО¸#Qھo?73}wp-:>䌟s^' ">%}ր,L"AZ^h5NcBFxDЃ_F|Ŀ _/o5*)%E9LIc>QJk_C3Z[H߲_'n}|~g ed6֙~/[ږ[ѽ|]NHJ+j~"?||Zu~(nN 6#;`h}~ĺ'k'÷Nf$n$%4& >|HZO}/24h2J1ߴ x,F;KBrDH9=s\w?o2޿ڷb8)/t|T>&еK؆#ʛuW澸b7 Oҡh]3BX5/31kV~fcHigldؖ}6b>R|ς95={ݵψ5׹3`F>TEW߳$ &ac u}cbPR-jş>3k 5 HI&+tPkm/Dtk]&]244Wh@7⭷|oH "HqLd]I AτmkGO־ IJK>Aib;we!s݀ǿZ<{Ō Z)p䋸vbiJϳ׵oO?^LiA P<gW-庰짒&HcUf 8 8 9(' <+#S׼_y[\{#1LvhDP0~To6mL$W 5_Ht}5\56ڪ'(I|W~οo W* OOe|۸nqh/٧G=gifSTYSvUt Iuy\] J/g F32 x^c| {Oލ+|gkhgv͚O>*j+JXe%" TWqӟ>:xƞ#Ў#Gj4cqڊ(2ddIiZh-K!# to}Ic*H<('Ͱll 徵ßg#׉% RXUeܬ*#b1|i{/蚔y't'F ȯ`}A7|toYSsi?fV\ݱq zK5Ҿ NҴk+,3 poo+ 8R[xw"GHC@վ[?b;;)gp0 GLѫs e}?:<~Wtq^jß= 8>x7Z5[BciV71y?8k?Ÿ|-P$A_=;W>6"xo\^gZ 3HVAi6Zn."cC)iwó/8滪)xK/ό5=9"XpvYp> E!O>;{?5U=9>+/Z;Iw[^M*XgzoM\UigOྷcdv`BOWéxXEO).'G)*?H|6ŤxcŖ֣.!襎NkD~?~,*-Ή-:#<;=XǴy&|k~4EJDIuey!]H|1؞>n,{{2nbd>&_^g~ҟMݤF+΍_aV2288w/QVvѭuO7^*N󶾞xo{R=;N,y#m;y=A'kW~՟ _ᎡCc;cº1Fzg\}#Mz#{Ycs'*MV'x(㰭r+6WMy "<5k^Miucn?hχV"IX˵RȄc¾2xrC:UvhQ1NY9$W7VriM<-4,rDeHpGc]zz)٧+ZJUgveӧQh;_u?h3AM\/w ,!r㑴zץY^~]jƛk"5j챱?~ưFȶ s&r;Z)X!NH(ap0wowvŅZrVN>޿y?<#ך,dl%I8،KcYmk~%7~iMX$` zs־h \M^LwYx(>Y;IrFk'ȳ'[*HU(t_ v;S0XS 78m뮺d,.#EE[n~mM[gkwϚT}rXWW>DUw?)jM%s|E^ճrrVǹZ#>T֋o7"Ӽ+ɨKgeu$.}p dow`.NŨfYZrGS~kϼQ>,xoVpkWо%S;v+4]úMgaj8`aUGԓJjxZ1Ijz7僚:ҭQ6?-zg/߇h?'鍽ko_<7+[KcTOO2&G/uoş f {E+%ߔ9%! W<;?i腬>ͬD?o -GJp{FZp(SSokϪZoӿ[nq}nj΄ӗGfӯo3ִwJJuR 0No/,Fm<Ϸ'$dEUUBQr^?ڏj=}RrǍJJa/jK }^}JK{Y++i|WB44vܤ#'I/c}e_(m?^gqjWf[NA2mݞsp澬D56Wee9 (i]h<ܾҫZ͵Zu(Pem&t#:3*;A qַ(=^ExJB\GyI? ,FB>9#h0/5]u6&HdDʈFRlw |?߉ϋ4 o>2ѾIX Iki&C"7V(t(XvjBtPxIz}Q䉭t[97 GpH"o? oƀn228WQ2W?Í/?--"Q-T <\nn*P;c_z'@|2ሗNdl[ Exx(3@GsH߄?o=lf[}/-d2ϽiO)hKO\״ ֒nvl`<~5jz.˻ٖ8=OR{_|5_٫ 1ySoDY-р?ؙYT w5uxnMDž4Sfrlxܟ$Eu>y7 Nciڎyoi($U)Tee$*Q6=`qOs@_ nUN2=CѿcYMzd0w2g*$++ҴuK}7LΟ}p8IYى Zσ~ 7 ?eNӆO$'vkڛ:K{VmQޭ)h4I$QԬh\WÿNZW- }@Y\ e%7~WuT4.k|{m.?Pu/R ^GVy6Iw_Ct?iiiZ^axfG`AY8?Ş[M4%zeMÿ(eţ٬6]zɠv\63p9s >^3{V_134(XI$3Cwmom;Ua ڲ2@qmIZд;M1:dҼ'}wo&j.!o-K$J'.YxW]Q?D0 FfS&w\Ơ_n/4WOAjIX&m-mڠ>j4AwoR61#O:ΏXj:s=F$ ;p־_`UFíV#Ke嬍"K(x#WxB*OIѤͥtR[+ vA p(_~'<-{M{X771؇$:D| +U~$_ ji^(M mR\bА3\|G ֺ}3O!b?hP>i==+'/iv8h6>;uVϭra3v+p|?>a@|>-5yj7Od$1pIUW kv> /^HSq.@Q _5M_={&}/I"C<~د$UG >p9]F;Cm`7S;Gr`vS@y5o⼟{'oZt=I "~ɩxVִf-2ݕ@DŃ6ef<4_?#B.llPI{zdt* +"ď&$?@b?|_4[V| kTk6P-MwB <{ᎋï ʳ[h C+ʰ G O Ƒk{[ ڹ_2VI+3ێ+GwM ǚ͇fmF-:; v%vDŽݷ,36^|ckܼ]|0х}Ne#i*+ohOɠ魫}z= 3>??ol7&'bP`;o4Gi់9>{xl`B-(@}vC6Zzge˨Eyi3(- *T$3)c_AuiSN47ZC66YNe7 MCX5iH St=%GP;W|no޲͊Mi~ !عc$9Ckeow34i:K3 4ҘݞB;u| Ǥ}H3?z7"HzDž-m.eEyR'PÐ>uoj{W?>.|go/,:o'helv~5m?M>?Z!t0t_^ys@SD/Ԥ"I22ra$=q_tQE 徛g=Z4#EfbxI5j?r|W[1ӜdEe3߸<}_T$X~د$T>>|:_YK!w߷fݻڙ:ɾ1_KH5? |\Y5/Ƙοd%vq~yݍN( 7f~!B*~a 9wB;|QȬѯed/nH>\(:OS{PI_n ڒ$?AxǪdkG $CKÚ_“MjdOLވc>|;^5$7H{H̅\vwvz@pC k^5axv:[ɧ+Ac$}}izqEqaq A5 o.R=$bVq^Tѭ\lXF3#ݒ4]ߊ>~›o4PZW3.ь|qjaֶ?.}G^.<3mJ%rJWpѰ1,6ό4 xzV6s%1U,ʥcPpk(^|)|Mi|#&Cmz#`|v}zMJ-GOXuH/7, *XrH%J8,4yЂ{pO\P>/oGu[k]i&;+N~Wÿ?6^);Mf8[e:o}k7ya"gXU4?v\q?i>4)U|axa)ϳI*g_]x#o|kJ tH!TUTO'$_HK7k'?jw~jࠞ;gaoN"cn.РL6W c"?~_Lo-nM~'=C7s%k]yC6]apOp1R:?gK n-^ @&h!hlGwߏ5O/u-fy.k.e$ Ğ`PIOzO3'?lMO~# uYPTy.v럁 > )Re۷Ιؼ1@[!*xsH) ŶKeU^?ٟ xgEկjl䗎Ykx/OڣooIg7*$Jp W:i|#_$&igKhlIq5|P3^1ɦZ yӟ(N='~ZUX|o,( MΤGbHj{7_c "|$&Qť}w*z_R+48~EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEGoji -˸P8VB;> xV:N<{O' _B׿#@.6_XcC7NtՔN=[#֝JRji/Ѥ"0KsgtE `>,:=n4 j5 +Ծ>I}&a-$F`! OkеO>s궑X\`eXB A˅᲼ƞ# VNsj*pY(Us?4xI.b8-Ն$ #z|jxMտ|3az:FBwE5]7fD +V2WUڻ9m+O#c# ԰eT+KXmu"Le{hJdȯ?b? ϧk:ː=MxXhq\UpwMF_-FT 3K@vmBmV[K{ #4SqQFrIu"اAӾ꺕4pٷjXMIطMwkA~a 7{퍍gZ8B(^+%Iͧ)5e- ElJ*I~owZݝm̳D2]w5s\v:KWUwf@?OS95?f |Oƻs{i#ۺmBU.w ~$ԧ< Qw*Ǝ(!:E]r^{z\uєIt8Km.i$Lb/&}Sfu+߆nbo*`*~(< Ί^bVJv<]ULᱢjy>'U},1F;1%ߕ~VfI6Ϙ"=xY ؾ=kԌ;$ >2ǁxJZ,QF4* b?W?kqҊ"h߻8jx2o٧'ro-d0uer1X>_[$6czgYBʿFeEhx{V𽆃negj0.ȫn z^!~>u-SJoI_R9VPi][]ZQQt^s=GWMχ/ou BK}H >U OA޼+nF"2YǣogruľIu=cR#S!v@q#^hvҭ.+ uGzs^lVMԕF*I;:8F&DTT/e{ݟ0Ԛm߁+xC=/ Oz4hz-7֒9d']zCVNFsjq_X\.`eXB:9^ ~>uSIPq'QN 0ҡ:z)%̜{5N# Zu(EJ3ի٦{NÞuK{ O04TldqC^!#խ5I5 bU#q(HE!y${W׍$Kʼu'(󎰢F{ &?޵a57KU{!NntUW%LO}c2m`K@AU12t|TgHw*$4Neڼx_@e(YFF A1{=~s{js۬0 Z? >X87|@OBULh(,y:0ZrqoZMg)8Y |[ȺOki躸rL4)k_r׍L;A}3U<xc).Ydr2@^.Mbj"աHH˳pR\W_/ ʅtbQ v\WdI|W s',W!+< (ApNF55դZȳ÷|dn] :_ e&sak?o?R 43~"k:sH9"Ѷ-߇1kiRiZowwS[HF" !R:ր9?ڻ.G| kεf7A#p=Wҵ_گˍBTңѭdUðCԖEz|K֡׿ kv:]չAKT[ r+|ܜ{?~M4/jr7w}q}L~>r!+u%½sXg`O%ċPň(J1å_Ylǀmwڡpu@ (χRVG#+x뫨lmf;{xP$ҰTE%<k>8|~9GI{kԴ`)N>猬_~#]-K+$yu4/cHbv֗$lыh@;1M˞\|~44}'NK1<$A@|FoD_[jV}[Gu5Dѭն6ArOطL߉5=fH-n=u}cbW͟Tמ$SDo]n|vG{OGL+Kyg5CAj²:ֽkSm5:O&{yDB{{|Wzoso/a{ѯ%iѬnb6=LBTf9<x[z-xZE[q ܐ(s cObl 1de Ե7Fn5{M*s-҅"%5ߴr:hZA[%ʖB9z1KsKMm>=3}'HP(]8Q>yK~ZM/6mum7L\fǯOA<}I5M,Xm-bH@8U_.ê~? Z?? a-7 t@ZsZ n`q_I|Ԭou{I4/gE Av M\KxKVVФ[)ma,j <cv_xGCwiHKn,rDBX@O=I$(^|CJ|tcxɞg;\^j1It.g+`*.pH+[oK1xgXxז3G**xe*1c(4mkHm.WѵwEsn6~b uzy:7MM"4w @٫/ ?\\i\l5$4.p:g|Z3SwT4m/.vr6>AW\0FpH(ο6ǫo*.-eY" hz_ Ϻ[vMz@ay#FބHʇ74xĭoK!mCy׽PLCAf٨x{T5%zKzW 1Zυ..WPk%b65)[_%׾R'%Ee-r1N2I ?e |6ߍ/5[^7R\ HV * / pVcmY(Q EG'-oK\dW*]j6682ʥF7=[?|]k̭5᝙˒*1 TvnO׾!Ŀig G EA88.~žMB&9u' ҳǑ?|yh>:>IXnd}#عTʫ~⯈_Vke-"WK>Zf_F=V _L\XQYqݎX] ')K]]}?_!-ωh_ڏyLQX:#_U2"]ڭi_쟵o|VWU˴ ٝI4ݬ|3a٥ԯv2sϐALeFzz~Zj^-"-S(cAB74zD-u~T8 ؂,~F>UE9h{ڊxZTv<sH{P]O^\@1;f{W~oH|NXKD: =-/c~`>3:|]q꺾5K;Y 62 kDi#>Sk^ڭ.墱pտqG]-jyF Yh2}~'5$onJ" 6dc(A]]]l}szI~XĈʀN5bxL<},Zi4PU2w+?uj'k~Ϛo}!IIof yYy|Ufz,Xe0­(#c$nF9s)f؊XSddx*UpEJqzȋ ]Xj|Iuff\Ha;]7MܧȯZwO_/HK^a4sIlFy |qQ}<}+}kU'S--%*#8Id#a#0S}y}nϏ S yq]C$,ݳS_@;Շďiq~r8x`5ox>okI&Q%Ce>ank^W,ɒD,T|4 899W[GT3啛{7uӡS rrKU-|Q%}o? \b-yvYViT<`WY7+vi|lwGQϪ7Ow8|knkZKu!J! 瀬ǦE3;pƭ$:Yٴ doD͜1{վKw(;_mVVv$t0D^~?mծ1TgZ:NYju)İ[J$jz'F1\vi|BNblvOuC'>*89BPz;;5oOb.Fqje7jbh-ˠkھzO Y_[}2)JpF+#:n" WZQ  Q1^]8]| +Z]*{yj+sY%仅Q^V7sM:dvhp 8">$Lț\QoxaeG4>Z7VBMl|?Ky[`\LA*Ty~[{{y$R(eu#H<Gj־*ZJ m2; BRH3~L=?)_95۩v9dCD1N{.k,cm;zsǞ*ugJftx,J ~~a Oyx E6 ߗ8_8< dH0늣-?MErOeV\42C&һ0#~:؆?ph1py01L"qq@?jOVHTmD?$Do?TO xSƗHN!wk 1S#__|߀ZgIyu'uv8i8€d W=xr-#Ś{\-m/mʹA88;ˋ`yXaKT I?2*6Ǽ`;\ݛp>ֽSuhoeӤh,-ΤpA^ᯆN~t|,;v8bs`?]`z=b^^0z7 5K/u'DD2y.6ܐ+)Gwme[@Uߗ%x'W5![aߊ5nIi൷DqAJ.n]cl`1X"Wu>GjOJx<;KhnFIx[@iJ]o6:g%]Bev,Xdx_yI?K[=#>"tdZ{YAχŞ ->3tH3WK[v^=sRp푰.GbukfO@zKm*ȿ+1>ⵗTCmc $p0R ck=3ɼ{ƛ$@cd#/6*yӮk=;֛emn"Ͱ鼋79LF@8Ze.;.\(9 4@xCյo^;RݘpIeU'JG_'1F/m o/`x >N']7"4>|_x Ϫ H*l (پ+xno|/l3qז1~_1|__O YE$gxzx#qk%km-W0p;UFO+矉y|gj瀼U4iu !\{+I9$8 HB]tR:vpk}.:35eXeaLo bA+uk.,g}B'q'B}_f||X.mG*5* M_=}mZum2MFV|IM˸g#p##zW?b3ƚw~'DNB! ضd=M_E^[.~OekQU)j;JYH>/ ƏG:V!*kf<k& e t#t~=cΉ^0&qj!G2K(!\8cldt*_q^/xzmt"…;Ii9 ˞I7 +"ď&g/H_Zss DjaGҶGÞ8ƞ"յ߈~-*m/]lTLQ ,rH&4p'9Z3SwT4m/.vr6>AW\0FpH(ο6ǫo*.-eY" hz_/#77Q8G,276k C9q>(%kzY ~hh wdF@8g>tɢ.ooMGzMv[~"jUS5X X:PGc? 3>!Y6_t]ŊkCI==Mz h:[ kUF*LƧFOtU> h<'gk:Z:q jꌬzg `'X״u= Ep'tyD{Hf< Pk )}/3 nO7hQ0iqP[<]>/M[1;(FM;o_ ^#yi#]'`+/)Ÿ xN'8dOtVKfPy=Nܳo| &)xXdeu9  SO{-o󯴝@ $P1ʚ|&|? )u+/49sMy'Wڟ~*hCf1VOc?U^o>Dx&/ R㼎IrEu.1=Ӛؗw h^ x?Qfyu# z׾//&*M>.TtTj5vk]jb($e _GZ|Pî~&3OElQjW oiX\>v ; sW;FU|>;adӺH^o{?.= X5ީ P7Vy?i6)6L^Sɻc =*=c!>5k9ikW:D>LHyGzt ڦƾ%k'{hDN"cuuf |-0>%՘j9;/- g8#xO>io Q1v_,|a+]eYJ;y2:_E7ŚCw46 $F +/<;x=<{TkØ|hGv_2?_?TsZϤ`h#%4{Ք2R8Ŀ/#tǻ^8?[֞GX'<ó Ϯxz 6:N֞G-\<+J3.o;zfEAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP\g =v>:֩>-O& б€O]xGῄ h7{~kmZMֺ:(((((( O/x'úGSIm8]dQ@DŽx3WSg:.gO.Y6WscPH85EQEQEQEQEQEQEQEQEQEQEQEE ͼQ4+nڳqV91.35@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Ǽ_ /?xפ~՟FjC7md'u'n#Zu#.PIyZFc#1,Nz?o"^"Gմ;^!EDڱ\7Rǥ}@Q@Q@-B|j%_xwƎ'hbf _bO`|o3;xbO>m8En$`dANTxмyimF/(ê־D!ѤQ# W*Q)С)+v9J53 ԨJ)6_s;|hnlcD;[ x'[Y7 KPLҐH=H>Oڧ>ݕ[GI>=B?Z_UHb?\|*i^ = K/mGj랪c[_ >?xC~&ZG;V.p6ߑ<X:mU8 @+ۊ(+PrEQd>>WqVlNv׸hTjMZ黧}+珌fxx+V <.1B}< =X#v|LJW2`uZ_!xPiW3@%!vyF uGN1i7nb$N9]vKӿikXۡLnk66dlm Ωk^ үgK*y5 %̾Sdd=~%|l=֧t8189۾Eb펥@J~>|BnOK[?X%wp#뻃W}#){IN/ފ;\P$d3쟇3^xw˦I$1fv1),I{s [V%k$|_> KV}nzEE<lퟙBm%}=zaU5n%o=ibvDH 5?xwrk$WQ,o}r@,Nbk~8KǶ/"ki UOȫH?>(ȿ^{eiZQw[꯺<ϭ{|ue+M6/xVJz":oXT(;V80o)ruc"m?Ldߍx8lXJB +?&zU5NRkb/xOLM/jJ4kd`䌕2>\x l_eYn4i:0xsO ((/ ?.nCcKriڈ2'ڗ-#⯂t/34qUW*koxgTռ]XƱkّ!WHa@D3 * 潟Q{^D-Wළ!fI1iX1T  ݱZcsl?Ez7a9q@ߎzW/v,|1g{y[]_3\ $hmܞx9dVVPH#Ҁ9_'{Z~ki۶;Hx"0 ps]e~s|_xrv[(5IDž61(=޿E.."yXKpd}R▅|Q6a&u/TVӚ~(~ OY:{oo_yh>Q3^c)jI}_utt,ogtգ^{}p+ο#Zk^ZkpSo=qF} 7$N}>K WA8&9xE[>81j ־?~+_kTS$Jrh9k}(7<_Z|V̳goe_O ĺQ隵wd[epzW l|e6k oZ{-EcDP:Wo?R!/Z|}o=Ě젷x o?OR~|Ҽ-~ |$!r:I#DŽ^%ڕ n 4l 83'=+gLjyGyT"3 yjwHv>6֙~/[ږ[ѽ|]NHJ(j~x? &/Hg$Urȃ  AoؗDuwvĖmĂ<Ɯ$ך3tG<o\)FI_ u}=;^%͜Oc{ lHRH$c c]#46-a-!(U<ù<%?X }vw4o`5Wh ЇVqg|T߂ ռai&;a1F2~ kv> /^HSq.@Q _c~οo W*|S ޷VFh缻$h:Orp@t|7mNza$IzPLAs۵xZgτ H4MBhn6I >=7K,4]ILm"U/8ex'(n_m3qlaYH 22WG_~xm<5fSp'_WS7~ 'Vm[|\9 ]vo-Յ/e<2Gs4LA`Tyq~A>x_XQnIc#E*"(? ƞѼCYCle]KnW'㿄>v:o',-LK`)u}cbVw/HYϣ:/loaR5Een<A;ڏ k_xIϪjQlG` =Mz3_% '_j>Ѵ?x [BNms ;tW C㧁> |i;mR4v*I#HF7B,pFMvַPEqo*Oo2 #6 d0##c^sOX4>={2OaY )h?<k 5Əu,C,<88kég[)y,o5bH%[NMtN4 I@KExo3YIc94cѐ%p@:О +~5 / ޲D|ꌫ'F*ʹ> /zin-o,"r _aPM}'⏅eA bIYVoKD ug㗏?Rw-m'LKD*6 鼧xG]' ]cž*wϢ[MP}d6pNFFG")Vt{۫Xnf1 'ExOq| nj7ZtҬnc~q+}\><[-5׳? I>:zU|v#WZ垇<Ӭu]YvVB#veX 8NOjޏAi6Zn."cC)V^z׍|/xJ/ x]S7k,W`G/?k>07cVeڈg8ƒ_[x3\G u!ahwLnOL0ROZ|'' 2wp@`P{P_P gʶ > ڠdk__a<%̛8eɮXjtdٔS9% П|YGi%$mqo'S"$z8< +aa^/5:+ӒkZ+ͮ?hχV"IX˵RȄc¾2 jj+mVQZЫ(:q]lˑ_Q^ [rDֺeDG #$]7^x7Z@7Mohgh++ڋOw]3\д^ẍu;tBhƋa_j/9۹Cc= $oO-zON2[\]l .APW5>.=r^Kl3ZIcu*|cC|EYT.fX=I'l^JiOMDQJ\wSw[z Zq^ۤ:m闖rH.eY"OFVRA8/ߴ7(Q+=*dH <p 9mZ;myk;yOpr+{SFT"_6K695=?v=yn 'NeJ8-p2$c*{/Cހ=XnmdG4LHe#9ȩkOGF]g7oo\ϋuJ㠯Jko>!-3:}Èⷁ%gf'`'z<~1LOKUe9>`z`  Nvk7?kӮ3ld#8`P{P|/| Ëjp:\kdoHhX f>'}=_ h?)?o@`|?ռku'<7qϳŦ~" -hoǯ YhZ6d\rg#*k=u2O'!6(܃!ۀҿmo:m.yj]@2B}ko>I.ouَe 瓻wF8q ֯?jo_GOG4-F-du]MoІGqhß )5kVzi f=GVc:WY~mE7m嵻dS=֊&`97jݽJpsڸ? w:?]av=˽8۔` ?Zj+ϼğj>5cObH0`0MUI|6Iťx6Z2Kus2 vPGB@z]yHN?u׈9 :`R|0>|dxUd 8$*3d*v5O_)hZo'.QRHrEnyA`Tzu-RE/ ,lm5̂8Qՙ57Oſ~º$k5Y$*Pk y|4p\,L8b<8>V zds]Υ[:}܂KXi {xl`B-(@}vC6Zzge˨Eyi3(- *T$3)c@@C4w:*+~+~о 9yZlw<+@$$2EyĚ+2jӴZA4'!*2{.J@v'ŽeM ZCsvI8-rW?kO6Zomtii {=| %g{$~^{{KYQ^T0[?ī<u /.N[fn5]@":hzU:?|kYnP-ޫmE=}:o~m㶰#cP>g>,ORI=kՊ|$/#`gȮƿ>izHqf?2ӣm!zd\#;Z(o~*.ImRcIfer3n+|fo M/Vp?h[8cI>pWR#=pMz3_%  ڭ亖}w-^Y$bIۦxӺ(1e ' 5@i]vƪ*'ԓOrI >$xkⷆ-C=^Zf%DdaFU<9‰xᝇ?> /cxAx/tfWz~<>"~̾Ե`YdҬ2#zA'A=u|$׼icTu-n,P;0UGޣa@}_[!*xsH) ŶKeU^?ٟ xgEկjl䗎Yh+¼uj|,{jz!;wӦ̮jQN>}~ŨF")@|lt#Smks++/Ǵs=s I$*Iȯ$w0kOw_ ҼQ) G$}=@Q@Q@G=R/ٖ 5|"Px"n~XI/P)Yc'˒^7mdwwEqݭT?#_'~"៏Sʚ}ĉO3lF&pP_\qW-}_JR{7fעՌ{_Uu{π~'A:~[[<֗6oU$+mr`8G5~2<hwRG %b1 U>X{fB>}+JCĶҔy/mR0RTOݺ_r G!i8 ym@?Z<]?\-_m0\ f@4JSn=ش,z|'_Oi~45 ]Nݴv7M TENOGpzq|>WRޗn{|=*kЭ?mϖ>3~מHtc% )m~鶑TIUF پ4~)F}N܉H<> fX<+?>smI&u*,+#>즺J|.*UpM#C|!(D}2 9Hs^5ri0 {@Kmʺn柩E|{az5W1GJ[+]zQiPGjWfw0 H,n$v;)٧u)7鮿;'^6']=V?# 6FAС}VO4߽&+rc#?>/_Bx/xvQѭAu_쩯G7|J7wD6cxD`st;IUvN ĭ&w,.(ȿ^kIqs_^ZkgooGR.w>_>(ȿYa)ԎA}uъ't/:L7zI=+menb1Q}{+mi nOWH3\:~R V`~X̎u#Po{tiiDݻ8;ʎ.P*uU۲d8ԭV $`d]ωoğux}35ՔFՃӴ<~2GH 鑩ync~6~*u .g7(gO?~Gt_:S뗫'P[Eho?73}wp-:>䌟s^' ">%}־>|5h'r3 ſLm\+BQJk_C3Z[H߲_'n}|~=x-7NOV(m#I#.Kq_A| > 3*M!F0'+P1{5xMͫe6߆/襯$ɰZz&?$? ~Εa$Ыyd_ƹo3 x_O uN'ƺ>ke '_"F:gٍHtG}wPE~!Q2$lGw;;6@P߆_ .~ ̪-9 HnN=OE??|&5]9Uλo?zi9f?~/mht/  T;G'qL{zjn_^-gL)ʧ## ^6 |]6 ŔIH#I(o p5M\I3^$4362}Kp>x1^Bj^747z6qs##DI:TᯄW?/`G- F1D[+ƀ>dɷkg|~د$UTo6mL$<3KV>7$_ioܑdzȦ2x. ͎@g_ΣZk_$T%Οay;c߭{׈> hG|?4: =6(C+ nn#$ff'Y"u *=x&F%r_N4 I]o&F%r_N4 I@w▏k:ufvk۹ۈwflnIfƃ*Gq[4a?EEVNk<I-]%Մ*.F`AW`A ~lϿ ~(_!ٯU־K~i>~kRޛZ٥z[Vf!g |3Ѿ?Ѽ "k+vwv wf8s_ٯ.oj]ZMZK+ou(vpe(5Xѯ=.1-ݫE=b_2x%|Cgjo.f@ѐHPم|Ŀ쭡%OghX[U`]gߵ7?2åmc CP%ԫ+q]w+ V^ʉ.V1YZtl/ D5?~ (tM9t6Ai=B|mD&޹}Z gǏn3+g_v: 6Cڥͬđ)+]ҸO):>|.quj]}y(褴~;ٗi_h]Pt7JkhbQBU|?_i56K}Bc @%KtU| ׉*-,Ir<~b.,Tc|_dl%.x+.ai]R}#Y@"?d}ZDZCĞcI<_?>5~"ץ"X$¼А?>\SiD^G.8UVx=|o-߇_tXgcԖ><"+Ym̑"l"{Wc>lqn;P|+co!|gYKA].j+Hz}@|/LԿiO GFW')K]]}>RpֿHg_YH60[QI0\+a@}eύh74ע7F9g1 b{I>wG[uՕe ByvgR@*+7k cXeilu+L{QuwPxrC:UvhQ1NY9$W7VriM<-4,rDeHpGc^?9 =.^ /. IdypF=Ͽgc>'E ,QG%ڢFUmMS RջjԷsu0i%}3u/Ø9Ժ6ndGz E+1 \U'F Yh2}~'5fUng^/o菐cZ?&4uSks^%6ONx+A<, ʡRhJ ⟰+?uj'k+Q|d1:z;"/$?R/ڛJ_(ÿ"CE-d~V?ڟ~Y|NMF7)Fr+ٍjp?_Q(ޫnO_[ R^ޥ:z=YYL`״R]C"^hPsþ(ΈZcLzħ ǾT`u⏉/kn@k˰7 :Mʠ9R9d1[K-|e;8ڌ}Qzz.|V 4.~{}3G濅&_79"ƪUFҹ/mG  cݥzwGixOVp9Y Qf|MkُŤ #)$10>Ѓ޾cnÝ]ghAq$1DH3:_*Ӭ|r4?{؟i&m>%bC.UhV௃"A\UAm("n^-h?+5F/<֞*m(%0+*X>>ߟPO|-Չ𦃲}9y~׎\w܂8 qi?ZG#KS Fzglڟ;Q<)=O_#A;ɬ|L}h*߇u]2DKc$c1;c:WğNoj>Oܗzvw<+!ϔb0M@dZ$Hy$ *$_=leUmyqs30v7cR}7/[g4' Uʳ0@$)cs/#'Ű_ګ˟&ƾ(ӼmM-[;.g2y*q߰Jkz.|u//Fzk?wXâ^L<}H7~<7 ?pXa8hdNNwfQ~fu#zlޭ)h4I$QԬh\WÿNZW- }@Y\ e%7~WuT5ώ|>,O45`iA2Dɟz#[CÝP?vۅlFr?O<,YjdvdY_<U|=cM]ٕ[M4%{~o3;ծ. L /|ĒI'| -$mB@NXoBD= 7_!+/O?*⋥?^T_O;C7BGI9걨L ?ɴox:Bga0Y;B8>P_t|V2_ fUѯ,cKZ$c3ľwH6/RIG' 6Gb=h#Q׈Vicդ/#H2dJɓ =+H HB]tR:vpkc=/G8Kھ@ɷkg*7}6&zM_ETi_|Gc6ycu1Cw!6e5{u}cbW~E|&b_Z}GnJZҖRQ~/@66(n$=xb2IQOO-HjJȷ# -cXwwpi֑4W8FK3&kIf(,M|9_ Mf|N0H |i7QBbv)o+Q{i%Fm]-vFCCk I:ǃiae ĐC tDU =PnRM3j~)fX(uF i}̰Fڣ]s|hŏ֟7$_kJO7?,C'<%?[GeRLjoc{Fs]ر 8I$SCkeow34i:K3 4ҘݞB;u| Ǥ}H3?}o}xu-X0J/#$C?N9>ZWo'T98iFH{5} m?M>?Z!t0t_^ysMx ?3mfrX'+dw_ g_xz&PD LdC &?޵a57KY?P4_a ɨ=IZnٷS>7V9|QN6v8AsvN28F/o'Z|7h9G/– -qӨ !,nq s_Gxm\ֵX4k2X=jqdWE@<[x1j|>SD/Ԥ"I22ra$=q_u(G5V_'(Vw\4M} [.|O~MAڭ Hde#&;)LĒ$n+`y@񟈾6?E3͡ǢNرѬ)+QWN6#W u]OkAIrsVO>;W<#5sHNdp1ˎ~lA| kT!,'8U #zܜP_u-tfjV(ő$:#<sƾo&.6;xG|sǧWs#QR;W׫/ 'O7#ߌ{oͷ9(*WFY ~Rk+_72΀?@k?hWWSikFU:e~8~0|d<#Z ~pvJfXb8`;8~п_+n&yyR9ı>N4 I^|_~*ռOCZy_ru ]2> }o< >T=&>gZG-^$nY@TJ$q^So#᧊|+>X-GDds_^O:櫏NIrT, q5Ə~P{ #pVk/7c1@Q? M5:uVxNqD{~5ֿĿ㖉Λ} ](Qk p *0k 9,xXȵn;_[]_R_#A_i_#*ۋ5P{o9Dz__Mψ宭wM kIv?0As_uK[F|D퉢Z;iz~qwڎ+3c*Ca%s7U?>]j]2l;v;f v>C?7j ꩿOռE%dtn)؁^C7~ xY-c+(OQ$K=CֽIF$^> tWƯG= ^+HFw7{oǃE H/=<{TkØ|hGv_2?_v((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((?_O ^wЍ}tvJO@WΩxGO9#@ox/E#EmV'X74b9eA@Q@Q@/3]3Dm7#v[ézojنϐ=7v|.mSt\co[Kf?#B[4|I$f'ci4tb G6Z(08t=Mh쭐GvQ]8j9[nrʆ6i>:n4}j/lfꍐUFR9VízZjYϐ>=7vcppTqOOĚ<>%Um߆ iz&m#nf7;w> f."xE'R2#^}J+Mթ&ΨB4d|IWTդu;$bm#\ T{i!!+Q[o1q3e IB ǀ5W1uݗ"m5KCat[ 2ݝಷ6QBHgҼᏋKy麺OY : 8QZތeu(SgR7^ <+/uۥB0.Xv q]Ÿ7M;Y ڋwTWV#5(תڕi4Xz Jk8 |?cG\BK[[Yci  8&"QwMV[pEH[ t G_o`p؉Ԃlٷ떿mdVʑ!f%^E__mtSNmp+)Fq)ho;EOW&\3Y=pɵQ-8e{V<(K<=SeOk) UXV8׻Q@=D~˾-4;jłh4"h,d c?? a-}E| =Z.⋭OKwxaxXmXq^Ïx qj,..TƊbqgk(ogx隮uNIp$ ExgdI|W s',W!+< (ApNF55դZȳ÷|dn] :iaWK:g(Dte6s_,Eףl[@23[fc&GҴ-alDAB0t#{M_گˍBTңѭdUðCԖEzP^_j30I'E(gb 2}j:7 >3OE(}m#BMygYu),Qc=8GǟoIkN]֧xxY_2@'$ (~OcYU>Ҵ pWs[41,$]6\+)k/I%xsRnOtx`;7`:`2@l t. єP?_xៅ;. GEm8O%$5QEVԭ^Ok&[ml$e3=+ncM];ſ"kzz'[Y !l[@2}ExOGL+Kyg5CAj²:ֽgTmKMK^nJa,oB9d V_|:x_mw=%Pd/#*'TaG >QEx?5"xsίj5֐dE# br*0æNAӠhд"Y,h VmGPOs9PW_~k>!\iWi^E)9ٵmTq=*c_<:O*|DtY;(,Ř{B9$ƾU,TYqN~TwCXv*+oM:ŷ[Y~A r }i kjtS O읢xƞ.ĺ&-I9-,2+)lrqM_Y.xc᷌iy2ҔxOz=[?|]k̭5᝙˒*1 TvnO׾!Ŀig G EA88#عTʫ_⯉!~"ψn-b,glDPLsF2;>'=k>-E1#ƃHÂ9V _L\XQYqݎX] P_!-ωh_ڏyLQX:#_Yjmϟ8/1ko8W'௎<{Vn` kO0ds+鲜E<= Je(k<|u)UJm'woC{jRn-um@={r z1x׺&n'Ӯq=.o;zf^5\n")[+%=aSMF;SϚo}!IIof yYy|Ufz,Xe0­(#c$nF9s+veywi2N  |A&i-#<*?~ϺgEoj$]eXeDAg< ^EmᄊWC._w9kZƠRx|CPOppۭq~sUK8.2d * GGtV4tFdՕ\%9-VS8|knkZKu!J! 瀬ǦE3;pƭ$:Yٴ doD͜1{SXB ^}Z5(}icWѮ>İ[J$jz'F1\vi|BNblvOuC'>tU1ǚމ٫\-Y7qxX[AZJ! @3F+袹kbZWlFӢMZEW1V7sM:dvhp 8"(> z[%icm7x^&X-5+Ƴ{BBכx.оFΏ/u MByld[ $SiYg>WPjMĶ_jtE&p# d^{~^2Ewy]\PD.Et u澌9 |=Ѽ x)[F{vKX `ϓsWMM#E珬#xR =¨; >ZcKw5ıA,"=NQo/x_ڦ/M!]CwB$HWk NI&'A?j^"OuG`zp =؟QlϏP\]ͼHF%YX0 ־c +|3 ×3,N ȹ1$gj}մwSX4M[ma$7+.ᜍA_?|Dtϋj-[a:ϨYbk(>2|7<g\ZX8t9 T.Ў[-x ơkAʡ,p#WQ@y W_8BݤE vlrAc< Pa?$XZݲZa%+ڐqׯx=> ^}N겼+}"ݸ#G滚(?uOo|gG:7 >3OE(44oM\tg4>@\EW$ >C WE|&O63OE(.g~4 wGեID1ƃnubҴo1M!$s˱ | Sox?I՞d jIuC,/'ۖm_fW9ß Ci`4;6DЭjij0X`P|Ov_:In$ E #{(|y%~*@ѼmxRXm #u5w?c8y[@oty#,H cGc_GQ@~ƓD4&1mHvORI'^S(?i5MHߛVW%6ݍy-׾>ZV?4:Z;JOgZyfkF( <oEw'ğxkVI2:8sj(_w;⿀u][麴g['UW K+x g|C| {aLyd]JDyFvDE/Jh>7~>[DέjVW6) W6V| Ck'[ @55Lm$6H)V C"5@;i~=t+M-ูNVF*鎕|!W~&/?EuÑr8#Hc3E7ŚCw46 $F +/<;x x.Ze +VPeHpk,[CxŢ{]JMF̀E˵# }=Esǃt1\XC q{f裌1A]1VQRNnBM;+ocV%1㏌_i/ŞlbP `#G>⽊|;V:XRwXk q)+uwjXIv@`t 5?hxW+p!`/"AW/ E^J߱USIV~=OvWO!ۡno0۷hNk>k(ּ 1M$R"[ wьO*𞶴ev>iE>,? ĚbljuI>ͧ[wd}wfQ^~SZ4)+_ܺUB7R{#诟?e^&}(Au YGC@psmU˱V2jgCIVQEyPQEQ^{ǃ_kźٖL =ہbLd(^,ׁ_: ڕf7*1h((((((w>.𶭪]Օf4:iBFv$4W|׵Ү 3,$@dz8ʧՈeWO<x䍃+w ('P< %]VwåXN6A9b3'7ŏ3c^h#fZYo$own=s>)|b rHEt ?(Yqs@~9c׈&o[^)Վ78m.14Z41*7rrGp zOij"Jӭ仺efĊY 85SyXͯPh)K#?j/.~$TD.moosu! w);׫PEG\t {fGH:1 E|u;+vKai2Ec$dnN:WО ƃv~ ֩ohfʞyV ܢs__;_uEsiw[Ej`"F;&~M:((4Fx>!עMoP8-Q\#Vd_88. +.^#X'ZOks4X#bF q['|Q.[d7zqo ДU-Ykwu YJ+U(C- ׼8iIw5\M&hk:y3 yֱcx]4Ğ<[eѥ!>"OCʒ8>W㗃>8i78XW9depz]W|C<?z/H[m-A\£HrÖ{f. (JmcSݤ7S,~ k ">[HdES;+{?۫θexVyvhJv io.4 k&l I~@ zh";(ԓ^ yix |=su/ ^۰Q#r@Eq 1xCWNf-Z˙s[$d?Qds]Wx hעVw:e}9(oӠnI֪-vD#'"m0kx6[hv s;@EGoqS*O9#`FApAJ(_g<D=NJk,ǝ$Nͷ#yPEfĺW;c[m*<.} P>Oo5Yb$6z8'yQ^6xW/j ibvi$IT)d*Z袊(,Nk>~^ ݫx:xvh༟+ 2h>S8z+>2~^/&[gT6Њ@uFspw7%!4oMxv+s0B><'^5杻c# 4QEy_S}'o]6ݮ/Ʈw yh-We>ƀ=R_|zGxٴ6EǞ#xvgq^@Q@Q@Q@Q@Q@Q@W)fGRק(fACwv<NOVT5No'DNq9$utVDZk^V~h.%hcX2+|Nּz*KIep$i>+ hT#>-Rķ F2(N(|iڶy+! %p('G)skoe8V"c&)ri3(=> :*FB)+9ғD]2Ҕ] (((((!q´;U=pqP|O3ß Y/ t/XIatg 8h98{Q@Q@ ,n*6}p3Koou #[O,7**ɴ66 PtVon5k]vNՙIa,eTsPE2c"%ViڮT~־'τ'aj:nQ$lZ2Nc#Q@Q@Q@Q@WPoᎃk|-mJ[lXC#lNvg4TWSc6Ƅn-6nW;.sR+Ez]Q@x▅*hoq:SHHncDoۑ*O<'x\,!ZyX YA4\ixEi[J t e{+?ſ $>02, &-+*cV9![8@o=ΰ _oO½wo ^ּZv&vȌ#c0YE4-cVkGmoEs h_|}9ŠeM7D'I3}rJ_ ,x=kRYx2Ed!V@2p8zWx6iu8:LpD( {]_hn|14lүak{S|8##VO{"u8+@8=ԑ@ExWm/׉xC[ Cg6[ѓ=+h󏌟TMQ[x-%KM„R<}z+狟ۛ wzΕ J5MO×sWx7ƺ/Zmu"f+G { +)~>x/ W>%5t3Nbm]8kת; D'#z^Z:d(둜2AM@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@&՟FC7md'u'n#Zu#.QIyZFc#1,Nz澪escwũtk$I?|wS΀>h[DѼ5/[H`=u+zW7 9{UgHUz_1+,H`'袊(>+|E]rlmϘ>}&py~5 MY$4pL h-nbbf"8lt=w= K:oY ۅ9kpTaIS\?5^Kc(jDU*$°Կg ;y.KZ@8j/CIa%]ʓ_??HѾ[z^g ƭxLwII8|'koCsyc< 1#KuŞG\6}ȤXz_E|4Úƣ6M&Eoc_6g~^2"4]de$B3%C_Bq,fh>=,NtSZ5{s?hiS(5 EŇ,6U@'q=\ouojwsoPhǨ}FSRǒJ>Co,<C[򬬢29݂RIR+xr_qRonD]I\cUc7Gŭ;ŝKծu'9c}iKX]EouLU2S[Bf/BIbNMo9[y?7"?_LW߱.gc_ױYd Od5ĉֳ}䎌S~j=;éD*qJwϟL#}+3Q|?HWuU<*+?b4zd̊wJXtdXLFdK?䌱aK>fXљQ}|q'iV+%k/E?>?}>n|o/NrHծm:/r'kK_\kax\lmtsI5C) 29UqR_NJ`6-Q_${T5r:j2}?OS#K;~^rkR+Xi #\E C@77/ mmøsOS_>4x7·.zK̒i,.. ~%|+WUþVDH$V*.q[Y,co]籠ֽ[OXS,u8$i&Z&# :2;0>$|_ /F~]+ |8.1޾=`v?tPk},֍S@=o/5vՖPcc;Qzck-o߀Wg_"pM28M|%.~ڶ}4Nlabv*< +2dva_] 'óeYAm4q(dc41 \h k?FúM\/n8ܻ$.6t&~ 6:OK6 q)E3'8`WU@=4=RNm}g3 )z_ |ZukgkmRMƾ |[KB[^?zh%8 ?A޽ -;u QZ܂HGOzOڿmuˬMv1ٯ/Gz8߇_n+G|Ncp" -!,*yP"ci<qҼ]Ӣ@L< &ؠ 74v)f!T z xWHG/8.gy@y=OM^Wz%ݽJڢ$@_6(?mJ'xt_,.6eEӸD6.w_m짮?Ev4_aۜ~w:u$[jZG/#Aѕ@_*7?|)}4=Ź|n ь+ncD_^+V?"l?~ ]^_ STθTPc HqW_ |#xWڑuWUF"w J?vwq}oitI|kʿJ<a@J7qV6< >uΥR,̇=zM4\%kAf]k㧃tms–mQ!^M P69 ?`%q]YC4>){jjT8q`j jM;@k];Y]0pTa׶~_&+;iֳi$5; hio\ I-((>?f.OqOuE>H4:).@ /,FH5I(^<\4֟_kWI(^<\4/^|BO A%2į$L\$.O8U?? bM u];O Ɓu4s3Hg,y/4?/(J[ZK;!OrG^x?#-F>ZXCMliKh7Q̒!_.=W,>(^i?5O;6Y5,r"F͟_-}+뿁a?|>FLߗ~y;ZAZx@'0}o y&>;J gm5)'݉AI=Ưh~[$L ee bw_Zm-e%Yq+zp2I荀8TS~LӴ\}y$GDD_AOz4 R,u$I՗q?[L𷚗:^w1n Pz~1|?Oi^O|>Upz+F]M*~¶>.%0:`u"а[zi;/_m`H4k $ %%r*UƓU lZc!>#~>f>:~?g(OG~5 }^Xieh$fЈev9sҠu?ye~dGem ñ; ]u?&-k>?2jO;N|yZ\Oq%SI$3ʿM+_6^@?',e`[h$`{^3)?eB fsk_js,_i#8;Iu̾0'K)nwE p˧[5ˌza>5]Vv[H#4UP0P? >xs–ry=6K6͆RW',y<_~1gxiz-$6iɈ]| 5 ]'O6k$q3I~B-լ|8𫥧 FXHJ!>M3N|KzcI }`PHkؿg7 %1\Hs]C|ji?p^־$'$8lg}o I7}-ZW%4$5$ х`bb d| 2kog+wh%s_c_>~_? iL]:U3<4ypGwb*Wm~~σu~9|B>ڞNH~ץxoᯄH#T#ӭ#-Ēm_1 65 s?on+k*3 @@_aE,wżnT\I䛇 G*F7v^(ֿञ:zX JѮ( 鹶tǮhNӭt}>+;+h(m@Ɗ08 |,~3ƳuHY,0oZO~?o5=wHi`Jw"22Cc4~BxWZ|Q PFRC1>lX:z~IA/,όso۳~vn^^k8hj_ۍ1~.J2nWa.h%Gg==CxU/ {]WX>%Q8q >Pۭ;#ME\x}_;[{~j<^!:nqDWʿJ e;BM<ˋK[ 0 oUa1M-J7+\){IaI)!Ϡ=[5O?oZɁd 's5]_$|k8,xw}Ǚ? 6c!(6DY:0Vza>>/xw* b+Xs3W+J+žӴY]$W kG" 1Я׾#-%g׾#-%iυei/u;^tSy> $J29ȯ_>5yS»E7U}݌r+~f|-|=K{\$ܪ762p{+n ?>SEZҵh˒pv$}+ h*]Y<dB[*xS⥝߅5[rIlg/۫*auմEՁQo-Is"/V>-t{{[Íu#CEr@UX:L1TcA7X`.̚_?j?TT;$ha_ZO_wߦm#lYdV+Lq+o&UC6v,*#;Ky#VƏ$~1MjF?mr6s%hTd_Aa^XMJ6M+7;~'Vo=;j}Q Oh,CsÆU3lg1["&=*]OXOp>˟~mo◄utYi,IFڳIgpo]Lj4M6i^X2va99^c^ >xK{EW1P`0T&mK ."xd_0U[G_\eIE4_ xXw'1|5M躇oGkYxR84~YV Sվ/x?Bmm[i_dFZپ巊H}_;W1?dETEQcpX'QB-)r&]R߫qNgѿ=v;sDŽ<7imcyًyDgWEݴ7  $2Y@#*zg"?⏃,چoq銲L +QxU?jm%4LF;)F,J}|>g5>wtMZ|j<4N1彵'm1?D4mF6mۊ/WO蕯iY??ĽGPIQDdӍk*I4ޚş<5Y^աe 3W"'.ov q^^5_ img9@Hm^ژx ׍CF~|Z/%tsУRt^~;qOROu{NU?;ZϦjZ6 WgzݜRx\AȀ%@BK/_S^Iָ>"kдFhz'?cojGO6QOe gq9nV*.NtNTqu7E'^:Ox6f#yvVww$`0={zW[K^U#:e1GI!qr+ģTQ}Tj(GV?ڻ:f<$,1@H6=2E}c_:~!WWMؽڥܵy*1_s}^MūF*Y|Z]4jpqQm۷( ~"|r/{{xB?6/YrG u_2F|K_V?Sz?h=omV23&J 1WYIm5*f;)HFGB;OӼ+>z] eM=a_ Elٌǭ|%4? h+n-ؙp(?hgO[m wrnfbp} &m[=|n&ݳ{?ųǽ|L? H/%[ƲFIR< 7Pm!h;dY-H ).x%"tߴe28HN@>s C|cZ,Vz/+ύI↥h <[յ.2rxJ]F&,} mKP$;rx>VORr{)t&WM_ ι\L$d%?RkE|*d<77KLV3 rv9.}j_q?O?Wg^+,^+pQq@b2ĭ;_htϣzAYi+n̶X,G9r@5_NumfpSx r@a֫>ڔ5ufY$¨ X5Z> 隄0&j;؃Q_<0mj񾣠IpDA{nrQ^eCR|,חD4PM1fzת׏[/x;'%C=6s'F1$^@ ?_(ãI㯵u ?_(ãIk]]|$N6x hIYm4Y2>o"7 GpH"/⮥t4{5xn8xD#)|9*~>$5ukͣ͝Q"nDeP: Ԓ@:φOZԺG|QLmm=@cTSaa|7;{xtdYX*"%<kk|v~%[վs]°rҾ@];R:nak}iy }2v5ۇw˯62n^ أdǾXipq,V9QC+";1GuWGMѮ浱) DdePW$ p$cWoХdD'Qbf~&~_>AmWX. ";pk'W¯hz'ZM>k)cQgD.}&jm-+XsġuO_jB;s[Iyx ;M}nx6,o2F|z4W"xwឌ85}TvPp`iÍc7~/|5ip֓jRDV1érr1\'c{?jr; K,"XYϻ&_HKj*ݟa]H4Ħܝ1$r@>R xOSo&Ht Nz]> x{T73Z\IY\C8K LGl-2Wu_ 2y|Q!T\)pK dؼ]Gw/o ~K@_x>M6R)u[eKc 7 dĮP;P~ 燾$x~oŦLJ՜0XdeN?rbz '.#⧃+oy}I.oVeFTIdN;_^n_\@[UG5}A_/7t?_PP3AJWJ}eh°1 J@Ia\5c_>~_? iL]:U3<4ypGwb*Wm~~σu~$? ~Εa$Ыy d_ƻj_b徹mkQcyG(|665v5\+V]ʟ 7~!ޭHƚdFC$qآ^Oʈ0 }_1GC__P?l?WK  Y}Fnj%"?0w'Nk>%?&d,X`zWO쬧_Po7'mA%TkطM|Y;R 7 3EmUG k"z38-3bé=f^?vqY@F>| Kk7V;R@F['+*mg;_AlHzC4gv 2Yr~vdoqD~SH?Ĭ8ؙδmC/1.,ⴶd8hge({_ 1s 盪^ϏVy!'5~ֹ/)H?fB}Ӯڇl⽋Q?fz`~X@-|MҿbGŇrb>CW2NJ?skzj2-&A`K F |#nKLZWv2w4g|ߌ_`Ռͨn\d'9hx55}@ exp2A|T%^jid7y%`RO]VvŞX"(tVǬ{U򸺼>.Ol,HokUH")ټpG\WQP^AMuu4v#K,ҰTDQO q_-i|}=B7Ji5Y8q_:炼Mۓ / n?0*9J w厧u_vZ e9xޒ *`?ޥûaPE/$u1'(s_"О^,-?b:n͟Vј< nDO^6_ |j)*Tb |}}ڷ|==SZVYD\ R@; yƟ(K_xZC }>yQvG֯~~vK' &҇o(/ݱzoؿG5 oqu!]Ft+)8>o*}<pGjqV`D GI60䓟hF?gωl/G?%|y|+Dg|!xᖆ#}n3JDgҜڪ }DɿMcSIh>|BFi6ח')EyS;nҿa;cXdP")+Z_NjVpyׅx5[r,Є}6|%[|g_߳핅m_¤iwFFyd11 ߶WAchAY$|Sm+o&֗o?EeXKA=Ѿ6|` i4v߅c ~u_O:y@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQExw9Z[M;A(+c~fjco\۝'yYY|Ş=O9_/WzF=k]ǂmxhA91&}=X GGH[TQEQEMKfmsY # 4Xa|;Ʊ+[SDZJss=UO {R +I-YVA )Tv_W,|+u7x,ISc E|q>}g2SW<CIa%QoM_-*{DxeO*1T_<8.=彪-{'E}VjҦpgՓt-47LpT!M}NV>iRذ߰1u*TPEy+mkZdS`Gc?zzQ"K\ŕ}gnl4 `Wn{ُ֧ TՄέ͡a?D$b>2Y9r޽׹cjX9E%rE|si6–=x}~g)mi#]j7źNBY`uμwGzڠFwM5]̌ϸ{a :XZN&ᥟUv|qxڵsLG |!QW#2O΋uoxUm.混Fhą/ZOO{ěTu=R%?WdA<}}=?ZMGcal"QNy$Ii[0XIrk$I'M:8F*QPNz/ >.67F-r@|ec~ux5ZY,'$h$l'LAMRnZDV] 3A|?f4ϕ[֮YT.kJKP#mJ`Ww;ܵ|)A|ӯk똯%H# cWsSo3qt~J[X: -ZOgt6[xIIse57<'|h0m+cl3(߫ŏ\j#wG2ΖVU (v5锱2aX}w/9? E\E]ދW>О#"Y^oO$'"ǯ???ትxevEZ0Iz92d4u:Vmn1z\*׺:_JOnV;{8#. 0̇ c_4z5ޡxhA"elp;tGE^[!Tv@+|3/-cۮ$I'O&'`0UpJ$f!ZT/e{?e|G+[Sncػ#X2A޹{ؗ[K 5Q Z.J4bh^6WRyG=̨4Y-6_#ynM]tZ$-( o.w)诼4=4.6gYp ?gԥѮX_Ivxz-tknʟM,:)MZo@+`+n"]oOo x8W0C^Y'헋7Z~nKes 0$- By"iStW'(,Ǡ d'ʾ/Ew' ={)z<}{C>ji=ʹ+,nYOG4șK&PX sEtUkKoxQ.&@k^by̅aExMֽf&/j>4o#eOUInsש|F|;ᮁbMYƂ4h|8cA^x_u_C&]y>qi"up+P+5/Nv]~mK@naS9{7^2ΛڷEZ2 FF@/4᦭ iSLm"; Σ \ b73*08*9@N~z6?6P[+: `.76Mm_?&EzӐ|Pm(.pXȉv/,02 ;-o4"{o0O_<sq4 P$ xx?{-wRXؔEGQ0GotxSH1ҵKXeJ:8#k|M#Ú4&Jcqd-_-͎HuG_hŸs_σ?i04SGKfk&? m> +׃vҠsK' Fvk/mk'gcxZÿ~&eXt*KY2I =@HKgT}Zo !ݏHھ?`;_iG.A euo5%x3Xqێ;ba+#Ť鱶T%B2H,p9'`(?io_¿_4J׵ٲ" bՉVے23_ "hx@I4R:9vYdᕕ8&s+JxL[YZIqfmxǟ4;Zm7XKpH>'|I>xVox46!$5ł(̪: H!=qƑ:+&H-.S ㈩;UBe>?$~ku--VIu)Ug**%:~uꟄ0m?= 4Hmm|q( :=$h0 .~?i{Oj>(`䰒K`I"u^MC6k KCt 8# TP3@9N߂>imjKsk2O61ȯ ;|xZKXV]"@?Ւ|s}_Ջ/|3x{Zt:qk0;\g r A s;+?&\ :w ٔh} ?ַZ{MY@U5tvZ|ie۫ñGwc$`rT< ? )K!$c10?i9\Z84 S +čPoclfi?1^AHn+36A*9oJOwMvzGze 'QW#3tQX.NJ49mwS#P "9!Lȸ=˜t|/;[Jme߉x?=fNmsjV۝yPxK}]L]K^(F~h=)nǨ4xs;5eCgGof^n$^fCៅ^j)HFWW7Qd?qn+g8Uq>4~:|B񎽬xSH6!8v?7Z? a-}{cilK̆ y8,_OYվݣEA)@ ~ޟv?Kҿ@k_~w"jWVʶS.z*-K)h'%$1ۣ'v?lOx{? &Bdqgم} iou}b 7Kpă$O?Ϣjv%x,|31|=<Oykj5LdWK+(Uq\?VkSۢӤ[{27(h2lgK4 .Mu=Oa$$Q+uOo|gG:7 >3OE ?)û~kv4xsPP'έ} F)5_I4[%ۈR<ΡH*G{׀~mB?c- VmLKxٺ|f9< hV{kwHtϨdW~C.wgYO:T%/_4`g<$$W^2#6WYDy ;l&hNA |AQG> ׶5_2k_"_xO-59u;_:Y31M{KxőI Uc69b0zw ]/W-&l5 Ȉ=pEr+/W RZ#6[JwtUcڹʶ#xA|V8c=be5=4g8 ܑql[Nmֶ~ OޢAA888&{߇58n7ajG_q˭}mM55DP 0+|m3KkJZDv6&ּ*(46gp)<rd`xV-վ$|D&Zjrvt?e@fb1ܚnc # AOz|$oWRݶ#I_c>k{;犼Yko eXAަ8#mc#z lvFK$*'؂A(Ya%.9ªI&.>ό F-RoWީ j ^D[@HzyO?x~xs75m2=+HX%v<B*//&*M>.Tt7xQe]YsLcЃP>.-x@>m?npwiBk|bOOxw_>뚮>cu8Y%mS* H d>/ .&=.ķ+dɌo,~q^Y)/'umSRHb+ݤNYHH$u4>+Y|jQ{dKM}.nvA s&>wKO@iXpC|*E$0ˎw䁃#KWM'ռ_9[>%U`*q3>hAjZΏ{6v- oݨ#@O:M'3ʧn6;z-K?ǟGO#k(\^})8x#>}Jg?< 3@^1eɯ|F[K^X~7^zv5(M+#FYO);|]oj)(o|2яu?.(fE+=+__q hq4zdw0O [y{rI=O'5|!|!+N^&~u0PGv88aKxXͤdc~_i>6h>kNm в4J%A!0^87ŏz6V3Z35${r*p21cՇpzjZtk-dn5pUB#}L^փcN4/'J16)}'$^.?!WٷIk mu4- PW*#g @8O? lڽzk"x؂\X18b0ɯ7F֣YEY]w(,utI-efǹ$;K5XOR:ҫ<Qn?I`{O񝶭\Yڴԟ,AVAJ x%Fk 9mx\[akl.@´dB9ڹ~:gi7lM#\1725 ,J.:xƥDZOm kaVik>/< #aqQz}g4k$l+) SzXԵ+k;g TK͜8 {U{Txz(MX_:ȑ+_+ n# ҥVk%ihKgm4ҫޞUur~,ћ5 ",@&P T,ug_E} )4'$3ğ~EkxfV m1mbl95O*m;;/כZ#ap~k|~'mo_ f̖8`N\K\~i<47Xy4ټ58+31)\GE~k+60s4f\M^2N?咽OWfC7]tiy'LO'//ZI2w ~.o,ڍ|jWy20 O&j4S{*ToN*7{<:x PmZ~q;sϑ*0dp.xj>-ψC/[!Qm9 DUTq@ULj27]6lh$wq4FgxMykIw>F@ ?_ɣ06OsvKwC!G=G|?| ULq40jWj.`]@8/#.>,x(H{Q[\@bHO}K_5tW?O\;6͂ .܂aupO=y!{kXay.yʹp(g@O_J$>1x]g@O_K_Ci;Rt?PYEiuwRyʌA# ڀ=; U~YD T&T>PY!cA>ڽ 9B| =sMiW+obB^qoii4pFIR 1b}OIֳG2Hq#~9<#?򓿆_o鏅G~5 2B#֤w Rv3+׿b}Ŀl}|DԾ--FF* cCݾ'س4 gWhRT 0ǫ菈gbOؽϧsQo<>R 7ŌoSMCD{ 'VHV*LR7ˏ>tXپ6ޗŜH0#HRxljgRX6<#7?t>5 cZ]X2&HaZw~"x_o4^1c 9FHdyoLӵ tDix>S G-}W2-cVegDhic*,Rv~P2t."|a_kn졆UTeYOhͿ^g{-J6tmj ;axqk?f}į -G-y/(9ڊp3oLJ4K.4a4I X&8&_׿9  &j #?L> $k Y#a3E r/Þ(񕇋uo/IF,~Pw&>,|LTNˀe=JT;1VoKߩv/mgzJ]lX{T~>&ѥKˬyI#;[@(j~!/(Jjhȋ#D̥Dˑd+> ~ǖytS钲r_$,rZs&)5u?>4xkod|Gr{y6v} u$Wl|3l4?bҴ6{)m/kZpuD~˾-4;jłh4"h,d c~%~'xo=gGmRR9,58!ܜXqB}gPK{]^wCrx_#ê~? Z=|EּQun 7V ;۫a(Ρkܰ]|1эԣiތ" = >Mxm`y"F2xI'Ҹ__~1c.5mSĚʪ$* 1u M a>q%c62c@1w1K O[7+J4R߳HG dW冃J,c[F$rI$I?? a-Ꞔ0m?=S ?fOKx#m83a#RчIS 񍷌?ey3,ZK\LOf60kw|Ö2M-c4Qj\bg 7_U~ &՟̿ЦdF ܞG'P߷.ڳ;.[1j场{8$ p1.NJ49mwS#P "9!Lȸ=˜t|/;[Jme߉x?=fNmsjV۝yPxK}]L]K^(F~h=)nǨ4 ߂ ӣd(@;ц A=j/~靷-濴o_'x;DC(&1*4y!YHﻞ+ҨM;NV,,QU@^ W>Q[ ]B6ӼELF~WWn?_5=+W>'Z;[kY[WK$+DXlt@!gf̷/JU ڸR[ zs[~-x;⵽"CrlbcduppN+komPWk N[+D( yd~+5kfXhē^_.(@1e;x~?oxZ(45-f$1@v`W~6ྩofϙiT#|1J>5Ѿ<|?~sg]K."$29h?w'ÞV>[qF>R_JeYڽ{Y$Iu[´OY=zLWvn-eUPO=l3j%R'i]4xϹ$ޝ̟%"J!&>i"w;OMRf[yu8u Zd~мr=z)eY|G׋#Cg'ެV!bW~k[XEgem 8FUGP-៌^ 5_ h~'uMK>pE8$UeoĶ:kV) {9JO `ּꚕmnJVV0A]7OٗC'Ğ&nm5? i  <(kpόࣟ7AwnaT)tH_Ej_ 'u?/tydB"ǒzo~᳢x?IM:F\Ld$y,+*H8,1t$ִ{SuicLIqbU,쏥xF 0Oc_B8'؁vK' &҇we\4 8mHB3vc)展>?<5QwxѮo,䴓/ї 9TpA=ҼbƧסW|^.>0ɧ>g{K?A+pCHU v o>;3F&xUs4M#y@,NI$&߅t_Q~4=66fK=6-Vc! <+R((((((((((((s|1KOgZJYV +vI(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((=t*'Xx1\zOYDjz?<3tO^q&HVH65 n&iVKȣפcRumFψodѮ!k,F ԯھ((;F׆oo-I.Ϙ\c'y V7oݰ{'To&IBn NkJgw}CS xh&m]ykѵhvrJE֯ƳMs a8zmx$^-#_5Ӆ\} uӒ~(4V쭮!m\8ft+g|sbxO'ڤO~}-7sE/.G:j챶q/KkI'#ǛKq_KTaX# ֛'{# UyF2to?hj~ڶ7 mϳsnv9M,QU46}7=E ߳Ưxv gx#d$E |9xCJcRJS]jNm֡EywOV?txla@BrOcg7k5ՠGQG 9>'iM:+cӨF.R[~🂿5_x7JU-v,Frp~`A$c!A$ ``j*]յM=}QӇSÞ1h|SGx^0 L$@8.DLfxQ32ao{8*1)z!U9=Te+K;?T~]R><\x6wm;Xߟݻ(%y^#A_2{whdW;*)g'lL2˖ͻ$VΪغT)ƤKw>/-&Țk5=:S*?0zd*3"ϊ?/g&Qfu3׷QN6Rztno~2l4<._EB:cҗ(nZ2,ړϖG=׃判J ҳg[MT&-(?@kz/tF3FVF k.H^C)ǍUUSOfc=?O40+ (9?/~,4=6>/,ʂ}~B>*'K^>#InnU]{rGgw{uK[5k]^t JC0 ka57K@^i~ўĭ2k]T:iCh#юG/Z,zKxXIIkGe*Y (U1|2_(šbZZk1H3~grYdڀ?Jh~ ś\X7w|GhS- zOmjiI,o?~>|S"_ε_GIQ!AA1D_bw?jFdy 22`x7cP*n{>>iY`h1Z~7CzMB^W>x񑑞3+kO~ϟW ZXX[#LSG׼hzŚω|=yZ7!SGMK]YA* Hݑ/Z[x^ N 퇝tykʯM++O&P|;ip/[u-J[6HĒ7L_tW[xNYRż7Q t]ب'v5k՟=GW%Xi]Jz$h |^]Cjmڍ޳30!hzܣŷZdշG޵E w h<ҸTiծXrlץ_I¿iςVo5 [ˉ$c|$1fcWq_3x3ஆ}F) 均Qj >8y-]j/%h6m<\cJ_g[ +hȀg2}@+^~' ] McZIl;ǣ+aTPZk}7W1\9QUr5&x&ywj6LqMxP f6 N}?|kյ;6iJvJUᏃuOkIo鱉n%3#* 0 ߇xUE5 Npv#7Ur+~"׊|ן ~9xOKS9d|eRw09u<3:)ޓ, $i 3jKOɮ¿| mI /3 -(H%w@=hx^o۝{[̺}@{(¼X~? Ο/5C1n6kۂo_Z|1YIqke.0cldҎvMh~lK[v{1x1(i@RX.t7vmW.?ڳOG{>ذvc=-}+>!t7'C Xg7>:xO𞁩kzi/.YQFx>K$<_{}xvXWrJ?*O_M}u2NX4{n#8*ǁ|'k?>;4,bmw,h1hIH|=-ͷ5;PZKHMz}6vVѴ\8HEff<$_ߵcvgKx hgc{wVَ-=H/5k[kG>w2$c?kڼׇoaf9/xz{Xu˝ߥw~>㝅DŽu̅6؞AFAd+Ofhy``" %'ϚE7xS m:L:3~XWTh&w|O&|9JԢ^T( U|W\g'^wGɼP[TIh#`ߴgMc[}6wLv[a3/ٮ~+/.5kcT{ cY$ i/.wlkԻY2Ioquaw ( '|&mtV# #3*<aZ|oTgy`h_ NjtZ)CSsץXCۿoҒs`SQTuaiIvNnUkB\ɿ#|Ym/îu{Qp WkW 'iŸ-cπu_[鷶4\t5p1.rW~T+i|y'v95X.!)FRM4}usZ5BJ_vkc +gxm^"|m2 QQ[Jׇ%x{ 9#JN͞M7%utWm?5(,4[^N8\18zկ|ZFӵ}n eGc *SnG(szg(<:PY3G 9,y?-՞ɼehqҺx^۝&;!\D*IIk55"(  ޛR9TI+[ջQ{|>/ Hj_qÂǞ {km!%L97pdX}e[*x9t[5}?3b'ֱB(+{ ൟ:[2#m*:aEy Kcjx\ QiC+t>&fnG\l.BT\JCXdeNJ)m K29c׷q:@Pb=V`m⯆<"VA {HQPN>jυhrk!]7L=ã2=3k^ExJB\GyI? ,FB>9#z|0/5]u6&HdDʈFRlw q>)x?Zog ֙Lzmpx z_~-xEK+ᦇ"̖9IgrC4rZdf ]~-r]Kli_%p 8"D-˿d9i$ wٖ;yi;u潲,S7-}@y?3 |MoZעUJui\*4,9lgk.'$ڢAhj}Uw>_ j-ӡIoi\ch^׼ìiż1BD`؎Adk9$>#up3A+_i|D+Bc[LJMMN\ǂ<)RȤIBqsJ&ߋ5Kd<恰O>qk[_ 5 '@𦘺VZb<7ܖf8$Қ_'x\KKm{'GzE`H*FA -|ysԮ÷ilhURH}{G_PEX߆&m c%Xǚbgڿsi?Q𼺅_Xr 0BIϵo\Sj^FIZ±$M@0N|*x~ _YkLQ,yv>g{wT|?7 2]8~U;A'c uԏῆ~!iIZ( ;%Xd G9ʑc>G|1[aK"+G `I<VϠ꼟C෈l?=F>k0إydasJ[+}u4WB$6%]T;[ #//X.mG*0eaw?~_5kx綋CC"K-$rBK_jzMbWLȹ'F)1}\|\< NĚY}>+@' $ 5kx O,i*~Ͷź0J}pr+_[U2u%oȯo 1Ě tSS񤚄qYʹc\FT$1_ހ>h!Ibu)2:2=>{mOX.I$Iqo-w$cBe%xį _-%"ۭ е?fT4P;Mb@ M]zGҸ?*c=׸~ʰ)Qd edq2(o/;z"Ȓ,ۀs_?i? |OZxF}J[/zL䁌8|{ex65Ҵ%֛j6CLw0/@01OM}who~Zσ59/M#kwx%v?y?fA^/ mCnB=JKǧ+*0q]τu_bG 73,B0H^ESīixI$Hk̑8FT!^N?/-Λ3lOH!$t$,ל%?__V?EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP+-Kc^ -JNAuD~v'DS|w  Gc_z?6IVV_1goSwP{Y$E^W J; 5/i~(]j{[Xrc?yA_OEPEP_Пt {NҖoiZ5=NN2]E7d~uǍ{L?ioZ66Q?̹ux NX M} S+;rHsGE_^d}X>4FENnZ4+#& } M@ծ[o._;aGl (9< ~:+ʋj?3jt)R-BGP}Ala>H@0+2Zu%\Ǎw:deIFj ѹ(_s%}_/m-l]ӪFB0r+'^3RDX>:K9vUON[yG5}yCiT>XϪhB2 xǘŏkᲴuk%?Lh; F*H&QB={N._AYJ7$OEzYl,pJ0=I4[G.g^aW\џxG,>jKAqixl$أm 㦱6wRab+/w2=ڼ zDY׼ʆ9[򫒣T|.5@H,pgp1Vspm( &?޵a57KY?P4_a ɨ=IZj)8i^q_5Rq?@k[.oo 圷n>dϔI~WҕW;gſ~ɯWº$k3I7>iOuPM\W~;GoO_kwu3j~a \j6&oHrcr*o~~fY.4L9h?Xma@<[q?7Rb]̿<|qX>|/ӿƠ#RޅaߏF_Z??_5g_5J|:mrᖗ "SZ@Xw <t"oi+ :,4h-jGl~۷wO0iތm>E}jV>ss m48FY $M2M4Qw I$Wk3|&#ŪG\b/B5ԧҭ5%Rc\YN8[d`n~Ρ6:&zMB{Kk#Q ߉=I$h/*H?g/>'-} 7ya"gXמ1xteޙk6ͽb9uHF:zַK_~>eK !΀$ǵ UF0_|$h7vm,}\{9#KL1!?~ͯ~'cm+>_j+/nj4k ZIɗjX.2#ϯh%H&H6IB +,> hop^- d y2(sfៈ|[p鶯$I!ǝ61CԳ_ƀ>g=S<"^-B#!w{|U[xoᯈo$w*hF({["odhl41ku{ߞ$,2:&spH |M'LGfH%[@im_WjE6w`,p5I541Ұb62]Hc}#>9iu)5%֭$K8gQms,DNn!X{O_ |IصՠXEebEl^oXOv}6M4K&ccAn٪>+Y|!t}SP{KbI@@Mi/R(̡-6ShcXKy(bYKWx'A7V:i>&a<+c u1Ukz"u|%Ɔ~ժX vaۏ4dC>(?n$񧃾.|:??L_$3t\1pԆ|7j6k &ENBޑy/ҽU6|'wpkZ70%dX~n>k^o5=J+->Q%`&?8 꺞8ԯ O̷/sIpmgO'N2qy3YKk2!lF:+3r?1>w4ϋ_GC\*sM(|xTS]+|bO=CKO Sm .HuB J("ŗOROp1=O?}k^cᶤj;NH_+lmNj[Ŭ[-kĆL+5ݘ2n /ڣYi=ŧcB|(/;ZvenLV{I,HUp H@=+?lapT]UI_RQ1d87}?שi{j`=R m'y3x?ڞ0I)g9q*Q_WxWD𾏣o]>@޾Z_35I*h! [G?miڭv;"Op+Zo7ekc>'Uľ$$a7GxR;O-q؃^@>> M^# +l֖?=RD02O潻"?)?b$f0Wadb,?SǬҿ9/ڻ6EoxrH\Lm"#8սF|E|J 7RIoaZ;@uF$b#ӽ:~ŒTi9n@8i N& #$oX5 }ҽxact9QbhpJ0qRכxWC^"kmB w^9nᎱk9Tp 2F=3s^?_ xwwi")6KdglFprka'`輣[v7lt}z=#^'m W~ShFv.:?k! []z+$?_?t[R pY?|%> z[j7pO@ʢiNq=kkWɪviV,n`F8Z ?KOCI+TUmӶN9wJ[xִQ^[ 4Y[DI#+ Tv-Kh̰NUR)'+i9NDo( 7V~˿L<1KxN]Bw*;նwjp][JN,Rr2^6qEARAބz Oו>\|u]bCgcf9u7a>⧉b&m?i򏺇q /ڷǯ^xFy ~կ뛰2Cs⸟ڇj Q.$ N*R3J@hTXFS_@;|]ojO)sx?/.]˨GY#1`^ |; h|z-m(ᏘI'$ùGxCʼnNt*Ut\tW",m-&K[hf]pA??_hҿҴ |mv0?IA }r| v {ieF 2X |׵/TK?GdM]RY֚w%>]*ß $_[\t,[[Npe(%XBdVTomi]Go4x~}Nd+$LY[5?NB)=D!eypya>}̿P\KH.ψ^]h5 4kˤjڨ3{s{O}_y>'hSˡMd<'o"ξ59mS[e2Y涌1g.1#&ʠ`G7m}_ 0#¶>>'^!a]2O'U-ci%{?ݯ3t1Ӽ3@OwyL7щ7v7VsnO^x^񵎟Oym ZF% Y0;-^'w7N[ڧk`|y䉱k#.BUc@?*lj,Vd7Xg?8|jiz3O- 6ks)ck e A |`|w>GzixGE( k}>( &dxʨ*@foxOK/nw ;v  )T[Q x^fm&Qdj7?@$,}z?ÿ_S^5 +EN[S04o CeRWaD\%?(PA}趨t~w_4}60B\EUd?%m@#)Yھӯ?AMc,Km_i_߷?~ͯ~s? 4ɚ-Sގe{*ٍ}_5x_.]lEofYy}=ѷPњnm鶶pI0DEUG ۻM7{T5uwoҨhM?K/''~_q_CG)1^g\ ~~σu~͟[v- ~:)m&L'EcEDPT`_6|VNJQ7I~ov$!s^?4~\/w #Q$ɠ Ʊe.SԮ"i.n$qF,O@> *~;VsZxDqiP4@J"y3 ֮ucjpU-fh^$7"e9YFouMi$amcavv0[đƊ0 _±,j1k2=/_SGJ%-3oQ.췙v3~! =τ>1ž#gR }շ)4W|04}0?~ c pn0'ڮSW"6\˷~F{Y~IOۊo>9|CԼocwK 97i?)C~~"oi"kkNM<42vbq{ׅ h1ռGi -E!S5c=AWW~ڿξ-{P,!݇Yԡ*?BN ?\_ڰ{_vO g]85ܾ42 5F|"Ed_ -\G(RRhBAA[~[r^\It:LX@pIk/Wi܁#4lWIx{G<1zLȷVw#@=7I|NOǮZZvV2I?w5|Yh+Y|Eּmjw~I@hۘ`poVKR"DOw{a@>Ij|z΋Y+6Ҵ{\+cEu>35_xgx7W^𽑻MU # ʈv O e]oxl=bYwq"4zP֏3W4 (yY 1\AS ?mO?fn?,дOZ5[G`TEvM2_mo~~uh:uiq7$)\FQ^S2k N\<ܑ;o M_V|-u>ܓưz\6ܱ yz#u!3ԯuwϸGe7lB"$$`+{kq 6>?6>堳'I*r.ר~Ϳ-~|"Ѽ# uyk?20dpj.yo_|)mC^|]a⯈:5^]ExC?pAўfu?X>k}٦Y68 p*?~563|Fʰ|c$, )"s _-TWK[~kM0F̾M}@T/bxW? \մ" vKeP A=_nKw^'ɵ|47?O|;7t=>hҴ[E)B(R[0~_kɢ/(/ݱz(+.mo$6bؗn?WA?f;x6Az5h -w=?ǟÚ^ng:$z؁__+Oٟx4c]s&Aՙ?A*,g'Pu {wį"]^Nm-Jȿ' i?=f&cXXYU@WIO$Տ=~QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE{U^!kiI*3V9/?hȣפKG#"((>,|о1>ޣjt F;ן!?}E{3~FV8*`pզTm=]YxL5m#&FC)ǿZ~+о0YXynEk9ۻ!>Uڻ+)xʕ㊕G#}Vˎi:* O5y'YBn+| r6\j2./X<{{Y2Y}ZM'w ~:C$vD0"z(^EpaqL<[VӱZ,Dyjkо.-֡t5F|۵|9^Evb3|~*Z^9`pfSM,~m'\^Lrdaѕ*ׄ~ľk}7z'T /Z> c0) Q>>ux|KX&s.Gֱk%Mu0 `@B~khXF6~7'kF,Ə`@ǮA8p=y MEpĚՂjض}EV7`Zo!VWo-~ۦɠ+igi"#H BK1ݓV+*'M\F8EW)R7 R@vsMWJ*f{k\ZpxQᖗcx{+=&NR@Php 'v9:ƚl6*<(&^%`f@9@9kuo/Ú tPxc^}'W? jg.jۏ^ Hdd z9I֡ۍGJ1 XN@rq5}wuψhZ ,P P%EzVO>4-+)׮'0 +lduq5P!=c<:ƯXZUˏl^<+qZIg<*?P~@ê~? Z?? a-}EfwAχ4٤O&쑠@[ppҼ=c/z<~Ū$5wHFyq_AQ@U_oOR ]Yj!֮>}sܐs]ό7s_j[1\?b@=\E|7þ=?MWWYZ}J}V bx^]U?\Z$G1OwP|Ju J񿊼fK &H !]NpN8V~Z?U&-^#V%\Ǒ⾊!OE(aPTQ@~2ϋ4W|AfVuohpeEsW |E UVRnUp;TP]U?\Z$G1Oel|i7v:ޚ5"Zw `rS>wտdkL.Ǻ*sY)$psֽ__O |>fdH@Ip9=`+>xK'3Ak5t%|mqa:&;/ 㟁<+'Nhl%L*Xu(_[ĺm_>!ǧ({&/`&1WYgaO [HV-Eu˟_N dv joX޵'2ʜ-}Y?/}5llG*C#"t?O~/ÞZ_orJQrz]?[|E}kyu?0nv۾S=2H+|KxsUеX>ӥꖒ]̆D(H#*dGjҢ>pcc&6n$1m]'I/__jH05 a"P@E{m1w7;s=k'Mj.8o'u XiQUǤ,hMvIč_ axfLJS3swzv5]K&ʱ%Bsߊ>|)g=vtkkS-,)aQ}N ejjiNRI}G*rqn)5uo;~g[Cľ#auiDڀ|vkgg ⷇uQ$qne#*H# ?%ʴqo;>ylz ESt}׿t.8moxĚl ,ZU}Lڶ~ӾI ujK)\-ܐ<21]" ç9Fc+FPR[-m2!MF6kce8>&x[ռ7K:].`]T0pp}:W[)m' [m-N;^MG>,ᥤ:wu.eOx%ʼnaV$zRD]īIuVZ\ȩ.`$OݒZ&brcvV?\߾iz~[c”w 7L6.O6Ml bN;$9t?cW!MlKpW614V1FSӯ^}VQWPYX-WQ,bhlLK7K8G9 L1ڳĿ6UےVqb!IPR}VKJSu>|7gajW~IDlI,HĒyMr7t%]|EٶkympO<׫U Nz_}{XZ2J>q>&ScOsV5(g[$.C.v?Xlŵ 4K fVt M8FZ^jkOK JO}Yx>jSUn3ڬ}g'5EsWUV5JcMYQ\^yݿ k24wv,ы%H4x Wxǡ@GOsekh>5U턞^Kg-.ŋ ;O9]|Ltd > GGun"ź5_g|+c(a%}/wv82IT'$I<7"ѼG\?uU4[&x60Y2~2JG_~u"u䌱s|,𭗆/C$z1f'I?^$R:g-G럳]\U +5_Ǘ-H%H͘p )cOƾax'=SQ;!}srHI 3P[xO׾"Ŀ.kgƶ1hFp_DQ@ŏLJC~ Ε42[[~Kh I!\9_ %m]wT5X?khBiC*1yƊV<=|J c̈́2xK0pG#} i:M֭4kb?De@P_Mh>>.Zޝ]j۸yFq+oU, $ŝ@,I>_&;f)x\pC+_3E׋754%>!9;W@OQ_Do7tHٙ,dKI985lhKCf@09K쳣~hG,_OYվݣEA)^7þ=?MWWYZ}J}V bx_MQ@wo^/T#Aqk4@Rp>9<0~X;}BW5[fPUY'āk(ǿl_t+~!Wp hy4Px FᎋkgM/I,`[!sl#2^ ]xHׅ]e5,9TsQ@2k_"_xO-59u;_:Y31M{~jk'U⅚q[YDc6-b0zw!Ӿx ` B3_FέvKԌ&iD|U]G*x']:7 >3OEGO>2ʜ-}EU4MkM h,nh',le`x AmaӼ 3ƞ#urC o4^,O}Ey I]I_^H3L 'N';;u׍4m-|UxQMsK  sr:KE|ɫ~~bGvPM? |GmvU 2#i+Rbh=N1E|5?Sxnbsf> gԑ3qj@'IDaE=FEb~Οt}u$r_\4:p,h1L(|I!k1N&]1m;Z&Mg_m.[/OxA*i7שod;q"}_GQ@n>g[-@ p߆chҼǞN70O;f$:y5_ e_|+Eϊ}SŞ4K/]}d`8 q33+ԼM?oVv%XkBpǚӢez`Eծfٰ\#kTg# W|jl;CyeƲzUլVmC[1ܡf<1^Ep M[SOգHW}.~G m;1J?Ʒїń:}č\gd3bID=RU/ X.u][VXۻ4|N.TpHZ,Oy)%.7ĜkocV%8\뒚hEGKV{߲O诔O~&w_XZ[Z3} c_s_~(["}>٣ݣc̄qp B1\>xVm~Y_K1Z(X+5H_(5M7IټKDv~N:<_F|bm+"/ X9.?Ԗ kWz`k[cٜeSz2+xT Tʹg޽L,:O5 yʌ2XpAZ?NZg*O~@X@#"牬4 z^u|]Kl9xu8sw/7׈kMJQ@3Ԟr{ ٢߄;cľHkmihmB8=\\Ego,ʐAY*I<z9m:埇5m΋=@#rc]_ݧxC[Q{V ug"476{Id`pN((]- : Ƶ=ZEҭdF '±ZƯ Zk!%I.Ѷ PeEdxZ+xVY/.D.)f!G$| AGS4 l[ֺw[^LG7iRlTVPZsm4w 9`FC)G9i& 5+۽W7 t oXA9$rWh_.Qg~xW Z&M ?QoNZuvRj2voo37}k.uq=WF/E6F8<5x?^>*𞋭>u(n1݁ggNq2^䝓zgQO^Lע+ ( +u:/.4}GUխ\=a,̌8#&IkiWw7z);}fKg,6ĊqV{w9>/:tQEyXQEQEQEQEy_S}'o]6ݮ/Ʈw yh-We>ƀ=R_|zGxٴ6EǞ#xvgq^@Q@W%3ⷅ>i0hj.Yr (,N=uW~^ Ӣյ/ IܻJxsVAA潿>0<}-{ú^&._r8 8 6h((iګR>|/YZU&'IW?'ĽsP_J_NK=Z7`#ʤz3C@EPEyWS'oM6_}W{; \r:j:bo_o64Fu~\ڹ(Ҩ((((_ǚ%q-U68(sۏS^ c^xL3 -|=J%Ko-DIXrbaA袊(oxBqxVtq.%=I'o;cľHkmihmB8=QEr>)h_ y-jpi0Z5̤@uQ^iў1Fb/,ʂ} WϤjH[~[Wd9^ܩcXujwi}fYdǀ\}q}K_xLb\iwIp=q!^-m{H_F2Q@Q@WL>+yx"9t2{SӐss@E|op|2խt oh2{iGR2H9Ƞ h(";(,ԓ^uoI|@PD[k6?yNAP^_>ZK; K)%Cmb9+sIn|Ce 0HA *|AFմ{}SLKoyi )TVР񷍴_>|I+ѧh|b[ɱKjǒ<ZZ9t\Inw`qP4W#OxN{a'Geppgv^$&Z }/Jqyt#GrOP?u+9-~9 0}wJY(_L"GOO|l|C9C$9$l)Er"|7a4kPG(t< uX(l|&+]CZ/r| e|G1դ-,H%vrpUT=PQX~3uukSP6Uht ogD8n,|*e%[\'f l;( xhN2RE;ֽS55[; [Nck:t3wUm<60ph(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((ڳ=Nf鬞$NLOn:~ljj7I<+Hdg%\_l~.x.y{$)9oh7|C{%t \1gb0n}J&i=ojI Rr+%e}Q@Q@h*<}h^Kt<4ɶrLza[__yZ(Gr+Nj#kL ?Wi3f3\$ˎ1NюuVaRF<D|_Z"ssTw}/x|Co]=q*c5s|9滫HV`F/+w$Rx^GpyuشpZ J[2/fes, Jo/mXx<yɥ.;k?h[$nX *|v_l{ ӈhQh70`0> OҬGme[ƪ>UP?p_>7Ya𥞛kmRntirxZZZtN9DQ ;H⽻/x=Tqݼ?s8ʺ<Zxt<畬_Gﰨu1XIG[߻GbOYŧ>ߛ›Ǧn+>#FNb|}oRSn{__zW?5O!CE?erIk#3Muzvg_8x%tnc߷i0s^z(ۆs>kz:mZ5}ckh88s߫zh>*tȴ>L-O3n+OuUL xS6%+.SB)iˢe)a/i-&uf֘u?gOq͌qֵW4k>+$xGɶ[kyFC?-^3Twn9r+Q{~zaLP6_>;s¾r>^)~^H<\N*+W+ۓE/ .nO3_5Ϳܪ]Q ?C!+_gD%ubSgGQAEW1U \΅OHR߀ׄܚԺ *ZChHBf#\hOCq[[p:pxO 3˩x^s$ZK2%a;gF=6>nI;__52Pkw=&KѮiv%)#8$ w:ݏ=3Zh < e$z8>~%x[~zAݵe/^젚 5LjLD?#?_I|Kk_M!Ӵ;XtXJL=W_ ?iPGiJ d$;$?FǚƏ#Qo [ŀ(a. 9/o͎h"x@wlRA=JZg}E?v9JG,itߎ_1𶵥yo$fݣPj6*9>ᱽԬ໴;KXgä* =jz~x>5τƍdn`Q@- xPjTӯ_YfF*~^+wW_G嶽cm7vԓhm s?੟Rо'i"ƗykހZ N;BOwusa7K}]_n4` d1ހ=FG}(ti]vkoi޻+7[ &j2'KHK4 fT,ȘOt/t5?>7IGr|;(0a$! M$`YU$?>^# 4-rK^uPh}{zת9|c{y+ýwoo,.2{)w;WͿ75{Ҽ ]$ ~t8 o˝Wp))]M7×Xmih$i$#$@s@~z7Z֬dxgeb(  xM-c}ijqnv?,;c? ?3&w ՏH-WuT4a.p+~9^-cxmnUbݮG@1_[s!ǫA^yIiZPٗZ\|G}HWieBz/p͎p'Ɖ}iVP~ښim}qj=?ڇړNNgD?+!lt%Uw5ퟲWI sÏ|.񶡨3i CX#9 c~_K~~k7a" |A/k9㶛,s6TP9^-cxmnUbݮG@1^yIiXV% 臭%Wψ?hKJ2(?nOپK K yoJ?5&d_oJ?4k_$4= 3\+]dJ2[`F(TkYxKD;W'䷎Gg`Y@+_v/6?G ~|9{襮߇?O|1`_QrFR%|'7^ԡ^BαU.x EKO;>jzn,fYw@# l~H_U oOEXNXN~w\pv juWY#[x$$H*+?~?Oō'?e :y0hzPE"!ɉq%6NCg&Ngψ DԼn!e͏dр .8er9 | RM%eӵWRsaD촀m]zVKiڝWz9:Ȋ `G 1 mFoPE_F~:ԺIgbsiD yomEkM7o dӴ`J78'*(.4 4m&;2R;bo킨`"_놫jmþg]RVwbŮkfGW]!08'oMGzMO+M?Xuk~j?o(=ھk]OJMͿ9y}<߅{cgX{( BG#܊ؿa>!u&Ԥa6~_hSzΩxIO8dU ,_G/߳.k?OUr>hS(*{w̻s_qZ fby@3y?oN;]j:̚4HrαhU5 8U<֨>>~h^xĊ}_K+K6tk/[OpsKwP¿/>*kWKy40=KyMI䜞~՟LJo>D񯈯uoK_U?g~RUm 072d<-i?CCIJ?ҽi`+5?t b?:|)>tn5V;+ZcFLȀkw?1]3wiGep" 란'@_ׂtϾt#emn-Ѭ=f={;W%oF`VEʓo;ʓ=ywEO~Ѽ ?S_NGњ# mW*Xgx±ݭZmł4{FHn+g8ȯgz&:+KXm<'fb8"?r[ Z=S@7=N0ʗvoo2`${֏ wEVF%3r TbI(&P~%?OtZEUڋYح$klPPwa~_A^"kl'K7 42ʺA~_h |о>Z[ Vy{4;ngb ?->2yC }kں~K^_|ff&ѿ#ޭ/%ٽ Fq5+F,9/-~5,L:=vnNY5:!?Og8c4$ 3E:cUt)wwW3Gom 4+DP2Y$s¾"`>-n%RU =SbuQO$sZ֬|9꺥Vm/qsu;mHPK3k_4{Sz:啼DNlYdT'q^:#{G.<3᫋;]y"mF6$]TGҾ"uԼ8ڇ/|8X^:'*$"(䪷={ ۩jzᳩ4$PZ<`Y( GP;WKS|hu|M̀ž鄠g6Fttf߈Hy|=ba]1d.' ۳8u~,Ө[I]_#^>#N0$S߿h)h^4>bHrYy)V,`&+{#t5 6VFe^J#ʌܒI {I?6jAQ,Jlv# G>ӿnZt>?fmK+aϼ@=Xnj_Ě,P^Ǚc0`9#kŸ e)10\62d |xO/};͡#㐏{^|oc֟{w!ڐ}J<}C `Ni32Fq׽|!}2_B DO5[@C{!/+дC0:\jpL'cQ{P|;W>-J[R۰2qu<-YiQZF}s,}ɮ8qb&7ov1m 6KDK@Y`YKm%@+|qcoݭStS u8R2^3ᎉ:eƛmα(x%e ds#}Ul]t==EJݻkuiVU=/o4w042,HD )W/ .kŨq%0tʌ#;Bۂ$Xe}AHn?=M{x\O2iTJVvzi\cj ZQk]|ֺ=|` x_]DYBb1ذW<;_>,ҵ[hZh*cH ͸ X~uX[Zo 19@Z4 O;w>aXxO-4ݕÍsq+xKފm_;kWC-U՟A_<ji7ͦE=;&qv?&|,{ėm~뼅oAbN+½*K8YvBv`W|${\+\= 5jxҌkIjTZ{hŷ+m~G&BWq+m-ݰN 8翶Gɪ"ÿ^mafX 'V*;szxj*jKWoJhNo͞|bo5H3^`$rxj[B{ Cvw9I!\28?+S>qs3/?zI'jh+K/t8/ݢX`;f4JNJӚߖGmIbA$Yvs|Cԕ4ybݘi<ۜpy(O Ы`s^!K 5vL.gf;ǎ1_ zNnz?=II4yz*K+z7^]ke,SS%ӯeNq]g95 ǰ#r x^WhiW 'DeG+nP}#ҽ,᫛MWrP miV:H?,𕌪g( Fp{^jx\{_ޕ[-vم٭+}|=wttENY+RW>/|G:~ȒiS< .ͿT1_9nU9G]GE%J);QEs B +O*&W[j(%7o[? GSg]ĄvܣnףWN= G;=&KFK69Jl@p7yq|ğj>5cObH0`0MVH|6KǦxv:ӠKLP@r^!O?|Wki}.sʨ9d OpFzW3|+|MgoYMNTGl1F:_A@C;~|T֎8Ӯ2B2#19+M{7BZ)m^ OOxú[.H s岟 㩮 $J29ȯ_>5yS»E7U}݌r+~f|-|=K{\$ܪ762p{+n ?>SEZҵh˒pv$~]]Ack5†I&(,׈j_M2] v5ņwunXdǸ5?Sm"堏7RKvѱdQF1__:/~,-cD;zO$_D 5 ZͰg(}U|Em|< i-[Y2`=itwO =iQFUQ:1+ vo:ūm[6$Lݳ2ۓ H tw@tV)@2 '##趗s,0c?v>՚{%x{TѢ=mD0708L2kY=z>56A-\7{IwWݛv@; ݭZO>m #\7ҙu~)wL׵z-3Hԓ̵B:/?_D%<#j?{qmox\z㟔VG.jxb Y? Aǎc&?29!s?>'_▛6]^=f&dQºK;[Kx`Bh zT'q9VK௻k/Ns_v9㿈c6rAӃl^J{uVoeדv|SI) S'ǾkM k^$Qg M*q $rg0 bgtx[Tsiڅme+qyS ;ş5";.EEY,lU{^WtOi=ulr€ q]׼'5ˣxn;&D(ػqt`?~OR|/cF.eOKU]Wsa@'iOG|8quo[vMjKo2@#U䁸GzY}wfGHK3m/oE-vh#t 6zڏ|]-ܖ {Ǜu}B1xS"=%i4|j&'亷/&V3$%?s6> 0k^*nQ"duS;w:7<1k3L-`XcJ|ZO33ş 4bm% ŧ0mEeWF=PS~? -im$l#ӥIGA%856B:|"oŴZ]YP֟S|>uuo LkC)ᔂ: }9 Nּ+xv^Լ?& ֝VSrΧp< ύ 9y/QNH9Ug舠1_>~:}ο|Pԡh?,z;(٢*#مzmt_\֬ .*YQ]Ap1/zfaeh>z2vGi់9>{xl`B-(@}vC6Z؟7[mu^ 1(?0ޙor0G$tQ^ZL C2ʀ= }'׷f{owSHI"'$ (ܣ(<[|TLDu١ iQvs,v\ l σfi |3{ 4 #iPNu>ӭ_^Gik$1;ƄD=cvRũ| 6u+{{NcIL#hsJ-`Gxk׿oI]1}=D?yQn1@<| <;~5/ox/Zvd{u{UP,Q) yNy4H^$ l4(W/ްz~פQ-x?s:_Zg[T8Eb7v=QOa^ ɨ=IZnٷS>7V9|QN6v8AsvN28@=Ntx4HXvϫ1ԒOzr ;Jon,cc-:6E=O߶NoNy*OZ#cŝБg6Inv.A#@/xhz^,Hse WV B;9# ۩jzᳩ4$PZ<`Y( GP;W:^mCŗ>i/u_ӕNL `frU[gnQͿ< #.wz>ºc&,]&)O͂9;g'4a:寊,o3KP*dc8%9 5ݴfkb󩴎UeP6@:?Ě_ź2rŒqs d(h/ja^IjP 7M?OivS$Jȷ# ꯀO] N_:ԭxXnZ,i8k_$?@>>jOnI4{ <+nxh]֙*x4ۭ6eY1!) s7|?iZVj7MPRYuUKOc5}Eį&a-$#ʏݡǫ޾W߇szwMe9-g U 3ڹ/~|=<Ϯ]HoY9Cpꠢꊪ .%5(`"(UZmSX6't$#-%{/;鏖>Q ;J-QhQ[ʹ->rH]kV>JݤM.XcvW!Y&1+z]W*G|F@zwwiڢܤq!ʄ#n>Z۫ǟ'VM/?$t*Aė 2%I0|| Z~–TqŦvn`pxf_ 1CDZ _5մ끌>Ɵ"_kW41a%ۆ{?ǟ&kÿsj:͌ r dm <;@ ߏ5O/u-fy.k.e$ Ğ`PIOz~&MiVÞ66F2AHf-\+*=~| UiOO|g7ڗL-ݾt|vوjG*]¶:^S6͹wYCq|Zhe|x*JGT+Ò>=b/E#EmPEPEP_$?j/ܣ&.L $O*oV%VMC̞ ԭHHtI2~b{_ tfjf[|3FenF95R4"% !R5|zo}9vgFtM(FmncGEd쩥׊{s %Νm?-u? ș X`ȣ^?>Э}, ,kI=YԸX''U)$r(eu#z;V5s}(0KZ5CHeO 7osOKHk++[P^Yd2zpz[~(LJh:iF@PO^;:Eݎ&D0銋A|!cr'յ-OZ`rbinTʆK)_aƦa:Iֹ<_ AgI*xng"rmi#]j7źNBY`um%j+~$~~MhtX+gj2n8j SqԒMw]Pxzέ8Ҽ mZS&ki#ay 'gEѼUȌs[ǣ4bB]''ͽMk+ ОN>Wz&L#]A¨/hfq{momp.Q]e,1=|?]H6FҐ\(PI vU28XQyN8ʕ_qz8zҸK1ZO }k\GO_.NKKY; #Mﴨ-8}^~ Xo'oV#:RT+hy/YxOTMq@c'q, xnӴM9Yl`X#Ab@$:Zgy2%'3)v_RYsw ,h 2N+?FoǦ:ζ )Q N+?A&F{6U*,:J?b?W?[#ֆ/QŽƞ+NT)E8@cCvk\w ZFеaՄ( 9C|gu j / d3%J\n;0'-xkZEWwx7դKmR'݊XHkk3w] R;Ilcr!F4EhO$M6UnЖդ"vx!5/$Ws}X!sOp6C!qohv'/V;2eeԫ) RF]ƞ-{v7Q)6crqԚ/߱~'|5<I8UƟ27oԇ pH+c+wV(|9뷞o'ծ-#N0%v #s&qe`SGGHYg b1 8q [?xk^9u;VH U&Ah(঒|4ռYM*iGxaX3,FeQq'Ag; Ѽ/گF<f {EgD鼸`q\ 9$ȢXrO 2N1['|eƄO`mҀ> /cw56f\~^ $5o~Ksޛ*>c9\6>;(|8{:K;WS 2:ѩ @8$q+? 8?x%X+MS}k"9}!jhar"33@O፧~}].cT~idHߍ|e^~ZmqD\~ s=U%ұHK*ǍL|]aOk^ |]{5ZIdg`,qN;WF=¾/8ktָ+g ևh6? a-{5gkum/ڵp364R:1 ~mmۋD>uk{{Ϳ]##;lǨa][j!@tADNJ0 `ч}=7}r7xwv I-+6sεN[oh\4_%ӻ;זxW _xo_4z^`%a^s;G-֧h|igHY6܌Ҁ;oOwoڬZIw+1B!G() !g<>_\m|!@d;WZk>H7߈>! M椯Ww+;qlW >[߅at66ʄH@I坎$ y'-kWkWw{{6DX!,UY*P;rFF}M׀ohI&CC.R# 22׎~?iO}6 I.,g1eVVa=s t  sgXZ3 ?~ -.cyffvJ<a[J7q lj>$|L5nB1_'| EΈ??zV̀ }z_%Jxwi𝞯jWW{->hyX nTc':|/4(.l^X^ĉ@ ᔂa H~<#ckwwZu֟1QDvenXʎE[g7]\yT(p(Mr_kWI(^<\4b] ⾩k#g\= FlaqTS0+g {&rkM[sn ~8D<_\lA/:W7[ CX-Vlgz;Ҽ7Xb7-w̺02lI~ß']Z~!U.ͪꓵ̑2R C/X׭;h!hWH5(GÏ(4MNͬd{&S:9X;^}_ٯ㴿4X:sKonX~`H`.?`M^/BǂVKu$H $e@_Ě] hRk7ZAF pJ?2}ThzjW)$zng$.}PC^ax-$QY '?SE{4.1 $>_"|0232ʾ4yt72tL*ȓQ?k'߃WFtn 7豂2HU Xz7t)VqY[uR}9 (;]C-|W8ckoOkHrN2[ 9$7R%jqÿ_<'CzGď#wJ-Nθ9/͖U'=yO׉ҙ[htTlR$`ɢ.ooMGzMv[~"jUS5X X:PGc? 3>!Y6_t]ŊkCI==MbRO'K)nyEߖp˧[5ˌzQ.+;ha$ *@+=cUqs{a>c|`z`J`נPtRQ/~m|UkuypyDk񵯀gj73,OqMۂyi€IZ??g |rMZnI? $ @##nc]3u^)e:qo8|'H9r;au} Auu0&T#d\{={W/"?^?J!;xR(b5 a^GojQ햙 ]/NbpCD쥊`3u&kRg?j?{Np%_R"y3_Dڞ6/㻋9u mМ$V!Y߳~6M#[~֧9_8 c&4kfƞ&eOY#yy霞q)>|<B2DV]?XU_m?uuUB 0 +|1VOҵ6m{e-%8p9&8?&a; Wо?2ܚ.Lx-eBZYV$:׎>~)WMMIUɢ ,v55>^'7ӯ>mդh][% ~\uPs_¾я۴/DL}W>!O:T"ɤ2x y^W|߀J5`W9pHy8'dQEߵOį] &NCxc?uK-gj;m2+-[EJq$rMc|>~)WMMIUɢ ,v54>*YwB,,gtY#H?wݎvkHQOK(&Ev1Ȓ+ 6ԟx(dz7?VZ qsƝT((?~<|"F~|pщc-9_zxZ]k#-m"5ErI'o?6_]'xr0[.G$pIA|7wsaqݦ7*`crWdvsmVHthy[=)mtOoHmAYG*Fb}I|~|6\[@߶GŸ?u!ơ5鲝Ln'9-|WK];([,ό ^x^Ěe/i-F4Q E>Ԯ1&=Ӿ+x Z5վAyuYrTW)o+Q{i%Fm]-vFCCk I:ǃ3OE VJ5+۸m4xk qx '=1X?(xS⮓6z_Sɻp3yg^0gkȼNFL#ٰ08zc#8e?ُwƫp^^7o+[.5-Ea1-q7C^~ȵxDE;{iX0FGb+K~g6v^c h$q ()G6Scm_Srھ`>G&{`ko=r>n̊Bˮ\n.:,+꿊ᯆ^)L/ۆDc!/w,yW7snm}k:եC@@QE?5^&<[A 꺵ӈಶvf?R@=|+I}sc.&P,4dC)K;`t&SV+XOoZ8s)9R6ڻۧYՋ*P}U_3Ϳd-6ß cEl?yKΏ>'u#ϨȞZ0`8fw'F}2+K xQ[ƸUQ5ʺ>]_x"ͽf[M*v;FN(y cʤ9Uqi}#][PP\ y/ 6Kp78JI覮ckfekZV`-덺_f >!x\Lx/I+ jr}JY#7 uCAt :g '"W?!$ ,eP'#޹ٲJ)~gm/Ƃ5m{<#׿gh_l/fdk,HŤE}QXxΙ7cy'؃Gbψ&&wj}#Sdm?c|39g? .4O !Ö0+e&.!$7.nR29q_<7Y.KF_J0A}bj[x ZN+Mn:$FQ2(NOkac{Y EUz'>*;x7mׇgDĞN0 y>E%E[9c&Wlz u_۹  #B 2}Թ]·vOX#%kytk[RAUPsFpq/I=SZ]&,є@h¿i>Y5xg7 >h:cqz"z/s/t|Zυ8ٚ=2;'-Y$>ʾI{T_/xW?i`(#gPT  |cinXhsYTpT&AWݚ.i T[ d9W2 T|go=-:[F˸3A0 ^^Ds_7u IXdhF2N0}@lPt84 _Ȏy4$Rx_V Y>UfIRKhn}fW_ ξ c{.&u}jSym~y08' 3?g?||_ZAiXf/m `ddg=4#v[|o| I%#VLdL{fe w^_E8xAA *NJ \I kδ_ئIX?yPȏ Vه ?0@&m-rN4[,:W?ข)eV`5RvO>c1/4mŞ$4 +XH`g}"dnj~.Pׄ?*F4ɼ#icY]Eoq2 G^~ĺ."w?­h Ua@7&Ɵ t>~.L$gڲ8taBIrpI-#9eE!YH |??淥>O'*+!jFzgr?'׾X~Zhx]SʏNs"G-?6-97.$ͺq48P?n;?:޾{_Ѭx7g9%݋.I}:gaZEwOm3[J 2ykuOo|g^>-h/oMK(c y?ÿ|Y_oiW, TR:'=ċ]Ɩ.mk 8}]}kԾ)~ /ZjZ|of\~ y(e+"FqqdgGЭya_x^M;`! 4P"r3h\|, ^GYQ!2ʿ &?޾nAǸo;EOW&\3Y=pɵQ-8e{@?a57K^//NrZ`Ѭʡ`S1@vq^YF?Z]/:{_YIB$?еGTR-NGa5uFVelcy=30Ez~|JME/UxC!F 2F #:^}$>H\bd(s)z׭-K_>bҴo1M!$s˱ 7<]>/M[1;(FMuLĒ$n+`y6|)𷍼}2|CHJa$e 6w@~^? ||'G6CI(A2:VxH<-:<壤ۘc]xd-3Rxþ;ubUPEn;ɠ\]^Hiq q?&k?j^jږ+Ine+IϷ{+oR9&RG-PA{υ<':AQv˵z$I'I'$%/'=ټ[II`n#/%G rEx_#/DD|}oGt߱Z#I dL#+{@|%::&5ɥ_%.fVYv7܅OR+zOwX؟W߰ ׀ XZh[ yWXsfeޥOB1^E;u_ _E,V) Ę9sڀ EZ|,ƅo>"kn,qħ?.H¸' `܌ 9-V~.߉GIKӀ c (#Ԧ;vLHv <spꟄ0m?>ӵ7Xg[ Feu8?G? |1X|+^ jyn݇ԆkOIl즿%ckݞt o};T@(|$`?mW3.emWRH4W.ʃ,r(˟B+Ǽ <h~ { GͿ/e9M9^> tWƯG= ^+HFw7}7xR~=*_apM#U;yvOÿ<Ec\u aA =mSK7-Νkw>e +VPeHph N/_`_ xƖ^-~!AKG#"(+j ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<x-rř ufǺ9R@ʜ@#uS>t]kZzͫLdc9'ttPEPEPb]C_4иQ=o$<ᔫd2s-ßVk q9 WTPo{Pa?f~<>2|FO4cb MFX1ܘ LҾ (<U+SŗN4kNa*N{~?͹Mas;鎵n1X길5m++Yv9hA^EWuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ϋ>; ~#JC&t)9!Lp *z~?4-IUo4&`f(((((((ſ/m?lVbb0J$Ҳ4?|3?ЪXNu3^ 5Juhnw##'8ao |QkkuXe0aq׋):}-qaeͺ"+^$nk?k+o<)4z g!´Q#1&L4cq2XBFҊWr=:x|41TJSvѻ~>A s! 5O|v񦷨"A-dE2*P߾'vqW< Vb>%aҼ[oW>X=I8w$W?iO捤<NuC,,#'~Pgj֗+h}[3흃'-q:D[=qă ,o*԰)`VT=~_JǝUXJ5:%}_4|FYR᭤o{"*)`rG|wVH>^$2OXtL2u~'xF🁵{VkI8ِ?q|3wZM,1[n<&2U>UUquiFl1 0dw3⏈MxG[Fh7J 7\5Ii@/U6y>ٷk6Fo$1\"*I5a3GBhS[GcMԕi/$hxotüF13 %ѐ>_xv>*~׍m]"e[Rp˟`z>=mht'ougVV&P+`(~ K¯˭[ܾFv * o H/z F%\GUvCʚ<;~5/ox/Zvd{u{UP,Q) yg~פQ-{yFxɯEwRY9l8F;c"x!h- cm&'[ycQdRH$V8pN?U_  t iik!##yfcOj)Z!/o sabd#:~ O_/Qq=MOq$[#x?ƣ#M\EM4m:֜qk&]G8"F_ApAb^٩͓f+| iُ1@yg}X}h cTi5 {^8p3FFxxE?k>~_ &_1kMabnDbù1M^+Ohw>%kh\O7.[aue+i#vF8_g> imz(5;DKu8 *6xKO௅>xAo/%Ե+ndW#H0>c~\foǎU;Yg}KjyGȀJwbIkV~_PAaIwq)葢f5w{w|i#j7zsCAꪃrG ߷_]jyV(pI6>U#oI.mbݿE-䴻FX 9_? =;ŤMuyFw,Y+'Zs q x}~Y ]HZqG@A@];ĚZxzo:DZu1Umϊ fzti߈YQѼ͵H1!t o3;?̾ $wZacKQ좀;| ji.On'Ag נn~9lSvq!t'cBFZwҠu?ye~dGem ñ!ўcmzֽ$Z6UJQUVac=^_' > Xx_O{E-no.'{$Hř_|Sςj2׭[Y+ gvDq,8dgkp|8k9uocLp\JOLI}q+]Sl|@>ۤxXH,f_"WM~%xM-wº)5i%o\b>WQ@niiP\ƳAso xFVVA"KxT G-16+$LY }@y?3 |MoZעUJui\*4,9lgk.tvveXA?36t(ºs}GyBh=r7cvquc ֚E16ݻ4S4$>nšwZ-qDqpI$J@&*IݕFf8# صmW:[ŀmC=ܖw6P+_/>rito{[H[gC@'!ZcԼ/M{gnîFs#Mz?¯^ӭx?YVG@#``W;?|YۤVF<ˉ<}˳vo'?м?xMݔ|FO1n4p:u{~ 67V:URQGf HJ98:;MڧK@ǖ>>4of}Ncz| џ ~v3]yq]cJ [I|4u%[g_FɒK{Uf@Ep_>; 5Kk\GBHu)TS<ோ p>λkx 8̠{@"O^D<_k=JzϛL*FyYclapy=o>Ex{~tCO8\M[|Ud`f( HH~ER1]tJ9Iy&'^7i/VC_I \qexr$P1].YhmơgenSE&J٦\jq猓](3oG|F {ygpbϦֻi7z֡ԭ_H1&_'`}1ZUh$Ӕo_J&4iQ_>~:-F}za)w~dd`3—Q'R/H.xtfe}vzU|pR$}utcOB֞k; u#χfֵ (Sh]ݘ*S>+xCJ宽w 84Zv~fv.76=`kJNwtʫ^*TޞMnoxFwí7PڋhU\b`A;N0x5k|rMP3s»/[Of;dIɯ='׷^ p=! J7igk뮛xiR[PQ\> x{niyW9.[݈hn?zW5gvvlji+3}oAAaw *噉S֭xׄ|'6p^*>N@#\W,RtͽoB>G[>(FYn~Ǧڅ2ͱn 8PI`8!1ޘ,u1 b$YROH<Ƕs]lq1h@UUV/AʥޗIZ߮~sܒKǁ~'xgE{UÏ6<܌8]M|im-U`ɻ$?k*4SΛ-H) |g_Zl~<74vff<$_@y| Վ?3dK?Eǽ{LNkhڅ]'圫,R%|fOo(x+ekē'Ԩ?*֟eIrXh-D3燎3h+!xO|CQ4WZ{ܨVpTwZgiȴo ZԤ V T*$)hҨ-ֿi[MfZH #">3C)2Ƞɟl_x?6ur-