diff --git a/.coveragerc b/.coveragerc new file mode 100755 index 0000000..e9b51ab --- /dev/null +++ b/.coveragerc @@ -0,0 +1,2 @@ +[run] +omit = requests/packages/* \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100755 index 0000000..e23f4c7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,28 @@ +Summary. + +## Expected Result + +What you expected. + +## Actual Result + +What happened instead. + +## Reproduction Steps + +```python +import requests + +``` + +## System Information + + $ python -m requests.help + +``` + +``` + +This command is only available on Requests v2.16.4 and greater. Otherwise, +please provide some basic information about your system (Python version, +operating system, &c). \ No newline at end of file diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index a62c9ce..19ebfd7 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,7 @@ nosetests.xml junit-report.xml pylint.txt toy.py -tox.ini -violations.pyflakes.txt +.cache/ cover/ build/ docs/_build @@ -20,4 +19,5 @@ env/ t.py -t2.py \ No newline at end of file +t2.py +dist diff --git a/.travis.yml b/.travis.yml new file mode 100755 index 0000000..395f573 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,31 @@ +sudo: false +language: python +python: + - "2.6" + - "2.7" + - "3.4" + - "3.5" + - "3.6" + # - "3.7-dev" + # - "pypy" -- appears to hang + # - "pypy3" +# command to install dependencies +install: "make" +# command to run tests +script: + - | + if [[ "$TRAVIS_PYTHON_VERSION" != "2.6" ]] ; then make test-readme; fi + - make ci +cache: pip +jobs: + include: + - stage: test + script: + - | + if [[ "$TRAVIS_PYTHON_VERSION" != "2.6" ]] ; then make test-readme; fi + - make ci + - stage: coverage + python: 3.6 + script: codecov + + diff --git a/AUTHORS.rst b/AUTHORS.rst index f721a84..035df2c 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -1,29 +1,30 @@ .. Requests is written and maintained by Kenneth Reitz and various contributors: -Requestsは、Kenneth Reitzやたくさんのコントリビューターによって書かれていて、メンテナンスされています。 +Requests は、Kenneth Reitz とたくさんのコントリビューターによって書かれていて、 +メンテナンスされています。 -.. Development Lead - ```````````````` +.. Keepers of the Four Crystals + ```````````````````````````` -メイン開発者 -``````````````````` +四つのクリスタルを守る者 +```````````````````````````` -- Kenneth Reitz - - -Urllib3 -``````` - -- Andrey Petrov +.. Kenneth Reitz `@kennethreitz `_, Keeper of the Master Crystal. +.. Cory Benfield `@lukasa `_ +.. Ian Cordasco `@sigmavirus24 `_ +.. Nate Prewitt `@nateprewitt `_ +- Kenneth Reitz `@kennethreitz `_、マスタークリスタルのキーパー。 +- Cory Benfield `@lukasa `_ +- Ian Cordasco `@sigmavirus24 `_ +- Nate Prewitt `@nateprewitt `_ .. Patches and Suggestions ``````````````````````` - パッチと提案 -`````````````````````````` +``````````````````````` - Various Pocoo Members - Chris Adams @@ -48,7 +49,7 @@ Urllib3 - Peter Manser - Jeremy Selier - Jens Diemer -- Alex <@alopatin> +- Alex (`@alopatin `_) - Tom Hogans - Armin Ronacher - Shrikant Sharat Kandula @@ -85,11 +86,10 @@ Urllib3 - Chase Sterling - Marty Alchin - takluyver -- Ben Toews (mastahyeti) +- Ben Toews (`@mastahyeti `_) - David Kemp - Brendon Crawford -- Denis (Telofy) -- Cory Benfield (Lukasa) +- Denis (`@Telofy `_) - Matt Giuca - Adam Tauber - Honza Javorek @@ -106,43 +106,88 @@ Urllib3 - Jonty Wareing - Shivaram Lingamneni - Miguel Turner -- Rohan Jain (crodjer) +- Rohan Jain (`@crodjer `_) - Justin Barber -- Roman Haritonov <@reclosedev> +- Roman Haritonov (`@reclosedev `_) - Josh Imhoff - Arup Malakar -- Danilo Bargen (dbrgn) +- Danilo Bargen (`@dbrgn `_) - Torsten Landschoff -- Michael Holler (apotheos) +- Michael Holler (`@apotheos `_) - Timnit Gebru - Sarah Gonzalez - Victoria Mo - Leila Muhtasib - Matthias Rahlf - Jakub Roztocil -- Ian Cordasco @sigmavirus24 - Rhys Elsmore -- André Graf (dergraf) -- Stephen Zhuang (everbird) +- André Graf (`@dergraf `_) +- Stephen Zhuang (`@everbird `_) - Martijn Pieters - Jonatan Heyman -- David Bonner @rascalking +- David Bonner (`@rascalking `_) - Vinod Chandru - Johnny Goodnow - Denis Ryzhkov -- Wilfred Hughes @dontYetKnow +- Wilfred Hughes - Dmitry Medvinsky -- Bryce Boe @bboe -- Colin Dunklau @cdunklau -- Bob Carroll @rcarz -- Hugo Osvaldo Barrera @hobarrera -- Łukasz Langa @llanga +- Bryce Boe (`@bboe `_) +- Colin Dunklau (`@cdunklau `_) +- Bob Carroll (`@rcarz `_) +- Hugo Osvaldo Barrera (`@hobarrera `_) +- Łukasz Langa - Dave Shawley -- James Clarke (jam) +- James Clarke (`@jam `_) - Kevin Burke - Flavio Curella -- David Pursehouse @dpursehouse -- Jon Parise -- Alexander Karpinsky @homm86 -- Marc Schlaich @schlamar -- Park Ilsu @daftshady \ No newline at end of file +- David Pursehouse (`@dpursehouse `_) +- Jon Parise (`@jparise `_) +- Alexander Karpinsky (`@homm86 `_) +- Marc Schlaich (`@schlamar `_) +- Park Ilsu (`@daftshady `_) +- Matt Spitz (`@mattspitz `_) +- Vikram Oberoi (`@voberoi `_) +- Can Ibanoglu (`@canibanoglu `_) +- Thomas Weißschuh (`@t-8ch `_) +- Jayson Vantuyl +- Pengfei.X +- Kamil Madac +- Michael Becker (`@beckerfuffle `_) +- Erik Wickstrom (`@erikwickstrom `_) +- Константин Подшумок (`@podshumok `_) +- Ben Bass (`@codedstructure `_) +- Jonathan Wong (`@ContinuousFunction `_) +- Martin Jul (`@mjul `_) +- Joe Alcorn (`@buttscicles `_) +- Syed Suhail Ahmed (`@syedsuhail `_) +- Scott Sadler (`@ssadler `_) +- Arthur Darcet (`@arthurdarcet `_) +- Ulrich Petri (`@ulope `_) +- Muhammad Yasoob Ullah Khalid (`@yasoob `_) +- Paul van der Linden (`@pvanderlinden `_) +- Colin Dickson (`@colindickson `_) +- Smiley Barry (`@smiley `_) +- Shagun Sodhani (`@shagunsodhani `_) +- Robin Linderborg (`@vienno `_) +- Brian Samek (`@bsamek `_) +- Dmitry Dygalo (`@Stranger6667 `_) +- piotrjurkiewicz +- Jesse Shapiro (`@haikuginger `_) +- Nate Prewitt (`@nateprewitt `_) +- Maik Himstedt +- Michael Hunsinger +- Brian Bamsch (`@bbamsch `_) +- Om Prakash Kumar (`@iamprakashom `_) +- Philipp Konrad (`@gardiac2002 `_) +- Hussain Tamboli (`@hussaintamboli `_) +- Casey Davidson (`@davidsoncasey `_) +- Andrii Soldatenko (`@a_soldatenko `_) +- Moinuddin Quadri (`@moin18 `_) +- Matt Kohl (`@mattkohl `_) +- Jonathan Vanasco (`@jvanasco `_) +- David Fontenot (`@davidfontenot `_) +- Shmuel Amar (`@shmuelamar `_) +- Gary Wu (`@garywu `_) +- Ryan Pineo (`@ryanpineo `_) +- Ed Morley (`@edmorley `_) +- Matt Liu (`@mlcrazy `_) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100755 index 0000000..9b170d2 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,3 @@ +Be cordial or be on your way. + +https://www.kennethreitz.org/essays/be-cordial-or-be-on-your-way diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100755 index 0000000..57aef1e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,57 @@ +# Contribution Guidelines + +Before opening any issues or proposing any pull requests, please do the +following: + +1. Read our [Contributor's Guide](http://docs.python-requests.org/en/latest/dev/contributing/). +2. Understand our [development philosophy](http://docs.python-requests.org/en/latest/dev/philosophy/). + +To get the greatest chance of helpful responses, please also observe the +following additional notes. + +## Questions + +The GitHub issue tracker is for *bug reports* and *feature requests*. Please do +not use it to ask questions about how to use Requests. These questions should +instead be directed to [Stack Overflow](https://stackoverflow.com/). Make sure +that your question is tagged with the `python-requests` tag when asking it on +Stack Overflow, to ensure that it is answered promptly and accurately. + +## Good Bug Reports + +Please be aware of the following things when filing bug reports: + +1. Avoid raising duplicate issues. *Please* use the GitHub issue search feature + to check whether your bug report or feature request has been mentioned in + the past. Duplicate bug reports and feature requests are a huge maintenance + burden on the limited resources of the project. If it is clear from your + report that you would have struggled to find the original, that's ok, but + if searching for a selection of words in your issue title would have found + the duplicate then the issue will likely be closed extremely abruptly. +2. When filing bug reports about exceptions or tracebacks, please include the + *complete* traceback. Partial tracebacks, or just the exception text, are + not helpful. Issues that do not contain complete tracebacks may be closed + without warning. +3. Make sure you provide a suitable amount of information to work with. This + means you should provide: + + - Guidance on **how to reproduce the issue**. Ideally, this should be a + *small* code sample that can be run immediately by the maintainers. + Failing that, let us know what you're doing, how often it happens, what + environment you're using, etc. Be thorough: it prevents us needing to ask + further questions. + - Tell us **what you expected to happen**. When we run your example code, + what are we expecting to happen? What does "success" look like for your + code? + - Tell us **what actually happens**. It's not helpful for you to say "it + doesn't work" or "it fails". Tell us *how* it fails: do you get an + exception? A hang? A non-200 status code? How was the actual result + different from your expected result? + - Tell us **what version of Requests you're using**, and + **how you installed it**. Different versions of Requests behave + differently and have different bugs, and some distributors of Requests + ship patches on top of the code we supply. + + If you do not provide all of these things, it will take us much longer to + fix your problem. If we ask you to clarify these and you never respond, we + will close your issue without fixing it. diff --git a/HISTORY.rst b/HISTORY.rst index 37d477c..dfb3e74 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -1,8 +1,835 @@ .. :changelog: -Release History +.. Release History + --------------- + +リリース履歴 --------------- +2.18.4 (2017-08-15) ++++++++++++++++++++ + +**改善** + +.. Error messages for invalid headers now include the header name for easier debugging + +- 無効なヘッダーのエラーメッセージにデバッグを容易にするヘッダー名が追加されました。 + +**依存** + +.. We now support idna v2.6. + +- idna のバージョン 2.6 をサポートしました。 + +2.18.3 (2017-08-02) ++++++++++++++++++++ + +**改善** + +.. Running ``$ python -m requests.help`` now includes the installed version of idna. + +- ``$ python -m requests.help`` を実行すると、インストールされているバージョンの idna が含まれるようになりました。 + +**バグフィックス** + +- Fixed issue where Requests would raise ``ConnectionError`` instead of + ``SSLError`` when encountering SSL problems when using urllib3 v1.22. + +2.18.2 (2017-07-25) ++++++++++++++++++++ + +**Bugfixes** + +- ``requests.help`` no longer fails on Python 2.6 due to the absence of + ``ssl.OPENSSL_VERSION_NUMBER``. + +**Dependencies** + +- We now support urllib3 v1.22. + +2.18.1 (2017-06-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fix an error in the packaging whereby the *.whl contained incorrect data that + regressed the fix in v2.17.3. + +2.18.0 (2017-06-14) ++++++++++++++++++++ + +**Improvements** + +- ``Response`` is now a context manager, so can be used directly in a ``with`` statement + without first having to be wrapped by ``contextlib.closing()``. + +**Bugfixes** + +- Resolve installation failure if multiprocessing is not available +- Resolve tests crash if multiprocessing is not able to determine the number of CPU cores +- Resolve error swallowing in utils set_environ generator + + +2.17.3 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.2 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.1 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Improved ``packages`` namespace identity support, for monkeypatching libraries. + + +2.17.0 (2017-05-29) ++++++++++++++++++++ + +**Improvements** + +- Removal of the 301 redirect cache. This improves thread-safety. + + +2.16.5 (2017-05-28) ++++++++++++++++++++ + +- Improvements to ``$ python -m requests.help``. + +2.16.4 (2017-05-27) ++++++++++++++++++++ + +- Introduction of the ``$ python -m requests.help`` command, for debugging with maintainers! + +2.16.3 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +2.16.2 (2017-05-27) ++++++++++++++++++++ + +- Further restored the ``requests.packages`` namespace for compatibility reasons. + +No code modification (noted below) should be neccessary any longer. + +2.16.1 (2017-05-27) ++++++++++++++++++++ + +- Restored the ``requests.packages`` namespace for compatibility reasons. +- Bugfix for ``urllib3`` version parsing. + +**Note**: code that was written to import against the ``requests.packages`` +namespace previously will have to import code that rests at this module-level +now. + +For example:: + + from requests.packages.urllib3.poolmanager import PoolManager + +Will need to be re-written to be:: + + from requests.packages import urllib3 + urllib3.poolmanager.PoolManager + +Or, even better:: + + from urllib3.poolmanager import PoolManager + +2.16.0 (2017-05-26) ++++++++++++++++++++ + +- Unvendor ALL the things! + +2.15.1 (2017-05-26) ++++++++++++++++++++ + +- Everyone makes mistakes. + +2.15.0 (2017-05-26) ++++++++++++++++++++ + +**Improvements** + +- Introduction of the ``Response.next`` property, for getting the next + ``PreparedResponse`` from a redirect chain (when ``allow_redirects=False``). +- Internal refactoring of ``__version__`` module. + +**Bugfixes** + +- Restored once-optional parameter for ``requests.utils.get_environ_proxies()``. + +2.14.2 (2017-05-10) ++++++++++++++++++++ + +**Bugfixes** + +- Changed a less-than to an equal-to and an or in the dependency markers to + widen compatibility with older setuptools releases. + +2.14.1 (2017-05-09) ++++++++++++++++++++ + +**Bugfixes** + +- Changed the dependency markers to widen compatibility with older pip + releases. + +2.14.0 (2017-05-09) ++++++++++++++++++++ + +**Improvements** + +- It is now possible to pass ``no_proxy`` as a key to the ``proxies`` + dictionary to provide handling similar to the ``NO_PROXY`` environment + variable. +- When users provide invalid paths to certificate bundle files or directories + Requests now raises ``IOError``, rather than failing at the time of the HTTPS + request with a fairly inscrutable certificate validation error. +- The behavior of ``SessionRedirectMixin`` was slightly altered. + ``resolve_redirects`` will now detect a redirect by calling + ``get_redirect_target(response)`` instead of directly + querying ``Response.is_redirect`` and ``Response.headers['location']``. + Advanced users will be able to process malformed redirects more easily. +- Changed the internal calculation of elapsed request time to have higher + resolution on Windows. +- Added ``win_inet_pton`` as conditional dependency for the ``[socks]`` extra + on Windows with Python 2.7. +- Changed the proxy bypass implementation on Windows: the proxy bypass + check doesn't use forward and reverse DNS requests anymore +- URLs with schemes that begin with ``http`` but are not ``http`` or ``https`` + no longer have their host parts forced to lowercase. + +**Bugfixes** + +- Much improved handling of non-ASCII ``Location`` header values in redirects. + Fewer ``UnicodeDecodeErrors`` are encountered on Python 2, and Python 3 now + correctly understands that Latin-1 is unlikely to be the correct encoding. +- If an attempt to ``seek`` file to find out its length fails, we now + appropriately handle that by aborting our content-length calculations. +- Restricted ``HTTPDigestAuth`` to only respond to auth challenges made on 4XX + responses, rather than to all auth challenges. +- Fixed some code that was firing ``DeprecationWarning`` on Python 3.6. +- The dismayed person emoticon (``/o\\``) no longer has a big head. I'm sure + this is what you were all worrying about most. + + +**Miscellaneous** + +- Updated bundled urllib3 to v1.21.1. +- Updated bundled chardet to v3.0.2. +- Updated bundled idna to v2.5. +- Updated bundled certifi to 2017.4.17. + +2.13.0 (2017-01-24) ++++++++++++++++++++ + +**Features** + +- Only load the ``idna`` library when we've determined we need it. This will + save some memory for users. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.20. +- Updated bundled idna to 2.2. + +2.12.5 (2017-01-18) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed an issue with JSON encoding detection, specifically detecting + big-endian UTF-32 with BOM. + +2.12.4 (2016-12-14) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from 2.12.2 where non-string types were rejected in the + basic auth parameters. While support for this behaviour has been readded, + the behaviour is deprecated and will be removed in the future. + +2.12.3 (2016-12-01) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed regression from v2.12.1 for URLs with schemes that begin with "http". + These URLs have historically been processed as though they were HTTP-schemed + URLs, and so have had parameters added. This was removed in v2.12.2 in an + overzealous attempt to resolve problems with IDNA-encoding those URLs. This + change was reverted: the other fixes for IDNA-encoding have been judged to + be sufficient to return to the behaviour Requests had before v2.12.0. + +2.12.2 (2016-11-30) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed several issues with IDNA-encoding URLs that are technically invalid but + which are widely accepted. Requests will now attempt to IDNA-encode a URL if + it can but, if it fails, and the host contains only ASCII characters, it will + be passed through optimistically. This will allow users to opt-in to using + IDNA2003 themselves if they want to, and will also allow technically invalid + but still common hostnames. +- Fixed an issue where URLs with leading whitespace would raise + ``InvalidSchema`` errors. +- Fixed an issue where some URLs without the HTTP or HTTPS schemes would still + have HTTP URL preparation applied to them. +- Fixed an issue where Unicode strings could not be used in basic auth. +- Fixed an issue encountered by some Requests plugins where constructing a + Response object would cause ``Response.content`` to raise an + ``AttributeError``. + +2.12.1 (2016-11-16) ++++++++++++++++++++ + +**Bugfixes** + +- Updated setuptools 'security' extra for the new PyOpenSSL backend in urllib3. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19.1. + +2.12.0 (2016-11-15) ++++++++++++++++++++ + +**Improvements** + +- Updated support for internationalized domain names from IDNA2003 to IDNA2008. + This updated support is required for several forms of IDNs and is mandatory + for .de domains. +- Much improved heuristics for guessing content lengths: Requests will no + longer read an entire ``StringIO`` into memory. +- Much improved logic for recalculating ``Content-Length`` headers for + ``PreparedRequest`` objects. +- Improved tolerance for file-like objects that have no ``tell`` method but + do have a ``seek`` method. +- Anything that is a subclass of ``Mapping`` is now treated like a dictionary + by the ``data=`` keyword argument. +- Requests now tolerates empty passwords in proxy credentials, rather than + stripping the credentials. +- If a request is made with a file-like object as the body and that request is + redirected with a 307 or 308 status code, Requests will now attempt to + rewind the body object so it can be replayed. + +**Bugfixes** + +- When calling ``response.close``, the call to ``close`` will be propagated + through to non-urllib3 backends. +- Fixed issue where the ``ALL_PROXY`` environment variable would be preferred + over scheme-specific variables like ``HTTP_PROXY``. +- Fixed issue where non-UTF8 reason phrases got severely mangled by falling + back to decoding using ISO 8859-1 instead. +- Fixed a bug where Requests would not correctly correlate cookies set when + using custom Host headers if those Host headers did not use the native + string type for the platform. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.19. +- Updated bundled certifi certs to 2016.09.26. + +2.11.1 (2016-08-17) ++++++++++++++++++++ + +**Bugfixes** + +- Fixed a bug when using ``iter_content`` with ``decode_unicode=True`` for + streamed bodies would raise ``AttributeError``. This bug was introduced in + 2.11. +- Strip Content-Type and Transfer-Encoding headers from the header block when + following a redirect that transforms the verb from POST/PUT to GET. + +2.11.0 (2016-08-08) ++++++++++++++++++++ + +**Improvements** + +- Added support for the ``ALL_PROXY`` environment variable. +- Reject header values that contain leading whitespace or newline characters to + reduce risk of header smuggling. + +**Bugfixes** + +- Fixed occasional ``TypeError`` when attempting to decode a JSON response that + occurred in an error case. Now correctly returns a ``ValueError``. +- Requests would incorrectly ignore a non-CIDR IP address in the ``NO_PROXY`` + environment variables: Requests now treats it as a specific IP. +- Fixed a bug when sending JSON data that could cause us to encounter obscure + OpenSSL errors in certain network conditions (yes, really). +- Added type checks to ensure that ``iter_content`` only accepts integers and + ``None`` for chunk sizes. +- Fixed issue where responses whose body had not been fully consumed would have + the underlying connection closed but not returned to the connection pool, + which could cause Requests to hang in situations where the ``HTTPAdapter`` + had been configured to use a blocking connection pool. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.16. +- Some previous releases accidentally accepted non-strings as acceptable header values. This release does not. + +2.10.0 (2016-04-29) ++++++++++++++++++++ + +**New Features** + +- SOCKS Proxy Support! (requires PySocks; ``$ pip install requests[socks]``) + +**Miscellaneous** + +- Updated bundled urllib3 to 1.15.1. + +2.9.2 (2016-04-29) +++++++++++++++++++ + +**Improvements** + +- Change built-in CaseInsensitiveDict (used for headers) to use OrderedDict + as its underlying datastore. + +**Bugfixes** + +- Don't use redirect_cache if allow_redirects=False +- When passed objects that throw exceptions from ``tell()``, send them via + chunked transfer encoding instead of failing. +- Raise a ProxyError for proxy related connection issues. + +2.9.1 (2015-12-21) +++++++++++++++++++ + +**Bugfixes** + +- Resolve regression introduced in 2.9.0 that made it impossible to send binary + strings as bodies in Python 3. +- Fixed errors when calculating cookie expiration dates in certain locales. + +**Miscellaneous** + +- Updated bundled urllib3 to 1.13.1. + +2.9.0 (2015-12-15) +++++++++++++++++++ + +**Minor Improvements** (Backwards compatible) + +- The ``verify`` keyword argument now supports being passed a path to a + directory of CA certificates, not just a single-file bundle. +- Warnings are now emitted when sending files opened in text mode. +- Added the 511 Network Authentication Required status code to the status code + registry. + +**Bugfixes** + +- For file-like objects that are not seeked to the very beginning, we now + send the content length for the number of bytes we will actually read, rather + than the total size of the file, allowing partial file uploads. +- When uploading file-like objects, if they are empty or have no obvious + content length we set ``Transfer-Encoding: chunked`` rather than + ``Content-Length: 0``. +- We correctly receive the response in buffered mode when uploading chunked + bodies. +- We now handle being passed a query string as a bytestring on Python 3, by + decoding it as UTF-8. +- Sessions are now closed in all cases (exceptional and not) when using the + functional API rather than leaking and waiting for the garbage collector to + clean them up. +- Correctly handle digest auth headers with a malformed ``qop`` directive that + contains no token, by treating it the same as if no ``qop`` directive was + provided at all. +- Minor performance improvements when removing specific cookies by name. + +**Miscellaneous** + +- Updated urllib3 to 1.13. + +2.8.1 (2015-10-13) +++++++++++++++++++ + +**Bugfixes** + +- Update certificate bundle to match ``certifi`` 2015.9.6.2's weak certificate + bundle. +- Fix a bug in 2.8.0 where requests would raise ``ConnectTimeout`` instead of + ``ConnectionError`` +- When using the PreparedRequest flow, requests will now correctly respect the + ``json`` parameter. Broken in 2.8.0. +- When using the PreparedRequest flow, requests will now correctly handle a + Unicode-string method name on Python 2. Broken in 2.8.0. + +2.8.0 (2015-10-05) +++++++++++++++++++ + +**Minor Improvements** (Backwards Compatible) + +- Requests now supports per-host proxies. This allows the ``proxies`` + dictionary to have entries of the form + ``{'://': ''}``. Host-specific proxies will be used + in preference to the previously-supported scheme-specific ones, but the + previous syntax will continue to work. +- ``Response.raise_for_status`` now prints the URL that failed as part of the + exception message. +- ``requests.utils.get_netrc_auth`` now takes an ``raise_errors`` kwarg, + defaulting to ``False``. When ``True``, errors parsing ``.netrc`` files cause + exceptions to be thrown. +- Change to bundled projects import logic to make it easier to unbundle + requests downstream. +- Changed the default User-Agent string to avoid leaking data on Linux: now + contains only the requests version. + +**Bugfixes** + +- The ``json`` parameter to ``post()`` and friends will now only be used if + neither ``data`` nor ``files`` are present, consistent with the + documentation. +- We now ignore empty fields in the ``NO_PROXY`` environment variable. +- Fixed problem where ``httplib.BadStatusLine`` would get raised if combining + ``stream=True`` with ``contextlib.closing``. +- Prevented bugs where we would attempt to return the same connection back to + the connection pool twice when sending a Chunked body. +- Miscellaneous minor internal changes. +- Digest Auth support is now thread safe. + +**Updates** + +- Updated urllib3 to 1.12. + +2.7.0 (2015-05-03) +++++++++++++++++++ + +This is the first release that follows our new release process. For more, see +`our documentation +`_. + +**Bugfixes** + +- Updated urllib3 to 1.10.4, resolving several bugs involving chunked transfer + encoding and response framing. + +2.6.2 (2015-04-23) +++++++++++++++++++ + +**Bugfixes** + +- Fix regression where compressed data that was sent as chunked data was not + properly decompressed. (#2561) + +2.6.1 (2015-04-22) +++++++++++++++++++ + +**Bugfixes** + +- Remove VendorAlias import machinery introduced in v2.5.2. + +- Simplify the PreparedRequest.prepare API: We no longer require the user to + pass an empty list to the hooks keyword argument. (c.f. #2552) + +- Resolve redirects now receives and forwards all of the original arguments to + the adapter. (#2503) + +- Handle UnicodeDecodeErrors when trying to deal with a unicode URL that + cannot be encoded in ASCII. (#2540) + +- Populate the parsed path of the URI field when performing Digest + Authentication. (#2426) + +- Copy a PreparedRequest's CookieJar more reliably when it is not an instance + of RequestsCookieJar. (#2527) + +2.6.0 (2015-03-14) +++++++++++++++++++ + +**Bugfixes** + +- CVE-2015-2296: Fix handling of cookies on redirect. Previously a cookie + without a host value set would use the hostname for the redirected URL + exposing requests users to session fixation attacks and potentially cookie + stealing. This was disclosed privately by Matthew Daley of + `BugFuzz `_. This affects all versions of requests from + v2.1.0 to v2.5.3 (inclusive on both ends). + +- Fix error when requests is an ``install_requires`` dependency and ``python + setup.py test`` is run. (#2462) + +- Fix error when urllib3 is unbundled and requests continues to use the + vendored import location. + +- Include fixes to ``urllib3``'s header handling. + +- Requests' handling of unvendored dependencies is now more restrictive. + +**Features and Improvements** + +- Support bytearrays when passed as parameters in the ``files`` argument. + (#2468) + +- Avoid data duplication when creating a request with ``str``, ``bytes``, or + ``bytearray`` input to the ``files`` argument. + +2.5.3 (2015-02-24) +++++++++++++++++++ + +**Bugfixes** + +- Revert changes to our vendored certificate bundle. For more context see + (#2455, #2456, and http://bugs.python.org/issue23476) + +2.5.2 (2015-02-23) +++++++++++++++++++ + +**Features and Improvements** + +- Add sha256 fingerprint support. (`shazow/urllib3#540`_) + +- Improve the performance of headers. (`shazow/urllib3#544`_) + +**Bugfixes** + +- Copy pip's import machinery. When downstream redistributors remove + requests.packages.urllib3 the import machinery will continue to let those + same symbols work. Example usage in requests' documentation and 3rd-party + libraries relying on the vendored copies of urllib3 will work without having + to fallback to the system urllib3. + +- Attempt to quote parts of the URL on redirect if unquoting and then quoting + fails. (#2356) + +- Fix filename type check for multipart form-data uploads. (#2411) + +- Properly handle the case where a server issuing digest authentication + challenges provides both auth and auth-int qop-values. (#2408) + +- Fix a socket leak. (`shazow/urllib3#549`_) + +- Fix multiple ``Set-Cookie`` headers properly. (`shazow/urllib3#534`_) + +- Disable the built-in hostname verification. (`shazow/urllib3#526`_) + +- Fix the behaviour of decoding an exhausted stream. (`shazow/urllib3#535`_) + +**Security** + +- Pulled in an updated ``cacert.pem``. + +- Drop RC4 from the default cipher list. (`shazow/urllib3#551`_) + +.. _shazow/urllib3#551: https://github.com/shazow/urllib3/pull/551 +.. _shazow/urllib3#549: https://github.com/shazow/urllib3/pull/549 +.. _shazow/urllib3#544: https://github.com/shazow/urllib3/pull/544 +.. _shazow/urllib3#540: https://github.com/shazow/urllib3/pull/540 +.. _shazow/urllib3#535: https://github.com/shazow/urllib3/pull/535 +.. _shazow/urllib3#534: https://github.com/shazow/urllib3/pull/534 +.. _shazow/urllib3#526: https://github.com/shazow/urllib3/pull/526 + +2.5.1 (2014-12-23) +++++++++++++++++++ + +**Behavioural Changes** + +- Only catch HTTPErrors in raise_for_status (#2382) + +**Bugfixes** + +- Handle LocationParseError from urllib3 (#2344) +- Handle file-like object filenames that are not strings (#2379) +- Unbreak HTTPDigestAuth handler. Allow new nonces to be negotiated (#2389) + +2.5.0 (2014-12-01) +++++++++++++++++++ + +**Improvements** + +- Allow usage of urllib3's Retry object with HTTPAdapters (#2216) +- The ``iter_lines`` method on a response now accepts a delimiter with which + to split the content (#2295) + +**Behavioural Changes** + +- Add deprecation warnings to functions in requests.utils that will be removed + in 3.0 (#2309) +- Sessions used by the functional API are always closed (#2326) +- Restrict requests to HTTP/1.1 and HTTP/1.0 (stop accepting HTTP/0.9) (#2323) + +**Bugfixes** + +- Only parse the URL once (#2353) +- Allow Content-Length header to always be overridden (#2332) +- Properly handle files in HTTPDigestAuth (#2333) +- Cap redirect_cache size to prevent memory abuse (#2299) +- Fix HTTPDigestAuth handling of redirects after authenticating successfully + (#2253) +- Fix crash with custom method parameter to Session.request (#2317) +- Fix how Link headers are parsed using the regular expression library (#2271) + +**Documentation** + +- Add more references for interlinking (#2348) +- Update CSS for theme (#2290) +- Update width of buttons and sidebar (#2289) +- Replace references of Gittip with Gratipay (#2282) +- Add link to changelog in sidebar (#2273) + +2.4.3 (2014-10-06) +++++++++++++++++++ + +**Bugfixes** + +- Unicode URL improvements for Python 2. +- Re-order JSON param for backwards compat. +- Automatically defrag authentication schemes from host/pass URIs. (`#2249 `_) + + +2.4.2 (2014-10-05) +++++++++++++++++++ + +**Improvements** + +- FINALLY! Add json parameter for uploads! (`#2258 `_) +- Support for bytestring URLs on Python 3.x (`#2238 `_) + +**Bugfixes** + +- Avoid getting stuck in a loop (`#2244 `_) +- Multiple calls to iter* fail with unhelpful error. (`#2240 `_, `#2241 `_) + +**Documentation** + +- Correct redirection introduction (`#2245 `_) +- Added example of how to send multiple files in one request. (`#2227 `_) +- Clarify how to pass a custom set of CAs (`#2248 `_) + + + +2.4.1 (2014-09-09) +++++++++++++++++++ + +- Now has a "security" package extras set, ``$ pip install requests[security]`` +- Requests will now use Certifi if it is available. +- Capture and re-raise urllib3 ProtocolError +- Bugfix for responses that attempt to redirect to themselves forever (wtf?). + + +2.4.0 (2014-08-29) +++++++++++++++++++ + +**Behavioral Changes** + +- ``Connection: keep-alive`` header is now sent automatically. + +**Improvements** + +- Support for connect timeouts! Timeout now accepts a tuple (connect, read) which is used to set individual connect and read timeouts. +- Allow copying of PreparedRequests without headers/cookies. +- Updated bundled urllib3 version. +- Refactored settings loading from environment -- new `Session.merge_environment_settings`. +- Handle socket errors in iter_content. + + +2.3.0 (2014-05-16) +++++++++++++++++++ + +**API Changes** + +- New ``Response`` property ``is_redirect``, which is true when the + library could have processed this response as a redirection (whether + or not it actually did). +- The ``timeout`` parameter now affects requests with both ``stream=True`` and + ``stream=False`` equally. +- The change in v2.0.0 to mandate explicit proxy schemes has been reverted. + Proxy schemes now default to ``http://``. +- The ``CaseInsensitiveDict`` used for HTTP headers now behaves like a normal + dictionary when references as string or viewed in the interpreter. + +**Bugfixes** + +- No longer expose Authorization or Proxy-Authorization headers on redirect. + Fix CVE-2014-1829 and CVE-2014-1830 respectively. +- Authorization is re-evaluated each redirect. +- On redirect, pass url as native strings. +- Fall-back to autodetected encoding for JSON when Unicode detection fails. +- Headers set to ``None`` on the ``Session`` are now correctly not sent. +- Correctly honor ``decode_unicode`` even if it wasn't used earlier in the same + response. +- Stop advertising ``compress`` as a supported Content-Encoding. +- The ``Response.history`` parameter is now always a list. +- Many, many ``urllib3`` bugfixes. + +2.2.1 (2014-01-23) +++++++++++++++++++ + +**Bugfixes** + +- Fixes incorrect parsing of proxy credentials that contain a literal or encoded '#' character. +- Assorted urllib3 fixes. + +2.2.0 (2014-01-09) +++++++++++++++++++ + +**API Changes** + +- New exception: ``ContentDecodingError``. Raised instead of ``urllib3`` + ``DecodeError`` exceptions. + +**Bugfixes** + +- Avoid many many exceptions from the buggy implementation of ``proxy_bypass`` on OS X in Python 2.6. +- Avoid crashing when attempting to get authentication credentials from ~/.netrc when running as a user without a home directory. +- Use the correct pool size for pools of connections to proxies. +- Fix iteration of ``CookieJar`` objects. +- Ensure that cookies are persisted over redirect. +- Switch back to using chardet, since it has merged with charade. + +2.1.0 (2013-12-05) +++++++++++++++++++ + +- Updated CA Bundle, of course. +- Cookies set on individual Requests through a ``Session`` (e.g. via ``Session.get()``) are no longer persisted to the ``Session``. +- Clean up connections when we hit problems during chunked upload, rather than leaking them. +- Return connections to the pool when a chunked upload is successful, rather than leaking it. +- Match the HTTPbis recommendation for HTTP 301 redirects. +- Prevent hanging when using streaming uploads and Digest Auth when a 401 is received. +- Values of headers set by Requests are now always the native string type. +- Fix previously broken SNI support. +- Fix accessing HTTP proxies using proxy authentication. +- Unencode HTTP Basic usernames and passwords extracted from URLs. +- Support for IP address ranges for no_proxy environment variable +- Parse headers correctly when users override the default ``Host:`` header. +- Avoid munging the URL in case of case-sensitive servers. +- Looser URL handling for non-HTTP/HTTPS urls. +- Accept unicode methods in Python 2.6 and 2.7. +- More resilient cookie handling. +- Make ``Response`` objects pickleable. +- Actually added MD5-sess to Digest Auth instead of pretending to like last time. +- Updated internal urllib3. +- Fixed @Lukasa's lack of taste. + +2.0.1 (2013-10-24) +++++++++++++++++++ + +- Updated included CA Bundle with new mistrusts and automated process for the future +- Added MD5-sess to Digest Auth +- Accept per-file headers in multipart file POST messages. +- Fixed: Don't send the full URL on CONNECT messages. +- Fixed: Correctly lowercase a redirect scheme. +- Fixed: Cookies not persisted when set via functional API. +- Fixed: Translate urllib3 ProxyError into a requests ProxyError derived from ConnectionError. +- Updated internal urllib3 and chardet. + 2.0.0 (2013-09-24) ++++++++++++++++++ @@ -67,6 +894,8 @@ Release History 1.2.1 (2013-05-20) ++++++++++++++++++ +- 301 and 302 redirects now change the verb to GET for all verbs, not just + POST, improving browser compatibility. - Python 3.3.2 compatibility - Always percent-encode location headers - Fix connection adapter matching to be most-specific first @@ -151,7 +980,7 @@ This is not a backwards compatible change. - Improved mime-compatible JSON handling - Proxy fixes - Path hack fixes -- Case-Insensistive Content-Encoding headers +- Case-Insensitive Content-Encoding headers - Support for CJK parameters in form posts @@ -187,7 +1016,7 @@ This is not a backwards compatible change. - Digest Authentication improvements. - Ensure proxy exclusions work properly. - Clearer UnicodeError exceptions. -- Automatic casting of URLs to tsrings (fURL and such) +- Automatic casting of URLs to strings (fURL and such) - Bugfixes. 0.13.6 (2012-08-06) @@ -238,8 +1067,8 @@ This is not a backwards compatible change. +++++++++++++++++++ - Removal of Requests.async in favor of `grequests `_ -- Allow disabling of cookie persistiance. -- New implimentation of safe_mode +- Allow disabling of cookie persistence. +- New implementation of safe_mode - cookies.get now supports default argument - Session cookies not saved when Session.request is called with return_response=False - Env: no_proxy support. @@ -348,15 +1177,18 @@ This is not a backwards compatible change. 0.10.1 (2012-01-23) +++++++++++++++++++ -* PYTHON 3 SUPPORT! -* Dropped 2.5 Support. (*Backwards Incompatible*) +.. PYTHON 3 SUPPORT! +.. Dropped 2.5 Support. (*Backwards Incompatible*) + +* Python 3 のサポート! +* Python 2.5 のサポート打ち切り (*後方互換性がない*) 0.10.0 (2012-01-21) +++++++++++++++++++ * ``Response.content`` is now bytes-only. (*Backwards Incompatible*) * New ``Response.text`` is unicode-only. -* If no ``Response.encoding`` is specified and ``chardet`` is available, ``Respoonse.text`` will guess an encoding. +* If no ``Response.encoding`` is specified and ``chardet`` is available, ``Response.text`` will guess an encoding. * Default to ISO-8859-1 (Western) encoding for "text" subtypes. * Removal of `decode_unicode`. (*Backwards Incompatible*) * New multiple-hooks system. @@ -418,8 +1250,11 @@ This is not a backwards compatible change. 0.8.6 (2011-12-18) ++++++++++++++++++ +.. Socket timeout fixes. +.. Proxy Authorization support. + * Socket timeout fixes. -* Proxy Authorization support. +* プロキシ認証のサポート 0.8.5 (2011-12-14) ++++++++++++++++++ @@ -429,7 +1264,10 @@ This is not a backwards compatible change. 0.8.4 (2011-12-11) ++++++++++++++++++ -* Prefetch bugfix. +.. Prefetch bugfix. +.. Added license to installed version. + +* プリフェッチのバグフィックス * Added license to installed version. 0.8.3 (2011-11-27) @@ -449,21 +1287,37 @@ This is not a backwards compatible change. 0.8.1 (2011-11-15) ++++++++++++++++++ +.. URL Request path fix +.. Proxy fix. +.. Timeouts fix. + * URL Request path fix -* Proxy fix. -* Timeouts fix. +* プロキシのバグフィックス +* タイムアウトのバグフィックス 0.8.0 (2011-11-13) ++++++++++++++++++ -* Keep-alive support! +.. Keep-alive support! +.. Complete removal of Urllib2 +.. Complete removal of Poster +.. Complete removal of CookieJars +.. New ConnectionError raising +.. Safe_mode for error catching +.. prefetch parameter for request methods +.. OPTION method +.. Async pool size throttling +.. File uploads send real names +.. Vendored in urllib3 + +* Keep-alive のサポート * Complete removal of Urllib2 * Complete removal of Poster * Complete removal of CookieJars * New ConnectionError raising * Safe_mode for error catching * prefetch parameter for request methods -* OPTION method +* OPTION メソッド * Async pool size throttling * File uploads send real names * Vendored in urllib3 @@ -471,53 +1325,67 @@ This is not a backwards compatible change. 0.7.6 (2011-11-07) ++++++++++++++++++ -* Digest authentication bugfix (attach query data to path) +.. Digest authentication bugfix (attach query data to path) + +* Digest 認証のバグフィックス (クエリデータをパスに付与) 0.7.5 (2011-11-04) ++++++++++++++++++ -* Response.content = None if there was an invalid repsonse. +* Response.content = None if there was an invalid response. * Redirection auth handling. 0.7.4 (2011-10-26) ++++++++++++++++++ -* Session Hooks fix. +.. Session Hooks fix. + +* セッションのフック機構のバグフィックス 0.7.3 (2011-10-23) ++++++++++++++++++ -* Digest Auth fix. +.. Digest Auth fix. +* Digest 認証のバグフィックス 0.7.2 (2011-10-23) ++++++++++++++++++ -* PATCH Fix. +.. PATCH Fix. +* PATCH のバグフィックス 0.7.1 (2011-10-23) ++++++++++++++++++ -* Move away from urllib2 authentication handling. -* Fully Remove AuthManager, AuthObject, &c. -* New tuple-based auth system with handler callbacks. +.. Move away from urllib2 authentication handling. +.. Fully Remove AuthManager, AuthObject, &c. +.. New tuple-based auth system with handler callbacks. +* Move away from urllib2 authentication handling. +* AuthManager、AuthObject、cを完全に削除 +* ハンドラコールバックを持つタプルベースの認証システムを新しく追加 0.7.0 (2011-10-22) ++++++++++++++++++ -* Sessions are now the primary interface. -* Deprecated InvalidMethodException. -* PATCH fix. -* New config system (no more global settings). +.. Sessions are now the primary interface. +.. Deprecated InvalidMethodException. +.. PATCH fix. +.. New config system (no more global settings). +* Sessions をメインのインターフェースに変更 +* InvalidMethodException を非推奨にした +* PATCH のバグフィックス +* 新しいコンフィグ機能(グローバルの設定はやめた) 0.6.6 (2011-10-19) ++++++++++++++++++ -* Session parameter bugfix (params merging). +.. Session parameter bugfix (params merging). +* セッションパラメータのバグフィックス (params のマージ) 0.6.5 (2011-10-18) ++++++++++++++++++ @@ -545,35 +1413,53 @@ This is not a backwards compatible change. 0.6.2 (2011-10-09) ++++++++++++++++++ -* GET/HEAD obeys allow_redirects=False. +.. GET/HEAD obeys allow_redirects=False. +* GET/HEAD リクエストは allow_redirects=False に従います。 0.6.1 (2011-08-20) ++++++++++++++++++ +.. Enhanced status codes experience ``\o/`` +.. Set a maximum number of redirects (``settings.max_redirects``) +.. Full Unicode URL support +.. Support for protocol-less redirects. +.. Allow for arbitrary request types. +.. Bugfixes + * Enhanced status codes experience ``\o/`` * Set a maximum number of redirects (``settings.max_redirects``) * Full Unicode URL support * Support for protocol-less redirects. -* Allow for arbitrary request types. -* Bugfixes - +* 任意のリクエストタイプを許可します。 +* バグフィックス 0.6.0 (2011-08-17) ++++++++++++++++++ -* New callback hook system -* New persistient sessions object and context manager +.. New callback hook system +.. New persistent sessions object and context manager +.. Transparent Dict-cookie handling +.. Status code reference object +.. Removed Response.cached +.. Added Response.request +.. All args are kwargs +.. Relative redirect support +.. HTTPError handling improvements +.. Improved https testing +.. Bugfixes + +* 新しいコールバックのフックシステム +* New persistent sessions object and context manager * Transparent Dict-cookie handling * Status code reference object -* Removed Response.cached -* Added Response.request +* Response.cached の削除 +* Response.request の追加 * All args are kwargs * Relative redirect support -* HTTPError handling improvements -* Improved https testing -* Bugfixes - +* HTTPError 処理の改良 +* HTTPS のテストの改良 +* バグフィックス 0.5.1 (2011-07-23) ++++++++++++++++++ @@ -591,24 +1477,36 @@ This is not a backwards compatible change. 0.5.0 (2011-06-21) ++++++++++++++++++ -* PATCH Support -* Support for Proxies -* HTTPBin Test Suite -* Redirect Fixes +.. PATCH Support +.. Support for Proxies +.. HTTPBin Test Suite +.. Redirect Fixes +.. settings.verbose stream writing +.. Querystrings for all methods +.. URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicitly raised +.. ``r.requests.get('hwe://blah'); r.raise_for_status()`` + +* PATCH のサポート +* プロキシのサポート +* HTTPBin を使ったテストスイート +* リダイレクト処理のバグ修正 * settings.verbose stream writing * Querystrings for all methods -* URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicity raised +* URLErrors (Connection Refused, Timeout, Invalid URLs) are treated as explicitly raised ``r.requests.get('hwe://blah'); r.raise_for_status()`` 0.4.1 (2011-05-22) ++++++++++++++++++ -* Improved Redirection Handling +.. Improved Redirection Handling +.. New 'allow_redirects' param for following non-GET/HEAD Redirects +.. Settings module refactoring + +* リダイレクト処理の改良 * New 'allow_redirects' param for following non-GET/HEAD Redirects * Settings module refactoring - 0.4.0 (2011-05-15) ++++++++++++++++++ @@ -629,10 +1527,13 @@ This is not a backwards compatible change. 0.3.3 (2011-05-12) ++++++++++++++++++ -* Request timeouts -* Unicode url-encoded data -* Settings context manager and module +.. Request timeouts +.. Unicode url-encoded data +.. Settings context manager and module +* リクエストのタイムアウト +* UnicodeのURLエンコードされたデータ +* Settings context manager and module 0.3.2 (2011-04-15) ++++++++++++++++++ @@ -644,10 +1545,13 @@ This is not a backwards compatible change. 0.3.1 (2011-04-01) ++++++++++++++++++ -* Cookie Changes -* Response.read() -* Poster fix +.. Cookie Changes +.. Response.read() +.. Poster fix +* Cookie の変更 +* Response.read() +* Poster のバグフィックス 0.3.0 (2011-02-25) ++++++++++++++++++ @@ -664,44 +1568,64 @@ This is not a backwards compatible change. 0.2.4 (2011-02-19) ++++++++++++++++++ -* Python 2.5 Support -* PyPy-c v1.4 Support -* Auto-Authentication tests -* Improved Request object constructor +.. Python 2.5 Support +.. PyPy-c v1.4 Support +.. Auto-Authentication tests +.. Improved Request object constructor + +* Python 2.5 のサポート +* PyPy-c v1.4 のサポート +* 自動認証テスト +* 改良したリクエストオブジェクトのコンストラクタ 0.2.3 (2011-02-15) ++++++++++++++++++ -* New HTTPHandling Methods - - Response.__nonzero__ (false if bad HTTP Status) - - Response.ok (True if expected HTTP Status) - - Response.error (Logged HTTPError if bad HTTP Status) - - Response.raise_for_status() (Raises stored HTTPError) +.. New HTTPHandling Methods +.. - Response.__nonzero__ (false if bad HTTP Status) +.. - Response.ok (True if expected HTTP Status) +.. - Response.error (Logged HTTPError if bad HTTP Status) +.. - Response.raise_for_status() (Raises stored HTTPError) +* 新しい HTTP 処理メソッド + - Response.__nonzero__ (良くない HTTP ステータスの場合は false) + - Response.ok (予期しない HTTP ステータスの場合は True) + - Response.error (良くない HTTP ステータスの場合は HTTPError をログとして記録します) + - Response.raise_for_status() (Raises stored HTTPError) 0.2.2 (2011-02-14) ++++++++++++++++++ -* Still handles request in the event of an HTTPError. (Issue #2) -* Eventlet and Gevent Monkeypatch support. -* Cookie Support (Issue #1) +.. Still handles request in the event of an HTTPError. (Issue #2) +.. Eventlet and Gevent Monkeypatch support. +.. Cookie Support (Issue #1) +* HTTPError が発生した場合にもリクエストの処理を続ける (Issue #2) +* Eventlet と Gevent Monkeypatch のサポート +* Cookie のサポート (Issue #1) 0.2.1 (2011-02-14) ++++++++++++++++++ -* Added file attribute to POST and PUT requests for multipart-encode file uploads. -* Added Request.url attribute for context and redirects +.. Added file attribute to POST and PUT requests for multipart-encode file uploads. +.. Added Request.url attribute for context and redirects + +* ファイル属性にマルチパートエンコードのファイルアップロードの POST と PUT リクエストを追加した +* コンテキストとリダイレクトに Request.url 属性を追加した 0.2.0 (2011-02-14) ++++++++++++++++++ -* Birth! +.. Birth! +* 公開! 0.0.1 (2011-02-13) ++++++++++++++++++ -* Frustration -* Conception +.. Frustration +.. Conception + +* フラストレーション +* コンセプト diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 index fb45b2c..db78ea6 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2013 Kenneth Reitz +Copyright 2017 Kenneth Reitz Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -10,4 +10,4 @@ Copyright 2013 Kenneth Reitz distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. diff --git a/MANIFEST.in b/MANIFEST.in old mode 100644 new mode 100755 index d8f7df0..2c0fb95 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1,2 @@ -include README.rst LICENSE NOTICE HISTORY.rst test_requests.py requirements.txt requests/cacert.pem \ No newline at end of file +include README.rst LICENSE NOTICE HISTORY.rst pytest.ini requirements.txt +recursive-include tests *.py diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..92d1c34 --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +.PHONY: docs +init: + pip install -r requirements.txt +test: + # This runs all of the tests, on both Python 2 and Python 3. + detox +ci: + py.test -n 8 --boxed --junitxml=report.xml + +test-readme: + @python setup.py check --restructuredtext --strict && ([ $$? -eq 0 ] && echo "README.rst and HISTORY.rst ok") || echo "Invalid markup in README.rst or HISTORY.rst!" + +flake8: + flake8 --ignore=E501,F401,E128,E402,E731,F821 requests + +coverage: + py.test --cov-config .coveragerc --verbose --cov-report term --cov-report xml --cov=requests tests + +publish: + pip install 'twine>=1.5.0' + python setup.py sdist bdist_wheel + twine upload dist/* + rm -fr build dist .egg requests.egg-info + +docs: + cd docs && make html + @echo "\033[95m\n\nBuild successful! View the docs homepage at docs/_build/html/index.html.\n\033[0m" \ No newline at end of file diff --git a/NOTICE b/NOTICE deleted file mode 100644 index 926498e..0000000 --- a/NOTICE +++ /dev/null @@ -1,95 +0,0 @@ -Requests includes some vendorized python libraries to ease installation. - -Urllib3 License -=============== - -This is the MIT license: http://www.opensource.org/licenses/mit-license.php - -Copyright 2008-2011 Andrey Petrov and contributors (see CONTRIBUTORS.txt), -Modifications copyright 2012 Kenneth Reitz. - -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. - -Charade License -================ - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -02110-1301 USA - - - -Bundle of CA Root Certificates -============================== - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Lesser General Public -License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public -License along with this library; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -02110-1301 - - -OAuthlib -======== - -Copyright (c) 2011 Idan Gazit 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: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. Neither the name of this project nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/README.rst b/README.rst old mode 100644 new mode 100755 index 5dccef3..37e736b --- a/README.rst +++ b/README.rst @@ -1,156 +1,119 @@ -.. Requests: HTTP for Humans - ========================= +Requests: HTTP for Humans +========================= -Requests: 人間のためのHTTP -===================================== +.. image:: https://img.shields.io/pypi/v/requests.svg + :target: https://pypi.python.org/pypi/requests -.. image:: https://badge.fury.io/py/requests.png - :target: http://badge.fury.io/py/requests +.. image:: https://img.shields.io/pypi/l/requests.svg + :target: https://pypi.python.org/pypi/requests -.. image:: https://travis-ci.org/kennethreitz/requests.png?branch=master - :target: https://travis-ci.org/kennethreitz/requests +.. image:: https://img.shields.io/pypi/pyversions/requests.svg + :target: https://pypi.python.org/pypi/requests -.. image:: https://pypip.in/d/requests/badge.png - :target: https://crate.io/packages/requests/ +.. image:: https://codecov.io/github/requests/requests/coverage.svg?branch=master + :target: https://codecov.io/github/requests/requests + :alt: codecov.io -.. Requests is an Apache2 Licensed HTTP library, written in Python, for human - beings. +.. image:: https://img.shields.io/github/contributors/requests/requests.svg + :target: https://github.com/requests/requests/graphs/contributors -Requestsは、人が使いやすいように設計されているPythonで書かれたApache2ライセンスのHTTPライブラリです。 +.. image:: https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg + :target: https://saythanks.io/to/kennethreitz -.. Most existing Python modules for sending HTTP requests are extremely - verbose and cumbersome. Python's builtin urllib2 module provides most of - the HTTP capabilities you should need, but the api is thoroughly broken. - It requires an enormous amount of work (even method overrides) to - perform the simplest of tasks. -冗長で扱うのが難しいHTTPリクエストを送信するためのPythonモジュールが既にたくさんあります。 -Pythonの組み込みのurllib2モジュールは、必要なHTTP機能がほとんど提供されていますが、APIがまともに使えません。 -簡単なことを行う(メソッドの上書きでさえ)のに、たくさんの作業量が必要になります。 +元文書: [requests/requests](https://github.com/requests/requests), [#a3d7cf3f27e74c28ef30f01e9f2e483570ab042e](https://github.com/requests/requests/tree/a3d7cf3f27e74c28ef30f01e9f2e483570ab042e) -.. Things shouldn't be this way. Not in Python. +このドキュメントは [Requests](http://docs.python-requests.org/) のドキュメントを翻訳したものです。 +翻訳の間違いなどの指摘は、[Issues](https://github.com/requests/requests-docs-jp/issues)に登録して頂けるとうれしいです。 -それはPython的ではないので、そんなに複雑にするべきではありません。 -.. code-block:: pycon +Requests is the only *Non-GMO* HTTP library for Python, safe for human +consumption. - >>> r = requests.get('https://api.github.com', auth=('user', 'pass')) +**Warning:** Recreational use of the Python standard library for HTTP may result in dangerous side-effects, +including: security vulnerabilities, verbose code, reinventing the wheel, +constantly reading documentation, depression, headaches, or even death. + +Behold, the power of Requests: + +.. code-block:: python + + >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) >>> r.status_code - 204 + 200 >>> r.headers['content-type'] - 'application/json' + 'application/json; charset=utf8' + >>> r.encoding + 'utf-8' >>> r.text - ... - -.. See `the same code, without Requests `_. - -`Requestsを使わずに同じ事をするときのコード `_ を見て下さい。 - -.. Requests allow you to send HTTP/1.1 requests. You can add headers, form data, - multipart files, and parameters with simple Python dictionaries, and access the - response data in the same way. It's powered by httplib and `urllib3 - `_, but it does all the hard work and crazy - hacks for you. - -Requestsは、HTTP/1.1のリクエストを送信することができます。 -ヘッダー、フォームデータ、マルチパートファイル、簡単なPythonの辞書形式でパラメータを添付することができ、 -同じ方法でレスポンスデータにアクセスすることができます。 -httplibや `urllib3 `_ が一緒に組み込まれていますが、 -面倒な作業などは全てRequestsでやってくれます。 - - -.. Features - -------- - -機能 ------------ - -.. International Domains and URLs -.. Keep-Alive & Connection Pooling -.. Sessions with Cookie Persistence -.. Browser-style SSL Verification -.. Basic/Digest Authentication -.. Elegant Key/Value Cookies -.. Automatic Decompression -.. Unicode Response Bodies -.. Multipart File Uploads -.. Connection Timeouts -.. Thread-safety -.. HTTP(S) proxy support - -- ドメインとURLの国際化 -- Keep-Aliveとコネクションプーリング -- Cookieによるセッションの永続化 -- ブラウザのようなSSLによる接続 -- ベーシック/ダイジェスト認証 -- エレガントなキー/バリューによるCookie -- 圧縮の自動的な展開 -- レスポンスの本文のユニコード化 -- マルチパートファイルのアップロード -- コネクションのタイムアウト -- スレッドセーフ -- HTTP(S)プロキシのサポート - - -.. Installation - ------------ - -インストール ---------------- + u'{"type":"User"...' + >>> r.json() + {u'disk_usage': 368627, u'private_gists': 484, ...} -.. To install Requests, simply: +See `the similar code, sans Requests `_. -Requestsをインストールするのは簡単です。 +.. image:: https://raw.githubusercontent.com/requests/requests/master/docs/_static/requests-logo-small.png + :target: http://docs.python-requests.org/ -.. code-block:: bash - $ pip install requests +Requests allows you to send *organic, grass-fed* HTTP/1.1 requests, without the +need for manual labor. There's no need to manually add query strings to your +URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling +are 100% automatic, thanks to `urllib3 `_. -.. Or, if you absolutely must: +Besides, all the cool kids are doing it. Requests is one of the most +downloaded Python packages of all time, pulling in over 11,000,000 downloads +every month. You don't want to be left out! -もしくは、以下でも同じです。 - -.. code-block:: bash +Feature Support +--------------- - $ easy_install requests +Requests is ready for today's web. -.. But, you really shouldn't do that. +- International Domains and URLs +- Keep-Alive & Connection Pooling +- Sessions with Cookie Persistence +- Browser-style SSL Verification +- Basic/Digest Authentication +- Elegant Key/Value Cookies +- Automatic Decompression +- Automatic Content Decoding +- Unicode Response Bodies +- Multipart File Uploads +- HTTP(S) Proxy Support +- Connection Timeouts +- Streaming Downloads +- ``.netrc`` Support +- Chunked Requests -しかし、easy_installを使うべきではない。 +Requests officially supports Python 2.6–2.7 & 3.3–3.7, and runs great on PyPy. +Installation +------------ -.. Documentation - ------------- +To install Requests, simply: -ドキュメント ----------------- +.. code-block:: bash -.. Documentation is available at http://docs.python-requests.org/. + $ pip install requests + ✨🍰✨ -ドキュメントは、http://docs.python-requests.org/ で確認することができます。 +Satisfaction guaranteed. +Documentation +------------- -.. Contribute - ---------- +Fantastic documentation is available at http://docs.python-requests.org/, for a limited time only. -コントリビュート ---------------------- -.. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a `Contributor Friendly`_ tag for issues that should be ideal for people who are not very familiar with the codebase yet. -.. If you feel uncomfortable or uncertain about an issue or your changes, feel free to email @sigmavirus24 and he will happily help you via email, Skype, remote pairing or whatever you are comfortable with. -.. Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it). -.. Write a test which shows that the bug was fixed or that the feature works as expected. -.. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. +How to Contribute +----------------- -#. 公開されているissueの一覧をチェックするか、機能のアイデアやバグに関するディスカッションをするための新しいissueを作成して下さい。 - まだコードに精通していない人にとって持って来いの `Contributor Friendly`_ タグがあります。 -#. If you feel uncomfortable or uncertain about an issue or your changes, feel free to email @sigmavirus24 and he will happily help you via email, Skype, remote pairing or whatever you are comfortable with. -#. **master** ブランチ(もしくはそれから派生したブランチ)に修正を加えるために、 - Githubの `リポジトリ `_ をフォークして下さい。 -#. 期待している通りに動くか修正したバグが分かるようなテストを書く。 -#. プルリクエストを送るとバグのメンテナーがマージして公開します。 - `AUTHORS `_ に追加されるでしょう。 +#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. There is a `Contributor Friendly`_ tag for issues that should be ideal for people who are not very familiar with the codebase yet. +#. Fork `the repository`_ on GitHub to start making your changes to the **master** branch (or branch off of it). +#. Write a test which shows that the bug was fixed or that the feature works as expected. +#. Send a pull request and bug the maintainer until it gets merged and published. :) Make sure to add yourself to AUTHORS_. -.. _`the repository`: http://github.com/kennethreitz/requests -.. _AUTHORS: https://github.com/kennethreitz/requests/blob/master/AUTHORS.rst -.. _Contributor Friendly: https://github.com/kennethreitz/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open \ No newline at end of file +.. _`the repository`: http://github.com/requests/requests +.. _AUTHORS: https://github.com/requests/requests/blob/master/AUTHORS.rst +.. _Contributor Friendly: https://github.com/requests/requests/issues?direction=desc&labels=Contributor+Friendly&page=1&sort=updated&state=open diff --git a/_appveyor/install.ps1 b/_appveyor/install.ps1 new file mode 100755 index 0000000..94d6f01 --- /dev/null +++ b/_appveyor/install.ps1 @@ -0,0 +1,229 @@ +# Sample script to install Python and pip under Windows +# Authors: Olivier Grisel, Jonathan Helmus, Kyle Kastner, and Alex Willmer +# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ + +$MINICONDA_URL = "http://repo.continuum.io/miniconda/" +$BASE_URL = "https://www.python.org/ftp/python/" +$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py" +$GET_PIP_PATH = "C:\get-pip.py" + +$PYTHON_PRERELEASE_REGEX = @" +(?x) +(?\d+) +\. +(?\d+) +\. +(?\d+) +(?[a-z]{1,2}\d+) +"@ + + +function Download ($filename, $url) { + $webclient = New-Object System.Net.WebClient + + $basedir = $pwd.Path + "\" + $filepath = $basedir + $filename + if (Test-Path $filename) { + Write-Host "Reusing" $filepath + return $filepath + } + + # Download and retry up to 3 times in case of network transient errors. + Write-Host "Downloading" $filename "from" $url + $retry_attempts = 2 + for ($i = 0; $i -lt $retry_attempts; $i++) { + try { + $webclient.DownloadFile($url, $filepath) + break + } + Catch [Exception]{ + Start-Sleep 1 + } + } + if (Test-Path $filepath) { + Write-Host "File saved at" $filepath + } else { + # Retry once to get the error message if any at the last try + $webclient.DownloadFile($url, $filepath) + } + return $filepath +} + + +function ParsePythonVersion ($python_version) { + if ($python_version -match $PYTHON_PRERELEASE_REGEX) { + return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro, + $matches.prerelease) + } + $version_obj = [version]$python_version + return ($version_obj.major, $version_obj.minor, $version_obj.build, "") +} + + +function DownloadPython ($python_version, $platform_suffix) { + $major, $minor, $micro, $prerelease = ParsePythonVersion $python_version + + if (($major -le 2 -and $micro -eq 0) ` + -or ($major -eq 3 -and $minor -le 2 -and $micro -eq 0) ` + ) { + $dir = "$major.$minor" + $python_version = "$major.$minor$prerelease" + } else { + $dir = "$major.$minor.$micro" + } + + if ($prerelease) { + if (($major -le 2) ` + -or ($major -eq 3 -and $minor -eq 1) ` + -or ($major -eq 3 -and $minor -eq 2) ` + -or ($major -eq 3 -and $minor -eq 3) ` + ) { + $dir = "$dir/prev" + } + } + + if (($major -le 2) -or ($major -le 3 -and $minor -le 4)) { + $ext = "msi" + if ($platform_suffix) { + $platform_suffix = ".$platform_suffix" + } + } else { + $ext = "exe" + if ($platform_suffix) { + $platform_suffix = "-$platform_suffix" + } + } + + $filename = "python-$python_version$platform_suffix.$ext" + $url = "$BASE_URL$dir/$filename" + $filepath = Download $filename $url + return $filepath +} + + +function InstallPython ($python_version, $architecture, $python_home) { + Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home + if (Test-Path $python_home) { + Write-Host $python_home "already exists, skipping." + return $false + } + if ($architecture -eq "32") { + $platform_suffix = "" + } else { + $platform_suffix = "amd64" + } + $installer_path = DownloadPython $python_version $platform_suffix + $installer_ext = [System.IO.Path]::GetExtension($installer_path) + Write-Host "Installing $installer_path to $python_home" + $install_log = $python_home + ".log" + if ($installer_ext -eq '.msi') { + InstallPythonMSI $installer_path $python_home $install_log + } else { + InstallPythonEXE $installer_path $python_home $install_log + } + if (Test-Path $python_home) { + Write-Host "Python $python_version ($architecture) installation complete" + } else { + Write-Host "Failed to install Python in $python_home" + Get-Content -Path $install_log + Exit 1 + } +} + + +function InstallPythonEXE ($exepath, $python_home, $install_log) { + $install_args = "/quiet InstallAllUsers=1 TargetDir=$python_home" + RunCommand $exepath $install_args +} + + +function InstallPythonMSI ($msipath, $python_home, $install_log) { + $install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home" + $uninstall_args = "/qn /x $msipath" + RunCommand "msiexec.exe" $install_args + if (-not(Test-Path $python_home)) { + Write-Host "Python seems to be installed else-where, reinstalling." + RunCommand "msiexec.exe" $uninstall_args + RunCommand "msiexec.exe" $install_args + } +} + +function RunCommand ($command, $command_args) { + Write-Host $command $command_args + Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru +} + + +function InstallPip ($python_home) { + $pip_path = $python_home + "\Scripts\pip.exe" + $python_path = $python_home + "\python.exe" + if (-not(Test-Path $pip_path)) { + Write-Host "Installing pip..." + $webclient = New-Object System.Net.WebClient + $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH) + Write-Host "Executing:" $python_path $GET_PIP_PATH + & $python_path $GET_PIP_PATH + } else { + Write-Host "pip already installed." + } +} + + +function DownloadMiniconda ($python_version, $platform_suffix) { + if ($python_version -eq "3.4") { + $filename = "Miniconda3-3.5.5-Windows-" + $platform_suffix + ".exe" + } else { + $filename = "Miniconda-3.5.5-Windows-" + $platform_suffix + ".exe" + } + $url = $MINICONDA_URL + $filename + $filepath = Download $filename $url + return $filepath +} + + +function InstallMiniconda ($python_version, $architecture, $python_home) { + Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home + if (Test-Path $python_home) { + Write-Host $python_home "already exists, skipping." + return $false + } + if ($architecture -eq "32") { + $platform_suffix = "x86" + } else { + $platform_suffix = "x86_64" + } + $filepath = DownloadMiniconda $python_version $platform_suffix + Write-Host "Installing" $filepath "to" $python_home + $install_log = $python_home + ".log" + $args = "/S /D=$python_home" + Write-Host $filepath $args + Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru + if (Test-Path $python_home) { + Write-Host "Python $python_version ($architecture) installation complete" + } else { + Write-Host "Failed to install Python in $python_home" + Get-Content -Path $install_log + Exit 1 + } +} + + +function InstallMinicondaPip ($python_home) { + $pip_path = $python_home + "\Scripts\pip.exe" + $conda_path = $python_home + "\Scripts\conda.exe" + if (-not(Test-Path $pip_path)) { + Write-Host "Installing pip..." + $args = "install --yes pip" + Write-Host $conda_path $args + Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru + } else { + Write-Host "pip already installed." + } +} + +function main () { + InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON + InstallPip $env:PYTHON +} + +main \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100755 index 0000000..4f06557 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,51 @@ +# AppVeyor.yml from https://github.com/ogrisel/python-appveyor-demo +# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ + +build: off + +environment: + matrix: + - PYTHON: "C:\\Python27-x64" + PYTHON_VERSION: "2.7.x" + PYTHON_ARCH: "64" + TOXENV: "py27" + + - PYTHON: "C:\\Python34-x64" + PYTHON_VERSION: "3.4.x" + PYTHON_ARCH: "64" + TOXENV: "py34" + + - PYTHON: "C:\\Python35-x64" + PYTHON_VERSION: "3.5.x" + PYTHON_ARCH: "64" + TOXENV: "py35" + + - PYTHON: "C:\\Python36-x64" + PYTHON_VERSION: "3.6.x" + PYTHON_ARCH: "64" + TOXENV: "py36" + +install: + # Install Python (from the official .msi of http://python.org) and pip when + # not already installed. + - ps: if (-not(Test-Path($env:PYTHON))) { & _appveyor\install.ps1 } + + # Prepend newly installed Python to the PATH of this build (this cannot be + # done from inside the powershell script as it would require to restart + # the parent CMD process). + - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" + + # Check that we have the expected version and architecture for Python + - "python --version" + - "python -c \"import struct; print(struct.calcsize('P') * 8)\"" + + # Upgrade to the latest version of pip to avoid it displaying warnings + # about it being out of date. + - "pip install --disable-pip-version-check --user --upgrade pip" + - "C:\\MinGW\\bin\\mingw32-make" + +test_script: + - "C:\\MinGW\\bin\\mingw32-make coverage" + +on_success: + - "codecov -f coverage.xml" diff --git a/docs/MANIFEST.in b/docs/MANIFEST.in deleted file mode 100644 index fb1021b..0000000 --- a/docs/MANIFEST.in +++ /dev/null @@ -1 +0,0 @@ -include HISTORY.rst README.rst LICENSE \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile old mode 100644 new mode 100755 index b55712b..08a2acf --- a/docs/Makefile +++ b/docs/Makefile @@ -7,6 +7,11 @@ SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter @@ -14,8 +19,7 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - +.PHONY: help help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @@ -25,76 +29,101 @@ help: @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" +.PHONY: clean clean: - -rm -rf $(BUILDDIR)/* + rm -rf $(BUILDDIR)/* +.PHONY: html html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." +.PHONY: dirhtml dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." +.PHONY: singlehtml singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." +.PHONY: pickle pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." +.PHONY: json json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." +.PHONY: htmlhelp htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." +.PHONY: qthelp qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/requests-docs-ja.qhcp" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Requests.qhcp" @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/requests-docs-ja.qhc" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Requests.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." +.PHONY: devhelp devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/requests-docs-ja" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/requests-docs-ja" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Requests" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Requests" @echo "# devhelp" +.PHONY: epub epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." +.PHONY: latex latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @@ -102,22 +131,33 @@ latex: @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." +.PHONY: latexpdf latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." +.PHONY: man man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." +.PHONY: texinfo texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @@ -125,29 +165,52 @@ texinfo: @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." +.PHONY: info info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." +.PHONY: gettext gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." +.PHONY: changes changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." +.PHONY: linkcheck linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." +.PHONY: doctest doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100755 index 0000000..7e11992 --- /dev/null +++ b/docs/_static/custom.css @@ -0,0 +1,45 @@ +body { + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +#carbonads { + display: block; + overflow: hidden; + padding: 1em; + background-color: #eeeeee; + text-align: center; + border: solid 1px #cccccc; + margin: 1.5em 0 2em; + border-radius: 2px; + line-height: 1.5; +} + +#carbonads a { + border-bottom: 0; +} + +#carbonads span { + display: block; + overflow: hidden; +} + +.carbon-img { + display: block; + margin: 0 auto 1em; + text-align: center; +} + +.carbon-text { + display: block; + margin-bottom: 1em; +} + +.carbon-poweredby { + display: block; + text-transform: uppercase; + letter-spacing: 1px; + line-height: 1; + font-size: 10px; +} diff --git a/docs/_static/konami.js b/docs/_static/konami.js new file mode 100755 index 0000000..d72cf9d --- /dev/null +++ b/docs/_static/konami.js @@ -0,0 +1,116 @@ +/* + * Konami-JS ~ + * :: Now with support for touch events and multiple instances for + * :: those situations that call for multiple easter eggs! + * Code: http://konami-js.googlecode.com/ + * Examples: http://www.snaptortoise.com/konami-js + * Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com) + * Version: 1.4.2 (9/2/2013) + * Licensed under the MIT License (http://opensource.org/licenses/MIT) + * Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1 and Dolphin Browser + */ + +var Konami = function (callback) { + var konami = { + addEvent: function (obj, type, fn, ref_obj) { + if (obj.addEventListener) + obj.addEventListener(type, fn, false); + else if (obj.attachEvent) { + // IE + obj["e" + type + fn] = fn; + obj[type + fn] = function () { + obj["e" + type + fn](window.event, ref_obj); + }; + obj.attachEvent("on" + type, obj[type + fn]); + } + }, + input: "", + pattern: "38384040373937396665", + load: function (link) { + this.addEvent(document, "keydown", function (e, ref_obj) { + if (ref_obj) konami = ref_obj; // IE + konami.input += e ? e.keyCode : event.keyCode; + if (konami.input.length > konami.pattern.length) + konami.input = konami.input.substr((konami.input.length - konami.pattern.length)); + if (konami.input == konami.pattern) { + konami.code(link); + konami.input = ""; + e.preventDefault(); + return false; + } + }, this); + this.iphone.load(link); + }, + code: function (link) { + window.location = link + }, + iphone: { + start_x: 0, + start_y: 0, + stop_x: 0, + stop_y: 0, + tapTolerance: 8, + capture: false, + orig_keys: "", + keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"], + code: function (link) { + konami.code(link); + }, + touchCapture: function(evt) { + konami.iphone.start_x = evt.changedTouches[0].pageX; + konami.iphone.start_y = evt.changedTouches[0].pageY; + konami.iphone.capture = true; + }, + load: function (link) { + this.orig_keys = this.keys; + konami.addEvent(document, "touchmove", function (e) { + if (e.touches.length == 1 && konami.iphone.capture == true) { + var touch = e.touches[0]; + konami.iphone.stop_x = touch.pageX; + konami.iphone.stop_y = touch.pageY; + konami.iphone.check_direction(); + } + }); + konami.addEvent(document, "touchend", function (evt) { + konami.touchCapture(evt); + konami.iphone.check_direction(link); + }, false); + konami.addEvent(document, "touchstart", function (evt) { + konami.touchCapture(evt); + }); + }, + check_direction: function (link) { + var x_magnitude = Math.abs(this.start_x - this.stop_x); + var y_magnitude = Math.abs(this.start_y - this.stop_y); + var hasMoved = (x_magnitude > this.tapTolerance || y_magnitude > this.tapTolerance); + var result; + if (this.capture === true && hasMoved) { + this.capture = false; + var x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT"; + var y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP"; + var result = (x_magnitude > y_magnitude) ? x : y; + } + else if (this.capture === false && !hasMoved) { + result = (this.tap == true) ? "TAP" : result; + result = "TAP"; + } + if (result) { + if (result == this.keys[0]) this.keys = this.keys.slice(1, this.keys.length); + else this.keys = this.orig_keys; + } + if (this.keys.length == 0) { + this.keys = this.orig_keys; + this.code(link); + } + } + } + } + + typeof callback === "string" && konami.load(callback); + if (typeof callback === "function") { + konami.code = callback; + konami.load(); + } + + return konami; +}; diff --git a/docs/_static/requests-logo-small.png b/docs/_static/requests-logo-small.png new file mode 100755 index 0000000..afadeaa Binary files /dev/null and b/docs/_static/requests-logo-small.png differ diff --git a/docs/_static/requests-sidebar.png b/docs/_static/requests-sidebar.png old mode 100644 new mode 100755 index 88a8147..d2b8a69 Binary files a/docs/_static/requests-sidebar.png and b/docs/_static/requests-sidebar.png differ diff --git a/docs/_templates/hacks.html b/docs/_templates/hacks.html new file mode 100755 index 0000000..f9fc96c --- /dev/null +++ b/docs/_templates/hacks.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_templates/sidebarintro.html b/docs/_templates/sidebarintro.html old mode 100644 new mode 100755 index be4e1ba..bf1e8a0 --- a/docs/_templates/sidebarintro.html +++ b/docs/_templates/sidebarintro.html @@ -1,55 +1,70 @@

-

- Requestsは人が使いやすいように作られた、エレガントでシンプルなPythonのHTTPライブラリです。 + Requests は、人が使いやすいように作られた Python のエレガントでシンプルな HTTP ライブラリです。

+ -

寄付

-

- Requestsを気に入ってもらえたら、 - Gittipで作者に対するサポートを検討してみてください。 -

-

- -

+

Stay Informed

-

- 会社でRequestsを使っている場合、経済的なサポートを考えている場合 -

-

- Requests Pro -

+

新しいリリースやプロジェクトの予定等のお知らせを受け取るには:

+

+ +

+

Say Thanks!

+

Join Mailing List.

-

翻訳プロジェクト

- + + +

他の言語

+ + diff --git a/docs/_templates/sidebarlogo.html b/docs/_templates/sidebarlogo.html old mode 100644 new mode 100755 index 31f56fd..12a2974 --- a/docs/_templates/sidebarlogo.html +++ b/docs/_templates/sidebarlogo.html @@ -1,33 +1,60 @@

-

- Requestsは人が使いやすいように作られた、エレガントでシンプルなPythonのHTTPライブラリです。 - 現在見ているのは、開発版のドキュメントです。 + Requests は、人が使いやすいように作られた Python のエレガントでシンプルな HTTP ライブラリです。 + 現在見ているのは開発版のドキュメンテーションです。

-

寄付

-

- Requestsを気に入ってもらえたら、 - Gittipで作者に対するサポートを検討してみてください。 -

-

- -

+

Stay Informed

+

新しいリリースやプロジェクトの予定等のお知らせを受け取るには:

-

- 会社でRequestsを使っている場合、経済的なサポートを考えている場合 -

+

Join Mailing List.

-

- Requests Pro -

+
+ + + +

If you enjoy using this project, Say Thanks!

+ +

+ +

+ + +

他のプロジェクト

+ +

Kenneth Reitz の他のプロジェクト:

+ + + +

他の言語

+ + diff --git a/docs/_themes/.gitignore b/docs/_themes/.gitignore new file mode 100755 index 0000000..66b6e4c --- /dev/null +++ b/docs/_themes/.gitignore @@ -0,0 +1,3 @@ +*.pyc +*.pyo +.DS_Store diff --git a/docs/_themes/LICENSE b/docs/_themes/LICENSE old mode 100644 new mode 100755 diff --git a/docs/_themes/README.rst b/docs/_themes/README.rst deleted file mode 100644 index dd8d7c0..0000000 --- a/docs/_themes/README.rst +++ /dev/null @@ -1,25 +0,0 @@ -krTheme Sphinx Style -==================== - -This repository contains sphinx styles Kenneth Reitz uses in most of -his projects. It is a derivative of Mitsuhiko's themes for Flask and Flask related -projects. To use this style in your Sphinx documentation, follow -this guide: - -1. put this folder as _themes into your docs folder. Alternatively - you can also use git submodules to check out the contents there. - -2. add this to your conf.py: :: - - sys.path.append(os.path.abspath('_themes')) - html_theme_path = ['_themes'] - html_theme = 'flask' - -The following themes exist: - -**kr** - the standard flask documentation theme for large projects - -**kr_small** - small one-page theme. Intended to be used by very small addon libraries. - diff --git a/docs/_themes/flask_theme_support.py b/docs/_themes/flask_theme_support.py old mode 100644 new mode 100755 diff --git a/docs/_themes/kr/layout.html b/docs/_themes/kr/layout.html deleted file mode 100644 index f931239..0000000 --- a/docs/_themes/kr/layout.html +++ /dev/null @@ -1,71 +0,0 @@ -{%- extends "basic/layout.html" %} -{%- block extrahead %} - {{ super() }} - {% if theme_touch_icon %} - - {% endif %} - -{% endblock %} -{%- block relbar2 %}{% endblock %} -{%- block footer %} - - - Fork me on GitHub - - - - - - - - - - - - -{%- endblock %} diff --git a/docs/_themes/kr/relations.html b/docs/_themes/kr/relations.html deleted file mode 100644 index 3bbcde8..0000000 --- a/docs/_themes/kr/relations.html +++ /dev/null @@ -1,19 +0,0 @@ -

Related Topics

- diff --git a/docs/_themes/kr/static/flasky.css_t b/docs/_themes/kr/static/flasky.css_t deleted file mode 100644 index 431eb90..0000000 --- a/docs/_themes/kr/static/flasky.css_t +++ /dev/null @@ -1,537 +0,0 @@ -@charset "utf-8"; -/* - * flasky.css_t - * ~~~~~~~~~~~~ - * - * :copyright: Copyright 2010 by Armin Ronacher. Modifications by Kenneth Reitz. - * :license: Flask Design License, see LICENSE for details. - */ - -{% set page_width = '940px' %} -{% set sidebar_width = '220px' %} - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: "Hiragino Mincho Pro","Hiragino Kaku Gothic Pro","ヒラギノ角ゴ Pro W3",Meiryo,"メイリオ",Osaka,"MS P明朝",sans-serif; - font-size: 17px; - background-color: white; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - width: {{ page_width }}; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 {{ sidebar_width }}; -} - -div.sphinxsidebar { - width: {{ sidebar_width }}; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #ffffff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -img.floatingflask { - padding: 0 0 10px 10px; - float: right; -} - -div.footer { - width: {{ page_width }}; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -div.related { - display: none; -} - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebar { - font-size: 14px; - line-height: 1.5; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 -20px; - text-align: center; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: "Hiragino Mincho Pro","Hiragino Kaku Gothic Pro","ヒラギノ角ゴ Pro W3",Meiryo,"メイリオ",Osaka,"MS P明朝",sans-serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar input { - border: 1px solid #ccc; - font-family: 'Georgia', serif; - font-size: 1em; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: "Hiragino Mincho Pro","Hiragino Kaku Gothic Pro","ヒラギノ角ゴ Pro W3",Meiryo,"メイリオ",Osaka,"MS P明朝",sans-serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #ddd; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #eaeaea; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - background: #fafafa; - margin: 20px -30px; - padding: 10px 30px; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} - -div.admonition tt.xref, div.admonition a tt { - border-bottom: 1px solid #fafafa; -} - -dd div.admonition { - margin-left: -60px; - padding-left: 60px; -} - -div.admonition p.admonition-title { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: white; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt { - font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -img.screenshot { -} - -tt.descname, tt.descclassname { - font-size: 0.95em; -} - -tt.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #eee; - background: #fdfdfd; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.footnote td.label { - width: 0px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #eee; - padding: 7px 30px; - margin: 15px -30px; - line-height: 1.3em; -} - -dl pre, blockquote pre, li pre { - margin-left: -60px; - padding-left: 60px; -} - -dl dl pre { - margin-left: -90px; - padding-left: 90px; -} - -tt { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid white; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: white; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: white; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: white; - } - - div.sphinxsidebar a { - color: #aaa; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.related { - display: block; - margin: 0; - padding: 10px 0 20px 0; - } - - div.related ul, - div.related ul li { - margin: 0; - padding: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} \ No newline at end of file diff --git a/docs/_themes/kr/theme.conf b/docs/_themes/kr/theme.conf deleted file mode 100644 index 07698f6..0000000 --- a/docs/_themes/kr/theme.conf +++ /dev/null @@ -1,7 +0,0 @@ -[theme] -inherit = basic -stylesheet = flasky.css -pygments_style = flask_theme_support.FlaskyStyle - -[options] -touch_icon = diff --git a/docs/_themes/kr_small/layout.html b/docs/_themes/kr_small/layout.html deleted file mode 100644 index aa1716a..0000000 --- a/docs/_themes/kr_small/layout.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "basic/layout.html" %} -{% block header %} - {{ super() }} - {% if pagename == 'index' %} -
- {% endif %} -{% endblock %} -{% block footer %} - {% if pagename == 'index' %} -
- {% endif %} -{% endblock %} -{# do not display relbars #} -{% block relbar1 %}{% endblock %} -{% block relbar2 %} - {% if theme_github_fork %} - Fork me on GitHub - {% endif %} -{% endblock %} -{% block sidebar1 %}{% endblock %} -{% block sidebar2 %}{% endblock %} diff --git a/docs/_themes/kr_small/static/flasky.css_t b/docs/_themes/kr_small/static/flasky.css_t deleted file mode 100644 index fe2141c..0000000 --- a/docs/_themes/kr_small/static/flasky.css_t +++ /dev/null @@ -1,287 +0,0 @@ -/* - * flasky.css_t - * ~~~~~~~~~~~~ - * - * Sphinx stylesheet -- flasky theme based on nature theme. - * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'Georgia', serif; - font-size: 17px; - color: #000; - background: white; - margin: 0; - padding: 0; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 40px auto 0 auto; - width: 700px; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #ffffff; - color: #3E4349; - padding: 0 30px 30px 30px; -} - -img.floatingflask { - padding: 0 0 10px 10px; - float: right; -} - -div.footer { - text-align: right; - color: #888; - padding: 10px; - font-size: 14px; - width: 650px; - margin: 0 auto 40px auto; -} - -div.footer a { - color: #888; - text-decoration: underline; -} - -div.related { - line-height: 32px; - color: #888; -} - -div.related ul { - padding: 0 0 0 10px; -} - -div.related a { - color: #444; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body { - padding-bottom: 40px; /* saved for footer */ -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -{% if theme_index_logo %} -div.indexwrapper h1 { - text-indent: -999999px; - background: url({{ theme_index_logo }}) no-repeat center center; - height: {{ theme_index_logo_height }}; -} -{% endif %} - -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: white; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #eaeaea; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - background: #fafafa; - margin: 20px -30px; - padding: 10px 30px; - border-top: 1px solid #ccc; - border-bottom: 1px solid #ccc; -} - -div.admonition p.admonition-title { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight{ - background-color: white; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt { - font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.85em; -} - -img.screenshot { -} - -tt.descname, tt.descclassname { - font-size: 0.95em; -} - -tt.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #eee; - -webkit-box-shadow: 2px 2px 4px #eee; - box-shadow: 2px 2px 4px #eee; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #eee; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.footnote td { - padding: 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -pre { - padding: 0; - margin: 15px -30px; - padding: 8px; - line-height: 1.3em; - padding: 7px 30px; - background: #eee; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; -} - -dl pre { - margin-left: -60px; - padding-left: 60px; -} - -tt { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, a tt { - background-color: #FBFBFB; -} - -a:hover tt { - background: #EEE; -} diff --git a/docs/_themes/kr_small/theme.conf b/docs/_themes/kr_small/theme.conf deleted file mode 100644 index 542b462..0000000 --- a/docs/_themes/kr_small/theme.conf +++ /dev/null @@ -1,10 +0,0 @@ -[theme] -inherit = basic -stylesheet = flasky.css -nosidebar = true -pygments_style = flask_theme_support.FlaskyStyle - -[options] -index_logo = '' -index_logo_height = 120px -github_fork = '' diff --git a/docs/api.rst b/docs/api.rst old mode 100644 new mode 100755 index 724affb..e6922da --- a/docs/api.rst +++ b/docs/api.rst @@ -1,105 +1,359 @@ -.. _api: - -Developer Interface -=================== - -.. module:: requests - -This part of the documentation covers all the interfaces of Requests. For -parts where Requests depends on external libraries, we document the most -important right here and provide links to the canonical documentation. - - -Main Interface --------------- - -All of Request's functionality can be accessed by these 7 methods. -They all return an instance of the :class:`Response ` object. - -.. autofunction:: request - -.. autofunction:: head -.. autofunction:: get -.. autofunction:: post -.. autofunction:: put -.. autofunction:: patch -.. autofunction:: delete - - -Lower-Level Classes -~~~~~~~~~~~~~~~~~~~ - -.. autoclass:: requests.Request - :inherited-members: - -.. autoclass:: Response - :inherited-members: - -Request Sessions ----------------- - -.. autoclass:: Session - :inherited-members: - - -Exceptions -~~~~~~~~~~ - -.. module:: requests - -.. autoexception:: RequestException -.. autoexception:: ConnectionError -.. autoexception:: HTTPError -.. autoexception:: URLRequired -.. autoexception:: TooManyRedirects - - -Status Code Lookup -~~~~~~~~~~~~~~~~~~ - -.. autofunction:: requests.codes - -:: - - >>> requests.codes['temporary_redirect'] - 307 - - >>> requests.codes.teapot - 418 - - >>> requests.codes['\o/'] - 200 - -Cookies -~~~~~~~ - -.. autofunction:: dict_from_cookiejar -.. autofunction:: cookiejar_from_dict -.. autofunction:: add_dict_to_cookiejar - - -Encodings -~~~~~~~~~ - -.. autofunction:: get_encodings_from_content -.. autofunction:: get_encoding_from_headers -.. autofunction:: get_unicode_from_response -.. autofunction:: decode_gzip - - -Classes -~~~~~~~ - -.. autoclass:: requests.Response - :inherited-members: - -.. autoclass:: requests.Request - :inherited-members: - -.. autoclass:: requests.PreparedRequest - :inherited-members: - -.. _sessionapi: - -.. autoclass:: requests.Session - :inherited-members: +.. _api: + +Developer Interface +=================== + +.. module:: requests + +.. This part of the documentation covers all the interfaces of Requests. For + parts where Requests depends on external libraries, we document the most + important right here and provide links to the canonical documentation. + +ドキュメントのこの章では、Requests の全てのインターフェースについて説明します。 +Requests が外部のライブラリに依存する部分については、ここでは重要な部分についてのみドキュメント化し、 +正式なドキュメントへのリンクを添えます。 + +.. Main Interface + -------------- + +メインインターフェース +------------------------- + +.. All of Requests' functionality can be accessed by these 7 methods. + They all return an instance of the :class:`Response ` object. + +全ての Requests の機能には、以下の7つのメソッドにアクセスすることができます。 +これらは全て :class:`Response ` オブジェクトのインスタンスを返却します。 + +.. autofunction:: request + +.. autofunction:: head +.. autofunction:: get +.. autofunction:: post +.. autofunction:: put +.. autofunction:: patch +.. autofunction:: delete + +.. Exceptions + ---------- + +例外 +------------- + +.. autoexception:: requests.RequestException +.. autoexception:: requests.ConnectionError +.. autoexception:: requests.HTTPError +.. autoexception:: requests.URLRequired +.. autoexception:: requests.TooManyRedirects +.. autoexception:: requests.ConnectTimeout +.. autoexception:: requests.ReadTimeout +.. autoexception:: requests.Timeout + + +.. Request Sessions + ---------------- + +リクエストのセッション +----------------------------- + +.. _sessionapi: + +.. autoclass:: Session + :inherited-members: + + +.. Lower-Level Classes + ------------------- + +低レベルのクラス +---------------------- + +.. autoclass:: requests.Request + :inherited-members: + +.. autoclass:: Response + :inherited-members: + + +.. Lower-Lower-Level Classes + ------------------------- + +さらに低レベルのクラス +------------------------- + +.. autoclass:: requests.PreparedRequest + :inherited-members: + +.. autoclass:: requests.adapters.BaseAdapter + :inherited-members: + +.. autoclass:: requests.adapters.HTTPAdapter + :inherited-members: + +.. Authentication + -------------- + +認証 +----------------- + +.. autoclass:: requests.auth.AuthBase +.. autoclass:: requests.auth.HTTPBasicAuth +.. autoclass:: requests.auth.HTTPProxyAuth +.. autoclass:: requests.auth.HTTPDigestAuth + + + +.. Encodings + --------- + +エンコーディング +------------------ + +.. autofunction:: requests.utils.get_encodings_from_content +.. autofunction:: requests.utils.get_encoding_from_headers +.. autofunction:: requests.utils.get_unicode_from_response + + +.. _api-cookies: + +Cookies +------- + +.. autofunction:: requests.utils.dict_from_cookiejar +.. autofunction:: requests.utils.add_dict_to_cookiejar +.. autofunction:: requests.cookies.cookiejar_from_dict + +.. autoclass:: requests.cookies.RequestsCookieJar + :inherited-members: + +.. autoclass:: requests.cookies.CookieConflictError + :inherited-members: + + + +Status Code Lookup +------------------ + +.. autoclass:: requests.codes + +:: + + >>> requests.codes['temporary_redirect'] + 307 + + >>> requests.codes.teapot + 418 + + >>> requests.codes['\o/'] + 200 + + + +.. Migrating to 1.x + ---------------- + +バージョン 1 系への移行 +-------------------------------- + +.. This section details the main differences between 0.x and 1.x and is meant + to ease the pain of upgrading. + +この章では、バージョン 0.x と 1.x の主な違いについて説明し、アップグレードする際の苦痛を和らげることを目的としています。 + +.. API Changes + ~~~~~~~~~~~ + +APIの変更 +~~~~~~~~~~~~~~ + +.. ``Response.json`` is now a callable and not a property of a response. + +* ``Response.json`` は呼び出し可能になって、レスポンスのプロパティではなくなりました。 + + :: + + import requests + r = requests.get('https://github.com/timeline.json') + r.json() # This *call* raises an exception if JSON decoding fails + +.. The ``Session`` API has changed. Sessions objects no longer take parameters. + ``Session`` is also now capitalized, but it can still be + instantiated with a lowercase ``session`` for backwards compatibility. + +* ``Session`` API が変更されました。 + セッションのオブジェクトはパラメータを受け取りません。 + ``Session`` という名称もキャピタライズされましたが、後方互換製のために ``session`` という + lowercase でもインスタンスを作成することができます。 + + :: + + s = requests.Session() # formerly, session took parameters + s.auth = auth + s.headers.update(headers) + r = s.get('http://httpbin.org/headers') + +.. All request hooks have been removed except 'response'. + +* 全てのリクエストのフックは、'response' を除いて削除されました。 + +.. Authentication helpers have been broken out into separate modules. See + requests-oauthlib_ and requests-kerberos_. + +* 認証ヘルパーは、別のモジュールに分割されています。requests-oauthlib_ と requests-kerberos_ を参照して下さい。 + +.. _requests-oauthlib: https://github.com/requests/requests-oauthlib +.. _requests-kerberos: https://github.com/requests/requests-kerberos + +.. The parameter for streaming requests was changed from ``prefetch`` to + ``stream`` and the logic was inverted. In addition, ``stream`` is now + required for raw response reading. + +* ストリーミングのリクエストのパラメータは ``prefetch`` から ``stream`` に変更され、ロジックが逆になりました。 + さらに、``stream`` は生のレスポンスを解釈するために必要になりました。 + + :: + + # in 0.x, passing prefetch=False would accomplish the same thing + r = requests.get('https://github.com/timeline.json', stream=True) + for chunk in r.iter_content(8192): + ... + +.. The ``config`` parameter to the requests method has been removed. Some of + these options are now configured on a ``Session`` such as keep-alive and + maximum number of redirects. The verbosity option should be handled by + configuring logging. + +* リクエストのメソッドへの ``config`` パラメータは削除されました。 + これらのオプションの一部は、キープアライブや最大のリダイレクト数等の ``Session`` で設定されるようになりました。 + verbosity optionはロギングを設定することで処理する必要があります。 + + :: + + import requests + import logging + + # Enabling debugging at http.client level (requests->urllib3->http.client) + # you will see the REQUEST, including HEADERS and DATA, and RESPONSE with HEADERS but without DATA. + # the only thing missing will be the response.body which is not logged. + try: # for Python 3 + from http.client import HTTPConnection + except ImportError: + from httplib import HTTPConnection + HTTPConnection.debuglevel = 1 + + logging.basicConfig() # you need to initialize logging, otherwise you will not see anything from requests + logging.getLogger().setLevel(logging.DEBUG) + requests_log = logging.getLogger("requests.packages.urllib3") + requests_log.setLevel(logging.DEBUG) + requests_log.propagate = True + + requests.get('http://httpbin.org/headers') + + + +Licensing +~~~~~~~~~ + +.. One key difference that has nothing to do with the API is a change in the + license from the ISC_ license to the `Apache 2.0`_ license. The Apache 2.0 + license ensures that contributions to Requests are also covered by the Apache + 2.0 license. + +API と関係のない変更で大きなものの1つとして、ライセンスが ISC_ ライセンスから `Apache 2.0`_ ライセンスに変更されました。 +Apache 2.0 ライセンスは、Requests へのコントリビューションも Apache 2.0 ライセンスの対象となります。 + +.. _ISC: http://opensource.org/licenses/ISC +.. _Apache 2.0: http://opensource.org/licenses/Apache-2.0 + + +.. Migrating to 2.x + ---------------- + +バージョン 2 系への移行 +-------------------------------- + +.. Compared with the 1.0 release, there were relatively few backwards + incompatible changes, but there are still a few issues to be aware of with + this major release. + +バージョン 1.0 のリリースと比較すると、後方互換性を壊す変更は比較的少なかったが、 +このメジャーリリースではいくつか気をつけないといけないことがあります。 + +.. For more details on the changes in this release including new APIs, links + to the relevant GitHub issues and some of the bug fixes, read Cory's blog_ + on the subject. + +今回のリリースで含まれた新しい API、関連する Github の Issues、いくつかのバグ修正について修正の詳細は、 +Cory のブログで詳細を確認して下さい。 + +.. _blog: http://lukasa.co.uk/2013/09/Requests_20/ + + +.. API Changes + ~~~~~~~~~~~ + +APIの変更 +~~~~~~~~~~~~~~ + +.. There were a couple changes to how Requests handles exceptions. + ``RequestException`` is now a subclass of ``IOError`` rather than + ``RuntimeError`` as that more accurately categorizes the type of error. + In addition, an invalid URL escape sequence now raises a subclass of + ``RequestException`` rather than a ``ValueError``. + +* Requests が例外処理をする方法のうち幾つかに変更がありました。 + ``RequestException`` は、エラーの種類をより明確に分類するために ``RuntimeError`` ではなく、 + ``IOError`` のサブクラスになりました。 + さらに、無効な URL のエスケースシーケンスの場合、``ValueError`` ではなく、 + ``RequestException`` のサブクラスとして例外を発生させます。 + + :: + + requests.get('http://%zz/') # raises requests.exceptions.InvalidURL + + .. Lastly, ``httplib.IncompleteRead`` exceptions caused by incorrect chunked + encoding will now raise a Requests ``ChunkedEncodingError`` instead. + + 最後に、不正なチャンクエンコーディングが原因となって発生した ``httplib.IncompleteRead`` の例外は、 + 代わりに Requests の ``ChunkedEncodingError`` を発生させます。 + +.. The proxy API has changed slightly. The scheme for a proxy URL is now + required. + +* プロキシの API が少し変更されました。プロキシ URL のスキームが必要になりました。 + + :: + + proxies = { + "http": "10.10.1.10:3128", # use http://10.10.1.10:3128 instead + } + + # In requests 1.x, this was legal, in requests 2.x, + # this raises requests.exceptions.MissingSchema + requests.get("http://example.org", proxies=proxies) + + +.. Behavioural Changes + ~~~~~~~~~~~~~~~~~~~~~~~ + +振る舞いの変化 +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. Keys in the ``headers`` dictionary are now native strings on all Python + versions, i.e. bytestrings on Python 2 and unicode on Python 3. If the + keys are not native strings (unicode on Python 2 or bytestrings on Python 3) + they will be converted to the native string type assuming UTF-8 encoding. + +``headers`` ディクショナリのキーは、全ての Python バージョンのネイティブの文字列になりました。 +つまり、Python 2 におけるstr文字列で、Python 3 におけるunicode文字列のことです。 +キーがネイティブ文字列(Python 2 におけるunicode文字列やPython 3 におけるstr文字列)ではない場合、 +UTF-8 エンコーディングと仮定したネイティブ文字列に変換されます。 + +.. Values in the ``headers`` dictionary should always be strings. This has + been the project's position since before 1.0 but a recent change + (since version 2.11.0) enforces this more strictly. It's advised to avoid + passing header values as unicode when possible. + +``headers`` ディクショナリの値は常に文字列にしなければいけません。 +これは 1.0 以前のプロジェクトの振る舞いですが、最近の変更(バージョン 2.11.0 以降)により厳密になりました。 +可能であれば、ヘッダーの値を unicode として渡さないようにすることを推奨しています。 diff --git a/docs/community/faq.rst b/docs/community/faq.rst old mode 100644 new mode 100755 index 4d4efcf..88bd4af --- a/docs/community/faq.rst +++ b/docs/community/faq.rst @@ -1,44 +1,42 @@ .. _faq: -よくある質問 -============================= - .. Frequently Asked Questions ========================== +よくある質問 +========================== + .. This part of the documentation answers common questions about Requests. -ドキュメントのこの章は、Requestsに関する一般的な質問に答えます。 +ドキュメントのこの章では Requests についての一般的な質問について答えます。 .. Encoded Data? ------------- -データはエンコードされますか? ---------------------------------------- +エンコードされたデータ +-------------------------- .. Requests automatically decompresses gzip-encoded responses, and does its best to decode response content to unicode when possible. -Requestsは自動的にgzipエンコードされたレスポンスを解凍します。 -そして、可能ならユニコード化するためにレスポンスの本文をデコードします。 +Requests は、gzip エンコードされたレスポンスを自動的に解凍し、 +可能な限り Unicode に対応するレスポンスコンテンツにデコードしようとします。 .. You can get direct access to the raw response (and even the socket), if needed as well. -必要なら、生のレスポンス(とソケット)に直接アクセスすることができます。 - +必要に応じて、生のレスポンス(さらにはソケット)に直接アクセスすることができます。 .. Custom User-Agents? ------------------- -ユーザーエージェントをカスタマイズできますか? --------------------------------------------------- +独自のユーザーエージェント +------------------------------ .. Requests allows you to easily override User-Agent strings, along with any other HTTP Header. -Requestsは他のHTTPヘッダーと同様に、ユーザーエージェントの文字列を簡単に上書きすることができます。 - +Requests は、他の HTTP ヘッダーと同じように User-Agent 文字列を簡単に上書きすることができます。 .. Why not Httplib2? ----------------- @@ -49,56 +47,83 @@ Requestsは他のHTTPヘッダーと同様に、ユーザーエージェント .. Chris Adams gave an excellent summary on `Hacker News `_: -Chris Adamsさんは、 `Hacker News `_ で、すばらしい見解を述べています。 - - .. httplib2 is part of why you should use requests: it's far more respectable - as a client but not as well documented and it still takes way too much code - for basic operations. I appreciate what httplib2 is trying to do, that - there's a ton of hard low-level annoyances in building a modern HTTP - client, but really, just use requests instead. Kenneth Reitz is very - motivated and he gets the degree to which simple things should be simple - whereas httplib2 feels more like an academic exercise than something - people should use to build production systems[1]. - - httplib2はRequestsをなぜ使うべきかという理由の一部でしかありません。 - クライアントとしてはとても立派ですがドキュメント化があまりされていません。 - そして、基本的な操作をするためにたくさんのコードを書く必要があります。 - httplib2がやろうとしていることに感謝していますが、モダンなHTTPクライアントを作成するために低レベルの部分で不満がたくさんあるので、 - 実際はhttplib2の代わりにRequestsを使っています。 - Kenneth Reitzはモチベーションが高く、本番環境のシステム[1]を作るために使うものよりはhttplib2は学校の勉強のような感じがするので、 - 簡単なことは簡単にできるようにしようとしています。 - - .. Disclosure: I'm listed in the requests AUTHORS file but can claim credit - for, oh, about 0.0001% of the awesomeness. +Chris Adamsさんは、`Hacker News `_ の投稿で、 +すばらしい見解を与えてくれました。 - ディスクロージャー: RequestsのAUTHORSファイルにリストされていますが、クレジットにクレームを付けることができます。 + httplib2 is part of why you should use requests: it's far more respectable + as a client but not as well documented and it still takes way too much code + for basic operations. I appreciate what httplib2 is trying to do, that + there's a ton of hard low-level annoyances in building a modern HTTP + client, but really, just use requests instead. Kenneth Reitz is very + motivated and he gets the degree to which simple things should be simple + whereas httplib2 feels more like an academic exercise than something + people should use to build production systems[1]. - .. http://code.google.com/p/httplib2/issues/detail?id=96 is a good example: - an annoying bug which affect many people, there was a fix available for - months, which worked great when I applied it in a fork and pounded a couple - TB of data through it, but it took over a year to make it into trunk and - even longer to make it onto PyPI where any other project which required " - httplib2" would get the working version. + Disclosure: I'm listed in the requests AUTHORS file but can claim credit + for, oh, about 0.0001% of the awesomeness. - 1. http://code.google.com/p/httplib2/issues/detail?id=96は良い例です。: - たくさんの人に影響のある迷惑なバグは、そのバグによって数テラバイトものデータを解析してフォークしてそれを適用した時に数ヶ月も解決するために作業しなければいけなくなりますが、 - キチンと動くバージョンの"httplib2"が必要となる他のプロジェクトでtrunkにそれを作るために一年かけて引き継いで、PyPIでそれをつくるために長い期間がかかります。 + 1. http://code.google.com/p/httplib2/issues/detail?id=96 is a good example: + an annoying bug which affect many people, there was a fix available for + months, which worked great when I applied it in a fork and pounded a couple + TB of data through it, but it took over a year to make it into trunk and + even longer to make it onto PyPI where any other project which required " + httplib2" would get the working version. .. Python 3 Support? ----------------- -Python 3をサポートしていますか? +Python 3はサポートしていますか? ---------------------------------- .. Yes! Here's a list of Python platforms that are officially supported: -はい! 公式にサポートしているPythonプラットフォームのリストは以下のとおりです。 +はい!公式にサポートしている Python のプラットフォームは以下の通りです。: * Python 2.6 * Python 2.7 -* Python 3.1 -* Python 3.2 -* Python 3.3 -* PyPy 1.9 \ No newline at end of file +* Python 3.4 +* Python 3.5 +* Python 3.6 +* PyPy + +.. What are "hostname doesn't match" errors? + ----------------------------------------- + +"hostname doesn't match" というエラーは何ですか? +-------------------------------------------------------- + +.. These errors occur when :ref:`SSL certificate verification ` + fails to match the certificate the server responds with to the hostname + Requests thinks it's contacting. If you're certain the server's SSL setup is + correct (for example, because you can visit the site with your browser) and + you're using Python 2.6 or 2.7, a possible explanation is that you need + Server-Name-Indication. + +これらのエラーは、:ref:`SSL certificate verification ` で、 +Requests がアクセス使用しているサーバーのホスト名の証明書と一致しない時に発生します。 +サーバーの SSL 設定が正しい(例として、ブラウザでサイトにアクセスできるか)ことが確認できた場合に、 +Python 2.6 か 2.7 を使っている場合は、Server-Name-Indication が必要です。 + +.. `Server-Name-Indication`_, or SNI, is an official extension to SSL where the + client tells the server what hostname it is contacting. This is important + when servers are using `Virtual Hosting`_. When such servers are hosting + more than one SSL site they need to be able to return the appropriate + certificate based on the hostname the client is connecting to. + +`Server-Name-Indication`_ (SNI)は、クライアントがサーバーにどのホスト名に接続しているかを伝える SSL の正式な拡張です。 +サーバーが `Virtual Hosting`_ を使っている場合は、これは重要です。 +このようなサーバーが1つ以上の SSL サイトをホストしている場合、 +クライアントが接続しているホスト名に基いて適切な証明書を返却する必要があります。 + +.. Python3 and Python 2.7.9+ include native support for SNI in their SSL modules. + For information on using SNI with Requests on Python < 2.7.9 refer to this + `Stack Overflow answer`_. + +Python3 と Python 2.7.9 以上には SSL モジュールの SNI のネイティブサポートが含まれています。 +Python 2.7.9 未満の Requests で SNI を使う方法については、`Stack Overflow answer`_ を参照して下さい。 + +.. _`Server-Name-Indication`: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _`virtual hosting`: https://en.wikipedia.org/wiki/Virtual_hosting +.. _`Stack Overflow answer`: https://stackoverflow.com/questions/18578439/using-requests-with-tls-doesnt-give-sni-support/18579484#18579484 diff --git a/docs/community/out-there.rst b/docs/community/out-there.rst old mode 100644 new mode 100755 index 0a3d5d0..f803a72 --- a/docs/community/out-there.rst +++ b/docs/community/out-there.rst @@ -4,32 +4,17 @@ インテグレーション ======================== -ScraperWiki ------------- - -.. `ScraperWiki `_ is an excellent service that allows - you to run Python, Ruby, and PHP scraper scripts on the web. Now, Requests - v0.6.1 is available to use in your scrapers! - -`ScraperWiki `_ はウェブ上でPython、Ruby、PHPのスクレイパースクリプトを実行できる優れたサービスです。 -現在、Requestsのバージョン0.6.1を使うことができます。 - -.. To give it a try, simply:: - -簡単なので、試してみて下さい。:: - - import requests - Python for iOS -------------- .. Requests is built into the wonderful `Python for iOS `_ runtime! -Requestsは、すばらしい `Python for iOS `_ ランタイムに組み込まれています! +Requests は素晴らしい `Python for iOS `_ ランタイムに +組み込まれています! .. To give it a try, simply:: -簡単なので、試してみて下さい。:: +試してみて下さい。簡単です。:: import requests @@ -37,13 +22,13 @@ Requestsは、すばらしい `Python for iOS `_ teaches how to use Python to interact with the web, using Requests. -- `Daniel Greenfield's Review of Requests `_ +- `Daniel Greenfeld's Review of Requests `_ - `My 'Python for Humans' talk `_ ( `audio `_ ) - `Issac Kelly's 'Consuming Web APIs' talk `_ - `Blog post about Requests via Yum `_ - `Russian blog post introducing Requests `_ -- `French blog post introducing Requests `_ \ No newline at end of file +- `Sending JSON in Requests `_ diff --git a/docs/community/recommended.rst b/docs/community/recommended.rst new file mode 100755 index 0000000..b5487a2 --- /dev/null +++ b/docs/community/recommended.rst @@ -0,0 +1,63 @@ +.. _recommended: + +.. Recommended Packages and Extensions + =================================== + +推奨パッケージとエクステンション +====================================== + +.. Requests has a great variety of powerful and useful third-party extensions. + This page provides an overview of some of the best of them. + +Requests は強力で使いやすいサードパーティのエクステンションが豊富にあります。 +このページでは、それらの中からベストなものを幾つか紹介します。 + +Certifi CA Bundle +----------------- + +`Certifi`_ is a carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the +identity of TLS hosts. It has been extracted from the Requests project. + +.. _Certifi: http://certifi.io/en/latest/ + +CacheControl +------------ + +`CacheControl`_ is an extension that adds a full HTTP cache to Requests. This +makes your web requests substantially more efficient, and should be used +whenever you're making a lot of web requests. + +.. _CacheControl: https://cachecontrol.readthedocs.io/en/latest/ + +Requests-Toolbelt +----------------- + +`Requests-Toolbelt`_ is a collection of utilities that some users of Requests may desire, +but do not belong in Requests proper. This library is actively maintained +by members of the Requests core team, and reflects the functionality most +requested by users within the community. + +.. _Requests-Toolbelt: http://toolbelt.readthedocs.io/en/latest/index.html + +Requests-OAuthlib +----------------- + +`requests-oauthlib`_ makes it possible to do the OAuth dance from Requests +automatically. This is useful for the large number of websites that use OAuth +to provide authentication. It also provides a lot of tweaks that handle ways +that specific OAuth providers differ from the standard specifications. + +.. _requests-oauthlib: https://requests-oauthlib.readthedocs.io/en/latest/ + + +Betamax +------- + +.. `Betamax`_ records your HTTP interactions so the NSA does not have to. + A VCR imitation designed only for Python-Requests. + +`Betamax`_ は、HTTP のやりとりを記録し、 +Python の Requests 専用に設計された VCR のようなパッケージです。 + +.. _betamax: https://github.com/sigmavirus24/betamax diff --git a/docs/community/release-process.rst b/docs/community/release-process.rst new file mode 100755 index 0000000..5a5ccc2 --- /dev/null +++ b/docs/community/release-process.rst @@ -0,0 +1,99 @@ +.. Release Process and Rules + ========================= + +リリースプロセスとルール +============================ + +.. versionadded:: v2.6.2 + +.. Starting with the version to be released after ``v2.6.2``, the following rules + will govern and describe how the Requests core team produces a new release. + +``v2.6.2`` 以降にリリースされるバージョンから開始されたこととして、 +Requests のコアチームが新しいリリースをどのように進めていくかを定め、説明することになりました。 + +.. Major Releases + -------------- + +メジャーリリース +------------------------ + +.. A major release will include breaking changes. When it is versioned, it will + be versioned as ``vX.0.0``. For example, if the previous release was + ``v10.2.7`` the next version will be ``v11.0.0``. + +メジャーリリースには、互換性を壊す変更が含まれることがあります。 +バージョンが変更されると、``vX.0.0`` のようなバージョンになります。 +例えば、1つ前のリリースが ``v10.2.7`` の場合、次のバージョンは ``v11.0.0`` になります。 + +.. Breaking changes are changes that break backwards compatibility with prior + versions. If the project were to change the ``text`` attribute on a + ``Response`` object to a method, that would only happen in a Major release. + +互換性を壊す変更は、以前のバージョンとの後方互換性を損なう変更になります。 +プロジェクトが ``Response`` オブジェクトのテキスト属性をメソッドに変更するような変更は、メジャーリリースでのみ行われます。 + +.. Major releases may also include miscellaneous bug fixes and upgrades to + vendored packages. The core developers of Requests are committed to providing + a good user experience. This means we're also committed to preserving + backwards compatibility as much as possible. Major releases will be infrequent + and will need strong justifications before they are considered. + +メジャーリリースには諸々のバグ修正やベンダーパッケージのアップグレードなども含まれます。 +Requests のコア開発者は、優れたユーザーエクスペリエンスを提供することに重きを置いています。 +つまり、可能な限り後方互換性を維持することにも取り組んでいることを意味しています。 +メジャーリリースはまれであり、後方互換性が考慮される以前に強い正当性が必要となります。 + +.. Minor Releases + -------------- + +マイナーリリース +------------------------- + +.. A minor release will not include breaking changes but may include + miscellaneous bug fixes and upgrades to vendored packages. If the previous + version of Requests released was ``v10.2.7`` a minor release would be + versioned as ``v10.3.0``. + +マイナーリリースには互換性を壊す変更は含まれませんが、諸々のバグ修正やベンダーパッケージのアップグレードなどが含まれます。 +Requests の1つ前にリリースされたバージョンが ``v10.2.7`` だった場合、マイナーリリースは ``v10.3.0`` になります。 + +.. Minor releases will be backwards compatible with releases that have the same + major version number. In other words, all versions that would start with + ``v10.`` should be compatible with each other. + +マイナーリリースは、メジャーバージョンの番号が同じリリースと後方互換性があります。 +言い換えると、``v10.`` で始まる全てのバージョンは、それぞれ互換性があるはずです。 + +.. Hotfix Releases + --------------- + +ホットフィックスリリース +--------------------------- + +.. A hotfix release will only include bug fixes that were missed when the project + released the previous version. If the previous version of Requests released + ``v10.2.7`` the hotfix release would be versioned as ``v10.2.8``. + +ホットフィックスリリースには、以前のバージョンをリリースした時に見逃したバグ修正のみ含まれます。 +Requests の1つ前にリリースされたバージョンが ``v10.2.7`` だった場合、ホットフィックスリリースは ``v10.2.8`` になります。 + +.. Hotfixes will **not** include upgrades to vendored dependencies after + ``v2.6.2`` + +修正されたものには ``v2.6.2`` 以降の依存しているベンダーパッケージのアップグレードは含まれていません。 + +.. Reasoning + --------- + +プロセスとルールを定める理由 +------------------------------------ + +.. In the 2.5 and 2.6 release series, the Requests core team upgraded vendored + dependencies and caused a great deal of headaches for both users and the core + team. To reduce this pain, we're forming a concrete set of procedures so + expectations will be properly set. + +バージョン 2.5 と 2.6 のリリースでは、Requests のコアチームはベンダーの依存を変更し、 +ユーザーとコアチームの両方に迷惑をかけました。 +このようなことが極力起こらないようにするために、期待されていることを具体的な一連の流れとして設定することにしました。 diff --git a/docs/community/support.rst b/docs/community/support.rst old mode 100644 new mode 100755 index 49fa0d6..b27d47e --- a/docs/community/support.rst +++ b/docs/community/support.rst @@ -1,40 +1,52 @@ .. _support: -サポート -============== - .. Support ======= -.. If you have a questions or issues about Requests, there are several options: +サポート +========== + +.. If you have questions or issues about Requests, there are several options: + +Requests に関する質問や問題等がある場合は、いくつかの選択肢があります。 : + +StackOverflow +------------- -Requestsに関する質問や問題があれば、選択肢がいくつかあります。: +.. If your question does not contain sensitive (possibly proprietary) + information or can be properly anonymized, please ask a question on + `StackOverflow `_ + and use the tag ``python-requests``. + +質問に機密情報が含まれていない場合や、適切に匿名化されている場合は、`StackOverflow `_ で +``python-requests`` タグを使って質問してください。 .. Send a Tweet ------------ -ツイートを送って下さい。 ------------------------------ +ツイートを送って下さい +------------------------ .. If your question is less than 140 characters, feel free to send a tweet to - `@kennethreitz `_. - -質問が140文字以下なら、 `@kennethreitz `_ に気軽にツイートを送って下さい。 + `@kennethreitz `_, + `@sigmavirus24 `_, or + `@lukasaoz `_. +質問が140文字以下の場合は、`@kennethreitz `_ か `@sigmavirus24 `_ か +`@lukasaoz `_ に気軽にツイートを送ってください。 .. File an Issue ------------- -Issueに登録して下さい。 ------------------------------ +Issues の作成 +---------------- -.. If you notice some unexpected behavior in Requests, or want to see support +.. If you notice some unexpected behaviour in Requests, or want to see support for a new feature, - `file an issue on GitHub `_. - -Requestsで予期していない動作を発見したり、新しい機能のサポート状況を知りたい場合、 -`GitHubのIssue `_ を確認して下さい。 + `file an issue on GitHub `_. +Requests で予期しない動作が発生した場合や、新しい機能のサポートを確認したい場合は、 +`GitHub の Issues を作成して下さい `_。 E-mail ------ @@ -43,9 +55,8 @@ E-mail Requests. Feel free to email `requests@kennethreitz.com `_. -Requestsに関する詳細な質問や個人的な質問に答えることはうれしく思っています。 -気軽に、 `requests@kennethreitz.com `_ にメールして下さい。 - +Requests に関する個人的なことや深い疑問に答えることはうれしいことなので、 +気軽に `requests@kennethreitz.com `_ までメールしてください。 IRC --- @@ -53,9 +64,14 @@ IRC .. The official Freenode channel for Requests is `#python-requests `_ -Requestsの公式のFreenodeチャンネルは、 -`#python-requests `_ です。 +Requests の公式 freenode チャンネルは、`#python-requests `_ です。 + +.. The core developers of requests are on IRC throughout the day. + You can find them in ``#python-requests`` as: -.. I'm also available as **kennethreitz** on Freenode. +Requests のコア開発者は一日中 IRC を見ています。 +``#python-requests`` で以下の開発者を見つけることができます。 : -Freenodeでは、 **kennethreitz** で登録しています。 \ No newline at end of file +- kennethreitz +- lukasa +- sigmavirus24 diff --git a/docs/community/updates.rst b/docs/community/updates.rst old mode 100644 new mode 100755 index cbeec62..66e538c --- a/docs/community/updates.rst +++ b/docs/community/updates.rst @@ -1,46 +1,40 @@ .. _updates: -アップデート -================= -.. Updates - ======= +.. Community Updates + ================= + +コミュニティのアップデート +============================= .. If you'd like to stay up to date on the community and development of Requests, there are several options: -Requestsの開発やコミュニティへの貢献したいと思っているなら、いくつか選択肢があります。 +コミュニティと Requests の開発についての最新の情報を取得したい場合、いくつか方法があります。: GitHub ------ .. The best way to track the development of Requests is through - `the GitHub repo `_. + `the GitHub repo `_. -`GitHubのリポジトリ `_ からRequestsの開発を追っていくことは一番いい方法です。 +`GitHub のリポジトリ `_ から Requests の開発を追うことができます。 Twitter ------- -.. I often tweet about new features and releases of Requests. +.. The author, Kenneth Reitz, often tweets about new features and releases of Requests. -Requestsのリリースや新しい機能の追加について、たまにツイートします。 +作者の Kenneth Reitz は、Requests の新機能やリリースについて、たまにツイートします。 .. Follow `@kennethreitz `_ for updates. -アップデート情報を得たい場合は、 `@kennethreitz `_ をフォローして下さい。 - - -.. Mailing List - ------------ - -メーリングリスト ------------------------- +更新を受け取りたい場合は `@kennethreitz `_ をフォローしてください。 -.. There's a low-volume mailing list for Requests. To subscribe to the - mailing list, send an email to - `requests@librelist.org `_. +.. Release and Version History + =========================== -あまり更新されないRequestsのメーリングリストがあります。 -メーリングリストを購読する場合は、 `requests@librelist.org `_ にメールを送って下さい。 +リリースとバージョンの履歴 +================================== +.. include:: ../../HISTORY.rst diff --git a/docs/community/vulnerabilities.rst b/docs/community/vulnerabilities.rst new file mode 100755 index 0000000..1c67d46 --- /dev/null +++ b/docs/community/vulnerabilities.rst @@ -0,0 +1,174 @@ +.. Vulnerability Disclosure + ======================== + +脆弱性の開示 +=========================== + +.. If you think you have found a potential security vulnerability in requests, + please email `sigmavirus24 `_ and + `Lukasa `_ directly. **Do not file a public issue.** + +Requests に潜在的なセキュリティ上の脆弱性があると思われる場合、 +`sigmavirus24 `_ と `Lukasa `_ に +直接メールしてください。**一般的な Issue は送らないで下さい。** + +.. Our PGP Key fingerprints are: + +PGP キーのフィンガープリントは以下のとおりです。: + +- 0161 BB7E B208 B5E0 4FDC 9F81 D9DA 0A04 9113 F853 (@sigmavirus24) + +- 90DC AE40 FEA7 4B14 9B70 662D F25F 2144 EEC1 373D (@lukasa) + +.. If English is not your first language, please try to describe the problem and + its impact to the best of your ability. For greater detail, please use your + native language and we will try our best to translate it using online services. + +英語が母国語ではない場合、不具合を可能な限り伝わるように説明することを心がけて下さい。 +詳細については、母国語を使用して下さい。 +オンラインサービスを使って翻訳することをお勧めします。 + +.. Please also include the code you used to find the problem and the shortest + amount of code necessary to reproduce it. + +不具合を探すために使ったコードと、再現するために必要な短いコードも含めるようにして下さい。 + +.. Please do not disclose this to anyone else. We will retrieve a CVE identifier + if necessary and give you full credit under whatever name or alias you provide. + We will only request an identifier when we have a fix and can publish it in a + release. + +これは誰にも開示しないで下さい。 +必要に応じて、CVE 識別子を取得し、提供する名前やエイリアスに基いてクレジットするようにします。 +フィックスされる場合のみ識別子を要求し、リリースで公開することができます。 + +.. We will respect your privacy and will only publicize your involvement if you + grant us permission. + +私たちはプライバシーを尊重し、許可してもらった場合のみ関与したことを公開するようにします。 + +.. Process + ------- + +プロセス +-------------- + +.. This following information discusses the process the requests project follows + in response to vulnerability disclosures. If you are disclosing a + vulnerability, this section of the documentation lets you know how we will + respond to your disclosure. + +以下の情報は、Requests プロジェクトが脆弱性の開示への対応に対するプロセスについて説明しています。 +脆弱性を開示している場合、ドキュメントのこの章で、開示にどのように対応するか案内します。 + +.. Timeline + ~~~~~~~~ + +タイムライン +~~~~~~~~~~~~~~~~ + +.. When you report an issue, one of the project members will respond to you within + two days *at the outside*. In most cases responses will be faster, usually + within 12 hours. This initial response will at the very least confirm receipt + of the report. + +不具合を報告すると、プロジェクトメンバーの1人が*遅くとも*2日以内に返答します。 +ほとんどの場合、返答は早く、通常は12時間以内になります。 +最初の返答は、レポートを受け取ったことの確認だけは少なくとも行います。 + +.. If we were able to rapidly reproduce the issue, the initial response will also + contain confirmation of the issue. If we are not, we will often ask for more + information about the reproduction scenario. + +不具合を簡単に再現できた場合、最初の返答で不具合の確認が含まれることもあります。 +そうでない場合、再現するための方法について説明を求めることもあります。 + +.. Our goal is to have a fix for any vulnerability released within two weeks of + the initial disclosure. This may potentially involve shipping an interim + release that simply disables function while a more mature fix can be prepared, + but will in the vast majority of cases mean shipping a complete release as soon + as possible. + +私達の目標は、最初の開示から2週間以内にリリースされた脆弱性に対するフィックスを行うことです。 +これは、きちんと時間をかけて不具合を修正するまでの間、機能を無効にする暫定リリースとして公開する可能性があります。 +しかし、可能な限り早く完全なリリースとして公開することをほとんどの方が望みます。 + +.. Throughout the fix process we will keep you up to speed with how the fix is + progressing. Once the fix is prepared, we will notify you that we believe we + have a fix. Often we will ask you to confirm the fix resolves the problem in + your environment, especially if we are not confident of our reproduction + scenario. + +フィックスするプロセスの全体として、修正がどのように進んでいるかを把握します。 +修正済みが準備されたら、修正されたと信じて通知します。 +特に再現する方法がわからない場合、自身の環境では不具合が解決されているか確認することもあります。 + +.. At this point, we will prepare for the release. We will obtain a CVE number + if one is required, providing you with full credit for the discovery. We will + also decide on a planned release date, and let you know when it is. This + release date will *always* be on a weekday. + +この時点で、リリースの準備をします。 +必要なら CVE 番号を取得し、発見に対する報酬を支払います。 +リリース日の計画を決め、決まった時点でお知らせします。 +リリース日は*常に*平日になります。 + +.. At this point we will reach out to our major downstream packagers to notify + them of an impending security-related patch so they can make arrangements. In + addition, these packagers will be provided with the intended patch ahead of + time, to ensure that they are able to promptly release their downstream + packages. Currently the list of people we actively contact *ahead of a public + release* is: + +この時点で、パッケージ担当者に連絡して差し迫ったセキュリティ関連のパッチだということを通知し、手配します。 +さらにパッケージ担当者はパッケージを素早くリリースできるようにパッチを提供します。 +現在、一般公開前にアクティブに連絡している人のリストは以下のとおりです。: + +- Jeremy Cline, Red Hat (@jeremycline) +- Daniele Tricoli, Debian (@eriol) + +.. We will notify these individuals at least a week ahead of our planned release + date to ensure that they have sufficient time to prepare. If you believe you + should be on this list, please let one of the maintainers know at one of the + email addresses at the top of this article. + +準備に十分な時間があることを確認するために予定されたリリース日より少なくとも1週間前に個人宛に通知します。 +このリストに掲載されるべきだと思うなら、この記事の一番上にあるメールアドレスの1つを使って、メンテナに知らせてください。 + +.. On release day, we will push the patch to our public repository, along with an + updated changelog that describes the issue and credits you. We will then issue + a PyPI release containing the patch. + +リリース日に、公開リポジトリにパッチをプッシュし、不具合の説明とクレジットを更新する変更履歴を追加します。 +パッチを含む PyPI リリースを公開します。 + +.. At this point, we will publicise the release. This will involve mails to + mailing lists, Tweets, and all other communication mechanisms available to the + core team. + +この時点で、リリースされることを公表します。 +これには、メーリングリスト、ツイート、コアチームが利用しているコミュニケーションツールが含まれています。 + +.. We will also explicitly mention which commits contain the fix to make it easier + for other distributors and users to easily patch their own versions of requests + if upgrading is not an option. + +アップグレードがオプションではない場合、他のディストリビューターやユーザーが使っている Requests のバージョンに +パッチをあてやすくするために、どのコミットに修正が含まれているかを明示します。 + +.. Previous CVEs + ------------- + +以前の CVE +---------------- + +- Fixed in 2.6.0 + + - `CVE 2015-2296 `_, + reported by Matthew Daley of `BugFuzz `_. + +- Fixed in 2.3.0 + + - `CVE 2014-1829 `_ + + - `CVE 2014-1830 `_ diff --git a/docs/conf.py b/docs/conf.py old mode 100644 new mode 100755 index 2293e66..b1c941e --- a/docs/conf.py +++ b/docs/conf.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- # -# requests-docs-ja documentation build configuration file, created by -# sphinx-quickstart on Sun Apr 1 15:13:59 2012. +# Requests documentation build configuration file, created by +# sphinx-quickstart on Fri Feb 19 00:05:47 2016. # -# This file is execfile()d with the current directory set to its containing dir. +# This file is execfile()d with the current directory set to its +# containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. @@ -11,28 +12,42 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys, os +import sys +import os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# Insert Requests' path into the system. sys.path.insert(0, os.path.abspath('..')) +sys.path.insert(0, os.path.abspath('_themes')) + import requests -from requests import __version__ -# -- General configuration ----------------------------------------------------- + +# -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc'] +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.todo', + 'sphinx.ext.viewcode', +] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] -# The suffix of source filenames. +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] source_suffix = '.rst' # The encoding of source files. @@ -42,21 +57,25 @@ master_doc = 'index' # General information about the project. -project = u'requests-docs-ja' -copyright = u'2012, Tsuyoshi Tokuda' +project = u'Requests' +copyright = u'MMXVII. A Kenneth Reitz Project' +author = u'Kenneth Reitz' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = __version__ +version = requests.__version__ # The full version, including alpha/beta/rc tags. -release = version +release = requests.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. -language = 'ja' +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: @@ -68,15 +87,16 @@ # directories to ignore when looking for source files. exclude_patterns = ['_build'] -# The reST default role (used for this markup: `text`) to use for all documents. +# The reST default role (used for this markup: `text`) to use for all +# documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +add_function_parentheses = False # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. @@ -88,17 +108,29 @@ # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False -# -- Options for HTML output --------------------------------------------------- +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True + + +# -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = 'alabaster' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +html_theme_options = { + 'show_powered_by': False, + 'github_user': 'requests', + 'github_repo': 'requests', + 'github_banner': True, + 'show_related': False +} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] @@ -124,19 +156,25 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +html_use_smartypants = False # Custom sidebar templates, maps document names to template names. html_sidebars = { - 'index': ['sidebarintro.html', 'sourcelink.html', 'searchbox.html'], + 'index': ['sidebarintro.html', 'sourcelink.html', 'searchbox.html', + 'hacks.html'], '**': ['sidebarlogo.html', 'localtoc.html', 'relations.html', - 'sourcelink.html', 'searchbox.html'] + 'sourcelink.html', 'searchbox.html', 'hacks.html'] } # Additional templates that should be rendered to pages, maps page names to @@ -159,7 +197,7 @@ html_show_sphinx = False # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the @@ -169,11 +207,24 @@ # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None -# Output file base name for HTML help builder. -htmlhelp_basename = 'requests-docs-jadoc' +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +#html_search_language = 'en' +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} -# -- Options for LaTeX output -------------------------------------------------- +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Requestsdoc' + +# -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). @@ -184,13 +235,17 @@ # Additional stuff for the LaTeX preamble. #'preamble': '', + +# Latex figure (float) alignment +#'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'requests-docs-ja.tex', u'requests-docs-ja Documentation', - u'Tsuyoshi Tokuda', 'manual'), + (master_doc, 'Requests.tex', u'Requests Documentation', + u'Kenneth Reitz', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -214,32 +269,32 @@ #latex_domain_indices = True -# -- Options for manual page output -------------------------------------------- +# -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'requests-docs-ja', u'requests-docs-ja Documentation', - [u'Tsuyoshi Tokuda'], 1) + (master_doc, 'requests', u'Requests Documentation', + [author], 1) ] # If true, show URL addresses after external links. #man_show_urls = False -# -- Options for Texinfo output ------------------------------------------------ +# -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'requests-docs-ja', u'requests-docs-ja Documentation', - u'Tsuyoshi Tokuda', 'requests-docs-ja', 'One line description of project.', - 'Miscellaneous'), + (master_doc, 'Requests', u'Requests Documentation', + author, 'Requests', 'One line description of project.', + 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. -texinfo_appendices = [] +#texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True @@ -247,6 +302,77 @@ # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' -sys.path.append(os.path.abspath('_themes')) -html_theme_path = ['_themes'] -html_theme = 'kr' +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project +epub_author = author +epub_publisher = author +epub_copyright = copyright + +# The basename for the epub file. It defaults to the project name. +#epub_basename = project + +# The HTML theme for the epub output. Since the default themes are not +# optimized for small screen space, using the same theme for HTML and epub +# output is usually not wise. This defaults to 'epub', a theme designed to save +# visual space. +#epub_theme = 'epub' + +# The language of the text. It defaults to the language option +# or 'en' if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# A sequence of (type, uri, title) tuples for the guide element of content.opf. +#epub_guide = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files that should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True + +# Choose between 'default' and 'includehidden'. +#epub_tocscope = 'default' + +# Fix unsupported image types using the Pillow. +#epub_fix_images = False + +# Scale large images. +#epub_max_image_width = 0 + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#epub_show_urls = 'inline' + +# If false, no index is generated. +#epub_use_index = True + +intersphinx_mapping = {'urllib3': ('http://urllib3.readthedocs.io/en/latest', None)} diff --git a/docs/dev/authors.rst b/docs/dev/authors.rst old mode 100644 new mode 100755 index 70e930a..46f5017 --- a/docs/dev/authors.rst +++ b/docs/dev/authors.rst @@ -2,7 +2,6 @@ ======= 作成者 -========== +======= - -.. include:: ../../AUTHORS.rst \ No newline at end of file +.. include:: ../../AUTHORS.rst diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst new file mode 100755 index 0000000..48944ef --- /dev/null +++ b/docs/dev/contributing.rst @@ -0,0 +1,338 @@ +.. _contributing: + +.. Contributor's Guide + =================== + +コントリビューター用のガイド +=================================== + +.. If you're reading this, you're probably interested in contributing to Requests. + Thank you very much! Open source projects live-and-die based on the support + they receive from others, and the fact that you're even considering + contributing to the Requests project is *very* generous of you. + +これを読んでいるなら、おそらく Requests に貢献することに興味があるのかもしれません。 +ありがとうございます! +オープンソースのプロジェクトは、他の方からのサポートを基にして成り立っていて、 +Requests プロジェクトに貢献することを考えているということは、*very* generous of you + +.. This document lays out guidelines and advice for contributing to this project. + If you're thinking of contributing, please start by reading this document and + getting a feel for how contributing to this project works. If you have any + questions, feel free to reach out to either `Ian Cordasco`_ or `Cory Benfield`_, + the primary maintainers. + +このドキュメントは、このプロジェクトに貢献するためのガイドラインとアドバイスについて説明しています。 +貢献することを考えているなら、まずはこのドキュメントを読んで、このプロジェクトにどのように貢献していけるかを感じてみて下さい。 +不明な点があるなら、主要メンテナの `Ian Cordasco`_ か `Cory Benfield`_ のどちらかに気軽に聞いて下さい。 + +.. _Ian Cordasco: http://www.coglib.com/~icordasc/ +.. _Cory Benfield: https://lukasa.co.uk/about + +.. If you have non-technical feedback, philosophical ponderings, crazy ideas, or + other general thoughts about Requests or its position within the Python + ecosystem, the BDFL, `Kenneth Reitz`_, would love to hear from you. + +技術的なこと以外のフィードバック、哲学的な考え、クレイジーなアイデア、Python エコシステム内での位置づけや Requests についてのその他の一般的な考えがある場合、 +BDFL である `Kenneth Reitz`_ は、あなたからの意見に耳を傾けます。 + +.. The guide is split into sections based on the type of contribution you're + thinking of making, with a section that covers general guidelines for all + contributors. + +このガイドは、作成しようと考えているコントリビューションの方法によって分類され、 +全てのコントリビューター用の標準のガイドラインを網羅している分野のどこかに属します。 + +.. _Kenneth Reitz: mailto:me@kennethreitz.org + +Be Cordial +---------- + + **Be cordial or be on your way**. *—Kenneth Reitz* + +.. Requests has one very important rule governing all forms of contribution, + including reporting bugs or requesting features. This golden rule is + "`be cordial or be on your way`_". + +Requests は、バグ報告や機能要望を含む全ての形式のコントリビューションを管理するためのとても重要なルールが1つあります。 +このゴールデンルールは、「`be cordial or be on your way`_」です。。 + +.. **All contributions are welcome**, as long as + everyone involved is treated with respect. + +関係する全ての人に対して敬意を払っている限り、**全てのコントリビューションは歓迎します**。 + +.. _be cordial or be on your way: http://kennethreitz.org/be-cordial-or-be-on-your-way/ + +.. _early-feedback: + +早めにフィードバックをもらいましょう +------------------------------------ + +.. Get Early Feedback + ------------------ + +.. If you are contributing, do not feel the need to sit on your contribution until + it is perfectly polished and complete. It helps everyone involved for you to + seek feedback as early as you possibly can. Submitting an early, unfinished + version of your contribution for feedback in no way prejudices your chances of + getting that contribution accepted, and can save you from putting a lot of work + into a contribution that is not suitable for the project. + +プロジェクトに参加している場合、完璧になるまで作業を完了させるまで努力しようとする必要性を感じないで下さい。 +プロジェクトに関わっている人のだれかが、できるだけ早くフィードバックを得れるようにサポートしてくれます。 +フィードバックを受けるための未完成版のコントリビューションを早めに送ることで、 +コントリビューションが受け入れられる可能性があるかどうかを判断する機会があり、 +プロジェクトに適さないコントリビューションに多くの労力を費やすことを防いでくれます。 + +Contribution Suitability +------------------------ + +.. Our project maintainers have the last word on whether or not a contribution is + suitable for Requests. All contributions will be considered carefully, but from + time to time, contributions will be rejected because they do not suit the + current goals or needs of the project. + +プロジェクトのメンテナは、コントリビューションが Requests に適しているかどうかの最終権限を持っています。 +全てのコントリビューションは慎重に検討され、プロジェクトの現在の目標やニーズにあわない場合に拒否されます。 + +.. If your contribution is rejected, don't despair! As long as you followed these + guidelines, you will have a much better chance of getting your next + contribution accepted. + +コントリビューションが拒否された場合、絶望しないで下さい! +これらのガイドラインに従っている限り、次のコントリビューションが受け入れられるさらなるチャンスがあると思います。 + +.. Code Contributions + ------------------ + +コードへのコントリビューション +------------------------------------ + +.. Steps for Submitting Code + ~~~~~~~~~~~~~~~~~~~~~~~~~ + +修正したコードを送る際のステップ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. When contributing code, you'll want to follow this checklist: + +コードへのコントリビューションを行う際は、以下のチェックリストに従う必要があります。: + +.. Fork the repository on GitHub. +.. Run the tests to confirm they all pass on your system. If they don't, you'll + need to investigate why they fail. If you're unable to diagnose this + yourself, raise it as a bug report by following the guidelines in this + document: :ref:`bug-reports`. +.. Write tests that demonstrate your bug or feature. Ensure that they fail. +.. Make your change. +.. Run the entire test suite again, confirming that all tests pass *including + the ones you just added*. +.. Send a GitHub Pull Request to the main repository's ``master`` branch. + GitHub Pull Requests are the expected method of code collaboration on this + project. + +1. GitHub のリポジトリをフォークします。 +2. テストを実行して、全てのシステムが問題なく通ることを確認して下さい。 + テストが通らなかった場合、なぜテストが失敗するのか調べる必要があります。 + 調べてもわからなかった場合、このドキュメントのガイドラインに従って :ref:`bug-reports` の報告をして下さい。 +3. バグや機能のデモをするためのテストを書いて下さい。テストが失敗することを確認してください。 +4. 変更を加えます。 +5. テストスイート全体を再度実行して、*追加したばかりのテスト* が全て通ったことを確認して下さい。 +6. メインリポジトリの ``master`` ブランチにプルリクエストを送ります。 + GitHub のプルリクエストは、このプロジェクトで必要とされているコードのコラボレーション方法を提供している機能です。 + +.. The following sub-sections go into more detail on some of the points above. + +以下の章では、以上の幾つかのポイントについて詳細に説明しています。 + +.. Code Review + ~~~~~~~~~~~ + +コードレビュー +~~~~~~~~~~~~~~~~ + +.. Contributions will not be merged until they've been code reviewed. You should + implement any code review feedback unless you strongly object to it. In the + event that you object to the code review feedback, you should make your case + clearly and calmly. If, after doing so, the feedback is judged to still apply, + you must either apply the feedback or withdraw your contribution. + +プロジェクトへのコントリビューションは、コードレビューされるまで、マージされません。 +強く反対しない限り、コードへのレビューのフィードバックは修正する必要があります。 +コードレビューへのフィードバックに異議を唱える場合、状況を整理して、落ち着いて下さい。 +その後、フィードバックが有効だと判断された場合は、フィードバックを適用するか、コントリビューションを取り消す必要があります。 + +.. New Contributors + ~~~~~~~~~~~~~~~~ + +新規のコントリビューター +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. If you are new or relatively new to Open Source, welcome! Requests aims to + be a gentle introduction to the world of Open Source. If you're concerned about + how best to contribute, please consider mailing a maintainer (listed above) and + asking for help. + +オープンソースプロジェクトへの参加を比較的最近はじめた人であれば、歓迎します! +Requests はオープンソースの世界への第一歩となることを目指しています。 +どのように参加するかが心配しているなら、(上で掲載している)メンテナにメールを送って、助けになることがあるか聞いてみて下さい。 + +.. Please also check the :ref:`early-feedback` section. + +:ref:`early-feedback` の章もあるので、確認してみて下さい。 + +.. Kenneth Reitz's Code Style™ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Kenneth Reitz のコードスタイル™ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. The Requests codebase uses the `PEP 8`_ code style. + +Requests は、`PEP 8`_ のコードスタイルを基にしています。 + +.. In addition to the standards outlined in PEP 8, we have a few guidelines: + +PEP 8 で述べられている基準に加えて、いくつかのガイドラインがあります。: + +.. Line-length can exceed 79 characters, to 100, when convenient. +.. Line-length can exceed 100 characters, when doing otherwise would be *terribly* inconvenient. +.. Always use single-quoted strings (e.g. ``'#flatearth'``), unless a single-quote occurs within the string. + +- 行の長さは、状況によって79文字を超えて、100文字までにすることができます。 +- 行の長さは、100文字を超えることができ、そうしないと不便なことがあります。 +- 文字列内にシングルクォートが含まれていない限り、文字列はシングルクォートを使って下さい(例: ``'#flatearth'``)。 + +.. Additionally, one of the styles that PEP8 recommends for `line continuations`_ + completely lacks all sense of taste, and is not to be permitted within + the Requests codebase:: + +さらに、`line continuations`_ として PEP8 が推奨しているスタイルの1つは全然良くなくて、 +Requests のコードでは許可していません。:: + + # Aligned with opening delimiter. + foo = long_function_name(var_one, var_two, + var_three, var_four) + +.. No. Just don't. Please. + +良くないです、お願いですからそのように書かないで下さい。 + +.. Docstrings are to follow the following syntaxes:: + +Docstrings は、以下のようなシンタックスにしてください。:: + + def the_earth_is_flat(): + """NASA divided up the seas into thirty-three degrees.""" + pass + +:: + + def fibonacci_spiral_tool(): + """With my feet upon the ground I lose myself / between the sounds + and open wide to suck it in. / I feel it move across my skin. / I'm + reaching up and reaching out. / I'm reaching for the random or + whatever will bewilder me. / Whatever will bewilder me. / And + following our will and wind we may just go where no one's been. / + We'll ride the spiral to the end and may just go where no one's + been. + + Spiral out. Keep going... + """ + pass + +.. All functions, methods, and classes are to contain docstrings. Object data + model methods (e.g. ``__repr__``) are typically the exception to this rule. + +すべての関数、メソッド、クラスに、Docstrings が含まれています。 +通常のオブジェクトのデータモデルのメソッド(例: ``__repr__``)は、このルールの適用外です。 + +.. Thanks for helping to make the world a better place! + +世の中が良くなるために協力してくれて有難うございます! + +.. _PEP 8: http://pep8.org +.. _line continuations: https://www.python.org/dev/peps/pep-0008/#indentation + +.. Documentation Contributions + --------------------------- + +ドキュメントへの貢献 +-------------------------------- + +.. Documentation improvements are always welcome! The documentation files live in + the ``docs/`` directory of the codebase. They're written in + `reStructuredText`_, and use `Sphinx`_ to generate the full suite of + documentation. + +ドキュメントの改善は、いつでも歓迎します! +ドキュメントのファイルは、コードの ``docs/`` ディレクトリにあります。 +ドキュメントのファイルは、`reStructuredText`_ で書かれていて、 +`Sphinx`_ を使ってドキュメント全体を生成しています。 + +.. When contributing documentation, please do your best to follow the style of the + documentation files. This means a soft-limit of 79 characters wide in your text + files and a semi-formal, yet friendly and approachable, prose style. + +ドキュメントに貢献する際は、ドキュメントファイルのスタイルに極力従うようにして下さい。 +これは、テキストファイルの半角79文字幅の、半分正式ですが親しみやすい書式の、 +ゆるい制限があることを意味しています。 + +.. When presenting Python code, use single-quoted strings (``'hello'`` instead of + ``"hello"``). + +Python コードを表示する際は、 +シングルクォーテーションの文字列(``"hello"`` ではなく ``'hello'``)にしてください。 + +.. _reStructuredText: http://docutils.sourceforge.net/rst.html +.. _Sphinx: http://sphinx-doc.org/index.html + + +.. _bug-reports: + +バグレポート +---------------- + +.. Bug Reports + ----------- + +.. Bug reports are hugely important! Before you raise one, though, please check + through the `GitHub issues`_, **both open and closed**, to confirm that the bug + hasn't been reported before. Duplicate bug reports are a huge drain on the time + of other contributors, and should be avoided as much as possible. + +バグレポートはとても重要です! +しかし、バグが既に報告されていないことを確認するために、 +`GitHub issues`_ の **Open と Closed** をチェックして下さい。 +重複したバグレポートは、他のコントリビューターの時間の大幅な無駄になるので、できるだけ避けたいです。 + +.. _GitHub issues: https://github.com/requests/requests/issues + + +.. Feature Requests + ---------------- + +機能要望 +------------------- + +.. Requests is in a perpetual feature freeze, only the BDFL can add or approve of + new features. The maintainers believe that Requests is a feature-complete + piece of software at this time. + +Requests は機能追加を停止していて、BDFL のみが新しい機能を追加、承認することができます。 +メンテナは、Requests は現時点では機能を満たしたソフトウェアであると考えています。 + +.. One of the most important skills to have while maintaining a largely-used + open source project is learning the ability to say "no" to suggested changes, + while keeping an open ear and mind. + +幅広く使われているオープンソースのプロジェクトを維持し続けるための重要なスキルの1つとして、 +耳を傾ける心を保ちながら、提案されたことに「NO」と言えるようになることです。 + +.. If you believe there is a feature missing, feel free to raise a feature + request, but please do be aware that the overwhelming likelihood is that your + feature request will not be accepted. + +機能が不足していると思った場合、機能要望を気軽にお寄せ下さい。 +しかし、機能要望が受け入れられないこともあることにも注意して下さい。 diff --git a/docs/dev/internals.rst b/docs/dev/internals.rst deleted file mode 100644 index e69de29..0000000 diff --git a/docs/dev/philosophy.rst b/docs/dev/philosophy.rst old mode 100644 new mode 100755 index d6d94bb..919add1 --- a/docs/dev/philosophy.rst +++ b/docs/dev/philosophy.rst @@ -1,41 +1,90 @@ -Development Philosophy -====================== +.. Development Philosophy + ====================== + +開発哲学 +========================= Requests is an open but opinionated library, created by an open but opinionated developer. +.. Management Style + ~~~~~~~~~~~~~~~~ + +マネジメントスタイル +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. `Kenneth Reitz `_ is the BDFL. He has final say in any decision related to the Requests project. Kenneth is responsible for the direction and form of the library, as well as its presentation. In addition to making decisions based on technical merit, he is responsible for making decisions based on the development philosophy of Requests. + +`Kenneth Reitz `_ は BDFL です。 +彼は Requests プロジェクトに関する最終的な発言権を持っています。 +Kenneth はライブラリの方向性や形式、プレゼンテーションを担当しています。 +技術的な優位性に基づいて意思決定を行うほか、Requests の開発哲学に基づいて意思決定を行う責任があります。 + +.. `Ian Cordasco `_ and `Cory Benfield `_ are the core contributors. They are responsible for triaging bug reports, reviewing pull requests and ensuring that Kenneth is kept up to speed with developments around the library. The day-to-day managing of the project is done by the core contributors. They are responsible for making judgements about whether or not a feature request is likely to be accepted by Kenneth. Their word is, in some ways, more final than Kenneth's. + +`Ian Cordasco `_ と `Cory Benfield `_ はコアコントリビューターです。 +彼らは、バグレポートの審査、プルリクエストのレビュー、Kenneth がライブラリ関連の開発のスピードを上げることを担保する責任があります。 +プロジェクトの日常的な管理は、コアコントリビューターによって行われます。 +機能要望があった場合に Kenneth に受け入れられるかどうかを判断する責任があります。 +彼らの言葉は、ある意味では Kenneth の言葉よりも最終的なものとなります。 + +.. Values + ~~~~~~ + +価値観 +~~~~~~~~~~~~ + +.. Simplicity is always better than functionality. +.. Listen to everyone, then disregard it. +.. The API is all that matters. Everything else is secondary. +.. Fit the 90% use-case. Ignore the nay-sayers. + +- シンプルさは機能的なことより優れています。 +- 様々な意見に耳を傾け、受け流して下さい。 +- API はすべてのことより重要です、これ以外のことは2番目です。 +- 90%のユースケースに当てはまり、Ignore the nay-sayers. + +.. Semantic Versioning + ~~~~~~~~~~~~~~~~~~~ + +セマンティックバージョニング +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. For many years, the open source community has been plagued with version number dystonia. Numbers vary so greatly from project to project, they are practically meaningless. + +長年に渡り、オープンソースコミュニティはバージョン番号のストレスに悩まされてきました。 +数字はプロジェクトごとに大きく異なるため無意味です。 -Benevolent Dictator -~~~~~~~~~~~~~~~~~~~ +.. Requests uses `Semantic Versioning `_. This specification seeks to put an end to this madness with a small set of practical guidelines for you and your colleagues to use in your next project. -`Kenneth Reitz `_ is the BDFL. He has final say in any decision related to Requests. +Requests は `Semantic Versioning `_ を採用しています。 +This specification seeks to put an end to this madness with a small set of practical guidelines for you and your colleagues to use in your next project. -Values -~~~~~~ +.. Standard Library? + ~~~~~~~~~~~~~~~~~ -- Simplicity is always better than functionality. -- Listen to everyone, then disregard it. -- The API is all that matters. Everything else is secondary. -- Fit the 90% use-case. Ignore the nay-sayers. +標準ライブラリ? +~~~~~~~~~~~~~~~~~~~~ -Semantic Versioning -~~~~~~~~~~~~~~~~~~~ +.. Requests has no *active* plans to be included in the standard library. This decision has been discussed at length with Guido as well as numerous core developers. -For many years, the open source community has been plagued with version number dystonia. Numbers vary so greatly from project to project, they are practically meaningless. +Requests は標準ライブラリに含まれるという *具体的な* 計画はありません。 +これは Guido や数多くのコア開発者によって長らく議論されて出た結論です。 -Requests uses `Semantic Versioning `_. This specification seeks to put an end to this madness with a small set of practical guidelines for you and your colleagues to use in your next project. +.. Essentially, the standard library is where a library goes to die. It is appropriate for a module to be included when active development is no longer necessary. -Standard Library? -~~~~~~~~~~~~~~~~~ +本質的に、標準ライブラリはライブラリの成長が止まるところです。 +アクティブな開発が必要ない時にモジュールに組み込まれることが適切です。 -Requests has no *active* plans to be included in the standard library. This decision has been discussed at length with Guido as well as numerous core developers. +.. Linux Distro Packages + ~~~~~~~~~~~~~~~~~~~~~ -Essentially, the standard library is where a library goes to die. It is appropriate for a module to be included when active development is no longer necessary. +Linux ディストリビューションパッケージ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Requests just reached v1.0.0. This huge milestone marks a major step in the right direction. +.. Distributions have been made for many Linux repositories, including: Ubuntu, Debian, RHEL, and Arch. -Linux Distro Packages -~~~~~~~~~~~~~~~~~~~~~ +Ubuntu、Debian、RHEL、Arch を含むディストリビューションは数多くの Linux のリポジトリから配布されています。 -Distributions have been made for many Linux repositories, including: Ubuntu, Debian, RHEL, and Arch. +.. These distributions are sometimes divergent forks, or are otherwise not kept up-to-date with the latest code and bugfixes. PyPI (and its mirrors) and GitHub are the official distribution sources; alternatives are not supported by the Requests project. -These distributions are often aggressive forks. They are discouraged and not supported. \ No newline at end of file +これらのディストリビューションは時には分岐フォークであるか、あるいは最新のコードとバグ修正で最新の状態に保たれていないことがあります。 PyPI(およびそのミラー)とGitHubは公式の配布元です。 代替案はRequestsプロジェクトではサポートされていません。 diff --git a/docs/dev/todo.rst b/docs/dev/todo.rst old mode 100644 new mode 100755 index 09c2aa2..9622453 --- a/docs/dev/todo.rst +++ b/docs/dev/todo.rst @@ -1,49 +1,91 @@ -How to Help -=========== - -Requests is under active development, and contributions are more than welcome! - -#. Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug. - There is a Contributor Friendly tag for issues that should be ideal for people who are not very - familiar with the codebase yet. -#. Fork `the repository `_ on Github andstart making your - changes to a new branch. -#. Write a test which shows that the bug was fixed or that the feature works as expected. -#. Send a pull request and bug the maintainer until it gets merged and published. :) - Make sure to add yourself to `AUTHORS `_. - -Development Dependencies ------------------------- - -You'll need to install py.test in order to run the Requests' test suite:: - - $ make test-deps - $ make test - py.test - platform darwin -- Python 2.7.3 -- pytest-2.3.4 - collected 25 items - - test_requests.py ......................... - 25 passed in 3.50 seconds - -Runtime Environments --------------------- - -Requests currently supports the following versions of Python: - -- Python 2.6 -- Python 2.7 -- Python 3.1 -- Python 3.2 -- Python 3.3 -- PyPy 1.9 - -Support for Python 3.1 and 3.2 may be dropped at any time. - -Google App Engine will never be officially supported. Pull requests for compatiblity will be accepted, as long as they don't complicate the codebase. - - -Are you crazy? --------------- - -- SPDY support would be awesome. No C extensions. \ No newline at end of file +.. How to Help + =========== + +サポート方法 +============== + +.. Requests is under active development, and contributions are more than welcome! + +Requests は活発に開発されていて、コントリビューターをさらに歓迎します! + +.. Check for open issues or open a fresh issue to start a discussion around a bug. + There is a Contributor Friendly tag for issues that should be ideal for people who are not very + familiar with the codebase yet. +.. Fork `the repository `_ on GitHub and start making your + changes to a new branch. +.. Write a test which shows that the bug was fixed. +.. Send a pull request and bug the maintainer until it gets merged and published. :) + Make sure to add yourself to `AUTHORS `_. + +#. バグに関するディスカッションを開始するための新規の Issues を作成するか、既に Issues があるかチェックしてみて下さい。 + まだコードに慣れていない方にぴったりの Contributor Friendly タグがあります。 +#. GitHub の `リポジトリ `_ をフォークして、新しいブランチで作業を始めて下さい。 +#. バグが修正されたことを示すためのテストを書いて下さい。 +#. プルリクエストを送り、マージされて公開されるまでバグをメンテナンスして下さい。 + `AUTHORS `_ に自身の名前を追加して下さい。 + +.. Feature Freeze + -------------- + +機能のフリーズ +----------------- + +.. As of v1.0.0, Requests has now entered a feature freeze. Requests for new + features and Pull Requests implementing those features will not be accepted. + +v1.0.0 以降、Requests は新規機能の停止をしました。 +新しい機能の要望やプルリクエストは受け付けていません。 + +Development Dependencies +------------------------ + +.. You'll need to install py.test in order to run the Requests' test suite:: + +Requests のテストスイートを実行するには、py.test をインストールする必要があります。:: + + $ venv .venv + $ source .venv/bin/activate + + $ make + $ python setup.py test + ============================= test session starts ============================== + platform darwin -- Python 3.4.4, pytest-3.0.6, py-1.4.32, pluggy-0.4.0 + ... + collected 445 items + + tests/test_hooks.py ... + tests/test_lowlevel.py ............ + tests/test_requests.py ........................................................... + tests/test_structures.py .................... + tests/test_testserver.py ........... + tests/test_utils.py ..s........................................................... + + ============== 442 passed, 1 skipped, 2 xpassed in 46.48 seconds =============== + +.. You can also run ``$ make tests`` to run against all supported Python versions, using tox/detox. + +サポートしている全ての Python バージョンに対して、tox/detox を使ってテスト実行することもできて、``$ make tests`` を実行して下さい。 + +.. Runtime Environments + -------------------- + +ランタイム環境 +-------------------- + +.. Requests currently supports the following versions of Python: + +Requests は、現在以下の Python バージョンをサポートしています。: + +- Python 2.6 +- Python 2.7 +- Python 3.4 +- Python 3.5 +- Python 3.6 +- PyPy + +.. Google AppEngine is not officially supported although support is available + with the `Requests-Toolbelt`_. + +Google AppEngine では、公式にはサポートしていませんが、`Requests-Toolbelt`_ を使うことで有効にできます。 + +.. _Requests-Toolbelt: http://toolbelt.readthedocs.io/ diff --git a/docs/index.rst b/docs/index.rst old mode 100644 new mode 100755 index 6640e5c..8c01c3e --- a/docs/index.rst +++ b/docs/index.rst @@ -1,209 +1,247 @@ -.. Requests documentation master file, created by - sphinx-quickstart on Sun Feb 13 23:54:25 2011. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -.. Requests: HTTP for Humans - ========================= - -Requests: 人間のためのHTTP -============================ - -.. Release v\ |version|. (:ref:`Installation `) - -リリース v\ |version|. (:ref:`Installation `) - -.. Requests is an :ref:`Apache2 Licensed ` HTTP library, written in Python, for human beings. - -Requestsは、人が使いやすいように設計されていて、Pythonで書かれている :ref:`Apache2 Licensed ` ベースのHTTPライブラリです。 - -.. Python's standard **urllib2** module provides most of - the HTTP capabilities you need, but the API is thoroughly **broken**. - It was built for a different time — and a different web. It requires an *enormous* amount of work (even method overrides) to perform the simplest of tasks. - -Pythonの標準の **urllib2** モジュールは、必要とされるほとんどのHTTPの機能を備えていますが、APIがまともに **使えません** 。 -様々なウェブ用途に合わせて作られていて、何回も修正されてきました。 -簡単なことを行う(メソッドの上書きでさえ)のに、 *かなり* の量の作業が必要になります。 - -.. Things shouldn’t be this way. Not in Python. - -それはPython的ではないので、そんなに複雑にするべきではありません。 - -:: - - >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) - >>> r.status_code - 200 - >>> r.headers['content-type'] - 'application/json; charset=utf8' - >>> r.encoding - 'utf-8' - >>> r.text - u'{"type":"User"...' - >>> r.json() - {u'private_gists': 419, u'total_private_repos': 77, ...} - -.. See `similar code, without Requests `_. - -`Requestsを使わずに同じ事をするためのコード `_ を見て下さい。 - -.. Requests takes all of the work out of Python HTTP/1.1 — making your integration with web services seamless. There's no need to manually add query strings to your URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling are 100% automatic, powered by `urllib3 `_, which is embedded within Requests. - -Requestsは、ウェブサービスとシームレスに統合されたPythonのHTTP/1.1の処理の全てを受け持ちます。 -URLに手動でクエリを入力したり、POSTデータをエンコードしたりする必要はありません。 -Keep-aliveやHTTP接続のプーリングは、Requestsに `urllib3 `_ が組み込まれているので、100%自動で行われます。 - - -.. Testimonials - ------------ - -推薦文 ---------------- - -.. Amazon, Google, Twilio, Mozilla, Heroku, PayPal, NPR, Obama for America, Transifex, Native Instruments, The Washington Post, Twitter, SoundCloud, Kippt, Readability, and Federal US Institutions use Requests internally. It has been downloaded over 1,500,000 times from PyPI. - -Amazon、Google、Twilio, Mozilla, Heroku, PayPal, NPR, Obama for America, Transifex, Native Instruments, The Washington Post, Twitter, SoundCloud、Kippt、Readability、Federal US Institutions -は内部でRequestsを使っています。PyPIから1,500,000回以上インストールされました。 - -**Armin Ronacher** - .. Requests is the perfect example how beautiful an API can be with the - right level of abstraction. - - Requestsは、どのようにして綺麗なAPIを正しく抽象化できるかの完璧な例です。 - -**Matt DeBoard** - .. I'm going to get @kennethreitz's Python requests module tattooed - on my body, somehow. The whole thing. - - @kennethreitz さんのPythonのRequestsモジュールのタトゥーを何とかして体に入れたい。以上。 - -**Daniel Greenfeld** - .. Nuked a 1200 LOC spaghetti code library with 10 lines of code thanks to - @kennethreitz's request library. Today has been AWESOME. - - 1200行のスパゲッティーコードのライブラリを数10行くらいのコードにしてくれた@kennethreitzのリクエストライブラリに感謝しています。 - すばらしくなりました。 - -**Kenny Meyers** - .. Python HTTP: When in doubt, or when not in doubt, use Requests. Beautiful, - simple, Pythonic. - - PythonのHTTPの実装: 使うか迷ったときも、そうでない時も、Requestsを使います。綺麗な設計で、シンプルで、Pythonicだ。 - - -.. Feature Support - --------------- - -サポートする機能 ------------------- - -.. Requests is ready for today's web. - -Requestsは、今日(こんにち)のウェブに欠かせない機能を持っています。 - -.. International Domains and URLs -.. Keep-Alive & Connection Pooling -.. Sessions with Cookie Persistence -.. Browser-style SSL Verification -.. Basic/Digest Authentication -.. Elegant Key/Value Cookies -.. Automatic Decompression -.. Unicode Response Bodies -.. Multipart File Uploads -.. Connection Timeouts -.. ``.netrc`` support -.. Python 2.6—3.3 -.. Thread-safe. - -- ドメインとURLの国際化 -- Keep-Aliveとコネクションプーリング -- Cookieによるセッションの永続化 -- ブラウザのようなSSLによる接続 -- ベーシック/ダイジェスト認証 -- エレガントなキー/バリューによるCookie -- 圧縮の自動的な展開 -- レスポンスの本文のユニコード化 -- マルチパートファイルのアップロード -- コネクションのタイムアウト -- ``.netrc`` のサポート -- Python 2.6-3.3に対応 -- スレッドセーフ - - -.. User Guide - ---------- - -ユーザーガイド --------------------- - -.. This part of the documentation, which is mostly prose, begins with some - background information about Requests, then focuses on step-by-step - instructions for getting the most out of Requests. - -ドキュメントのこの章は、Requestsに関するいくつかのバックグラウンドを紹介します。 -それから、Requestsを最大限に使うための説明をステップ・バイ・ステップで紹介することにフォーカスしています。 - -.. toctree:: - :maxdepth: 2 - - user/intro - user/install - user/quickstart - user/advanced - user/authentication - - -.. Community Guide - ----------------- - -コミュニティガイド --------------------- - -.. This part of the documentation, which is mostly prose, details the - Requests ecosystem and community. - -ドキュメントのこの章は、Requestsのエコシステムやコミュニティについて紹介します。 - -.. toctree:: - :maxdepth: 1 - - community/faq - community/out-there.rst - community/support - community/updates - -.. API Documentation - ----------------- - -APIドキュメント --------------------- - -.. If you are looking for information on a specific function, class or method, - this part of the documentation is for you. - -特定の関数やクラスやメソッドの情報を探している場合は、ドキュメントのこの章を見て下さい。 - -.. toctree:: - :maxdepth: 2 - - api - - -.. Contributor Guide - ----------------- - -コントリビューター用のガイド ----------------------------------- - -.. If you want to contribute to the project, this part of the documentation is for - you. - -プロジェクトに貢献する場合は、ドキュメントのこの章を見て下さい。 - -.. toctree:: - :maxdepth: 1 - - dev/philosophy - dev/internals - dev/todo - dev/authors \ No newline at end of file +.. Requests documentation master file, created by + sphinx-quickstart on Sun Feb 13 23:54:25 2011. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Requests: HTTP for Humans +========================= + +Release v\ |version|. (:ref:`Installation `) + +.. image:: https://img.shields.io/pypi/l/requests.svg + :target: https://pypi.python.org/pypi/requests + +.. image:: https://img.shields.io/pypi/wheel/requests.svg + :target: https://pypi.python.org/pypi/requests + +.. image:: https://img.shields.io/pypi/pyversions/requests.svg + :target: https://pypi.python.org/pypi/requests + +.. image:: https://codecov.io/github/requests/requests/coverage.svg?branch=master + :target: https://codecov.io/github/requests/requests + :alt: codecov.io + +.. image:: https://img.shields.io/badge/Say%20Thanks!-🦉-1EAEDB.svg + :target: https://saythanks.io/to/kennethreitz + + +.. **Requests** is the only *Non-GMO* HTTP library for Python, safe for human + consumption. + +**Requests** は、人が使いやすいように考慮された Python 用の *遺伝子組み換えがされていない* HTTP ライブラリです。 + +.. *Warning: Recreational use of the Python standard library for HTTP may result in dangerous side-effects, + including: security vulnerabilities, verbose code, reinventing the wheel, + constantly reading documentation, depression, headaches, or even death.* + +*警告: Python の HTTP 用の標準ライブラリを気軽に使うと、 +セキュリティ上の脆弱性、コードの冗長化、車輪の再発明等の危険な副作用が生じる可能性があります。* + +------------------- + +.. **Behold, the power of Requests**:: + +**Requests の良さを御覧ください**:: + + >>> import requests + >>> r = requests.get('https://api.github.com/user', auth=('user', 'pass')) + >>> r.status_code + 200 + >>> r.headers['content-type'] + 'application/json; charset=utf8' + >>> r.encoding + 'utf-8' + >>> r.text + u'{"type":"User"...' + >>> r.json() + {u'private_gists': 419, u'total_private_repos': 77, ...} + +.. See `similar code, sans Requests `_. + +`Requests を使わない場合のコード `_ も参照してみて下さい。 + +.. **Requests** allows you to send *organic, grass-fed* HTTP/1.1 requests, without the + need for manual labor. There's no need to manually add query strings to your + URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling + are 100% automatic, thanks to `urllib3 `_. + +**Requests** を使用すると、手作業を必要とせずに、*organic, grass-fed* な HTTP/1.1 リクエストを送信することができます。 +クエリ文字列を URL に追加したり、POST データをフォームエンコードしたりを手動でする必要はありません。 +Keep-alive と HTTP のコネクションプールは、`urllib3 `_ のおかげで100%自動で行われます。 + +.. User Testimonials + ----------------- + +推薦文 +----------------- + +.. Twitter, Spotify, Microsoft, Amazon, Lyft, BuzzFeed, Reddit, The NSA, Her Majesty's Government, Google, Twilio, Runscope, Mozilla, Heroku, + PayPal, NPR, Obama for America, Transifex, Native Instruments, The Washington + Post, SoundCloud, Kippt, Sony, and Federal U.S. + Institutions that prefer to be unnamed claim to use Requests internally. + +Twitter、Spotify、Microsoft、Amazon、Lyft、BuzzFeed、Reddit、NSA、イギリス政府、Google、 +Twilio、Runscope、Mozilla、Heroku、PayPal、NPR、Obama for America、Transifex、Native Instruments、 +ワシントン・ポスト、SoundCloud、Kippt、Sony、アメリカ合衆国連邦政府は、公表していませんが内部的に Requests を使っています。 + +**Armin Ronacher**— + .. *Requests is the perfect example how beautiful an API can be with the + right level of abstraction.* + + *Requests は、どれくらい API が適切な抽象レベルで美しくできるかの完璧な例です。* + +**Matt DeBoard**— + .. *I'm going to get Kenneth Reitz's Python requests module tattooed + on my body, somehow. The whole thing.* + + *Kenneth Reitz の Python のリクエストモジュールの入れ墨を体に入れようと思います。以上。* + +**Daniel Greenfeld**— + .. *Nuked a 1200 LOC spaghetti code library with 10 lines of code thanks to + Kenneth Reitz's request library. Today has been AWESOME.* + + *Kenneth Reitz のリクエストライブラリのおかげで10行のコードで1200行のスパゲッティコードと同じことができます。すばらしい時代になりました。* + +**Kenny Meyers**— + .. *Python HTTP: When in doubt, or when not in doubt, use Requests. Beautiful, + simple, Pythonic.* + + *Python HTTP: 使うか迷った時も、迷わなかった時も、Requests を使います。美しく、シンプルで、Pythonic です。* + +.. Requests is one of the most downloaded Python packages of all time, pulling in + over 11,000,000 downloads every month. All the cool kids are doing it! + +Requests は最も多くダウンロードされている Python パッケージの1つで、毎月11,000,000回以上ダウンロードされています。 +賢い人はみんな使っています! + +.. Beloved Features + ---------------- + +愛する機能 +---------------- + +.. Requests is ready for today's web. + +Requestsは、今日(こんにち)のウェブに欠かせない機能を持っています。 + +.. Keep-Alive & Connection Pooling +.. International Domains and URLs +.. Sessions with Cookie Persistence +.. Browser-style SSL Verification +.. Automatic Content Decoding +.. Basic/Digest Authentication +.. Elegant Key/Value Cookies +.. Automatic Decompression +.. Unicode Response Bodies +.. HTTP(S) Proxy Support +.. Multipart File Uploads +.. Streaming Downloads +.. Connection Timeouts +.. Chunked Requests +.. ``.netrc`` Support + +- キープアライブとコネクションプール +- ドメインとURLの国際化 +- Cookie によるセッションの永続化 +- ブラウザスタイルの SSL 検証 +- 自動のコンテンツデコード +- Basic/Digest 認証 +- 自動な解凍 +- エレガントなキーと値の Cookies +- Unicode レスポンスボディ +- HTTP(S) プロキシのサポート +- マルチパートのファイルアップロード +- ストリーミング形式のダウンロード +- コネクションのタイムアウト +- チャンク化されたリクエスト +- ``.netrc`` のサポート + +.. Requests officially supports Python 2.6–2.7 & 3.4–3.7, and runs great on PyPy. + +Requests は公式に Python 2.6〜2.7 と 3.4〜3.7をサポートしていて、PyPyでも動きます。 + +.. The User Guide + -------------- + +ユーザーガイド +-------------- + +.. This part of the documentation, which is mostly prose, begins with some + background information about Requests, then focuses on step-by-step + instructions for getting the most out of Requests. + +ドキュメントのこの章では、Requests に関するバックグランドをいくつか紹介します。 +それから、Requests を最大限使いこなすための説明をステップ・バイ・ステップで説明しています。 + +.. toctree:: + :maxdepth: 2 + + user/intro + user/install + user/quickstart + user/advanced + user/authentication + + +.. The Community Guide + ------------------- + +コミュニティガイド +---------------------- + +.. This part of the documentation, which is mostly prose, details the + Requests ecosystem and community. + +ドキュメントのこの章では、Requests のエコシステムやコミュニティについて紹介します。 + +.. toctree:: + :maxdepth: 1 + + community/faq + community/recommended + community/out-there + community/support + community/vulnerabilities + community/updates + community/release-process + +.. The API Documentation / Guide + ----------------------------- + +APIドキュメント / ガイド +-------------------------------- + +.. If you are looking for information on a specific function, class, or method, + this part of the documentation is for you. + +特定の関数、クラス、メソッドの情報を探しているなら、ドキュメントのこの章が役に立つと思います。 + +.. toctree:: + :maxdepth: 2 + + api + + +.. The Contributor Guide + --------------------- + +コントリビューターの方のガイド +--------------------------------- + +.. If you want to contribute to the project, this part of the documentation is for + you. + +プロジェクトに参加する場合、以下のドキュメントが役に立つと思います。 + +.. toctree:: + :maxdepth: 3 + + dev/contributing + dev/philosophy + dev/todo + dev/authors + +.. There are no more guides. You are now guideless. + Good luck. + +これ以上の説明はありませんし、もう必要ないと思います。グッド・ラック。 diff --git a/docs/make.bat b/docs/make.bat old mode 100644 new mode 100755 index e69de29..9eaf9b8 --- a/docs/make.bat +++ b/docs/make.bat @@ -0,0 +1,263 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + echo. coverage to run coverage check of the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +REM Check if sphinx-build is available and fallback to Python version if any +%SPHINXBUILD% 1>NUL 2>NUL +if errorlevel 9009 goto sphinx_python +goto sphinx_ok + +:sphinx_python + +set SPHINXBUILD=python -m sphinx.__init__ +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +:sphinx_ok + + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Requests.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Requests.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "coverage" ( + %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage + if errorlevel 1 exit /b 1 + echo. + echo.Testing of coverage in the sources finished, look at the ^ +results in %BUILDDIR%/coverage/python.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end diff --git a/docs/user/advanced.rst b/docs/user/advanced.rst old mode 100644 new mode 100755 index 0c9275a..2350aac --- a/docs/user/advanced.rst +++ b/docs/user/advanced.rst @@ -1,33 +1,58 @@ .. _advanced: -Advanced Usage -============== +高度な使い方 +================= -This document covers some of Requests more advanced features. +.. Advanced Usage + ============== +.. This document covers some of Requests more advanced features. -Session Objects ---------------- +このドキュメントは、Requests のより高度な機能をいくつか紹介します。 -The Session object allows you to persist certain parameters across -requests. It also persists cookies across all requests made from the -Session instance. +.. _session-objects: -A session object has all the methods of the main Requests API. +セッションオブジェクト +------------------------------ -Let's persist some cookies across requests:: +.. Session Objects + --------------- + +.. The Session object allows you to persist certain parameters across + requests. It also persists cookies across all requests made from the + Session instance, and will use ``urllib3``'s `connection pooling`_. So if + you're making several requests to the same host, the underlying TCP + connection will be reused, which can result in a significant performance + increase (see `HTTP persistent connection`_). + +Session オブジェクトは特定のパラメータをリクエスト間で永続化することができます。 +``urllib3`` の `connection pooling`_ を使って、 +Session インスタンスの全てのリクエストで Cookie が永続化することもできます。 +したがって、同じホストに対して複数のリクエストを行う場合、基になる TCP 接続が再利用されるため、 +パフォーマンスが大幅に向上します(`HTTP persistent connection`_ を参照して下さい)。 + +.. A Session object has all the methods of the main Requests API. + +Session オブジェクトには、Requests の主な API の全てのメソッドがあります。 + +.. Let's persist some cookies across requests:: + +リクエスト間に渡る Cookie の永続化をやってみましょう:: s = requests.Session() s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') - r = s.get("http://httpbin.org/cookies") + r = s.get('http://httpbin.org/cookies') - print r.text + print(r.text) # '{"cookies": {"sessioncookie": "123456789"}}' -Sessions can also be used to provide default data to the request methods. This -is done by providing data to the properties on a session object:: +.. Sessions can also be used to provide default data to the request methods. This + is done by providing data to the properties on a Session object:: + +セッションはリクエストのメソッドにデフォルトデータを提供するためにも使用することができます。 +これは Session オブジェクトのプロパティにデータを提供することに行われます。:: s = requests.Session() s.auth = ('user', 'pass') @@ -37,28 +62,97 @@ is done by providing data to the properties on a session object:: s.get('http://httpbin.org/headers', headers={'x-test2': 'true'}) -Any dictionaries that you pass to a request method will be merged with the session-level values that are set. The method-level parameters override session parameters. +.. Any dictionaries that you pass to a request method will be merged with the + session-level values that are set. The method-level parameters override session + parameters. -.. admonition:: Remove a Value From a Dict Parameter +リクエストのメソッドに渡す任意のディクショナリは、設定されたセッションレベルの値とマージされます。 +メソッドレベルのパラメータは、セッションパラメータを上書きします。 - Sometimes you'll want to omit session-level keys from a dict parameter. To do this, you simply set that key's value to ``None`` in the method-level parameter. It will automatically be omitted. +.. Note, however, that method-level parameters will *not* be persisted across + requests, even if using a session. This example will only send the cookies + with the first request, but not the second:: -All values that are contained within a session are directly available to you. See the :ref:`Session API Docs ` to learn more. +注意することとして、セッションを使ってもメソッドレベルのパラメータはリクエスト間で**永続化されません**。 +以下の例では、最初のリクエストで Cookie を送信しますが、二回目は送信しません。:: -Request and Response Objects ----------------------------- + s = requests.Session() + + r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'}) + print(r.text) + # '{"cookies": {"from-my": "browser"}}' + + r = s.get('http://httpbin.org/cookies') + print(r.text) + # '{"cookies": {}}' + + +.. If you want to manually add cookies to your session, use the + :ref:`Cookie utility functions ` to manipulate + :attr:`Session.cookies `. + +セッションに Cookie を手動で追加する場合、:ref:`Cookie utility functions ` を使って、 +:attr:`Session.cookies ` を操作します。 + +.. Sessions can also be used as context managers:: + +セッションはコンテキストマネージャーとしても使えます。:: + + with requests.Session() as s: + s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') + +.. This will make sure the session is closed as soon as the ``with`` block is + exited, even if unhandled exceptions occurred. + +これにより、例外が処理できなかったとしても、 +``with`` ブロックが終了するとすぐにセッションを閉じることを保証しています。 + +.. Remove a Value From a Dict Parameter -Whenever a call is made to requests.*() you are doing two major things. First, -you are constructing a ``Request`` object which will be sent of to a server -to request or query some resource. Second, a ``Response`` object is generated -once ``requests`` gets a response back from the server. The response object -contains all of the information returned by the server and also contains the -``Request`` object you created originally. Here is a simple request to get some -very important information from Wikipedia's servers:: + Sometimes you'll want to omit session-level keys from a dict parameter. To + do this, you simply set that key's value to ``None`` in the method-level + parameter. It will automatically be omitted. + +.. admonition:: 辞書パラメータから値の削除 + + 場合によっては辞書パラメータからセッションレベルのキーを省略したい場合があります。 + これをするには、メソッドレベルのパラメータでキーの値をシンプルに ``None`` を設定するだけです。 + 自動的に省略されます。 + +.. All values that are contained within a session are directly available to you. + See the :ref:`Session API Docs ` to learn more. + +セッションに含まれている全ての値を直接アクセスすることができます。 +詳しくは、:ref:`Session API Docs ` を参照して下さい。 + +.. _request-and-response-objects: + +リクエストとレスポンスのオブジェクト +-------------------------------------------------------- + +.. Request and Response Objects + ---------------------------- + +.. Whenever a call is made to ``requests.get()`` and friends, you are doing two + major things. First, you are constructing a ``Request`` object which will be + sent off to a server to request or query some resource. Second, a ``Response`` + object is generated once Requests gets a response back from the server. + The ``Response`` object contains all of the information returned by the server and + also contains the ``Request`` object you created originally. Here is a simple + request to get some very important information from Wikipedia's servers:: + +``requests.get()`` や類似のメソッドを呼び出すたびに、2つの主要なことをしていることになります。 +まず、``Request`` オブジェクトを生成して、リソースをサーバーに要求するために送信します。 +次に、Requests がサーバーからのレスポンスを受け取ると ``Response`` オブジェクトが生成されます。 +``Response`` オブジェクトは、サーバーから返却された情報が全て含まれていて、 +元となった ``Request`` オブジェクトも含まれています。 +以下は、Wikipedia のサーバーからいくつかのとても重要な情報を取得するためのシンプルなリクエストです。:: >>> r = requests.get('http://en.wikipedia.org/wiki/Monty_Python') -If we want to access the headers the server sent back to us, we do this:: +.. If we want to access the headers the server sent back to us, we do this:: + +サーバーから返却されたヘッダーにアクセスするには以下のようにします。:: >>> r.headers {'content-length': '56170', 'x-content-type-options': 'nosniff', 'x-cache': @@ -70,79 +164,436 @@ If we want to access the headers the server sent back to us, we do this:: 'text/html; charset=UTF-8', 'x-cache-lookup': 'HIT from cp1006.eqiad.wmnet:3128, MISS from cp1010.eqiad.wmnet:80'} -However, if we want to get the headers we sent the server, we simply access the -request, and then the request's headers:: +.. However, if we want to get the headers we sent the server, we simply access the + request, and then the request's headers:: + +しかし、サーバーから返却されたヘッダーを取得する場合は、リクエストにアクセスし、リクエストのヘッダーにアクセスするだけです。:: >>> r.request.headers {'Accept-Encoding': 'identity, deflate, compress, gzip', - 'Accept': '*/*', 'User-Agent': 'python-requests/0.13.1'} + 'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'} + +.. _prepared-requests: + +Prepared Requests +----------------- + +.. Whenever you receive a :class:`Response ` object + from an API call or a Session call, the ``request`` attribute is actually the + ``PreparedRequest`` that was used. In some cases you may wish to do some extra + work to the body or headers (or anything else really) before sending a + request. The simple recipe for this is the following:: + +API や Session の呼び出しから :class:`Response ` オブジェクトを受け取る際に、 +``request`` 属性は、その際に使われた ``PreparedRequest`` となっています。 +場合によって、リクエストを送信する前にボディやヘッダー(または他のもの)に追加作業をしたいことがあります。 +簡単なやりかたは以下のとおりです。:: + + from requests import Request, Session + + s = Session() + + req = Request('POST', url, data=data, headers=headers) + prepped = req.prepare() + + # do something with prepped.body + prepped.body = 'No, I want exactly this as the body.' + + # do something with prepped.headers + del prepped.headers['Content-Type'] + resp = s.send(prepped, + stream=stream, + verify=verify, + proxies=proxies, + cert=cert, + timeout=timeout + ) -SSL Cert Verification + print(resp.status_code) + +.. Since you are not doing anything special with the ``Request`` object, you + prepare it immediately and modify the ``PreparedRequest`` object. You then + send that with the other parameters you would have sent to ``requests.*`` or + ``Session.*``. + +``Request`` オブジェクトは特別なことを何もしていないので、すぐに``PreparedRequest`` オブジェクト +それから ``requests.*`` や ``Session.*`` に送信した他のパラメータとともに送信します。 + +.. However, the above code will lose some of the advantages of having a Requests + :class:`Session ` object. In particular, + :class:`Session `-level state such as cookies will + not get applied to your request. To get a + :class:`PreparedRequest ` with that state + applied, replace the call to :meth:`Request.prepare() + ` with a call to + :meth:`Session.prepare_request() `, like this:: + +しかし、上記のコードは Requests の :class:`Session ` オブジェクトの利点をいくつか失います。 +特に、Cookie のような :class:`Session ` レベルの状態についてはリクエストに適用されません。 +その状態が適用された :class:`PreparedRequest ` を得るには、 +:meth:`Request.prepare() ` を呼び出して、以下のように +:meth:`Session.prepare_request() ` を呼び出すことで置換します。:: + + from requests import Request, Session + + s = Session() + req = Request('GET', url, data=data, headers=headers) + + prepped = s.prepare_request(req) + + # do something with prepped.body + prepped.body = 'Seriously, send exactly these bytes.' + + # do something with prepped.headers + prepped.headers['Keep-Dead'] = 'parrot' + + resp = s.send(prepped, + stream=stream, + verify=verify, + proxies=proxies, + cert=cert, + timeout=timeout + ) + + print(resp.status_code) + +.. _verification: + +SSL 証明書の検証 --------------------- -Requests can verify SSL certificates for HTTPS requests, just like a web browser. To check a host's SSL certificate, you can use the ``verify`` argument:: +.. SSL Cert Verification + --------------------- + +.. Requests verifies SSL certificates for HTTPS requests, just like a web browser. + By default, SSL verification is enabled, and Requests will throw a SSLError if + it's unable to verify the certificate:: + +Requests は、ウェブブラウザと同様に、HTTPS のリクエストの際に、SSL 証明書を検証します。 +デフォルトでは、SSL 証明書の検証が有効になっていて、Requests が証明書を検証できなかった場合、 +SSLError を送出します。 - >>> requests.get('https://kennethreitz.com', verify=True) - requests.exceptions.SSLError: hostname 'kennethreitz.com' doesn't match either of '*.herokuapp.com', 'herokuapp.com' + >>> requests.get('https://requestb.in') + requests.exceptions.SSLError: hostname 'requestb.in' doesn't match either of '*.herokuapp.com', 'herokuapp.com' -I don't have SSL setup on this domain, so it fails. Excellent. Github does though:: +.. I don't have SSL setup on this domain, so it throws an exception. Excellent. GitHub does though:: - >>> requests.get('https://github.com', verify=True) +このドメインの SSL のセットアップを持っていないので、例外が送出されます。 +いいですね。GitHub does though:: + + >>> requests.get('https://github.com') -You can also pass ``verify`` the path to a CA_BUNDLE file for private certs. You can also set the ``REQUESTS_CA_BUNDLE`` environment variable. +.. You can pass ``verify`` the path to a CA_BUNDLE file or directory with certificates of trusted CAs:: -Requests can also ignore verifying the SSL certficate if you set ``verify`` to False. +信頼できる認証局の証明書の CA_BUNDLE ファイルかディレクトリへのパスを ``verify`` に渡すことができます。:: -:: + >>> requests.get('https://github.com', verify='/path/to/certfile') + +.. or persistent:: + +もしくは永続化するには:: + + s = requests.Session() + s.verify = '/path/to/certfile' + +.. If ``verify`` is set to a path to a directory, the directory must have been processed using + the c_rehash utility supplied with OpenSSL. + +.. note:: ``verify`` がディレクトリへのパスに設定されている場合、そのディレクトリは OpenSSL に付属の c_rehash ユーティリティを使用して処理されている必要があります。 + +.. This list of trusted CAs can also be specified through the ``REQUESTS_CA_BUNDLE`` environment variable. + +信頼できる認証局のリストは、``REQUESTS_CA_BUNDLE`` の環境変数で指定することもできます。 - >>> requests.get('https://kennethreitz.com', verify=False) +.. Requests can also ignore verifying the SSL certificate if you set ``verify`` to False:: + +``verify`` を False にした場合、Requests は SSL 証明書の検証を無視します。:: + + >>> requests.get('https://kennethreitz.org', verify=False) -By default, ``verify`` is set to True. Option ``verify`` only applies to host certs. +.. By default, ``verify`` is set to True. Option ``verify`` only applies to host certs. + +デフォルトでは、``verify`` は True に設定されています。オプションの ``verify`` はホスト証明書にのみ適用されます。 + +.. Client Side Certificates + ------------------------ + +クライアント側の証明書 +--------------------------- -You can also specify the local cert file either as a path or key value pair:: +.. You can also specify a local cert to use as client side certificate, as a single + file (containing the private key and the certificate) or as a tuple of both + files' paths:: - >>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key')) +1ファイル(秘密鍵と証明書を含む)として指定するか、両ファイルのタプルとして指定するかで +クライアント側の証明書として使用するローカルの証明書を指定することができます。:: + + >>> requests.get('https://kennethreitz.org', cert=('/path/client.cert', '/path/client.key')) -If you specify a wrong path or an invalid cert:: +.. or persistent:: + +もしくは永続化するには:: + + s = requests.Session() + s.cert = '/path/client.cert' + +.. If you specify a wrong path or an invalid cert, you'll get a SSLError:: - >>> requests.get('https://kennethreitz.com', cert='/wrong_path/server.pem') +間違ったパスや無効な証明書を指定すると、SSLError が送出されます。:: + + >>> requests.get('https://kennethreitz.org', cert='/wrong_path/client.pem') SSLError: [Errno 336265225] _ssl.c:347: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib +.. The private key to your local certificate *must* be unencrypted. + Currently, Requests does not support using encrypted keys. -Body Content Workflow ---------------------- +.. warning:: ローカルの証明書の秘密鍵は暗号化されていないようにしておきます。 + 現在、Requests は暗号化されたキーを使う機能をサポートしていません。 + +.. _ca-certificates: + +認証局の証明書 +------------------ -By default, when you make a request, the body of the response is downloaded immediately. You can override this behavior and defer downloading the response body until you access the :class:`Response.content` attribute with the ``stream`` parameter:: +.. CA Certificates + --------------- - tarball_url = 'https://github.com/kennethreitz/requests/tarball/master' +.. By default, Requests bundles a set of root CAs that it trusts, sourced from the + `Mozilla trust store`_. However, these are only updated once for each Requests + version. This means that if you pin a Requests version your certificates can + become extremely out of date. + +デフォルトで、Requests は信頼できるルート認証局の一覧を `Mozilla trust store`_ から取得してバンドルしています。 +しかし、この一覧は Requests の各バージョンごとに一度更新されます。 +これは、Requests のバージョンを固定すると証明書が古くなってしまうかもしれないからです。 + +.. From Requests version 2.4.0 onwards, Requests will attempt to use certificates + from `certifi`_ if it is present on the system. This allows for users to update + their trusted certificates without having to change the code that runs on their + system. + +Requests のバージョン2.4.0からは、証明書がシステム上にある場合は `certifi`_ からの証明書を使うことを試みます。 +これにより、システム上で実行されるコードを変更することなく、信頼できる証明書に更新することができます。 + +.. For the sake of security we recommend upgrading certifi frequently! + +セキュリティのために、certifi を頻繁に更新することをお勧めします! + +.. _HTTP persistent connection: https://en.wikipedia.org/wiki/HTTP_persistent_connection +.. _connection pooling: http://urllib3.readthedocs.io/en/latest/reference/index.html#module-urllib3.connectionpool +.. _certifi: http://certifi.io/ +.. _Mozilla trust store: https://hg.mozilla.org/mozilla-central/raw-file/tip/security/nss/lib/ckfw/builtins/certdata.txt + +.. _body-content-workflow: + +ボディコンテンツのワークフロー +-------------------------------------- + +.. Body Content Workflow + --------------------- + +.. By default, when you make a request, the body of the response is downloaded + immediately. You can override this behaviour and defer downloading the response + body until you access the :attr:`Response.content ` + attribute with the ``stream`` parameter:: + +デフォルトでは、リクエストを行うとレスポンスのボディをすぐにダウンロードします。 +この動作を上書きすることができ、:attr:`Response.content ` 属性に +``stream`` パラメータを指定してアクセスするまでレスポンスのボディのダウンロードを遅らせることができます。:: + + tarball_url = 'https://github.com/requests/requests/tarball/master' r = requests.get(tarball_url, stream=True) -At this point only the response headers have been downloaded and the connection remains open, hence allowing us to make content retrieval conditional:: +.. At this point only the response headers have been downloaded and the connection + remains open, hence allowing us to make content retrieval conditional:: + +この時点で、レスポンスヘッダ−のみダウンロードされ、コネクションは接続したままのため、 +コンテンツの取得を条件付きで許可するようにすることができます。:: if int(r.headers['content-length']) < TOO_LONG: content = r.content ... -You can further control the workflow by use of the :class:`Response.iter_content` and :class:`Response.iter_lines` methods, or reading from the underlying urllib3 :class:`urllib3.HTTPResponse` at :class:`Response.raw`. +.. You can further control the workflow by use of the :meth:`Response.iter_content() ` + and :meth:`Response.iter_lines() ` methods. + Alternatively, you can read the undecoded body from the underlying + urllib3 :class:`urllib3.HTTPResponse ` at + :attr:`Response.raw `. + +:meth:`Response.iter_content() `、および +:meth:`Response.iter_lines() ` メソッドを使うことで +ワークフローをさらにコントロールすることができます。 +他の方法として、:attr:`Response.raw ` にある +urllib3 の :class:`urllib3.HTTPResponse ` 配下にある +デコードされていないボディを読むこともできます。 + +.. If you set ``stream`` to ``True`` when making a request, Requests cannot + release the connection back to the pool unless you consume all the data or call + :meth:`Response.close `. This can lead to + inefficiency with connections. If you find yourself partially reading request + bodies (or not reading them at all) while using ``stream=True``, you should + make the request within a ``with`` statement to ensure it's always closed:: + +リクエストを行う時に ``stream`` に ``True`` を設定すると、全てのデータを消費するか、 +:meth:`Response.close ` を呼ばないかぎり、 +Requests はコネクションをプールして開放することができません。 +これによってコネクションを非効率にするかもしれません。 +``stream=True`` にしている間、リクエストのボデイを部分的に読み込む(または、まったく読み込まない)場合、 +``with`` 文内でリクエストを作成し、コネクションを閉じるようにする必要があります。:: + + with requests.get('http://httpbin.org/get', stream=True) as r: + # Do things with the response here. + +.. _keep-alive: + +キープアライブ +-------------------- + +.. Keep-Alive + ---------- + +.. Excellent news — thanks to urllib3, keep-alive is 100% automatic within a session! + Any requests that you make within a session will automatically reuse the appropriate + connection! + +エクセレントなお知らせ - urllib3 のおかげで、キープアライブはセッション内で 100% 自動的に行われます。 +セッション内でリクエストを生成すると、適切に接続を自動的に再利用します。 + +.. Note that connections are only released back to the pool for reuse once all body + data has been read; be sure to either set ``stream`` to ``False`` or read the + ``content`` property of the ``Response`` object. + +全てのボディデータが読み込まれると、接続は再利用するためにプールされるだけになることに注意して下さい。 +``stream`` を ``False`` にセットするか、``Response`` オブジェクトの ``content`` プロパティを解釈するようにして下さい。 + +.. _streaming-uploads: + +ストリーミングアップロード +--------------------------- + +.. Streaming Uploads + ----------------- + +.. Requests supports streaming uploads, which allow you to send large streams or + files without reading them into memory. To stream and upload, simply provide a + file-like object for your body:: + +Requests はストリーミングアップロードをサポートしています。 +大きなストリームやファイルをメモリに読み込まずに送信することができます。 +ストリーミングとアップロードを行うには、ボディにファイル形式のオブジェクトをシンプルに提供するだけです。 :: + + with open('massive-body', 'rb') as f: + requests.post('http://some.url/streamed', data=f) + +.. It is strongly recommended that you open files in `binary mode`_. + This is because Requests may attempt to provide the + ``Content-Length`` header for you, and if it does this value will + be set to the number of *bytes* in the file. Errors may occur if + you open the file in *text mode*. + +.. warning:: `binary mode`_ でファイルを開くことを強くお勧めしています。 + これは Requests が ``Content-Length`` ヘッダーを提供しようとするので、 + この値はファイルのバイト数に設定されるからです。 + *text mode* でファイルを開くとエラーが発生する場合があります。 + +.. _binary mode: https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files + +.. _chunk-encoding: + +チャンク形式のエンコードされたリクエスト +-------------------------------------------- + +.. Chunk-Encoded Requests + ---------------------- + +.. Requests also supports Chunked transfer encoding for outgoing and incoming requests. + To send a chunk-encoded request, simply provide a generator (or any iterator without + a length) for your body:: + +Requests は入ってくるリクエストと出ていくリクエストのチャンク形式の転送エンコーディングもサポートしています。 +チャンク形式でエンコードされたリクエストを送信するには、ボディにジェネレータ(または長さを持たないイテレータ)を提供するだけです。:: + + def gen(): + yield 'hi' + yield 'there' + + requests.post('http://some.url/chunked', data=gen()) +.. For chunked encoded responses, it's best to iterate over the data using + :meth:`Response.iter_content() `. In + an ideal situation you'll have set ``stream=True`` on the request, in which + case you can iterate chunk-by-chunk by calling ``iter_content`` with a ``chunk_size`` + parameter of ``None``. If you want to set a maximum size of the chunk, + you can set a ``chunk_size`` parameter to any integer. -Keep-Alive ----------- +チャンク形式でエンコードされたレスポンスは、:meth:`Response.iter_content() ` を +使ってデータを反復処理することをお勧めします。 +理想的な状況として、リクエストで ``stream=True`` を設定してから、``chunk_size`` パラメータを +``None`` にして ``iter_content`` を呼び出すことでチャンク単位で反復処理を行うことができます。 +チャンクの最大のサイズを設定する場合、``chunk_size`` パラメータを任意の整数で設定することが可能です。 -Excellent news — thanks to urllib3, keep-alive is 100% automatic within a session! Any requests that you make within a session will automatically reuse the appropriate connection! +.. _multipart: -Note that connections are only released back to the pool for reuse once all body data has been read; be sure to either set ``stream`` to ``False`` or read the ``content`` property of the ``Response`` object. +複数のマルチパートエンコードされたファイルのPOST +------------------------------------------------------- +.. POST Multiple Multipart-Encoded Files + ------------------------------------- -Event Hooks ------------ +.. You can send multiple files in one request. For example, suppose you want to + upload image files to an HTML form with a multiple file field 'images':: -Requests has a hook system that you can use to manipulate portions of -the request process, or signal event handling. +1回のリクエストで複数のファイルを送信することができます。 +例えば、画像ファイルを複数のファイルフィールドの 'images' の HTML フォームにアップロードしたい場合:: + + + +.. To do that, just set files to a list of tuples of ``(form_field_name, file_info)``:: + +これを行うにはファイルを ``(form_field_name, file_info)`` のタプルのリストとして設定します。:: + + >>> url = 'http://httpbin.org/post' + >>> multiple_files = [ + ('images', ('foo.png', open('foo.png', 'rb'), 'image/png')), + ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))] + >>> r = requests.post(url, files=multiple_files) + >>> r.text + { + ... + 'files': {'images': 'data:image/png;base64,iVBORw ....'} + 'Content-Type': 'multipart/form-data; boundary=3131623adb2043caaeb5538cc7aa0b3a', + ... + } + +.. It is strongly recommended that you open files in `binary mode`_. + This is because Requests may attempt to provide the + ``Content-Length`` header for you, and if it does this value will + be set to the number of *bytes* in the file. Errors may occur if + you open the file in *text mode*. + +.. warning:: `binary mode`_ でファイルを開くことを強くお勧めしています。 + これは Requests が ``Content-Length`` ヘッダーを提供しようとするので、 + この値はファイルのバイト数に設定されるからです。 + *text mode* でファイルを開くとエラーが発生する場合があります。 + +.. _binary mode: https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files + +.. _event-hooks: + +イベントフック +------------------- + +.. Event Hooks + ----------- + +.. Requests has a hook system that you can use to manipulate portions of + the request process, or signal event handling. + +Requests にはフックシステムがあり、これを使用してリクエストの処理を一部変えたり、イベント処理を通知したりすることができます。 Available hooks: @@ -150,47 +601,76 @@ Available hooks: The response generated from a Request. -You can assign a hook function on a per-request basis by passing a -``{hook_name: callback_function}`` dictionary to the ``hooks`` request -parameter:: +.. You can assign a hook function on a per-request basis by passing a + ``{hook_name: callback_function}`` dictionary to the ``hooks`` request + parameter:: + +``{hook_name: callback_function}`` ディクショナリを ``hooks`` リクエストパラメータに渡すことで、 +リクエスト毎にフック関数を割り当てることができます。:: hooks=dict(response=print_url) -That ``callback_function`` will receive a chunk of data as its first -argument. +.. That ``callback_function`` will receive a chunk of data as its first + argument. + +``callback_function`` は、最初の引数としてデータのチャンクを受け取ります。 :: - def print_url(r): + def print_url(r, *args, **kwargs): print(r.url) -If an error occurs while executing your callback, a warning is given. +.. If an error occurs while executing your callback, a warning is given. + +コールバックの実行中にエラーが発生すると、警告を表示します。 + +.. If the callback function returns a value, it is assumed that it is to + replace the data that was passed in. If the function doesn't return + anything, nothing else is effected. + +コールバック関数が値を返す場合、渡されたデータが置換されたものとします。 +関数が何も返さない場合、何も影響がありません。 -If the callback function returns a value, it is assumed that it is to -replace the data that was passed in. If the function doesn't return -anything, nothing else is effected. +.. Let's print some request method arguments at runtime:: -Let's print some request method arguments at runtime:: +実行中のリクエストのメソッドの引数を出力してみましょう:: >>> requests.get('http://httpbin.org', hooks=dict(response=print_url)) http://httpbin.org +.. _custom-auth: -Custom Authentication ---------------------- +独自の認証 +------------------------ + +.. Custom Authentication + --------------------- + +.. Requests allows you to use specify your own authentication mechanism. + +Requests は独自の認証メカニズムを指定することができます。 + +.. Any callable which is passed as the ``auth`` argument to a request method will + have the opportunity to modify the request before it is dispatched. -Requests allows you to use specify your own authentication mechanism. +リクエストのメソッドの ``auth`` 引数に渡した任意の呼び出し可能オブジェクトは、 +ディスパッチされる前にリクエストを変更する機会があります。 -Any callable which is passed as the ``auth`` argument to a request method will -have the opportunity to modify the request before it is dispatched. +.. Authentication implementations are subclasses of :class:`AuthBase `, + and are easy to define. Requests provides two common authentication scheme + implementations in ``requests.auth``: :class:`HTTPBasicAuth ` and + :class:`HTTPDigestAuth `. -Authentication implementations are subclasses of ``requests.auth.AuthBase``, -and are easy to define. Requests provides two common authentication scheme -implementations in ``requests.auth``: ``HTTPBasicAuth`` and ``HTTPDigestAuth``. +認証の実装方法は :class:`AuthBase ` のサブクラスで、簡単に定義できます。 +Requests は、``requests.auth`` に :class:`HTTPBasicAuth ` と +:class:`HTTPDigestAuth ` の2つの共通の認証スキームの実装を提供しています。 -Let's pretend that we have a web service that will only respond if the -``X-Pizza`` header is set to a password value. Unlikely, but just go with it. +.. Let's pretend that we have a web service that will only respond if the + ``X-Pizza`` header is set to a password value. Unlikely, but just go with it. + +``X-Pizza`` ヘッダーにパスワードの値が設定されている場合のみ応答するウェブサービスがあるとしましょう。 +そんなサービスはないと思うかもしれませんが、騙されたと思って見ていきましょう。 :: @@ -207,239 +687,448 @@ Let's pretend that we have a web service that will only respond if the r.headers['X-Pizza'] = self.username return r -Then, we can make a request using our Pizza Auth:: +.. Then, we can make a request using our Pizza Auth:: + +その後、Pizza Auth を使ってリクエストを行うことができます。:: >>> requests.get('http://pizzabin.org/admin', auth=PizzaAuth('kenneth')) -Streaming Requests ------------------- +.. _streaming-requests: -With ``requests.Response.iter_lines()`` you can easily iterate over streaming -APIs such as the `Twitter Streaming API `_. +ストリーミングリクエスト +---------------------------- -To use the Twitter Streaming API to track the keyword "requests":: +.. Streaming Requests + ------------------ + +.. With :meth:`Response.iter_lines() ` you can easily + iterate over streaming APIs such as the `Twitter Streaming + API `_. Simply + set ``stream`` to ``True`` and iterate over the response with + :meth:`~requests.Response.iter_lines()`:: + +:meth:`Response.iter_lines() ` を使って、 +`Twitter Streaming API `_ 等のストリーミング API を簡単にイテレーション処理をすることができます。 +``stream`` を ``True`` に設定し、:meth:`~requests.Response.iter_lines()` で応答をイテレーション処理を行います。:: - import requests import json + import requests - r = requests.post('https://stream.twitter.com/1/statuses/filter.json', - data={'track': 'requests'}, auth=('username', 'password'), stream=True) + r = requests.get('http://httpbin.org/stream/20', stream=True) for line in r.iter_lines(): - if line: # filter out keep-alive new lines - print json.loads(line) + # filter out keep-alive new lines + if line: + decoded_line = line.decode('utf-8') + print(json.loads(decoded_line)) + +.. When using `decode_unicode=True` with + :meth:`Response.iter_lines() ` or + :meth:`Response.iter_content() `, you'll want + to provide a fallback encoding in the event the server doesn't provide one:: + +:meth:`Response.iter_lines() ` や +:meth:`Response.iter_content() ` で `decode_unicode=True` を使う場合、 +サーバーが提供していないイベントでフォールバックエンコーディングを指定することをお勧めします。:: + + r = requests.get('http://httpbin.org/stream/20', stream=True) + + if r.encoding is None: + r.encoding = 'utf-8' + + for line in r.iter_lines(decode_unicode=True): + if line: + print(json.loads(line)) + +.. :meth:`~requests.Response.iter_lines()` is not reentrant safe. + Calling this method multiple times causes some of the received data + being lost. In case you need to call it from multiple places, use + the resulting iterator object instead:: -Proxies -------- + lines = r.iter_lines() + # Save the first line for later or just skip it -If you need to use a proxy, you can configure individual requests with the -``proxies`` argument to any request method:: + first_line = next(lines) + + for line in lines: + print(line) + +.. warning:: + + :meth:`~requests.Response.iter_lines()` は、リエントラント安全ではありません。 + このメソッドを複数回呼び出すと、受信したデータの一部が失われます。 + 複数の場所から呼び出す必要がある場合、代わりにイテレータオブジェクトの結果を使います。:: + + lines = r.iter_lines() + # Save the first line for later or just skip it + + first_line = next(lines) + + for line in lines: + print(line) + +.. _proxies: + +プロキシ +------------ + +.. Proxies + ------- + +.. If you need to use a proxy, you can configure individual requests with the + ``proxies`` argument to any request method:: + +プロキシを使用する必要がある場合、 +任意のリクエストメソッドの ``proxies`` 引数で個別にリクエストを設定することができます。:: import requests proxies = { - "http": "10.10.1.10:3128", - "https": "10.10.1.10:1080", + 'http': 'http://10.10.1.10:3128', + 'https': 'http://10.10.1.10:1080', } - requests.get("http://example.org", proxies=proxies) + requests.get('http://example.org', proxies=proxies) + +.. You can also configure proxies by setting the environment variables + ``HTTP_PROXY`` and ``HTTPS_PROXY``. -You can also configure proxies by environment variables ``HTTP_PROXY`` and ``HTTPS_PROXY``. +プロキシは、環境変数の ``HTTP_PROXY`` と ``HTTPS_PROXY`` を設定することもできます。 :: - $ export HTTP_PROXY="10.10.1.10:3128" - $ export HTTPS_PROXY="10.10.1.10:1080" + $ export HTTP_PROXY="http://10.10.1.10:3128" + $ export HTTPS_PROXY="http://10.10.1.10:1080" + $ python >>> import requests - >>> requests.get("http://example.org") + >>> requests.get('http://example.org') + +.. To use HTTP Basic Auth with your proxy, use the `http://user:password@host/` syntax:: + +HTTP Basic 認証をプロキシで使うには、`http://user:password@host/` のような書き方にしてください。:: + + proxies = {'http': 'http://user:pass@10.10.1.10:3128/'} + +.. To give a proxy for a specific scheme and host, use the + `scheme://hostname` form for the key. This will match for + any request to the given scheme and exact hostname. + +特定のスキームやホストにプロキシを指定するには、キーに `scheme://hostname` 形式にします。 +これは、指定されたスキームへのリクエストと正しいホスト名と一致します。 + +:: + + proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'} + +Note that proxy URLs must include the scheme. + +SOCKS +^^^^^ + +.. versionadded:: 2.10.0 + +.. In addition to basic HTTP proxies, Requests also supports proxies using the + SOCKS protocol. This is an optional feature that requires that additional + third-party libraries be installed before use. + +基本的な HTTP プロキシに加えて、Requests は SOCKS プロトコルを使ったプロキシもサポートしています。 +これはオプションの機能で、使う前に追加のサードパーティのライブラリを必要とします。 + +.. You can get the dependencies for this feature from ``pip``: + +``pip`` から、この機能を使うための依存を取得することができます。: + +.. code-block:: bash -To use HTTP Basic Auth with your proxy, use the `http://user:password@host/` syntax:: + $ pip install requests[socks] + +.. Once you've installed those dependencies, using a SOCKS proxy is just as easy + as using a HTTP one:: + +これらの依存をインストールしたら、SOCKS プロキシを使うのは、HTTP を使うのと同じくらい簡単です。:: proxies = { - "http": "http://user:pass@10.10.1.10:3128/", + 'http': 'socks5://user:pass@host:port', + 'https': 'socks5://user:pass@host:port' } -Compliance ----------- - -Requests is intended to be compliant with all relevant specifications and -RFCs where that compliance will not cause difficulties for users. This -attention to the specification can lead to some behaviour that may seem -unusual to those not familiar with the relevant specification. - -Encodings -^^^^^^^^^ - -When you receive a response, Requests makes a guess at the encoding to use for -decoding the response when you call the ``Response.text`` method. Requests -will first check for an encoding in the HTTP header, and if none is present, -will use `charade `_ to attempt to guess -the encoding. - -The only time Requests will not do this is if no explicit charset is present -in the HTTP headers **and** the ``Content-Type`` header contains ``text``. In -this situation, -`RFC 2616 `_ -specifies that the default charset must be ``ISO-8859-1``. Requests follows -the specification in this case. If you require a different encoding, you can -manually set the ``Response.encoding`` property, or use the raw -``Response.content``. - -HTTP Verbs ----------- - -Requests provides access to almost the full range of HTTP verbs: GET, OPTIONS, -HEAD, POST, PUT, PATCH and DELETE. The following provides detailed examples of -using these various verbs in Requests, using the GitHub API. - -We will begin with the verb most commonly used: GET. HTTP GET is an idempotent -method that returns a resource from a given URL. As a result, it is the verb -you ought to use when attempting to retrieve data from a web location. An -example usage would be attempting to get information about a specific commit -from GitHub. Suppose we wanted commit ``a050faf`` on Requests. We would get it -like so:: +.. Using the scheme ``socks5`` causes the DNS resolution to happen on the client, rather than on the proxy server. This is in line with curl, which uses the scheme to decide whether to do the DNS resolution on the client or proxy. If you want to resolve the domains on the proxy server, use ``socks5h`` as the scheme. + +``socks5`` スキームを使うと DNS の名前解決がプロキシサーバーではなく、クライアント側で行われます。 +これはクライアントやプロキシで DNS の名前解決を行うかどうかを決定するためにこのスキームを curl が使うのと同様です。 +プロキシサーバー上のドメインを解決する場合は、スキームとして ``socks5h`` を使います。 + +.. _compliance: + +コンプライアンス +-------------------- + +.. Compliance + ---------- + +.. Requests is intended to be compliant with all relevant specifications and + RFCs where that compliance will not cause difficulties for users. This + attention to the specification can lead to some behaviour that may seem + unusual to those not familiar with the relevant specification. + +Requests は、コンプライアンスがユーザーに問題を引き起こさないようにするために、関連する仕様と RFC に準拠すること意図しています。 +この仕様の注意点として、関連する仕様に精通していない場合に不思議な挙動だと感じるかもしれません。 + +.. Encodings + ^^^^^^^^^ + +エンコーディング +^^^^^^^^^^^^^^^^^^ + +.. When you receive a response, Requests makes a guess at the encoding to + use for decoding the response when you access the :attr:`Response.text + ` attribute. Requests will first check for an + encoding in the HTTP header, and if none is present, will use `chardet + `_ to attempt to guess the encoding. + +レスポンスを受け取った際、:attr:`Response.text ` 属性にアクセスした時に、 +レスポンスをデコードするために、Requests はエンコーディングを推測します。 +Requests はまず HTTP ヘッダーのエンコーディングをチェックし、存在しない場合はエンコーディングを推測するために +`chardet `_ を使います。 + +.. The only time Requests will not do this is if no explicit charset + is present in the HTTP headers **and** the ``Content-Type`` + header contains ``text``. In this situation, `RFC 2616 + `_ specifies + that the default charset must be ``ISO-8859-1``. Requests follows the + specification in this case. If you require a different encoding, you can + manually set the :attr:`Response.encoding ` + property, or use the raw :attr:`Response.content `. + +Requests がこのようにしない場合として、HTTP ヘッダーに明確な文字コードがなく、``Content-Type`` ヘッダーに ``text`` が含まれている場合です。 +この状況で `RFC 2616 `_ は、 +デフォルトの文字コードが ``ISO-8859-1`` になっていることが想定されています。 +この場合、Requests は仕様に従います。別のエンコーディングが必要な場合は、 +:attr:`Response.encoding ` プロパティを手動で設定するか、 +生データの :attr:`Response.content ` を使用することができます。 + +.. _http-verbs: + +.. HTTP Verbs + ---------- + +HTTP メソッド +-------------------- + +.. Requests provides access to almost the full range of HTTP verbs: GET, OPTIONS, + HEAD, POST, PUT, PATCH and DELETE. The following provides detailed examples of + using these various verbs in Requests, using the GitHub API. + +Requests は、GET、OPTIONS、HEAD、POST、PUT、PATCH、DELETE +のほぼ全ての HTTP メソッドにアクセスすることができます。 +GitHub の API を使って、このメソッドを Requests で使う例を以下で紹介します。 + +.. We will begin with the verb most commonly used: GET. HTTP GET is an idempotent + method that returns a resource from a given URL. As a result, it is the verb + you ought to use when attempting to retrieve data from a web location. An + example usage would be attempting to get information about a specific commit + from GitHub. Suppose we wanted commit ``a050faf`` on Requests. We would get it + like so:: + +最も一般的に使われる GET の HTTP メソッドで始めましょう。 +HTTP の GET は、指定された URL からリソースを受け取る冪等のメソッドです。 +その結果、ウェブのロケーションからデータを取得しようとするときに使う HTTP メソッドです。 +サンプル例で GitHub から特定のコミットに関する情報を取得しようとするものです。 +Requests の ``a050faf`` のコミットを取得したいとします。 +以下のようにするとできます。:: >>> import requests - >>> r = requests.get('https://api.github.com/repos/kennethreitz/requests/git/commits/a050faf084662f3a352dd1a941f2c7c9f886d4ad') + >>> r = requests.get('https://api.github.com/repos/requests/requests/git/commits/a050faf084662f3a352dd1a941f2c7c9f886d4ad') + +.. We should confirm that GitHub responded correctly. If it has, we want to work + out what type of content it is. Do this like so:: -We should confirm that GitHub responded correctly. If it has, we want to work -out what type of content it is. Do this like so:: +GitHub が正しく応答したことを確認する必要があります。 +正しければ、どのようなタイプのコンテンツだったかの処理をしたいと思います。 +以下のようにします。:: - >>> if (r.status_code == requests.codes.ok): - ... print r.headers['content-type'] + >>> if r.status_code == requests.codes.ok: + ... print(r.headers['content-type']) ... application/json; charset=utf-8 -So, GitHub returns JSON. That's great, we can use the JSON module to turn it -into Python objects. Because GitHub returned UTF-8, we should use the -``r.text`` method, not the ``r.content`` method. ``r.content`` returns a -bytestring, while ``r.text`` returns a Unicode-encoded string. I have no plans -to perform byte-manipulation on this response, so I want any Unicode code -points encoded. +.. So, GitHub returns JSON. That's great, we can use the :meth:`r.json + ` method to parse it into Python objects.:: -:: +したがって、GitHub は JSON を返却します。 +素晴らしいことですが、:meth:`r.json ` メソッドを使って解析することで、 +Python のオブジェクトにします。:: - >>> import json - >>> commit_data = json.loads(r.text) - >>> print commit_data.keys() + >>> commit_data = r.json() + + >>> print(commit_data.keys()) [u'committer', u'author', u'url', u'tree', u'sha', u'parents', u'message'] - >>> print commit_data[u'committer'] + + >>> print(commit_data[u'committer']) {u'date': u'2012-05-10T11:10:50-07:00', u'email': u'me@kennethreitz.com', u'name': u'Kenneth Reitz'} - >>> print commit_data[u'message'] + + >>> print(commit_data[u'message']) makin' history -So far, so simple. Well, let's investigate the GitHub API a little bit. Now, -we could look at the documentation, but we might have a little more fun if we -use Requests instead. We can take advantage of the Requests OPTIONS verb to -see what kinds of HTTP methods are supported on the url we just used. +.. So far, so simple. Well, let's investigate the GitHub API a little bit. Now, + we could look at the documentation, but we might have a little more fun if we + use Requests instead. We can take advantage of the Requests OPTIONS verb to + see what kinds of HTTP methods are supported on the url we just used.:: -:: +これまでのところ、とても簡単です。次は GitHub の API について少し調べてみましょう。 +ドキュメントを見ることができますが、代わりに Requests を使ってみるとさらに面白いかもしれません。 +Requests の OPTIONS の HTTP メソッドを利用して、今リクエストした URL でサポートしている HTTP メソッドの種類を確認することができます。:: >>> verbs = requests.options(r.url) >>> verbs.status_code 500 -Uh, what? That's unhelpful! Turns out GitHub, like many API providers, don't -actually implement the OPTIONS method. This is an annoying oversight, but it's -OK, we can just use the boring documentation. If GitHub had correctly -implemented OPTIONS, however, they should return the allowed methods in the -headers, e.g. +.. Uh, what? That's unhelpful! Turns out GitHub, like many API providers, don't + actually implement the OPTIONS method. This is an annoying oversight, but it's + OK, we can just use the boring documentation. If GitHub had correctly + implemented OPTIONS, however, they should return the allowed methods in the + headers, e.g.:: -:: +ええっと、何が起こったのでしょう? +使えませんね! +多くの API プロバイダと同様に、GitHub は実際には OPTIONS メソッドを実装していません。 +見落としていましたが、問題ありません。 +ドキュメントで確認することができます。 +しかし、GitHub が正しく OPTIONS を実装しているなら、ヘッダーで許可するメソッドを返却しないといけません。 >>> verbs = requests.options('http://a-good-website.com/api/cats') - >>> print verbs.headers['allow'] + >>> print(verbs.headers['allow']) GET,HEAD,POST,OPTIONS -Turning to the documentation, we see that the only other method allowed for -commits is POST, which creates a new commit. As we're using the Requests repo, -we should probably avoid making ham-handed POSTS to it. Instead, let's play -with the Issues feature of GitHub. +.. Turning to the documentation, we see that the only other method allowed for + commits is POST, which creates a new commit. As we're using the Requests repo, + we should probably avoid making ham-handed POSTS to it. Instead, let's play + with the Issues feature of GitHub. -This documentation was added in response to Issue #482. Given that this issue -already exists, we will use it as an example. Let's start by getting it. +ドキュメントに目を向けると、コミットで許可している唯一のメソッドは POST で、 +これは新しいコミットを作成することを意味しています。 +Requests のリポジトリを使っているので、ham-handed POSTS を作成することは避けて下さい。 +代わりに GitHub の Issues 機能を試してみましょう。 -:: +.. This documentation was added in response to + `Issue #482 `_. Given that + this issue already exists, we will use it as an example. Let's start by getting it.:: + +この文章は、`Issue #482 `_ に対応するために追加されました。 +この問題は、既知の問題なので例として使います。再現してみましょう。:: - >>> r = requests.get('https://api.github.com/repos/kennethreitz/requests/issues/482') + >>> r = requests.get('https://api.github.com/repos/requests/requests/issues/482') >>> r.status_code 200 + >>> issue = json.loads(r.text) - >>> print issue[u'title'] + + >>> print(issue[u'title']) Feature any http verb in docs - >>> print issue[u'comments'] + + >>> print(issue[u'comments']) 3 -Cool, we have three comments. Let's take a look at the last of them. +.. Cool, we have three comments. Let's take a look at the last of them.:: -:: +Cool、コメントが3つあります。コメントの最後を見てみましょう。:: >>> r = requests.get(r.url + u'/comments') >>> r.status_code 200 - >>> comments = json.loads(r.text) - >>> print comments[0].keys() + + >>> comments = r.json() + + >>> print(comments[0].keys()) [u'body', u'url', u'created_at', u'updated_at', u'user', u'id'] - >>> print comments[2][u'body'] + + >>> print(comments[2][u'body']) Probably in the "advanced" section -Well, that seems like a silly place. Let's post a comment telling the poster -that he's silly. Who is the poster, anyway? +.. Well, that seems like a silly place. Let's post a comment telling the poster + that he's silly. Who is the poster, anyway?:: -:: +見る場所が良くなかったみたいですね。 +投稿者にふざけていることを教えるコメントを投稿してみましょう。 +投稿者は誰だろう?:: - >>> print comments[2][u'user'][u'login'] + >>> print(comments[2][u'user'][u'login']) kennethreitz -OK, so let's tell this Kenneth guy that we think this example should go in the -quickstart guide instead. According to the GitHub API doc, the way to do this -is to POST to the thread. Let's do it. +.. OK, so let's tell this Kenneth guy that we think this example should go in the + quickstart guide instead. According to the GitHub API doc, the way to do this + is to POST to the thread. Let's do it.:: -:: +この例をクイックスタートのガイドに入れることを Kenneth に伝えましょう。 +GitHub の API のドキュメントによると、これを行う方法はスレッドに POST することです。 +やってみましょう。:: >>> body = json.dumps({u"body": u"Sounds great! I'll get right on it!"}) - >>> url = u"https://api.github.com/repos/kennethreitz/requests/issues/482/comments" + >>> url = u"https://api.github.com/repos/requests/requests/issues/482/comments" + >>> r = requests.post(url=url, data=body) >>> r.status_code 404 -Huh, that's weird. We probably need to authenticate. That'll be a pain, right? -Wrong. Requests makes it easy to use many forms of authentication, including -the very common Basic Auth. +.. Huh, that's weird. We probably need to authenticate. That'll be a pain, right? + Wrong. Requests makes it easy to use many forms of authentication, including + the very common Basic Auth. + +う〜ん、おかしいなぁ。 +多分認証する必要がありそうですね。 +面倒ですよね?大丈夫ですよ。 +Requests は、とても一般的な Basic 認証を含む様々な認証方法を簡単に使うことができます。 :: >>> from requests.auth import HTTPBasicAuth >>> auth = HTTPBasicAuth('fake@example.com', 'not_a_real_password') + >>> r = requests.post(url=url, data=body, auth=auth) >>> r.status_code 201 - >>> content = json.loads(r.text) - >>> print content[u'body'] + + >>> content = r.json() + >>> print(content[u'body']) Sounds great! I'll get right on it. -Brilliant. Oh, wait, no! I meant to add that it would take me a while, because -I had to go feed my cat. If only I could edit this comment! Happily, GitHub -allows us to use another HTTP verb, PATCH, to edit this comment. Let's do -that. +.. Brilliant. Oh, wait, no! I meant to add that it would take me a while, because + I had to go feed my cat. If only I could edit this comment! Happily, GitHub + allows us to use another HTTP verb, PATCH, to edit this comment. Let's do + that. + +いいですね。 +ちょっと待った! +ネコに餌をあげないといけないので、しばらく時間がかかるということを追加したいとします。 +もしこのコメントを編集できたら。 +幸いにも、GitHub はこのコメントを編集するための PATCH という別の HTTP メソッドを使うことができます。 +ではやってみましょう。 :: - >>> print content[u"id"] + >>> print(content[u"id"]) 5804413 + >>> body = json.dumps({u"body": u"Sounds great! I'll get right on it once I feed my cat."}) - >>> url = u"https://api.github.com/repos/kennethreitz/requests/issues/comments/5804413" + >>> url = u"https://api.github.com/repos/requests/requests/issues/comments/5804413" + >>> r = requests.patch(url=url, data=body, auth=auth) >>> r.status_code 200 -Excellent. Now, just to torture this Kenneth guy, I've decided to let him -sweat and not tell him that I'm working on this. That means I want to delete -this comment. GitHub lets us delete comments using the incredibly aptly named -DELETE method. Let's get rid of it. +.. Excellent. Now, just to torture this Kenneth guy, I've decided to let him + sweat and not tell him that I'm working on this. That means I want to delete + this comment. GitHub lets us delete comments using the incredibly aptly named + DELETE method. Let's get rid of it. + +素晴らしい。 +では、Kenneth という方を焦らせてしまうので、この作業をしているということを知られないようにしようと決めました。 +つまり、このコメントを削除したいということです。 +GitHub は適切な名前が付けられている DELETE メソッドを使ってコメントを削除してみましょう。 +では取り除いてみましょう。 :: @@ -449,39 +1138,305 @@ DELETE method. Let's get rid of it. >>> r.headers['status'] '204 No Content' -Excellent. All gone. The last thing I want to know is how much of my ratelimit -I've used. Let's find out. GitHub sends that information in the headers, so -rather than download the whole page I'll send a HEAD request to get the -headers. +.. Excellent. All gone. The last thing I want to know is how much of my ratelimit + I've used. Let's find out. GitHub sends that information in the headers, so + rather than download the whole page I'll send a HEAD request to get the + headers. + +素晴らしい。 +全てなくなりました。 +あと知りたいことは、使ったレートリミットです。 +確認してみましょう。 +GitHub はその情報をヘッダーに追加して送信してくるので、 +ページ全体をダウンロードせず、HEAD リクエストを送信してヘッダーを取得します。 :: >>> r = requests.head(url=url, auth=auth) - >>> print r.headers + >>> print(r.headers) ... 'x-ratelimit-remaining': '4995' 'x-ratelimit-limit': '5000' ... -Excellent. Time to write a Python program that abuses the GitHub API in all -kinds of exciting ways, 4995 more times. +.. Excellent. Time to write a Python program that abuses the GitHub API in all + kinds of exciting ways, 4995 more times. -Link Headers ------------- +素晴らしい。 +4995回以上のエキサイティングな方法で GitHub API を使う Python プログラムを書くことができる回数です。 + +.. _custom-verbs: -Many HTTP APIs feature Link headers. They make APIs more self describing and discoverable. +独自の HTTP メソッド +------------------------ -GitHub uses these for `pagination `_ in their API, for example:: +.. Custom Verbs + ------------ + +.. From time to time you may be working with a server that, for whatever reason, + allows use or even requires use of HTTP verbs not covered above. One example of + this would be the MKCOL method some WEBDAV servers use. Do not fret, these can + still be used with Requests. These make use of the built-in ``.request`` + method. For example:: + +ときには何らかの理由で、上記で扱われていない HTTP メソッドを使用する必要があったり、使用しているサーバーで作業する場合があります。 +この場合の1例として、一部の WEBDAV サーバーが使用している MKCOL 方式があります。 +心配しなくても、これらは Requests と一緒に使うことが可能です。 +これは組み込みの ``.request`` メソッドを使用します。例として:: + + >>> r = requests.request('MKCOL', url, data=data) + >>> r.status_code + 200 # Assuming your call was correct + +.. Utilising this, you can make use of any method verb that your server allows. + +これを利用すると、サーバーが認めている任意の HTTP メソッドを使うことができます。 + +.. _link-headers: + +リンクヘッダー +------------------ + +.. Link Headers + ------------ + +.. Many HTTP APIs feature Link headers. They make APIs more self describing and + discoverable. + +多くの HTTP API にはリンクヘッダーがあります。それらは API を発見しやすくします。 + +.. GitHub uses these for `pagination `_ + in their API, for example:: + +GitHub は API の `pagination `_ にこれを使用します。 +例として:: >>> url = 'https://api.github.com/users/kennethreitz/repos?page=1&per_page=10' >>> r = requests.head(url=url) >>> r.headers['link'] '; rel="next", ; rel="last"' -Requests will automatically parse these link headers and make them easily consumable:: +.. Requests will automatically parse these link headers and make them easily consumable:: + +Requests は自動的にリンクヘッダーを解析し、簡単に使えるようにします。:: + + >>> r.links["next"] + {'url': 'https://api.github.com/users/kennethreitz/repos?page=2&per_page=10', 'rel': 'next'} + + >>> r.links["last"] + {'url': 'https://api.github.com/users/kennethreitz/repos?page=7&per_page=10', 'rel': 'last'} + +.. _transport-adapters: + +トランスポートアダプタ +-------------------------- + +.. Transport Adapters + ------------------ + +.. As of v1.0.0, Requests has moved to a modular internal design. Part of the + reason this was done was to implement Transport Adapters, originally + `described here`_. Transport Adapters provide a mechanism to define interaction + methods for an HTTP service. In particular, they allow you to apply per-service + configuration. + +v1.0.0 以降、Requests はモジュール化された内部組み込みの設計に移行しました。 +これが行われた理由の1つとして、もともとは `described here`_ で説明したトランスポートアダプタを実装することです。 +トランスポートアダプタは、HTTP サービスで対話する方法を定義するメカニズムを提供します。 +特にサービスごとの設定を適用することが可能です。 + +.. Requests ships with a single Transport Adapter, the :class:`HTTPAdapter + `. This adapter provides the default Requests + interaction with HTTP and HTTPS using the powerful `urllib3`_ library. Whenever + a Requests :class:`Session ` is initialized, one of these is + attached to the :class:`Session ` object for HTTP, and one + for HTTPS. + +Requests は、トランスポートアダプタである :class:`HTTPAdapter ` が付属しています。 +このアダプタは強力な `urllib3`_ ライブラリを使って、HTTP と HTTPS とのデフォルトの Requests の対話を提供しています。 +Requests の :class:`Session ` が初期化すると、これらのうちの1つが +HTTP の :class:`Session ` オブジェクトに、HTTPS の Session オブジェクトにアタッチされます。 + +.. Requests enables users to create and use their own Transport Adapters that + provide specific functionality. Once created, a Transport Adapter can be + mounted to a Session object, along with an indication of which web services + it should apply to. + +Requests は、特定の機能を提供する独自のトランスポートアダプタを作成して、使うことが可能です。 +作成されたトランスポートアダプタは、どのウェブサービスを適用するかの指定を Session オブジェクトにマウントすることができます。 + +:: + + >>> s = requests.Session() + >>> s.mount('http://www.github.com', MyAdapter()) + +.. The mount call registers a specific instance of a Transport Adapter to a + prefix. Once mounted, any HTTP request made using that session whose URL starts + with the given prefix will use the given Transport Adapter. + +mount の呼び出しをトランスポートアダプタの特定のインスタンスをプレフィックスに登録します。 +マウントされると、URL が指定されたプレフィックスで始まるセッションを使用して行われた HTTP リクエストは、 +指定されたトランスポートアダプタを使用します。 + +.. Many of the details of implementing a Transport Adapter are beyond the scope of + this documentation, but take a look at the next example for a simple SSL use- + case. For more than that, you might look at subclassing the + :class:`BaseAdapter `. + +トランスポートアダプタを実装する詳細の多くは、このドキュメントの範囲を超えていますが、単純な SSL のユースケースの次の例を見て下さい。 +それ以上の場合は、:class:`BaseAdapter ` のサブクラス化を参照して下さい。 + +.. Example: Specific SSL Version + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +例: 特定のSSLバージョン +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. The Requests team has made a specific choice to use whatever SSL version is + default in the underlying library (`urllib3`_). Normally this is fine, but from + time to time, you might find yourself needing to connect to a service-endpoint + that uses a version that isn't compatible with the default. + +Requests チームは基礎となるライブラリ(`urllib3`_)にデフォルトの SSL バージョンを使用するような選択をしました。 +通常これは問題となりませんが、時にはデフォルトと互換性のないバージョンを使用するサービスのエンドポイントに +接続する必要があるかもしれません。 + +.. You can use Transport Adapters for this by taking most of the existing + implementation of HTTPAdapter, and adding a parameter *ssl_version* that gets + passed-through to `urllib3`. We'll make a Transport Adapter that instructs the + library to use SSLv3:: + +HTTPAdapter の既存の実装の大部分を引き継ぎ、`urllib3` に渡す *ssl_version* パラメータを追加することでトランスポートアダプタを使うことができます。 +ライブラリに SSLv3 を使うように指定するトランスポートアダプタを作成します。:: + + import ssl + + from requests.adapters import HTTPAdapter + from requests.packages.urllib3.poolmanager import PoolManager + + + class Ssl3HttpAdapter(HTTPAdapter): + """"Transport adapter" that allows us to use SSLv3.""" + + def init_poolmanager(self, connections, maxsize, block=False): + self.poolmanager = PoolManager( + num_pools=connections, maxsize=maxsize, + block=block, ssl_version=ssl.PROTOCOL_SSLv3) + +.. _`described here`: http://www.kennethreitz.org/essays/the-future-of-python-http +.. _`urllib3`: https://github.com/shazow/urllib3 + +.. _blocking-or-nonblocking: + +ブロッキングかノンブロッキングか? +------------------------------------ + +.. Blocking Or Non-Blocking? + ------------------------- + +.. With the default Transport Adapter in place, Requests does not provide any kind + of non-blocking IO. The :attr:`Response.content ` + property will block until the entire response has been downloaded. If + you require more granularity, the streaming features of the library (see + :ref:`streaming-requests`) allow you to retrieve smaller quantities of the + response at a time. However, these calls will still block. + +デフォルトのトランスポートアダプタを適切に設定すると、Requests はいかなる種類のノンブロッキングの IO も提供していません。 +:attr:`Response.content ` プロパティはレスポンス全体がダウンロードされるまでブロックされます。 +より細分化する必要があるなら、ライブラリのストリーミング機能(:ref:`streaming-requests` を参照)を使用して、 +一回に少しずつのレスポンスを受け取ることができます。 +しかし、これらの呼び出しはブロックされます。 + +.. If you are concerned about the use of blocking IO, there are lots of projects + out there that combine Requests with one of Python's asynchronicity frameworks. + Two excellent examples are `grequests`_ and `requests-futures`_. + +ブロッキング IO を使うことが不安なら、Python の非同期フレームワークと Requests を組み合わせているプロジェクトがたくさんあります。 +`grequests`_ と `requests-futures`_ の2つはいい例です。 + +.. _`grequests`: https://github.com/kennethreitz/grequests +.. _`requests-futures`: https://github.com/ross/requests-futures + +.. Header Ordering + --------------- + +ヘッダーの順番 +------------------ + +.. In unusual circumstances you may want to provide headers in an ordered manner. If you pass an ``OrderedDict`` to the ``headers`` keyword argument, that will provide the headers with an ordering. *However*, the ordering of the default headers used by Requests will be preferred, which means that if you override default headers in the ``headers`` keyword argument, they may appear out of order compared to other headers in that keyword argument. + +特殊な状況では、順序を守ってヘッダーを提供しなければいけない場合があります。 +``headers`` キーワード引数に ``OrderedDict`` を渡すと、ヘッダーを順序を指定することができます。 +*しかし*、Requests で使用するデフォルトのヘッダーの順序が優先されます。 +つまり、``headers`` キーワード引数のデフォルトのヘッダーを上書きすると、 +そのキーワード引数の他のヘッダーと比較するので、順序がおかしくなるかもしれません。 + +.. If this is problematic, users should consider setting the default headers on a :class:`Session ` object, by setting :attr:`Session ` to a custom ``OrderedDict``. That ordering will always be preferred. + +これに問題がある場合は、:class:`Session ` オブジェクトのデフォルトヘッダーを設定することを検討してみてもいいかもしれません。 +設定した順序が優先されます。 + +.. _timeouts: + +タイムアウト +---------------- + +.. Timeouts + -------- + +.. Most requests to external servers should have a timeout attached, in case the + server is not responding in a timely manner. By default, requests do not time + out unless a timeout value is set explicitly. Without a timeout, your code may + hang for minutes or more. + +サーバーがすぐに応答できない場合のマナーとして、外部サーバーへのほとんどのリクエストはタイムアウトが設定されている必要があります。 +デフォルトでは、明示的に設定されていない限り、リクエストはタイムアウトしません。 +タイムアウトしなければ、コードは数分以上停止することができます。 + +.. The **connect** timeout is the number of seconds Requests will wait for your + client to establish a connection to a remote machine (corresponding to the + `connect()`_) call on the socket. It's a good practice to set connect timeouts + to slightly larger than a multiple of 3, which is the default `TCP packet + retransmission window `_. + +**コネクション** のタイムアウトは、クライアントがリモートマシンへの接続を確立するまで Requests が待機する秒数のことです。 +コネクションのタイムアウトをデフォルトの `TCP パケットの再転送のウィンドウサイズ `_ を、 +3の倍数よりほんの少し大きくすることをお勧めします。 + +.. Once your client has connected to the server and sent the HTTP request, the + **read** timeout is the number of seconds the client will wait for the server + to send a response. (Specifically, it's the number of seconds that the client + will wait *between* bytes sent from the server. In 99.9% of cases, this is the + time before the server sends the first byte). + +クライアントがサーバーに接続して HTTP のリクエストを送ると、 +読み込みのタイムアウト時間は、サーバーがレスポンスを送信するまでの待機する秒数です。 +(具体的には、クライアントがサーバーから送られてくるバイトデータ間の待機する秒数です。 +99.9% のケースでは、これはサーバーが最初のバイトデータを送るまでの時間です。) + +.. If you specify a single value for the timeout, like this:: + +タイムアウトに1つの値を指定する場合、以下のようになります。:: + + r = requests.get('https://github.com', timeout=5) + +.. The timeout value will be applied to both the ``connect`` and the ``read`` + timeouts. Specify a tuple if you would like to set the values separately:: + +タイムアウトの値は、``接続`` と ``読み込み`` の両方のタイムアウトに適用されます。 +値を個別にセットする場合は、タプルで指定します。 + + r = requests.get('https://github.com', timeout=(3.05, 27)) + +.. If the remote server is very slow, you can tell Requests to wait forever for + a response, by passing None as a timeout value and then retrieving a cup of + coffee. + +リモートサーバーが非常に遅い場合、タイムアウトの値として None を渡して、retrieving a cup of coffee をして、 +Requests にレスポンスが返ってくるまでずっと待機するように指示することができます。 + +:: - >>> r.links['next'] - 'https://api.github.com/users/kennethreitz/repos?page=2&per_page=10' + r = requests.get('https://github.com', timeout=None) - >>> r.links['last'] - 'https://api.github.com/users/kennethreitz/repos?page=6&per_page=10' +.. _`connect()`: http://linux.die.net/man/2/connect diff --git a/docs/user/authentication.rst b/docs/user/authentication.rst old mode 100644 new mode 100755 index 4bc3a6c..3642280 --- a/docs/user/authentication.rst +++ b/docs/user/authentication.rst @@ -1,42 +1,84 @@ .. _authentication: -Authentication +.. Authentication + ============== + +認証 ============== -This document discusses using various kinds of authentication with Requests. +.. This document discusses using various kinds of authentication with Requests. + +このドキュメントでは、Requests で様々な種類の認証を使用する方法について説明します。 + +.. Many web services require authentication, and there are many different types. + Below, we outline various forms of authentication available in Requests, from + the simple to the complex. -Many web services require authentication, and there are many different types. -Below, we outline various forms of authentication available in Requests, from -the simple to the complex. +多くのウェブサービスでは認証が必要となり、様々な認証方法があります。 +以下で、シンプルなものから複雑なものまで Requests で利用できる様々な認証方法についての概要を説明します。 +.. Basic Authentication + -------------------- -Basic Authentication +Basic認証 -------------------- -Many web services that require authentication accept HTTP Basic Auth. This is -the simplest kind, and Requests supports it straight out of the box. +.. Many web services that require authentication accept HTTP Basic Auth. This is + the simplest kind, and Requests supports it straight out of the box. + +認証が必要な多くのウェブサービスでは、HTTP Basic認証を受け付けています。 +これは最も簡単な認証で、Requests はサポートしています。 + +.. Making requests with HTTP Basic Auth is very simple:: -Making requests with HTTP Basic Auth is very simple:: +HTTP Basic認証でリクエストを生成するのは、とても簡単です。 :: >>> from requests.auth import HTTPBasicAuth >>> requests.get('https://api.github.com/user', auth=HTTPBasicAuth('user', 'pass')) -In fact, HTTP Basic Auth is so common that Requests provides a handy shorthand -for using it:: +.. In fact, HTTP Basic Auth is so common that Requests provides a handy shorthand + for using it:: + +実際、HTTP Basic認証はとても一般的なので、Requests は省略して書く方法を提供しています。 >>> requests.get('https://api.github.com/user', auth=('user', 'pass')) -Providing the credentials in a tuple like this is exactly the same as the -``HTTPBasicAuth`` example above. +.. Providing the credentials in a tuple like this is exactly the same as the + ``HTTPBasicAuth`` example above. + +このようなタプルによる認証情報を付与することで、上記の ``HTTP Basic認証`` の例と同じように動作します。 + +.. netrc Authentication + ~~~~~~~~~~~~~~~~~~~~ + +netrc による認証 +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. If no authentication method is given with the ``auth`` argument, Requests will + attempt to get the authentication credentials for the URL's hostname from the + user's netrc file. The netrc file overrides raw HTTP authentication headers + set with `headers=`. +``auth`` 引数で認証方法が指定されていない場合、Requests はユーザーの netrc ファイルから URL のホスト名の認証クレデンシャルを得ようとします。 +netrc ファイルは `headers=` でセットされた生の HTTP の認証ヘッダーを上書きします。 -Digest Authentication ---------------------- +.. If credentials for the hostname are found, the request is sent with HTTP Basic + Auth. -Another very popular form of HTTP Authentication is Digest Authentication, -and Requests supports this out of the box as well:: +ホスト名のクレデンシャルが見つかった場合、リクエストは HTTP Basic 認証で送信されます。 + +.. Digest Authentication + --------------------- + +Digest認証 +------------------------ + +.. Another very popular form of HTTP Authentication is Digest Authentication, + and Requests supports this out of the box as well:: + +HTTP 認証の別の一般的な認証方法として、Digest 認証があり、Requests はサポートしています。 >>> from requests.auth import HTTPDigestAuth >>> url = 'http://httpbin.org/digest-auth/auth/user/pass' @@ -44,40 +86,127 @@ and Requests supports this out of the box as well:: -Other Authentication --------------------- +.. OAuth 1 Authentication + ---------------------- + +OAuth1.0 認証 +---------------------- + +.. A common form of authentication for several web APIs is OAuth. The ``requests-oauthlib`` + library allows Requests users to easily make OAuth 1 authenticated requests:: + +いくつかのウェブAPIにおいて、一般的な認証方法は OAuth です。 +``requests-oauthlib`` ライブラリは、OAuth 1.0 認証のリクエストを生成するのが簡単にできます。 :: + + >>> import requests + >>> from requests_oauthlib import OAuth1 + + >>> url = 'https://api.twitter.com/1.1/account/verify_credentials.json' + >>> auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET', + ... 'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET') -Requests is designed to allow other forms of authentication to be easily and -quickly plugged in. Members of the open-source community frequently write -authentication handlers for more complicated or less commonly-used forms of -authentication. Some of the best have been brought together under the -`Requests organization`_, including: + >>> requests.get(url, auth=auth) + + +.. For more information on how to OAuth flow works, please see the official `OAuth`_ website. + For examples and documentation on requests-oauthlib, please see the `requests_oauthlib`_ + repository on GitHub + +OAuth フローの仕組みの詳細については、公式の `OAuth`_ ウェブサイトを参照して下さい。 +requests-oauthlib のサンプルとドキュメントについては、GitHub の `requests_oauthlib`_ リポジトリを参照して下さい。 + +.. OAuth 2 and OpenID Connect Authentication + ----------------------------------------- + +OAuth2.0 と OpenID Connect 認証 +-------------------------------------------- + +.. The ``requests-oauthlib`` library also handles OAuth 2, the authentication mechanism + underpinning OpenID Connect. See the `requests-oauthlib OAuth2 documentation`_ for + details of the various OAuth 2 credential management flows: + +``requests-oauthlib`` ライブラリは、OpenID Connect の基盤となる認証機構である OAuth2.0 も処理します。 +様々な OAuth2.0 認証情報の管理フローの詳細については `requests-oauthlib OAuth2 documentation`_ を参照して下さい。 + +* `Web Application Flow`_ +* `Mobile Application Flow`_ +* `Legacy Application Flow`_ +* `Backend Application Flow`_ + +.. Other Authentication + -------------------- + +その他の認証 +----------------------- + +.. Requests is designed to allow other forms of authentication to be easily and + quickly plugged in. Members of the open-source community frequently write + authentication handlers for more complicated or less commonly-used forms of + authentication. Some of the best have been brought together under the + `Requests organization`_, including: + +Requests は他の認証方法を簡単で手っ取り早く拡張できるように作られています。 +オープンソースコミュニティのメンバーは、より複雑であまり一般的に使われない認証方法のための認証用の処理をよく作ります。 +これらの認証方法の中から以下の良かったものは、`Requests organization`_ アカウントの下で管理されるようになりました。 -- OAuth_ - Kerberos_ - NTLM_ -If you want to use any of these forms of authentication, go straight to their -Github page and follow the instructions. +.. If you want to use any of these forms of authentication, go straight to their + GitHub page and follow the instructions. + +これらの認証方法を使う場合は、GitHub ページを参照して、やり方に従って下さい。 + +.. New Forms of Authentication + --------------------------- + +新しい認証方法 +------------------------------ +.. If you can't find a good implementation of the form of authentication you + want, you can implement it yourself. Requests makes it easy to add your own + forms of authentication. + +望むような認証方法を実装したものが見つからない場合、自身で実装することができます。 +Requests は独自の認証方法を簡単に追加することができます。 + +.. To do so, subclass :class:`AuthBase ` and implement the + ``__call__()`` method:: + +実装するには、サブクラスを :class:`AuthBase ` にして、 +``__call__()`` メソッドを実装して下さい。 :: + + >>> import requests + >>> class MyAuth(requests.auth.AuthBase): + ... def __call__(self, r): + ... # Implement my authentication + ... return r + ... + >>> url = 'http://httpbin.org/get' + >>> requests.get(url, auth=MyAuth()) + -New Forms of Authentication ---------------------------- +.. When an authentication handler is attached to a request, + it is called during request setup. The ``__call__`` method must therefore do + whatever is required to make the authentication work. Some forms of + authentication will additionally add hooks to provide further functionality. -If you can't find a good implementation of the form of authentication you -want, you can implement it yourself. Requests makes it easy to add your own -forms of authentication. +認証処理がリクエストに付与されると、リクエストのセットアップ中に呼び出されます。 +``__call__`` メソッドは、認証作業を行うために必要となる処理の全てを行う必要があります。 +いくつかの認証方法は、さらに機能を提供するためにフックが追加されています。 -To do so, subclass :class:`requests.auth.AuthBase` and implement the -``__call__()`` method. When an authentication handler is attached to a request, -it is called during request setup. The ``__call__`` method must therefore do -whatever is required to make the authentication work. Some forms of -authentication will additionally add hooks to provide further functionality. +.. Further examples can be found under the `Requests organization`_ and in the + ``auth.py`` file. -Examples can be found under the `Requests organization`_ and in the -``auth.py`` file. +その他のサンプルは、`Requests organization`_ アカウントにあり、``auth.py`` ファイルの中にあります。 -.. _OAuth: https://github.com/requests/requests-oauthlib +.. _OAuth: http://oauth.net/ +.. _requests_oauthlib: https://github.com/requests/requests-oauthlib +.. _requests-oauthlib OAuth2 documentation: http://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html +.. _Web Application Flow: http://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html#web-application-flow +.. _Mobile Application Flow: http://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html#mobile-application-flow +.. _Legacy Application Flow: http://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html#legacy-application-flow +.. _Backend Application Flow: http://requests-oauthlib.readthedocs.io/en/latest/oauth2_workflow.html#backend-application-flow .. _Kerberos: https://github.com/requests/requests-kerberos .. _NTLM: https://github.com/requests/requests-ntlm .. _Requests organization: https://github.com/requests diff --git a/docs/user/install.rst b/docs/user/install.rst old mode 100644 new mode 100755 index e5437c4..a2a7feb --- a/docs/user/install.rst +++ b/docs/user/install.rst @@ -1,89 +1,61 @@ .. _install: -インストール方法 -============================== +.. Installation of Requests + ======================== -.. Installation - ============ +Requests のインストール方法 +=============================== .. This part of the documentation covers the installation of Requests. The first step to using any software package is getting it properly installed. -ドキュメントのこの章はRequestsのインストール方法を紹介します。 -ソフトウェアパッケージを使うための最初のステップは適切にインストールすることです。 +ドキュメントのこの章では、Requests のインストール方法について紹介しています。 +ソフトウェア・パッケージを使うための第一歩は正しくインストールすることです。 +$ pip install requests +---------------------- -Distribute & Pip ----------------- - -.. Installing requests is simple with `pip `_:: +.. To install Requests, simply run this simple command in your terminal of choice:: -Requestsのインストールは、 `pip `_ を使うと簡単です。:: +Requests をインストールするには、使っているターミナルで以下のシンプルなコマンドを実行するだけです。:: $ pip install requests -.. or, with `easy_install `_:: - -もしくは、 `easy_install `_ を使います。:: - - $ easy_install requests - -.. But, you really `shouldn't do that `_. - -しかし、 `easy_installを使うべきではない `_ 。 - - - -.. Cheeseshop Mirror - ----------------- +.. If you don't have `pip `_ installed (tisk tisk!), + `this Python installation guide `_ + can guide you through the process. -Cheeseshopミラー --------------------- +`pip `_ がまだインストールされていない場合、 +`この Python のインストールガイド `_ をから行ってください。 -.. If the Cheeseshop is down, you can also install Requests from one of the - mirrors. `Crate.io `_ is one of them:: +.. Get the Source Code + ------------------- -Cheeseshopはダウンしている場合は、ミラーからRequestsをインストールすることもできます。 -`Crate.io `_ はその内の一つです。 - - $ pip install -i http://simple.crate.io/ requests - - -.. Get the Code - ------------ - -コードを取得する ----------------------- +ソースコードを取得する +------------------------- .. Requests is actively developed on GitHub, where the code is - `always available `_. + `always available `_. -Requestsは、GitHub上で活発に開発されていて、 -コードは `いつでも見ることができます `_ 。 +Requests は GitHub 上でアクティブに開発されていて、コードは`常に利用することができます `_。 .. You can either clone the public repository:: -公開レポジトリをクローンすることもできます。:: - - git clone git://github.com/kennethreitz/requests.git - -.. Download the `tarball `_:: - -`tarball `_ をダウンロードして下さい。:: - - $ curl -OL https://github.com/kennethreitz/requests/tarball/master +公開されているリポジトリをクローンしてきて使うこともできます。:: -.. Or, download the `zipball `_:: + $ git clone git://github.com/requests/requests.git -もしくは、 `zipball `_ をダウンロードして下さい。:: +.. Or, download the `tarball `_:: - $ curl -OL https://github.com/kennethreitz/requests/zipball/master +もしくは、`tarball `_ をダウンロードすることもできます。:: + $ curl -OL https://github.com/requests/requests/tarball/master + # optionally, zipball is also available (for Windows users). -.. Once you have a copy of the source, you can embed it in your Python package, - or install it into your site-packages easily:: +.. Once you have a copy of the source, you can embed it in your own Python + package, or install it into your site-packages easily:: -ソースのコピーを持っているなら、Pythonのパッケージに埋め込んだり、site-packagesに -簡単にインストールすることができます。 +ソースのコピーを取得したら、Python パッケージに埋め込んだり、簡単に site-packages にインストールすることができます。:: - $ python setup.py install \ No newline at end of file + $ cd requests + $ pip install . diff --git a/docs/user/intro.rst b/docs/user/intro.rst old mode 100644 new mode 100755 index 5736421..249db63 --- a/docs/user/intro.rst +++ b/docs/user/intro.rst @@ -1,21 +1,20 @@ .. _introduction: -はじめに -=============== - .. Introduction ============ +イントロダクション +===================== + .. Philosophy ---------- フィロソフィー --------------------- +----------------- .. Requests was developed with a few :pep:`20` idioms in mind. -Requestsは、 :pep:`20` 規約に基づいて開発しています。 - +Requests はいくつかの :pep:`20` イディオムを念頭に置いて開発されました。 .. Beautiful is better than ugly. .. Explicit is better than implicit. @@ -23,46 +22,46 @@ Requestsは、 :pep:`20` 規約に基づいて開発しています。 .. Complex is better than complicated. .. Readability counts. -#. きたないよりきれいな方がいい -#. ごちゃごちゃ難しいものより、はっきりしてるのがいい -#. 複雑なものより、シンプルな方がいい -#. 煩わしいものより複雑なものの方がいい -#. 読みやすさは大切 +#. 醜いものより美しいものの方が良い。 +#. 暗黙的なものより明示的なものの方が良い。 +#. 複雑なものよりシンプルなものの方が良い。 +#. 困難なものより複雑なものの方が良い。 +#. 読みやすいものは良い。 .. All contributions to Requests should keep these important rules in mind. -Requestsに対して貢献する場合に、これらの重要なルールに基づいていなければいけません。 +Requests への全てのコントリビューションはこれらの重要なルールを念頭に置いておくべきです。 .. _`apache2`: .. Apache2 License --------------- -Apache2ライセンス ------------------------------- +Apache2 ライセンス +----------------------- .. A large number of open source projects you find today are `GPL Licensed`_. While the GPL has its time and place, it should most certainly not be your go-to license for your next open source project. -現在、ほとんどのオープンソースのプロジェクトで `GPL Licensed`_ が採用されていると思います。 -GPLは長い間様々なところで使われてきたので、新しくオープンソースプロジェクトで採用するライセンスではないと思います。 +現在、たくさんのオープンソースのプロジェクトでは `GPL Licensed`_ が採用されています。 +GPL は長い間様々なところで使われてきたので、新しくオープンソースのプロジェクトを開始する時に採用するライセンスではありません。 .. A project that is released as GPL cannot be used in any commercial product without the product itself also being offered as open source. -GPLとしてリリースされているプロジェクトは、プロダクトをオープンソースとして公開しないと商用利用ができません。 +GPL としてリリースされたプロジェクトは、プロダクト自体がオープンソースとして提供されない、商用のプロダクトには使用することはできません。 .. The MIT, BSD, ISC, and Apache2 licenses are great alternatives to the GPL that allow your open-source software to be used freely in proprietary, closed-source software. -MIT、BSD、ISC、Apache2等のライセンスはGPLと違って素晴らしくて、 -プロプライエタリで自由に使えて、ソースコードを非公開にできます。 +MIT、BSD、ISC、Apache2 ライセンスはオープンソースのソフトウェアをクローズドソースのソフトウェアを +プロプライエタリとして自由に使える GPL ライセンスの代わりとなる素晴らしいライセンスです。 .. Requests is released under terms of `Apache2 License`_. -Requestsは、 `Apache2 License`_ でリリースされています。 +Requests は `Apache2 License`_ でリリースされています。 .. _`GPL Licensed`: http://www.opensource.org/licenses/gpl-license.php .. _`Apache2 License`: http://opensource.org/licenses/Apache-2.0 @@ -71,7 +70,7 @@ Requestsは、 `Apache2 License`_ でリリースされています。 .. Requests License ---------------- -Requestsライセンス --------------------------------- +Requests ライセンス +------------------------- .. include:: ../../LICENSE diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst old mode 100644 new mode 100755 index 856368d..63414bd --- a/docs/user/quickstart.rst +++ b/docs/user/quickstart.rst @@ -1,21 +1,18 @@ .. _quickstart: -クイックスタート -===================== - .. Quickstart ========== +クイックスタート +================ + .. module:: requests.models .. Eager to get started? This page gives a good introduction in how to get started - with Requests. This assumes you already have Requests installed. If you do not, - head over to the :ref:`Installation ` section. + with Requests. それでははじめましょう。 -この章では、Requestsの使い方の紹介をします。 -ここでは、Requestsが既にインストールされているものとします。 -インストールしていない場合は、 :ref:`インストールする方法 ` の章を見て下さい。 +このページでは、Requests の使い方についての紹介をします。 .. First, make sure that: @@ -25,243 +22,322 @@ .. Requests is :ref:`up-to-date ` * Requestsが :ref:`インストールされている ` -* Requestsが :ref:`最新版のものになっている ` - +* Requestsが :ref:`最新版にされている ` .. Let's get started with some simple examples. いくつかの簡単なサンプルをやってみましょう。 - .. Make a Request -------------- リクエストの生成 ---------------------- +----------------- .. Making a request with Requests is very simple. -Requestsを使ってリクエストを生成することはとても簡単です。 +Requests を使ってリクエストを生成することはとても簡単です。 .. Begin by importing the Requests module:: -Requestsモジュールをまずインポートしましょう。:: +Requests モジュールをインポートすることから始まります。:: >>> import requests .. Now, let's try to get a webpage. For this example, let's get GitHub's public - timeline :: + timeline:: ではウェブページを取得してみましょう。 -今回の例では、GitHubで公開されているタイムラインを取得してみましょう。:: +このサンプルでは、GitHub の公開されているタイムラインを取得してみましょう。 - >>> r = requests.get('https://github.com/timeline.json') + >>> r = requests.get('https://api.github.com/events') -.. Now, we have a :class:`Response` object called ``r``. We can get all the - information we need from this object. +.. Now, we have a :class:`Response ` object called ``r``. We can + get all the information we need from this object. -現在、 ``r`` と呼ばれる :class:`Response` オブジェクトがあります。 +現在 ``r`` という :class:`Response` オブジェクトがあります。 このオブジェクトから必要な情報を全て取得することができます。 .. Requests' simple API means that all forms of HTTP request are as obvious. For example, this is how you make an HTTP POST request:: -RequestsのシンプルなAPIは、HTTPリクエストの全てのフォームデータを示していることがわかります。 -例えば、以下の例はHTTPのPOSTリクエストをどうやって作成するかを示しています。:: +Requests のシンプルなAPIは、HTTP リクエストの全ての形式が明白であることを示しています。 +例えば、以下のようにして HTTP の POST リクエストを作成することができます。 - >>> r = requests.post("http://httpbin.org/post") + >>> r = requests.post('http://httpbin.org/post', data = {'key':'value'}) .. Nice, right? What about the other HTTP request types: PUT, DELETE, HEAD and OPTIONS? These are all just as simple:: -いいでしょ? -PUT、DELETE、HEAD、OPTIONSなどの他のHTTPリクエストについても本当にとてもシンプルです。:: +問題ないですか? +PUT、DELETE、HEAD、OPTIONSなどの他の HTTP リクエストについてはどうするのでしょう? +これらも本当にシンプルです。:: - >>> r = requests.put("http://httpbin.org/put") - >>> r = requests.delete("http://httpbin.org/delete") - >>> r = requests.head("http://httpbin.org/get") - >>> r = requests.options("http://httpbin.org/get") + >>> r = requests.put('http://httpbin.org/put', data = {'key':'value'}) + >>> r = requests.delete('http://httpbin.org/delete') + >>> r = requests.head('http://httpbin.org/get') + >>> r = requests.options('http://httpbin.org/get') .. That's all well and good, but it's also only the start of what Requests can do. -これはこれでいいのですが、Requestsができることのほんの少ししか紹介していません。 - +上手くいくと思いますが、これらは Requests ができることのほんの少しのことしか紹介していません。 .. Passing Parameters In URLs -------------------------- -URLにパラメーターを渡す ------------------------------ +URLにパラメータを渡す +-------------------------- .. You often want to send some sort of data in the URL's query string. If you were constructing the URL by hand, this data would be given as key/value pairs in the URL after a question mark, e.g. ``httpbin.org/get?key=val``. - Requests allows you to provide these arguments as a dictionary, using the - ``params`` keyword argument. As an example, if you wanted to pass + Requests allows you to provide these arguments as a dictionary of strings, + using the ``params`` keyword argument. As an example, if you wanted to pass ``key1=value1`` and ``key2=value2`` to ``httpbin.org/get``, you would use the following code:: -しばしばURLのクエリ文字列として、あるデータを追加して送信したい時があるかもしれません。 -手動でURLを作成する場合、このデータはクエスション記号の後のURLにキー/バリューのペアで与えて下さい。 -例: ``httpbin.org/get?key=val`` 。 -Requestsは、 ``params`` キーワード引数を使って、辞書としてこれらの引数を渡すことができます。 -例として、 ``key1=value1`` と ``key2=value2`` を ``httpbin.org/get`` に渡したい場合、 -以下のコードでできます。 :: +URL のクエリ文字列に何らかのデータを付けて送信することがよくあります。 +手動で URL を作る場合、このデータはクエスチョン記号の後のURLにキー/値のペアで付与して下さい。 +例として、``httpbin.org/get?key=val`` のようになります。 +Requests は ``params`` キーワード引数に、文字列のディクショナリとして渡す方法が用意されています。 +例えば、``key1=value1`` と ``key2=value2`` を ``httpbin.org/get`` に渡す場合、以下のコードのようになります。:: >>> payload = {'key1': 'value1', 'key2': 'value2'} - >>> r = requests.get("http://httpbin.org/get", params=payload) + >>> r = requests.get('http://httpbin.org/get', params=payload) .. You can see that the URL has been correctly encoded by printing the URL:: -URLを表示して、URLが正しくエンコードされたか見ることができます。:: +URL を表示すると、URL が正しくエンコードされていることが分かります。 + + >>> print(r.url) + http://httpbin.org/get?key2=value2&key1=value1 + +.. Note that any dictionary key whose value is ``None`` will not be added to the + URL's query string. + +値が ``None`` のディクショナリのキーは、URL のクエリ文字列に追加されません。 + +.. You can also pass a list of items as a value:: - >>> print r.url - u'http://httpbin.org/get?key2=value2&key1=value1' +キー/値のアイテムのリストを値として渡すこともできます。:: + >>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']} + + >>> r = requests.get('http://httpbin.org/get', params=payload) + >>> print(r.url) + http://httpbin.org/get?key1=value1&key2=value2&key2=value3 .. Response Content ---------------- -レスポンスの内容 -------------------- +レスポンスコンテンツ +--------------------------- .. We can read the content of the server's response. Consider the GitHub timeline again:: サーバーからのレスポンスの内容を見ることができます。 -Githubのタイムラインを使って見てみましょう。:: +再度、GitHub のタイムラインで見てみましょう。:: >>> import requests - >>> r = requests.get('https://github.com/timeline.json') + + >>> r = requests.get('https://api.github.com/events') >>> r.text - '[{"repository":{"open_issues":0,"url":"https://github.com/... + u'[{"repository":{"open_issues":0,"url":"https://github.com/... .. Requests will automatically decode content from the server. Most unicode charsets are seamlessly decoded. -Requestsは、サーバーからの内容を自動的にデコードします。 -ほとんどのユニコード文字はシームレスにデコードされます。 +Requests はサーバーからのレスポンスの内容を自動的にデコードします。 +ほとんどの Unicode 文字列はシームレスにデコードされています。 .. When you make a request, Requests makes educated guesses about the encoding of the response based on the HTTP headers. The text encoding guessed by Requests is used when you access ``r.text``. You can find out what encoding Requests is using, and change it, using the ``r.encoding`` property:: -リクエストを作成した時、RequestsはHTTPヘッダーに基づてレスポンスのエンコーディングについて推測しようとします。 -Requestsによって推測されたテキストエンコーディングは、 ``r.text`` にアクセスした時に使われます。 -Requestsで使われているエンコーディングは調べることができ、 -``r.encoding`` プロパティを使って調べたり、変更することができます。:: +リクエストを行うと、Requests は HTTP ヘッダーの内容に基づいてレスポンスのエンコーディングの推測を行います。 +Requests が推測するテキストのエンコーディングは、``r.text`` にアクセスする時に使われます。 +``r.encoding`` プロパティを使って Requests が使っているエンコーディングを確認し、変更することができます。:: >>> r.encoding 'utf-8' >>> r.encoding = 'ISO-8859-1' .. If you change the encoding, Requests will use the new value of ``r.encoding`` - whenever you call ``r.text``. - -エンコーディングを変更した場合、 -Requestsは ``r.text`` を呼び出すたびに ``r.encoding`` の新しい値を使います。 + whenever you call ``r.text``. You might want to do this in any situation where + you can apply special logic to work out what the encoding of the content will + be. For example, HTTP and XML have the ability to specify their encoding in + their body. In situations like this, you should use ``r.content`` to find the + encoding, and then set ``r.encoding``. This will let you use ``r.text`` with + the correct encoding. + +エンコーディングを変更した場合、Requests は ``r.text`` を呼び出すたびに ``r.encoding`` の新しい値を使用します。 +特別なロジックを適用してコンテンツのエンコーディングがどのようなものになるかといった状況を把握したいこともあるかもしれません。 +例として、HTTP と XML にはエンコーディングを指定する機能があります。 +このような状況において、``r.content`` を使ってエンコーディングを見つけ、``r.encoding`` をセットする必要があります。 +これにより、``r.text`` を正しいエンコーディングで使うことができるようになります。 .. Requests will also use custom encodings in the event that you need them. If you have created your own encoding and registered it with the ``codecs`` module, you can simply use the codec name as the value of ``r.encoding`` and Requests will handle the decoding for you. -Requestsは、必要としているイベントにおいてもカスタムエンコーディングを使います。 -オリジナルのエンコーディングを作成したり、 ``codecs`` モジュールに登録されているものを使う場合、 -単純に ``r.encoding`` の値としてコーデックの名前を使うことができ、Requestsはデコードの処理をしてくれます。 +Requests は必要に応じて独自のエンコーディングを使うこともできます。 +独自のエンコーディングを作成して ``codecs`` モジュールに登録した場合、 +コーデック名を ``r.encoding`` の値として使うだけの簡単な方法で、Requests がデコード処理をやってくれます。 .. Binary Response Content ----------------------- -バイナリデータのレスポンスの本文 ---------------------------------------------- +バイナリのレスポンスコンテンツ +------------------------------ .. You can also access the response body as bytes, for non-text requests:: -テキスト以外のリクエストに、レスポンスの本文にデータとしてアクセスすることもできます。:: +テキスト以外のリクエストの場合は、レスポンスボディにバイトとしてアクセスすることもできます。:: >>> r.content b'[{"repository":{"open_issues":0,"url":"https://github.com/... .. The ``gzip`` and ``deflate`` transfer-encodings are automatically decoded for you. -``gzip`` や ``deflate`` のようなTransfer-Encodingは自動的にデコードされます。 +``gzip`` と ``deflate`` の転送コーディングは自動的にデコードされます。 .. For example, to create an image from binary data returned by a request, you can - use the following code: + use the following code:: -リクエストによって返されたバイナリデータから画像を作成する例として、以下のようなコードになります。: +例として、リクエストすることで返却されたバイナリデータから画像を作成するには、以下のコードを使います。:: >>> from PIL import Image - >>> from StringIO import StringIO - >>> i = Image.open(StringIO(r.content)) + >>> from io import BytesIO + + >>> i = Image.open(BytesIO(r.content)) .. JSON Response Content --------------------- -JSONのレスポンスの本文 ------------------------- +JSON のレスポンスコンテンツ +------------------------------ .. There's also a builtin JSON decoder, in case you're dealing with JSON data:: -JSONデータを扱う場合に、JSONをデコードする機能もあります。:: +JSON データを扱うことも想定して、組み込みの JSON デコーダーもあります。:: >>> import requests - >>> r = requests.get('https://github.com/timeline.json') + + >>> r = requests.get('https://api.github.com/events') >>> r.json() [{u'repository': {u'open_issues': 0, u'url': 'https://github.com/... -.. In case the JSON decoding fails, ``r.json`` raises an exception. +.. In case the JSON decoding fails, ``r.json()`` raises an exception. For example, if + the response gets a 204 (No Content), or if the response contains invalid JSON, + attempting ``r.json()`` raises ``ValueError: No JSON object could be decoded``. -JSONのデコードに失敗した場合、 ``r.json`` は単純に ``None`` を返します。 +JSON のデコードに失敗した場合、``r.json()`` は例外を発生させます。 +例として、レスポンスが 204 (No Content) だった場合や、レスポンスに無効な JSON が含まれていた場合は、 +``r.json()`` は ``ValueError: No JSON object could be decoded`` を発生させます。 +.. It should be noted that the success of the call to ``r.json()`` does **not** + indicate the success of the response. Some servers may return a JSON object in a + failed response (e.g. error details with HTTP 500). Such JSON will be decoded + and returned. To check that a request is successful, use + ``r.raise_for_status()`` or check ``r.status_code`` is what you expect. + +``r.json()`` のメソッド呼び出しが問題なかったとしても、レスポンスが正しかったということにならないことに注意して下さい。 +一部のサーバーでは、レスポンスを返却する処理が失敗した時に JSON オブジェクトを返す場合があります(HTTP 500 の時のエラーの詳細等)。 +そのような JSON はデコードされて、返却されます。 +リクエストが成功したことを確認するには、``r.raise_for_status()`` を使うか、``r.status_code`` が期待したものかどうかを確認して下さい。 .. Raw Response Content -------------------- -生のレスポンスの本文 ------------------------ +生のレスポンスコンテンツ +--------------------------- .. In the rare case that you'd like to get the raw socket response from the server, you can access ``r.raw``. If you want to do this, make sure you set ``stream=True`` in your initial request. Once you do, you can do this:: -サーバーからの生のソケットレスポンスの全てを取得したい稀なケースでは、 ``r.raw`` にアクセスできます。 -アクセスする場合、リクエストを初期化する際に ``stream=True`` を設定して下さい。 -設定すると以下のようになります。:: +ごく稀に、サーバーから生のソケットレスポンスを取得したい場合に ``r.raw`` にアクセスすることができます。 +これを行う場合は、最初のリクエスト時に ``stream=True`` をセットして下さい。 +一度セットすると、可能になります。:: + + >>> r = requests.get('https://api.github.com/events', stream=True) - >>> r = requests.get('https:/github.com/timeline.json', stream=True) >>> r.raw + >>> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03' +.. In general, however, you should use a pattern like this to save what is being + streamed to a file:: + +しかし、一般的にはこのようなパターンを使ってファイルにストリーミングされているものを保存する必要があります。:: + + with open(filename, 'wb') as fd: + for chunk in r.iter_content(chunk_size=128): + fd.write(chunk) + +.. Using ``Response.iter_content`` will handle a lot of what you would otherwise + have to handle when using ``Response.raw`` directly. When streaming a + download, the above is the preferred and recommended way to retrieve the + content. Note that ``chunk_size`` can be freely adjusted to a number that + may better fit your use cases. + +``Response.iter_content`` を使うことで、直接 ``Response.raw`` を使う時にやらなければいけないことがたくさんあります。 +ダウンロードをストリーミングする時は、上記で勧められている方法でコンテンツを取得することをお勧めします。 +``chunk_size`` は、ユースケースに適した数に自由に調整することができます。 .. Custom Headers -------------- -カスタムヘッダー ---------------------- +独自のヘッダー +----------------------- .. If you'd like to add HTTP headers to a request, simply pass in a ``dict`` to the ``headers`` parameter. -リクエストにHTTPヘッダーを追加したい場合、 ``headers`` パラメーターに ``dict`` を渡すだけです。 +リクエストに HTTP ヘッダーを追加する場合は、シンプルに ``headers`` パラメータに ``ディクショナリ`` を渡します。 -.. For example, we didn't specify our content-type in the previous example:: +.. For example, we didn't specify our user-agent in the previous example:: -例えば、前の例のようにコンテントタイプを指定する必要はありません。:: +例として、前のサンプルではユーザーエージェントを指定していませんでした。:: - >>> import json >>> url = 'https://api.github.com/some/endpoint' - >>> payload = {'some': 'data'} - >>> headers = {'content-type': 'application/json'} + >>> headers = {'user-agent': 'my-app/0.0.1'} + + >>> r = requests.get(url, headers=headers) + +.. Note: Custom headers are given less precedence than more specific sources of information. For instance: + +注意点: 独自のヘッダーとして追加された情報は、より具体的な情報より優先度は低くなります。例として: - >>> r = requests.post(url, data=json.dumps(payload), headers=headers) +.. Authorization headers set with `headers=` will be overridden if credentials + are specified in ``.netrc``, which in turn will be overridden by the ``auth=`` + parameter. +.. Authorization headers will be removed if you get redirected off-host. +.. Proxy-Authorization headers will be overridden by proxy credentials provided in the URL. +.. Content-Length headers will be overridden when we can determine the length of the content. +* `headers=` として設定された認証ヘッダーは、クレデンシャルが ``.netrc`` で指定されている場合は上書きされ、 + ``auth=`` パラメータによって上書きされます。 +* off-host でリダイレクトされた場合、認証ヘッダーは削除されます。 +* Proxy-Authorization ヘッダーは、URL で提供されたプロキシのクレデンシャルによって更新されます。 +* Content-Length ヘッダーは、コンテンツの長さが決まった時に更新されます。 + +.. Furthermore, Requests does not change its behavior at all based on which custom headers are specified. The headers are simply passed on into the final request. + +さらに、Requests は独自のヘッダーが指定されたことによって振る舞いが変わることはありません。 +ヘッダーは単純に最終的なリクエストに渡されるだけです。 + +.. Note: All header values must be a ``string``, bytestring, or unicode. While permitted, it's advised to avoid passing unicode header values. + +注意点: 全てのヘッダーの値は、``string``、バイト文字列、Unicode でなければいけません。 +許可されている間は、Unicode のヘッダーの値を渡さないようにすることをお勧めしています。 .. More complicated POST requests ------------------------------ @@ -270,16 +346,17 @@ JSONのデコードに失敗した場合、 ``r.json`` は単純に ``None`` を --------------------------------- .. Typically, you want to send some form-encoded data — much like an HTML form. - To do this, simply pass a dictionary to the `data` argument. Your + To do this, simply pass a dictionary to the ``data`` argument. Your dictionary of data will automatically be form-encoded when the request is made:: -一般的にHTMLのフォームのようにエンコードしたデータを送信したい場合、 -これをするのは簡単で、 `data` 引数に辞書を渡すだけです。 -データの辞書はリクエストを生成する時に自動的にエンコードされます。:: +通常、フォーム形式のデータを HTML 形式と同様に送信します。 +これをするには、シンプルに ``data`` 引数にディクショナリを渡します。 +リクエストが行われると、データのディクショナリは自動的にフォームエンコードされます。:: >>> payload = {'key1': 'value1', 'key2': 'value2'} + >>> r = requests.post("http://httpbin.org/post", data=payload) - >>> print r.text + >>> print(r.text) { ... "form": { @@ -289,31 +366,64 @@ JSONのデコードに失敗した場合、 ``r.json`` は単純に ``None`` を ... } -.. There are many times that you want to send data that is not form-encoded. If you pass in a ``string`` instead of a ``dict``, that data will be posted directly. +.. You can also pass a list of tuples to the ``data`` argument. This is particularly + useful when the form has multiple elements that use the same key:: + +``data`` 引数にタプルのリストを渡すこともできます。 +これは、フォームに同じキーを使う複数の要素がある場合に特に便利です。 + + >>> payload = (('key1', 'value1'), ('key1', 'value2')) + >>> r = requests.post('http://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key1": [ + "value1", + "value2" + ] + }, + ... + } + +.. There are times that you may want to send data that is not form-encoded. If + you pass in a ``string`` instead of a ``dict``, that data will be posted directly. -エンコードされていないデータを送りたい場合が何度もあると思います。 -``dict`` の代わりに ``string`` を渡した場合、データは直接送信されます。 +フォームエンコードされていないデータを送信したい場合がよくあります。 +``dict`` の代わりに ``string`` を渡すと、そのデータは直接ポストされます。 .. For example, the GitHub API v3 accepts JSON-Encoded POST/PATCH data:: -例えば、GitHubのAPI v3はJSONエンコードされたPOST/PATCHデータを受け取ります。:: +例として、GitHub の API の V3 では JSON エンコードされた POST/PATCH データを受け取ります。:: >>> import json + >>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some': 'data'} >>> r = requests.post(url, data=json.dumps(payload)) +.. Instead of encoding the ``dict`` yourself, you can also pass it directly using + the ``json`` parameter (added in version 2.4.2) and it will be encoded automatically:: + +``dict`` を自身でエンコードする代わりに、(バージョン 2.4.2 で追加された) ``json`` パラメータに直接渡すこともできます。 +渡すと自動でエンコードされます。:: + + >>> url = 'https://api.github.com/some/endpoint' + >>> payload = {'some': 'data'} + + >>> r = requests.post(url, json=payload) + .. POST a Multipart-Encoded File ----------------------------- -マルチパートエンコードされたファイルのPOST ---------------------------------------------------- +マルチパートエンコードされたファイルの POST +---------------------------------------------- .. Requests makes it simple to upload Multipart-encoded files:: -RequestsはMultipartエンコードのファイルをアップロードすることが簡単にできます。:: +Requests は、マルチパートエンコードされたファイルを簡単にアップロードすることができます。:: >>> url = 'http://httpbin.org/post' >>> files = {'file': open('report.xls', 'rb')} @@ -328,12 +438,12 @@ RequestsはMultipartエンコードのファイルをアップロードするこ ... } -.. You can set the filename explicitly:: +.. You can set the filename, content_type and headers explicitly:: -ファイル名を明示的に指定して下さい。:: +ファイル名、コンテントタイプ、ヘッダーを明示的に設定できます。:: >>> url = 'http://httpbin.org/post' - >>> files = {'file': ('report.xls', open('report.xls', 'rb'))} + >>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} >>> r = requests.post(url, files=files) >>> r.text @@ -347,7 +457,7 @@ RequestsはMultipartエンコードのファイルをアップロードするこ .. If you want, you can send strings to be received as files:: -ファイルとして受け取りたい場合に文字列を送信することができます。:: +必要に応じて、ファイルとして受け取る文字列を送信することができます。:: >>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} @@ -362,12 +472,41 @@ RequestsはMultipartエンコードのファイルをアップロードするこ ... } +.. In the event you are posting a very large file as a ``multipart/form-data`` + request, you may want to stream the request. By default, ``requests`` does not + support this, but there is a separate package which does - + ``requests-toolbelt``. You should read `the toolbelt's documentation + `_ for more details about how to use it. + +非常に大きなファイルを ``multipart/form-data`` のリクエストとして送信する場合、 +リクエストをストリームとして送信する必要があります。 +デフォルトでは、``requests`` はこれをサポートしていませんが、別のパッケージで ``requests-toolbelt`` というのがあります。 +使い方の詳細については、`toolbelt のドキュメント `_ を参照して下さい。 + +.. For sending multiple files in one request refer to the :ref:`advanced ` + section. + +1つのリクエストで複数のファイルを送信するには、:ref:`advanced ` の章を参照して下さい。 + +.. It is strongly recommended that you open files in `binary mode`_. + This is because Requests may attempt to provide the + ``Content-Length`` header for you, and if it does this value will + be set to the number of *bytes* in the file. Errors may occur if + you open the file in *text mode*. + +.. warning:: `binary mode`_ でファイルを開くことを強くお勧めします。 + これは、Requests が ``Content-Length`` ヘッダーを提供しようとする可能性があり、 + その場合、この値はファイルのバイト数に設定されるからです。 + *text mode* でファイルを開くと、エラーが発生することがあります。 + +.. _binary mode: https://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files + .. Response Status Codes --------------------- レスポンスのステータスコード ------------------------------------------- +----------------------------------- .. We can check the response status code:: @@ -380,16 +519,17 @@ RequestsはMultipartエンコードのファイルをアップロードするこ .. Requests also comes with a built-in status code lookup object for easy reference:: -Requestsは簡単に参照できるように、組み込みのステータスコードのルックアップオブジェクトがあります。:: +Requests は、簡単に参照できるようにされている組み込みのステータスコードもあります。 >>> r.status_code == requests.codes.ok True -.. If we made a bad request (non-200 response), we can raise it with - :class:`Response.raise_for_status()`:: +.. If we made a bad request (a 4XX client error or 5XX server error response), we + can raise it with + :meth:`Response.raise_for_status() `:: -不正なリクエスト(200以外のレスポンス)を作りたい場合は、 -:class:`Response.raise_for_status()` で例外を発生させることができます。:: +不正なリクエスト(4XX クライアントエラーか 5XX サーバーエラーのレスポンス)の場合、 +:meth:`Response.raise_for_status() ` の例外が発生します。 >>> bad_r = requests.get('http://httpbin.org/status/404') >>> bad_r.status_code @@ -404,8 +544,8 @@ Requestsは簡単に参照できるように、組み込みのステータスコ .. But, since our ``status_code`` for ``r`` was ``200``, when we call ``raise_for_status()`` we get:: -しかし呼び出した時は、 ``r`` の ``status_code`` が ``200`` だったので、 -``raise_for_status()`` を呼び出します。:: +しかし、``r`` の ``status_code`` が ``200`` の場合、 +``raise_for_status()`` を呼び出すと以下の結果を得ることができます。:: >>> r.raise_for_status() None @@ -423,65 +563,71 @@ Requestsは簡単に参照できるように、組み込みのステータスコ .. We can view the server's response headers using a Python dictionary:: -Pythonの辞書形式で簡単にサーバーのレスポンスヘッダーを見ることができます。:: +Python のディクショナリで実装されたサーバーのレスポンスヘッダーを表示することができます。:: >>> r.headers { - 'status': '200 OK', 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'connection': 'close', 'server': 'nginx/1.0.4', 'x-runtime': '148ms', 'etag': '"e1ca502697e5c9317743dc078f67693f"', - 'content-type': 'application/json; charset=utf-8' + 'content-type': 'application/json' } .. The dictionary is special, though: it's made just for HTTP headers. According to - `RFC 2616 `_, HTTP - Headers are case-insensitive. + `RFC 7230 `_, HTTP Header names + are case-insensitive. -辞書とはいえ、特別です。辞書はHTTPヘッダーを作成するためだけに作られます。 -`RFC 2616 `_ によると、HTTPヘッダーは大文字と小文字を区別しません。 +ディクショナリとはいえ特別で、HTTP ヘッダーのためだけに実装されています。 +`RFC 7230 `_ によると、HTTP ヘッダーは大文字と小文字を区別しません。 .. So, we can access the headers using any capitalization we want:: -そこで、任意の大文字と小文字を使用してヘッダーにアクセスできます。:: +よって、任意の文字に大文字を使ってヘッダーにアクセスすることができます。:: >>> r.headers['Content-Type'] - 'application/json; charset=utf-8' + 'application/json' >>> r.headers.get('content-type') - 'application/json; charset=utf-8' + 'application/json' -.. If a header doesn't exist in the Response, its value defaults to ``None``:: +.. It is also special in that the server could have sent the same header multiple + times with different values, but requests combines them so they can be + represented in the dictionary within a single mapping, as per + `RFC 7230 `_: -レスポンスにはないヘッダーを参照すると、値はデフォルトの ``None`` になります。:: +サーバーが異なる値で同じヘッダーを複数回送信する可能性もありますが、 +Requests は、`RFC 7230 `_ に従って、 +単一のマッピング内のディクショナリで表現できるように結合します。 - >>> r.headers['X-Random'] - None + .. A recipient MAY combine multiple header fields with the same field name + into one "field-name: field-value" pair, without changing the semantics + of the message, by appending each subsequent field value to the combined + field value in order, separated by a comma. + 後続の各フィールドの値をコンマで分割されて結合されたフィールドの値を順番に追加することによって、 + メッセージのセマンティクスを変更せずに、"field-name: field-value" のペアとして組み合わせて + 同じフィールド名に複数のヘッダーフィールドを結合されるかもしれません。 -.. Cookies - ------- +Cookies +------- -クッキー -------------- - -.. If a response contains some Cookies, you can get quick access to them:: +.. If a response contains some Cookies, you can quickly access them:: -レスポンスにクッキーが含まれている時、レスポンスに簡単にアクセスして取得することができます。 +レスポンスに Cookie がある場合、簡単にアクセスすることができます。:: - >>> url = 'http://httpbin.org/cookies/set/requests-is/awesome' + >>> url = 'http://example.com/some/cookie/setting/url' >>> r = requests.get(url) - >>> r.cookies['requests-is'] - 'awesome' + >>> r.cookies['example_cookie_name'] + 'example_cookie_value' .. To send your own cookies to the server, you can use the ``cookies`` parameter:: -サーバーにクッキーを送信するには、 ``cookies`` パラメーターを使えます。:: +Cookie をサーバーに送信するには、``cookies`` パラメータを使います。:: >>> url = 'http://httpbin.org/cookies' >>> cookies = dict(cookies_are='working') @@ -490,132 +636,163 @@ Pythonの辞書形式で簡単にサーバーのレスポンスヘッダーを >>> r.text '{"cookies": {"cookies_are": "working"}}' +.. Cookies are returned in a :class:`~requests.cookies.RequestsCookieJar`, + which acts like a ``dict`` but also offers a more complete interface, + suitable for use over multiple domains or paths. Cookie jars can + also be passed in to requests:: + +Cookie は ``dict`` のように振る舞う :class:`~requests.cookies.RequestsCookieJar` から返却され、 +複数のドメインやパスでの使用に適したより完全なインターフェースも提供しています。 +CookieJar をリクエストに渡すこともできます。:: + + >>> jar = requests.cookies.RequestsCookieJar() + >>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies') + >>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere') + >>> url = 'http://httpbin.org/cookies' + >>> r = requests.get(url, cookies=jar) + >>> r.text + '{"cookies": {"tasty_cookie": "yum"}}' + .. Redirection and History ----------------------- リダイレクトと履歴 ---------------------------- +-------------------------- + +.. By default Requests will perform location redirection for all verbs except + HEAD. + +デフォルトでは、Requests は HEAD を除く全ての HTTP メソッドに対してリダイレクトを実行できます。 + +.. We can use the ``history`` property of the Response object to track redirection. -.. Requests will automatically perform location redirection while using the GET - and OPTIONS verbs. +リダイレクトの履歴を追跡するために、Response オブジェクトの ``history`` プロパティを使えます。 -Requestsは、GETやOPTIONSメソッドを使っている時に自動的にリダイレクトを行います。 +.. The :attr:`Response.history ` list contains the + :class:`Response ` objects that were created in order to + complete the request. The list is sorted from the oldest to the most recent + response. -.. GitHub redirects all HTTP requests to HTTPS. We can use the ``history`` method - of the Response object to track redirection. Let's see what Github does:: +:attr:`Response.history ` のリストには、 +リクエストを完了するために作成された :class:`Response ` オブジェクトが含まれています。 +リストは、最も古いレスポンスから最も新しいレスポンス順に並んでいます。 -GitHubは全てのHTTPリクエストをHTTPSにリダイレクトします。 -リダイレクト処理をトラッキングするためにレスポンスオブジェクトの ``history`` メソッドを使えます。 -何が起こるか見てみましょう。:: +.. For example, GitHub redirects all HTTP requests to HTTPS:: + +例として、GitHub は全ての HTTP リクエストを HTTPS にリダイレクトします。:: >>> r = requests.get('http://github.com') + >>> r.url 'https://github.com/' + >>> r.status_code 200 + >>> r.history [] -.. The :class:`Response.history` list contains a list of the - :class:`Request` objects that were created in order to complete the request. The list is sorted from the oldest to the most recent request. - -:class:`Response.history` は、 -リクエストが完了したときに作られる :class:`Request` オブジェクトがリストとして入っています。 -リストはリクエストの古いものから最も新しいものの順に並べ替えられます。 -.. If you're using GET or OPTIONS, you can disable redirection handling with the - ``allow_redirects`` parameter:: +.. If you're using GET, OPTIONS, POST, PUT, PATCH or DELETE, you can disable + redirection handling with the ``allow_redirects`` parameter:: -GET、HEAD、OPTIONSを使う場合、 -``allow_redirects`` パラメーターを使うことでリダイレクトの処理を無効にすることができます。:: +GET、OPTIONS、POST、PUT、PATCH、DELETE を使う場合、 +``allow_redirects`` パラメータでリダイレクト処理を向こうにできます。:: >>> r = requests.get('http://github.com', allow_redirects=False) + >>> r.status_code 301 + >>> r.history [] -.. If you're using POST, PUT, PATCH, DELETE or HEAD, you can enable - redirection as well:: +.. If you're using HEAD, you can enable redirection as well:: + +HEAD を使う場合、リダイレクトを有効にすることができます。:: -POST、PUT、PATCHを使う場合、明示的にリダイレクトを有効にすることができます。:: + >>> r = requests.head('http://github.com', allow_redirects=True) - >>> r = requests.post('http://github.com', allow_redirects=True) >>> r.url 'https://github.com/' + >>> r.history [] -Timeouts --------- +.. Timeouts + -------- + +タイムアウト +------------- -.. You can tell requests to stop waiting for a response after a given number of - seconds with the ``timeout`` parameter:: +.. You can tell Requests to stop waiting for a response after a given number of + seconds with the ``timeout`` parameter. Nearly all production code should use + this parameter in nearly all requests. Failure to do so can cause your program + to hang indefinitely:: -``timeout`` パラメーターに秒数を指定すると、指定した秒数の間、Requestsのレスポンスの待機を止めることができます。:: +``timeout`` パラメータに秒数の数字を渡すと、渡した秒数後に Requests がレスポンスの待ち受けを止めるように指示することができます。 +ほぼ全てのプロダクションのコードでは、ほぼ全てのリクエストでこのパラメータを使う必要があります。 +それをしておかないと、プログラムが無期限にハングする原因になります。 >>> requests.get('http://github.com', timeout=0.001) Traceback (most recent call last): File "", line 1, in requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001) +.. Note -.. Note: + ``timeout`` is not a time limit on the entire response download; + rather, an exception is raised if the server has not issued a + response for ``timeout`` seconds (more precisely, if no bytes have been + received on the underlying socket for ``timeout`` seconds). If no timeout is specified explicitly, requests do + not time out. -.. admonition:: 注意: - - .. ``timeout`` only effects the connection process itself, not the - downloading of the response body. - - ``timeout`` は、レスポンスの本文をダウンロードせず接続の処理だけにしか影響しません。 +.. admonition:: Note + ``timeout`` は、レスポンスのダウンロード全体の時間制限ではありません。 + むしろ、サーバーが ``timeout`` で指定した秒数(より正確には、``timeout`` で指定した秒数で下位ソケットで受信したバイトがない)で + レスポンスを返却しない場合に例外を発生させます。 + timeout で明示的に指定しない場合、リクエストはタイムアウトしません。 .. Errors and Exceptions --------------------- エラーと例外 ------------------------- +--------------------- .. In the event of a network problem (e.g. DNS failure, refused connection, etc), - Requests will raise a :class:`ConnectionError` exception. + Requests will raise a :exc:`~requests.exceptions.ConnectionError` exception. -ネットワークの問題が起こった時(例えば、DNSのエラーやコネクションの切断等)に、 -Requestsは :class:`ConnectionError` の例外を発生します。 +ネットワークの問題(DNSの障害、接続拒否等)が発生した場合、Requests は :exc:`~requests.exceptions.ConnectionError` の例外を発生させます。 -.. In the event of the rare invalid HTTP response, Requests will raise - an :class:`HTTPError` exception. +.. :meth:`Response.raise_for_status() ` will + raise an :exc:`~requests.exceptions.HTTPError` if the HTTP request + returned an unsuccessful status code. -稀に不正なHTTPレスポンスがあった時に、Requestsは :class:`HTTPError` の例外を発生します。 +:meth:`Response.raise_for_status() ` は、 +HTTP リクエストが失敗のステータスコードを返すと、:exc:`~requests.exceptions.HTTPError` を発生させます。 -.. If a request times out, a :class:`Timeout` exception is raised. +.. If a request times out, a :exc:`~requests.exceptions.Timeout` exception is + raised. -リクエストがタイムアウトした場合、 :class:`Timeout` の例外を発生します。 +リクエストがタイムアウトした場合、:exc:`~requests.exceptions.Timeout` の例外を発生させます。 .. If a request exceeds the configured number of maximum redirections, a - :class:`TooManyRedirects` exception is raised. + :exc:`~requests.exceptions.TooManyRedirects` exception is raised. -リクエストが設定されたリダイレクトの最大数超えた場合、 :class:`TooManyRedirects` の例外を発生します。 +リクエストが設定されている最大のリダイレクト数を超えると、 +:exc:`~requests.exceptions.TooManyRedirects` の例外を発生させます。 .. All exceptions that Requests explicitly raises inherit from - :class:`requests.exceptions.RequestException`. - -全ての例外は、 :class:`requests.exceptions.RequestException` を継承して明示的に発生させます。 - -.. You can refer to :ref:`Configuration API Docs ` for immediate - raising of :class:`HTTPError` exceptions via the ``danger_mode`` option or - have Requests catch the majority of - :class:`requests.exceptions.RequestException` exceptions with the ``safe_mode`` - option. + :exc:`requests.exceptions.RequestException`. -``danger_mode`` オプションにして :class:`HTTPError` の例外をすぐに発生させることや 、 -``safe_mode`` オプションで :class:`requests.exceptions.RequestException` でRequestsが捕まえる代表的な例外を取得するためには、 -:ref:`Configuration API Docs ` を見てください。 +Requests が明示的に発生させる全ての例外は、:exc:`requests.exceptions.RequestException` を継承しています。 ----------------------- .. Ready for more? Check out the :ref:`advanced ` section. -準備はできましたか? -:ref:`advanced ` の章をチェックして下さい。 \ No newline at end of file +準備できましたか? +:ref:`advanced ` の章をチェックして下さい。 diff --git a/ext/requests-logo.ai b/ext/requests-logo.ai new file mode 100755 index 0000000..7da8cb7 --- /dev/null +++ b/ext/requests-logo.ai @@ -0,0 +1,8722 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[7 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + requests + + + Adobe Illustrator CC 2017 (Macintosh) + 2016-11-23T19:55:35-05:00 + 2016-11-23T19:55:35-05:00 + 2016-11-23T19:55:35-05:00 + + + + 200 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADIAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FULqOq6XplubnUryCytx1muJEiT/AIJyoxVA6d5z8n6ncLbabrun3tw5ISG3u4JXYgVICo7E7Yqn GKvGra91L82vNmvWKX1xZeQfL1wdP4WUrQtqN2n9/wCtLGySeitfgCNQ9Wr0xVLvO35D6domh/pX yQ8+la/ZUeG/s29B6VHP1vRC8k41rUN8ty2FWRfkH+aWqedNI1PTNfEf+JfLlx9U1GaEBY5xVlSZ VFACTGwYAU7ilaAK9K1HVdL0yD6xqV5BY29aetcyJElfDk5UYqlFl+Y35e30ohsvNGk3Up2EcN9b SNU9NlcnFWQRyJIiyRsHRwGR1NQQdwQRireKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqN5eWllay3 d5PHbWsCl5p5WCRoo6szNQAYq8Z0v/nIbUr7VLiwg0SzuEQ/6JetqBsobpAQpe3+sQfvVDdeJ5f5 OxwsqTm6P5z6+JV1Gez8maFGpae5sm+tX7qR0jd1ZFA8eCsT0xYqVt+Snky7ne+n0P8ASt7JT1dX 8w3VxdXchA2JhqVUb9Kof8kYFeffnT+Wfka1/K867oXl+20vU4bmVbqa1DKyfVknDceR+EetCp6V pthV9HaPIkukWMiMHR7eJlcGoYFAQQR1rgV5N/zjlawaHpeueVLicfpnTdQuXvrZjR6tPIiyhT8X B40RgfAg98VTL83/ADrYWtsdGkna1tAVOpXrExRsWVjFapLsebFebFfsqviaYQFYV/zi3Z6jqvmH zr55ki9DTdYuRFZrQL6jBmlditeoVkqe5Y++JVlH/OR3luy17TvKlndMoR9bRGjbq8ZtpnkUfMR0 6daYhV91+S/5eSxaiYdJsrG+024ZlmUpHD6ckaSBmR0lSFQjcSEUAla9DgVjunflTNp2oR/oG8m8 t6mEjdL3TJpY7e4XYoJola+t2XvvHHUdqYVRGqfmD+c3kOHl5iuPLvmO0gjE0ssczWd9KC1OCQxh q9PtLDTuehxVP/yc/O/UvzH1W/tm8uLpNnYQpJJdG+W4YvIfgURGGFirLVuYqu3uMCvV8VdirsVd irsVdirsVdirsVS3XPM3l7Qbb6zrWpW2nQ0JVriVYy1OvEMasfYYqxSf80m1T1bfyTpNxrdwgUm+ uEey05Fb9ozyqGenhGp+YG+GksL1Xy//AIkuG1HzLdt5uvYXCRaNYTNbaNZuBVvVnDGNKdGLM8h2 A8MVtIfNd3pmt3K6XDpn+K9YtITb6TpemK0GkaczcQ0Ubo0EhcKAXd+gAARRUqqEg0n8tfN456ZZ eaX/AEkJkS8i0uSYabZO5CJFPeyyGNpOTBfSiid67e+KeJB+ZQ35c+cLC88ueYbrXL+zKT69I0rN HHGrCKVZV5yH0ZJJEUcunRSzfZVu3uiXHlzz/wCTNTsLH4TrCtIzR1lhZ2UfHFIQUHLhup4sGryU McDFMfyd1eTUPIGn21yU/SOjc9H1CKPlRJrBvRAPIA/FGqP8mxVhv/ORPlCeSHSPO+nEQT6FME1d oZXtJp7GeRFKm4io9I2HTsGJxV5z+a3l21svq/6W0nU5frpC2wvtSS5ihkmKwxTFrcvIIyxAblWv zwpt9KeTPL6eXvKej6IEhR9Ps4beb6uvGJpUjAldQQD8b1ap3Nd98CGHecuev/mXoOlWqerH5XST Wb7meEP1mVDHZRu1GIoBI7EDb4fHFXjP5/efLW8sR5d0O8l1FnuHutQurQSelcyIoE0h4GjxR7Rx gMyrwblX4ThVvT/ydh1HRIfMnkvWri70lwEki0W6ljlgYKBKRDKjS1JrWOpcVqobZcVYp5e8m+Xv L2tve+btNuPM+gXkhSPXbT1ZpI5F+3FPa8gRL3cPVl8K4q9ssfI2i6rYW195F1aDWbOxAjjtJp/q 17aFWLCOK9t0E8LrUjhMhbtyUVxVX0vzV+ZujXh02KKfV5Y1aZ9I1uGSK7WJNj6GpWaT20yljtzD sO7YqyL/AJXh5Y0+3jk83WV/5UkcCh1C3Z4HcAFlhuLf1kcCvU0+VdsCsp8p+ePKfm60mu/LmpRa jBAwSZowwKMwqAyuFYVHtiqeYq7FXYq7FUBrfmDQ9CsmvdZv7fTrRa/vrmRYlJALUXkRyag6DfFW Cw/m7d+Zjcxfl1osmtx20noza7euLHS43pUlXes83D9oRx/TuMKvPrTyPaR3V63lvWJNb873kpk1 J7K1hudIt3MnP03luixRU6U+sM5p9jtim1P81fMX5veTNEtbXWLnSLzRtRAtpzDp6GFWkYlkEck3 7xkVagekFaviMVCS2Gv6DfQW7+cfPEsVghUrYx8bT01TtHa6fG6x8T4n54U0mn+NvyuErWHlez1n WtGgEcK6Vptq0NnPO5NDczfu7icu3SJqKaH4TgRSbahp/wCaeuQW31yBPKOgiiQaXYfV31ARyAlv SjqkVuvE0Y7yrUijV44qhTf+RtA0mXR7WGDWrycr62k6cfrrzioKtfz1EsoVj8f1loox/vs4oY1b /lE2qtrE9hO9p5pnie7j0qxuDHFayM6lVuZFWOJBRmJBCV/3WnFasptkHkT80NW03zDfTXtibm+i iiXzrZ2PF5HkjTjHqUEQYAtx4rOqfaBUgVWhVem+e9d8sea/yd8zX2l3sWpaa+l3UglgKtxaOEyL yVqFWUqCVYBvauBDC/zfaxgtvIVzdAT3NzdWOnm9joYfUjvrOZlY8thSCWm3jirN/N35q6VYCbTd Ant9Q1oBleZ5ANPsiNi97cj4E4n/AHWDzY7Ad8VeHaq8nmyy1Xyl5auJbzT0nF75780LGst5dSmi n0bZWDtbxMeXEbj7IAoSSlD/AJXaB5S8v30nlbzbCNI12+dZ/LPmwlvqtzHTgLc8m9MFqnknIV5U BVgjFVmup+S9W8p6tJqum3beVtWuCA+qxMZtEviWqFuw4PoSGvwmYfaJrK5OBCM8weYLy39G887e XLzTrh1J/wAZ+Vy0iCMEEG4Xi4KenQ0cyr144pQ8/mL8n9a0+HU9ctL+/wBQIKReZbLTLrTbh42b jGv1i0KcqbL9rifDemFDCPMmped7Pzla6L5X82a7pGlXPEfWvNUv1e2qyl0SKdxzXkNlUxg++KvS NU/J630fW5dcudLm/MLTrgq0sGo3Bl1G1PHjJJbiQpb3Csu/AhWrShOBWP8AlvRPNXli6vH/ACr8 wm+0iGX1bnyZq8chltS1TJFNG4W8g3+w6KeR+1UCpVZpbf8AOQWm6cY4PPWg6h5WuG63JT6/YE1p Rbm1DmviGQUxVnXl3z95J8yAfoHXbHUZCOXowTxtKB/lRV9RfpGKp9irx7zT5V/5yGe5k+oearW9 0lmBa2toY9OuyvXikhSfjQ9/VFcKRTFYfJej2spu/PXkPzJrmrDZ7jlHrKyqGqp5xzErX+UAU74q rp+aX5d3pmtZNF8yalbpMIYdDlit7eygNSy231WCWCJlTj9mVXbxxpaTDWfOH5t6hpSL5d8tN5Q8 uJSJLiWFpr0qx4qsNnAvqJWv7MZp15jFCl5c/LTzFLqaeZtWc2k6BSNY8yOLy+ioeRaC39Q28Pxb KzFeI/3XXcqu8xeZ/wAuS02h6Zpt5521i5jaO41FZyLoNzBSM3p4/VoWYtXjwj7KrVIxW2MaD5B8 6Nos+gwahdT6h6rj9FaaY1sbTlRib68lWjOP99qPUNOijfFNsP1m+0W416Xy95kOupc2TJHeoZvr c83pgCRUjglNvapRBWiTN71xW3p+nav+Tsdlb6Zo3ljUxcao6+hZacl1EJpoNuJmZoAKdJHNOO/I gVxWkZd6J+Z2u6OLGDT7L8uvJ6HnNY20ynU7gJQlOcfowr6vGm7qd/iJGKGGa3pv5eTrHoMtqj6n Kwa28v6OEn1GSZvhLXN4VoZOLFiAVQUJZ5Dtilhev+XL3TvL91qGtwIbWGRreKR2ktLyaadZCIpp QiPcei5qZGj4Ow4q1K4q9C/5yH1O3ufJH5btaRC6s7+4ivEglqFlJjiISQAfDz9Yg+GKGOaf5Rvd Q1f6951uZdJ0JTJDJpOkeog06dCUCehRqGlSxUEsu68gdlL0y38o6VJ+iG8uhNO1WyiWLR9f0WIt YXpjXb1nh5rFIwDCSO4qrdORrXAhdeXejRXPoecrK68qNqM4Goho0udHvpf5oyfV+rTNTlyWgB6s 53wqlGq32m+XoLn/AAj+aelQWLB1k0DWJku4FBH2UDtPOgIO4oa1+jAm0PofnP8ANfzLYp+itWew 0W0ol9c6ToJVo4WBCS2i3Lyi4iqP91KHC/EFPQFCh5I0pPImpXtz5rgu/Nmgay8jReYrFmn09I5D Sf61pqH00oQzSOA5XeoGKs+1HyJaapo9fLdzHrvlyeMcNFuZ/wC7jJ5BbS5dZfg/lguEdP5SmBWJ aZN5w8myGDyxqMkiWx5f4A1l1SXgx40tZH9SQIpJKiCSVCf2u2FVTWPzo/LXVLqO1/MDyxqXlrXb VS0N7NDKHhANC1ve2nG5C17qgGBU8s/zw/IKbTrfTrrXzeMi8Od5BfTTOT1DTPDyc/F44VSa6038 k/NF19Y0LydqvmOQMOM9hZS2sQk7f6XeGzCU9pKd8Cpv5C/LL81LHXpL+581X2h+WlkRrPyw9yus TLEoAaOS6ukZIwSDtGGoDs1RXFXs2KvOvPf5a+d/NHrwQefLrSdOmdiLK2tIxSNukbSxyQyuKdeT b4VUtB/L/wDMny/pFtpGmea7D6larGsZOkpE1E6qQkxB5j7TH4j41xVIPON5+Z+mzLpp87wSavcr /oOj6RpcUt9Pt1KSyMIUB6ys6qB92KULZ/lZrF1b295+ZXnR4iij17G3uPq9K/ZSW6d/j2pWi/6r dy2m0Cutflb5bsX0ltYs/Qt3b0fL3lt3kllBHHhPfuzTykqPi4NH4NUUxQmpvvPXmLRVg023j8ke T7ZT9ZS1JW7+rryLn6z6YjgFBXjCryV6mhrihEaafKPk7QAqzJ5Z0GaNopdVu1+r6tqQVTX6tCQs sYq/Lmw5k7hRUPirz2LSr380teS68l6ePJ/kvRo/qU/mSUGG6uIlblKAw4s1eRJV2P8AM5BNMUtf mJ+V3lzR7FdZstYNjoYRbUHVJriae4R2LSTheUJRDxoihW505KN1xW1LSte88WulxXXlLyrBpf16 3ddJttKsD9dkgjKqLy5DyPIIXZiFdt3I+nFWKapPrvmG41CEaZPeSadJLBd61qpDyfW/SAEVrDAO Mb8kkkaOPlUbyEKrHFWafm79W1H8mvy31CIQxiOa1RIXqgJZAkn7wcuC1SpPE0/AqEFf+YvzR0fz ZJp1rosnmO7towp03VreK6l+o3ZHpBbu2k/0qHkp4s9aEbgYq61g16P81bQ6sLHyVNqkCNbX+mve pb3FC3MxfEsaSofgkimQDahUVqVWc+dtE/MLWPLn+GV803A1+SMNdabdx2iWmpwKB6psLuG2hkHw /GyHky9KUoxCrPI8/lTX0uItKt+PnTToBZavoGvyCdbkAFT/AKWIyWk9MFVmjFSv21YUOFVnl3Rv Mvkd3tvJxlntLNS975RvpQLmEOKerE1WjdS1PjqY23pJFuuBU3038xfJ+p6hO6aoPJnmtCGvtL1d fqtteAqP7+GRvRYt0WSKUvTerL8OKtf8q3tL6A635bux5J1AyGSOG3uIb3R7o/C/rW6RvGY1c0HO P0m8VPdVrWU/O620xrfVfKuiedraKk0YiuuG671EV5ExLCm1HJ8MVUNN/M3zl5pQ2U/kiC51KDe4 0z6zaC6gqf2oby4sp06fa4Yqmuo+XfMOraOLR/y501bjl6izXmoRwSRyLQJJFLbJdzLIB0ZZAR44 qmP5Y+VPze0e6d/NnmS2u9IBf6to8aveSxq1eCnUJxFM3D/LV6+OKvScVdirsVdirBdT/I78rtT1 KfUrvRf9NuZGlnmhuruDm7faYiGaNd6+GKbSrzT5A0Ty/pyv5U/L238z6hLVVhup4BDDxX4HkN9I 1RU7BB9I2xW0i/L/AMu/mDo9y+r3vki3bzVeRmKW/l1G2gsbaDn8FtawW6XLQxIlPhVSWIJLb4UK n5o+afNmgaYs/mLzjY+WnuKpZ6Po1t9avLqu1FuLuSLhQkfvPTRV7ntgViPk63/J6yjOt+ZtSk81 +bbtxcx2sEl1qTRMRVYI5FCxzSfzs9ATsAB1Kp75z/MHVIZbKOz8vX0FvPPFaaJo+pmDTLdpwQFK QMBLKE2b94hiSlaq1DilfYeVfLa3UfmP8yvNGk6lq0fP6nAbhX023kJ6qJmi5gUoefxGnxMRQKoY ov5gf4n8wL5T0PVYdM0i/dm8webr+4ht7zUQjelwt1Ur6EZ3SGNd+J+HjuxVegWMnlzT7bUtA/Lm yTWtQ0+0lgX1Cq6VYtQrKZZAvxSzOSXCBmkpSqqtVCsC8921/F+RH5bWmm2gu7m5uLK2ioocNLKp lVVjqORd49h0PTCqtqs1nqHlyXzFoWsNoM+iyE6fDfP6Mlnwm4yWUsjheUYehWGTi4p8IeiEKqul +b/Jfn+1a01WKFY7mSJ/MWmSF5Yo5+QX69ZzWwZopWP7aD05Oj8DuyqcXmm+cfKFtdaTr0E/mnyF bqlxpuqQpzurRVoyyc4W9eMwAV9VAx70NTxVRGmp5J862a3c/mCBdYh3tNZiKwytCpV1+ssh9BpF dQdwAdi0fIUCqvrXmH8yvK2v6dPr9jpvmTS2qNL1xHFl6VxICnou7h0jeUNxViyxt/rbYFTHzXqP lzzLpJsfOf5da2oZSGkjsY7xoWIoWhmspJpR9rqFHuMVeUWtz+RGkaxDoWutqFjblP8AQddthqel sDupivbMiJUmWtDLDHwetSFxV67o35KeSLm1i1PQvMOrPZ3aK0N1BfpcxugNVKvLHNWh71riqOb8 gfy9utRh1LXF1DzBqFsALe41S/uZilN/hVXjQCu9ONK4q9HAAAAFANgB0pirsVdirsVdirsVdirs VdiqlcWdpcU+sQRzUqB6iq1AevUHFVXFXkP5leX/AC15o82HTNM8r2nmPzYkMaX2pak8v1DTIPtR +sEb4pH51WGKjGvJiBuVUv0nTPyN/KiJrLVZrO+8w3j89QnW0SWQOxrxEMKyJaQrX4UqNv5jviqc 6v5p/KnzXZx2ljYX2uFJFmEOladdAtwNOMkrRRQhK9Q7gVp3AxVLfKfk3zNovmlW8r6Nd+VvI91F dS63pOpXNrcLJO8NIZLWGGW6eF+dOdZAOI6bAYqwzzDfzW+lfkTo8S/6PNqFhI42ZQ1vc2wSm/UK zivhXCqRedPKsl5541zXPPOl3dvf3NyY7QRWLXFn9UibjD6LxxTpI7xqObH4tzsMVbTQfLl2aaf5 Lv5Z1AIay0i4gkQMOQcSrHFwPcHlXwwKq6PdedtLvbjT7DW73lFEWk0LzAlzBcKrGiUlT6vchOtJ UdhXxxVM/wAn/wAs7rW7qfVI49Ih05boW2taI0dwt5bsKNI8F3G6yr6sTBk4yek1ela4Vetaj+S2 mS289tpfmHW9KtrlSk1ol2LyB0YAMjLfJdMVIFOPKmBUw/Ln8t5vJFvJZx+ZNT1jTigS3sdQeKSO Dj09ErGroKbBA3H2xVmUsUU0ZjlRZI2+0jAMDTfocVbRERFRFCooAVQKAAdABireKuxV2KuxV2Ku xV2KuxV2KuxV2KrZPU9NvTp6lDw5V48qbVp2xV4f+RVvez+TJL+4jSXzHq9zf3GoXMh/eXMhukLK 1ePHlHE0Y6AcTil35PeZB5Z8z+YPJ/m62Gl69qGpT31jfzLxW+ilYlQsp5BggHwfGRvx2I3KHpVr cCP8ydQtpBVrrSLSW3bsFtrm4WRf+CuFOBU31S/RIpbaFHuLlkKmKKlUDD7TsxVVG9dzU9gcVfO8 sUa+V/yXjS2a7u4brTpbW5UcQEWQuy8zt8aoBQ+2FL6M0/VrK+5LC5WeP++tpAUlQ/5SNv8AT0PY 4EJJ5U/e6/5tuUasL6lFEvSnKCwt0k/4YU+jFWDf85CXNhCfKgt1V/Mb6iy2aIFMn1NreQXJeu/o hvTL+4FMVedflrqNzo//ADkbZ6fYSNHZa9YzR6jbGvps0MMlyjqK05B0602q3icVfU2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV4t5t8ueZ/IHmG582eXvrGp+WbuSS61LSI0EkllcSOXa4gV aM0TepLzUA8eR23qqlnWla/5D/MXy8i8IdTsLqNZZLO5RWKcqqC61cI1QwBrWvQ4rSWah+VV5FKl x5Y80X+i3EUZgtxOsepRQwmlY4vrQMyKeI2EuKFK40f85rCxFppt1oOoxKrBmkiutPmJrUGqNdoW b9o7dfpxV5frHlf877bRPLuhx+U4p4PKrBrPUbG9t2Ex6LWOQxzKEXtShIB7YUobXvzY/NuSeM61 olp5YdTxtdQvbO/t+45BbpXKgHuOQHjXAq/TNS/NWPTTZJ5oh0+zmd53On2qNKzzSGWRxcTcnq7M fiNf1YoQWpS6N5e+ua9qt/LdarcJxk1C/la5upQD8MUYJX4eR2RAoxVk3/OP/wCVWuv5lm/MvzVC 9pdSo8eh6ZMGWWNJRRp5A1CpKMyqtO5NKccVfQmKuxV2KuxV2KuxV2KuxV2KuxV2KuxVIf0trGqS 00SOKLTwaNq10GdZKdfq0KlDIv8AxYzqv8vMYq3HoOt0Bl8y3xk7iOGwRPoVraRv+GxV11qOvaSf WvYk1HS1A9a4tUZLmEDq7wVcSr3YxkEdkPZVNjf2Ishfm4jFkYxKLrmvpGMiofnXjxI3riqXfpHU tRAGlxfV7VhX9IXKkVB/3zAeLN/rPxHhyxV5X+bem+R/KVrHcafHcweeNYZodPuNNuXsriaRnLNN c+h6cTIrPuWTfpsNwpDBpbn827G2VtM86XEsixj1lviWXmKksjn1OK7/ALSn54ra2y/5yA/NOG7W A3Gm6jI/BYYxEbgytUAhEtPTcs1dtqHt4YaSzi0/P7zRbWOk3eteVKw69O9rpZsLj1J2mSZoCjWs ioQS61X94ARtWuNIpnmg+e/JHncXWhurJqCKVv8AQNUhMF0qsDyDQyfaFOvAmnfAh5f+Z/5JX+ga bPq35e6jJpsLuBeaRKTJbormnqQtxkaKh4g1+FRvVVGKbZJ+UXlD8sdQ0mHW9Dtph5msHMN/d6oT calbXifDJHKJuap0/wB1gAjpQ4qXqIvprZf9ySrGo/4+0r6J/wBYHeP6ar/lVxQu1TV7LTbP61cM SrFUhjjHOSWR/sRxKN2Zuw/hiqVmHzhqMayNdRaFGzVFtFEt1cBd9nlc+iGO1VWNgP5mxVUfR/MM bI9r5gmd1ryjvLe2libbaogS1kG/g+Kr7PX5U1GPStWgFpfThjZyoS9vchASwjeg4yADkY23puC1 GoqnOKuxV2KuxV2KuxV2KpD5seSeKx0aN+B1i4+r3BDcXFqkbS3HEjerJH6dRuOVffFU7iijijSK JQkcahURRRVUCgAA6AYquxVKZtcedjDo0QvpQSr3HLjbREEg85AG5MCPsICfGnXFUm8u6FBZa3dW N7It3JAkd/Yx0KwwfWZJRKsMJZwoWRKg9QGoMVZfir5p8/TtqP5/amtzV00awhisvBDLFHIfpPrv T6cKejGfzZ1efT/K5jhdo3vJVhaRR0ShZv1fdXEKA9z/ACL8o6Vofk6K9toQbvVAs9xfPvNNVFJL Md6c+VPvwKXnMs1jqOrflWpHqRNruqy21xGSQwhvnddqdC8QPy8MKvUvzC8tafqLyTXC8LhLZ7zS 71RV7e/slLq69OXOM/Eh+FgmBUF+Q3m/zP5q8krd+YIP3kcnox3LAKZkMUcikpxUUKyijd/xJKl5 zrctv+XH/ORdjqUdzKmleaZDa3togJUF44lV35H7IllVhx3+E4ofSGBWEjTNTuPOV7qOmukNroyR 2dvYzcmtpZpU9e4kRQQIX4SonqIp/aqD0xVktnrUMswtbqNrK+P2beanx06mJx8Mg+W/iBiqY4ql +vaUuqaVPaV9Ocj1LScbNFcR/FDKp7FHAP8AZiq7QNSOp6LZ3zUEs0Y9dVqAsy/DKg5b/DIGXFUf irsVdirsVdirsVY/rcEn+KvLl1X90rXluR/ly2/qKfugbFU/xVhP5m2er39ra2en6hLYxqk11erC qkywRNFG6EsQKKJy5HQ0piqE06PVBDbxHzBNaK44W0ckcAik4mhWOZERARSnAxhhQ/DiqWajP5ms /OElrbRXupanHpyurwSxGNYpp2CiV3ihVKGFjSjMf2e+KpvHa3LJTWfM+q2rSCpiSEWcSMvXjM0L FgP+MmKvKPzW8uv5d8xWvnPSb5tW0e4VYdbuTL9auFZFIV34MoKmNQoNPhp8qqQlvmLSLDzV5f8A QjnBhmHqW9yg5hWKlQ3HauzEEdfpxQjfyx/MDV/KFvZ+VPOF1c29hbOkWk6zCY1sGjZi3p3MkiM6 MN6fdt9rFKjpes6XqNz5ATTJ+A0+81G8N1GwARXlvJeI5I9DwCs3JejLsa7FWZeaNV1Lzpe3flLS b2/FnbRn/EGrSeh6cIkRo2tIPq8YEk0ocr9qgHLYnFQ9O8l6FbeXPKtpp0aPFDbIzcJCGdFqSFPA CvFaAd9vHAh4BawR/mL+d02oaoy2eg+VZneeSWREZ7j1G+qxAGv7wBEEib/YINDQYSl7JTWLef1t M1TVNatQm9nJEkZqGG6XJihVvh/ZapP8wwISLyTPrmoTeYRYyzWywalK05vJ/TkXnGjASIYpviUb HcdKYqjfMaavc6JOIr+a9oPhaJUWB2XZUV3SRpHZuhjAAP7QxVk/kCLWIPLFvaazdNe6laNJBc3L nkzOjGvxGtadAcVZHiqQeQmkk8r2106lfr8t1fop7Je3UtygHtwlFMVZBirsVdirsVdirsVQGuaX +ktOe3WT0bhSstpcUqYp4mDxPTuAw3HcVHfFUPpOvxXU50+8T6nrMS8p7Fz9oDYyQMaerET0YdOj BW2xVddKreY7FWAKmyvAQdwQZbXFWM6rd6doMl5YS2p1KOZUkk0ZB6zy2rH0xOImqP3TDhKTtxAY mvVVvyVpGrWGjRa1Z8LibWFS8u7CWR24o61hjguHLsPSiKqA9VP+TirLLDVba8qnF7e6X+8tJxwl X349GXwZSVPY4qx6/h8valrTzXtnFdBFktrW3MKu9w67TOdt41/u1LUUHlXqMVeK+cdLbyNePLps az6DLSaXRkuElubD1JBGqwliDMru393+z2JXFUJbeaPLeozPpzzrHeH4JdOvEaCap6qYpgpb6K4q l13+Wvl5pjdaY1xo178RS4sJni4lhxNEqUAI2PEDFVXyn5n/ADK/KzT/AKpaRWfmDyzC5llBi9K6 RTQMx4HkxoPtEvQdqAUKXoFp5881fmwEg8vQy6F5KLNFql/6kS6ldceIkhtFLfu0+I1k60Bpv8OK s/8AI9n5c8vKPLuixxwadRpbKMDjIrKf30U3KkhkBPMF/iIJ/lwIZFcaoiySW9mn1y9jHx26Oo4V FR6jE0QH7/AHFWB+dtNfSPMOk+Y52+tR6lcrp2raRF8EFyphlaBvTPL1poilF5/a6Cm2Ksg8vSw6 veveNIkj2vFJoE3W3koGS2ANKGMfFJUfbp04UCqbaB/dXn/Mbc/8nDiqCv8AUV1uSfRNJlYpvFqm oxH4IE/biSQfanYfDRfsfaah4qyrIIYYoYUhiUJFGoSNF2CqooAPkMVXYq7FXYq7FXYq7FXYqhr/ AEvT9QjWO9t0nVDyjLirI3TkjfaVvcGuKpCfK2nxa3aqtxfFDa3PFWvrtiv7y3+y5k9QA06cqYqi bny3Y2ltLc6XaqdTVP75yXnnAWnpyzyFpH5DoXY0ND2xVLvKV6lh5a0W4BY6VcWsCymQkm1mCBWD cvsx8xxYfsN7fZVTjX7a2vFgs+Fb2fn9WuFqHgUAepMrqVZePw0oftFcVef+RvJdnLpIF/LdT3Ns 3p3UYlZmV4yU58JS4kjNGKkdPsgGlcVQXkjQLDzX+YGo67NNLcaL5TufqWh2jmscl1GDzupG25tG WYRClFrUb1JUor88fLHk7zBFDbakI4dTij9SW7PoJxtG5r+8kmBoqlWZSASKGlKk4Qh4l5XsPM9n H5QstFvjqk3mL62gs76Q+iDa8ifSm4GRBxXjQ1Fd/ksiGZ2eoGW4ubK6gksdUspDDe6fPxEsbqAT TiWV0PIFXU8WHTAxSfRZbHyl+Ylj68PqeWPMr+hfWQB4xXdKJNEQyCPmxVW8anr2UvTdd8oTXesa Z+i4ZdGvo5RKri7uZWjtyShSYeoYl9VpACI9wP2t8UPUtMFpHYgwwpaoOXrRLQBZFNJORoOVCPtd +uKsU87rdTX3l40Jmk1VBYWgqdo4JnMsgFKD4RyNPgWvc0xVkMflbRERituI7iVhJc3cBNvNLICT zkkhKMxqxO5piqXab5P0mRrj6zJd3SJcSBIprqdowGoX5IGVX5Hrz5fdirJLe3t7aBILeJIYIwFj ijUKiqOgVRQAYqqYq7FXYq7FXYq7FXYq7FXYqgZ/+O3af8w1z/ycgxVG4qxK7uR5Z1K5W6hM3lrV GecsimT6tcMC1wrRgHlFLvJtUhue1Dsqq+Vri3iht3SQzWGoKW0m4ZieNvUtDbknevBiy13/AGT9 ndViXmfVY7V7kJJ9XtEitzfzF+BkSbjDJEg6MqP6TOajqwru2Ksb/JzzXY+W/Nur+VdXuliGu389 7oN1IphiuBI9VRCwA5tyIHiV26ipSXf85P8A5eecPMdlaX3l6xfUkh9JL20hdVcxxNK3IoSpfeUU 41pvtiCgMK/LzW9M0zzP5HGpTCxi8uvrMetTXgMCWr3KSmFXMgj4VHw0I64syFXXdei88fmw/mjy 8rx+WbO2Sze7dTGL6eH1R6qKRyKgTBKnsv3BgxX8w9WubnzXpGi2ieobaRL2440qvBhx3JCr717Y WQfTPlueeb6zPeur3ay2379d0dZZ43cq1ADxX00I7ccDFFaxrWm6dfrqt9OYtGlKqsEal3uLpaCK YRoC7rQcBtuQp+yAcVRPl2G+1bVpvMmowm3iRWtdEs3oWjgJBlnft6k7KBtsEUUJqSVWT4qg9M/4 +/8AmJk/hiqNxV2KuxV2KuxV2KuxV2KuxV2KoGf/AI7dp/zDXP8AycgxVG4qxTzhPc6pcReWtOt1 uLiTjc388jFYbaJDyi9Qr8RMsiceA+0vKtBvirEo/wAvdM1OO5le9uk1K3LC+jgJsoIGVmY+nFb8 Qzs0dQzux4kMT9kYql2paFpXl/ULeTSxMusw2yyW81yWvIrj1ahkYTc/T4IHeX0ipp8XfFUoj8la Ja3Woad5ytJ7Y6JpR1LTNYtZzHNEtpNLJNLZyxlKtynGzKKAJyXFVDyj+e/nTQNCsp/O+nNrNlLG hbUtPWl3DX/lohIRH+GnxKV71rtimmQ33lr8kPzhkGoWVyLfzBLFz9e3ItrxlApWWCVSkwWlCxRq dOQxTuGEec/IPmr8sNPfULXUhr+ihT+6uD6U0BFAP3dWBjBKj4KUr0pivNEeRvKV9Hcaz5psBHqV /pss1NckqLa5YIivb2MPJgy8gyhydzx37YoZhpfkHStS0u+05bi9iSOeIm8SWeBJZLmQUaO2RooU WJmcEIgqwpXY1UJjYeR49Pgn03SAsGuXqGC/gv3a5U2qijzwTMWuERiRwNWAbYrUVCrN/KGrG905 rOeBrTUNLb6peWjgBl4D9244/CUkjoyldu3bFU9xVB6Z/wAff/MTJ/DFUbirsVdirsVdirsVdirs VdirsVQM/wDx3LT/AJhrn/k5BiqpqV/Bp9hPezn91boXYDqadFFe5OwxVjHl2e9XRLSSFA+ueYR+ kbqapeKITKCHdv5YouEca/tUH+UcVRWoWUWhs19Ef9DuozDqbsdzK391cN2qWJR/9YdlxVJ9It7L VIJNRuWaSW6jJ0qOHiZFhZQqXKhqqvqIiBfUFKbftEYqwv8AM/TvMGs/lhfC4T0vMHluL1Pq8ZJW SCLj60quCvqc4BVl2pWnHdTirznW9W1U+SLC70gejPeiABq/3aSrUHkKgb0FffFLG9Ku9RuPKWgy +teXmoW+p6mmnfUw5uYLuWGyNtySP94tZY5TtufiIxZW+g/P0uot+QmoS+bpWj1JLYxS3QT0pCZJ fQRzGporyRSfGvTc7U2xY9Us/LL/ABNqP5feU7BZlS1NtHPexFVQiG1kX044JAPtSKyO3IH/AFhW mKll2o6rp2hX1oWT6ppd1JGjq/wfVnR1l4OoBHFvTcowahYsBXbFDIrDTJbsDVrpfQ1SQs1qxFHh gO6QOBTkpA5SKf2jt0BCqX6rqDWWpabrSQGN2lOnavC1AwgYO6SVNOYikSqU6qzcdzTFWWAggEGo PQ4qg9M/4+/+YmT+GKo3FXYq7FXYq7FXYq7FXYqsuJ4LeCS4nkWKCFWkllchVVFFWZiegAGKsdjX XPMIW4+sSaRojkNBDEON5cx02eSQ726t1VVHOnVlJ4hVSk8s6XHr9nGrXZ52d3yla9u3l+GW2p+9 aUvtXxxVIPMU2v2l9NZaSz61Zww/V4tLupD6pvGjJLpccXdxHG6l/VNASN69FU6/Lp9Lg8k6XfBh 69zbQx3cp5NI88Cei0dGHP4GQqqAbdBiqdXdpc6tbT2lygt9OuEaKROs0sbgq1f2YwR82p/KcVYX 5a8kjSFudKt7i9BspK8UupFkeBl4wOqsxjZSq8P2SGVtyKAKpT580CKHTtQu7a/mae9jjtoIoTOl w1zI6Rek4MoLNMjryVl+yvTauKvIvMHmK18sa5PoN3YILAp69zpluxkfTVkb+6YlER4zyVowrVUG nhinm630HQr5INW8m3y2Gp2TB7e5gYkBg3IJMhPJd69fiGK8kw82+efMn5haVa+V9csreO40iY3e sejNQXUVvXk0UQ+I8U+3xYkVrxFDRS9e0fy3ZWkIm0+6kityDBpunaUruVWN+LuryvIlGkU/GwC0 pixRR/Lq01jUbf8ATsk8/wBVAmNv9ancoCTwWSUMnJmdeXwKoXj3qDirNA2pWZPrE3tsOjooE6j/ AClHwyf7EA+CnFWH/mHq9obvy2mnIL3Vrq/52ttGd5UtY3Z0Y9ECu6gs/wBipPiCqiPLul3l3Ky6 lqlwYo6mwsLSR7OKKJSFaJhGRMzwv8J5PSnHYVpiqM0Xyvpr/XLmKS6trsXcyi4huZwSEcheas7R yUH+/FbFUcmpanpN5Da6u63NhcusNpqiqEdZXNEiuUUBAXOySJRSfhKqaclU+xV2KuxV2KuxV2Ku xVIfMyxXt1pWiyN+6vbgz3UVaGSC0X1Svupl9IMO6kjviqe4qxXzhr8Oi6jYzsyC5ntrq3sY5GCq 88kttwBJIAAoWap6A4qlmkXF3bWnopcxWl1Kx9bUrmjluZq31WIkNJVtzKwCsfiAZaAKpZpks/lz zrqEthaX2r6VfWa3d4zRf6SlwJXWWSESejyR/gLRxr1NV6UxVmWma9f6zaG40yO0EdQObXAnKnuH SEEBh4c64qk3m6S90hI9cvdaS3lgHpNBbQxxvLC7r6ixLK07O4A5KPHpSuKsUOlSeYvMkV/fLdW9 no1rHe2iXExluHWeRkFxKpDxx0jjcpGK/wCVuaKqx78lBbxN+aWr6jbx3F/Lqc1vc6fKo4C2h5gK wox9P96Q+x2XFLxafWbyz07R/NGm20tvrWtanewSiWSedHt4xbPBCwkZ2ZfTnpyJLbVrXCqaa/az j8xvKT2ET293qlxGb6AMRT1GT1I2INPiXkGFN8VD3rywbzyNpOqaZdtKbHTbsx2l5auG+CaOOZEl in5qgHq8RIB0BrTbkEM58vW2r/o5bu21y11Vbusxu/QRkkYgAcXgeNSq8eI2OwxV2pea7zSJIIL+ yW4uZ9oYbGQyzSU+0VhZUYAV33IA74qxny9dxX+v6pr+t282m6pBL9TsnihkZIrdFBdJHRZIncsa OT1oKUpiqO1bWEtR+mLGe2uJbdllu47aQETLQLzKklonK1Qq1RQj4iwXFWQ+T9QtNR0uW+s5BLa3 NzPJDIO6tIT9/jiqaahY21/ZT2VyvOC4QxyAGhowpUEdCOoPY4qhvLl/LfaLbTTMXuUD292/HjW4 tnaCYhewMsbU9sVTLFXYq7FXYq7FXYqx7zDZj/EflvVCxVLa4uLaSv2Qt3bsFJ9zLEiD3anfFWQY qknmnyfonma2hh1KHm9sxktJhQtG57gGqmtNwRiqTJpWk6KPR1LTjBZA7alayTfV/nNGG5Q18d1/ ysVVtK0rSJ/NlzcWBD2lnaRxNJHLI4NxO/qEFuRqUjjjI3/axVN5/KHli4vPrs+mW8t7Sn1l0DS0 8OZ+L8cVbt/KXlq2uXurbTYILmQcZJ41COy1rQstCRirGNN8vWunfmBf2kqyiy1LT45LD9/KEYW8 sgniYchX0/rC8V6cD7Yq8w81+Y2/LD8yrSbQbKW8hvbI/wCKNLQFw0ME3CG7jpUiYoSzdjXcVNcW QROveQ/LXnIf4x/KbVLWS9tmae60UUSB3kUB2WJlDW08ipx+JOLe25KqTfkX5S0/zj5ifzhrbc9U tLieM6QvNI7WOKJIl9VSAxllZwR24p49FD2PyzolhqOv6zqX1ZBYW1+0VlIrScpJYYUt5mJrTjG6 uoH83LwxQyA+TfKpuZbo6VbG5nNZp/THNzQCrN1PTviq/TvKnlzTBKNO0+Kz9clpvQHp8ye7caV+ nFUs0ay0nT7/AFy3kJgWC4W4DSTOP3NxEjB6ltgZllX6MVa1DyzZa27RSWVbJkp9bupJZHJYmoig claU/afb/JIxVO9C0PTNC0qDS9MhEFnbg+nGPFmLMfpZicVRk00UMLzSsEijUvI7bBVUVJPyGKpR 5Lt7qHy3atdRmG4ummvZYGILRteTvcmNiNqp6vE4qneKuxV2KuxV2KuxVDanp1tqVhNY3Ib0Z1oW Q8XUg1V0YfZZGAZT2IriqR2/mOfSFWz80EQSKwig1YKRa3NSQrMwBWCQinJHIFfs1GKp9bXtndRG W2njniGxkjdXUEb9VJGKpPc+aYLpms/L4XVr4/CzxNW1gJ/auLgBkWnXgKuey03xVbpPlSTRdNWH S7rhds5nu3kSsM8zmsjGMEemD0HpkUFOtMVTFdXgjuhaXim1nIXg7ikMrECoik6MQTTiaN7UxVH4 qk3mrR7vUtND6dKLfWLJxc6ZcHosygjg3+RKjNG3sa02xV4X+bcl5f6npXmd7KXS50tXtdas5iGp AzI4lt5UBWVoj/eR/aAQ7d8Uh5JCNV8ialpt15fun/SN1eK9rrUZRbeeCQKv1dzy4ULkswf4SKGu 2FL13yHFr9x5+83ap5NlDaR5hdbSTUwOFut9yMk08CGhk9KMyFTSlTXfYMoL6A0nS7PStMttNsk4 WtrGI4gTUkD9pj3Zjux7nfAhF4qgX1CSYmPToxcODRpmPGBd6H4wDyI8FrvsSMVSvWPLl491ba3a MlzrdjULFN8EE0TbvCAA3pn9qN9yp6kgnFUbp/mXS7uRbZ3NnqBFW067pFcD5IT8Y/ykLKexxVF3 +qaZp6CS/u4bRGrxaeRYwadaciK4qksslx5nK28MUkHl0kNdXEqmN7xRuIYo2owhb9t2HxLstQ3L FWS4q7FXYq7FXYq7FXYq7FXEBgQRUHYg9CMVSdvJvlB5zcNoentOTUzG1gLk+PLjXFU2iijijWKJ BHGgCoigBQBsAAOmKrsVU7m1trqB7e5iSaCQUeKRQyke4O2KpSNO1XSwTpkpvLQUpp1y/wASDuIZ zU08FkqPBlG2KrL3zdp9taM3pyvqPJY4dIICXUkrkhEVGNCDQnmDwABatAcVYB5+0XU7LRL3X9eY 6ix9OWDR4A5sILhnVCjxhg06yB/iZqbgkBS2KQHg+swQaNeTWM0sdzFqEtyl/ZtGPqj3MdwYqWyI KQLGg59aU6fs4UvXfyZXzJ5e/LbRPMKJ9f0ERTG40pY1FzbwPO7yXMLqAZT3ZG3IGxrtgQXtB1e0 eONrSt48qJJFHBRiUkFUckkKqkdCxFe2KGlsLi6UHU2UqdzZRE+j06OxAaXv1AU/y98VR6qqKFUB VUUVRsAB2GKt4qoXun2F/Abe+torqA9Yp0WRD/sWBGKoPT/K/lnTZRNp2kWVlKNhJb28UTAUp1RV PfFUzxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVil9ZLqvn2OKda22kad6sUqMUdLm9mKVDKQ QRFbEfJj2OKqmvWN5JpN9purWra7ot1C0cohAW74kH4WQcVkPgycSD+z3xV8p6VpA8yeb9Csb/RN TRjPz1EQgTyiBGKF2jdI3Rv3vGVzX+ZfDCm31tp1jqD20VuIl0fS4lCQWUJBuOA2o8ikpH8kqf8A KBwIQvkeCCw/TWh28Xo2ulX7R2q8i/7q4hiuh8R3NGnYb9BtU4qyfFXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYqxp3ns/zCXkALPV9NCI3c3NlKzEH3MVxUf6p8MVZJirF9O8kRWf 5gar5u9fk2o2kNqltxpwMdPUbl35emn44qyjFWO+Tj9ZuNe1VDWDUNRf6s/Z47WGO05j2LwNQ9xQ 98VZHirsVdirsVdirsVdirsVdirsVdirsVYb+Y1t+ZTWa3fkvVrGwNrDNJc299bNN6zKvJOLhhw6 EH4T1xV8yeSv+ckfz183+adO8t6bdaXFe6lIYoZJ7aka0UuSxXm1AqnoMVegfmLrX/OVnkvSpfME t/o+qaTaLW7SwtuTRp3lkjlRH4rXco5p1IAriqK/5x7/AOclNS8864fK3me2gh1d4nl0+9tQyJP6 Q5SRvGxejhQWBU0IB2HdV9B4q7FXYq7FUu17RY9Wslh9Vra6gkW4sbyMAvBcICEkUHY7MVZTsykq djiqWQ+bDp4+r+aIf0ZOmx1ABjp81P20n3ENf5JipHbkByxVGy+bvKkMIml1mxSJvsubmKhJ6AfF v9GKpbcalqnmMGy0aOex0uT4bvWpkaF2j6NHZxuFkLMNvVZQq9V5HoqyOzs7WytIbO1jWG2t0WKG JdlVEFFUfIDFVbFXYq7FXYq7FXmX5kf85Dflz5DubjTb+5lvddtwvPSbSMtIpdQ685H4xICrA/ar Ttir03FXYq7FXYq7FXYqo3tubizntw3EzRvGG605KRX8cVfn3/zjh/5O3yt/zES/9Q0uKvt382fM Gk6D+W/mK/1VkFt9QuIFif8A3bLPG0ccIHcyMwXFXy3/AM4f/l5rGoeek85ywPFo2ixzJBcsCFmu p42g9OMnZuEcjlqdNvHFX2LrOtaToumz6nq13FY6fbLznup3CIo9ye56AdScVeM6h/zlAkttd6n5 X8lazr/l2xLLPriI0FueH2mT4JTxHU8qEdwMVZd+VH55+TPzJjmh0oy2eq2qiS40u64iXhWnqRlS yyIDsSNxtUCoxVOvPv5neTPIlilz5hvhDLN/vJYxD1bqc1pSKJdzvtyNF8TiryjVP+cto9Guom1v yHremaXcH9xd3SiGSRSK1SOVURjTsJfpxVmvkj8//JfnjzbB5d8spc3Zaxkv7u8kjMKQcGRPSZX+ Jmq+5Hw9KE12VSHzB/zlP+SuhvL9Slm1S9iLIY7K0eMhwSpUyXAgWle6k/TirObf80/LcX5c2Pn3 XXbR9GvIYZzzV7hoxcMFiBECuxJ5Dou2KsDX/nLP8vL7zBpWhaBaX2q3eqXlvZRy+mtvCpuJViDE ytzJHKtOH0jFXq3mrzd5b8qaRJq/mG/i0+wj29SU7s3UJGgqzuf5VBOKvHdS/wCcp5rfTv09aeQd an8qFgE1yYCCNlJpzACSJxPY8+u2KvQ/y8/ODyT578v3OtaVd/V49PUtqltecYpbVQpbnL8RXhxU kODx2PgcVYVH/wA5IXmv395b/l15J1Dzba2D8LjUfVSytydyODOkteQFQGCsfDFU0/L78+R5k813 flPXvLV55W1yztXvZ47uRHhWKIryYyMsLU+OobhQjvir5S/PLzHoOtfntq2s6bfR3ejvc2IF9DV4 yILaCKVkp9sK0bbr1ptir6+8vf8AOQf5V6/b6pc2OrMtro1t9c1C4uIJoUji5BB8TqOTMzAKo3J6 Yqxay/5yK8zeYopr7yN+XGp6/o0LtH+kZriOyDsuxEa+nPy69A1fEYqyj8p/zmt/P97q+ly6HeaD rGien9fs7sqeJlLAAGiPyBQ1DIMVej4q7FXYqtlljiieWQ8Y41LO3gFFScVfnv8A844Cv52eVh/x fN/1DS4qnn/ORnlrzp5P88wRanq9/rvl+V/rugPqs817GFVhzgcTs6s0ZPFv5lIJ64q+vPyh88aF 5z8habq+kQxWkYQW91p0ACJa3EYHqQhR0UV5L/kkHFXz3/zm55lvG1ny95ZSUrZx2z6lNCDs0kkj Qxsw/wAkRPx+ZxVmv5d/n/5B0fyFoWiW+ha7PFYWEFtM9vp3qRPKsQ9VgyvRubksT3rirxP8ltK8 06P+cVp5isdC1K18vWtxdvcytaTLFFZPFJ8MjFSoohHU9aYqmf8Azj/eXX5h/wDOQn+IfMj/AFy6 hjudSjjkJZEdCEhRAeiw+qCg7UGKvqr84rO0uvyp83pcwpOkejX80ayKGCyRW0jxuK9GRlDKexxV 8x/84TQofzE1uc/3iaQ6L4Ue5gJ/4gMVRv8Azm9Gg81eWnCgO1jMGYDcgTCgJ9q4q+ivyT/8lH5Q /wC2Va/8mxir5Fks4G/5yyWFR6ca+bVlAQADkl4JPxYb4qmP/OXfmSfUvzbXRriZv0doltbxCFKH i1yqzyuB/Oyug+gYq9n1j8/vy/1TyffaHa+W9eksbqxlsoIRpp9Hg0RiVQVfZR026Yq+cfy88mfm b+ifNsWn6LqMNrf6LNFNI9rMsUginhnaNWKqDIyROqgGu5HtirIPyM/5yP8A+VbaHc+X7/RTqOnz XLXaTwyiKaN3REZSrKyuP3YpuCP1Kvdfy/8AzN/J38yvzC/S9u11beZ5tHl0X9DanHCILi0aX6xK F4+qsjAginqboW+DrRV8+/nVpWmWf/OSd3p1pZwW+ni+0pRZxRokIV7a1Lj01AWjFiTtvir3r/nK LyLaw/lJdy+V9HtrRoLu3uNU+o20cbvaRhweXpBSVSRkc1rQCvviryv8nf8AnKu28leUbHytrGhP eWun+oLe9tJVWQpJI0pDxOoUkFzvzFfxxV7j+Tvnr8rPOPmzzL5i8sXV1H5h1qKzbVdKv1jjdI7F GhjkhVAwYEPRyJH/AGfs7VVet4q7FXYql/mG5gtdB1G4ncRwxW0zO7GgACHFXwB/zjzdW9t+dHlW WdxHH9aZOTGg5SQyIoqfFmAxV9p/nV+Wdr+YXkW80fiq6rCDc6PcNQFLlAeKlj0ST7Dexr2GKvkL 8hfzUvfyv89TWOsiSLRL2T6nrlqwPKCWNiqzcf5omqGH8te9MVekf85o+WLm8fy751sF+taW1ubG 4uoqOiVczW7Fl/Zk9R6Hpt74qzP/AJxy/Pfybe+RtN8ta9qcGla3osK2iC9kWGOeCL4YWikkIWqx 0UpWu1QKYq9Sn88eRddupPKmn69aXmq6lbTokFnItyyp6Z5O5i5qgA/nIr9OKvh/8q/Nd1+VH5tx XGtwSRpYSzadrduoq6xtVHKjblwdVcfzU98VfTv5pfn5+W2ofl1runaBqJ13U9X0y8t4LKxilaRE kt3Ek83JV9KOFGLvyoaDFXkv/OEv/Ke69/2yv+xiLFUf/wA5wW841/yvcGNhA9pcxrLT4S6yKWWv iAwxVnv5Rf8AOQn5WaZ+VWi2Wp6t9U1PSLOO0uNOMUrzvJEOK+kqKQ/qUBFDtXemKvn/AETWpbz/ AJyYstW1G1fS5LvzMkslnOOMkHrXQ4Ryjsy8gG98VZL/AM5i+UNQ078yI/MfosdN1u2iAuQPgFzb J6TxEj9r00RhXrXbpir6A/KX/nIDyN5r8rWR1LWLXTPMFvCkWpWd9MkDNKigNLE0pUSI5HLYkjoc VRvn387PLml+U/MV95V1Kx1rXNDtUumt42a4t0DzJCPVkgIXrJ9j1Ax+/FVx/Lj8nPzK0S18wXGi affnUoVlfULMehKzuo5cpIGRy6nYhySOhxV8u+UfJNvaf85PWeheTbh7vS9H1aOcXQYS8bW2Ky3K vItFoPiir47dcVUv+cibsab/AM5H6pqEyMYre40y5oNiyRWdsTxr/qkYq+jPO/8Azkl5JstDsr7y xqtjqry3tpFqMUiyt6NjO9J5WQemwZV2APfqD0xVOvMH5Ifkp5rsX1KbRbJIrmMzLqunMLUFSOXr B4CsbePJgR44q+bv+cYfLlwfz6ml0SZrnQtE+vCe9FCktsyyW9vVhRayMyuKdaHwxV9t4q7FXYqx Lzz+VHkDz1NaTeatL/SMlirpat69zBwWQguP3EkVa8R1xVj0/wDzjP8AkdMgR/K8YC7gpc3kZ+kp MpOKs28p+UfL3lLRIdD8vWn1LS4Gd4rf1JZaNIxdzzmaRzVj3OKsU8x/84/flD5k1u61vWfL63Gp 3rB7qdbq8hDsFC8uEM0aA0Xei7nc74qnvl/8tPI2geWbjyvpekxpoF2zvc6fM0lzHI0oCvy+sNKx qFG1cVeean/ziJ+Tl7dPPDb31grkn6vbXR9MV8PWWVh9+Ks48hflF+X/AJDDv5c0pLe7lUpNfys0 1yykglfUkJKrsPhWg26Yql/5hfkR+W/n27W/1qwaLUwArahZv6EzqAABIQGWSgFAWUkDYHFUj1L8 ovI/5e/lH55i8u2ZW4utD1L6zfXDercuotJKIZKCiCleKgCu/XFXif8AzhL/AMp7r3/bK/7GIsVf VXnfyV5T84aHJpfmeyS809T6oLEo8TqD+8jkUhkYAncHpsdsVeeeRfyY/JbyxaWvn6y0+aFI7UX1 vNqUjTGCNk5iQRAuvPj9mlT/AC74qjtZ/If8i9Y8yyzanon1jXdZM+oy1u9QVpKuplkKpMqRjnKK CgHYDbFWXR/lp5GTybH5MOkxzeWYQwi0+4aScLydpKrJKzygh3JU8qr2pirxy7/5xt/ItvNUOkwW uscppWiY284azilSI3BgeSQNLX0x+yTSoqQTir1PSvya/LDSfLN35XtNDgTStUVUv42ZzNc+mea+ pMW9VirDktG+HtTFWB6t/wA42/lToNq1xBPrdlaXk8Fq1hY3zBZXuZVhRSrirD95vVvs4q9J8ifl j5I8i2b23lrTEtDLT6xdMTJcS0/nlcliP8n7I7DFUD+YP5M/l75+lhufMWm+rfW6+nFfQSPDMI61 4MyEB18AwNO1MVQVp/zj9+U1t5Um8rroavplxMtzcM8spneeNSiSGcMJKqrtxAPEVO25xVjo/wCc VPyyht5LdbzWItMYlpbAX7LbEdTyXj7V64q9I8l+TvKHlXRY7HytYwWenOBIGgPMzVG0jyks0hI6 MzHFU+xV2KuxV2KuxV2KuxV2KuxV2KuxV5v+b1x+ZN9pep+VvK/lOPVrHWdKmtptbl1GC1WCW5WS B4/qzj1JCsZDhuQG9O2KvEfyZ/Kj88fyv8zXWvp5Th1lbmyeyayXU7W2PxyxShw7GRaj0qUI79cV fT3mePVbrynqUNhBy1O5s5YoIOaikssZUDmSq/CW61xVgV7+Xd1b2nmDTbLRRPYTNpCWg9SAm4hs ypuXUSv8M1HkWshWopQ4qh/NugJpwv8AV4/KNvBAukrbaYI1suNpeyTSkMVU8vU5yRcTGp3r8QxV lXkDyrJpFzeXn1A6TBPb2tpFYGRJJGNqH5TztG0ic39TiKMfhX6Aqw3ypZeZNS8s30MN/PqVyDb3 F9Zp9Vt6vd3Pq6jZtKI45UuR6Tq3KULxddhtRVMbv8tr+fRNVu4dOS2uP9Il8u+XlkVFtJJ4Y4WZ pUf0+bekX4KeALGpPZVkN95VkvtH8q6N9ReHSrKeKTUIZJIw6RWtvIIkf0pCGLy8OXBm74qxLT/K vnWw05Db6C311dEu7K0j+tW6xW11d3Us0gAEjCgUoI+I3HwsV7Kusvy51UXv6RudFJkhltmt4xLb +t6UN7aoq8hLx/d2ljyA5U+Og3rirbeVPOUnpXr6ATr31DUorvVDc2zSS3tzGEhNTJVYFDN6a9th xWm6qat5GuLBtbtLTTbltMurSxsONnLbLLeQxxyC45PcSAqx9XizN8XEUU+CrMfJtnqll5Y06z1R EjvLWIQlE40EcZKwg8Pg5ekF5cfh5Vptiqc4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FX/9k= + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:9b43c0f3-16f7-47d6-9898-94b64c380baa + uuid:6a743afe-74fb-424e-b7c5-f3c5bb7c4fe2 + + xmp.iid:ebb2c7d3-470b-4310-8407-fdf65cb41c3a + xmp.did:ebb2c7d3-470b-4310-8407-fdf65cb41c3a + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:ebb2c7d3-470b-4310-8407-fdf65cb41c3a + 2016-11-23T19:19:19-05:00 + Adobe Illustrator CC 2017 (Macintosh) + / + + + saved + xmp.iid:9b43c0f3-16f7-47d6-9898-94b64c380baa + 2016-11-23T19:55:30-05:00 + Adobe Illustrator CC 2017 (Macintosh) + / + + + + Web + Document + 1 + False + False + + 1024.000000 + 1280.000000 + Pixels + + + + + OperatorMonoSSm-BookItalic + Operator Mono SSm + Book Italic + Open Type + Version 1.200 + False + OperatorMonoSSm-BookItalic.otf + + + Palatino-Bold + Palatino + Bold + TrueType + 11.0d2e1 + False + Palatino.ttc + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 0 + 0 + 0 + + + RGB Red + RGB + PROCESS + 255 + 0 + 0 + + + RGB Yellow + RGB + PROCESS + 255 + 255 + 0 + + + RGB Green + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blue + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grays + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Web Color Group + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + Adobe PDF library 15.00 + 21.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 14 0 R/TrimBox[0.0 0.0 1024.0 1280.0]/Type/Page>> endobj 10 0 obj <>stream +H|)N.Ye`~_D?`WvWW%22ӟ>_~\?U6?__^>\_^n~{}x_zkzjwm^{כ?YMww,ֿn\~GO>Sf-qVs&Cf9]˵z[/7'/_-31J#egmT{u9񭘊mv1͓u"e*KsW2FZ9|?%Q̷{͞ ;ΓsY꼷hrm*Ndq8_^|<;Gg>+{'gI +Gpb!3qI٩N[EPa$^P"F +(|R 0WR=&VXVpFB> + +K{L-( +ڬ#1\#F\*ט\ +`rJnGG~wIl28cOn.j4xf oWԦ̽b|SZmPx'0x鍖\ԨxQP1Krw;-j펶-JZ:%ae}NwPjܺ+t*X˙b!Vί*9t+ŝcB`s0iDY ~;03}-թz+c|6l~!_|O/jy^H{~نLn9 rJp)ﻆM5̮MݡJ߂)_ +1%f8fpM0XǢDA(S6(TLqbٶ)c24nm36ûAFP1 h^Y6.{R.anl9%7`Į%*hIE/ M=F"PGS\hQFDRတ+.ͽ-t"vIvPԜK{cֲsߪ`7AACK2] ǿAQ:(*;؇d{0 x _$W8h?*zX.bRᦾ(EORÀ<z\P@vNiZ +zUe +5)3Ie&.hd Yy ԕv60 6Z?B +985A5GqȄ185qId2#Xia[ Q9^! ɝXDzs͈ +? 7^U*>ݿ UCēB>A{㴔$4cnoHj0a*/S;/Pt`;+U͒ҳxC6]hfѡ`ȘdO +HӜ'C|$1b%ZA<$,Ef/n%$A81?B<&‘3-'ȚNэŦ:D=Ηr:bYGHrkF9M]k.+2FSC%ۂ׍*zQg&Kaz,XS+AZ]ۣ'M:1|#T,'Xҳ|[#DvS<Z,5JlD Dt_d>0\^?HWeH)"'l] ojjW/ޤ6oxLQz¶ I(P҈\9UFgՎ !|M- lA1lޖOS,Vʞ})P:[B i<ץ򮊃ɢb9&VUL9FxGҩץJ2zB4jO,PKJܕːrʧfҰD@J$*8/4E0XxLr,G ) c;i-@{ntTe1x۠ߡykiWyg +urҍD_wk-{yLJ(ZjWQ/8M)oUϝˣ $nAe[I=z'n?:>Im%'}bU3ڞ_*SmUTbOhsopX2F>{#}Pb ާܓ$>:a-^s +6A] Eom?u\9f(B,Us/&M "|* +.nN7]A\b})tHIHeֻܺ ]~} 4`7V qjC\MLߏ0_*5vyjydR6,)ػgDspj#ڹ.ͩ{e<3*ͭk,^싘:_Ӊ warfUp>p1"A@;HC6tLP?Xu٘} u$|zGEGٮhoML'{ol%'RtC?ȎO/=[BU-VkzoU\{I>`䘕 mzW}9$V 2;G,l(BeY[)ab)r&p(ќ̕u2^/ŰJL|',50\6jNF2'1S-r[N$ٹ]h17=yp@;e"{Ѵ 'ԄxPP) OSӧ˺-~֢J-+ٚig*{AOo◢Z=+jn8]H(&#w]J}G"f+{z`-ouGo*O wsvVy +oS1w-) dž,M.k=BG}તSEywT]Ӳ&Blf%Ʀ`\k_B@T^TKHq1 SvXa=KO]]2T`|1{8?\;"z-`Bg1u"u },pxծ䢭S38@-e?On8!"aUEo*vu&]_{ś-^5(DPRW|חfXS A-cgK/aIPԈGfBK"0[ӓW9#.Hذ#ӖA4(tN \S;{uҺE< x٘jiۚ7өt >1oLe#h0M$إ+fA22r"(QBg|~Q :F=K[Hsen׮j2M]Qv %:^^oJ[.T2ejfYYhHژt>~Ҭ^;ۖVM}`|=lLMuMDbvKKBB{ebafv&د'y8Ð̠z >B*GiVjbIioDU/k}S}Fbip4rJsB-p-%5 5 HA,qǽrʂ4}Q2L+tZϬ!0߹#FX 5l vw~ўHӌr*O%˼EL[R,K8*=a煴5zP8F&5!ĭMb818w{lES%B?_@gM'Ƈ'0f$Z,݃#iZ,m?G΀]ɮ~X mww颻4玸$P'yۇ߷t+TgW`h8?Ǫʽh?Gbܟ Ve;m]鯣xo[|ˑKGUhlBJYtnf?.>"ܪ"ޟEgZNemMhz ԽO.{Zq7Q2rndL,q x] 8vsPJ%uobF a>I=}vAM0Ȼ'9OśZɹרń U~6j.oYA;ިG "YiF0`ս A"M_F׻ޡ> +5 {ҙo +ֺ@~'+ٗ 9kvW!^ƹ #IСyXeFa =9Ndzq7I9Oq~fR1c<u-קĴ.^wӖX:T^΢=%_=+yĻ~8}3cLw{FRjAerc SH5|RjitX@<y_(-Bb>ʩ)in^6g@SZJEwHN@ + ~F(Ӄ1gr쌾6-oJ7v#E>Yc~i kѫCXel]h )7R7MzK[X.γ&q]t7)zR= 1[%f37S nO6"TeАLXƍ3."^V.4"i4%:1MWWJ“U֨ҹ4^.SeXkD7ݣߓhw.*RILQuFоm AbJ76.p"EH\p]755J' 9E9Mڰ݅ƚ^z kJ %_z)`itk-[Zε|DG={)Oo)JdvDtL9z47"V׵ 6SQ-o Z-JRW!Nq}(M>O +Ù.AW]i#Ga-ۣl^uT}]q! K`eӚ^fy*wƵ27{΃~K(0pb}6i 5oqu11}>h7M_ފ/CC1ԇ)l4u~j*хjzV%ij ^YW0!UMvC#ypn_F"t+ME5YIH5-c +72a.+rSJy"Up*1Bc߫R&U;Kފs(LJ=]R0=m˃!LMif\k;ëfr+nzg^0yфXWT@-3^'GLԟɥTVxuJ&&|j%siTyK5. ɿwBzCa0RF */PS6K +5kt?M]P:9΃3 ^&-[ejqfu/+^$ +7?HxA\ihmxB$U;ځ +BмT4{8^iT ]Ydd.InZ+?xBļG@69Lf 1Jl2P% A/vl +Y~vWd J2$~&*0$õ{O3VN- 5Î L":5AiXUz %Jg?[hjs wK#txs B?jߺ*4Ϋ*sZ,UEGhdykĄZ)G)I1n ZvR/y RLQTu!X oM-&X EJ Ϛw\3|[髴Z&BR9We߮#rɒF~Nh7V_̣(6M*Dx OvVR<|8zscޗaEYGϨkG2lL4[@3lHGsHn14Ͳ8.fK#]'7\h9IèVBqSMYz|[v"90R! r'71fӢ{=>`Uq,?5Ju$ӀOk<,Eg|U#g^:J_4'˝n2|@i5 },%}X`q4[w&̧׋:_ Bڄ=B2c~ִX5h)~O1^t1pT5)RG0%H0v8tu'?Qi*TL*n: +"iyg+TXnkO|KM_9 6(L0aKme{(6O+Vu3翼o +^OPNَ*>9#lٿFtԳQJRWn@S\STyC?ʽV|xv8s +GaNWdX"|aPtLf'>1TOrcFf:?^_~n'%}^孵򦇩y*/pv[n-a{+5Fi9 Jdt;.3rS8 NBaM"Yq  MO5KG|8,v{t7/$Fɭ̫KkJ=z(Q",:9rjliB)bV<3o%ZV\3Y/֡|b6>fp]>=]m{̫\@oLEﯚ6.opKmJvK_׉ +/Sx|[vjfͣ-8mjg%:hp[)I/BDN` szG$Yax[fh/-<宠u'U)7[ Xᅩw:1R#&HIo X'{RwH7Bν=YP'n,PbKؙN[7Ma-,Ȭ DDʠJR d((kik +VnT(vuX5 CeAUrLX +;s>͔п+h}C6t'=2u?m9‰U-qm'(mU TNe2 nS?^زX~z4 iG37`zQl`Q3n8n"%Ooފ`Q;x2'6itzF"j|e +oL6GV5OL~)cKC#m^u`;E)ea"S{êzEꊳjjN̴g O^1bPv#c탰Ia`~IY~/0 +,u?'975W{r6ԃ3MI!fNS@"Պ +H8ЎV&)]>\ +7(2mOad@w\|^s˗rs] +}Sgs̅ ި_GD,5ķVy}Y=1cOdeF>]m./@-tV>_dKvJ CYEo}z2}?\PNlg⤺RE*zr5+ "7)+]`!lݙ! R\[߂B7 /G7ac躝^ +IzXڰc{7hضy4gK"m.GݩS|DOSfʷ\TE@<8yt%*䤘UR-ʧ)k6NFnR h-x3Ac .qIZp)@d{/4ݫNq"ǒ0=Y/3&ONeujL߿?:u_'PQùz-_U+8]% 8Za d{Q ?ed&ퟖFHJ;sNF +W|}5 r>cDYzCWha^E9j8Ox8!9ՍMЊ/T|)JT\Ib}E@r +A,X#Ӑh݄' RCzDaI_3 gd/TgkƻzbV 9[iP<:S˫B3}zپm.JN-ty~8t|i?u@)Ԓ& t+eROv8@(~vD*AD`:X6cDɥN0(* FO%[vڼa#-+iл#AW.ˊBCc&%ZBhѨooXLq}ޕZ^px"h_~mrx<#&.Я14<Ï Q`iS_;jsYA}nAߪ;~&>pvڟ|ZֻmY igt4E›Pw; e +&V7w5*\/D HG|K5OJ-i*82`JwVgsM6էdQLE q1sLvtamjc:<+bV2g"a#|@S8vhmNL>"O4Dc bS 7 k6eՖ- Ko; tjyLvD=bU:/)eA^@ܡ.1  Gwxӓl:("®(61|Ģ) 6,wDii $uj6٣fAOP;>e9aNFi`! xC3~8fe(aeێt̲caoh 5).XvmPI@طm, +eFUw}[~fܥ%P/oE(sYAr3"e:8$/q5.uݼ#Djq}CI%ӈ%ePհ]h+N,{v ?F[Ry)qL5,-oSuڮ5 ^ |޳A`} +db_u~a^\VD+_p2Pdc= ic_qR~TÛnurM@T&'A%zwӑzU"|۸v*!\M&amz|kM/W#rZVܖi,J>/ޝ6ydZQ=`hz«&.mvjTM=Swqu> ڕ՘9EφxPu #c]Џ9ѥ#t)t!KtGSVRsNGg: zw-c; ECkEl:&CYBG4Uͧt0p[ƼҔIs9L>m+"#o_˿Cݗ6O[gU5r5 f SIbL)q/VY$Xڐб*<>q8GJ $ɐ`YX3<*rL2xre| +zz-ͫȿd  MUUw%DA(kg/L+fj wj~et{*W2!Y:X 9Ml]JjkwL(ع[O|6a}+HuWU# /&*[.Bg>u}B FD]{> qڛd1؝pV?W&7#b`o +!nFe0;6=hAMQgHIIL"(u&8єGeV4#ӱWa\SɑWbڻ +1!ĸ@(W: 6whrL[pl^|`|LC6k6cZ#\Gz Y;]o\^eԦ2A~HįLzt,{C/t}]Ue0HIg.{zP+,h.lf Kv=L.碓Ktǥ j72`(Y #Zz}k}-R![sJMWY}P ;ukv5.F\yNaahc:}1*ڪj. lO!}Ūj^O#`?[hNXu{w$ +һf>ʸ"_‰i?AFl}If)"6ӑqВ"L06|eՍ+^k˿W'I[7w$JgOqLۧ'!Q$pFoa`a}6Cw% Զ/,3jiMGFk>9,]qS }sR]T$g5tEsẐPid׍z0y¾.4K7Tf=5] CC::x'G2}iLa|NѯBvjM^iȎCmTZ ׵"q(A*?UC4 [ls(%fE~pX?FL9"lOK M .^':Q,>M,XS/'rJT%sIH$K*6MsxnG^Oޮc$yԕϢUݺZ_slV< Yݸ֢Lc<~ޯg.czze/ <{R*r֙s|c<4u|GDӊr*OP%Zu֫Q|7&kwI/-R*,R~adдշZ''/Sۼp1((EšwyiR*v }XVCs4>fňӸF0^~WYy7D| |m0iOe*0Q̂d5"%L7,w_ 0o]R:s-c?X 2ިԪ#YB#%2Ա˻eoJE˥?*SBf_&6\]"z@15_Ò4]ńlti+F30/dyٚemǼeR:8zJtV Uz4"uZpZ %2F,8w*#[YaUxfWڷX7E˛ݘ-U#c,tڽ.+f +lU1~ WC>\そK~pfU +S V.l0iϤZ& +:,GC|3r?pҾԹZ{EGU[6lftS{&*J rY  X8E73,zȉOnʙ|X^t!hyIշkHrmN- BAlY8}}ǺvdǍ1tߧCt\*y#Ɍ,%f䎂#j쫬GJeKO/* d9fE;w@ӽ[Jke _~Ֆag\x=ۖP +ZR`1rug&\yKodŗ2X nVe,`t2l֎mG\x +ݼA+ +gyR3xaEN&2&VѼ20ľٶHfхU`ӱj|~Xhy~׏3uKkD%Qke n/V;8"W#,ޭYdI?͢0Mrn3{w@C'od-E" =0vd EQc$BsJ~2[}u4_q%O:)^}]F,@Ed%{ =4-naYnGMQbMlTd[K|uʨP9`ׁCh3;Q-jSzwxd&Zr[<7F It_Y곭üB͍jR[QCrOX) +c&GV΋OYm$?ZNóGu6;QlbJkݿ[uW5G8@./6M^a%oIYo̲>^d-&B^3$փ5zp5ZD=5jok )qD*n, r쉩39nR7*ϘI3+UI\ch|N"s;I`xWe4U{pųODZffR%$-yl3;:N֖-G):xjkPu5bX:V<(9zĥo4n3;I:4¯r; h+1%[Rɧ%kٚ1r_5LA&auچnrҁM{.#2ZI@!Zz vqQJ4|ٛ=0\&" ǜՖ_XKa4"CŞĝ3\y9.]T3e\NfCt;TREl>024Ŗ=]ZZԭSpy2 (U@I L5w]!H? +TJװ#O$%LEHW%V#U>r,c[Zl{Qsӫ/`zp\]p7uswR?W! <1qrz"dzlչMȪlꭕ4[Ho~8gh˳ӊAa/H$apnl%%kiIUQR*kꕤbX¼h}ڨ%a1҃ +1<ZLBtXzq`tQt) ^u-ANYH1%f?lMz9 Cs +_`IyfT]l:)(xXi Ҫy\Ok5$h9Pz[ +sx^ZZwɓ;hwm=jP]om +DU7a7V`n|]vVXҰhJekOfO#WfJGtpm0;n %'|᎑+H"P'0ȞIvp~Qwl7T؊i@Liu׵Vo)|mmTg@A 8@Xvh!]M;C; z"HHzlثn8ΘֹOl`)5Cg;_[cj9h+ aJY.vG( zI v9[=slN6E&? N3i7S [._N_DNG;' +@/.+y۰itQvBGƶy;mc}{bqA7қA|nG0g>`cPB5Z=ԕ|;VgdOݬΒu`b*]mP\$C0&qn_9Eh!qnX3Wr1/]o׼>. .iB;ĶFjgr)y3"? Ɇ=!.:cyߟ?nhlki[ev7Ƣ#uWg,a4:28b"ԀwP]ڧVj `͛3{qx;٪|+қKf"*}䓓bnLKfnS+5a KI>G0R.-:tm&Bk# D{8 +O&0D6(v?Gtq#?ih;D96x(Z|4.2 rݱYc, ̜n$8uƫebPe(R)_`;kp y'7v~x7"oIiPM_lOن CFUW`E6Ʊzbr˝^jhTK1X҂n89yRI"Z N6e#PJO+cX5IkOݠ/9]?{I +g_HN£-/ ]H>"sQpiy|^MS,"phzJlҘ4ICݹFZ8qml6==uz؁@]uq~s"alǤI$/'2e޳nU5.Re6#_³yl"ݚ=j-r#92=/?#B=jA%1>l[}IDG)z۹Z6nwt1AE:A3+uLoռVsdɜcxu2S A3lΤ2ny=g;9VEW=D\Wޛ-:ԫ ?3HH\:-R}%LĚRI8hG(=7,R3Wޟ \uTBH5'%2%$"39(76JaҠj7L;@Qm|-ۘ:FB'5tbbn,m*kS'Qm*( hjh_˧R1G}i W<+OY,xb؊RFδ$Y EuXdۮC5gr|Nxʝ}?dx}8Z8k1Pf&f!aފٰ~S787b +lfSC|WaF˺NTW̫hQ6atMRnG0H2Q/iȏ怪TQUÊG!`6Q 'wgOIW t-'v-n4aGE8ՙV(VGӽCڙIs0g_/ +o]s]{wrN9錖M& +Y^vMP( +VO䗰vYhзm끖) +6u~8~껄~pXM-l7y+Y% >5Wf 6->!G]A16ɨvoAK`{c-n@I- x~CSYљN2p*b9&p9xW0"Tmj#GA[鏍6[?F)gS6;!Jv?ܨ̹ DBE|oxOvaWJ5f1f)U Swm3B`%poʎA Cv{zpJ0jSb~ 3N 'tne.ؼXA&Nڭ݋Ҧ-˩f?5hF 7=8Ӽ^vm喅5a KGᚊVy#W^N<圆-/ +I_A=,#fo5e>@]Ȃucn3>Jk3oGQVAɴX_Fy>y#YY4XszX&'#Sby/?U WEZi6*z92*jN5es g0q&&,,B?na-Sf6G$}WSǒ?(ʞ,V8hqxh;˖azjvbab()v$訳¾GL\NQp9Nlni+ !ʃs5^W4+Wyr[MB[1"uAn?eɱнN,?kX&,Vf 7Ӆb0;iu7j~tI]0^9icrKTNS0˧ +TM˞Jxc\]uKy{vƯqQ K&YcYV78q¦+jOA_mhŃsZԝE0SB|h||WoL:iMnZp? /0>6< G9ƍ MwWwOX(,C86<> ^4ۂ!-"/cy\/NN@^=5$v:|2)!+4ʬ+"%{~ 5%˾B涂B7;R+3*@Wp2{fJq9C_&'`ӗX7D +="Ƞh2ɲKNR⢛P[]Yq/+`>p @")s{#vPQeiU8e\$:^na+W]lYU8v$aZ{M~rM聞~q! AW촯4{/ ' +;ϝS뻶ŹI^& NjZRokV Ҋb^"sdZK>W{{P"wz?pN@ M )|a4&T8e(gcժ>FScq][(?ג{O?+%^9gy4gxB"lg@e3jva)VSru%^>eCSȱY ҋo͕+]8IGѺ#TUazf,YwńX{q邑m\&לBa%=Z mbǝ)g>T>:Uw[Xhۖو!e0~^=V +? + :r.še]=y'{E&fJy:ċJv wM !.:*:|nֶ;L}q˲^|iȔ$VU̴𷾓luwΏ^#sND\_̚E#>(c Wc~l|a׳jn]eܴA_"rkm3U\F@Zzۯ))1 blC 瓱Լ%'s8y61nj|)Vܼ19w$1Mza^ ڢVO7ujNSck&@D7{qgÒ5Ў42"NiF%eZʯ:{_37<3Ƥ F?=SXw}IQǝlW6-)mQc0B1 +Ug!v#=͊t;Q ܳKtHQlL`*F*ZHMPm~HAd^\M9zNBClxF=H7EÞ-Q/L_edzm]}+ѽ;hv^eˬ)@;a}pF6(Ҳ#O.xAw+(1GY/8+ \aQQlPH5G=RCׄs?Lc0,+ Xs!J4NR. v ƒ)OaucSt+6iÓSq;SD OfwbԨrBdKaL-nJ !'LiȞd,X)͠9eOx^Uk8zsM!'qc]XXwQ4@*;ê-ݻ?6 l62b tΆaUԏu a5Axc* N;ESw;T7[7Gw",ΚP5U +rsjo/R}|9Le(>I +.cA iИz_ 1"5maĕwc1ض*AQZ]L\vvbt#L{'f 4T[Jz&Y}M5KAɊEk<%$;@uչ|!REFb5TvE1ަZl2U7}S&X}Ц=&cwpLxfbv"Աej?9z3Q)Wpgu`qzw9Ҩ_bG.e^uKL?e/5oB,jiF֮bH )ƀx(i# 9RD bCl{]p:&-K Xq"mcs\mo':̴t7% ǒ#2k4>6bmw 1?vW@zgwEr忻+4D=%Z{R9;;-VJ^ + $Oe9*wH+IQ&0RAfY]yI_!i-bm]W" [w8dpDQN> +0`ŰsO9quܻjVʕ2 SKSÑ^TyB1tvZ+Fj`HP"&}D2⻣o1_&7Wq?HKD"ddhCVe1m޻g8>84;+CvѠd)c =ڛtWF#gtCy$I@t? L[|h"c2infe97{|*D\H=~?(Ǹ焝[ EPi8ٰL +sBOqk)QmV۹`H[)UK6W!UwH/\yT_^#4Ac5~cb6F"~uǕ]p힞40Dq  +v:Ͱ&NO}rLӣφ#U,UQgFlX"$[~ knbחnb}%RV\bN| HP$1Sx&Pmly_qo >\?k&7ueVzJXtx3W'izo8 3~(z=~#>%w?tLY%9uyp*W9eV./8sB ;ݮ9u{2_2eCi!Aج]݋FhG<*fW.o紆7bQ : 2K lp]߻p<Ԫ =DC˹65d_Ok!0 >iӼmkvlOfҘK؁fx  ia_͐3ݝ)ɤRո~r`K +7E3mI 9b ©w +I ec  =a׭CfRG]xZr 8EǪd>^!τStdLyʇU&=}|S3QwG+ $QԋjEeZ=EXX'pl)j:5:J5Ht2^h3H*'Z8 YyKA*)j/$c %C,e7*0v=Vj|l&&E͚C섄4up>12aWK_XwayjH;p}};B!]A*a\ͪ\g$[6>g`c1GJ ZΆj?S6{N̘Cٶs{鞟#1ʱ#,>Eŗ =R'Kwu(JV2}9KOuRu8oj^9 q>4 cbvTw|f!Es@:Uǁ+%{Vriwxp,7Mek֢ 9\Tj+tja4gNmy4z-TAHoH /Biؘ V*HX +iܻgcyKjݰ4ڞ%uejU2s/'};:荼!'CpRO78G5adYP ϧd-IrٓSIk)ZA~u6u:ՒD6{umugG+5! -?X5>Eap3^f@pQpa0jd +kLUN/;jTQ>٦󄌛R3$#[Ⱥ T 8}&m +gBjL`jlm:}hRL—ӵiwm\NCݶ7E ?קxz)z~js(D5]CyLZJP ^ Iў¯r_\G_ʜrFy9[L5fC".u,*8Z!j`XzRUggVNCkE]q lo x@0ri.wTbRH]]&EiO۵w/x/Puc{L7Ե^suf<Nl[ ˁ1 />(.PE| +q2ҩU6FxUК&ʷ'eSӂ@ޯ C"Ogj"L~[B17 S܋VݚlXPى=޺"y bȮ mgۖ}d"V#j*S1ιI}6,Zv/~]TVΑ[nge]J&:5?;%~n'F[ʁ)G*‹wwҘɀ\6/a~þ40v BEVBYq0ni&7xtp"ݣl]pE,vZ<E!UO)HmA'Kל4aůn.'-?DøY7ؕW7˼!'{m?R8vDt5fgaT ҭrD70Ք8%C6S2mBm}//;‰8Bg3F'茪W$+d I! Qء&g"G,8&+&:!"X@e%W8.^c{))i}a׌J!'UԒ^^>2Sپgl֒ǒ {yYC8H"Nd)~|pU½*yinc0m^"ٝ\qLL64\Z9,G*{Imͥ=y\hE_Yq$e*Mq,Wa: 9vb,U[>NR: 9Z,)_Sjs)փ5^^6ui-SjǼܴЈ]ĠB}_#ч,HBfr&ʓ%CYF-G%lji]2⫚vE~" if^>˻UƦ_Gyb8GGkʖO.9FH"i_?`s8kg:wv\Tǧ4f/kqaLw6sMfwq=-j96 gGMi*}`.F@z:tZs);XiۨB*0޸cȤ3k r "wR [i{z)wu3˫`mS=Dq$=7HoL9}ԗEIH¤]r.鮤So*.rQU1K`aT Z/+g3eE[&'Y[Nͺ̡r.>v3ttdO;4:pSoWhhLVҜ5ַ;<պ&8Dg1dmy +~H'YPs@2t2\iهʊ Ơ|.O52F+LD`yGt g^3E $PrVebOx]s_XMl3oY I!0qѐ{@ x振P EPBdm`qVdʥ蔼6M9%ThȲ^ ad]G<z7#mjoKN/#t2jPo0/XyA~a1LlۼoBI%/T^ym4}欭eۤcWtʵ6e$ɺ?vu׃[_6;=Ege1~FOd#3?O5L3ch];>vε:H7iQʙ%Wݖ;5 jQwKET[ZL2VFwunۃ*Yoެ*U?{եJMy66 +veW5qj%RUdZ+~d@GR^ zt0#-c2 Xg\;I͆8#oi[YզGLL@-cJXQi3[&/޳UTk.4:ni WJywOWJhNLTiD7W*VaʒdN@D-!< [:BIAE b-.oc+QvEs6SRk1dM%ԖyE-zu!P`LJ㉥To]`=HO,m'0V9lJ*vP,3QILԽѴA7D@!tBLF (~᱇F}F1dH/`% oi|Au%Ku;yY@UmlCnȩn5ѓFOvd$Wvjm>2OTZEY{󭟕C4~wY؈mzye^#XnAt5>YmeMP_gͱLUjoyI,Mwd60hSK 6igMZ&%MC- g6+sǏ*zI6^⏙S^tOBO{W&.fi4VD9zxxF~x@QqXw$َŤ'To$p蜖 ,K$'1Ͳu- ' DŌ"} /I2>=7e}Pd6IFu<9pe0aM^.:VѤeqT0zWEEj_F8({9d?10{C{`J&@f1Ջy‡1=]cry*8dBZHke6KĶԪm5Ef9E"ɹ`Zym'KꈻNۧ/ayXY~λ+Jӈ,=ڂ|MjVe-;fcbЯ f\y2=?g?\g-Lކ5vbB꽓m&=Vm":9XrldL2d3 +w!I ,kBM/Wsb하Sz%%(%vm<VѪ&Iz]ev%c|-s}B%j>1;e0g;a7T1KԦތc63LXze7 +/Fѯӓ6KK{n1)J$;u?1 ){|]ZSMlHοVoN(S- <%f]S=>eg^wK;U%1Ct1Ǣk>j=κ5W +ὨDEfB~7>@",D"G3v{y[٭-)&\4-4}iu 7V/O_۞0 5,(l gJ?R"/OuF$jֈyygoנ1?ׯAӠ԰z^o wfw}zE+y:f؎r <zN10NOsgDi7?v9#z$ڑ9mHߪ:Jkj U,L;SHgh*݃?_oy-^Ҡ~}3& +hpW_j\.Џ1+>/SU0Av 61#r~>w<#A$Hvчᰳskm'tu7emT"2?cB%UMFV]Cy@6B? 7+ѩ@qtAj\F78ߖnE[Q7fyp +4H-\^4"&cpSz$9HЏiDr/Æ`ƺ-iXlz4ɵB"dxt`ӗ+4Yrl I o]PJ'+}hk{bH@J_䫙>˾Yϣ +fQ[w &t ݩLؓSz @hsA':1;tDk`@^%7OZ7θFR?~ZXXߧfZБvGӲg +nT<J[W^+a| ۆ$Ԝoۿ@S^&Y8/P8z_w|Ғ_FNiӢnўƹsEKvXMn9fgAIBO.lVḴRt"3EL--$QysoC4y2Uʆ4!t'o̬]K\y]gF=ȭuD(u{yCMV+b@]1 ++< \x2a/=rLi>Ynv2I2dt"$qMrGM6͊ +W7Y=f ݺof[YĆOKD=g ;2Άr9e]lziԝ/4u㕐dAelzhM<*=1?NqLG)+ m]pbjv|W+ɧ \[ sXǃ)J?=^,j6mcG& {#.i nFpTa!5mY}& }g~f T~hA7΂K5+DQG%8%;`f=]y/emxd;+(5n:6Nn#:;$c-3<~;<@wueqNSgfᶝtOA-{xOAKU6>,I#nSvr!OėHSM+K #^.+X j>ΒeF.8Pb_0c +nѢg;u&UY|SRC^y{jsra/ˏ ?) +}^3,yܙ9h!^96INKʌPwqBL +]|ںNSKԻ'uAV/#VKe=f3^FvkȜLC*A76qaST9 *˄߶s}2!g4@e|`fk]J6&wJS j^MFcGj8aݑTش+4p Og:4}TMȈ ̒r+9iWgwl[_C!JE6ZjX禚ЗZsK8$HU8t'{l VFtgtk]() 02;Pqt8jLk[9nZ_Jy l6Em@TiU=?澠3ӄڰg^}1Wh1gfV"K>Ty}j:w i7%C?^9m:|DN&X 4gb Pf]5Sc[ҔaAMx.`!|̕뗓@ y$|:6UXjmڬ5pwQ[ak݋m5g~*A=iҷ%c_XݦbxgCad߫B:&O?kW[Y0wKF2ڴ'U/`$"9/8o1bI[[ث Y!Z#1?k0Jz#lzJ\ݩ&23s'FZ?Dxq 5aR1<2ćÔ7Z2B4o%>ŊfB(ePh{ees` f8i"VN4j%!G^D`/m!Ņ_Dw,K67|Fq<8˹2eZ_{ Zg#%ńZEmdȀ%]j3-"{pyć{iS6@;ܴ)љȼ4wqzede\h*2٧1V I {\JY*G⥺vt.Q8j[[3SߔSw 7l|u?=be>:;Ҕ@ WGv1BMlkHt?0HQE]xʘ=.&q޸ +: +Up +ͦ.'S\=Iހs"yFJ}Vl1 /^ӃV{ ]-ZIs]ڢud1gN\/BThpthtW͔ ;a!FA[F!E)6mw)caTϩU)u1aEK7;I;}m)L#U >jL#UGf!eEVur!_fcTNM!2St ؎afK>tvlvy;R!I۷c;Lۅp&62pOv\E8VͫgBj@ٹ5cSCi5YqyHX04(N!\Tҭ2s~NuZ1.{ZpbsgK&za iJb(kiij*1m*\z4'yV4 ej1y; ?E 3S=0up7ѱx vԽmk*zP Flg){(Mk\M=u7l ݞ/_txz0@^ilIZuDžڷ?% >.Pf ;l{=fsjRԆR$p<,SGx}^)ɅNކ~a5F9<v:Iu$Apƒ[̲MV0]k'Kl?rbۚ_߷%Վs۾Zi3G+) +/RQ-b4 +@ uv GR[7cR"“PنzG.Aqrvj4z%Qe)hogU +iM@]zF~? FF[] 帄&;!OP[ɺQ|l*Xs.~eFww&ySuNv_ycJoDGSۺL"N=Ԍ+hcKz҅\Ϛnv ٯ]`Yis4Z[ 6ҁ+6&L[0tZO o_򚘚,uZz ,. + lT^):o1jڳz8j]32(U`ҏҷ `8F$qk-}ԁ1MHQRg~0L7Q|kwvf^ر&FhS U^vܐzXwpt~$~|//HTSFH'6sc68>o\y]u(EN|ٍ)RrbF!?2\hoqT\6.:#Zf=Ty_-pM= a@vfjIJJW!vl8M/z֋'TB ^|xWHv;[/ KQ@^[a}bOwlF uAufUTeH Bc^ =YKw-2]`j~ %VvGiƽ9U{HE׎}IO^OAػrS$ +-p\2nz3rHB5NZР$!!`nnx[h]>oyzB0&[HN|xrʹKD{8/rf/Ph}F94'0)қJC깕L`|]s~Es+ !EZ~췰u8A +\Ƅ +s*d/<ύ^uc%P6H옟7qQT,>VM iK@UD [$u/54e}{>ŢL4ZL']Te | Kh +֍M[hdW{$6Cܘ* ٞt=ϲs{6]cmEЁDY}Pf7h~TȫmEͤuo0iIok'y6ʸ˲Zze<-jG޻Ų}"(K}l_iЛMgcoy>^_igCo,\0dG|&@ή[POdV7ud5P@>QvBDT׸5}GP(7ug{C)YU\p-֞8=/jH{ 𧶺{Qo`͡M1Aqdk=DN<:ذ֢\7AVi,OGu/Ij 7h$Ey 6$368%y W3MVӼk6xSU|mPIi S[槿x8j/:k[%w*A(Ƞs{򝅢QvzLBI9mߺ6͊4x~H4BoOp8cJYk<޸U1Grc8۰WBub<w’ )Fy {7sD)btH\8e'Jn8Z=Xv`?`ifM gf{C녱 2L_+xζPmm%ؒz#+9O ӭm9xtڐUW. 9Ge|UwnۇD14n?J,%aydz0Wkh55:GcKym:„P-ۋeKL_91TдU]*guU.X%ٕrS4t]Qx^so?7lR  ⼙&m+پZ n^|hs:*tG}3!i^YH,@d~RiNd1|~c{Hǩ_{3HjX4l_ƾL&BZLpKs<AXWQx‘!\u ꥆNpx䠎R[iY/V'ٗk~e~cpO:a2ԡMs'v[?}۝xS`|IO}ytVw 럁1/6~:j7;cBJn)Q +žz>/nM\1 q]99>F\,}pj{w:kЃPEvT5nar.4 UsFE y͡IN~w;Tz2IcGB(LM/tuI[i4r"<|hUk%),E#Ñ͆A˻pc9uJOXv|8֨eoܲCIipXm)TY=^$d2C_Bs9~}qhv;浑 &}Q!z[v9+F`;#u">9IpNc5p43{{Sk {RK@=_bUzPag/W dx䬁^ZVYtQŕՍ4+L/ O(16IBztc#E[`u+w@z'ރ_{_3AjK֠36@ SC;ԟǣ'8 aVfz%-4ry'AWlQgaЇOi-,MCMS3E>Q.7ЫIۿXn +|1Mbghts˂^á, Gb}/Ye8rզpR:~V{O}G/Bf 0:^ʦS xxK1|Q꽜Y!{Kdx}GN[]PiI{v+9;\5 +tx}l$H'zB9h^<:{BW=< ElZ/fTidz`B҄Ѕw TK.UT}֧]܊Tω640V|`\B4++ +~8UUO܅Fuso0^t*1VbBTV8 =3&|!ux%0"ܗ:(QHSnA"ÄCڣ}1Z1C8] mUctO@WicڎU&(x ֜NE[D +M8S~Ig y& +wV새v"MR쨪xv]5 zM9T]~Q' Ԃ L Ǫ?1uea{m!3CsI4 y>89-.obh|+q5t ĥz{_7Uqu-WE4ysV|Rne,dMƖ!T%DO%-u9ҭАl)XQ0F]|\w%]v/:ՄP(mkʬd=UImrq~_>g@4煻\ ĥZ̸EmtC*JӣtrSorʯJ4Hl07KlF7ڧ;R4t{VX{Pt7<$/E.R]"XSM9]g|?! ՜Fe PS,J&Rs~]z4Y 3b!rtQ\_TӓA³Kڛf6}# ̦IC˯o61/~C9^V:)λRb=Im8X}׆e%3i ~!akLCJP icoH+u_!ÎozxoU%6F2̷elFgHlOqvUc?yNl @ob]!R= Jݚ2O;iimWmXƁyBGE;0I?)AbAf쟙99# Ǡi-vuX7&U[W\oBHTE{|p+Ď].IvFkAG`=:EV; iԛK$;iOW]q8wq|k)?1Owa Yq]d)q(cֹ ihٵs$ŻI:h/tYכ5Rt⮕Ϫ9-yuFLU9snt!$:x'&/0{>sF"RkNPjJix2ͲP{ْNˇo^3SC0pH2#~aNuHڣS_Pyå`׫1\ 6Ud#8ZԱI~ȉ!U_C@ÙDJ{M< xP/`ՙ}h[yLՌf޼7z1Ǐ] bm]cˣh7ű ieH- -_ -r_ Ez`RFWx4Ek:9lglx6崊cJZW $SGe|4sRtbs]&30A@4]n$|N: +TD]2a8aK&$H~5oLwlu[{5Ss||xGЁ`4,F+N:gFڗHG^\M<8DBfPc(gl &r8z`zݠzq[O[19WI.^-kN/~;*f'PWU:hfOd`t vqG\D:l=VwX!`٨SC2͊HxLŖIBQ0#Qriw;Jm)N9.V}LZ+KigmzFP?w5 }zOrƨأ>RNjQYb4st2R3V |*9lLcSVT>T $;PiVƞ ·]GgAgt덞4 :9푎CYǾB\܆%`3?Uɐ4DJ̽Φ;fŝ~ۙУ`Q8"ӜpSrT.#.~-t^7OVO%F;Th^26yz_Lf\pd`MD%?oQKZ&Ķ_IFlF3Lɵ_fI_G;6ͼ *~'jNWB{̂Mw{j_#y7xq'ݒ}1 2E,{np\ܸ\݂DBĔllHݲaKp7SC7ܿV'd?HBA e|4s +rFj9b䃹i;p50x'=}Iw)!ZMep8ΣT_zBΧ9'SG%bF_';9^rͭ5A!@!w{mZӐðHZy;1_s-x++6vF#͕>Sc-9Qv(Dٿ4fO==,QHFCI&+Q_ STZMʽg$䵽Y.H7EO/{-ڢfplIr[9D:/@ +3Σ7}Ηڤ ˂Te0[%ˆ EQ/kęYj +*/nD ^??1f7P1ɶx̍Z3RG@ΪU[̗ĸP-l:\a7HiÀd م cNaba)9X+ +brӡv}^mަ;~.+vѝ"K&&YZL#NaX72>N +Ox|\yfX3PIm>RZ=O468\ell +5Cr"]+]ws;.۴VM̲ b;jְU^fM Ń.o .9O$x@FnD⯞2g%9IBWGOgbh 6U$2V.o^ X1rya(ضcZ;Wma{ L`F m]cF$i4S:L yrmk*Q\=\/U_ >4ˮ +zج\J+"F^'8\K bT0[ws +4BN_L\|WJӧjIloh:wG(+Dv0 -7^ݰYR]'uqX5<5΁Ă7娷L)݇X1Ĕ8[сvsIJNn<.Ł8Fj:186G2{<:d\%h\jERpiGOU`D`(k-Dܚ!`:+,7 Jp(Y B9kjXh0 u[2XD@$/Y^Dk1K_jHyM}Ph\*ځT嵁;>e3*CGh. eHϑOU_{ɒ# aŰSGrIvQg7)îrlDش9h%=pC()ϓl:\D7-y'mz}FQbSz1xjn-9Uԛ΂ʔ NE@J30wZWTU-Q[$-{+$2( L= ZݖuK0Z}CtG:`fy7 *l$5}:푃r09g}eILe g۴2g 0Fp멻IKXnVțiW "/1I7#IՈhC Eٮ +Tt4H6@88fiƜeSO W[ǞwF{k*bp@}jKrvij5Wrܧv'ȂGS{vWAC_b4xU,ţ&~XH״0׬C*U' { ,~;03ٓ8&GVKQNA5-SxՕEtMm? +Ɇ&q$k<^0B{vFG&b֎f툜Dm^LzMUK\ҟ_sTfUv?"V] + +Nr"c%, ӗ]ԵtGɲ7lM@DBCnlD(ä^Ù }BӺpQz: 07LVKxF /vG%ߜܘ$Y3GxχPP=;OΒPLi!SäN&_ 6]=ܻ ld,,dS]Q$2|7C]i߮krKxР#Ju09j&/Ѱq\p:22HAR=t~9![1G%{z{=>mf|~;] +Gy٤Ǒ0t?:DQwˎdY'$dֳ{ԗM&C´j g]1'huY!0Y(4dң> ?}*֬tAEU~Xb-Ge@ Dž~yv$`P[d;X w?z.zp YrrV%酀KSŝcWwiԊ%=ק׳5/&?0~2 C]%hy˅K _ +=@iJ+]3 :ur* &-9"5 nԟr[v|[N)t47=mR常q-(IyGjz8^aԪ9D6gu'D13'S lU!E=u'̆ M5nTS-5J3]sCmpzgG9lw "Kٷnpʹ"M }.40LyLGʹ~˗џ +,0op'B>%7-unNپDZv IV}_,1fd"0z1j v˅5-VWFwn7dAG}-W줨W$ 5vuW[ahUa盘v}WU[V ]0AbFшaY 0[7u o0cj#4y_$MpKl2QzFuOup\0#F9S㩍YDSlI֐1#XZ>0G8apa`tL v׳ `@$nmZJ,TԋOFcaHvf/^ 1#po?xQKd/쎦{2>N/ƭIXD㏟s& ueHP!@0cU-sܮfFTS?"kE~oe`n0C 84Z C*ԅ*,([$2zqSfEԨe?ͼ^wSQU6ԕolA_04N#Lji=YavZex5?on][. ?YhV{h xܰteYqj !Y/ZK6Ҕu7"=բHy‘+Hɛkɿ;dJy~*PD5)X84=Fokut +n[{MIrHDSaԸ;~{ hȁї[.?m \ys#HD3o$E.i%2N?V. ʼnѯ>Eo+i_{:;}&#*sm>?W,h :Y7gFH)yƛ;.FCBqCtIÅh>R]{ɖtmoeZ$vmz< \oWkFe횎Fg\9H*6ݟ'0|T#}5_C."jK/(rpEި>m*̸*6zSm,-婁r/#I\fTy3idb?1Ҏ6ǜ]H tܟ5 B $s'nƓē \D`=l>PF{RYA7 *FU㯳[_GK qzlj[.N t+ +]GҤjb}%c}W|/V6{Gm؜;‰V]@:іTH y">k/?YO Quѓ.؅ +4jnMAsgfaUZrgHH6q=XR׾ޙϢsTȟ {HOwG~EX#pL2Yheo$&N d vsؐ6J&k:x)}!gH+Y~Q^.I:{v ;'A*uij=DTE +vz(¤55/58U;ٺZ,s 8W=ɗryy,0~%Vu)l+{A: 4_ahme6{ L@BaMUnJR,.7lߕZQgbu8dĦM뀓YL8Sߦ[Ci+:mQ胞OV- %k9`9(j@ U"M,|nc<βR[Jb]2VL;FG;?^~vUolߌa#j67{Ai%ٞ(⢈g)䇅@KBk +&p͖JᭉMt. PaS*H~~֍nԢ歏P nUto+g:.Ą:+I$Teıc.fctZXjD\4N˻l}%~Ny2N PC>GG\W }q3_ ٪fc&@ܢ:2)]aT8=WG"3y΄q밑C9Y?K#m%9WjʾTY=;z(fc\}=lx/=Lƶܣ@K c\ҽXaW231n#)lX[H?Z:}kRe+Q30G7~-1lJ{!j|/ V!L)s?&QA_}5__7lv3 Y̚nQ̤s,J˙]YPi(5Iaf""O Aj<k%J2~\I^ٱ–os#1Ty(eT͞XH"(5Gݶ=$DDgc'L8C՞'#98m,Pmc3A{ + g\wT1^^* DwrkDkT? Q'<8:FZx8Zu,TvYl+[{P :a賴6.>q#8$f4z͜?5~dOO$kwz}u!{ӛjU 8(9/Fs +P:w=ip467}szFvC_cY721]dԚ&0as~݂Rͽ5t? ?1)w_ȫʟ KF]ؙ\[;YvQsθ, ('o9P2U5u̫#}5FiI?4mv72OOkX{bVv5>fpy.{$Bx=w|54L6<)WЭH7]w`z遆wuَog5Fk[aR+fgџh-ة[lL83Yz"U2Nd[b@zT߯PL;edbG vY墮cs. +NۗmuU˦vӁRw2Kڕfb{((Isr1]~78F_hیRUG3`i-/._Ff?۱7w7bfomӑ-1Y;YUo=;,p +_z+Ѳ沑6,=_-$l\N4r݇˗؁H?r  ?9KE *qA[gG<WjܯcI׀O02dL[v>0\ Q2|ur% ^Ә@%!כ +:ހjtst2/ަ,\?WQ/Z.+ 7qfa3 !scm r~b~Thvn PB(e6;{:[Quڃ"8eati' t&tsXx^,~߂5[ߢ%𢷝7տ 0"U푷,% {@n`w1ՙzO|NQ)گ:mK5oq$9miڠj ~ӫ cR, ޫ(S5 ɟxsBFJʌTeA@I]Ήڪk֩WP:ֽȰb>/#Á6(`n~l#^ͧ^ŶaY(򂔭+91(6-Nn#QiZc;VxU__^x$ p3!JECnMH28(Q2rHm &8  &E83i9ޮ 31TEqbdggH~mH:9gϼ!j +cg֊mf$%hd3g9a3 0^essxbv!^N&p= +$ʻ1ԭnJфT0=o/5VG5E:nb痕^mĒ᣹` ~~I$'X+1)}E;e?LF֓՘.f@Euc!&wa\h!qc}fͪ82lU(bM;=UlĄ-_)%~ Zt0c۪XB%[1%_ZAu&k:y+7$f+8Bpvɥ4w+EId,:"[2$b;o۱DRc@nCcƗhXv?"6 ('9(kt<~'xSt%7F^cn 4uYz?R#vD#tk@}8J}6;T [|Ul82}PnUHո=#$YOp/z8=5.'Ҫ),ȏ c/ eSb'*ΨƽAF.<_zԵ(v PD 2sFЩ"F[-&ykי vѢ'RxL3Uɞ̌H_nkeXn'k-yÒLY,'FrG6hU [XZԣSXo~ + 6F#ٝuzZ:D]TTz\r=W ktLP m蹗ϪHX'O֌[,]{bЭ4nje>My)a|oK7.G["A>~uAGB{XMQK|+SӉd"oql'cp]}<6,%0T ZтFr,Z\f6+豱aS9L@xpQ3ܺpɰ +ȎfS .o +o7CZ66; u?kݰnS]w\)}7 /!D[>g<wY_kNo;Krl:=7R@Gs8˱l2({'TN,莘 5j֫*GjdlrSl@fP!NAYwT9C>sѐw<>m!_J>vmB"]!RgCYܗyfG)wP|Ǝ5 <'WӅ"X=󢇚S8ӜO!Muc4^Z2zJHߵ^C>cJ?5MF֜oC+w-8g:z?0ϟSl I +៿~鯟GRlRCB5Ï*<fB +B$I4 'f稦`dL ߊsP7mǡ7 V%/_.v焽DJ_:\P~@g|xTJlRʪ$ ~)B{ 3BsT3(bR}H[3XҴ%?^>C{yIk ?BD9Q+.zA3Rh_@{$YؼU*q`ٍ*~ƈrt"ʳ@KZ0ֺ +&hW@&yW/eSzF&WܱZ*F܂6ɣ9Ca,v"d2.濳v>Q٘ʌZJhzޞNQq!€x䮵t65]h록HO8gX")QXwoCV?)NhGtLLÎQ,PXӣ!Mۻ nF՟mԥW$EMc> !pBI15%DxIpiЯ0ͲKV + A-m{.6zx^~q\[<4 iZE-h_xzxc%k&;UѺ V[NXEQ}-' + \ | Sy $xZW+x bhn= jS 1"(< {n(ցgc] +GiB5Y9_a=mΚcq`)J}2,bV863-Oy=n%I+.hT[wTdBI>QiFX%SXoqdS DX +iQ ޠzPԦ +.PΊ)@{޸in\r4_F @qKv9mAnG3qe,PT1oo'cǛ{n>w29H +5׀Ue(Z2g)咗hLac2h\~ Z"΂EgG^09k?Xg(qPSMpsf#}KvѰxX1NXs9g͵Nw=Cm8<6Q͋st+$KjY[&?}[}̝ڪJ,,'l֪ 0pkA(ZFqxsvZgeͼ&?&6/8«N I ;xeLQ|CP? \å7)T.BA}R+_s,"m.  +}ڌP۰SoJ;V8zt ='ypw*Bڀ_jeYX:Sjv~C5Y#؈$|̗*5I${\eE(לE*O3v ZΡLkX)u.Io4 0s[t!m* o;2g.i3}=bI3`1\gV7>w[ +6[:@Y`!H_ftpexPgQp?U9-"6N0x +"ktp/PAtTi/LsxҺeQ'myo9SWmjQ1ȁ㌲tWFenn 7a!:. d WK~⎍c Z?гqBJ 7#dƼܣ +ƎMT}u"u(.lzB +cU/T݆Ǯw4pO؋*G!+(јi)T>yö+ G [:A2koz(7D3pNw$KVHfsJvnjG/Ц~$-M8Kun+"uREW(~aO[q_ӷOL)LLD?#ۧ&Hg G q20,K J}܃S 3 HJd/셠SfO^|WF7p,9US9isH[4㢝$X.Y:Čcy?ia'᷾Vϛ6v x>yG69 +Y#Iz%'d):ns)gr<#d-#؈YԚ6Ⱦ Z~s1'MSl{x߱/Lꍻտ}XmN +m-nKL㘼5T3sn:ߢZM +ܘ_KBդ';G>OFqbЈb &F-Ho,4cFF1HvleI/JmMn8HiitlӃ&Qs0~/u>6c[?eV} xB>`J̲BLGL>x&bR_E(d iFA9j$dXtͅfW^Q /uZ&]x=:Hc{i1jL߲ej0lL}Ѧto4ʴۣ KbL%uOi +( =9H휏Rd(F4ǹz*`D4w$%a&K3 xտd`<>>q+L!' +kH&J5EK9i!1-J/3&\ۆT0GwtvG ^ne0o=:lPcQSH"R*(DtRoY^f^5^(U_ B:E6 :SL}Z-,e2иG'Y?V6+$ <+u04Фh^h#JMH[g6S4OKܚrv0 +icRw+ \TceN2CߤX(>oJIRwubxWCNOa'fױD@kS**`ܴxb\vلlXN"&r/ne [ޱc[vhs׿*l.i`sr_Jw6xk|Rzp pDM:">hH]T9/:C9pT7wFFby&t2E7(`*-i ь?!a4gɢq?[FF=.@Y]w;i1Ubx3Qp 0ۨpN/Sq-.oJ fɥw?>~=*!n|6 +ͪk: #jcY^FPxNḓE搶[Z[@ǎgP gI3(YZQBOW\leuSQj^Ӟv2Zo=Hwޯ>`WSUm2DTd4_]~Y͓yQ(jJ$i"4vmIXbS:RA-N\]qzC2@tBQ?FTjսu[cG3EDp}PT9IS5ץP"0_6c(Hߑ0p?U޽ %y^.j]%e”:g(O5y}Rrd]IuL@ˏɿ9f .+JC3hau.y/kΙLt Y(E]\‰S\]J+9l]:xn6Vuɯ +s-U {9% }UL֝wsBpe_sE GuixةϲZat Q<-w2 ~e/*i?hKZuq.5l)p?-L[U:k7Fe;%[Q$$3P7{SA띂;z>OﶯrTS} +Ey:h:iZmu+g-0*3Sq~:V~aK ࣿ>;^^^?Xf40u:B-$퇗TPޑ0QLzO /9LUBp8lauFU~fsꎪM5A$yJ>~4d))^i]X QV-3wMcdsXU-4[>/t +k{8kKAEV\;NKkVበVL;㨴,8Tg=耛jG + +^%]I0p\鎙YgKWUi6S(BmDu2N0v`JHtO$G~@FAb[b;9Qu==AAM>WH`{Խ2C^[e,v_/a>u6h&)՛+Ȇ7;?=n ͑ +L;#/znT(>G +Bg7˙@mT:Xijš𶐄9ԣ٠2|"C AfF"i{4 ϣOw rlMx&p# +!^9nYEIbCy?nnۃT&vt^>k :^ +i_:LVpvL/6(a~)ߡAxc7uǰ%hu6Nu0S9GZJ9Ѽ|>Dޢ +`"Jv/ Z=bQV6}Ј*U2.f!` ơZyPRn籯;EBCK5#3~]"2>yJp; &^X5 [Ş}Ζr Ф}&w(a=3ЙDatzMoadWfa$PtAm| +QE ҈~C'л|L*Q]o{ð6XIV4.bG-e:zcB[crlRKmB,h[j*E%*Y!t/LGs5e+M^pVݱc|),CB1Jh:1PNv,nk4-4<>UQm1<4'ZK4uUKؕofD-p\PH1` բ9mתoC7V__BS̪(y~GC +Զaj=a-97#f/ vVj`npph;БbBД%mQrs:$+t`" 9+˗å.0hJ %ELꛌlH 5+]yl$JEX5k3UϗN0VEXm…pT%{[܄sC{W@N;Ko0,lz, tߤY&-Yyvh-]nXq5T0zIXUюIm ayzXS3Oj<FO&V0lix=K}Y@q4ਲD3Y٬_`9.#(7C +>X캐u+>[h;-MVGvOŐ~Z .v0340 +ݧB􄚡dX2_ U--)7t2[erqʦht[j WUrYĞf{ kޒZe7Gh/7{ZΛХk+ژ|fG\MQ]Hpn&^-4A\l,eU jQtX_UER-hPhu/ +A-d e:uJוR"-',] @O( YD +:6A2cmV3`HmFz+H\:UŶ+v@8_v~.PۗpWEQ|LK TGQ^2}1Ώ&)[$v2դ &͡cljJ3${bbI/.y8כwYU٦h|+ 2K\ X#Us׏x^!̶mc ^5b{U-'>_۱-jy%ӂ4BݵRzFyp4֕ζJ鿿8%Q琞U&qKA%ͶKE/- @u< .Nh:,2Dz-[&R*:U :Ɗ kQA +^M*gbjiayN&H\H`͆6 Oӕ(;خy[OkQ˚ JD 8L;DŽC2bGǹI5Oڞ qpBjx9B MZ- (]w:L@N -F3|kh씍ޏh@CqxӚQդB@V;MyU/止YI{0N 1޻Q3תL0%Quq[($i. +Zl׷&dp񀚳7]jO B(`Gwi_iέ`kfB2"GHu殪 T}kvDje~.7!?ur}\W;uylfU~,%Ut5\ >p̣c$"P;Yݾg:KI{p>5ЯCh+t9+@'pGa %?=&$3gd^ qM32_;sj^oM_g{4`K1s!v,LEt{=l##7XηyP5)8qV+kpUEMcH+,3UW5s17 J懇HGhnIȬG4 +a~3E2w4Xu 5#v VH=e7Kv:7Qs j?=,W!>kU둼 +_5/爚k@[BA;i]H%ʳy|Ƌ 6ddQΫ8lom\뚸a;$Q0oQ"w誅9Fo=ȈK+OԲa:yh@؅ 8ee U Z9*d5KE BSYMe"Xe6϶pYT'2٩r6o^}o)Mdذ$۸ZiCVMI{k41k}j*zY1UQ6p1+ӤbJP3ao2˴Kv;DZ6 ~@\;n \zoR]YL0u{E-oD澡}X>>8fd~}}oجJ bm>!ZRT%W6Lg1 SsZHg!O7!Dl+ǷJOߵ:(~//i~_L1Ez^8nZH{{4J|h\N.tys@Vt,R r\\dF7YrحJl">u&͌H?UR̴`-/o\,2R=իL0-}SQ+Ծ^"Hᴇ?P0eI}'n%^5ŤB;։c)mwsX*V?T [p0ԓ ? Tb'|PqIgfrzż!el;BÖa,sɺO,@ªe &qg=oq 7饥3,67f6^&,QYmZs/q˯ܞEuo9omEBݖU (3An1! Yo=pl%Z_ݬV/V`:)dѩݘ A2!Oi嵠õۥk +'\`6IM(8Њ)CmW }PtɺLP1*"oRe^ eAIl?H=߬jت9 +#0_@ZI2ZZIlZ\ +ڱF 㹚'Z,=x,̴ ;ʧ:saɿp)`t_,&Jz;pTɝY&9J#ǵ>$kP`B 18͏<\?<Q(3r5189<%ɩƑw4^qu;!A<y0'@Ȁj] xab8T0 >0Z +'5x4mzTEHqb8Q`'&]v4-͉ldjB"y-7 + xT,__m#lebn۶n>x_kc؏#NiK!PTHY [chČpfU6~!ӡKMUT#5jx/uӛ]T\y81a a-|=I /F>G) + A!ra+ee<+ƲV>whu` AMrjs'dHXŖ4`G3R)lL43U2<-7\u#q8).\lWg$LS9.Ղ68iHR<0gE]yeG]O QN{4$!m׵2L$ܞ/:O[ډCe +H-P"Tfd1LE6lW?RRbUKG u!\:,\G!y $MlXŜ~c=:3숼KSI$%ezkx:H)obQv 5P!Ҏă\?D!2r#s?">\f.ВJe)S/3E +Uh_BkXˡaP5CUV(b;檞*w>, ly&1;X;h>(Hr, w܉ 6yhM,A㛩I?/l?MUկYO掠Nm$;}YeyQy9_VNӷ\U^17F_=]湼jzv "vC_/]sIZ"Z4Qe^rz>Ta31||klγp"<66VO8JMNXQNOYCm”5 ]k%!@:iE`BZn/3߂eE"#ɱb]2ALrI' 2}2nQ(ҳUAGH$0fǔi}5v{zG!fa~M8ۭܜ0CL^{Ԝ꼥0j:trz"^ӊk|l$zg:jMаspЍl-}˨#yyW/ԃfKl7Ν24,YeiIiX9&0= v8 y쏐r1ma6&X;mH*h >RRA!geɃ0Z Hv-tNRS?jm fo.U5,]2jҥp'X8NQMH3 s:D:Dk< ˗iHk3;8'1`p3s]iTƦS$q]? ۥ^AL܅xfx$yj +ܥemmF Y0{20-*ӑ/Jy)䵿.5-"aٚyscPw W8p,g%1!2?r-zE0NʥjI` +Ft;eChasGUeKa{@Yb-˻qSOKi6hgX+oi:*.;_vg+\@,?EY4x{4`1&6&N 2-;z{I}=c7iRn`'s󴚔l`껫Q-'9֦L3\XmO?&f`ݡOSpzj:iGrÙ-ă.qpCې蓞ʲzzB]pR4l,fg3 7trvQ|rHV dhv\C7+2ZrN{}ym2Qbz)j^6th;*N_IVmKm<5fW]ŀI;j ]"e}>E8JhP0j۲6psos*S{-::oT8&H>lU HDrZ̆&)!HѬa]˵K-'5˙V'k46#(Cchza*ri]l0-GHMdKqHyty²LЏ&zCք7CH fj"E o zibvne7];_VTדfOZ'XCR :lhI#Zvu09uqSGUݲ4'tx."vq0gkl^6#Ȫpj&K]}CB=+ڽ's j‹ +p 5 {Mtd*LY:?^jB3-c#']^wbSk$:a͉c̵;x=a9_gҶ3x1WI;hEbB0aXcLܥ/ֱ#74t^czMA"R4LA3\gS/6J|9~6 .G,{ivG1F:y)miTՎ{~g}c6뻻+eAqgϕysT"!P%WN-?a|baAg6:ge bۡTta|X \&+$jvLս=o@Lj}]Z$Qk,j UNC/hw& };mvO68?T7@b+![·m,&K1RB3m{R>VNR6 {*6@v<}őjo\/k;g5 "F,UZmSߗ'j$P3G5)'I:@54Vb؆X"8Vң3Khr1⹜OXiP)\jH<HIQh[ضex(JFJ61y#dC" 1rX̋>nkHzXZzx>EU9ey$~H>i2BˤS wiQbS[lW,B[{2~զdbՂ;8P]9 C='΍7cpR< 2-ql#szN$a;9Ϟs9)?>OAPJ7^n5wp'꯵&6 ~0~'X^tu3W&՗)PJGU>gl!R^nq8݊7  |i=y%_vH* Ows\slY)5TazG} LMd,NXQ%[|svk]R;Պg ͮ&;:82`ڎJĴԑ1鵕m @TV?߇-#,nw4fH9| +>JIiibuْ! U@7^sVtqv6I,ӓwJ)NXVtxS5YePUǾx+_ 7Wlsm +J u? B˺-o4Bƞ껈]J|e5$xB E뿣@Rkհ9i*"MӱP+ZXQ<+k+".7'YriƗ :*;v"͓zq8nl+w.y4TRÎJE͊ch5m+YXZFjAQ {zГlu|nappb"ve6.zyXFj~~/WrNٳvlU6lgd$괏&ќTos;2,z|FYxE {~϶9:cOfThnTQWW۵X:*˩S}|OiuEisKB ._ Avcp:IlH3ZxGm$biqj~/[L`-PѺ>1@(N!^Ⱦ =![_46^l'm]qNS8c⬆)Zoӱ#4^qП 9śgK_讒LKj1Oh͵NIGIqF=zA@ԉ\.iS֧TwNz=$|Y֟r[kou5>1m,OT SM޴b ,Nsʼ^ߦ$5$l +HmuG4,.5ȏxRwwKIL!6Ц7c2FvZؿn#+G?iWxǃ r/l>5_kUZѷ-3gj_.y-&>V0GIp!FnUiSm^ݨWpRu`>$æKNp+rHӏ]fktT*`^g:Kru^p-aκM ΋]_BWa>o=+Ȟ{aS]A4`ˉc]^5tۧ|Dt٨E-TtTqbY,>:hH_<{=N'KTHO]#Wi''|*ߤZ.M*W9u8oje:.C >1 +&v9ϋ [XaL}^փ4EbOWJhHg@%I ?|5ҟ?x߄Z<1nܶG̖-9a(Epn<gE]vbk(yO?`si߶[ mEc[)JRVq6upblg>RX} +0Jܬԧ1Gsa2dY'ƑS0jyp2[x;uEO?WMFM"lࠗhVi"֡J:Ǝ">ؚ#9+_ ߐt=Q]#8xQ:IЖ%[M%*mV4 涣Z+ 7.-!QNS>,\N'mQD$/!i?g?UL5T3Gqw" ,hV@p"|U]1]WGg}32aRu $kuղ5^^ y͞w^;U8l*\+v/UOS3<˂:=8m2ZF}j:_jՏ.5n Xm"I/$9#@A2?͙"=U-f^$2+ws[Z(Ai/jp+\Z[!i[ +朝'gwRzAעغ;*&|`.-kv4%čA'ʎB9 ,U~ +/6ZݗFX <Д]vL' L!N6 AU&~JcDtH=rf}y1O -&`( f+Q`"I)ȷd5Kx裏tPCPoJ(AfQH~3th2㜙"Cd܊i\Z8~))STf-¹" .=3LPN4,=Kҫ3%'Sz8. j ?]O6 +4JihKX"Mu4:ꕵ0=#<3;%WAμ-,J\4o꠳mB-I`wc/q"a'v9Mb؊,Mg*.{X5?=$`ꥼ^o<jXo_ ƻOTNܦʝMK  Pr3W]^sdSG׈<;g<->vDiN3s'@&0RJh a_T4"E0+IkY3w:ơ'_ H D.d?,G}tl彸3g듩^0KhpL(SyPZwysco@tਟ?=5I̷S<[N1A7y٩qf/o!GVxQ{Khو c!|ȴ1w[Q!^4L_"ײP{\zn":9hO: [[M&Or8LaFeR^wcsl!6aD>Ȑw@y+!z1N+RB'Ο^t Zʙ. +-A>ܬzVlw0c3!WD_WO$: O.RK3vx./*sÓXig]<ĺ=_ָpl{rqF#rٖ蛟wB$̻ 1wdf\^omΟOS=Jxf;K^0royoA +_W vҶ':Jr؀}zi%7_׿H$Om۵@8ҮZ3EXy95 +3(< ER7ׅ4|= (iΓkg0]].CS#ƮbvB鲸#ņ10b 3(qar9lm2U}ts>AI/.r$ڥ". x+Tɶ$^Sԩ&noE;+nRVt8蔥YG7z'GHE(1n,JLCANnh9 @ךM _F{65ȉG>;w{68ac>znZU#.R{uuS~rG_\ͥt$C9Yn~L6Gñ4&zZKe(s%V$~#e>RC^ԸkͥV{?۽7w+j0}aS/\kX)P l_b#s¼V̿Tr-7Xkl5 W1!U]\Sz<pε]@}ǝ@hƳ<ǎS#vˋˑa<=c|xzs=p+YɭggQM=d49,X%$h\gG F>qhV3ƿ]c J>y]N--Jx83 JTǴ\}>Hor&k||mh\a )t yf'_d$'f#i3Fwuۣ= +j V - Og=,T59.sh%DӋ1Ш1?.m: d?[8Za8_~u`EC(N(Vph eW$)P1`Iievh:lHc>q,,O&.^ҙz +Qd]ag6TDWNVٖM/NZJsHB&__>'M'ꮿMvB{|)}#^H Z"fM#G T5ӧ.xdR!/}q _]e?8DZ4i⒐gЊ^[Ï1jj"O1ށ'f8gLYf^;qٙn~/j~.aPd݋=D֝,0Y۠P= #)o&5g*%{GiuLȭXJzuƭ)Yu-a}nrK[g9ӜUԞt|i%օ<ag +p&cgHbIi]:X!>FoВ0$gQ(-zQ +B}"'TS*Ґֽv]t%VۢaXɨXAķtS FʈԛL`_+MG? 뚒by=??v tF%1T(jLB2x*ts@t|'gVYE{׻a(aL jHb۴m +'TD~/OYiSY}}/"*`e<9֛,Â=jZ +\B!vp%Ѭpe1nms>3u~> x"۴<+#h:D(()47Yb%t[cxTCE8jx!6TD5WN,soH>*Um5n'ɻ^f:WZԹf4rPz_Np#PMِJSozCVv㿱\?ul/\/"ځ@iszܶjSBr!ؓ,Ơ'EO:Жw͔`5IE39V.)fbkfߖg+\%]-- jo_GMm\rnO=fx_|= fVqҿtgg7;zp+oNk3V8azRJFi+d۔ ņcS4$LZZ(9Y^=H}ncS+˛( ~|_rL hx{NWAjH,h-};,?j+-ןݟ{/t^'*e)Lkzf+`(-03QbwsS!=A `B<#iE'KoО$]s ,oR)~ZZkFS0y}&\%3ӈ漞$9RD\6bTy^Fm467ujG@ NuGx9DaL/3! ZKѰ)fdd$pRnͫA4o?wO[nØ֟~)ASJl +UV6@Mmƀ<BCih(`an슉!D)ckv#ՎV<riNo0|eY^K?WWhEO l~"54,z/=aW{<[tڭƿ:47MP?+pJQOi[Z@`-,̽SB0II*8KuЏ:瘴}~B4Z;TͩR @UiA6Wg , k$!m[A{H=2-y=٘SVEnKHq&_Xsk8"Y+mWfJؖVCL}Bt)1C-=Haw2jf)*M^IQ'R @^C \B^z2mz2j<&FXeه=m6n*?*>4.S`p&F*,7h{KҖj2cI 0pI6s/Qޮq!-m+~VMN5r +^2n|4U ZmIL)RIl,ڦVFPbPLm3] L4AL. ;oRH*$V;Sj?GOUP)_=AP%C(:QR)9DB#X$Y +:wnkz1 b 81{ g[ɧBL[߾l[ +¶O~f,ˣ|5nPNphGXKݐFbÁV0/}>J^yVN8jpJҧg`fa{s!9KԠ4`B"#:N&K+B_paȿ47O6D҅Ԃ +F4 +/0-'L_R^&qX *tovTDp';%y')u$/qPؐ(FNRX'<x +$diyV__\َڥx;+j=n٥ 2jDló<+S\{B-27.ǧ&Nf2~6R5##G +Z-ItY-0T_WLuxL H#kՉӱqq0.ੁZxH|K{A] D_} +U^5cu7lU.qh:ȹecu?!Pp=2i_G$yL*o|426q2Rݬ7=ݯ6F-j>r~F.dfطsy]n > +XnaxH¦YT?A ͚9'ItfN[5}¡<0c(>k}~Su io55䂷/޶"k$aĸ8n΄%:( 5me#] vfaQ|Hq)}=Iدz5VL",ymw߭4$JkxJ&fN-y TFXӛQi~dk4jk& RJ.f +kuY}aiӅ2pΚa?vA͜C1?̔&+%U'KO U!]^4* ;_eԺv"aT0@-$@6e lgw{?(~x6 cA5k8&2$թ ٜ/B^NTFOTI'DVx\ +[Fv\c}Ydj3FMAo\ &JW!<;lm[zjEK/@©,/"\P Kk:k&4SX- z1)A!mɛjj_+ +M:Ǩ6ƉT $KE2xWN8b+nվAAU;K*Oʨ8CjBw,3765V%aʞR.`&L!F7/ԡ.`\z} .҄2n'&_cxw-S?%,xwmKQ8ax4Dz}* їU]b`7uc5>yk$#< 1eE$PݯL)\d*_ҁZU@,g9* b#w9K5k[Q/ύ1|֙.JA3\d:^^}$F&@#fEFp6ZS8Bn4CԌlZܯ(`#UsMB] s}dP[18"r%V啊{EMCjJ=9$tg j^VH:sbgOיBHU6az+\jcgԹ'hhZbYq sf X2mr){G)GFTRM +ՔMK.\Önq-μ~$9n:5lʉ7%^D(-FJ~/VەA%HlҁwKr#s-S!$(ܟۨ b÷U==ߴP%aU;zL*?63hQxd?T;~&! ?Ұm|bM!s6H0Z v abWc|.x $cZ+Rc\)K8'3i/z~ZMp4xUϯ%̹Xhd^YyOV!U!2m% +rVnM._1ZHAb+/sG)KUItQJf!H7#"纀Ax +95^qCw|%(qg 8xRl濞)㵶DP槙>[(4W[ǀ/]+qv C6e +QWd&o}C3EH,P%C]8mX,KcpĠ^OQHJ}P=?Յ4Tu7H`g{XG9 Pc$ifkӛ+V ;.(f%'{|~*?ZW.qQۿ" sj;y:Wm5˥u È:TSݢR !^pVJPETĐDsA7X`9]G aD@sTӿlQ[NV&h=3g(#ODؽ c ˷\=Lg؛!*hƿ}Cdڸ*ĺQg3NӨvR x.T#,BdSfqsfhUAmFi*O_Y0+*Qw֛[/L)Jڬ{uDסE?l0\ꀎ}c{NZ*vJD1l`(nqhYS_];kn* $A]>ccUwKinTZDcrulc>9F7<6ƃ}2el4:6w5'jఄ 4BM|D} T+=uXR%\8DebpðM|il.LI9Dz$ wҺ Rd6Q>mU)zUGV<fJ;~bt:6QΪ^gHZSSV*؞{EK0 Ҭ˹!cl9PcsS4E忐EE:Iu ׈/nDϺgX!Bp{s[!Mqh~R!i`=fT2ogm~=!Dx‰)=í:m_\ `1KmrC j]fE~]:I+8$5͎AK[44eA|ThC:Yl]GaeE S7VҜE)v"ў4ԉ?V",,:d78u=fy^!a2}ffąk;F;8*]H7z`tz`˕FXt||&v/LtٔQ{FH/U K͞FU(rk z֫R:aC˒[ǞeWӰ֬8}#hRU@6a^skXAl(Ge"=KQ{-ɭ +wdx= O\;Z m!^Np2][ 0:9L ޳ƕ!cMUPe1M~mJefqvp7(*;.M˵/o5B? VͤɹNgYPu` n>`{kkkgtY{(Pg_;f*TβA1Woԍ'!Nۦ-S(/}\Kk@D>¿ rvz&0'(wH1nJ 듻F~s): ;icÆ5ge6l'tM/^ñIar @Ʃ#}l@$!'0ӖSҘh/45Z+8LamQ43$p}gnmQzT41b?V8j]Tt.Ũ6'0.Ž\AcmLB^ѧ4۷#Aa9l[`5 l͉XgNbLSYqJC8а&";*q4;c am)f—^լܹ_hPB "OS#!`q9NvKC(MatY~9Rӻד%7\40)(bn>%.fçg'Mnk7xS^&ٍ@)tØ>Ǐڤ\Ȣ%@"F3EEџԚM '[I^+ #?l`՗&ija0v]K@6S-a ݼ w[ lXlgrqQ,&tYQ~$`MtB%U8i=Gz49ʑ];5?6"-Cڀ&@QOq.vNGEjmmo7Xy[벩y& u WOltBWg*l5n {$ O/DÞ +d_)ɡqQ_>a?=܄+nrM4tRj÷1WSĔ;8,ps55rô9ua~Z o2(P8$&DʷNQ&8&A,S9)DjN+d#ٚ"lW IQlV3N̕Xk0joM?x2kR 10]1 7I=Gb}Xϰȏ +Cli?gNۄ.O%ឺ焈i:|ٖS܃b=U::0Ɩղ5~nǢ 8 +>uE=#ӂ*:ǂw45+e +>~F]$̔Y5@.N5Ќ~'m7ͱYI7X[^Q@JF,pۧ T$ӹ8呂O2z6 㪤%/)qO8ԝҮ»&L\utȦuĎXNp@(+.AS'Got¼Ӈy3=^LIRv)~lyoHX\RV`)Y˄oVR:3=}%f>MJ. ٤n62Ph) Wt<%׼Rp`$8# 73||Nń .(ܤQuA\ l8h^&N?<Y|N3v+h=L&+^u8$棁}cb*ajfɕXq"I:W A R3rSuWڢ]5ִͼ)ʼn,[̗͞ފ{F}CHHR3U92 ݺ*d e}Wig{Ӻ6AKcqwP3=+MLqdN h‡+  ]$x6w? ;Y&DOXl>v}pOMwN8w9b}oaֺyc?J&wO1iU92|Ɩ:R3?0쩒Z!<]~E*|H{{.4c]-يQsVŁ޻ZS,!ϵ(U#G{p|0+Gw-g]Uv/ciXY'k#z%ErAuzN#JzVhvmSt%.!dڟN76陆6&&zޡK N:(aT6-OM3ѧFQ9Ef nTv&j3 >oؘva%\"'׵-h\>XK앀"jKCxԁܫNL* +H;oVf˾1]cdϗ ]5F` qRD$մ,]B,bӛ +O5 [5n]T%L[".x>F!F+1th ORki/0 E GJ)酪/c~~]5Jau_Thf,rvߌm8rFskWrĄvUgbջ͚6hi )Y>׫Thvc(⊊ '֪5aKoZi@2jΝcFc`w" iݽ]kfG;mE0-,DKz{uMYBtCwʿr @ +P |C +3~Hz-붷U]bPdP XSDY2zu"^lgi2phTΎJDZDb"yCawe#n ڥ|lvEY2_PUhd 1+jUc,4mdlg8CI S(,$ͰQ=cr{A]4? +Axd hrjYFU|{osq:/b//e sp\ lbt3 -%<'1 +ƨ*]f {.ɚx=at w;0nMd0 z?MXdT7S"Ea!/תoGB }P!6bm[27\: X}& +Q, ݄C?v"S +W8Ff!v}F<@X(lX ͨlo[K?$?.2\4-Ap,@:f/{="`EhzÐ!~[Ǭ%cE8mIu^l\Q-.@vlO BhẄR(DSQ8}7jx8\ ;\TּqN̴CܴԘI!살TVRsW\-$wung'C1-5R@ZnsHC40HβjyrL7L{UP5G;tk~Q|:Tt;qZKy;TLNi)~Ή<5M t# W-ڪiq= w/DP.#nRʣ rxR,> +$y{ +y:NnZ[Hjׂ~Z|  I%\YZ]by gq<m|lJf[ۇ)k7%fD-`|`Tx{F#W*%R̉B04=D!i6V?䫬5_bm?&?;1mt x`G:a^\/ïՑ䘮:@P.7m S&׵DQU`$jv3uc6/V Ww0kﶱzۮ9Tkë45G/ZӋdT-=JV[pbZ&uW + .9ЀJ%Ď"ξ0Y+>IM=ug͚|9!٪;E]Z~ >RHK4[?--`f2L/aŜ*Te|-8ĄW-UFePkp?!rjK].S -sZ3롫1nSo7>W?;\,L=s;j4\?YeSbGzЙJxÖ%!#uK&"zY|Lb@,G#~1[jtﵜ h42Y.S)r5bUVD |\zIE\q6CȺz+D~]s<@Qv u Z +Q)Ŗ/-{bn.EvkȠ՗×W?{6]^5Z&=1=Q9,RP#rϵҼm Kh{&ϥ桡6L)aT8uzU +N] y}ͫ :d/YK"J<"ܖa8Hv.aiQ ~eK_ DEvtDrҠ1y B}Z=KE#vc&k%MqL,0=)&.&C*s2FخTcrS޹ku> AAh@v +MmJ,+-}ãq,Ic ,IM2|K=xBݚ~A=q VaF#=\LK[PmR?S ++{9CNT ( ۮiixp2n$GO`= 0bl "XW,BAt=Q)(绷ie*$Z]<f(oDC-2+LJ8ibp},r1:urr; +[N68v)y$\Uɟ6\Fav;B &j__2*=3rJ'Qߧn'/ykAvBy(S\vLpK5-ލ%1'"<}~ֳ֐qWqbQk–?P$Ӛ:O4K]| خ;æ!=$lhRGѽfOt"cu/;#2EE;G; +9lާ(!uȋ\,;4`oΈ66a"SDke =HV{-Ɣl6 gXxhu{WLm}Fr<zixE˜~w9r:+,ڮY|[q+][9Buyݙ!hbBG1_Ac@lE/x}SW_ 4X.XD!ǩϳ|&ncvf;mL<ʨ&maVC)/XG$'#rb.}<ҧ=zS=#1|{iء;D;ff< wlLqVfKI-6iEc{?JnnUT,o36YEQ)9;}g̝'-'ℸ3S'(Ŕ<+GM,xrN c>z3rĀ`^8sH% HPcW6>) +O (lVDЃLiKv"/Æ ޗk7͘=t3M>wm&n;Sn|ݠ[ynMN{_KUfW]Ί& /YH k{|1VM~ZI{ۆ3`A3!G?\Qz LW&\w?/7#;LyQNuH,mBA~n ZXI._j_<@ٹu+VTZ1~tGjLW[[D>a4b%Uژ.\Ke:j!;Ĥ:8_Ⱦ9&hoUw W& ຯE?UT9$L,7mF0xkA%WMWt0==kxe2\]g_U,7%s8BѢN9%g蓛\uq "cYX`rhV*0{` ǰ!0Η2z +~XISkf8B\ƃu,1͈iXW\KF n'wbnu +.6[gvcω㝇f^d“fmAdÒ\"LN eZSe%9QOQ~g1ֶ* bvrB*8Jsu֚~\(X"w7iˇ 9WCKi4lڔ7o4M< #oFݫYjLP.N&FlFepNfN>3;ϓH3*K2$y +l׌ +'^|ݢmµn}a)\KOO|Tpt)P#ZCWI`Oxf AIt.*֫+u;8kYG6vӶ 4{h#8J*L;Ob߫$> c̢~tp~@BJ,?>,K/ oMhpӬٛK+̬~/6a@|J$h־$nl̅鸄 ۷jl¤S-2b'+ ۟YPR%U +1,j zFfb\5^^Hm}3ǒ0.@'%jr`z\tjeu$R4(bGf +>4P +tcBQ&$W2FFEڽgԁLaGnƷ OΒ2N簱v~ V XV'fHvp˦*(K|h +/oXYr?}A7g !O)mUQ~;cq! Ɍ/NTV0Eڞʆ [t.,p4THٝT x[,)2aT+^;y-a:ebmyOTX7&-[\-QG,}0"V=1a:Hw!:h0@VQ=:Ō/_ulxP2>?&,Nܲ8{mJce2}r+D 1AldO4f l,l@49ʷJ=R$l}ݷ2 +4RK@xm?@{6yibܑDj{a㘪N454\h$*j- EVLeBS3g\Ť"l/Gmږ[[f Q"(MS7J<äna7&տUڠ 2%,vTοIoo{ӓ# p:v?'\ZxQ+v PfwjY'.1LE3a7A6). )oTQjm.LaZޣ٫w߷DzDGx >05K %j'@~Ov:*xxg۞1߿zra H)¿7^$"Ha218bK#G_G FB _(1ں*n#@9#Z55W{ѭHÅn]0beT5MDɓ +gB~neW +j츈vICJ +Wy ݫ K-j|طʶ[_X +^Y,[/TL 9Vƹ~~:|#(}ޏ`tv|Mx5ԋxq,ˬv\WL Cۣ2 L ]ⓛJP!ٺJ5O)Tck|lvBbæt6zؑ'sgaUl-Ooל 5k +jQvSr,|Pp ej,%x4)$ Y%̳VPx%h)`pr\UÑ=ȐFFa;)u@BrF9V1\P% /]ʲG=p" /6f]C IFռ؎ufaZ̊ +7 e5xG>I74ugf3k׵e6Q% syuK:ic@/eR(8˳ j]-s]yեqb:ϬZXo7Ҹ8YDP\<.^bxޗ7X԰ey ۍV CPr3eQ=Ĺ` ~+VחmɑFIH/.,B CBHOaȈ/ Ǧl,Lp]z5<6t{nAs o"Lq}d +EYK.s #n>0INTh` '"aK™&jE ZfJf^a _y"p>7K "T>~;xj7ܿ)h۲zQ _ +QyUh^<>=_l7;c&r>9dID7Rzt&T3c24a~ wӭ󄷥D8mrF3O~ir}ekcW;xXÜ-P+y ޫ  +Yڮ03΀ypܠ'n6/4cY=x{AUӅ]qZqG{܌]Z1":P6'Gs{<`En[s)4ћ>YP;Q18~ O9"՝IVXqWqz>=СubSdắm+ &\ }ǖaRg P{,tM1/J~Ws X,bx33lVK*n':}~HbJ@)9.沄.gdcziwH]} 5 ArL.߮ mE2`@)CUXXlJ,X b C6WfIiVw= )\'GZ,omTؘ'o^&̬^5n#cY枢f\E gW57JשVDrqQiGv}v饧 +R4Fb8=G2 ? U+Fm +׾7GM* 9Ц=tްᣲfbj[)M6jO^?;/l<Ҕ^zSaժv}E&B%5Ib: \GW啔UV7_SK7M5xj$ږMT!QDg +Lzѝzγp)b7c1ƃ+ 8x\SҋݜB=ˉhB!q܎kY([,6 ̫]i:meGUTKnet# &&"XeXܐT^zBuɦáN m2򥡃JI%3XYh>v \+|\qʲ,ˆRޝ љ:Te,&Ӧ ratCJxzI & Sh"?"ik&`<M`( 0)̖'<p_0C5WѲ?& MzL~Zeth[=I' L>OES(K![rȫz|ԺDJnTkVU%ì@n]҃%c(3qC졊G?xүD7⹞hP.h)TQUv-rem|P5e>1%,z[CkH4g?A}e[̃ UnW0PίS,_;n͸<{["R?hg)}kبt$90\nZVKexf>z%ATx/T{Wu+h3?yE3qm ,O}hݝQKct:)m^Wt&VzfȑulB\طqP9^7EZc$ݿ薎- uf؂!06TbǣPVk3Z.zL!KRfn2`pܽn"É;B4w+Ayju;%Ӝ[ʨGbdfţ.9j>ږ%/I] Ah)wZ#Y|4RlY=i/bV0nhrK%U5ZxAÓ_@k{\⒐NIj@**EpjBG*?a~wqe;r\ډ+Nk`(wZ$VEOI0?I&ZPQjFn7h+Va:>4bL-5{'ﺂAVB]lc?|^3+1B-qθQh(f|sݱ84͓} Czl!4ՙnlEZ2#"-myD:j60-1f{*P: './pl|1UTpU ysJT{c[ ~++tvp3#g^sSzVXmGȚ];^6pUcRuo5j\c]0FQ\ 76J{OX~y`$c0)KZjz]7z|wY(`KC r~ቴy ^ B@5gVr=^TYi=& ۹HLIm`X2ȝf!C6{FAɧN4DwD}5|s~gǹip}:x6Rk㩶:0 GGR ;2_=T|{*T[e]0/rDZƅHKmn7aH)+ޟ#q(XyWѽ~x<Ԭ-f:")9-+VXQ)xz&EۏS] =qa1OvybhYis66ObҘ #شjIµgq1d-5u^y4 h[V<a,X @D|k>y5L5G*jg;^<hрŰm1aCdRڜy<ݤlD$ݞ "";P < j wNte)>+C?Zb5cqz~-z܊˞5w*]sHnQj ++bCgrTpɠe"H}Ro҈j g@ nKvk|hH=uS( +4,~TB!M|H=^ $ i/ΉD4\jy%xm{65j _ :&ڸ zix,X%㋝K/lTtA3q*mVX8\ݼ~͞?bE* *+ '7BA-X!5M@qZghkf/ǫmЬ^iڒ-V ud֥_#YpqmAɻM.s8 Z*bWr)|Wh5D4C˾vJ'4Bfw*{e9ѦFQ"Fn[4ERjoUug?c\eKG}<%Se+SC*d#)sEg+IRc Ճh`:= Lw+ugm7!evDcU,kf[xhv\һ#'³d# v[.J,kxۗ[uw +njo ˼)〓SX%='nz-.~[٦ӡfSe5drޙQ0v eeh/{=iwq<@t-d"x5edVN/*3oCkzbް=k'[޵_Y=8: |y"Z@܉1hd_IjLgt,ys%+"!(D݅B3Wk`gl=z?(+-^Snë袭za0Rh#]H#u;ؠĞx^20>أntRݖR.Nzq @Ѣ3Wn{ђK=󦽖!tA[bR>ُz GZv9nYX`u; 8.}2:ʛqxA@Qq{jcb;G) Ofb:f"P#u;FG({{i{; ̷^sOr7AOhjL7U}f# OXq,GQz7)ۤi` ~1iGyA6$~ll'a Wض9nv0T T,w2{#}HJ|f;-j*QN cNEe@ci4Ixi]=,Nz}B®-bkl9\̫4`U&'}-37, {Mh".TreojRKJ_6NgwEfTD9y<"Mmbo6I3v<5ўsZWݭ7"[m[Ņ= 4pL4Mϖ&%}lN[|ˈ0Oǜ}X+zcYGhAڣߝX:}֑)/{ާkj>-W⿏=׻[4f3<+X}DcrȻb~U,hDz_BL8xl,=L딕FQY~s +x4[a>oNSI2WOh-s2cn;-d@h-[ěĨ:GǦdU^>3soԤd٭A;&fx@J=6+Pw?e4VMH kBC1!k#ჺX762[`:qGDaIyhjs9ƈN;зRtG1PھSޗ: oA۾چk$z5 Թ"#o_wGڊD8oEoSU$ +0|8]b_-lVBg؎ZfB#N4g/Xvr:Krd>k/9z>\ZK}wB">(EjM|D(=`5x +4ֶ+{ja,#.0)rz!u4'(/Zl% #Z:y]حգ{]lR==./<k^bޔOqJ7d76CMx }[:R!P: [ʭm/]Ku!yqWڹ+ATY::LI (9*(y穙 z"GǛq *DGc018Caz +߬~%fJ> +Qн*gIwXl^# x:,&<Ѩkf Z +w5ļn݅WZveۮ$J_l\}4 9}mk?*Lr,]8p4KiO)K&$ t6ذs9Biʎ`2jw P+z.E̓U,;[>nr`p'uhI +\m깵FИT" /*uK6B`\\怢zy(Ռe ?(wTL…R7+waOe,ͲXT-- ~ ( 9rLMҡs>enjͰK|WjfY%guVt{As/H#b4SM $iV)3m+]$hWm}Oogwyê[$`g?FftW\y;A6 ~X@KoAy* VOH?j96m|Hp|Gƌ#vw#-L&Ŝg*;GnIol `;J[۩i:4m.WLL<]ݣT[o 4Pi]ng=Q?dg:\ZLNWkRۃӶ3IϺO_Ha% lTa¬R4킵arsgsdM_ou#TKG2.+ wU,~| k%4{q $ ^iاLi=U(pTP}l9M%9Rz~Lq]!xg"W:-oG??ɒ@qw6Hxծ +NinZ8=Hn}2Qdug[JTJȆy )HFI-I_ W&Zf0jK6>$=#@$5 3Whj ؜PףDI)J 2-q+jx]0MiJ"NkU,Bp Ʊnv.LW%1n) u}>J"&dV %&ܮz𙭊\V@#VId"`Gޥ*2ʳ^LfRͼU&ձhrV ~f6J6ޙު'Hbز,n,…Ɏ _ocg?Bw Ҿn3[t&^;eXuD68`:A,AfDY@F\}Au}?,\|w +|-79X]~פsp*8Zѓ!l~ebO9ZD8m/s skY/~bdqE8/;SoV^s 4UhÊ9g4N #cgHn鲋̣ZGH9at*NUV(U0$l<17[;[nfn⨼60T@\?2HWwDR*mcQjK +pB0G+'[qMTE3#G{%?.'Yfn_䣁ҒFMAǟ 6q}i}Xt>u]F^( 5ݭU/i].Rdܐ>>(SImOr__Ykf)~OifaQ8$$9SV\]Gqܨ6&2mm}tj +S܅cd:NqSݎF + K|u[);m7T4ug[;Am/|m.w13E!.=i}N\R/Pv6$@Sj6V.uqv?'B~4SZQ ŁKVz-+X/OyvVuj4yQ8"U@TѸ5b cY=IqQ+pXrX f=h;ͼY V<حb2p@ʝZ\E+ MS&TR +Ǘhfm0kie* q?2| kgreJojh#صmwejNKQ|`;˘+%Pܺy%~),gr^ߊLr o3;ò-^ +)w'}%*P? CJ%Dc֠/~K}LrJ_vJԦ!s^ffT1'9d RETI(ddI7 ]gn7Vy9"pn;WSl|S-7Xlaqc̝VDͶxo8 +WjpΏJXУK"VYSoP2>wmbaUCw2FbGZ"Дi[f]٥9|AtvɃ=ĐTVH%+`;0NΦ[*c^JoAyCRvt f{;-h,:.mhD_,J\8d,Lr8vN8nt08;<*cZ?_Uݾ1VjB,J LjL;7P˜.ZzFwӁu#I񹍤,wϝ9Ϗ rtC&rE鰄|UXmzJ`V%tc- rP)LnE{lۊ#K8 l `ҵ|uvaͮO30kԣ1`'hG ;l*Z,et$NM /[NK=Ӝ7t)9Ǣ H*b{^7BmZfF{d/mimwͽ q:~ǹԞUM5UR +P:T󑹂˝I3ZNjt3]|j1R-SX)w&J?݈#fkU: J(ާ,7i-7QX~Kٴd0E],,Hݞ]A/h+1gtf N$e&3fipp4G3-dTBX]Aze[R\R/ 1eOqݬ{b˭d@Mo'wdOO$Ώl}*]AjώO*E]Rq{\Ǟ̅WOYyN/v#?`s<>jrr؆H@z>ݞTS9m G>uR#Œ~ c@q|Uux2=~{E]w&`Nʅ5kGf Q&ѼWcV߇k̼oi]HB6|\Z!gm;^H7$ZE2M$*]GlVtI x*[2tA]l7 3,Skgv9:j cA*?8vԜD|-{'"s߰W G35Agj1ǹezexP\3])xm2l5oqLE?650LCgJ 5jõf]$Li3d́TׅaVz$6G@x9i# ID=?EZ$(l7i}o2?ݹm vB:d7 si3WEˮy8Sc(ﷳ>?'kX2 (>ã*H=4H6&fW7#.|ZR@ +V,$ %SUGHzrv?FѽO Ё?P癍~e&n>Y/"sff>G;m I +elG7uˆyQ59T +5gA*Vw5t:\j[lZ*J]c4`9 k5+ۘt#Vcc U`U߯DU?1- ;*+G{Rb W҈Po`I[j<'ru͚i]%%ҼT ,V` u}iE)}اep:f̩U45OaaVj/H3K\F?t?lWKRctup,'JPsxf2Ls[TfCap b3KqrX&%ɞ=Hl~LmdFmw<3a-g_0gT>> +&dA ګxDE*́|Q}}T"6jB3_aU>{te7cr]C'$Jc2ڠaCq- #3P4^}ȩ~Wn" l/y'%!p~ ,YjIUYK5VX~tx5 +.0T@XWK&l +wF;tVNV2G$w~F$JUk6ƢZ0i4qe|AO*\ICp2R1LbJm5^?ƵW+22RZW`^Q'p7P)izI.&>%>֋F]?ql.fCݞMdxyCq x}Aq]/VuJ?7LhK~Slvr&ApJ74*&Sd)Fp- +n3^`.c ,k>t1b_PƒZ[!(@:R{9(63(3>RgW}>44(KnmRVkŦ&-Ry'vX ؚX6r/^ە h[gԬPaճ}%>p8_o;URb WCodYȣNOEO`mz&Hm ^cZbRpR(GbƓ(;HsE27?N)07lKfr1i BUNσ?sŁ۷@4^܋ bEKRX͛ѪekZ̺Sܰ=ƃlb#ژ1870UCϸmll6]Z=5=ơg7aHKJ3bq$R9liV;g2VX \Os\'A3gyO^1nivs8N[¨*jtxJJIaޞvy 4[{⺶E0VDvԶ6cQ/ffWݭ# ܸɐtۉY?GP댥:W!6GS!`n7ӎlaZj94*ZDoavAhHw(h_]!(AVZ WD#:.G-9՛ 5CA?"NUp !!b5N8hAbSpbPC%7Bk>0ʰՂv5v&۵XLjY~w#4/;1N6:5 ++TJմI{z@10|䜴_G/L3@~TʨX,*q +Sd9*?#n +[%r\(V'+](H09A14bmnuW5Ӈkv8 $] #>У8_Q]R C`r;n+"總+|S90dņY51BDx8nNY؜1Zy0o%{Qhdr"/c*=R$o{ +^nOpѕ6ؙKq}2 kmіi ;^Dž.)Ly8r8m @18Vst zrf52Bժ?R:Q9pE7I!w:q/wmwӳm}s|~6U]\ZΜn2ol6:?*ѱ뭪zጨN96%We-piGo1bs`bqٮdOC)JXoͲ +}H2ѿkx9r ɷnSr"F @40>~Xvt6@aOOe1KF]~ֻI ;Uv8pIo\|!y{ Mx?# !# +hl‰/ +X|} }C f4v{mcB s޿&BFaV@.n:aWTeD͟2ܺ 'agX 5J<8bG"\]~f:Uj:|/.Պ ] s2irIs7~N > >Oo}GR]cOmX"̌(c*R YDR`"6acIgÏX !?0N]-BjIGAo6v!0WoVdaoj Ou?ƶ%Ր)J7\缾M}dᦴR+1()N &fK{Go gr,_01& ^=g5vG}Og}vrLhwv7#~4cفŇ?Kϑ6[ֳJ\Y.F`&QA2鳚yjwW]w)+dg/<&b\+4F;QrQ%W b#N^@CHd5,ΠFddY;R1ן +[* ޻}` [* hT||G՛IqaqQ'{#B=nQ'I.grIU_(Foj&iaމatp "|Ei"IN @s:|n[vHPO{*xwbzh̨̹3r\RK#.Ktjle bDsv:u~fF.p]PCŜ5NaA鋴8=c0Qa>;rwy$w""~B0j'`fM%5R(1O/ +qKvBQF<{HEoUvQb2 Zn0eU;(<UN[z*U[mǶhL&vT.M뚊zcX$yGc-:<}'m1_&Vp-R󴼴"ǚ)`3@04ONC$V Vl4fA Ooqr(K0}h4 jEz=rIvOOJj"Cؘ|28PHCSsP8NP ׾cٶ; 3n OQ7gu_PEYgt`$6VYsӂfw #jjK8$i(!O^01S(x OײH$W|~amhΣKpݥAZ+Hcv1uKDuH5M@.־ |6M[jzsjB0tF@4pqI?*TR$`W +δL 4UlP-E]?x[ + QVe CUHw p~JJxv(1ߢ t-wqF+Cbo$i*.ޖhrO\M/8X+U_^ 㯻EH$ӬB=SU6IRS 6 AS.ahmֵoklAʙҀ 7kWi#|;?m=XU:Ua~3wzSFU_8s1;N>fdX^ZE+8Jo?&H2[(fSDݶ!Rj3w 2y+ +5g;Uo#G"9e8J~p5p~*6ە]yKvmAN;z9IpYG{gmԋ^Ǎ BʆxJ -Uw'wut{'&i\%0֞F&7>VGm#yD2x8J6bڱqMeόb5=\.+A<ͦͦe^K#5"oH3J3ISVM,M!@ަIY1 6V1M +Xw8僙_@͈:ӧgO˩cjٌ5,KxļZr:/nF./, +6 xiN Xvq-7`7̿\cv@(ki5cFݬFHS~Dr={ɽxlɝ1_25Bdef~,̲oD]$T; gb$׶/t6Hd3&^oyx3pD1݉h_?kVy w)*&Uz9cÅiAXjکm j;hlS@79Sx':o y$0i&cG]&ݪ&(mygޯ?:apݲPz(|`#Y6ä\s̀mOI.n2Ɏ$7OQ~pG[]o/b&K i$"|/Pu]i)x3l>ky?u|?j'Rk}E3(Z.B94P!4ML L%TNE 5 7cA{*2>J3 CXX"C¬ wLQ6 =4VBX7. $LĞ4XTė Uʰ-JEj\ e!u*`uz~OS1mtB#ħc@4RS6@8Bu1j$=RaQĞ8pNKNB*y%ܝ"mu̖%qO$U]WS[ҕ[~X|?8uQTU +(nYV"x4&ImJpV!UB!˜Srӆ Xِ U ykjQ +'<zkf.ĵM r1PR4^w̋V֑݇|f y:RJun+y6X"+U+*jp͸&MCM ձ(6 -';LK_(:ԴTuNkڳ`9aXL87֝vph3nr6hUR4q4͐ԠxzM +;CY4SbVOճȴ\~Ų Sz 4FsąIDDKW.sQ="y.FQ)}fp7zn%Xƫ /Sh@[5On?H[ϟ N +_Lq:hd׵ݒ:5ӈM\[ ~Z*?ė|ygg)mcVҵ/(@IQ,˦:pPܞAHX$J{bbξzQ~JQn/"?"Uh_]Ǩ;6d`nuI9 =)Ve3|y:I/h8R$!H^@kb:OX&eӰ}{K}XbO?jiEӎ 9P:{!~- 6F8զQj2x lCtG@j>i\]}:Tv!FOA^צy k̚E C +2F9 ]/y͓@Q wQ9w9Ͷ %iLAK!<2TfXm0haLaZ u[|u:`C9k-͊r_4QicuБ]ސ(hY|@k PHxÑBcWz$E+A"?%܂GbbZ(NO8ƍt05LDyT..%k hyM)#eNv,Q7բ`xfmf/V[9J g.'78hPMUkWNp0 +L׍\.ҳ V +{҄86M`o 8bFnX%~9FgZ!/@I߈>9A]pJR +oW5Аҧ^Ljvf@ɽF +`ثJzn\\BЈx7-M>"e jSRWx`UeqeUBĸF>m7=UaG0 5gJͶJpB*r*lXg^/db<|e죏)OY8L[a |(G{wKTwTصB<2|kiGt:%qT0"ѥzLG +Taܠ4k`|A>>a/ْnvY۞< 'SǰUmܷL| +r +rP\Hn/H2Dg M}C# +EzJ +kNNFr*g=zWBeU$]&B HŲp}Q'QzׇYiSYW*!T!4Ptyiq`{' H0qocay83=񃄴}"ZuYz/MpLc@d0X.S\ʇhة݇4 ;6!5~Òcﶆ5U;[ɰU`/Z`Ҹ@9[]/zD!L 49;ƝF.D?uXqDăG5kƿ@a{hއcOoN;ڤ'Ͽá^ _:r](=X% w"yTGvsrKTySґƥ>d0ĝKx!LS&b2s[r|L*F =FZîOTYll溟}$9HY~@2j]źiսnG/V|_Zס|_D4pBh01hvĨ+.ޑmOW{pLN|'/~0-ޥf*"TZp1s,oK;,ć=eUwcmU: ELby³U(1dAMWƇ"Yw1L4) :*\ۯ?h9J)3B]M>Zlh8 9`޵n^2WVKDPu>u%73"o%Ӫ&j^p5vJtogbQpg=V +<#"@YbPMwG.03& R`\E'Jcu)v<}J-dӀNsl(huM7T;b~z/KϭߡX G_L>zZ1d#[ BNHM߼w~X(!p܀W"hnxk~<s cgj4'fmo/?J<$$X]?22NY u&FY\3:t|3A#ylC06`5lcc[Cvg4fc#Xb&R{RCRW~A{HY{ +C&HTiaS jHeWo銤/d=L TUg `i/Psj{1TW +bf_ZFf܊pziݼWT4zZ o䶪]i=O5i>TzqywiSv'jb*(Nxgˢd63 *T-ClZՒpz@,^9nCnϏ +%Ra>s'n-˃4lETsPsiWRrn8 .yn[h:)I]am%Dْ3+ޘl RCK}Auь31#0QÚk:<Cov]~t/N:_kcjEۧ ١?=hMsgL$(Hv$pt}2Bh~u=<0s +)ɱ_ǔjOyym+=4ѫ#c4}ҨuB[> %OTaOR{: Ww%-1u8=]j傪ǻAZ)=ig慈`ݢ4+OFʲ +9o%ؙJWkD +ʊԣ EhKSTĕZ\UpWKѲ<:)JkTj`#ͤ^^sө q7=x&NεfzOŽw X]=@Mvz(]?%I>E]@2Fк?VF6jeT~wcxM^kV@rxK+"pjJ(1#fM_C\KqgWK$K81&Ԡ;i_.~Zg+u'wZCo$W"ŔyKlR/T.,ջAFCs\{#;~j-~0's7}MĊv^Zq9Jja+#!>r3Nz I@>uӛeHQK,kA҅Qwz #{ LL@g#ޖ2> r~`T>dU7{y섂O>|bYUDҟ1Ӄ N{ôo?q7Զ3I\o7"ݺ q ;P fɶǵGІMMe6E%]ꡤqxlU&ڟeLj|[*eygq!'ýJl= -rAs9^4h?rS5Tl(MXBjf]TdΎ-|i@68~ZuXᦚcV +EHt>R>*Du$]>9,:lͨQ䒽E<#` ۸'޲0kɁk>5L.m4k%WS t,~|(_}s#äm NvZj%kfn$X5.w}#{љ`tj&qҠ +]iN#8[QUN0wyaŽqkn$,Fo_:;R2/4]3ocFvDf[ + +Ӳ€ Wߤ,=s8 TfP,"Rh8 y؀zq0yu!G~}Z\mv<DI%9l9YK%܍gkO%hd7PēSP'?$/Ѫ?1]t{^AĝC:i 5$ٶ5^'mY.3tVQ +Z kY3^?BCXُOoÐc-A w"j8gaeX>a"L-@ihwwjrŸSzz)$TGZR'8ߎ5nΚnܕy!îL^?Gn|O?l>Yv2]x"%zV왒5N +>,ȔL^Uql%͐Xv]^gX"܍}G" ~TV{3)lC +Ԥڴ*᜴t↗/p5ߚƐL!w/CvpjK6Je0]CDvO0kfGǻ +u}责,D[VrH@8JUho މj|c,Nӓ>&nߕZįiXC,L]602xLOzb@v+[z7۴zj_/mA ,'.a?qKzo ͻ3.8TnuoY;XM|Ds诈xX VC`mpمSm?E}wUb {hnV܍t1vF6C`M1s)R_оdhtx\'z Dia3A(/1_ Fʆcs @c|4SxH)4ݩ辕a dqwVs=?׭o꽼681ɨλSj<3~$/v("jvIa~R?ޚ,ZiKu0#Ís8js-[1ʖE<9`vd8_ vYz?zS> ~p>ȾpBvSjX5沌Mc`ycgz2? )SgZsOuJ(uqֽ㎷;d!wܵ4^D³[d$՟V;.ɫ 닣J$i2Zcs*VV9~fB*:,wu8p3#%G;U~5/̤nVՓK &RYcq<+ {~Cى*͉Eپ8(f#YLWsጼ"!AEտ`1 |\-Zsj$u)(yNĩ-AvgmG5ŶFo`/rJ6cIPl +I=(HTBܪ1O.^Zs%p_H8;i?=.r @`՘39=-S_4xsE:n)F.AcKC?K"R}0.p7fl4)H 5JfF?AuCZ )kt|͟xN*B*>MP5%K$LOPNNܽrOSs˝>:]tS,%vTqex 5<+ud^yK*#q/(CSнr\վK #9;L;zWwX%9 bcͭCrd&IKV6d0JӖ +{h-ک8tO&㷗^^4i8aRRKp-{0%ivz>RHr&Ơ9-S&S3Z+4$ ='@9%!3m|yșxpZjzEaXL., .Z ?\jS Ri#}?ߐ-QpfE :R>Lbl㊌-\ةͶ,G[|39 mK D!AUEfju='1[sJ:SЈu29܂HkmQ$Iz +a Yd >Ϟ/56ڞiH[2LQ xE0Dk=,{ +g4X~74hN9-t`RW@z06 +i}&t0?IWX$L9ڵϋ_M {Xݳ3[fwZb3uĭQTׯ(h0yłm Ӣ8eZhٲpicq"yRr'ȣ;ӖD22 +çsY'_e1۬ٝa{GEaggY7“Q elܦ}i6xNE?^9`|tuk%FG'L#!$qQnC3;R5ELl`SfY{[;t#o/m-̖^ үa +lP:,e?jȻ5|<]ev fB8?M'QS +ȧ#[fh }Sv?W_}j2u(s/Ok+wɋ_ ;ڱ֢8kqI52M#q֖}r#n԰!V[{T+lA-mRZr:"e#yFjcwpwRu{:OuC`nFjvaLᄰ}_ХӾ^p_k]d0, B,}6d((߸Zg[OQc2\ceNԊMܲ3Icݟ>3FN `?Td*}^P&VH ]F\&T5xF7W\Ca[à蛛p3HL}˪ӆrYgKƶPg i#R27(hBG2{w@)0'Wסհ9*l(:)h6vlmQUPEչAׁt*,L4 C UĆ fuϩBz!],:\E@be3:F>=ĬVPvRpqq;ѽR(A3P`L< @%[8CZc p}@Ov_p}l'ZOÌ LmUٱ`Va m6۴בMɆFQ֭c/ڏ{OUz3oW(Эuz)0]!1Fz+WZOm=c8 3P@Ѽ"n^hS^&q0Hp>Ooz;~ eUV$@ +e-Ѧ^|Ag >@wOKma* Bs;g2r:,3S۽ +oliu %<sY_<Ŝc9պ_fd&*gW \o62 U[Qif4.+Gl6d#͆Us6jpVPFB?D[s14vS> wdƾ;w4I܆Vg֤$B?-sNX >J2VJXv6Z}q8_y)SoT؇e&@NiJ M. kPZ1-$jj3/4_ 6f]OpS$RfL]Zcө>3qԑm-&(H=c`4}p0,c˒lX.Dg=[^?mdUImSM犉B90D*55NMÞ>P(-Y`8ٞB|pq(N4a YKRkZw`fN1cSE^ 5Z+FE169E=_ҏU+o\#|6y.e|H75 8{,Dl!L]nԶ7`Ym*/hf >X'd`Q Wܷcdu].;#Ý 36umP;j?U6(E{%bMCR;mLǥ!KpYO0e$t#P"\.w`󄹙-Id2RnVt7Ǯޝ_@C@#{d4W*rz!@a(Ù]U|mӫ + +sWJqRb N|Ze#a,Ukꘆ꾞T d +3Fg} a#pYbabFf˫qgQ2aQ|`XfˆT gp7uv1}d`m,+Ǖ3oqL#L-%ZnꈈM&<ݴm鐦~rV:x+>w%Vjtӗ0F+$ฆG(6 j5ꅈ1tPuřO [8'BDeV}G\]4<=p(z_]5C: 'Ht7 7aNUQffϰ" ԽdHaz4W}MrAdqGFڹ/RT.6 L:.&;5ț6ѩINg70sHe+!6,Ig4Ai/ȷ)̸f0-ꐧcc%ߔwC, (kM,|ztQ;QgdBNmqٮ^8Z8Cɣ*^ /I*Qj%N^cBm~w;vMO=]c$}; +MݼqIᓣyz^zeUd4n:a*-cüLܣC4+ib*lcS>߶ ۷YL'P@.}uI_]cP7,:VЌ>wF!Mw]IA}Ԇ3D)26eh6z +15jj;O&MЄuU烸O;i^! ,G `@8g8-2ɺ +=e" ),yi'-0QIe:W1)8iXٱFOFͲmvo{*56'Wk +ntJ02Su% QZ**v3M8nNd·,qx:_)Ûkw1D5_yd6tusazױ˷ȶ7g+vX%qI ⊨d\7WxTg "~u}  =v&22AM[ _/5dt(O<ݸ,Z9c!4sQpgpO-fuX +BHRnG1ڬ<} %y522#} VAP& @$JmDJr +kwdyPL[(G7Υ#qR{f 'MTP;iUWu:uFs]J@bHL'_=b<1`beIMT s:En,ǥ3zV CRq!>oNAmÇ)?0hwUu}&dVہqlR=^OXij Xx3,,n#hi)b,jVW,Ѱ"Tm=ӗۀrG>NPJS(wz-2 + RC8sCbLF̠ndd„R-Ƥ}Ɬa9-ӒuBTYL))qv]ʰ aV}9ʹz#"Okvfb-k/e z=v!hE}=%9i -& dkk7:c_M]V,Tэ5:-y߁RjL%œa?[Mrx'(KKxYgCKWaD7YWvM+NәjVNF8.!lѽ$F}UƠ=>՟_& ڧtsMj+lpQӰxv:5.J9Uݒڽ'7]m~ 3<@׃/~~fgbΓ2=֬?<VLHg0cqq;I:4rsضtQ宧e LDH:ؑ:V7mc={L+|َ q,ԹY,6r<eX^@aħ i=VNn{s+6cן{:'`4iD47__'Xh+&g9fT9dPK\)r9Ga@ͺ w۫/K`q w?ˤq~~ϐCҕ h8P65u2]1^[{d2[a(#]ԘȹظUZ(Nop& Pmd U +wWB)2io' dor,>g>V2tWNxz(d(APc}uw1'QpcoQTj,MN/`X)4^h՚ R՜>9?u³ ur_; nNw&"P^E2=u#(`giv_KIK6+'0:frrKNֻ[[*ۢ.V!L#|QMZ-sQn,٧=zmQ՝l{&`w$3еWm>{\dN9rڻk:M[8^_"7-fl7M6=sp)U($ 4v{:t,ڹq ,',$YT9OH1 Cr>z+ ֆت;Ngo p!w ‡gՍ:E$#s$C {Y ֤/!m__~JO-v +SFAL=Oo^ycm$8PD2;;Tsaf\?6]w^F7:Tñ5V`r7VL33bԐ9m `Xƞm\_ [$}j9eP'ծ]STIʨ]BFsN-_V]Y}fMEJud&2}! } !`5e*:0}>Voapzf5 R)OA<PsBӻOy$ɭ@tO ,t,EYiêdÇI{궇&{֗4C$C1zϕBE5zB.)H?Y*ը9AqRtDlo:O/DQ3koѼuy}ѓ^<9tIOtE,GٞmNP'YSUctx|U ٳT̋yk^ HPds`*,ry:&9W8bKES|s«5G#%E6#P`q#E;Tkt}X<j_Q^f׻r xᴉoH +_Iӿ;8K[:18jiĄG5ܕ9wɓȡM!<k*29ൖTr"niWkEԿ9uZerTO+9sYIO)<6%x=sjϫ.-=/HvĔ/C!]in!,JlrM7N EqꚵffFjXTF"qvkC愋l׼Wg6)7bvn1'9Ytڅm}nxLAoc՞}yAPʲ?j5:3DZqLl|0T#>dU= ^;W+nRD|YiO0YOSŧ%L-RsN¤F~%jwN醛]~hvD^Ŵ.9c$#5fE؎"4.ܜnu-Uu0LgܗDHz`RǝEz'j]N5WrFb?hGY CBUQ'GYrU@֞hbf;1?"'ü|\( kptDCqdÁ̓02@u3rEMy*sf/Yl_ "* {zY԰RK?9i x3kqB4E(#mZT$3~)cO_C_9H-q'riFe96"˴&(GiS87g/|X.odz%@@i!%T8ĺVy2pLGEeϨKoIy41B*T0kٌ]iz& Kc$3^2il/磡R,U>k)'Tw ~EH)ꓴ$o".>kH4;t{q%PI{+[FyԷU9d33n2q%Cְf@(d-yc.ILMEsdsch(*Cɳ0Ɉ~lD; &EbLuHE&Mj$`jXqp4r,շbq#7gۭ$覎ϣjuեvŲ&jy^wJ Z%楏Cl:anSj$V!j@h!-PUÙ+uU굵CܠAK,>MΛ2hIV/N#fI̬g} Mt\HiOעPf^҄L,':B ehAe`^v @Y^EK<e,r"7~8>\f3gT#7k:05ғNKjM 6dM;eW7l\!.鹏, +!<%/%]Sd:D}oiA; KVm!r d >ȃYv y`[LWO_n'A}Dz_m +a3_qFl7){Jv|PD-a\#uڬU6nz>c"b^W.oaz6S~5??,9ZiDI/X0djwUs$x}qstm\@ʷJ>TƠe:E͸Bӏcꀪ٤nߩORwψ拀9sB1dF*y%c0jtIv$ D:.P8 })[%ٛN@0f{\#CAc& p%X21:!ϣuB!:AAoĎ:gViNWj"WtYZuh['NSH]*eu}2l&?.@ZZdȚFp{O +M-m߯ & dsDք& jk7qAz_|oG^p1'LS98Z?Z),\ʀ%GJYKN#y_p-^Yv7S YX"3.rv H !-pΆ&}ڲ..&_,>>81>Ώ8m񉘮3Ixg4K;KlQi T_~i`ׁaGB*tT2IwF:2 tL2{f-a'^!|5,-KlN/h( %H|(R+[y$p,6;^7*H@h8N5˓ MOWwD d.LF`8bZBPv,)BǴ8Xy.!^ۇZ|l[ +^H!,*؈[|yH<=ͥIZm2P~67KN'(q.|NȎr._خkv3 cq=قo5\7`.0eN4,˫|s`AH}ְ|3~f ahMˇ +KmiFcBt䔰wt8j hAfmYKlD=%3iya&u}kRbe.B! #x~Qtn*r)Q6`O:`{x}V4M*NOq@iypnrU0Ÿ [vEf`b'6FBˁT^|3,rF!~2< +`oO@ <)(":qLQ^0$e 8  ΍ ?>Ƴg=6YVmvq2Kb[)xؼ\} 'Rvz:f+:麈0&5@ĶbMUS49~@t+Mq œ>: kJWd`1d̝3׬caAg5@\ѸB rTA1»SAL"~s14mB`OѷS]@;GBv+Ymk-+OɏC7#и֏ҼAe$*Je"V3"YK=L' !r7$҅{9KF~(-]bY"8&_EMwҖm+gukzVzZ-;~}H(\L$P[dW:zkói2v[& 6^7/K*!Z*x\uzU\8dHh uyg{Жԯj1hp/ H @塵jhx x2B#arzO!MSM(5nejU7+xGjyoOs[_,bc&!2!v5h#{ 2ɜe/ ]Qw[JݬhzLE./]nQm-t:tXE1H]$MxCW&߿c1L}NC6˝h)"?D&}*FvYhbckbi1x\s +GvгX4wӗ8WvU $U^f`z'Rf  + -^nUVU֌i7BIND9%aK':Aa$>d4N2鏏YS 'fKk+U,kMml_P Ij ^ᙬ9jk9}6+,:*=W_0ۡp$!^mbc1=ΦM.q\ZI6ɌƞzU Lz.Y񑮶5%{ch7YʟxЍa"l ++~0:JTÍh3riKs,hp S?,fP}J{+1mx$\,=2 /p*YeD1͕ԅ -XX/}sH[)ͮm::Zxo5ӂcM |'.A\~[bT +vwHKFOv#I ~9~JWtaޅI, jt,R\xvGYj)Fv\pd<-%|XփYS@ռ>Fp io&;rHq@GrIȍf؏@)wNcMo8j-87МV^t=_íQ;o4J4˫]Ú']lZ~άx U?IT +=668sxlFy`]n^'^L^0Ukv} gV*}䴶ZœV?YA)샚@k!9GSL~-//a&B̘cf(T]Vau]rl)g J}Pxw90 5B `ZmcyT! :A43uZQ";]T(g9B4'/-`.f>}[Z WOoV\w{^4$Óhnl5/Cx?߻( hPe`jwv ĜPbo..sPߪ [QYlZHr{VJg YmY{tсg_aa4.r`Gs~)zֳ jh;u=dỒSl!Q^b#.m5~͝eTP4LJm>ޫQA$8hܐՌ8&C_wlNZ +lTT5B2 rwZ6Yw``*?ǥa0׵dp|DE&3ߍ'Pw e*KE&ɩN{唆csoT4R/do}tӐũÇpo0D^\ts_;Yh~ςZA9HmVě5 6V5 =gLKʽD8Eߚ]sj_?+;Rbh^ N-k?CJN\KK]Fǰtd@f>27մf峓ᴫ5HQ wĪ KC܍i±V%k{lH1X^4垇%zƕȩfx@7d&Z ҹBrt<$,Z] z`N⪶RPݻ=nx#1ᑯ tiE7nX.P- 4I^.MJ kpF$injL5UAU)Qa,E=N/N5Xfswu+^)w߲PD *]"*)5(LN z;omG.nhʤK82*he1YDcc5k|љƳ%#l?XoOi9Źsz+$ͮK䀸x I$i,2lD'g8c,0Q沜 Ɯ{xMZ/dilsӂ6d~q4j5S V_x =C˖Ǎf?KR,Ԃ7]g-Pxu1enkYyVL3T/'B¢U ZSN3h%$)3?Bgj FUPp!*|V|liw4[Y?,OsKUyO#NP3L?s+"͑WbѪNu _KTy`l״f`v+}:㶂ү+OK[O_x2lr0fdP&FvP3 [<7Y2" Pbsr m%os!$wǡIf#bǚׯhY FENjdlⵏ԰ka],zd(Ԣ/$o'ζřp,t#bL64*z2ohkܮd:JM.[ l)-C`ҌogOcԉ-hJh%G?FKsR3**Q5(iJC% W֘zMn!h^7s<},u2*F<ͷtϔ{/vqhMPYY7dW" 6 \GQ|j69da+CFdLᾒ?LZ 7siyhMu}q_(<7 յ>-ɘO ?|CSеI ,Hq&݈^Uy4T60"hwL)ex >tll/4S+0k` 1KC>شj[6;fA2d/-o*' TTQx-Ozk1$U" \.FOl2՘\-oI7v_nT73nN#gR'4b +*޶sF#smAA0u84U$/?HB-@0.`ChyULN$0D?"L$]= gφVu3*4 \6!+3R K:ٴKQv +H(ʚ ?t9vн՘! QI4ۀoQ ^⑀Ay8`O.eb^[dG%W)dG{Y.*U}$K\LҐIwX2%SM%/pT('BAGdWfD M0 fȇ*il=Ut7~zJ3!_3%~o2Tɣhw(%.h`hYrE k;qM%) 5;&>0{t IY2,Q\X3Eۤ)RT/{'%0{MЅ@=r=Д6(4ErjyhL5yɉրn瑲:Ҕރ72v'i$)ߩ b 2JC?LX5dpNq,f4ʠŨt +C j@9M*(צN^f 1C,A\ujDR6/Wr6YBS*baA-afߺ潄vʙYmE,_* 0:/xE-ԅlp[j_m }131T&h$Sf4 +M+ǐAXh*]$1IJ$Xq2Wt +LᳮBFWsXp&a}ir\Jƺ'0a@zWƝ30Y Ω``HO5.q/rEKdMQQcV(8RLjowYv0ƸE=s vYc~M` +j6-E^lQo;$Ah3]5d7FSƱL(ݹM2`*,\ZJ&Va|-YnUÇ*֡jly=+2F# 8 :6kpUsVh7rpa].usjN~k4Ԙ@}d>9`0l8rZ|5ҋ˭lAwʻd %e>+k!%Y|}nENc`2iI2*+<#> +1J TAŨER8>g6+t^7i4O E|iz}2oAk|!2~6Eǫ=b"%",>?]@Flwq(§!іT%ݺZ'R_[6~LOBLldD_8/ QaWDm!'H1R-U5/FrȵgQGf݅_&QVӱE9H`A™O)PƦHTe{M3s"VMByήǮ&uٷ]l构Y^tX;y$oVz(5 V?TȐ 'mrF " 9heRKGXIlY4>WY/=~mArGMo!RR.- .0̻VOtY|aq~4Lf7[r@MRz \溹$+R 'EeUeРӺLmj#r\iSDIb!W|b{b.Wāl 8$Z.Քa!WnVJR{DC^^*ҧit@*C\5kß46=eSd?3 +šBv=b'u*Cdx -s^${''p:g o6`1GT/!."! xXj]1䢼t:n;1No%V>!imjU 欪Ls1(tŵZ5Od(/#%G +*f<|%<@v6fs@K}Eэ %BP.!ͯEuVGu <܎昳вn3]n ޴B^h 9Ԅ3_ HˑmHoo6}>N lVm@I%Ƨ*iol,Vahn:vgrJb2%_%HNDw@t(s$ i?}W`ܘ ]ƾvS60Ine&C5s!KdpmW6i+j~i8ZCi@ +]5k%,Z^לEgD:@O u- +MxwzY xu=aֳ[[2 +yp( Kq'dL1@ީ@=u5LlLe4^/iߪ>(;k | ^%_X.x,>@CRUwtHMf\ܰ-EU +f:PVTWMy '|i}L@_)&.Z E0tR||s=C+y>%3=$н8ڨPp=10!1`~3bGA3(FOٴ /Z KqQ sB-ϣ-Lwa0)mGw|ϿK<&> =4I ['z[-عp%6Zm`Rҕ~P6imF78f;sPx%]^5TgomGZ㣂ї-U'Xj.ete=GoQJV^(eًna4qL/*ʋ4b}TXug>]I:A%#QO.diNggZ_'g{ +YgL?})*T%`S'W(΄F}c>Ѓ~1Kk8FHTSc:.vtwR(~V?`WԪ^bZѨ_(5-6T4$lP_{s=zf _xqօd p'8&3ٻ ][Jh$Xho<~`ͱF]0o$;>ة_`\`Cn-(ckxN 'Al1]J% )@ڡ] zel}~uL]&w1~:(>mvZƱځ+y{*@VE C_CqM%Ӹh1OQ̵4S{XfeaW{ 8LefTV6d6,ԇMT/*iQMӺP^rpl ?bxp%ct37G[s瓅cGQo1@ߏ9V -Gu.zKQ&$}ɖKKn{GSLF,n xYR̨bёbl~F^Hi6^@ Y"?p~Iqvj] -߇xԌ69NׯFi.BU7A#}*IXȤr S-Ve)U0潓R=|9AuC&)͑{Pa0Q Փ۶m_ Orj/FY;$eBQV^oǕ>X6vC. ua Di%6SrG\~4* SWUQԖRF% Vʼn90~3@KK`&%%cpdp97:P$|C/hZfpD;|s{Ziь5YW)$4MWH\)M..DH؜D";`ݣ䏇 H >LsnVZ,=L7qst>GSnwu +AW[Ҭ#ݜԊg!djEΈ].Ɏ6JmXOO{\''zIjz0yfrd6_cQ\`uMDKTw_F k!ʺnUtc&iʂ*¦&&iZ5!Zݼ5*_9ss'bW0w;RZ2jIelۗgEcZOw5RQCb@`&/&_Y2z'*Si|Q*P l5|mh }3(! Q] 0s22zV[^lG)WMO8}V>j!tD(|{rhӂox((k5o'i& +ݏۮWG"LhA>7D7+ִz E luDn>L8SL9M[k=Eh浟UCtO _FaF9:'IlN=5t?ZCkCe$/ Z/qR\ pd_r/E:r4CD-½NC-V[Bj6ĬC^[bJҕܯA;k R #W>ڞ:jV]=T[cFF^WԷ[c=\V멦)"_5 fkG^鎫u^0C9$UѧuAMesKT6FTu a^<=̺?2]-s Vhhuelߙ!Bq0^K؟A][:^;õoײhom\+d+dz-Sb|/_1tHod͐˼Mh]Sg#͞`aiYk_V%JͯFzE8-cf?dCxXMcrb/G5hewsSDu[W]8 TeͿ[}hǶz}i#"4:JDac]XR o@#ҍ9|ZdBĦ yA"msZưet}z^]3(z՝e0m9 2݂2+C@?娰^o0z Ҧ*\XedH.d´=z,,Ww˧Qrw4wx|y[ԅlnpF Lޮ|~EK&WLkIlRhUП͞O MWt@Z?rGQQZo%?AK ςVЀ_]Ju#Q*E"w$[M4?|_ +b(= +Hq]9*~9S`>٨Y*nmePqWnV; (\նn`!@P[̨j-r!O\H'&tXV܏94Ѣ:K+S&⢅e51PBn@~GYh4-O>D/g4cIsWԨ-Op0+=CG7pY?W ZۺI)upK@iv}4l̸ӵBsG>*P-kVi8R*bFJ⟿qQ;'O02<ƁGn?yJ % ۗLRQad{ARv1Du:W=uRdZ0[,r6icc[ۗˋ1_qs]-jj.=?*5kG̺ +7.U[z䉿 hŽGF=v0:#ur 9EM? <̯NME|3rP"[`L,;)jfeu2rŽ ˵6vmheXU:oxG.=|WwtzG?Zb J"1@2ovnS}ބ r7rcX!K;Ā1L0vg]vNgO6 knU ^MI8h֪7UYmvXǎĴƇlv8( #gNu:e1Kӟu-ͨ,Ue5 t6z]tzy+܏)AA @&qlWԁGQT~Q蘒c@r'AtFq<ޗz4mFdrQgemj%fX6U;o/ߤawzu,sz ;!^Y?ئNh*f19+0W\w8,-ޠL=jeo=ѵel>lkMJ +IQsa] +8xVJv1NӼ85 IK,hLξL {4_#W67(iW@_fa! fQnfPdM[Qywagm)e.0|Kydu#AtUh@Fԏs<*֩oSvǫUʼj~v@f(יU5w uuߏr:㽤u9ezjY{=UCӣLo A∟ڥue{c)3&a;l5<R;b4jN*q0UuN(Fp&m7tʭ_- 6J|:`ŕL5; 5 ;QW1+o&{k#pLqb]4`* rjsLAs5 EhM_68$Zݦ%_[v^!b̳]19!,i\ONJsPS +¢&%7Ng|h\p#M`Ltu Cěmt;p1!~ABŬVM_M֯C+T;(wURvuŪz'I6Az.s_鴚t3~a36m;sda-*vNК=MJ9x{ǵ6ߛ2YaeTG3{iE !{Wi%N˖V۰ +zRmr t ;/!!%L!Apx[}F +mh[I%\ 0=zϬ7?_6S\Rio^=*<4| CtgjR汻ІO󁄋a"CZ0um%L}]*6u#*'ۍR5j =*&a&/:k^!SDN*90T=J^M{"ǝ"nHeMlf&<&o:9v$'Fّ eЀ޵rmsT.u)]6} ,}:!WmH!9uv-Wwh*;Zb]nW +ӳ40|T] H`(79 rRq̐;ǝ9q;l6tB}ިKLٌImˇZ0-I[r>Ӫ3{5tؠ볛afa1n?G +{8~m?ʶ +EI:1IX\}q +S"Lu[KEMhg%WTt|ztu`!*3DZ6.p3)[jRNu1RK4K:BO%6`WB|۞s)\v:!Cu"XI_ƾ&7M:~ܔFX8ofJ%%{NK=kJˬvȒѫ~䔉阝޳ݤ:>ja0@~LԠl9W?ɕJTPO5I`lkֱ9=ƌ622M#sw_BB6AW0- c[=p7IdZTG8fkV\pe"C9*MKlv͒Gu!'ԷRwBqW5 ?B"a!Z@tΜ<bcLnIp̮4M֤N৹'dq4O/i5 vDk%OFp`0`uVGA3:!z ɱLINuw ZofEPT~_y':y~mSܐ 2\czf!)[m2I˦'Ql@TdSS{]וGujt+I>8-sXEN_)Kg*줼5z9Ab'k3z飖pM3-F/m4?*?iVzy|E߮'oB\=_*|hYvyk]2(aj0"2.pX:NjW4;tzR8>qKOcZSnOJ9; 9ɉp' YF}ۄVI0JkN3kƿD?|R J' nhCy>$;q,Y`h*hrp}UJulaթoFADXej#\4͡Ef r?ߺQuT5gMU֦J|< =,826=!V6#aQa 1DyN1ng}H'!*UK)a |FZyêj{X֝}6G+!)C#-pMd,!ULn]dX,k-R=~1QGx/auq("< )HUO@>e~Ȕg+F|ռ~\Dx_y.TK3k_Ty7K̶T% {|1ym\:Vrܔ)O<:Ԝyw_t묮j(ɲ6Uو߯S\a9UTpcs@V nQ6C agS֪[fIJSS^Yl] #t׊+qG46vplM"qx{2375c8li1Aְ> AR:YZc3O‰lekJLvY~F˦z[2+6{%>Tjwھ^=n.xm%WU'u޷ ?{@5.MMZ^pGȗ$8$G3=,~1t )WCN" ږE{ö? +rkov^ƨi'>nl}T5C_v҉`QOeX;ydݬՍmLi,ϟ[Ob<r^ahA+ZFV=(4+"ԗ=fiZ"yF,Q^.ɍ0)|9yד/QURDFVRI/!|t30R4;`GY.!=wArȖYY vuvtJ_k@ڱ ,'{ߊ'ծpac9GvrtjŘ6R9~p%Z) aJf1.93vg>?,oe i㶌2R=*JܦQ/lx<ӱp$612 R 9EYIUk +o#, z4}ֲ ==أzsxO+DY ]*Ҕig5VIǮm*`js|n$o."<$w%< oӺZ;R)d,n=,:b.x"(vSRۺ$SGʡh d_hZV11=Z[M5npָTͬkw<"~]#)~IBh6zs.kEoKMpyQ/dILe d\|j8e=W6eWWXuUÍ讌Śsx~[8Lˉl?忖sK4p2.Z U%Xb)%2In5R%* 7/C m_\WHu1}5q~yo5Jy=?/ɒ윎ύ'l>jNsZUC)8/TZPRG`pnu:8VPյx<Ҩjطe3. V9:M/3l&B~P188\X#C[G=F7pzG}0Fư=t_/VЎ BξF}o\$hMz3G%Y#)@9bz0e{))QD:;ECQ[f\{wYOozF}pӴf?j QZNM ɓ-_^%`p_u )^խyӷ?ۿ;o|EuXPa$4arG3*n<ڳ̵m'q(1Whs4HubVjdaG[r8xB,XV1R-_?ݤ(t LT5HIURf oY7FC9{k.\M ʻHyCU~jSd 9ɣ2 T3fzzB3, 0U趄 ++?ntyjÎH? +,WCd\ +Pf@1XtĊ{T_,"B$ m/THD Z9)p +3&jMQg7A 4%7Ip0C;4 vK5}d&w,k;$%Ui +(g،lZ-;Z`* r3ۖ e Cǚ㫳à9RG4[" +[]^AT]fiQE.hp kͭ<ZNrG>}ոh{96=)`q&L#0TT 1ӑTviĹW/N^)w߿gj$)sբٻ !'Q=,g+}DCFEr.J|*aHRI( ohJJq;BB^fa4u1/od4:Ye\bn#oM5x ̨s臚y_uϠ\1jٸAN? Bi7" ~>z28 +G2.isv}$DCzN k{cYK[;,areӊM= ªl92C5}Xv]/?tba+Pt8_ ˀ5! n&?@6Lj]QgQ_\LZ6fjȗt5{vG3a%9DY'i`̺dv|y|sn40}t.unE8x49vq}ǎBGhn}9*}<K?9DmˌϪ_|1h,֖wne[]J/y~N=$rZBQ~FiI]6,J?#@3wұ:qNOt1V.SH`7(RG+SFKm6Z8xtɝi7Ҩbsǀm r~Zv3 /L ksq5KӘa#U݋u'i|ŜlWž%O@siJY3I&awsJjeFFX}Hh)*rd*,>孝>o~^_{=}[CVخ*va?RN>twh3>uzV^3Dnd.QiN|qW-uk +g^J Yt#G> [a3 ;tɺ/K +G(onݡ繏 RyۚzMwZ2I8^(y\^nP4kʌYĸLr iE~|K[dkۘw7x*4z"0|%7s1VAIPj1Zr+#.2Iސ@}bX`H𲟻V̓@x- Hj,$B}&29g/z `},ۀˀ&)g_!ƨWh<X2U r3) 2ĀK)jjP[Eɲ*Yp.,.˵;N9w{[z +ҷtUՁQ^C+(:10GOZ!7W{w܋4PmjLȿ=1%bDiC=jt+".oP|=~)*@|Ѭxr{Rb[g;)G+_lsbhy]fVs<|cL4 +]F[v DOd&OJXE>:+Xnm?,Wp\w7'eTEmB8h T [-㊐ρ}72D$MDɮm4oQF +ɺ pEMTu>km3gL7jؿBlmI8tV//;i1yj:D✀\ڛ-@Gl6} +-/jI;Ƥ)eC$`%[4Ө?]M_k?^1E쉎R/~:7ˌމ=&{4|d#nډ -΢$vҲ80b-J\Tø[2c "r ,.*i^uZrKG/6LOM"OKul8#xێad<o1a#OkCnm#QlC_Pxg:v'eqcCke?&JlpYnd]g~aZ|w'pY/OSH~ 4k,wز<ׇ9=m5{'y +*;ػhLGA޵84a?Ol4:yc\:oz Kߺx`=Wk[ힸ-i 9بy>i4}-jƦUhPc?qǚ"xK'/3nezy35HYRۓ['3~ӝڝYH+d7#z_'mcDN.ToZ=i۵х;y@D*ulꉇqY͐]wZ9@ät͕Y^)MabBEdOM6B@uPgQgP e-1&o=1- Dղ ,!f&5ۯ,ONAck?࠱#8J]Sꪌ侪ϱnGw9: '6+rfbszW#>ugƽۣyjgpi*:kh ,,쾒kI\)0Em|I!' 1RkOY5ՆUYHLD< +e5e]ynI^]Hӧ W윷Vc:AKr&aeRы6\.i..2K3svrFp[؝^mƗX/0L ,OǘַׯCŦʕV/y==}GXӟSm?pyvV {Y={Na!a'6lxׄSp0HR`}1Cݬⵔf$a_cv7pnXiXeWbc {ۡTǓKj*5v#Eq B'g{ؽ ܾup"KmӼDJaJ;ӛa#&m׍9ECxVFOh5o;{')]\W(~|R.h5!~fMӈKkLjQX7ȚKeN@[7ynJU5r'V4"c.ѐds+b^zV[s0YSNe5;tP'5eJLDRdY s'J, 0 kUU{ZTݿby[ ۲dIєOHF +dZu߯j\}1\Mi.hW>:,E?t ~LT!a(T}_Lugym-a4Av FW8}cŪی9jB#^lXܚfH.q[@!?z#JѾaߜ7]Ub.re*G7tQc/Z<iq~J'{IN^qmLwb+D(^bط;8 +`kML?\j]FAxōvp5Oòbh +*2mR{#ʚq0%O{Öwb +d7$w6`9->LsWWMfoX.fTGGyd@tSTtmLI^ՆR$p`C.N@81SXޕ-a'^gmh*jӯܿ!]~#!_ 8홈g|Rn1~γovKaOgV,2н㯲 ,u d5Zpݖ,. Ig^teEU%$wSW-QɨrY1 +ۗ:B%)JSyMMԨ;_F:+?ɁV?44%T\SWz'ГVup<T%u1Vl|J+0aik0PܿfV݅`ͭ +*l: K# +"z41 1}*!Z`@e4,K(h|$SX5ȴdzH0_ C;4 ܪprCDV <>%tz<-mK2v",flǓa=i߱ D +kuǁ2]*0Ӵ=GVMXS}s5&u^ SpdiYkyxh:{L]Mi85ͺvtae_Qa[VBs@jEL?㽹ZwjE(<2t& ]o#UmW;mf yk2?v}9ueK2*J%PmsNGʝFxa +Qh`U=;9u?N>TK⦙zxX:iVB{#3m9͢`?~}"-{¼3~R,l7.BPj8Y5RlێhTcm̟[-j#Y_"v+wt<k^emFd9:E`ӫӎ~"ˑt_  m)VآuIk)4ckȀӄgrEL[&3I:QC8͞6lf"ïtmC4#iw>!R9ʶ>C50+CNŖU+xsG{ nݝws] -zIrFD:/@YNyE_@?@Mֽ)$ +Ș`I(ⲍ(e)z +ʀ2{B3<灆(26S}aB9agcV\~|h`ME#=W wzP=|w\NOcFӽe:eA[76g.ks#l6zA(@~(N7T 3nݶ;fYF) 5Rbx/^easzaj?V ©JF=D@i5v9݌7T8CP2߸bw~z0,O3$ۚW hxb~ +n='fQ\Cb=\RM J̸OD7WOLITUuSJgb%8ĵ Zeaut5!iLwnsX{n)iIBeX wfsU\=d*Ύ+β=V*jBPzjv.GPxAc߫<5}i [MIO4VKv)|e//˝~Ƃ}P[1sӻÔR1As1GwV^)PҚHt˾X{7m1&=۴ᖣHQJ;szRPQmIldL!w#5JmW!u<ѷݐnxJay 5]Yٔ܇ r_Aff|"H{4MܬSk'?ͫrl-/Rdʸ <" +}5K-1$MOʥ ؖdEvvjDDn*$1]0 1wLU'.* 1<]?n~4{Y.%ZdQF#\/sPYh;ۭBA,[DR{>.ihi[%'M dJDN=|$4?KbsV>T{ag, iS)+e қJ,N #GRsDS_fR 1pmwkxSǍFm{L Ig$_佺4qG[PYI_L_%^>9߬,}nUqգ\\1'HFU[<[ +AgEf4I7K/ʥo̩?^܂.H\=Q"ӳ*yKK>z,9#0`K;KQTK۪U!m2XgJu}YEJ˹kTNF<&jx~wJߓܰ:FiӾnjbcu|ᴻԇĖmCf[ .orNڇ~z3qstǝu`j~`r?0e-SYDe5 +Us׌=v]^< n|C͒rg$F+vڌMw&^cT*>nG:D<^ܞbHWИu\قHC[9mL6[l+-!^Z{fβ\=1r'U5y[ +5Yފ~ FN{Y/zdeU[.w +@xi2Xنu'L G3DG'փ˝N|om#1M\>V&{d~13vFl| ZZ)hz"?62?]Z2O|q.dS +Evʑp7%^sY{ŧZNlz9Ū0;qq(+bl.6=Jr95?Ys?r~ ˵)k@MA=zc@NHs͖n*a{Qf&Zcd3ښ5WGJ TJX@*f +%2ghˉV-&&)RbO׸L.bmּN^=e2zqvӫ7V1A"w2E^[I5-2^5%<,.ɜ%|ů- rװM1t Mt8cwLWjs ䷥l>F:bV7ܞ[}\:@ch C̕B̏h5V'\Cjbi'Tzthy(GD$7#ӂI;E%ʚz?nfI&.i;!YٞnCN(ӯgB DP RFz7pe+`jcφEfx> hactOwfkۇ< +MT}A2 "q&'N>tzYe')a.oנWGo 4ޞN}i<r{.Ҳjy .C=vsY`2MM;e>O,~m[^C+&ӊoD(՚az:V~k6KZu-I?/H3Xzd rO-96&/ CjXd/Ӡsƭݺc]M.WFsꗋF3mA,RL>;v'&M#¼c>g'@po=*D;")oGu5Q.~ıv(V(S/uH߮?$\nwW"2jN/LY zYT?߶l&7~9KI̎wr_j3+ХDN +;ޖ \ȋrB )CVIvbST(Ib~$xcD:B qY Oa#e:^}1!ꛣ;h캑7J.IKE P3Jav"_SO@O8I'.ju(vd3[餣tf"(Wsj!䟈kPGA&܏Q76Ҋ-L)'l+QS'.S#fn +P{"I|<-Nt'D>8PyuP1xIL?w^-W:VQ_PUҹGº_cZE_MGָٌ;R]7G3K`HuMЩ9RA#)絗~$]lpiQMcA8Y-@DOv3,ܫk՝R*V^rK^I׎a9#N&FU+=aAB ޠAyEݖT0] 8ס@(^@h_^6J<"[4J8u r SrW ˅ڙلAO`H؛S`pbDWu(%YxV/QC[`ȶW9r:B;}HJcK۫b]mrp/**cLݨ)k|!ɇq 5:5] +d׻pCًB/DB qN &0A_Oj{a3Ci}~`Ȩ+ocXWX ۰[&*u2Sh)}s +4Q:iCE"=͆L250w9_̳ǖ <\b,U6:V12L_x!MQ~ޝxU ++3S=#_q4UIyhǂ0Aľ+ǍE [=UY +irv!⃮*]wM}غ\ aŻb)bԱ:1|Bӳ2(Z5ӟscVi`{D-V+ . q6/G65lŶYrӖl6Φ>]q]Mw~YkQOa<^$ڰ6)mX3~HPĸ;8njȑMA*5Yaao: XUz e۩-,ZOytP w(/''*v|lfS :Ev]FY=Z8,h64ߖ +PU-MEi&| w:KJ p +Ӿ,뿰)+^]Ø??{NL]ߣ>{8O sWq rxVx$uHDEۜnJ7< +IZWTխkZ-j8??? +Flj  dV䥯6O`y*Mc%,̭@&GshjAWh Jj U>\;Wv.NZ\6&,3mx:ƙ-O} 跟/=fp3BքZ4[6[0Q7gRaL-6tԋnSmۢI^_z3^k  B|[VW<5'tDzɁh/18,SVg6QR7g|yz;yZ!ۇGħC9n۩;;htX2P˖AKSSbp7b/:f饵!`Q۔eB,c;:ەSzuý9|3,=q"FSoZ5GH1 .{[Gǝ5@a"N"thOd≠GxDZ~i c؈OᩱlZQܾ%=L|p.U=:4qw-wx2깗˷3s+?}8'i%F^vRS+Ewx´T6YF3mN'1mrE3d+s(~AhBX7ouջte0XK:W^#F6~IHy:]#~[Z߼cRٝh0?w|9y9|BӕGdM03G~}Tja%BetNvWNX}X Q(TG͇-c 8A|v%l4'1o\fYS;-'Y[$a'~KJ?mخai^ ߅N>aVC, _A뒛:jB{%-Uϝ\zLգs$#F IfFSk I-Eꜗp~X:-M,eԇb@Yw~2]zDܡu?!ԥ:itlyb}.r~øUH@un<FqT]"KZ][~l?;zˇީ?nE'KtgGXRyUr쓀kOZ\q+z+؜6&Lw|0 +eAh5'1+>5@1@rl$qTQo:f('yWphnE__ +w'A05~I:<9wv\YRņ6dT֒ ǧeIR#^?J/$&UaG%dag^A':݆Z9TX9ҐHl3s +%L[bY62=I//&rl/r ]2[kqF +FZA˶^"BWHCeM;j"(:X1GJ VNkeCKO^<>D «nQܪl)SGJ,qv 5W>:jsoA{7'@/z\]#¼Uw..MUH*i >Xbo.ءj<(M;pLWd{wz%NxY_ϭ1 .PvмmY!ox=ȶ 4?Ž,6*Y.=V@m'I)Dn[H(=wo.."BF5dXzesޣ-ⶮhaBq p;|^pӄr GY aLCHɈKէ1S.,Z^^{8il 5yط1آkOߘ`aN<T|, jks>}Eyvm3gr}:F%Spm+DGh5Qjv{FvZs^;m[WON,zoqҴ{~ZO+h./A1/vH L4VN-#mL]?>-Гa#^ai{<2>ORCtdAI;ӉZ,W6{%⶷KSYضVEe-5%ۚs\JUh洺 +u!ظ|s!;<6%|3hrt['SANM^,Wsʝ<6uڭOy"ty\?;0,Q~Z"1jpEYC:,H'+.iP5+mw8ylD+نfu{" g1yR`^Ly#-JCm@>Oq[҉;dq0\m #ڸs>^h qͶY,ɐD/'싳=ʥt@D"++O(eu=o^7st;@Y.pG{^gɄq}=^ 0|<|o콦{ CAwjǬmܵ2c<11zy]Rrǒ#ׁ?z$33d_Nwe}2I +""#{\<=!u>xٲ[q<(F#fbSB"oZ>yi`fO{ڿٌ<6C&AvHrczʖ_vscϵK>E-G5j]o$TAܕ@*釪؛dUW MZ7p0`LBTh]j.tQR4xݛ+Fǝ[nRRe.M#i=qd@U]pC|k)cR +)v?V)2Vo" |D+H'jT$`!j kᏻK ;VuO枀Zڷ,d H{MiVѰ GfΉp~ʇFmLCTS>lf,L(5MhS0G(e+U,3y@azJW8Nv"k+H4*LYHT߄ZYo^cKnIt7*HaT7s8L'|o]tm_Kj1@lsvM{D=A>6N dwWLLmdK"H<5たIŊu1Hz A])7!g5I-kcrW`22n؁kWp$x|⮶FUoFW1V +QBy^6HhxI$':q3\bÕeT=fˋ3p?VD>}U9[^\V`RBwd`Za 'LŐ~fQYaҲU#.9+yL|J9E؊%=`Nr3͚b:$i_"F\96áp׉0|jk)sGxM=7͑siAmXm$ + :`S +dߋVo4mnݡ>p褤/tITIȳ)I1dn}aݭ&сZTF>'_ƶu~O?줹g'움VpN7ԭ~ /X6 ZtSpxj+Pk8~?:T9ԙo鞣co JjVOjH #iy54C`ŚX HvNwMzu*`bp$@Kw.M&έg\hpޝͳ uw@5TbD +4-Eb1-OkRk8gE|\Rdm ~;<>\[1A+^ñF37v_ZSЏrYuL./~>mHeQOyrk!üZ6S*WN;JA";&dڹtfaJBH;n**T + bҵfdi)>]{SJ`o~YDalnh)v)24EBiY_v*<[e!a&AwokY(?)6;8`΀}tD'Dn1[Lp'x:.\zڑMoK4-ԇy +ʀrj>J4]bL_Gc~ٺO>OL8l-;/E+5NNlݷ\gs_1ާepKԴx)|\s Q~i_ӛ^5PqũVPpC; _EyrsӉC}RY˦N{s%hi͜wXm##9ƇH=ñ)C'ݪKɯĈ[{&EA"+7/x&B^M +} m랆vnvi3)4Vb.6*a{>Ɣgk0kQrZ٢ Bsl&!_%} '.@fݒceTL0?{O[H9`c).gX1mW\RkxYٴHu1ArTЂ3=eٌ!pѡbrQsgf$+5IfP7P#*G nYx +hz"$XaMly-.PP#ǺDD} ,YN|N7:ƛ8w,M$J+"/˫2#KhZ%Ʃ2}QE21"$Vcy9tO:)gtU'y&80}uOyu8<*w m82$u*U@kQh24w@mՂ [l{Y{5pZáCa=)k;Cn,n27+M)o&Waܟ۾Y?"LwN1_Ո6LC[CG5E1(ڢR;u}tJn A49KڳUL(k2:*h;4wN{vNEIn(q~l[Y=wxKN]b&V"m@0zjҲmF%sЙ+pM*[`v[e +ҴbO }8ٍf="p.69evize4Kf:"~>%tŅafF=+J9&iATG{W0Y^O\ڀ,*1ݎpI%ɝ^+"+ՠ[D!Mp}mIϓS5t/Yyc'ӆ -rӪ,OAu5!&yBj4ۏ2dL̟ ,k69r/\&gy%-ϱO͖߱pmV{F҂>f/U8Q߇-Xt֍ 誴|RO0Kf^jZuƝ1[2!R 2`w7L"mZ٪9!Vzӊe'N;OWG bboZ8 XQzaMuwU)X wki+fKAc~d.G+PTdtS\ll_)nv5+5"Yu jfi^9'C۸:*nfeGA)&fa*I*b#K, .]7W=xUs8q:}u/ CII祿f%ϊ]A؃9'R|@VX[Ī7kI|ſxl$6O'*#nkxd_6aG/0&t[1'U[gÔI? AG M:VKgl:^e0ﻤ|~ٺz7(Z<@ ONOxXd"̂@3(yŹbfv1$aں3=8ߖ{>oDg AMTf9#:}=I7<6Ꮅ$I3{Ux;inn}LI/ɒML"VO>f+C5{Q^{ _n >o<>)RX4]1jJ/Da5솢(M8M~&,M"Wdz;S=&-q7'ٶ9A#IY1[^%ЇUtDۖWSyL2=5uJG.ip 1BO*#;qh0Ub0  Qck)P^3uWne6e`l5\ޏ;~F=;uCq&Uaitq_f>6}wېDc$pӒ}!Z.~O[\_կОU^lc]a6ñ!6RR;leVN6ʯFa9e]]?$F35%E}y> LȄm>b(5t^ fvrij?ӽhŚbE"F'*_iNG[D|jśÄyMI|Lx8["@,Mfzh9 ?u~3 +%RVr1^.I8)YFFu9:%,zp* s I$(νǞmdtjmJyF$U34,VK٫¨U+~alwlwR'MXϾ_f1sn^775|ڦ LӒ>gT/D8M9kpJu_!-Y⣕_)s4ݍ]6 wv!^-K!QSؿ|h;'Igf81324S U +dG?M*Wt"} o]plQ\MlZuGR[ Nsm`y%M||kοmy:@ f 8c$' 25v2Ԕ[־fYIxÆd+- QP+}_? >.S.R2|@!tڟvLS8_uO<@<| cm&L|x%w:q3bΫ9xqSD T +pǓzSX"~cƠ B| +:i]pO.pӌVatp6U("_N>S_{hz2;Ld=WM,4ZyH6LUV/C}-=AS׵/,3/L}^K,Ub#[`D;֤n]O-;n1N6ep3zj/XHo7i62 +ux,+[/l+u2z";e \g*"F'յ +uӮ>*=T;ߦ~s8fiKdwv&12ѶE1BW8WB6c.%~/j Xҡ@h5$2-leG)f\VjƎw٧9ss:"͒#+NC$V{+f|Ony O^Kb:ut0ZɉVIVi$S>0؜cE9f1r @ߧJp%R2k\Qy~a>+QF֠p6urA JbycڿjKK33ʥ pѮ$cGP >$; A!5#vG[ j>K'&R}FYRJ&o9@%hObH\cXh<[ J;÷qr׆(9Pwlyun^R$N +Dk=W2|-nr8iEw1ItT$"~~kY<)!:[%%6E O[R9ţ5M3ZӳJY&ٻ +}P9cYc̞gҫFew'rP^!Un’>C2ׄY>YWhc#k`,V/HYM{ +Ču˰YhIL˝u]UF$cq-Hc߇&Q +XsτZkkڌN"lCfM5ZܠBy h{~b pQ9=^KhL{6R );c",N^ r[9EynK@YAOy (}Dx!oЦg /ݼ/ Xeh(kB&[\./8m|ί#Ԁ'+z,Zf +UzJ3ti7G7La\~ A{"*f+;HF{_{X 5'kd4SAc}8,w͹סN%Cp!hHtE^vZp 9C"bYy-C*#8aWI鳗gfIw|_ + N)U]ܧ5E|c1_(_c{ξRe,H֝MCi'azP5 Z m NZs2\izCOmr-CE{)Vo%K_)R! ^lWD\0O:V\*l4jWm0[L=&IOX-^6kN'˦)fe~ +GmkۦSQFe9Um.Tc[`]p[q0|A3 +[`eǚYYP&s4!#s?R`^Q-U8)QGUh`6 I1mA 8҆drz%Ddл\uwCh. ksYB/XIN%*ͤc:4NM"e241}C`c;&9ᘺ*qy UO¿28k,# Ǐw&6l:ȲCEҜV5>orOy&hBƹ# ϹA8bI7x~ 1V o#vv">vMύg  M=^ z*0R;txn +;ܻe^RA{CnłS85wh Z/'fv-B ɡ2:FpuDjײa(e?XD qT=i׀B(GiE#& Do٠6~<~Q v;oI+8(/s,ɍs@D#C?&kFzڋ v-%NlܼƹGP!bH2-WÕSE΢l>uhwg}nq~^k+إf9 5S@&Cq!vRe%tSjªW+jX3i6xҮoV#ӲqJLCqxS9Q5)3f7ېdN$w=<4,dO2cX.hb.& Vf>jsQiPPH[wOXRA9I[ޗ0sv^ +,6dqP|[Ran&@RWNlG~p㹩ͧzV1!:ăs3ѧ0L;˸ws_l"}75=iarcϳǟ}_;(H>'ݐ1s+;5).y!僉+O$:vlف߃kMvCϑmlݾd >3CjyLV4 N8 i ԲR}T{/l/mKB@ӣodff帏-q!cz+hQO 2lZ.8Sf@MI}Uڛ᷎E^Ns2ܘ +꓁o.>[Qnj##H7ȿ6N;#_'3u 80dI#r`LF[:^ݍ!MIf%>HBߕ0leJ\lhI$IuWÒk dFI0?idgI,oJ}zpCD0xt#v܇Fc V0\4-VDDΎitą@a4gNڀFh?`rt +4k9=հ(/IS1 :,X}N8a4ӏnt +˺U"Ac0PڤtzA}`+C(P#@lbsѧI̹{Ǫ.7qǂ:}9yU8 U޽L8zN3h* +ֲckpd&XLp^|3VlXEyQ@zU3-_߇8(U + #|*} XT-l*I#S1%3G%0CZK)q;WaN#Ģּiݚ׫ e]Ȩח ]{*AC B1`#pwg}R{ӽmNy{r:BLFe Q(rF+#fmǩm/H$QFvY}wp8z}_ _78#wl[]OBf>_8fׄ}$H*>/p n*=Dv̫n\/,YO@28^d 6Dy"PH(bt6*SRk#@:0\8߫ñaSXƐ׭g(sXʻšvX2I݄j5QA#A[q!mcoŷlmAPިf"^jIͶy}a4!$ a*-`+\J85idL; 2tt7NN|ߥ&J;MGp#]ZM^С ^2u=%/7t*hZ"Q- qMڔ {# +VǏm#lnn._իpLlou-"i+^31SЌ6U RZX^T壉 BUf*Qv2rǤcb֤s<+\5kv׿c(!aaKaA;7yƌ1k,A~&9˩~ TTӖ+vÞ\jP'k̇"cݗm{*ζldJPLUUou ƶ7qVP'On~͍Z2mП5ёoy̓Ѝ{U:7#8YQÇgmm۷; xohtǷ\'cDGgbSmQ>&ݫ?_h?V rS^nq8 >ODI[ Xb@"Vإ~jphHbtv,!.?X>8d:₤ӟa{)0k2 y@nEc29Fkn +*-e|P '>Ws yx~9CxPq4-'j[jJW ?N?,̖3pIx_HNu &ǻsǃk +wc|Sbk˱F++la/+W 3o׃#+ְ1аVup8;w<ģ>g"@gC5eoKl/ H <:pD;DD8H'm2nJzNtE{_~?O_(~}^8lHUVw@p~4:-prioDu) YV8^y ›'ydsmEi+%mOoU n0YOKj)4*F:Ve,"D(XQ{DZK24 i'Ѥ_cg~Iޮ*љuKڌCC+ Ө,IrMWs(u2L>"2AhEA,fZwHon]qd-<^VʍvlQ~:iщJfɗ$E(9L,6l0ڗpݿ"63x$I Qsrf{t{7NQ&z *LⵢFY6V5l>&1W-0D' +B3SLO15_UOfNH^FbL/y#к^kus2[`̎a(4PjrA-Gx:ē@ZA+Lcp1X{a@qu_-+<kkjx"n&X U +T^2Y>dXk[G!eܕvP+ zbULk}Q ĉc۰VgSu]0wd-۠u4xs(k*] `7 XκI09W+/p㿦v9ku"Zҝ_n TqkUL;EQs##BNZl-Q>uj/Њj.貏.$1 + 5V#;ԋy?.J{MYg=aRfZO;x@,XomgN2+bT?rը7$GǭzDv6"fDۏ?[o=<[;P}x2{p ]'[GgM $?o |(xm1ZYjtг9 x@#i+k V@d&/z5 |u'7"ΚS8I`PڌA/_y7&zm^H.S 3νӀ2Q&w(K@TI:?qwQqp>"[~&c2ٶLsZo@^]X ?fSGG4 r= ctYtJ*="ߍ"mӌzW;,1r2hWNMSmcS\޴3LӢ6\ڷk,ah 1=߾uG1:"gs h l)@muu^(Gb#&u@{T 5Y Ö fݴҦy&xqJ3_S/ˑ^Π$xm>ߚ p|B﷏RǤ5s֭̓pM 1R<h򞿫¿)k'lraoI)t;V1QI!i.?fi3/ C&v#ú04JY)jzAٓYCRJLsnv-B2I#I{g.}cjj4a2|1SB8^f*j]=+ĩPxI,O(wpfr1[.U4=Єv00h +l%IBՎ rD+`%c@0_ec5/&KDwRA:-#Y{.XQؗY#x)4FL34{sUdlΉܑqHӋ5gUˊmܠѓ{LspD`'j"N9i#^ٕm5'u Qf +Lzw$·|*]hS +&CECj80/#i-i`2b|8YKkSn؂3¤g:I%` ܲjcYlr]ֱ,xI3~~]orlӼh%`.ޘV\=ooI)U;;[di81iv:2^C'YL>9Na@+~f9zA+,j#[9#a&HWB`3\ήT.=o(I1uJ;<4fbz?Bz aXlx3 /T7s8]c]A^e[H]m`I/汼#ߗ/ƛt6[y?Fzu(k,c6ӳw|,K79+gwGU9^x߭f8pcZj;Q̾ ^A#K5KVvqԞ:sX~#_RT:xضqװ LXa婙J%>׮s4n)3ѫhyo_UN==P^-LLwcڨ9MՊ\mI<y" |"~tpSJmo\*3l;waʓ”tf݌@4l@j&]\;&U=6mG)"I<`$L@1?ɞ)Mfz/of3ܲͩmbUN1BGzSqZj_=5J~U|X>3׬4tk9v4mǤ(? +M pεHAJaxٰM|}E_Xh, + S>l16~nUOcl|d +]8@_OάN`֍kܰB\ᶘ￯J P3%6eԶ:Om0Kۖy0TG86ma>SpáS +mJN;ݬC MrEg8Q%6v~밆~~^%O>|{5$R`ag{RmG]ښa2"e/s敇\Ss/3W# Q4T]ԣ'V| +Lo+U5rXw'b.qOF6 wY^#UD}$68-Gt\7Z[*0C(||B#P2 KQ$甞]<];"fJBQ22rO@Z">  TR[حe^ vz䋂n4R7$]E,F9T{ZEQsDAJvkB&?z#z gĥA9FmRa9&"Ηi3v>rA=Re}VW_)fٷAkw6=_t@q +87DN?-{I~RcD`T4vU`ں&28we1j?-іX:Oˉ.誙E}ּ0*ޫ. o(}]jJ3sc,^W}w&uvy9*lLf4@+[cnthl^cCtݴbi,=ɪ8sxcZ6('B$&:N u{(nmN}q|;yw^C +)]j[!PmozZÛ.̓/I}υeRr;_ <dzCæCn](P9dy^D 9T|F/mn #@ P1G>j\}aٖm0촇"-{(D4]\XW Pa %;騄[؊@;eUY>hMaNGr -#qmZ?" HcbS QA@h+6]Ǹ>r>BiF9,+lguwR#Y +λɟJct(ֶ_SU $,lim pKxtaq9@c\vB. >8FO҉s~;4rE4N`4 L.,Rd"MA#0"bKZNMw8tc}ʆ 3qG{{~b_nķBO&^":BKI_r`}FRj.Dzu{SI?_j{ʡwX]Qz!]Hd)JO4KD]9&"[&;ߓk]jh$iӬK…=J1]Aռlʤ`xkˬDw9^9(.@9Vs\6vA,xDm`wV5IYyE9e0csVePƼdd٧7~q1 Z+hˋ@)'4y]11-Bk$H5 m^nbB)Y6=FA ȁ8FG,`#^5&l.W|VStьAb;îBXb{qS977Zό5~e E(䤹_C{]e)u z[d.c0ch bHsw WyH[؈^jw7zꛛ)4^/smk7qsBpw * ^gk]PF0_;|^ݏqvF_\(9_(w:h t(nZ(H:'o?tpa`lPFKK]CdHuT--֝uנSk"[A,mVddo$m }Om%ר ^˶|o;%%Ky`51'6AevOU#zNPOnBl΃7~mppsbS/uxs\ߕJ);dm 0nlN7 I鳊`ͮ unuǶSُkub/_NGP3:op BDH tǨ!EVvOwuQa(`pd e'9#J;oib +E׳8+ L^N 6>?BR==Srt!?FziR #:ꄷfa [b9aCs#,xv'jWǭfɏϺ9{T֌YWtDS\L;qi\jMY烈=]vq,`2Cs럟_q7Fpo:T̖^G+GVeUO8O]<. qC:ff%5̹ĵXY- B/{i1W,%C㼣,OWG3̧ㄟ_Oobդ0RQNSZkfwoR!)N՝IUJ?Hw.WA_hǽ?HHN.S2;|?CFq~DAA1O߿{&e֛"A^Pn`Y7 xi7NU=~I /͌]Q۫}pga߭5k/t@xc? i_#6,Ӷz}!X̍;hesh8}/Щ'FHO#]b9#RsuAe" b]8{HU=U^NX֬t? jͺN|d+ p&A.xR^Х9)|i)^]vt+4 ~'݅f-gd kZ|ƶ&n+h"5.Qp[v,PY2x&mJY@!Brm# +kzZ)sk)lNKWL0?q. +xT>AT"BA#+ +"ZE=8Q3Q|yCTg;gmTHViFR'V49QmtW~YҤ7}׆4p>'}DZı$- ^B>2MwDk!qBRd0_[pY&lPw=4>uiC5)3c!&XןkFMǥ\pžSx7W\L M?[Pϟ6c#4eB (`]{g|OqXWb)mrHևERUO\# ̠ZA*]`r(.gM̎+NIr*1|x-'R<$F +h[M#0/My$7#Atߧ: m< %?YVֵaJC4-p +ks!Ba%jmbŒЦ@!רW +k V|B-uYך>2kܨe+{O 19LsUˢ@S3:aGOXSHjfh'<[]Qn1wumNi3 +ePz"ls0ah ;b~[Ͳ!n#ϪJ-,_w8L8r{ +IQdk5~@>Jz-E:|5xR +VsaL'^C|{~T=3.&`k7:;zϠ{Wj_D&lX8 +)Լ' +CE-'/kM<|>UJxF/L3Gڧw%Pkk[fw7Bß2Pt 6:~w9bZgP>qA]p/JmsC` [M -usV㽬ZIC䦰r2vǴoj۩%/O4ufO%"Ow@CuNrܘי_2h{TgnGyj&EzT+E;Ȋaq3(8v~/2d!@C$ uJayAv.2zSdZlt.O9~^?{R+֣yaB)P.E.~siAwBkMD +W %:{w4(v9C"kWGҦfnN<ʩ}:(,=v;9|FLe‚{O(auKMb="4pMKX! v}'ʳ da} Zolrj˖VBʧ>ɎcN g*op& qtq-Ov>0Jh6 +˚k̎wt(5еZR}6)~2JXj_iQ%֪bXT{-C+k>YmO 3MBeYH;\uu?7d~u$a*.u i4Faͱk=pHhz?C;TWLhq+ኂ6'ZaҊ#~+ !!v¿;gNl}m75=y$XG櫴cͻ) MY=7FS[Sx:ݙc߆R"=yrsb⫊u6p%qo;GwY竃δqr9B-B+ @ى{W!}g̭Z/+\ulhJ7Bg /,ZўN|?9.l/x~N=>IjkC::Puð^1Qog.Sڬj%bbNlwWɽbDm{HFKWZ0CjgkKmM}7HB`rcvqjojө[3-ۧT}b9`rma,Z8FP5g$)@BnJt[/}?I5=p~ʃ9YS3 Jz}-)kïGؘ:DEҷ5B9IG}z5zcOkaYWF#t_fKQόO[M^[*javs"uB֍]oFpf{*r;+@,SQ͔uJG/Rg!x +-ӣҪ eKn&үXnuOgњ{44_B +GKtZ)?䯱ݔ$ M73ΟoeYKiTج̑N%C$XzH +ur8>R0o1aY[;g:[b]@L-){64. Ё )`mlL )j8QGp c*&Ii qXrF\Y L| ${wbт8wXTVŲ5 ~ZbT3J1t^mi8Y#/BFm-HBC}mڢ6٩mc6׳ `Ϩa#U- i*-E}$abm#掩R6|WyO w2JM hP$9 xw@r j[052 pf$^F6AN (*gbIRv )@>.Z[n;1 ]>r唲>~a IzL:Ay,@> "(v٫t/ۭ,qFY2d,'GBSk\*-A +Qr3'tJͩ]K@ +yf\8-3PS$998K3b떍ŷP`~" _:l~6saYܸzN(Kod>S.q[c ¡ZtmX + ?^_hvӋQg).m>KĐ!aY-0 +/%wQk2EHm +e8ܭirЁA +AB_*b`{ځJ?W Bs$^ŐttBu eDSbQ4@ι=c% J4WLɊ!hKJt>{#-dw9B'*3 eH2 )0|e¾5M`oT:s:W1¢{Al_zm⟿BE̊݃-ot +Pq5ßB(T GgRNQJ͝]6 'Uq+0 sF胴^L}PdA!&X\£F\ u/{7Sid95zYs ++:"zH͑cf6l7cs`׷_~6Mxƛ4lx\icqqueT`j4LQʖeb6#HU3Z2hl'=咘G5B\SKU)-<3HNJ<G%sSc4>XTSsqi4x|Q;2%(vHM1S]F{8Ӑ"VǪ]?TtW*m7|_q>HR_Xȥ AqrYˢ~׳fd)os[}Սs*-o6^og0-x lTH3ϰ$Շx#2~~~3 ﮰ!_X<#}U2]gs0!89-m97{˞^wK|H-;&+9EVGFҲ@gD ᪈TCk =06zx`ܹ@ +}8J/i^t9i`W-ٿZk5uڮcsZJG@ض˄8i2q섘WggRcEm#z,%V}-A ,9AobS f\y6^]mmFu/2;),LG ][7:s?<@=|K $qfypVIUBNؔ3hkKn +W^0iBE[/,{9gP _~Pݯc؞k˜N,\WV5Q=ر(3]Wp\x+ZΨǀg( I=1` +vR^U`^|P}1 ;2ޕ.HRB4/CaGܿFAGA>-TD&bJ12eتh~hn>C]I1 cq4w.Vي դk gzFMMe?{1nj,qKc 2Ӧz}|jz9Dٹ^)ʹ3hIsrxP iZ͔˙xTk97"62DwfZtA'ݽ$fZd2;qWέOL 3g('~NJ-/L6 ǭν=_(>Ņ Mot|!a,}j U:>(o"D4E5xCC=Vq{i_ Ziޙܷ1I*Un.|]cˆ bj pOO(Χ'&N9*$nryΛvz7?jr R5f6-xH`BȖ""O8t#Mk(ŞAEղD簗7j^YA"Ss7˨LT_8 +ZÍeDFς&ԾqbZ\ʲL,3 [tGjqT'`X#3f 7z)Zu&\$;a٨SW|`UB9< 2Rmv{b`(d&FtzFt>teU_&N+1]/z`C kW\zF_ptPciu ܻ(jN \ʎ5RZ2kCh'a_x, wo7qcʟʲ*Hz: W$kFGO!uA4 veu9T}vj>=:mD(H՘׾*GX2N\Χ"p"^FiAT29=CEo< 0jź H,3WTbdu7U}`+esw3 hS\s89Wf8$% lZa|gNm|i쵉Ι)np@2~VQqKz hßЬT95;C)vldXb1kUr;*s_b݈.ؤ:;~QIH-HRa~:He +זn8Rć2pRĥ0|Ցq>[Ơט|yއP[Ffg灳㻝xY9`4~Yv,^Rپ-*묿T.VoqFLܨ!Rz:9b"Jˊq +:=5W51f7F(]a]]ɼBO5mT]mChZ=@yN'͈C: +םt]I͕"ãiGWA3o^ A|ݪ#ظQ^nɍ:݊7sOw7OvdGLhTtSP*{J:M~#i"aѰbt~yTq\k!Vh..VQy Z37atcفmʆ3]|弯>1wAJDη}ߘjC/ tfBk0Z >$#,ϼĮ?収wG[=\+꺊I=?Ú耭r\i #%:~ +JdW)Z֐% 8u՘{!oRº [9'zi^L 5r0RL>MOC !/8`Y&#w;ۨt==Sۡ'뗴됹T-cHsCY2WmՔJUdcU(@n),wLUiPD:q;;9#ti/augrMu8T]YIHC'!xWFvLN{ي}4TtɾLa˴A pm]\tC9³/jE +3W}(gvk%<à$9Si>t~|}J^fHM#K$n1CYmB i|TmX-=ISUqhZd1L9{WXf֬x{=^l/f k3tPݦPKV^c#ɓ6Ą ׏l<9fH3{a q[BWqs+XO-SKH,qey=uNDO4~&w/֍]󩅹-ۗҮͨ lF%1Xo[ʬ'E٢yBoZ~Y618 k!IOsyuVcmHlOx,7{EAWٲ\,KB?[/K@!y٘¥{dްNmBU\hԧ C2KRq:LJs"}b?ɮ + (2ÙPMT~;WNdDm, M;|!vzyl9?3w"zEhP1%p) +4mKf=aՅOqoG.NlҏT髋/_msee +hD"-Ex1/E骚ӌDklYfSڷ^Է4YԒZ}5%EoA쳰^6%ul.^2n4y,d|ㆢՔpuk>&ź9 +c\9ɗX0̕sSa=?8yf[OZ7)L Y#_rpi1jv S\*X:fiX/H0a6+8ו}U 8FȘiK%GPؿ6([I_l.lŐ 8SztT66U;R?eG?t\/!=,ݬ ] ; +BQfj)r#Sz^Dhio U~ʏiMl_&g{*:R)M]SP7mCG|‚+5e@PCTxΰi|mh/0nO/*4`E-lS^HdFd}pon Jm+i3U`ll,ԥu`&] +ߺ71)0o%|zaЯC)4a^Ɗ0*o;iB_w_3 %"e$\U$sUoiCfX2˻\ks3RX5~(k__'0Z/Vh+(ăXbj*3prIPLjc +Ga8f=̨Se8~`{kqwCc#4&/TS\)vWؽgS'т ׾ǵdڥ$c/"F鷃&=y?g^؉ wN5hV1,؃ +=*Ga +VHsJ)E <"{Qe(g]^>RjΨP-lJbcVکY. sv<s0뻗Y`˦Jw3ox_+)=SgH<&jgN߯!X6)o|<4E;Dx9عWIetRޢrvm6M}śCv(/59̉sFOF%xs(ֺ!STTp2ivI*#e[Sg \e!P]]T-;ڤ_\x2ٍJ '1kst`Z3 r-;.-Ҫi]vG+v`KQӫk4 WZ|B ,ţ^[%FUؖUiI?! opqEɵl;Za0Xus + Zi0Uzas=&OI,.q",Q\J>yoD +?d<~OQ0 nnM"l4m@綶 h*w'I⁥Ihdv:IX3$eǚv 6l-CmЋ- }pLsPHkiG){ˋoq&Il`蛞WuN::&36<ڊe).1<}pnOy#tdMη/;^SOp4fpUMa +;j3ڌ듛J6=`#0ZL6/,4DCij)?, ŝy]xo:eYpџ1tSgZ;P?{/R!X W\ sU|N7%~*-WP38b7 fb<"F_H\8_RjKÑplHݚtc'6nADٱ!;4e.mN,#`P^#`VUOnbY|{{v¿>0uIR^7$ux1$jͲzZ!=p?%0Ѷ}a\>l-sxnLW/;g*ۺhpKH4.m>Y %#׸n>҆uN4"4q`#ua髜[|\Oߊb<06|n FMRTZh[S((\\ucJSUOY30c# b?XyKwTCzRY|NE@čyOЄ #nBz n yxnxQx@ha9F$^^:UM]4[S6]Y]KkQ5sds=Wkz%R37IgJx}[^=,$qR +A\ܴ619UV>u}Ks("x\b؍"xtd|45>7 #Sٶ (\ +&%mL84tRi'HBrT|N?R41bi3E4}⒧'M@w/Alْ#ApdQyqsX~1?{\wy5gZyAYIw i}~k&B@SKm +PXƾbْ׉m׵m,齓q Ʊ$L01Tia(d~y+璥t xKoh|;_RӒPJuقg]bRk ;v45R5W$1D"դ$rec)ģϮ<\ym?t 7l&4AQ Mz9RdSt @ts"R;_qq00w'y6er$ 'F2"9 ZNdP(7jH8|<6܇mNgu$̢`!+H8OW)K(BxJ:oD9Q2R};zx˼K2Tm"e)u ޑtz_/.9A@5 TG3BڢEƚ򈔰ypu `jۀC|Z? B2d=! ]7)^d%s;j:oL^?:AY/>eUs. KM2UN<@L|8_/G0lcmFAX~3 +gn=r6q=͓XFkw;o\~P,T9)8qϩlDi8SR}imrMdep4]?lA&S™mz ZjȽuI\$+D͒Kv|s$Tt۔,[}n tTy{`Sv+r$yu(!h(׌`ٹ$6E$ŠBXSpwB/:;Ą`ɿ_8Vχ ݪ: +A?-Px 9`;A}p2&LIc5 v5K4UG8m64krɾsi=d8t@fmᲙǒdk/$?j)G-#NRi@ j9DdPf[Żw7gb "+#lO!g,C6Zy"a! 70vp2|d^ffŮjf&(ݑ`YV3nQ86Lɦ$$ ;]D.rftn"Wc$VK#eҏz5rhm`ǶװMMӋ"jJK6 jomZ_`uo-ʈfu0,9A=' +]s_aW;Qi$GW:]H׈B̀# xJ/ًfW@1`loq ]e1RDFxuS(X}:\?m]z`ߟ\(h} D˫xL(c$FI['K!-uȇTB* !Y!*\2M]5o{:*<Y; #DM=݁$Dulw7󐰬fxfGG4/@ :fzZ/ vm&]߈C]ҷV,3aٓ:>\&<F`]iS&OlM~ -Am0rr\䅺X@`V[W`O2rqHfT:dY +3!6C+{8FpR*>fʥ_; w4c/Ӎ^q+.Sb gu\Y= AFt" U6dQށ-y'^nU7*O˻tb;vM>|Q];xvd +8G ~"\޾h'; +Nw6;l,r4gb=;Vե9:R;4 + Qvܫ™{|?!:\$3nU[VPfe qe*åG_к`l֞*8l)] O߉Tp*efuBq~7ʿy]w&K?yKOmsʽA*5JGB4-fnQz@KEX)d]:~kW9b0auUfp-NYN({Jr b<A2˶R*ːDϡYn&SL*cw}? b??ՁU&7>m0H- nogVCiɣ0臭BT97-y9Nۅ!ؓNAGԌ +>XىD D= sD-4LBZiQ'`PM| ;VlwZ#}F5h∄2#Ԥ7kF:O^y"ϰRG^d;i+c+C>*\H SS{5\5"VF-Tk/fbXT8Ub|v"P%MoV6j!lݙrmclѣz7f߀A8amGQՋ7:%~7B7 -m\G"=m!4n^sMi4SzFSأ4m8K:"Z9[c"I{q91fSŲ"LnsT֡>c'Ḏ4N2`ab%CY)c^̕vz +8>InH@."5чTDsY_6MS$qK:"8EA=tMgۣ?6bXjpۏV +𐤤3,&D}L#pA޾a+цQ00A{r?z5F'm 3t>G<7A5(i+i4o +EoQ5`^HryKCDp?4)h-f,iFԑ`PJ\:) #e{m+7` I0.'( +9Cu:ػ ~)Ᾰ #Oa# P~\c:;UCc5%u7{7WCjxXƶ)Wz}RH?ޛƿʍ1TjB x wI違Գfq>WMKʆC[h)R@ ҾjHxPZlp+*'f.*E솺mBUIV =}{ qJ Ս o?'?%U8= +3ˤ9THoӻZOHcs9l#*NOV=eU-T]sfU5+l4vяY0 5lx驣zQ"`bwZMOs^y^!'J5:Ҝk)h$7LCl,_sSvDF?r۽ ޤrKCysnfbѷ +`s +݌\Pwh +\Y2œ2j.\=N6o '* TBZBdfsaUN͢“*bLa9CTZe5֯CDUgع8N% AT5:V@Œ!H,oE~մU`g{9.H `Or}Dz!6v܍Y C{9 (rTGS ]#tB?|/$:fiGmRL/8a?HMM)H +_r$ss^v: '[W/p4 ~W;. + Ei`nuT1ݜժ]vr9!^ju0Lk[(5KHӾDx8sO/NEbma[cowv_?X%C2 Dzf1H䰒 dACi;|EP9;&\j_UOú.ˊ(Z`d1B>ItnfAr0#Z>yAZXcR4Ðf1/H*<ӧTxYeV$Š$ kmB[g +OJ6= Z$4\[p9q/L8[ɳGjaW-0YORvM7UuB@Vƭȶ<Fɂ;IVfӖ3 R@GI>~?l]bs0!,m HGAF ܂%*wx"ׂmVaL2Ńӣ;q[:^?7epiݍːX.LRՋض}X"-zeoο%=bx. "2ꬉ ޣ T-kyjbﴒK(o>mY|{zW_3PW*-ڌunst=t򕳐B{]}'{?["馆竟̀ rQ7tz)ݡ5 ټ-؎jz0ȁrhR$일2(zmKк֌vM\'"95*2L + s +(T*3#hqB`=7 Bz\ó)!kAe*ԷékGwog0/2fȻʮܐ3mkPIrZu{3tzXiez69LĜu'6TVj3ˤ==_6$UQOpVߴ$ynXww6<۾Qqs8㊙sjK,lmV{rRK<~ɨ;yLcs9IN߆1NSj`u=mv6`ԝyf^^=B4 u +4[6]q7Pn}7WbrztV`x#-=L[9֠EǷ9֛8=_lQl㦚_Jx~Ԑ.#b$bmjF&0AgLg ]B +L"T1ˏͅGM(uhlM< _;~BPQ;n੔*'%f1T@_{D ul {hT{ßY3T:NJu +=U]8a'.% eR0}zgkY!?mRP<쵮٢|{7ˬASCl-xY,̺ݶVPvLpiwuK==]84ѹs{K^ co> U*x5Ī[H9]PW5X>=} q:66Nt 4Dl+AOvfe1(x\o7 ׬ M?Q0ȅ*\*F/ӽ}NjZGVqǦ]||>-ٰBk=tXcn~ܨ5WK Iy^yV]Fxdu*ԈϤ#sz+[2=tGo`30[4nAެ㠑&6o!o .̜-N)'an_@@Fxuu rMucg֏q;6kװHc珊jLD0e``߰ʼбM)[oMW\8Yb=Zubrc ':KDy9q K\ĝ6 }:U?&*Ț;7Z& C]-wjz{<6Os*DMPtf9S[8Xb0Q+Vх@HntcR~[t;pţ*&g)VQns=jbzhiءيG5nB;A/%Hvг CYﮐ6w~|׷7h#iXF{%1̴@r؂MM H"zWid"v_wu'Ջt|ڪ-XPo`g: zV}p mo+;j;nĒyv=tj98[?N&Zjlw~Joa{+ +۝tu>R4èg++a£{)x|+&3ubzZAB],&X$\&*)0/N]=ݟ2Fs*.[E? +dS$]nL2َM.ZĠ5ˑŲ N cN;`adߙ"VuWC=p3.y݌~:Йa*={>Z9SFޤ*BݱS!;!2lv i:fo\Wlplco-d.3@T;/ [sTOc ? Kӡd0wgz~{Y0ǽR* +ƺG:Q_`,'M.BA+f}K'hqF%])cR,Bun|.МťGCس]hR^:gfBMZL=L۞B9%>u=@v[ڊȤtKɡekQnQ ](kax>Fdߟ?I2l\ge_@f’@RsV56^i!}6m6 T,(Hmĝ8gFN6lΧc) nOe2LT7YDM|Xn vıWU.k1|$mмL?*%9u=*<(,mdj3X=-gzqG-bO yԘ|Q&c؅x r +/m[5읾*oxAv#jqWVF, f)35[Y+g~9 +2j +y̝?c?3V;AWˌc&bO)Q'G"C`xs,-s'LH)tyS&MEV(Uz9ݱ< y;L䞖UÐaZv,3 J\ekۚ{vԵڍQ P/m 6L)9 oX+(kf>!e{g2]R3*50ݳ'1GrCݷlhClH#A j\~xzԸU?F<?dۗh<3Z'`7K"e 5X MyWMWj!aL̎ &]b 4[ZQՊTe26E@M{WW]_]lYZ Ìyș'5n֜PZx2$4=w +볦`(F{q׼(mΕEVTs01.gHAjykS\+Roq߷uC|SlŸ6mi^Wޔ +=Q56Bo@Q*ۺU{+&ݬhwEb-ګzZ-$zvZv|5,bRdy= 4;Xq5`n.iե8840gvuM}:}zM:VqA m8ݒ ZfکEԵԊ^ĭm\KN CmF|v5ϭ@Ӳ@ _:m<gHT=YV@5hOSD72!M"%Zk8[odPkxp3mg&J$ 9]nG\p-+kuDq-LՇ;2TQ+L XIoFCTeMWbRt ʵ՗+rNJ#N2^AOF:UY %Ȇ~|~l˭'eYxh1mu<5yW_{~bƉS,w2Pδc-#<*}U(=+R#;5v#b~m>}$4V $-^<鯽ȟ0Y5!yWu%ΪTdCsnBo=Wd`,RNl F9$NZa r}ypl{%'S[** ugbc+$݊8w'eg.IRT9.*9㸹8bLla  /^tFGD>7a4SoxPwsl 3i car3J|Ogjb?\6&tRhGEv^hOv';txwÔ+'pU|(oqzw8 I';kv`:*]6Ck4l{~m1M9% crjփf0(:#_ c*exgC-}}qKO \=xj11Y 8 \X gaJ/RRklӓ[yMV2riAϝuĐ0,x@ߧrH^K'N//ݦE?@׹Er9CfnZaҪ(Ѡ[9vIͬ2F>ۓd+RyfqYwGxȮ لFp̩k^fx4;R5Y)!1W}u5wǾ ZLO騛VWM|[Upa屍GKAC6qh%هȇ[o 荑sزוXdpb6 AjmZz +μe#sN@ g+9 \Poyix?{k3'}8njm);p*tQ1r B:4 7X^Nf6G,/ϘЏwN!S|XT,QT|8b'3 `\w_RpnjVzec1ꉃՓbχP +bp|}URX +"ڃmw^FzY3u~}܈s$qW7j ^PUgd+z-GoX$` ++㒁kxHwz 9k=:+1\3ƶ~ ԳT8zsy%BJW+UD?]ٚ9OQ?6k=/Qc{Dk( >|r-jf[H%:YY̴щ)ԶEe!o⯾o;jι۱P|SX0@t9~pK}i`|iϜUAvsTe^G~ 7!+S=wqÏNraIzt}IY( \x. DfXN CTR^u[ILAz}K~t`/GaxGe h/I qp׈2c42tiFM遑 KZNpfAF g0L7u\N +oGmV2QfsUGg&IO!m:yyRKخ^xBG2i +"0]Wn]9tlʈ#RG:zڻ~p@1ټD<*g9rQ;4w@Hvۏ4tGw w3CB{䒟:=5팩`- NZ|b: J9 +jtH1̛VQbBnǾW5gW+\aC4ZIY%-|1^ +{EnH %%|Jۄ53_tjĥk#'fz~V[_ /xS:emtdKS + Y:kFy@;5M~It`tbpV2Gc~7ipN፧eya{r^^si!A>r ~~;oðHR;%Cij^+K~ "wAD1!S;]|_^W["D*sLX_gUlh\ݶ}O\YMFpiWiT鹭(>*Xl5VҧYlt0FOAe'}kxWuEIkƥTX}gGڹj~cɕ~zh_OqrDTfת6Yyt_]M3ipݴ|.X%Ւ҅nWAwBY/Www0aPluFM<L 1DcД(Sޣ't\r7(tmFB6*o-V XYY{ +%&/׽=)`6u/b+ytx4Of##a'<& TdְYcŊ J%uy=>%nKyNKgWmv5ٖTV7i_2TAdw3#齫sֳ+l:pI=A>nkZ3 r஧>޵3Pq-QZC@:~e'|R}lAo^(qtE-2k +뤉Ȏ[e=\ }}~ +eXf +(xirḞgQ$ e5v-Li6Th3k;z;?zN͆sM%D[uJTK1 $NDNU׸,d!o]C'}sK濜' B 7ʜxxhᗃVͱJtՍ8nuYdX {єN=+,ՓÚ ?_?.$ç_2+~ƓCTkA]7w :~s:*9*vϚnY,WKg1F2t%C5jq#d||\"=њ{Bya? @lXz^T2{8꫷awYE8z#m|\lU9g0M%:L21OZJntOa1 0#KC!R<ve.u(OH<ں,[ FŭvK󏮓B[ +RiR,a3y eYJG$aҀO^LЂQs.mM3/ <.^&P!}DMj>wmg, mNm7Sj#"VD^AQSt͎p"Pv ]D|-^@ԗT'LZU5s+^hE>%3MF:;W:: a Yw I1pg~zY gC-4|N+-1Z׈j!xJN+gIg]R*Wa/҆p/|=Qsi"B"YvWú9.g~@q:6b5>ߞK.l h bfH+WzޓDBG~t<$ +W$\{VAˈ փAGI%L5,(Fڧl캛sn&C|jTu8=l1۔-jvv}l+AfX/1XD{h__@b` J*\@"UsFUkvFDpA*q7*s⋸)Ghb+0 £f0T j#/W.Vb Szҽ~0pU&poa3X[(bEkJLp|D^_dDL"UZvjouW ?FbjrZ^5D 4^@.{u.UPŴ}?ĭ?L[8jE =!>3Fx9UO[(\ë̋}l@Op.K%LYǟ5>enc~<~f655'5r)D۶,5@rI[Y +U7^Ku;-T[;!f*|‰b?fPnAV5,+`jAoxLb QW:u_'1\WcP^:B\"6M`5>Wk4gsFna״ʷ +;9.ҵl8NGG#EG5:]?)[Ne΁p,\/1U{G˺'ADHT6L]Ή |[)g2l h#[@;}6h&cT3;TVx"w i$npb72LOh!svWV!CqN c͸ۼxL_u%\J>e7ڹgN ~7a/ +- Z#}1hݵ+S^.ɭ:Uxr{[˓mI=)[v̓Kl 堫>&js,iu|s'0 hB7Nf{-^6c=m:*w?IAȓjKR#sYXgFENnQ{HW\Ú{Gl8 {mCmqP|ZA)ŲcR JudRwZShpαa&ˍ {ȲUt*N(j:u"޵TCui. ӂ3#ESr+0 +\>-=P0Hisj3V^3%EʫZ#}T+vHjl!,t\R$DE {.p +X(5)tc;̓%Cbb|6\Fr<]Vbm +"mCؤ'ʠ*ocYڦC_q mR)G=f$T/ՙvZwA En2p7١ Ian7:Kzm#Z喺=:hTi~.5g|IY+gj:?r}ۧRpÃ\d<_~:@T`IC +-gp=( +<y;kjTN<*:>|jIS,N[Wk|7{wюs=(x54h}Q7@wD $j],ᥛrZ33;[[_ +T$@WH_Gu%I [v|[DvH$M$'OEnX45rcFG*QRsO7w.[7fO֝ah5Lڮls-Ƿ(&VC5M6׺tœVAnom_׷TOBJ6_3cٴ..0T%PS-Cؚj#r+r%@alNm=ܴ94lX G>CU3qAY=sΔo ^ְ<`1XbfOhH}f;' |MxS'{|ldcFsHway `n"ù^E?=G Pz/ciz[Lz-}'d3]#ht+$R9w!^P8AS˾ړhCiK/( HCl2)A(PIQ )%_Lчk{OZW/StL 8>3>ÓEHV1ȹOqtල`qVĀQE}~ܚ*ߪgL4 Vw-HJt( +3#~Qjw?Ɍf.twlj}YP/t%8aQwza珛t>Q=H}Z;jJD[IA֒VTѸj3vSМb3(&Ih6yXRt-kɧİan욭x-jPIE 5y z"V)RjT _4KV☸ͥnOoZj{rfғ"ab,+s]KO71Z|;޻Oɵ"͜1#\fnKn'F2`}c={bvlԦd 4 ^5K6z+U= +D1t>gڬªBb̓WrFd!ن?i&2D7&w4`y}?.MX8nX M6KX U1~r1 \P$K3H0[}kY=ZUl2$(N/, +Ӿ}VQߎZ-Ф|2HaTKA6˄)#_6NU~]N>1&)ivK \)ֵx]QI-} '%9!'y]a*މeIէrH̯f+c_2D %~]rD񵪛)5!ep7RE@7Agʷۃm/Kn$Q|ZLȜXh㑻m%j[{\A s;eSR5`}}ߒLwB\ta `Ka9 9yK?گU&=l|^g,8XUR!R F=eL~xC%ޑX9Q3U>尠Zp$dtOU@8߂%o-Fe@,gfS'gD7<*|OhZFra~hsȏ[`Dhgv'- L:|fTlrf~#-2-7I|*Z'˕Y3lׁo,&Ј;Y1KSfD $SRcxS946 kJ4Ỗf634t6wJJIWKޯcbXnsgy- Ѽۋd"s]j} rZVݯ!MH/ +ݏf 9+Ū҈Dza[uo-5'c핚0l%HߪVcfhٜ}iY _=BS^.Y8{@! '*^c@c AԬ[h2h +"g3M둎NeG,7˰`K\rYov*RƗUtsLtQF*bSsWɺsg$tq3 ? E GU0 ,r,jX8q*(L]e,Ztpfiw?Fi \nR+*V*ͽضOC\ mFXՂ:nBv+}6tL[L!Tk@ڴ]P%ĖLag%"'ǦD[ն^Y$ +扥!5[t)K{eRe鄊YUmvm$wL3X|\*ᑦEc,#ө5zE`m >C1%m.PsCWm=QoFy=jꈣlPfwofaCDRUanMWZD2P UnQ5G9OD׬_l +ZMEixo4Xe$,Umb;w= VtOxk% y>ČE [YM{[J]L\5$8Q40@#~b[!PhF_q<ϒv%^}=e@OSjT}nEST@(Jl>2mcQ n>\a@ӭN3/#"a/p|`9e9k ο; az—/*@Yi!4J^uJ=4@K"%[c##+!l[(G:(<&i%TuZhctpY0' Y6DNH+䍁V ROAm=bj`B|MP'JiY J:]pB) pxuŲ>#WG3F/eRDN +3e|A|tG69ޡ!5oxZ5c*Wt:( D^pMP(4~%aj!NW?E'kdjۋ<;l;Z]ĜiD7n}A +&6~IQ]Aa@'+A .qJ9kh&ޣ&AhpmM33Ufde!&[evd-^]V-W>VMmTwN{Y+gpW;N lxQid'&{i˴us⯴c?xsR*QV#24ߴ +Zi/G9uE(T3>9历Ц`&]-nc(@͗} +TG?t{>&Ezv '9Ņ/tqX)+ת;pm8|nyGydqAtS$x>GI'mZYDaȌa̚)V7IiH@ n^UOR5vוV\g~:lwu< yD{tk/"Mw,j::P" 'KOwMf ϋv DOwX]86Ӛn+TQk,zdSF1ʙ!=sLqoGe74V䰉kFFiLM7qƉ&`VL0USjnw<#hK6vF֍py|5ŕIgLz UISz&)r,s6/}*1g7_`v dLjYڋY)R`VG3G\-egdDǺqamzVw{ +t?g5ikD7;@Nc/M/#{zbF[k8JBzh;2Eģx\ڙ_BhmJ9m*tiv:~ж s*,Z/{ԜɭFva,,_ܒ<'l^.yFPFk{*C_uۛۺtKpՀ}= +8-SIW4ȁMF 7IT-b4aYUV+ZsWԻ_ C +jH=k ZX;ǛzRՖS-zmM,\>(Tá-ж6ial)KެEڻ-I( _=5@(o\m_k-r1ꆙM6ez2i+ȖXUAEX 'w כ>e٩c25_TL OmiT,t TfΕOf6'_˜=`WxIr;7ȀuTޓHIA&w߮>7'H=8Ν!(`"l]Q,VL -u~> :f3{HM⑨92!]k$ӽ|_=.x\eUGjL:jYHےRP)zhuV `6SX35uQ4({LY?;W(kbM{e5kg'X>'Wp~!@6XR9o}jB7eY#y}T_8JN?Q*QVjکǾv؆-X%͛=ZR@]co[HBg#!WTdg1d%UmezHmEڧZDvWld13B>tBYc!G*{R+vh2< rX D3`!)\T~/ft3R!'ˬږ%L~ZDܐ,y$jӍ 8T{0J;h@c9J3}lwLn>wPk$jLQx6&o,M]"4!xv1\} wm7y \qYˮ4zN*qu[B"h퍮45-zULj=5.|9nK[$Jj8c4VϺ&Q wRJ5o曹tjvBÓK{X@FězPl; PP@L"kҙ@x[*-04tgҬii; #D* ôtʛJ;"ͮ1g&+H|ڰvIGc-Whz5 +J<&*Y촧leչ!ƾ139zP.jEE4lXh`]Ui-O\ن*̒@\kN;Zze0F]TM/8j2{tn+ǚI#QPہZmuZvh$LGdı؇^Tۃ%:U1,jS4vO G7DP';#\qLDXmcDfvK}B(y!hŭk[uO ~f#ښ[tD2<8E|OBRvɈQGV@ ʤihbd0yrG^IVABe]ejO|ʱMhs",P5 r%Wt `(<ܾ'D,~V~iKTG-yG`jF(]Q0wV,>ptCLPԴUEw@J w費~xI5ߒ)IBfGI:<5`DSݵ &jxXucHZ}ȻԷb~ߦk-f͑B-l$Uic啠 wEgդUv~bGgp<UWH)*um3hpij4tyEAi`EwHXPTׄ*@:똏P-)mcjC,cHû754{PPap($H;tX/I}.2$9l2nMV2#P7K#ՊZttZPbo1b+չKam*d?X֦9yeSEp*r2){BZ1vd/A4ҕ1u:M~IAhR g((WW؟5 +bےH;+jK˽[q~-U#ȕmix3Z=i2Š;̧]xXΊnRcXN>P q5KP3/ctMg'Lv=/ښCƤl@W[ϖbpܫiN IU6Oj,dEW\6ÑP%k/,k1tJit:٭Mk ;v|k{Xx3LPvOT̾2@9էf֛OxѪs19b5R݇# Z{k{=qv&I1y%4.)@N'/O'NN\J{A8eZIUF#M:ٓ>..M~$1j:`kpOM@'`Z/?::+o ^‡{;=RH *.kti4ZWt3X.2">uJ7/8L5ǁ-"<`uڭ6iU? +P^|rY8.U ޅiOEw\f[OdŌaiz̞dhƖWE͜Zݸv:r=С =oon}^fxʮTZ% +xQt(:i|>Pz:=ѧY +8r.st{tvꡋm:K;q뵖@(P VkNac*w9ܲQJtZu:*~T9:+za +崟>$#hYiYlݚ纮?Yztϖ>+bVpQa2v9w5Ph2GQAY j AEC≹&baŬ8wW\?n,׭_FV饃:N8dKv,ʃFhrpcֽƨɩ*IЩ +Pa vm>>j'"d 36|SDrE6!7}waMd%n g7E{&<˽We?&ej(1.6 +띓d$T߻ $J,I/|cowjAkÄc?_+ wHxIqVMks^p5oDܲx׽ẓνtyGwuV &F$a'W緆cw alS\>>mN@ 3b4g{5õqÅY=t]@a zY")ʼ t2r v 0^TqJB?JD避75Eڢը59GUv5§z%>lⅦk !<'K_9$uAX4-/:@ hۗ3'rUD$Mj;lHUQsa:{A6_/ӱ +̵w*}}lg&XKÇY5v*W뭤G e:md]NWNBH#ň."V\n<(i)8u4~̗ hyirp(a)C>uvV4%)D 3չi=Xϲ-V\?Lx^4r^;0:pO/yU,Gh/5MR5j}vfprVEZ8)ϛ^mR4_R]K"i==Qj&xEQFN_k[+ +5r`RL>D״.ɞJ{=;àu1n`Ihq ZʺQe/W vA[._Z@aua6GݻL! MJt=+%`ٕ%q6NĔ}%\-;Zv q&ަ~=JT-+hHnGL:o :y9~}?eJ^ Sy 0Z)ɩ_>(GGJ")3bs +Q +LSËJ;]fOiTJPoͱ`oߑ<(^pk*A@mmBi$mݎ75w] 4hb7Wc_%ɍ {B(g6uǟ(%mcd&p^fN@ӉP1 ˀy8WD47 !2p]L=VpiOgΈ @5ثJB@ *(nNj8w@ܧBuĖ`79&kI!ҌdHbڮ =Wsx33د;yg֌膳^g^rlM<}1|* wE3> Sv/D6 V)ol# _9UC%T>POC3ANyȩI']c~29T[8>PiY_ioD<Ɍ+߯=}νGZE*K YS/+rqX˳h9VlF ”2 %eo-m?HРާv('!@Re0.avKi& țwki`Ghԑ#+4R=k=ԫU"L=6"oK +XPY ɣ#p5&LjhJhG$6 +V`Oa[ 嘃zq]qLͨ Va7C7'&GiR(plY0zFLhțR.֬3\ZZLmDJPqt`r䑹`2tHK'#ıKy-M(yqC.,Ȩ{Ҵ&LntRuRbWsy_j߆γ2d^{?VNY3ux5ˌɻ햎D՛ó*X/<{Z{DoBr{oО2ہV/#_!w*1jH0D9K9+hJw-~>,;tJ<IÂvZY `+>Y#.+paqJ.%msV`d#>%&9!~2KPT#-R;o|Կ@26ѧKZ׾T"[lkpߡsl'8h3X9>asm.Qi=nSUfzu$bASj=g5O_e8+-Rؖ4\bkIki?o|l.~ߜT^ +IKeNgn27L"@Le-gLmfDIAt# ͳ +J~H`Ōܰ;* /U`$^SRݎmتʘr!x:*[)Bou\t.糎fZzʼw4zUoUJp&v_#Ξ#E| ,Um5w_Mbɤ)ӑmmG:$Z_.WO{Bˆ˶x0*Դ⹬,dy +m؃(NBei SM5wƀWbPrf4o~laD:6<`{ˋkT̪"1Ί ?e2:6jLeod^w|tsnrDŽ?w%*oطC)N4 +u1:|\ e{)ajW-v=tzniYG4zI.Ug6lm\WڵLQ3v ˿)y9=Цϟ#yP:̲n9T9U*pr$eN7\<.TK*e_tj@V]ZQ gqx5zv.y;9ViDž9իF .!{שgI}m 尩-5Ldٔ0~r sd6E˽o!R#ݩj*ECϤ7`w;d1ŋ4)8m\Z x} +zj, q!d5mqx te= Pur\<#Sa'OInHd97UHKڂ[=b(EXg*8A1$-7bw~77ҝv{j&CIJDzczPk<+ݽw +5`[C%zߪETcl|HPk )<~pG賜7UܬA~UcA u',BiM#sd:kWW7!Mq2$$C0=819MdXKWkE~-:R{f.zdxzz(SyN˷S!%Fr_ZQZ3,%Je-)%j k|: ,Ofb} +^JCZ.d&ZSvDqx_gpa:?<Ԟ5u}A,TC,:yv&Ef^t J9|8m>9o-xfkV_BўnIP%jeۍ/LLqUZ8‘!,$Q +Jy0ٝT0^y6sӉK :ʋm~bn&K +F'چ@aP#=<ח7;kB'7^9K"U1 ;׽όw*u5Oz!-p?.fe5OD$&6`ҊP\-5TG$N ?}wʰe}P3|4D2w⊝͡q:YE?xhDz+璱8. +in]o/yS|nnU)d@AGY[0B.`bN.sk LkDkaLk cUe2S?HԆ>E(E[aP6c]Y'#^sg^XiGqL9,2x׶5O8v&,+|$eH*iTaB<cce<F%c"ȵZ{bjOv}a{ tF[f.1Bq핐MGT"Mi(445@ +&ovRt0Zϔ3$؍d.jn&F[,ZWJk:Ʉ5KqeE+')P(|(- Az0UMOF1l;`+Kll $ KKe~l#_+3ʱ/[Pܴ)C?ٚ˪et~1;##p{3J0`v8{b3^CHݥ 10[r jLW#d8yYÞ(C$4V)E@;i0us7O^ L}o +O_jS=)^oMERyX@~y4S~s_;! _Od'ͥGwiG6Zs\&yd@-2Myi4f[Jc$lV蒽LU_U9{EhKg-)?ݏ,]ؘK#YRĎ&ͣp;FW[|&«bQ|v bh.v5J@rD"נ>m@5A?ڰTKW]PxȈ,R]p9t?rd\\i/\fdCNI$ǖ:Ż_|"EY`Q^nmJ*;(4y -*f?-H6TUIheKs`Fɖ~yU΁f*;dQ4Ŝ ]~m8[*z*0FjOhH@םOvg ++t9zO3Tnue?l޻jX7sb'f!yTRpc^wWE"6[Z9,z許Hè]N*Dbс׏qzz0Ɲm4Xxs`ٜ܃NÞ~L F;Y5y<ՙ8:l& 03#nf`.#btC-hVSś"7mndL)HL X&cy—WvrL֓kߺ79lUJ5=<К$a\tI?\ +^L0HI>)VwƵ@]`ɴۛVhU & <[=&yʂ*} %f#[ae<uVZ12Iѭځik`.CIn3EsS?r%xW˾ُkxtbji~c銐2UFd; o-5eYnl;͉s 30p=`1 ӢcnXV}cN!kK'kHֱ!1a Gk5Bǖ}HIݦHZj0=%-[=uNX=kݧבho#D 0rFi\Ko_FJb׈4_nw'>Y0Zxzh84)SN}x+$:-ЃMu&{ŝI4:p4Ko_٢C |0kNه:S5ϵ u(0I(\0zt.1O s܎ʞK>'k>tzP"*v +c=)a(u6qHlDF`Dr"?cS3zo~rThavj +另H=ԩ=Qm v蕍 ElcJn*un` lN @_W50rB4r֜`S%Uu%bO1>xVV $Sg&tDshol_h 3B{d6ϝ w󭶝=)$SKuGԜƱI$d wĢ l)]ׄ`[$cp^m*p=;2EnFLNӔ܍4'oxfyV3erLC?#Ӧo)?H` p8SRfLT` |&e.. `#-a9|E(iݬzج*,&Gٓ'TP.lÔC("wN!~ގz dg l0 cmooښK}yL)ɵQAUGI$/q#b}ʟz1UN~_[5c:;Mý'm̟H/f+,릆fs5 +N9 DvfJ뷊w8W?>⬜7:I&ab0 IW%([Sh)NVzSvCTg)v܈ZZw@׽O#6J\T˚83Jy?g\{+T]2|>=?޺H[v=FI07?ٓsd|Lni+-$PeDPw6\>f,9Ň.Mk忴2tmKаMdxsǩgccL0+s3t9QISݽJ6tsxʉĄ|skquug03V#ֈms4"5o]l7JOCt:c3_}X[̻Aߧe6c=( ܚ&_:+|noDٞ՘s̶jTt4Re P<(wmt0A?euE&HTn\Qo1]ԋBܫ˄qtR! +xF +wOYj8)G@bC ,uTC~@)U١% Vߞ* L%fipO> ǭ9և4&S^.I8)j#;Y-eִYoP9?'ǟZ9뉆]L߸H׿ +Țj#FN[|H̶P|p{fsTk޷!cJvG<ŎwKFfPJ즙(ji5{VX$q9q&mOʠC_'P )~6AoKtied0_ +x6;`N"1sOrv'N)jwSYjU1 +d:*V1ݣ_w;Mҏ IcJck۴l}NWS3dV\m۴)Ee7k4{*!;%w*m.De,@6eKd?+v~[Uϵtb0¥Q]Udf0h]/OvԷ&1>t0jܖt~}j#K1E]{Wa67ׂ(Wfv7W9B"+lV UO^xzd>^q/1KXi^~3EVDBkӯÔ|K/)?P9{SHר3JZkٜ4.qj)RgU9LםR^0ycU|m*捦 +҃UޓmuqX[xT]*0@DxuBg Sa ==ݡlYd!:v)R){=ǻ4;z&?jWCmGHp\<t. i<]d7}{9jsK #lխ~VjQesscj>c +-~qoX}? @c%y?C7Al{[ 2DP5DLj*1)t&I%OEUK%/D4a"4\]vxA6Cˢ-AME9"Юtt鍶@t&C.fA؊lKC8WGI;RuӋ\x}E+6|1stªX?pcmXe ̫^ C}t5d#uf\P1~Yz2VVS|S'Re,s?}p,as2vdA4cW^u9ڣmU$䢗v[Ө7 ,p v3,B^4)״~i'XV$ݧ`` ;ש*S@̦-kf;D6Am@@^ZK+ jWV^q[ +Έ#Q;v"4l:$qqh?j 1k!2LlqE%.amlKm&+C+\vyUlcC.FF`{ A#q16Qɘ8iL뉛vls>Z + _ghWe|i=(q+Z isc2zߴ \:KRw0zߎG8i?qt_O-tln]õ̋۱NieA~0nQ* *4)pU~kB7yTFS8U,z\_άpW49v r"$rOy2ԲxM$F/{vC6#ES#;M%NO |3n7Su!ew 1^6 +PP!5T_H\`CG#HbN4f1M韼) +U:.(`Ņ!KNA{ Gؚn+fhAeH`zAEVҶ0`чo6eg~*P*i6bb3TcP6@4Do+A1s",efB)Z[\˘Zj57 56l<۪DL;7+U} #5 QU$aRWGu8/26{}b Cvuن|I2OF 7ZZ 6kg{oOaG*E??l9@E`^6ީaUfntvXv%`0tD&섛xV[(c~5O>,/2*e4~>UZAeϻo6/j/rRT-#+Pm ?CZK> C̑ˮFշ&ݪU鰒v^5:/gt=Y:7VJm@ls X2iMzxpVjva(ݿer{S-*s +*cGh5@+ ;f넄aP÷h?vj  {mͻ}L'W] QD-(`A2;i6S2po1Ic UOծa쁟oq?^AQO=yG c.6gOsf8J k24^s<*t̒zqS'rGnVGdŪсIA:~q26^i꾱G2TfPTJIzϓ +nEH3^>#.>F#eI~̶ {\̷jgU& R(~J_V=0,63XC^O `ïw[@1SJ(-YxUr] >^%zQL?{ipgRy^mVqi<3pJe¥+<^~TP|_6˚)>QuOTcg +Кt,t~ g"^ޭ<4w}뮙A;8<FK΄P3U`9\vVRa}# +b#57=D/V9kbFi1%C~L`C'%SjZ&\"cpMP-:*:10C+ B 6xI3BE]fb^p֋4YNG i_d¶8h}r0Ls zljĵcпfwU-!LZr\"ien;= -{?XQ;<,zuHl]5@6{E}(iء M6Ws<תT>h7Uj +|<}$dTí@Nicuږ" =8Ŗ+.xsq{0ʢXsKŰ{TW3%%\bc~O+\8M`9ܰQi&?Ŋ/5N[ue3N(c+*!V0h"N%CMh_¬, +l:ozD\:^;r@8q;o!&42ζ}GxiQQ%Z6cm:Tlr|BZ|<=͌[ʦ/ >%k@b4 +>;bn״\ ZkIB|k2N~kv@j&-;L:B%D8uj$= ǿ'P +gieǸvutGN>oV wT MGwRA +M,j,.0Z}QܱFN /@E|ыUtC +bFb!% ߽Lr6s#Z$>:T@1> h@]҇# A[JI*V9|$<>C!U Ŗfeɇi#$PM9_^Bb{uc5B*Ui0~PrB %\9MAiFR +rp 5YPLa(54 :XtQYea"ŽS +>?{q!؋ $ #$(S6zabqGX&Rϖp--|/"WG( +I\'&),AB +MI |"N7_]g)Lt&JmϡfG{7ʫMwusps= zosF//¢~ `9ϦKs} |[-DTm5jgŬpc.PV:wV>s3 vsֽ-SD6/?p`({`;IutTgu # FzN>9_mW)dHݟlJ-. rx,(IHpߡԾGda5&37fxfdWYB? +g2.`pdqOƯ7JyI7hC#sQ}p9˜`|0,=̣@:_F^X`a>ZˊXiA&9 StS׎#؅C]YvݺM,%PY" +fVVc{!#LJ{zɉXgCE5үtJ5=EɸtZ`n5,la>SdwV?4,L7ȍ65l)4Mŝe%$jjZeO0K|6a6~^T+պxt& +oJ5ղmНB碞M6)]7YDKcɮRgo߈K^MpKlua=@-} 9ᭃm_Mh[k1c.z{J@d@vqn}!bP MdN88l s @4LzmӨ3 JrԦFKFD:E]DΣ,svEln \q3౧9r(_Q΍`cQa{˻Ϟ"g0iU}y:[}bɟ͑M>6UROMPf!l^ho-R +ޢPkO9ݰh'r-N[FUS<}$V=YT½-jŹN +PfeR-/w̪N!"m8jvή:\hX2iaƝf ڦĞh1fvC<0W/ksԐhoBkcȓa֣ ac봿!U^Pø> %\_֮ӎҝp56ղ"$Dw]ꃖ'Y 9Oڎ-*g'-rTNX%$?:I<[-hN +dE˟Ե;2oIvIz>)VmF{WDf 7\bU֝{ &X Wݰb_%=:4:O8 PU@Zωt$Wk,xNxP&߽"{&T6O~›h?b*&[5Yi&0VS(wxqY_fw-/y;HSD =bglf϶$k>>scĀ0f~ncل;cXWul5 'O?=߹}JϨ6_g-ߏL'Z>$[JftfUǮ$h).7Wo^1xJ R =(ZڰǜaN<ɃL?vXߝMǾg*anI@h2jC>t>8%o*jLAX̴l߽Mt0=λne@ "(6x}͗=iz~^>$~5 !(.n/Z8Όt.śeC~T$֋ +Q{T%C?ѽ^ :|>Ѣ*itLs-mbez?LD1On8ÝzX҆µᲚ>wL\nly|Z +ahnܙufTqT PIvhFǒґa{EӡirR=RMtx05 =mڎRHŴvwT9?VmRM?dH$m-8((Zq7nKE$¡MO[+%`|/#Zƥ.w7)wZKb+V"%)cJ2b& lmr.tC- +b7qiRqKSu`se]ygĩVc#|BjYƱe]yթ,0c03^ 팞Ҿ'Uյ*BMPc;rNzKx(yҾ,;qVzyBaF%zqT#+lOc8]d{Ns< B.t $ҮFI{d#P@;/+mK}P)N49 3XkE /itWPؚAe A3F/}'~zPӧj^Z !KϞ7l("g!/T8uac OJ>>4> r ioX~FϨapKd)8-\-xA;&p긠&`*9z␕Kl-ɃkE]vjc~҉ףۗ`mmДwri*uaN-hx9Cx[N e }Bpo|{Ǐ[h{XbȌseA%I;Q7( 򫔶%:徙N2.j}–E;oq|^(Y=Z <\MPeeF]xif8i5x4(4\ۭB[Q[@K ??̄n9}j"jE\8_f/.w9F +PR,-֋@)I"D۲w{aݳ=Š+:( ik +Van+:狙W@e~}SH}W3Y3ʬ2Ѣ⫥a{ݧ(Qem7!1|[9t{5M(mdn5=R_/ i;I- a$4 +5jmz:рyMpZX\6m9=YA0Ae"]Obp}ohUIdNCS|QN̢["E~e=Pu!^:\*;:hFK߽rkEu="@ 8;=ء `R| ?4 .+y9c7A隆PP uڵudqs,JLzS'&4a-훼+1_cQ:?C? ^) +P5Eh^,ϦF\{ ANx̺V"<ïxh窉g6z̤loScc4i>Oɂz|Ɂa >No7T fj Cd91x=xs{/&"^Xs%GWIݪ%)L㍵e]1zJ聡.0WFKFʔx̟Nv<_ltPZ"M<ةy>;լGݶCZ4gr6Y hlM&0j{R dakHӇ.wQz{o ^SyⳘu k|x#şm9OŽ5Y׼;4$r I L6M  'Aݟ}O7fD쏡@2O0D +zMݶ2vɊ9_.Uj1O+aOv<^fW†l{z~83ΕlgDUؚ2gtf"FIϣt|N{22gө[90 ;HbC`5![*Z^*o;,WgDx6vt1 W& IDuDyRrk4 /MS[vac$ܒS>۵ڶh7멜oit΁K9A.4@:<[5(g\:}Fy_hJQ8TxacYW/'z.W׸`Ց04B>2TC> pQaeVC8abS} iwc[;`RQ;ܹ"_%IYM&~#mӄ$.>ކ6n,Hé"ğ}۷7GnEor߶W0|EY~lYhaj .nO<m{PyGK1n$Coeg5C󙺊iYDy +ԷK t'btI,,} +-Kv6*NVT%tl9aDTuʨyB^*xub8՗BkC-eۛ(v*.m0ɨ{4u2ryPdIuS²i`ż։9˻ե|vE?_:H ++W<b1yիqPZh=ln%=`u}R +0 uu(:Y8;vfeQ`f5%E8ݤi+s1D ,.סK]-^Meݤ +ab1-CU-P8z˵P'P?g kb)w#>"}*?MTX':V,4wuKYEhhN]M=斚dVHLHXMVM-=Mf-7˾.@>P0y+E fk{_̚WUp(бU'_b; q]]jB,߹0GW~ + :cCǗ<-m];jN}iV圌$T1|DߣNý@;-L2m;bwAfr5\Jhk3ܙ) _t\t5ύy+^(qȟxdF0q`Sq ~/U!H + +R7*d/@/ 0M+kAE3#1V3՚m˞nxCi?\؞p7X{ˡK̗Nr!WhEJq8ΎSTT`@-U8om0ySO66 xߖ 0 #36'h:O0)Hzf;>7ZA~a;-TO?)E35s7{|jz^*&ri8K4niy6UP. ] fAo5oZ xFg͞mw6K(!!Ki~[/I;>?UUVԵAs]?`!s<:OII{X5$/hIfAbMi^?t]7LoK]_8=@s(kBmx0` pN39QxOFMC2I;`ў]-:t4"XG-I;-cMr*d7 Cլ%ܧ11l҄u12#FHNXkj|vӷk1W( +4sT!|W<{ИaMJZs˂A3 +.nw[jJťh'aF$։ݶWC\?p3q^&1*—ʱ}Kg.g\z#/ ev>s^X 7)vTѴCVHu޿xĤD3~Ǐ1D2Z??}]@u?K{~zf {($Lħ6[ 'n6EWrk,qeOyߏe|s~B,UT,/֎(^LotC ä3J۶ +~/Nх7(DZ^:/ѡ-\ա_밖'GC_t.YK,("ݐ=ql|jS-X֐^HXDIOʡo#}?,DwWMV:o7Jh0# uB"цϫ͵Vr1,#0l"'z<-1B+qރŝհ2=aCw]7|Ɏim9 aӧ ie\o MdE"?.kq߬36 r>͐_O6Tk3HKN+3v+6Ȏ{Sxxe0G8oG{MA/QB/!޷eoS[7'gu5bǎa{n]Pn %~MEmig#r?p4:/`2"DU\iZ 2p>Scx]%uID/5oܼQ|TE:ncץg*_8UYmf7AXZ=bÅJ>`ˣT3&83f?(1/0;+LFooUE 5_6^OM8棍åmښN?ܙ>fNxC>.f{,ǵ'cWEaߍ4vWY{D| OtTޑ}sm;m N/o#|!ۮƲq}D 6HM^VQcI-;]RMEEՆy w˳MKwnp p{Yq`u,QzX!ʠr8KƫWIݐY,WVxӿV5ކ +ל";u4t9eNN$]]_9HJ *-2旕eHixmMN.'}2 V:K@״1 +&eA08?OacnG8 =Յh/'l`R; SHYYjSy6hĺ:2 ^4-6 Dsސ6Fm{~4;5TO=S 5$$s/xF8 +?ЯYt ;19t{F-:0ˬS綛N1;5qm> +ӦJUmW3c5)N,X[v3Pt/H#Jצ{͉;5xXTV\,ǘT=$a>FyHX-K4V,[Lv*aIu` UfƦI諊™-gB~`s:9GE4!Zm8msWX! `n51Y.d@ifԓřy_lwa' H$1ᢚ W-DY\/x8^֓E }~Ǧ!lEʖl##lO3'5YtPnᒛzBھYoF98j[[%W\,L$ 1z9.*-8Z=db^y[v Y# +t/ +Ð7ٴ2X@5 1 [;N|zf4b4%Ä3Lz閡4v|L;0N3]6/Nx6Ըp K-S-PLʑ!F9ըg? k&^Pckd1.$œ4At[/˺p"CGUWm9Cx˸7On ;:43lu4+fZ}v)uH#Y8|swR>;$Dzg̋0CŘowc>D\]0fAI\$;4,AΔ_W%7F z2kfaGO;s  x46ZHsCI$\TTf*3mNA {Pݞ5;{kΆ;:4)VA1c$S="{ːk3w\'8>`fn#Ezİ2;}R5]t&RƥiRdc0 y}lrm + g%Poo݆ϴxq]R+;vFqƧ#c ֤k-?UaRxŢA=,ك#`{9x`xꐴ˭͞Q7*oԱIDi~> \,8յFsz<~y9C-n 8Dtۿk CM0!ŶZUZJ~P=yXkc/$#ܡryz88^^mNn:ԮwYoxjKYwiZ60L8{5S 9o~D a!׷P_d/ rRlMHpVն:օ_ !u1B(CP%ÍcQi*'@Ճ&S]!NV!g10EjĝvTFc귶<{e90m,-Dn`B}}y`o:gAǴX0h&TE @*^7w|ï_PE)WC;ʗ{Z:ှW?^ \G?wZLNTrzKЫgVV(xᔗ8酭DI:Ψ@ˢ}/-ׇոo׎B%2l6,l^٬+QB$ %pf%=Ml]<_l+ 8KiiYmj[ Ʈ617KԲu%}$@Se=1dD쌪 ,&hގ+ɴ%ssEvYml5wZz {8KSݰ-`BESn +&KHؼ?wX7ޓNLdעM|&QHf4S6z٘H@ɧ-a%ԙdMA;r_i6aj74 d4Bۺ855أ.ovE%{{H&I(eR;c4Zj|"Tu",QkK +@ۙ8;YIy݋OFQ^fɑ8S*# ~5*e Pq *'ȡ`xqFZ}|c +"ϰ7aY9;Hrr +v8Iԫpw"ߴ6nSk<"ǥkG);ѭj6uyQ=,MxĦKȓR!3fW?9iZnv+| MBMS2M[ 3a΢vnxO5U*6o 6&걀H&LXI5$:k{b:[Ԁ<S0a44V"> +\1-8V%谔b/(J 2Ok1G]_ـ<7-B j?fƶu*Ӥ +p %9D^~TWGB6d9d@loݴ6v u;3fj!bYդi F噃Ֆ@- +O])TwCR20[K g!Gmܲ/+U Zz +#BbЌbsQ(,CJ]omӡ֣جEn $b2,(-zv +ky4#} +q룸Z%ԨN٨Bwۺ3bOK"@<*ܸPU(-K jiwn r( ټh +dH̽YbkVɒf/BU<-1?zsT͖Y1_f8[tOz\;W,7三I!y e rTS8zbR37ԟY /e6bDK 8wrEJ3ET}5GoGϻ, sVj^G +T'&圧>=,M+Q Il2:@e0O܁ of?Ql[Gᐦvg7-MY{?V_{=`bbZOzA3mBNS V껔 +i:DžIj^Hs4s0iZ 0&ߕky:~&0BKؐBX)b%tOGM:rFꭐ ܍ss5y/j‘lW5j E4s7©g;o#݂ʰvG$pXf4?5vFʜ}P +F+rjMM<`vBZ!䐏#)rS2z0jvYV4?\\6zTsp(Օ͉NfUJIM?:f!;*p{>mJ^Z9*^E$R5$g9ug/fvK W - ;v)_ ^͘&< +q]=~RQ4ɏ]Ւ  2%svq3+w6aRkQ.3?0$<+sc63w&UWe6-yKtgBmhE5:X_ HfsL |ͶF?5 a.ZqL{zWN7yӤ}ݬ̭H3VFO#zIˈ +gHgIhFz`eߦfU[s]b&hG's'3' xVܝVHMbi_.49U6Jv/2zI1itdhq6U qr[MEr|l2mֱbP؂9 so ;C/mg`m+aN!+XU =_aٌpe$S9]p@(_DtթA]&Usa9Kʣ!ׇTM+yC4}6d[`wyAu~J=jںۅǯ /$c kذ:_4u-M0#mP!|)YPĄ{Vh +>%+4~7;pR}:NMu=Cщx +=ʝA,Xv8HQʕ }c*6#A̶`qȴx]s2^s۩ZxoU\w&OB1݅6^ԿWJAzR C?_M:U>hǓl`yCK$ɅQ-x lsAlC ud'ɳQ,V(Ѭ2K+Ԋ.ÅD/UbS?HLqp)=]MHw&%w+1,8BX}<}i}}1L] l&,)?%K{/Hh3YrsD2+[OMVE~"Hp7Ό2hb t+,|q*my`KI}~V@~mPv;!l9shtVLY0X?f1;z4ҥ6vrm"d LzluF^gY%idbl>x)&_6}VJV 08*%qL#ڙ걸$QA^3_ͯ*? OiM` Yu?:ղo9,ǯˏ+i24[_F?P^+hpsxObݷI٪NȞ.1eLV܊J+CM00`ǰFKyE0fQ`EQskXFE2DGvV3,x:L>kQ\c7;EmJ3J<) SXP#}/tvQ`A4< y`pu%Kz(]prl9D-߅W^ M4{a,%e ΨIT0Î|:4W<66Y2{A-t{KuBw2QU| +Y|%tǩh4| 9s`ԖO6vmmRY; xKCϙ\݃ uǴ0ʨieǸ5f*s)YW:_lueϩյ:f44bꭕ-}{g#CjC~{qU*AA۳NlRnmu% NX;4E.Gրd©&l~uY*?vwmn OG' [},\[HTF`9Ǝtfv1mDc~ jVcxG˜.[ԠagU.>!i=n.?UbD%|sD\3)a(cU+lp'd?> )ɧoh~ԻYT^6Oݍώc췌J#h4pH-7L=Z~HA fLJ+=`1, :Qf^r27[.]>X&9 }zD蝫g#:yG:8]B6w-~ě_'t>YưϐWJ|<}`EvEQzX0JFGlj6ΰSʳoQ(29_Q5O]9hA5G7jMc,(iv9$3}\+ qI͋]-k&BgYwmY1\/-< ͝05k'&>'@8{ ax\gQJZc(bE5zHZY_b#Pm$dܣՕ!b9Hɉ"f;xE%ّ5.*a< $l,J!2T64|7NK؁,~VV8sYbQ,\evΌ٣f؍u<Zv;YDr\%s @{gNQE!pv_,"=`zeb [ht<]ZtYd<߭2&`}=|g) x8>g!a=> `2_\gKTQصkzyF]6FqzPeޟƷiI,D<xDVo{dJw0R ^kp^uoz$ngN_~vZ5gڜ|[TdK{>Ap8vNhf~,{C6TlVA3mĖzUrxžCY8Ռ˅:.~uUH4s}Ԁm}M<j$SJ,ZlIOПC/.%?_$4^гO;5w[c7:׊_Ǎf:vn۶Xa~y=X $h*.@L6§S= +=Cu;>^a6Rt,W)u_9Pvgtɺe1Q>kg o+nc*Vz׾wջ9a9OtnEindyjKJK {fJ6q+|m^f?iSBܕ2-c3`;:tK'vۘS1n\λ(+Yz t .230Eæ\=2^Ehg2-]I?XZòM^bZY ET\f\=hd%lԶ同PAm\ܔ˰$ :|D(i_q<_RǢY(EO U/JwU+DY|)K*:l)%cl/;e9O7cM[ՑhT e:nv xAv74| _eިV!Is#>fŖ[MOƙfHXt7y4q"lawo'e"LMM|X.R503S_I.ٹ6Ǎc5=Τ#xqL։5-9뇫QhADEW}4)iQKu[J}ֿ4㳘@fMqꎍxIv{wgl RŁ)&#_Gn41Ƶ߭s!bwEkjBnI9.K# %qH߂+^Umck<zɫ>_p1TZ=w'w}٨욃nٷn3쫚Q'J/a҄t>%GH{k.Z(#jai{ՋjߍH)Z[r`8 YwL1ٺٿ~zM4I~XY_JgLGF%{ȍo)tfF %}mq~P(SU!C`67yGJ3l@#_ .J4FZc"}*G LG;;4Ѵi?# hW;FN7t5MSN{:n(ǝuBOGsmovs2pZzC,4Tr7#+@ֽB^DjFխ qaDGi/cC9z^(+%5LG`VBڈ(^hJ[foqռt7C WYjB{p9YWj!Ԇ#[E!|Bȫf%ȸ%QuY9tje\r~Hc6BU{LJ80.ho2l4,W9q;qCQ<{0#q,h#Г$b܋Iiѧ#CZq7(a}y}״  RP0Hr7B(#icМ,*v_ վW8}M30j[~^?׷cy-Udݲc-l&^GJ0\ۡta6yuB/X t&?3=65贰*+LdyeۜNMLO0]=G0#o-[WG?/&q@.PE m~P\ H]Krii|k:5a;SRsUIWB>)"ӵ!/fψtr!¬XY~Kgxqkmy{dq$kͤ:N&隮aoÓƬuCou<=e&5`KFE +YT+:>/0g7+x=(ÓD,pcX2b|kt.QMϰBlH݈ &^>ρidUqB7IOQ4O{8AzKbk6a8giFϹ+TñKR ^*^--qW m?d&eC@WjSm]8Qms&DUIDLNqwݾH1ݑf !OhkLZ +gwWt m2xlSߖ(n™HPjar Mȏw:Pӊ(2L8'mvh ,= MvSWG4wM휤᷎ƪ>_MPDzw՝cIeL )tCbƝ|GMRzSȪ"C䏷QO?[%ل7Ro9=Zi +16P8D vdmV`BF״_mD;Le +H0SzO0`[+=#t\߀n0LT@\Բ)$\nb+KB/)x^?pJ뵯UɠolAlM5yhIGW%eA<>.XL3mĶ6ADd.K^cYZ\zVOmKAPm.ain~ms`wz8JޜZM83g4A5X>15SAO8θpDvj"Ωʫ[Vl.mDU6{\*=w,mKEn8u31oj;%Lc~:M;bN7qsLrGR3}KQ7 ;ao ݪqP9QSe>dzI) U3: !ʙJOqd:j{ DwxFկ$4aV?1H{IإpyBsߊ>eU|ry +: ^ĸ~{Gj[f*W>GR6[*WHJSyiO)i!)m(*ܢwڹ*@JQeNWB{g:m!Trϩ;>Ǐ +wBx] # RmfFR/{豤jB ڸd"6]Oi/׏ѧ3&Mb#ڲQlCɛI5C#E9R0J*([hOҵ<\/'֭ޙHS2;զ7vk86SxONOşfeJRG].\"r7sRzn*ŕ}Vl~_?3z-Ӽ-CjҸ*khFwW?n{mʋ1$|@As,:byGv5SGBjL߲ a}_yO|*rKkڌI93"YspԞ`[\[Q3Y#hyYP]=0Im i̭{0''#wt$p`{T>u>USxmCn;!JL|5MoBWGO]HVm;? +)_^wI475ዺ\Y^-ot5ةwLoڔ3avrCd}޲۝NbJcA 4;fyotiF%eF(ө}jZ ]=% Uy ~(zphC*#ޒ 0<ю裺aq}6tyWmؘ~&lzH9曄156̀JŖt&(Q,qGkq*$Xp 'Һ+~P2Ŭ݊`lk6 +ǖtHT2LTU߷r{X5:'ъ4q/lA~k/#{=>iŸ2^Qe)_yN-[ +;&Dk'|w~cn 4*#ru5ZK^uKvIA%0l)]oFt;#HsF0<cI:e{=9m_z<5֫邞+V"v'ά򚞈H, 8+:by&Rq&]Ƙ43xlx^cW%jm=UqVI~:&}KbJxp/P +gT6$m4l [A>GZ!mѠ?T_OXdV* +v731&ئ^~"r&7g +7h3C|yu `Vџp +K葦ӊXQnl~~Ya43F2Ի [|& mb[B1[C:{1HI"g@H&ӯ.s3Ś 96?-[I-BRaJ >QÄV{% Vf;!@HZw%i$kC@qUhfLMߗbט?D}q ]r,qv:r3:*2C{s Vq:QLVg];N0'fOVihWvNDQN=K(P)/ָ[U5%kLSNS8J,>Ɗ:|z՘JҲIծFT*tm@bBf)C% @I#3%nk~> Uպ^-f0jlu{~d_U>گT#4-aPq L`i b} V5Y`VB;Ɣ lfyW˾JML<1x̂l  fL_q]OfBgRnZiĥze-yIctP}l;EyNz< U-9rZ֢8GwMy>z;iZDw8xRA_ڡWeREs"ksÁӓP#srq5^M$QlΞ79hXtS(:f Eb/c, 9i$N#o ~Xr!/eǢAׅӁ[Hz-ڻiG^p#>v`8,gX.g+We h'MEMbq$с93+lZ$GTwiͯYi~r,ùt n“ <`aqtݕ)ƥZlEFiw$@wݭrH'9/ڛő 1ȸs.+Y +Em)/s$9$<//i2DUaf1rҭM[qWA'Fܝ"Ђa^̒7}KO0;{ J{O?s~xSMWU./S~Dќ6Tyvb}=F}eY=8^@!;h8nIJRSX_#`y02ZɆAHjP@gF,//iTP1NYQ3NR #%JL[|3E˃r 1ԈfJ(u⊪M >n3!ƒL0Vb< ?]hƨ.>11W4\P]|*猘h(ACg4z޹NC@ڻVI__?/RXs}kM(3,H<)Dr3_Ӝ'F;k\ \zM*?#V"r ZS;ge*f&J~4f \vj roA7б~턣|48S / UC͋sS1 Z啒w'ѵYɪm᝻ !UQ0X զN-b=aߡ2 ߯_ +\&qv[oXa?ڬsZ|ر"f4b,ds=Z8@~sr1kVt]-W SU808R3,1U+4Ld teHqֽb1߁W'Q^KZȖR5BR7'd> q]Qo\C6Kg_tx{ Ʌ}y-陞)uT&:0vRzy)m:cO4w V7^Y_Rxu 3JkE{xrB Zx]dᛙHfL.{](pUDێ.չrKluL-tyg1[p.\iSb+2M<5kCPo9nVY^"Յ`)t_bŭ!nr+wiiq%uB4AV<ݝ"kDz4Ќp}cTf#䟑ô njȔ +5xw`H̏8k$hB䍃Ix~AN6m98NcPh3TwPُU=apVDhık}/ܦ5+S` >e:WYAR?T f.R6˲A@3jٕr47-;e +Q!?Q>4y>Ԇi.ٛWlt]B;X44* ocPSSa7qՒcќ{C}8XY}nܕE7T}(˶q٦Ӊ,}J~*+Һ>Dނ`j;s^hsew>fl{rV[7mV”ě$_O1"gbjuBjvBQӵ +3ГyI}ո8?x3 _y6\H @ѣ!>u/~jM]sow?#!2ˆ]ȣ)l)MpaZbSw07.~cCǘ| a 2>T+]=8H# hH5}^ά9oA˸֎m?L7 X%=],ZVlJgҩq3L" ,9I3?tisݪ%Mu6r fgbecZS + NM_lj\cZM%O%9`Y@I ZH]6ߙ`˪D{ AO`1{3/IA}N<_^w ԰¶B2Y@ |䯸=c|=:P{^ˢ oinD@le iUm>X</l.t?5;PXUH>"8f^}t~zѮa̛iT]΀;ZN9 T+$,_I 0[0[`ļ-"~m2 BB5sE'{_.D ?صCC譮ݿ[Ԍfܴ:l6Qơt3b,Tcd.Ajs:BKHɁ }}zX-ΊT8/5×v WȏRIJ %2t}HI<5RԎi* 8Ljhj 4m8˞rb{N33ڱe,e`$rY+iz!'sQM"m{E%jk=;1I@tRa(k(W[j¾=R +/R_ ټɤm#SG8Z eMM2ȵU[QpFƙ*$/`2Nʛ EqFTX=jKtNؿp M`6 U֦y2 a>/\{g4l +vk{zf~Y O|](?f4 ^xh +6vޜ.됺M$5\RWi/ lR .䦮PѤSD4|J},'A{\Y%q\:ZC_4[;n_xxz`vNSY\N-*r>1<=f:5n,c& ;C_G=JZ wA i_!KH|+J>pxW` y@jǬ\K FIˣI GJ1nt$og +WIJ$|SUScYMSجIiyPx"MtLnxn. ց) UUV*W' }%;ZAk[V`Ɉϳ\+r[8+4W6\` a&zvխ%nXz*PsR2?'Eq popg1xhCxߠސ{|pbTlj<eY½Ӿ֋+p-[^^Nenš셣W- RSL=U_I2-g=&WC;2kNM+C(V&=\ޥWӐrGnDٗ`hhi1kZndj `hqƹ4n̦=TưuK)pL6:2Tۄ>\>M]fB]zBv![t_OY'mnȳ]>7_x &ľx˽ PZѮ,~۽К]#@EgyzLUIjEQ/FkwhιFVï>`L=3}ޓV$ɩ wG@,7ڨ諙{=@M\=aa;oTns~S$9R5^М 엿% RA[]+WI u&4M;׵mj=oMLd[y9́u#}9a<9·56|K'G61/`y'& ?mFn+::wq:m݊՞j sq1d7ai@SaN+w ++=yՃlJX9^}d0de8 cOc^x*lOcVW󁎖RFbFA'xfnnli/H[͋H~&g'GvOl]T/YaxvwV=Ɍ W[x@Cd}-_sǰ-F4nLjVjըb\=n8-fl&u4۟V{,v{FK*^|nH??C}2Ir$7^(1Y߾"3K2&;6g߶͹{5k?  +w&$%]Z:]zޢٌuWA*+Bzr^j0?+t󵧔zh0rNB,ZID124cgWI5mVtYݪ:"*D"ax)xU/j5'ZC5c +Vu6IUt/ݣ+KS)&!lF&u uU#f n`M+*zU +S?tZHT4.A+6M +UV%<*skHE eD2ãYajV 4u£2=R#,v^GZBuD1OM 3""]LOjx<$m񶪮;# <6 +(vR* mz:%rrI" M&Ή*0.T 񦛦)'}:Z_ͰTSE  ,E {Pl|R;ĜH'rd^GczI:F%'Ps.Z06˭;J,otc +2an0(m"љ^aujԇk =-Zו/e]3" EwPv(B :)ϤMv$aBӈՇB6Wh/Q+!Nԫ cP[Hmym7a4f}6@~G+]tԎjL5ޡ&C.T}hݣ\Xxj^ͅʒ<$ApJlxUWQ #Zێ0ݎ|u-Wp-/TorRǧ݂)9!rWJQtT*=fUx%+g%K/,@gړ;PM %V>RnfZ"a>3QvjoְD촒haw3rHv)tݺ.cR6r7~haTYEmڄƶNT/24hwkJUg oдyȬEi*Oڥ.vlDwS0xTXQ JTcö.tj/gAJȲ)qt*0(FDGig ILmХ: @iD[ڠI`d0LarIQ=/<㕃% mԝ;Ʋj x~As6 +%Q5 枵*)]P[hEݼ湊<__X>5ُ͟zrBa:r,d?_+' #uNVz@1<9p)j0r[|NǺ1è$IvLJ6Q0)z$v pyIM$k`$xQˍvpWV5Uh}#M{!鿿q}3H{VG75s_Y=zb +6v 9؟c [7c,a1!E/i4ޜ(нX=>=0FTIs SlWcא^6^#eUʢh5RazJ_JIYYkuPz^ g>uև m)3 C_|V2b{ c|,=+xnK9Su#z NEI1GR-vB`x&V jPqAMxCjԨ1)I{bV`u2S(b왤`X +RC%R6}NcDSSAMhIuam@.R;jh/?ƶ&}#@4lTEO K\Wi%ƻ{dBT)JRB h߽dC *wKLQwЧM54 _/۵fG>:~̎I'^#*Lcyg+fD|jh8Mr3^.ɭJ* +2=ub_֙hdAU0R0)f3߷_!yG09%cU#>^ v&ӻ=t3t+)mٛO&ɾ14=Mk]_oVbj.C1~k4ŶG7(roŸ\(aAjt<\=2Tơ\oHS#'#^"@Ve|ɯgڦ\Ųz +>'ybC4'M]^Αo p0HP ++d$c2yZTw(e3]o:Q͵I~\K3lù6RgSxy\r@OP,\m2QD1=P}f* *b+hǵ1Z!J MШBc>w\uU#~bMr#aUI[ԍ +{=vv%!*Vh& f$٨˾`>8-|)TǪκfɰ)i?Zn$~EnhAHmwv_4jo7h,hM%9n!nx"= "xYAz;@qy;+p?}{r" ~(Z<2o0D5+?s8Ծ[]u2"g8ڈḰ'L7 s?~qzzFOI(N:~upFriQcϯ?C+mJm,z~$=)QS?Yrjbc?u[,ڟx5<.@3Im܇[IǘTgyTk%ڒb5+9eŵ,u~'l 8#iXu('C,iK+(&O] ]ŗΑ^"K2U%?_&U6H!6uڂ +J3zɣ=73V*W*F?:jHy * *~xVDb}uD=Zw‰lp gYǠVw&9M=npy9Slwީ A0`Unwht_RZz%΄Z,{;BNׂu|Z6>n)^68>;'t1&bVzI so'#NRoDv*f?k֕1xwTpnW_뢀eE|"*٢H@$p?133n{J4<U1Ae?d]W_EHajwRuXTPnn1EE6zOMM&^$w?@FOm0+Q A釥x7{9^K3qmW3_XnR\$.>Mjvs!c w+Ȉ(Gؖ0oi~G׭N,wET̋tF{voq Aܽ9HIIvf%xBI Jh ٪{?v%0L{=;3,8iέ[ON zi֓k8"2U:h׉Bx +Oz跆~y--IYK)֡fUK-fQ%0̰udq9NL԰@*y_4j*s +ؓd2YQRdg:va&; DX~o ;4y@c\tøY%l/t="Q7{m/$U5y3fv'u'TkpkV2y惝-wU!vy42X!HWu&jz\e')nBXFhX!Cm-ߐ* a62x\KeVDaɁ0p::pbN(a„`t9ك%jeH\VNw@gOANceؤuw5.b\M6\ʃw'R}UXVXG>X"ԍY| o$G=j_Y;o<6e>e Ņt={MhhJtS3:؛fZA&\2[_ߟ iVگk}4IwSRm&\O6Vúdܬ %Ev"m\z'@ŋG2upvӴk=ZL3BG 9FT +_v#M\6EVtedS /+ lv[wtOf9Iz":@ +?@:0A'zkmXguPtc/((h!/RHՏ򩖬j Y_SgPIEw_{HA=IT}y0r͌jW@u&j s|Ո㺹0MKtٵNAlGH^my=^lI8~K\o?u0ߵPwyahKA{5u"Qr%?}ْ݊vY="m?կ} ʜa>aTk>dbӓ~f -NDy|A'{;r/?6;vbS &ђ歍̶֝P>!᪀ȩw1kVlZY80 \O/&r~c.;8Mԃs,j7SޚWniNhp4}Xo (*dH䙞ݜk[5 &J:νI:CjJOۅ7iUEm^ ++ƒ.rMD.y.&m\xwy_ o6m.ɣd$Et՝;K6~ռW"piym>:]pj7DLRM>1ddKT yXӌʱ +e!ZP(t>\~%c|z - TpZZXF2tL=E>mc]Ϭ0fN5xf<&Wc;`w tUOp9msV+af_TNx{rfǷA;seĠH'][7/ܒ\ϋo{`?#> fM%z3oޒ\c+X<o^=>bG*,Fp;=61GIpq6oxlqmOC &`.{Z D [^Ѕ3,rubIA2ڿp`fIKWJˉM>5w'?l%W+$Ha]PU?F^_ H/ajm0D0>Cny}eֽ# xlo7f{;#! +1_PW{q׵} ^8JSˢ"mqf)⍗~`j[ZTy|pfB~5T`}.lie99L=Z8D_@ +fl=cwEIf)I_*GA5 jNJq9f|SrqbyjI,5kbDa͓ERP(b9w~{3@M)r ! [lc3aE!$76bfP?tt 1lGoZ4=DNusz1h'ws :ҡZA m)O¾te,$~t@~EȦdgWP]aܱ,A ˼/=ȅmv4tf ifJJ +@.j̱R U[%^u0ݜ,)HIՍ}\S$>9xgrjߨUtAfuWIK?ZBHJ\ k]ZV/M;IS[uUv \ Fsmpj=;7goE47ȉj{(9K#I/,ȸXg +T@L9#dKaGߙ-a\7na,tW"]#J}ʣ +CwOq EzyFEI͠OU5BRϡrͣ W<^5B{<4$4q仭CڕEt-N,kqݦP7}*^~Ygcׯ/miVc& #8*۴s.'Rz; &T^f͉z$w7q#{7oVV'M}\%%g 5+_}zmYT/ ~6k5K]Ou[#w$)/ȍ@;jAm\wjv#f~(Q"U@"%W2ǹ&g/Vq8=-Gc4!{odj5Tf B$I\q(Mex2Z +pqD,ww9wTN:Un0\jxmv7xMeU-|okpd҃U"ř tp,'>O rrɷEdOд#ybs0 **@{l$Mnf,ȯ2%"otN<۱ <9{@m(=lt 5>|xn9ZO `TAUZN acT0#a?ɽ4+IOvc0OKDOص^<ڹpٓVvO"O- FܜIކt¾kɨ/>s2ЌN2h&g;~<"-KjyyX0Q ?$D2EsytjօԼ?GÒ|'4NoYJ\oL0FgnoVn[I>Oj&R\~EF,o8uU\WjYLX} Ӧ6aAuĽ#'y<4(Y|3U3LgrJTs! + t7@Gbߝφ1Mu]sv/ev\&nkoA9ai՚5&KIe Iݔ {!4ǖjI/NmD|5a 1q/>I~n+̪ 2$FJ"-lLꘈӺ%4zs5.V6./;Jy9"ږ>/tX8=/ޡ1sM"gT, TĠ}u$k(zµzd,,=L\{h*!J.5 +蝓 asA{s~ 4BNOD +1az1GI+v8:n# 0t_(H)R0Iˋf0ռq?=/o#ΐ +m ۝źxM -l9R=t\߿@7 +Rlbdž]LTݨ`X#џ8\ziHX?e1f%n󙍚cSyDB; +?{-Hn'cԱ%}N5Z)aS$7}lkk~xFR5"ցoV~b{*Q ?'RHq L'j>=MSŪVPvL5}fo\u!<*vدNPЊ˼!~ӻ2j5ǵ,'TaUp8Zo8tYλ2i'# .y}c0᠗J"4Ov klfzAfϭN?SU$L(䐦@<+ޘ;ǼU&CvtSuI+p/Itzuy{a(BuܐaӟjG:q=t!([K[}%&=-ѽ>"_5P<3dr[JVv.GP]oLIr!(|zJ &UQǨ:F}r7~J+,[ "z25ԝ)ҳڠCʐ&U<`Zyr=UP p%ݯ'6aSjNp itZHW5=Hi+#a ^t*.KԎ7ϼؾC@]pz6WBnt|̶f|xG85"Cw A{M`')Z1}JH? .vN"N-6 ~*גPj/&X,$WfGy$G@*@F&ǒS\J_A+ .KA˚¶0+`$tۙ[1xvM@ai\&S-prY 5%ͥTo(* +\mYrJ|'kc>[,˅?m)n JG|'Ͻo;gpc]"JK*~毝zXqPg6;}蠦jX߈t'js]쏼ѫQUs||[ Z~U-ϵ{|э{E-֪qyc966Au\]$$h4f=hGm~r[+;9# 1R"L~ϵS.k.irCJw9.D?J̶:qjqt?u8ZPrH e/W_UM Gz?pzk0Y^_6h#h&:ȯ + × *4bDO4XAZNjLQ%a?Nv(®^tP#B&bxJYfiCNsn +syK͝VV & uxÃ{25<9Oט"C =q5"$*g`.n/96juOɗv!/jR5+;\u*D[mo3AnVTv'Jnl%2 ˚$͍)/;= itMgl{XHژϟv$]7fxe9͆lz Raͪa>~t=<Ra9WMh&%k d=̩eWpJz'#\|vvNtqQ*4O*xp9:}cVėBxۻv JHZ1wwQ$p Ųf:P~^r!YX_O~kvQ/fa((}IRK A"M&:K1 tQm|= X!oa?xlAt`T(P@1~ș8;֮j0M5إSt"[$0y9(EhCh?iGsSr)d +^gAp:6veDi 7:}}~>hhF!]~˶t"qz\p2 k7A\[ +,ЍބOߪHGwN}XHt 2C aBp1< 2FE%`>6eKXj8H덝†t\n?|Z얊PئtYC>O/)K`%lWT> +#鵞ͼLc;>Ʊk}D;XJ8OŧV28pXVk4 _*KAhgːa|#Whq+>|چ1Uk2P-RK\ՀRƱ6w5N.4%T8xPBRk2(C^t6Ωf&!'#X87~3nUgJRW-,0,́.'@L]7|OrU}ݶW]5> +@4v6d0Zn67_cꥥUDj6wڌX!Ăb Ev8J_s>ɾΠ{Ph 0n`e M<ٿ亖tONtK5~;IDb#`u7_E3mɬJnX8h䚮#&N{lzt=R4Bs aLַn29^_0g~~~"C3Ɵ⥮# W]L0OpeÿM!=^ Rddւ-pQ˭w*wMt6f\q : {#z'QtxRv]UH f"J7% :rr[уҩP5ӇugmYgCc*/7G>&QMߕ +tM[N;~a`䞿M`H}r%PuE̿Oi!9~HBSP0ncˍ[YF6{R}y1]A*nX;P,‡fNL zn56f[6yvi3ju]?Δ/Niv_wXU3hW|p߳A9iF~,Z5 8u `'PJxhnF9-S6n=0S`_ן'@&n +`6hhْ)Q֩+b|oٕtfa[, ;i>1ak4gdT:ґWAcZZ(fus +]dmNsSlQaj$=ajʎN\A/{Hҩc9$&-w:\ZiٙBK}-}х]teWqV,s?5<M^}{nBgm]+bH%6I[#*kߨJTlB-DjCA[}L)߮)qF"AISciA +dAN1= rnv> ߎ245{H9POoR}E)edvlE Ok}\BERw2IMߕ-`KUXN871(DPUe:NS_,cgtͰ]LB8EWuU_-vDt|LU2]KM 5|GJZӷAh^c.^BX2ZngLBivtT4cM f\$|ih]m>NNڢ}`uf& A3&qUƝ|H :8 "cܢ*=Mi7 3eU`5H(ۮzJ]"Ovf'%av,d#'_R?TT :$LƁl#nȈMsEY4ojų}xv7CCdMqgv2AtsέW=8+r6n0vZ;Nx +SN3VTUjى[D".Yn;PTViFX +;Iˀ.8~v*zZ[Az2޳V'; \:[ +^i$<.\ۇX3 +ZC{n[REvPJ4@Ԉ8_ KH Nm^yMyrC'$j5S"#̆)h@>ThRu i^\q5VG_'6F/3aJ^]mtҷݴ:Hx\y;ͺ+K>.Տ4MtG%[~t{=. [i;VOOi[of ҞO&Mzkx% zYdRӖq֎jȂ+nK zvGk. owWc6qUpگLl-NfKx agc{ :0̏dk ҷnȄ +!Bgbx <QS784fP;I>1F01TzY*~ڷRjGt7mb7-h lCۘtON{>l"EJqytf''HJrw G`f<2/p]jf.XbaxQջZklT}ñ Z.*c5N*vQ\ xaEǁdlBT}`z;xOYqfA9 _=w)'zeȁ :X6l_`{BtһBݞھL1JҲ Jkm30) TJ9"Za"\΄epnIG͔6,3k9)T l\ Q)uis-{MhkCđb7>W 벻7 x6O{R F|Y%fv8x-gnF.L=K\14"ݵM^𪙆>UL d=&bE!̺(Шd%64`.(/q$yzy0K̲ KTQ$p9_5} w n?bKd"$@;n`W:U1h%?(ߴ-hӪp!Xu};Y}KQ©a5 ϙft6SB\lqG%t;lt8:a!hWҭwۆz,o +bxGrnL1Q: +[o2 zܝe["ĆZOؗȂe1iy[7 ^ݠc`w[72?^ -408 R|aBvkNv3.T[6'}5&XJ{%,'Ur\1漗H,^ jWQ QLQܨ!)FL\, HÅ2^E%g,ԏq/L."o ˡ1GgG֊F0lvcqܦ_Wn뉤*VX/'1yjkN~Tm`LFzkM}vV)L%Ou!HiӀ֒g"d3+@9Ir{GUPU;*wf8 -Xc :ZTwW2b$ێ< #N<KX[:è?q( =?.j˫3jcXei/Bq 5ukD0; MDm&lDpKE81 M~ق~=>" \2/D@c^[;e:1Ka0G} +B{c0:4ߣOݍCfAzT1>#&z!F/YyPMGRHfC"jz~'香Sd(9jŗXDXız17ڒ/p |&UoMXT@vN6bD(Wj;ΐiWP^&٭#;Ux [OMk7@KUZd&fyݜV53~ @h#TqhvFNB yڲo{9 P+ħ8 A)Rf9. 5 +U}}%UiՑiD5̢^#4?@ҋȼtkd}0kJ/oxd?Ō1]XE4{#ndLϏl4b*PkֺepV6 l0v:Xq6ӒJżІsTe}&"v:\k֥sGMY~ӴFPMb[XFFst#-agm{\f~b:lrΔ{ul;O)Fdxlw:T۞4#nxOpbу3V]Q *O|&"Y6p{fKB/#&Bkfd[`3 kwEL JWk&"\sV lSNtLx!D`"Lf ! fy h*jhEJaԙ2)iޘ_iIk+|4@i 5}ӱø9&&s}'ݎ?\ݟ(g,Sűk4 vqk3f5eBJwfnFzcVTcXtz4{G^Nʤ1үv!}:ќoq N%oep /][8}215_o(sI);tc3b=%9a.(5713EAŨ.O;>) <}E-tFsdYC.Ot}@|7b1qM  0@|Q쑓?CFIsjV9wMCur~#N&~x\WLb~M)esf.Sۂ+;>D\cfE®Cؒ.iqf'o )cRjƹf(ac&m|ݯ3?L7VLHK\]n4LJG# c<\M'Ud) =}oQL[U ++WM +D6XZg SwAlhTWrg4hcӨFKxgFt`0:NZ[R8̄ 6 e WɧuݯAfFTbibL?pX 74s>: ;{y \LJxRR4? 'l1jk:u<~p*8NO*f-'պɭ;^A]TxL5^ ku"0#uWqS|a W[JG?^n/E)9|aT\?)A$x!#LBGC.xXwbG# " +L*d~ݯ8ɎASlFn!?z(11:0K <0b`m_FyEl,oٸaa l|$e0IvDP1TfڠުM]|~iM0ni +׉J7{ΥW6D,BrY?alzEn<"BXrVYYx|dVs*pA;襸a*É̘`#bP(BPL +LlJ{\kк!e݅m)$|)ڢ.Gjc]"nbtOaӆeftlz#Cvz" b{S\jO_NJ'zh!:#qX/-Ʊ!rZ 9#lLY3r``OTqgL0;:LJebpG[KFn`,O%kYMa/hdN;iѾ` gڊ }b`$0>,+~iEwW&"2;Ȓ<&Gu"RI&.LQmŵ6IsۇwuJw'dV̶gٗ&B&\*AsaAioe]=~}M!eJi1R s۵s^r?<6%zSw㪀+08Z +Jh/aHncfLgRu{-l։EW`4"cJOLZE /2T3.Wp["u?Ѕ&E)sMpTd.I'@|^suuvnh%Dd[d2)/^ ^n13nf3YG2U +3G; *g$&>_C1.uiLf#|1U:Mz7iEcm? +6H,+fg[Wl-5Q7 4VL'aMe) ->S<,s?: G~S( ,fӿRW8QSLCuȯr9vXkm'jN1ߢj10(~< +Χ{3 H4A0`6]T٭e /~tuQo)y~vK_u\4ߏWlE +[wE38T|@@KCZRW֏rWPI /${N.y}ru2U{8B1wЛN#^b[\j/ۚG$7QC!aZ (~#D4{v?Pt Gу C 9SVܳk\-4\_m ʋ?vӨ}?c.^^k.lae+-?̛ly;Oo}xyywij{F@ߞrֆo+S ^Q%*kWmUՂ"m2(At=UPa,yb%p@`9'9C%~ezk x~Psl;fyT|.օaۉ91Ƃ+` (Ro~@-\{ +uɔgw^3NT+{to[U^OlՓ/ q̼G33R 砃;΀̈=j.m.ɽ(бޜ]4=󡕙)\޾g"U0u2'Cw%%z5P[utpba,"9zPyIdQ]#mc9~$_&H h9YP-!~DlDҚ[h{gtcpf7; U}ڎ+3Hfu\]u@4l0yƍZk o)l*x+47)h΁D6#\iSEKdu>9֕ >@װb}8#[_O F~lMLF#uo7ޔ#"bfn@WaDӳͧlU :~* ēX'HC_jz/6x9N=E_)H[tE@4e_ؽ%}+@cjΊn7 "$Λ3ѼJ[hgrAc4I}Χxkvb(D82D{ 37b"ped.tC;$b0ĪӣLSMn_1avTj! +Ę;ɀu!aT1)`(ܙAiM;T[b+3wK7} FpTW:]R@>B|@.bDiwO+<^̌wۄdF}Գ%1u{z4mlFt- $lw3䃪aքCf$6`KET\O!=q2O<{(P&^3ع"mנn4V\vA0]d2ŕũt5_-OO'l::SDY$ym4?C0ă_66PLV"Oni#2<Լ`bxuӬ}mXًs5p: 6G)Xv¬,pQ&׿TquIw DA8|F2CV%u6/:klVX;l" ?(phQT[ ӊuqEަ*E3WA.bZ)[vU:c%M@ӡRqzq`ܒH AJ'UY>6|]3D9v6位,J?&=`.Cy=27Mz.že^ N7+(9w/"O& qáQH 1}E~#NIE*!.UǎCe3J߿,EsKZ=oiׁO.I#MeՌד3^X_CZ(F~x&M.i*zY.a[B2zg 85lsѺC}SR|)^ՒiaHZ2ѪC((hpC!hǤstӆG0Q63T$mo! +5G~#'ke;|D"b'UaP?x3j 79vé#ELv~ʦy/K@R9ZdVr_}/sG/}z$aAbؽ!,+fׄ7Z'Smq`KE$L5W%<K?nZi0OܨJTaPaثXꏪl^-U[ԱU](el#i_mt|M8YA<|c-ۚKze,bӕR"AuPT F,a?H؅7!BVOZNFbk)/eWN fSZsPO_Ibp77eJ}Lki[+EMy$dyB@yqj~㹰C42ciJl\8S1RG-GiƀAn?D%~s[O&Tm%4,.Qҡ GO5d6{E{1>7znvlKa$aY1ZIٙ>x+f֝L.%c&Es F,1},g c>IHK㟺$ۡgȨ0h5-(~:}yyO998=>1S9S3e2y5~]JI bϯkGԥ8x^TI74NoFe_ n * w}ŻD +(+oݯ>9_Xq_wՔázV9^uLXh*4ݵK23?[yv=O]'#CSutI>nإը ;YY W[ߪGuF&($:jװMU82ͤtWXvk8  0VVd^@89B؍XؒQ,Z6RS<xhC`C*^YUm2e}+uwbGO2(s?D}e>fH?,Vzőo:}_~Y}bd'g"|ڕ6Rƕ +$^;%7='mM_,ف8ֱ6) +/7 Qv [icQ%e}.-@,>V`Ǽt7N܁_HNcAf0r,C*!KU(`e fԜSmFZ{Pm-#G0=ǫ.BH_̨ӎ9b ܰ.z.(zхv wqP99.N0|B]ˢ1%.᪕v™p$G j&)fWSvk:r6 ;pgtϟ.o*!U9;39.h2mldig[cV\8dCi!դT鰰u$ȌW3?j1VMH 5tէrIދ3e N̹gz88fC4OG*R*V%&73ՆzqUf4FlIg[ڋ\+s +m٘o>A);Jſ+Ό^1_+^hEӖFZەޒ3wLUxV26NG sN@fQ;muLgf4eL!цd,ScśޘK|JT= ,\.' A̐nt2ɝJ.;O8KQ*MmZc*tpKw~-}xU%.a[Wuyg/?ׁZǖJ`ݑ +g1% +lNAHS|LʤWI9qRvz_?ڇvؾbS;ofz׎sauEG&U¦F 2ewgp5ty#.^rQyH:&x~Rb{5b"a@[ݙ ,~3̹C4 iIZX9a^Wʹl&D*Q +o(_ 3 +3~YAf]l1Ӽlɷhg9e'72=>*K0b)Xn?5\<$QF9+Z񴡭4Pfl_uo4K:gVGB|)APmוoLSV YUA-? J[7(@<+O#S$R~)$7"cf<+suF`bNX2.;3Lڜ?󀒻ЈirzK22De@֚M3JwwMN^cVv*2;"!iF)Ohtp.FӝMuSGhYY}AMJ|,}sҋM!:㾏ze[{lYߐxBi[J2KRnH雝>=ca-_x Y/R!A iRB)6vCHߜ&lWZ|cv::[!E^{f Lc=1ko$ ߚ^O=儭^0$I[uM +g4 u +D[ {1y־$~DYossuV1K߈diO"ڞ)N~f%ؑrܥ۶p@ȴDtl90#*8ǃx// t6Ж'جإWSy"ɤdxiN#@$[ +3 (=ހCwczpyK0E[:dԸiDwsXkW`Y5[`a\hҨ6Q2 h%Uw/+۽ +mcp'~p/s6Hԭ,?$bKzCsJJs{lZst|>1^A(N‘w_Gdze~ø A_V(o}+o+Ks,ޯx몟=LC/cDRAМڛym=U.˃f/N׀iۧǼlQޭ%@ʅ~ΏK_-18fνٌ?-q#[Q@YIP=ҕ=龔($Qr~nY9G$ήYyyd4ҥq7;*{>hL81 <fSi{ַ =XJ۞m魇Y@` +%NMR5KLm ]Vc={iv`7пz0͵o:emnEEa۶<Ȩpr/ M{tDmxޝ |elΪPڴRA<ƭ[OaUL[Iέtә*+ 8'Ue1O/W)Xs?w5^D|7n!ᢳmݜB/Z\& i aw1S;zmzY"ϭoGF}/KdgٟRU~{~]2~ͦsoAF( X\+&ʰ;|!nXtuUZ w8R޽ϗI-gBؘ7PX&ڶ9_TϠP'H϶,Qn@OUF̓0۰$FoĴ9, C?WU~ͦĀǡ &݆39Ѕh(4rײ)Y;bk6'KB꯫@In>6cPN󝻮8C? CSYΏ/N3oDw.tTVsyyъ=I;rXHo|n O3,RmrXU +..}| Sp~іD^Uw~T>) + O\(@rB@Wzca;ƞLֆ0d M?s_x\L^u˨j.IOڌքW)gSbhkR3^֗}&i˜Xʹعޝ>sv"U'"_}ɸ> _B+|Zb#l5"9QvV(^yVbh]ڊ@a[mʺ*j(AQZླྀ$Tˣ֞(XYIL{'UpMJ| 55e]Wuxĺmv=~Ԁ4=e=pNМ8rB]>-;Ĺi8ߨiFrvI9{A)G:aZ1wuCIRlZ"g8 LCaT9*|[q:W55|ŝ [XFfy +n1rY/]f_?cvS'Qfnɮ !**IV.K^Y!AvwE~j\à5hqṳki>y!phAդ^}jmW a.R֩/ 9 \A^I#Eaon["A"ʝAr96LvZ?Oo(h`:3}OzS| @86iw  ox(4ad]g9Md6X'6<Y5Vf +O6اK>.X\'tzͮh?'BbH?s]9@c!rڜKwgj ݾygUnqj`Z?Dwnyw,iG Z/F;FzI.F:j&^no0|NDYoeҎ+ 7a}*{n"F]6Ps@Du?YS8 N B).2 + aU^~(m(*{QwsnuhIcD|=hϽW(]PE7-έ!*=c oG7@ͽԦ(J˾@A8vIѱcb i'v!zoYeVzkK>{帋#d +'FfٷJ8 +鑏ǞPEEPŵҲ&{W^|Sͩ<{O?Hតn!8N5\K#w;:3kmW2Ma!] Sj!NSehx//&G&'k$*Ux `38F"7zmn#QAt)KYXNIQF궢kYE\ܳ0Bst7uF_Oj" mes-VlFIypZ'٠0@C1{Z6,{~$uijFyϋѫZKmI'i#l8)E׷WĢ r3<*TQ#׋c  &W2 Kdj ï M&6+:>F4wTXڀ̴սNYwX|۵1Gt=)4n/aNRLKЃRޛt M C`4ɀH^\H;WzNyN'ˠԝCHTpne7d^8EBE`gt=0|JuZvX[e\})yFhfAҾ-EVd,,d4P'3!f=s5wK/F1|j{1מSyKhYDkΛUrndBe^x&f[+ҶlZ#G)Zj ~v)tNt-mt.1i'eP$Hq4F[Ů {%& oYMa1Ul'7(zcƩ4PyLG5}Jmjw8R0 Ya5>ާ+D'mp9ع>^Z'Ue1?Kydn$1tU TSoo\z`O$"3## hVIN%, ,e]ðj.\VWem?f1gT Rx"ٟV f0^sۓp<\*F%C؛g~liWSCUK A[t ɉ)Oݗ遬vkX Gõޗ)hU6H`r?_k9x-_%QA1SΓ#+g6^`ʯ\KͨW4/Yk5:bwj^_52/YL!=!S!N{}e-Tx-),G=9 7*q:tnp(N욽98,@:3d`#SuYU`}`SߍDC|bB;[ 3 - +mB%t$+J5qFfE&ON9aĽDYzF|J_7R)}fɑUk +w^}ƈ|aǀt6F I~sl3?(Y Dc5<6MsdzRuzrEk]uկ7G4[6۫`HuV]+#S@O 1@$%#IZ4#QZbHȜ7=XڃH"ѫ0z'_fkX$ l۠"DfpQVJLg}ۅ}p' tk=^ݵcV{lNBe:4k[n)A+jh13yBB{|ZF.ҠPPgffV-9)tv_O +tR`irFi~+5([A+7 +UXH]-M=rtX۟Ì{!B2BB)_hWFvK t4j~8?oUpYOr(iWghZܕ ]Q2kibg2ty@͌Fh]-V.~~6ssͣjw$uY1aTOGZImi.3c3͙3uq<'e֪Hۤ6Ӻ5©sNmx/:bv=,1U37WnݪԄ*\px](t-hKd~b䉞b'qXwP0˫m [6!ki\C#I_8c/KڽʚΩ(㿘jn3c{'4RG֙[вyqMy&l =dN͌ #rYU. V9w}O&s @Ȋ`Ut. ?;5J'p1yQ%7m$X\fR=mؽ gGS0OJ?Ks,l[gB);%v_i]jv#?qGio SSB,˿J1HA.nm%+ X:kP"N]&t;NVGO{yub۵?TD}juY +I?6hoEߏO]ngZ`g[]Jv lC7~sjR=UN=WG'F>#xt OƳz\T;jgiBgf%pá[-Xu6|g.3|dͬa.>F?{ ~ƺBZ֛ն,>@+U7:Ipf@Ӭ4 ':a.Â-.pq+M)x`E6i}3]s;vX`Jכ5NIpME|^U=K9}z}T8_(6N$ލ{*ƂX" _ t`}"' |)l]: +k޻@P,־K}2halVݢݝ%|RK>`=j TPН*:BQ?%I(VA~}i7"cmmk;7Έ\RKx1j(Uz?-1/ Qdrnj$b6F_%Q{^kLI̩>Y`sC{w$I@t? $H<6ZZf9MlFFF?6  (g]>0CyhѭOleTt}l,TE0gϊ썰e86 -!?XT2eE,̓^: +%P!o`'Ip!]ܾi7< D8EHcJs1CTx곹7& +SKW Bl?˘ q__]ɵ& [JWw0\_{,i_aĿp6{/f%˒BGUvjAI Y:1 l`V3W;ٕq1[yʧkiBFb8ziWo7,e1~ FwO9uArBIxXv܇i\'bEJw}zd&Sa]U e1S ruWهH.F4ږE4vXj۩ϟqop҅Ob)b'9aF( W脷&FUIlx waffS4#lTi]*UxahJp.dCtDqrlM6O\ښLQ V7+>>06M>pkc$Ô'S&`|fpϚO2~#LnDDtgm"mO藓 ȫk!ӅΟ-IӪ0IqJcPZiz~M$nm!2)9s6uq;+Aa_xڃ=Xee'ͧv*qW5v8рw?SO!Fz Ll?f\@fF;*NRcůL.,_eK [LkpUU0(=ћT׸albl Y?| pÊ޲`ayeT$9u05GGnvG +ڰsYAgBz'N@O8ޕi%x?o:Ѝu#4$lmzG؇%v5Ya/"%Uݜ `iV~l;9A%݁oWjzl",MIɤ{t&J(tV!|GVB0`02 \iqvSb٘50mDZ un<95jĜ F`cK" +DZge˔먻- AwٰgC9P6_ǠLƊzѼ tn[qSm;nHYL4,ݣvwC,L)0VVU!JX۲\vKW*n-٪+(9mh&*'!äHM[eϗԗ%d>nYCEqp"J1µ=A ۏ/a@!L8nW_yK36sq뽊!a P+r<6Jap~4`\Rj9% 1;DzN A&%л@16$D 9XS8Ul{ b +7 hI߹=Po0 O +ʣa:|i6neZ&-[^O%iҼQgG(:6gutɼp_NUc  +yE2=/(f{ܜ}akeeΆ qD?6-OU:\ j2jIJvhkT+^|0jC`r -@`\uWiF0F̊he:iF@ +'E]H: +L?;!)Nl\v + +ki"U$xkOzqE3p6ڿ~X8 IM2&`EĻR"ޭG8^2oB] W9Rut$;{~79-<9lTPɡ)67XZ&P09P$]\<5 +ǁ{2D8qpB1xIn "a 8y+ƀn]3CiEѤbjzȴT"Hh +o%WE`Ze7 x)ܬRqݞE -c<UwFܹ|&fhZp/+C@PSjWDC%3aYtP +i_f?'+ڷ"‰P?mPu"O)>J31rP(W YAUaN~ Zj)<+$cE7F#'$ +Ng s/FPd'Lk. '~;?[0dyN(0Qq"֬;U`sݵ{٬|a"Fsgv 9k,&B!Wi#7hgC;I4ws,to܍݉V3Wz[tb&컞:vޑXrI7~NQ18l^Y,eKgU5'ne0$yyJET^ҭ ~pT"P sA U_" bgGJqxVO*+sR"g$Q.uJFwOU"@:`>µ`$T"ZSP&|3By*W Wsh+vIE#mpY0V*ˣz5@ptg +O?AҌ8Fտ vmf/xxȇGVu_HxM80?%)dY+2#6tN)%ڌD.;Ȕݓ:"+u0}Xx%`nѦXdO*E`=wqW~_$b4J9{Ũ._XȤwJ)jiaǸu$(%UiLt +'NT Ϳ8ZOK1q܋I,(`4ĤYX+z!N6Cz[&ha(D8 -_#XfkMWM!u%_pLlw)h#uՀ+phծ|0297Sg4;LNҏ'6SmpC{jOuN#/?I~pmӦCb& Cvlb@+ MJ3"(i z待2<R?/gT0~2?%z6ؿۤXqݥ „⺑"~b2eaќʯ?:fL`31L>;kgLSt4c 34 ۬V'OaxigW1c/Z۳` +_[Tt>JMTam~*'XA1~7̙7pinXu. r?v?wLu&A_. >m.l8pjOpyk&#ĝ5ZWa{>R-#W'3Viwe3qy7O3]_Îu2uZzBC]Å_YXќsO(G‰ hsh┛h/g2#RܠLjշ zkz``Q1z~-fIcm&q0@ٺ92=9C +E ^6=^yXmkEm^c߾mHu(7㖮@V?xkoA")O<*愚]7xѕI& Y ӛHf){9C56{< (ɝ{﯑oصԚ/q[c'O{&6=|`FAbфcfߺTOib·]E2ߋUſ^z{Frlƽ1FXrs0B`2-X)sYFm1d3i{>{OcYlk6ks_I"ROBIPmYjTLLFXP ߨ:/e֍(>m(˨G#pJ,¨=xg@_ިԬVaSQ;o<#LE4oѰ1(YlzpR8P~ :~{o˶ff6g:r y:m`g".-7|W*iOݞC<];rm!n* nJ0R.VUt4Pd(MaՒhb) f߂խHgy NzIu\A ܝD}A̞W4G56>Vk(箯m.LIeXlZz 2=O:\:]Lo횆mmQ WDBY'g"= +c-">v6/ YE&f'x#݇ZxNC\4**j3r{z=]8qH^;*zxxy+==`h9DӦXpf-e89PͰާuϸ<tnS| Q&tsBfGӶ3y N_Nv=`XJCTl\'$ʖ* Uӕ1nOs4?כ_I&ex2QSblȷdo߈ņb6Nl*bV cF96wJ;mDe>]tl1< Z3x֑cVŁ{~*MK.a7aY$%ue$;r2 +N:}X+\W0J@)D; b@zFYxoOK[捺I'tQ7utRsL3H-~Xrgf㪪(/8r$u +^@28luu@5+Iz* DpxiE-wYGïI;wVErg5Ln\EZ(J5r>[<7bb{9=l6bl5茇."qZ;[IgϬF7ҭr@iïʀj ~ +Fjr׍5=a2h<'09mNNtS8#7:3. !73S:C̉l4>nyW/4hm*Aװem?>i{ FvQmyhkZa4'$L[r굓3$gξm-p= wL^LOjo!bӖ0<%2f40v&.Sk#ߞ:y/ͩjP?.|k.p6EZJnUY.\l낻3KMn<˶4G:2p)oiҡ=X {Utk[ +|ek\-3iyYhţ@':i?~`nRnx%TK}JQ71\.uRDskK!B*dC[Ri~rm?M?1qHfpNb?g3͚yIBEB#g1bׅy//iO:;YrFht}Pz&+L%p]Èe0 -ʁ); 8a bh$Ŏn+|e[~&틩ul=<9jY܏ N<ҝ2$ܫqi)شedsO;[씏hCJ7}8YD1;Vs:Jb'\sg&frOތ3;?Ӯ=io'SBp>L-M^ue3?k}kGXĘ& +hOd]c4:.d\IhͶay$F'9n!Ȗv7tF  +29kH4Ej)AwqGր9# me,S`)5|vZ"Uƥ4Nӣ0A"3?q,#1?t(I7҆U}738:. +}DCx\ܠ Fخۻ\ t0ɂ#ԴO_JzjwUkD}'<0 y>l̓?'{k +BǸV*wn]u%èTDri6仪Rn֫ k!2!B[&P_%jKe͍zRzL[|I4P1MXoteaHd2>ǕXKjhԙUH_*KEkAMT["֒mWͥ0vul+W59 kTO!ړ;S(mW~kHfnr(&6:\evX'Uψ8jҨF^r43bnB6>:)ˍSTGĚ(PscV9#Xp K:O܂\up%VXŠ*r+# 9ڇ:tĦ:wlQry)]p کVjoEf6AւjYN#e8tZlo|vM6^t$`И=jN,H*pKhMwM}5yْjqhbq.^O4ztg~8FXMl"uy|˧3{P}ȴ\Y5Uf?ukٶ\ٷ/!U4K%:dRܘ^6VYvĨ~"F>+}ƎX7fm=?j˯R19^L|;O6!;%{h=qŴ?2݌㳝Np842rezKd=H~6n +Y4ԁ2(F  nԌ&4ȳJT|t`3u[lp87aCVg0u:a8\t'2Wx)ٴH( ^)a:4X7czsߎ,둄[~=B5Р+Z1Υ?}Zئa^x"AMӳ;5l n!z%#( /2k0ZtL xP14d62N+YQ +gLjlV޷U׍%9Ҋߪ_ >喥"nP%>MK\qM[6p>9/$q#u@yb2σYEfژa7Lau_G] [4hTr' %嬼ogǔ5/cū!QbZnWiV 1mˊVmRHc +m86m?ߗ=֑&zVstںVS c@73\˱8صum%q0iXq%,$?]UEն"ԺE~ ս잆j]Duf86%ʹc*q`(aUxM˪;[re75zjXfѠsLTXܶ{fHZ43fq>~wsfǩ+eW%kK\7[ӸYq(X)W*K68>[7Gm yrңOB],NKMWNbC1)s.+b8~kژ.ǩA4yl2Y[[m^9]Tm?ڨnG;P?Ss_qy1hUJi NQ|dऐ}3q`$? ^e5).W +58鐼=Un!7yEeb +#ʯ$w*G>a45N WÕ7dd-^[j[Q;dԿ; ] &0kDŽڕ69 nV;A[e!ԭ4k8| 9/9;ˮsNNs r:+ ӼAFa8MBC[&iIm֮=Ѻ${By=QZɏ&sM\')jͦb|}ep=* 26++H(42wX΂i +]G!<^+|{t|0=s^`Еmq~@_*{vm{%:{ DBn>D n1CWlE5h*/p8sgWBf=cp=+׷;Ɩae'  Rǥ9kTXX?Tdq4G"t<䙽.pHV:X^ֵ}j?XՍ +0P\Zn*: axy^ RN'&1p)ߕ@KfP*;/V qp9&ït(gP3A(ux LZ ً@kcǻf'{Zs./!AjkkwLYO%@lFVpB,M ]÷{1+滑zc̪Йtpr:xb:RSX1!$0ٖNېa'^˖J5S¿^,`?ߓ1~,6t;%&̙u?õev^tˊgZ Z,21eƀUSN+^C3WGRYNRTXz0>hn"P"KO}T9r1 {,}(:)pJ!TY _,}Î*&Ly\ rh _Ww"S kthO/l5_Vɂ$ +mI6.m5T1rЦ z.|n;(οt#$屙dsmlؾṍgȑڀ`8IG:.\"N&bX9٨'G;O]c V[^ aJbVmf +"܊^3U-]dM;\B HWIɁ 'plnx/`.l%cZZҗx˿pv+#ݯ'_q`D.ܭG. {\A3μ i ]#dEO6`^.aGpgA-[{,~po[q~#j=+>kr{7 ,xa[ZJol2m43;&yR̯13># + =_:Tw=6kR"l#@O}a..ʺB>XSN|e,H`T_#,,%WK ϼw<ޏp`U_10&LڬҎ7Kz.fn$ܯcr7EO|448Y_{4|2lX3k-fo<<|7i=kPuyeBE hFaͮRt lx9uܨHO(Uu"Im t-3ش +}]^&#/TaGٌ2š +WzJJQǴ~KLJ/q-f:,[^FlRarak9i)kxb'}0k3UƂQeo-B4jeJˊ--o54LwsHaJ{]˝9ґ94Ou1b=C_9}}A}0/ B?/;_VSbφ"DQ|9hM$eXhH +M* 34MiA,> + +d lB،Awb"Y>| +2(mkm_ZЇz|; @^s1u٨H-X6r| OZ8rn<0 lopȒ{/x,O/ R.lRZ}X~HׯZjuȞ8IE>2mtMdu(;MUAB=jLVkrvqcK2\u{ObI 8, ]:툋de h|Wɮ*Uaњ: E:zTZ '^WSPx96L.a{O` !}2qO.ZǫV%^]Mt^uZxefBruyϘ ٫Oڿ|ڥ:LʴRhEbfSooNfܭzy4__'qATH D{w^cXubF|yf+(e H4ϊΥ$ ,J)ܳa%HK(\Mk +{4 +5ef%@iUfp:vQL]X8oa3J9;N8Qڪc=Ǖlk+!LX{wW_A~u3Z-kKe6]-Y V " <dN|u(>eL=&~óOlQϒ(Ol[SZ_N]Yk Jb|18c% Q NS&Q.u# a)Rڒ٘I}/jbY xn3g UYy#赘.Zu>u߫b [+\ֶ7y659=թ{lzwR*:oIl/t7y8c <t[U,RF9fyAmf}qG޳vx}ҔLN! Y[$50 *=0H_ +?oqMWyKŸfosBQF #yXhIb \Mf%~6KǭӶfvn:$cY&-0V3oth. YN}e$!f1`)!MҞgd@ +c_UH:^pSoC>+e*iwb7fQ= \ =C;rNP)**}j> jO*pٹ (å+t3ߚ뒖Lʰ[ڳ[MF.I YUT +W%~dPyb?k̀p7AYFG&#[Ca8׻r?s.;mޮ_MImuwLx[աF꿡~=\eO8Ysfy} hϲFXy\s=ldδҎ&3/ˆ0ĂݙdI*jjuRJJCvwb; hҙy` +m.8{(jt ש<ͷ6ÔqϯU 6Q޸ $ [kN$,mqbP׹?E^:ՒT΀x)8I[&4xphY#Ccv眏TppI"hIPQo &?ݳe̯=r gݵx6kQ+$6OfZ2j\og<9gӅy}{b嫣 {:.VTHsUxvZqp+ L#scxryU;J,wr8$񺻭}2ٓm<+}WRZNqY?SnO_)`˹Pgg9t2JOVxYfdޅ==p-簟:; 2P +Ae81.fˎtieMjn# wtӛv!zh%e +R]%d-1icÀ.ldW'#e|ԥCv@z5#% "v&4+I^?Lo'L6>ahxq0|.SOeV*oR*!XiFqwj:ljFz濔K8D>E_ +x3~eQmQp`-JPU/ G_F̌~<.6*]AI9$#H]e.xvJ+<t<[J{pXAW֘n$e߻R^MGԧ9K*qK@;ȿ􇝈 %[?ngO, @uF:^,wz'h5[[e0VumBg.92KN7,"mܗ葖)R6Cӊ~\5~2/j勒F狕gBWJb}93rel׼y nk-NE쩖bEͪzA}`ɀjB쌻_W h +^ +j߁]'tv)T5'r}76Fo'9k{`\$j:/#i`Wt#9M~ 6+"(zѠwEi!YZfy?atvscMEpfA%M6#GaG7- N3I'Z>7v` +J?&dɽ?7OsG}VΝK,kK6LR+v)f,5F- xvćC}}.jakZR9g¡eVfV*q>T,sK|:yi#U(oUՎυQj*Eʪ@a5-c Hn\sI|U Z*~bޫC*! L4OU\N yXtɸH U9UU7?-ʯzk%=jMZG%ԪY(ўfm ,I#Vb) {qיIIOGTTGd}R<߷6[l tjnqw\tF׆=K(왬6ƽEtF,ECNWkMm]J5ŰA]&.՝tef +@"աQ[Hw ƹ7ʈ5-) Ǒ7_fXtwJdz=狊z7ZOj|fTQa/W s[9%~.r;zWV{A$:.]MuqƻUtoj{zVmT'7F֢x-lgGUAݫOt#Ϳd.8լmYڲ +sF\ 3iwڜe[N7+4B_p zM 꼚yDz 9ǿ׷s&+'v7?-{m/}[wR7 χfPtkMȧ*4[-JY$Oo:?X/j~(^-L搤 6'nGtNuߕ}v& 7l.Ŀvۀ֐붗mI|N %O;`z[=w=\eɧ{.߭vgg.jq +˨|]W#{rGJ9;'L5zbؽ뇣poAy An;S1`c vg$yX>S %GB݋8^?2<18 D}|9X?sVȡu *vk`=08:Yf&1S 6^L$I@g?odzPȡ:#s1 hj'c_>:LOG)N + +=(ڝy!=z?%!|~enᙙ4'nK IK5Y;k ^o%{_eӜew͠UZNۦ'[eb\hF3XÂ断ߴZݯn= m6yr{'GqIVR#c ˚b^ kYM$ϳ^!"oY?šaX%TdEXAUQr83E:Uvpe<@,O=R?~6=z,~,Fv6n{IV'ڳl5JcrR-]\tLѾm;9$k%]X2 w%a Cp ,=ZljO-qȶ׼ ;_:]qҥ.8݋"Y]>`D* X̪ :#I- %LsQ2 iGq}ߕzeGsY2k3ZZ$ 1ټŌ~JGM+riǬt7ksN~f\g%͸rW%BgLJf{9=i|NGs-wʸ1w~Q}Ȍu/N+3 zbpqPBS-P8iF$]qzX%鐗ZTfb6qP”aӰ0qzb4“jK⾆`@*G:HlcF֧cU?JZ|4W#Ͱ:*6WC;4NGd|tGY{YzDz`șu{|.Sv|nR|iА_ -\j`mwkBH+TIy~ <\+ȌDm.3zԯF/Q-f;>i(:>Zԥٓ<7{Zm&arrY8i;VO͗ewN vܳr Xnv+T¬6vlj2Jww"c>cYSŴ0Bb펖,?eQ4saYDbq54oNZDU+hIJxY7t3;iMEu ~n}텍IVyQ?p•=-kf\ gm%w>@c:p> 'kEY WSJ51{,+VH;V]xZ=Ḇ=oRCllEҖLn uu<7rx ̶󵧡-T"c{v4N\ǽO8j =#ZYκ'[{\}x#~2KU~q=Ν,vh3GP p-J2J7F'O.0CDI~ߩt{1 ڗ7idӧFcyC*:wy~`g\KfLf6ifWܴ~W L]9x3Y֗xsr*3` $ Afb|j-85/͜ټ2O>#E-єYlyli~jژ-<3Q8i'7花we_~h)|Z,%2%SM zs2*kFu멏qroZ9xwI9ЇdT&hnx{<ur 4]]NUR5E3E,g@1'o rh C*zuBg- FEM$.ǁYUMFtIxCjUˌ˖`<Ns +GkK^ /<̉doCv}]XP?zd!7 +֝gwF_lvernu\u 䱢1 HPP;9*'cUll7K/} ǼǍ l_}IbMCNJߺ]:m|YiR֭kRp}\ Z`-u|DhOk}yֲڐWc& +`6j^+dJ'>`I;Mw2 #u'B֦Vf n񪣑xt%H0}YT -wSUb6(lz򑯙M_5G,V2b ׷^h\a?mKr]`X_A^in8ifO [Şzf^3#f>D>L\%SĮֱD%n9l5H3vE4ݎe9a6'<α 19Ӊ$3iG'[/dusցZgn6X`)B фRmҥd[XSq4mMMl鮉 WVa!ColqpwInZΩSQfHMbׇujU˾ZTŜ2S\j7})0ש/sx!!iȮ2Yt8-h*;ϗn 1N3T3 +̴>0'> zCߘ6ABIV%:7_Fnq閎?(;ʫ㉊iT{9p u}9Vgك60>s(*kNmEzX*d%i+Ʋp.-*ZzzH[TuKU_ {-d]ŁvTK Dʵhr-F]ޯw@'$585qMxi ףaB_q٧7g"5;iӤJ3NݎJV͗[\[QUqDpA7-Ys>vD]o8gOl&lHxNZ;탟WCwyxCh V#Mo&teA?m8Z[+#!x\ӎpZ6uv`ȣ@3q2,k)5Xu:ؼI)/w,7v$o@ ]8chčDK,Rca"ȌEk^=3uݱ0޴Ao0T|a}xԨ&0юDuydS4qq*pz'Q/2wJ^|]SO>i @s8s~j4F'9UmQvC]~t~mL>|f.O 8 /; }0w}1Dv]5 ic|9^̆PgM=lW1p(-0qUhf.߯LXqXC>Xp敗`gTPgGUcØ\:tnFoujS2z;Я=BJ&ZOkM˔HSɄLMK `Gl}sWƥjN܋+" tbEerC7y14H[ת8ƴї#F u,&3ЇlF5[6,$Vv[Gzss|g+vo{2s>Mp< Jz}1AjݱR#E(7j<إ oI"LBjJML-SLgx $ $ΗK7y +o>֒- ݚUѶ$*\#s +Ȟ޹)VDhdU`|fI%f{:!DFߜ]w^w$2lYq%țcWXE}X#9WW{m &”2wW:֙C&\I([zP%.FlcZ[h ѝ^-FW-v<ޔ4m,z xK!h-cI v6)'l_ Ri]q fon;Hd:ǹ[CAs/AJX秣 Ĵ%ԙfQpV_t\5g+)O vjB0wB48o>zu{P1Z}Φ'o +)qce& s]HE,ЃcIyyOTl{J1l{8Xc#kP/$^힤W5;m,W京Qo_NwH?1tx9ht,CLpJtWOPX7X'M灒ūt{\2FȌM_f'?Ǎāҙ0\W(ЍM-,n`! T~#H0V`?6L2 +#=WD;y/+@e2 tZʇ C^_jJ+NPÅ$ؐzp\,8(-pIcgXe[kc5'!jKH[q`$lhǙeOJ01[' ^f|*\)ٜғb"ɗ\ 7EAƿi\A]]>X@v|>)`sC)ah8_YRP5!:PS2}[Ham?ڷv䎴Hk=ܶ$|.l]ip wzX7_yd=92>4H㬀k桙){ B7SR?vf/6kfE-A +ujO=t{:"Y/4q(/F#}g6ZrHrP@Kz ʊ9O6s'{BZAgu/0c'xiLgʅ!+]I,ó|."_Kњ8c~iZ- .$;a+UӁ:z>b1Fwr%_á<=QS4A$>;D2Ss(_Sj lv?tAC#{Yu{伇i7mbmJҢS6/Pϥ({ׂ4vyexK{ogؓwkq5=$zV%[)1326N;.2UfӖmFyoe ehE C'̶P`^rDAZ>Y̖uKl_ AUIR{vv "# 9!f_5\%&$kc!^϶ZڝvΣ㸍 q=QNd\YI`ok|ڞz k?JB9u9f;"A~;QoԩpDϝݺ T)~ʩ.xVnfdT٪6~4 +?0ھ_mVjS1G.)mv6cbZ:Ta˓ tⰉa#RXM:9 >p| S[rq^˽ ߯ I57S:"5uO Dϗ?۳dQvVXh<[<~3uP &7P 0 U'L5` YCN f ݥ2k3&ղ$!f_{fN멻x]/z^Sfx@@K=R:%wPDױ9ZE< k0ɯf(6>;c[O F\UYM=8H,0t6WЈϧ6wpZ^sљ[DQ?^>{حhϼcx^d'*;bth_z͏ ?%oc#R=ˍTA:0jց+z|NkR]EZkX#iWȠaZ7ih_da``IN.˯rPys!ߑ=?W?^G6;z^U1&$5gH_i/Rgr6?3wTܹ17_0yyE%&ؠ]Nz6fc\UgA&ale zIj??}烦iC=jy}jƂ/rtZފ?wgҭi4)2|#_C-upWȗ:>Ho&T4^#NS;ՁI#E^YԪU(M9G«)IќF_֍-n2ǿqkjUaN>ۗm.pp rlUL<pJº_h(-߯$5{veys}E,n BRQAq2oAV X+lPs6i4p"#n y1= 2WyFgNJ7Y5$[ٟ.ݐs.d/0@cM,7fKGm9U)Hv76 u^%'ŕZ}pzd86뺼F=rxzSu=46w`;IYH-_=Id, +;J۴¹A=gE,c1^<>13KD¾;>NO/L)qL. \?c$dTqi#F~蟨VzuRYM󢹐DtR7l=D6Ο'hYlmYvX(@v0#2eyl>,qIvM_Cc/)Ӹ'5D2q<̿&*zvK rps[a)iאVƁ0o[{~l=(/Asϭ0b>]`/䭉G)G:U ;wD˭|WApц{%p6nDA۩&Qk^Yk8固7#~>Hy?N8W& jKw(%qP:h UsȼW1LO즿Ա'eM%vXthjɓ XN,n|EaO a<e9-Դh#ƟJ#78E/t:怴H}Oښ60ZvOp֒+7*q5m3SGrLB#trPo'b +bMz!ǾvеJ!!g?c(9;ifnbz, RUKhIh~OpDDVlOĀXsKR?z?$whBefV5#UۇX?pz0Bε +S(Oț?pv@2P/U/`O*9Yt!d"Ra͏M#Yy SZ^ծ, XmA֝;{<JMoATșh?qHD +9BeIFMndHaok}ݎ#{"<3p'wQ4FC_F+˅7d1Sƭ9uw9|.Sn J7/>l2`Ssb?[qя末owxdU 3Yڐ­0!/جLa L4ll~{[DW˘" + &ny9 D.~]<G-pSFO+vmqnҫqG"Y3p.J&N- בoK[3>j+uҴy`MvK3e6찴/.Kay,L'-OU*5kv)EnGr)u^4I>*OsP=Ci (ya^6)lf 2-v+pUWSаLQĮg+UJ6O[ؖMMYug2c@d_tWTa+_9!lDVAЕoi'q +~alV2Ûy?XY-~{Xۅ/?˛X) [7Ru#& @a4RA.u-9lHOGD'VSSdφk1ڧa6oBh(MWIMT=r# 폑vyIWQ/:k53Mz 2yj vY/hby\bN[U~!U>O"(;T~?)T;tk71ib\#JLA@Xv_NmM+%IiM& @W9Ыp8Q r;L:bǭ|fq6UHA&r +lީʥ;待']?^~ʹwy,= gXrGG껰FpG IMohc4ԋB6G#ƒÁz4Vt״t}gWK! +^3uFٕDX? x#8^'j%Nq6[pHSF*wqq=t("h^"vDʎU*ƍ[:4(N/a6FMs@nlZ婛"l̋C>hqɫ3(\N&UL ]SUGRhUɋbL0ϕOif꫺6θ ]O +3=yhqλ4_D4kmiS~vk(l6|cVHKz~rhP]}X ewR>}CtdZhfs[Q:-جJpl`96|[qeF|L[/Qi:ן hc>.f͓PÔnKKX,+e tLv"WVǜXm 5(Xwg32<ߘJ O{fmjj>rt1Xa" LgŘר3;|Pn6.dr.f(BkyʓH{(r4pwM ~zq,"$=5nݢcKr*ىS&iL{Z1~;-!Ɗ4wq-M;@viej+f8Į-҈^rZ,8jsb8~ȪU2&)!tfjqױ߽Fv;l/C<8pW=dVv{yf,F/^*:v3hѽV[SW?j}_xXكYh2<ˬWZ!16sܲ$m @! 7Je}?VDuvN f0,J&A7w?~!/yt@݇IVMi=Ga%pfRiy'WTAۮ&\ V&-FhyziYkq&=>CK&Z/8j3-na,F!"sA,cĦ>m_u2ú2ce~?w2m-d-/)[:KỊ{E9 GC)'M7Ĭ7oNAĒ).$ O. B݆ +th +HLaDUۦLj  +:];zs?wba?Զ:-&VHƒzWo`5\JFll{mv2L8BdDN[(K{-EGzF~fv`dn0n3'_=fW;B#t.-/,YM%p_%3T>P_. x5ޯBaU:%Nk 2g32iioå*<1FZsZgtN"a8z~m.|:,meUfkY5_.=s촾Dt@zOEC6cf)8-[J;4'=j35{b\F8-O8+[DH?onF +LЖ-Fِad[$Ɣɪr(=j /D|Ȉ/ %ǶXpZ;(L3 Uר)⺋H@7H +C K:g&;7dq4: [лl}}S*g)c}_Ya# #w3y'XFID9ڒ16+Xh3N`H+ IM +O#a [V @; 0[RY kbTMەǗ8HXgtf$ !Onlx1~}Moݑ갖]i*Ij]uH܂x<ωv!LyT WOY M$f o RRrRhut5! WZjH& pk:݀+ZW°8d}lVqίe~8XeߜT\_H&:=z .a'F;~I;L %2X0u;cic,'-l]Pel0Bն2kDQ =1]9U判35WXpK%N顫ߵtS w?αr1?z?yHv!\m)jIEmDX2:t>mܩƕHW|$x:pSҌjU<ev!Fn0P;<Sc9~y2iFs] e굾k$X/^vY=3,O.ws-m\èKZgr:`HFBƃjF6L3~vP}*̃Rb&R|#dt+!R-{W6M>mj<%GяoTT)] ?M3o-[ Xֵ)p.v77TIy %M6h#S:5rZY,{TQNMgnOb~3N&Z>Ge4b`+QnaUAlx`iZ߄غgCc5Ŵ-1"=3 YN 0%#=nϹOؙPenN/<#/Kj+`*rk܍nW֊ga9M%A)FS3vvG'_ʺ#Q2O3~=7i D aoםW9W>ptxck@=$5f 2+4R赟>H3JiΫqyIU +Hzrx%68n?v-zr4k$4@GބFal9hG& W՟CAۃWxǻAJh{jxbg/׽yw:r$g@ efkb7goitA#4Vƒ1{S@ ng _?οv 3ԎX.fsL]m5uN= t]BW51Gw6԰&G8AD CUD)CI dQ\#yMTע/ LiJ& -2;%a{b2b_?[Xxmֽ&)U[nEښN%c~^m2ɑ}^Q]u#k4sb|=r\ +5̿[Ԟ<aO5,(\x^xW]20}ɟg-PЛO[o:g)ZnbBw@Y=;=㎆s#%oODf aÊ9Yxy{}aqkgLB W˴;4MBY6+gV1@w"LAp2ʯ3/29B㭺`z\L坡D9=5GOnkq&4ochN$iQ\V|Y⌦–\,2פak{8q_OɪTZӶcUk_1§9ۨ;ghGT:;e`Qj\8Ii*^jb۞Qu +MnYur٦kEGbzg&Y:.&*"@}t.md˻657YSzk`DKl~ȕ6T3ؽe]~TLKhF=xg̖Ւ-a?}ܺ5`M=eةUj^G3g>$> /E`f>ČlktÆξSӯ$⣏P7}Ԫ/2jF{q|^R`wTB6m@f\ǒ=umMam7[W>f.3cJeF{('Q)9L脰eE~U`cѦt^] ZL >`7ؒ +yaL2ܜpꈀ^Tn1ۥ6fQ2y8"AJ9baݶюGV"I5:ƒGOUϴӝ6Ag +{;Uf  s9RFݯ3Fi_|V΅OdR[֯;FM.8[v=;%g"# +fٱǾRʆv΢zﰸ^IB9 \Y.~/`^pBx*^PG 7VՒQbJs?ˈ[jyV$;?7ß>ڍ!sAz[NKLWYzeONcȐ=,-$HU+ÂIm"w]_Qz>xz7(70f:WXXy14?E&l) QI je  sք(BڣRo 9fsmW`~f#-la@-Bf"k^yS8`<5AV,7U4dVަSE'o˨Sjt 7#}RQeIْ4+a"/l痰7l>- _-3Jj{ _+6EbpP\s~z#vlۡ u(7#l[ͶngzDr-jzz@ +D[R513-_W_>4n1Ȁ4g̫ 9 Ot+, 4 ]4saDiSx U/?(G;ϵH{O&d8A&h;:އqDt׮5eZK.ʴ;L;7̋= }.g# b!4xbz=\"y[~Ӂc8F-z!{xH>^+.>֎x5U?OPEџ?7X{8?K>Nz'5,g^ [kZ(y% +|x$4t7gaDz/$l one!\nԯ!`gwGP~lM#BȬaY wLgw&gմ~Gw"AL6U[qe{؊$T^Fz^=%gP,aI+{{n`v#UٟY#{$9p~s"AU6 +=0j'5Ghn%!" :3L+Ex0Lx?q +p᭫s͆7Pt 8OkⴹYΊN֛wP)*|s!@?Mmի<\qjJSITK.+PP ty9%/ ut;zkfcuAs,8LCjf wڇMx!5vjKPk^ 9%YE"G!C?؄f`y_ejk1юBQ?/V&k9if40_[U{W_2ߝ997ޝ군3hxtgn {;;4Wa™ Pҗ VRCP$m/-8][zz%ύ; R@(H3Rj& ְE(NaajMHpWtWh.Լ&kN;׷\FIj3x"`QD= Rc4/CaృmUv!զ7nHQ"JK :vnHJg%{->QS9*i,i"Pg7,#V۝56 +ZZyEWsf6\34")yCyI4~e6QO h^eu9cďD)C@ *|N0ŽtOjtl5Izq05сz {QZQ Lɯ/{ [V/SRf 6АH~\dlo ׃~4-$?R{z}XPVb>n^-S72j[$_$K7=M/0JqM֮Կm/ OՖ+}bElwjz^߃$+K뻏Zb=9m{ا`3`JZ l}ދ1ca0LQ[ދM^J1`MJf"|)*5YJ(SN[ޗVvDUI|w(~G lʦg Tf +l~PHk#j"gf׻[Z#j4]pl Wxg]n^بym5 X$&A{(V:[ujΎP]pmȚ;st%]RȈGuLFyp}\K/i;چU.h\@zZ|!նKD%NTm4@ m sF_9~o#*D\ַ[n9Fٙc93ɪ..8rJV&{nɤOng^y!SiaT gtմ1nWnlS2W?p3}op 8F9 ұ"GAk8w5%F]aVѕ +W楚}ҭ}7 +;:39+ެaM;ZD8m$"T;_b/2 Ėy]Ӣn QUn\ƾ3[2_bL6rXTz {Ig,S/iGҍG9`LogfAΘ4ųSn}5=`tW{Dѷ {ǽ Qm<~mmL3>u|J(!b2~qQ~Az~&+Dha/"Ma| hnЙẁZsLo:d+cFSvڻchnNV۾qIJq8J{GĞ'V7!aM`?LDۼWK JDކ֯f)W>Ged U2n +.eUNgzt[xWuS?Z&@DŽ_~\לSQv^h^T{&M6f܃[Kߎ[;AHϴ~m9&J_þ.љF7|\@4gB34pF+4"\z:pN!y>S\KXuW#n_pr;C&.2tq"Up8ZdC3ŶlzvCYhgP荡U7a1Ko5)=`J:7ݪLj|AU{Bʦ4OwY;5HJ;mԖ\߿:U`AESsfbuM!Xt"/TFv)dx; TbYJau +t-p{yBpS&7-nb`[3q d&7)"Ư}k3Aa:ۯ1$C@Kp@k߱IJ2j|-YQWQ>e'nYFeI б9~EkU½fydosz-nS|ͦz,DŽeONv&ZW^y&C4w~[QcLh5T=ji-}[MʙIqs] }@ rkBKΤAiado~]_.03zX7Ý'!cҟabҧ^ӹ Z\ @Y`*+y#q9ѧhXpPX0IMez373TRԚa9{='p;=72|"@;+\z糒bc=(gῳS.rpi8ckUul:Q_1:sawtѮwbmwYwV d=81CC\R님B{2UgE|@bQ/g +4w*~*|Hle0 ˥nIvMf]3/ScۖG>\+rm-ܫ"_,& GI:м(N$d Jvwyȫ-ka$.Z.(lm/cH4H]k7jOZxef^h {Ƃ;QSXnF[1w;"?|RP*?x/dϲ0,ijI@ND vd)h6*SXu&zi#UYxlKUd1Rt}l?_c6˴B<ݧz+`7(t ه:SmN^`jLã6į{ 9iUiB`XPw>d ' \uXOW=k~H-j3kr0kބd wd6jO;3_yvsDX[ +7ꎵ_T t-{̹m0ṿ ~ąӝYfQrPۮuMժZT>QEw0iLQZ>NcdK:VpL|A[:Ǫ7NwݤjVIS|3Oc r!}g@v9^rj7' pW?јyj>u?Fzi > "0^VB8HV` [TLbxy[?\SkǢ{qMk,ZW±jWQL+5j 33㸧 GBd>T9؟B Ьd84#TtEZN`hhog{`y/KHp0DVTX:yҙ֙~NvQ Y>5v(x$۠mr<>kO:?oږ}@{g8R1oa$s]ljJz +GF +58^k~JrRQ-ZL>V#i9Q܎`E_]xw9Ȫ/bv.Q˙Fm +ߺnึveLb>5;x] D%LNLi6TVdE4lyuhTqmJ,fIb\s6RoGrJsql F04L󞦕CpqSH7 +bYcLZ=1o<į`4;HLf3|W,/{Nkl[3SK_}7GgLGz87m8eָʐ.I> q.P%N)xӎ_4'#MN JV͗=L<& {GLuUoGVV-2no*=D?ɳ:m;ґ\}o/Vb`akzqվ - +I+.`CQ6ؽ3!qi +ZaV zWY^S#ɋ$FAz4nQ gX`!.+apZz+mN1. kҨrOdӮjMi`K!r/\lFz im#R{2f#_w: +^ :mbO[J7WV2i9NgUb=f'ukV k ekМVܼ6Aa`H$gCNJ 9`La'+$2 (2a_HWF|ibUഥ)z@αn +~!gZ'}_u6lV5 >ڨgyؐnU.4> f)m. ?dX<͆]L䴔b&پ +Z)!+Z{:C [IdžRVqo+<eaY*dj2 ,o1"'=I,>WE+EmLY%%R݂*%z&N,XFIWSX΃l]u,K:uCw^QoYP+֭tvgefy%;ci!γyil"$TF >9#նP3hߨ`r +G!7`XSm)RQ3 hnc`.*N[P඲^QtӞ:W%7뢙e1m1B:h .]Pq^)ħ:w^2v?FӗEW`::7EɒƁާ ؏ 87 ?*)&K6L%qi9^Z$*(zJ)B{w5 Xx>g%T@-? +Znh~/|H{(> du3V[mTZCX$)~m)˷.4MKtEߺ KcmMqx\&4M?R5xb`,A!Td+d:yTPRy5},!n9>Ѯ>o(,giQlb,qqXn윤|j3r Hsg}f7!kN.3朰Σq[U e.m>gC6^4ǛҔrLR5JBWClc#s ~x|L<(GvNen:;@|♵MJ$QUH{;;r$ePY4ٚ4벖w-o +\2?@!{D2acK "wKwcЉv֒-Iw29R>*"wBQ q/׽V)z5GvXNWCM{M(1sERm/'aĪSshH?PrIeF>Q´X5" d +sL\TIf3]RyK,@]jnDV=$cNeL(Zr7hJDZ]vE%Ր$]yXHn,-[ Whݔ(/p̰2R |r3yM7VI+ >eI`]0V8ʰ,oeb+~r/L0C\ +ݏW0ؒ˔8-~0d(7B~1~^{rBE?rK5_ mltsB,SG )M+f? ZuҔRgYJ-EenA@u"/8EG-s_ EB 3Oadۺ +m?VtIY<>HNj N^ͧWMȎ3RFÈw`VD,mfJ0|e#B>GIq8]1 yżSѸDEN<"#ȳ:_/cdCVF/we#2g0DV`K9JK z4zE9v|PsGX BF2t!(GsMEhxuZ4֓5%!h%}. /CwQTѨԴjQ'%#r:GN'.K +hݠ.\ST:ҶCC#_:麥Zn\lKa5]EaU)5%V 6KKSZ 䡲BELYu͜.{-DmvT(.i:#<(T~?eGL޳bz%1x ru=FݧFzzpe#NX&>R΃fGJ6l@(|^RN@% NSXцU_Nˇ% 4:\ё;|E0~N2E?a|!#~U1YbN{;< IaeɀDIpX$~IyÅCԂ9WsΟ6\y?~]߷螹\?Z\;lϦNAt߆RFGov7Cwv$AuMu7ezu},g + D{2:RѸ8L{'vz]>)ݮQ~fC+ᡪ)u/*}{J34@v-o 1zj;3"ƨC&!;\b 3{2n4ǁ>O  m^o_$glJ@@4Vwc9?vޜLwS9 $lKUCZ9|,Gr\9ʧ+#-_{M_w(ߟlYԕr6ygh1#6U ,ThKVJ$;퓽⭥T;e?*%Nڝ]c?*Įl}˖S߿ ͒'\mSs׽vmb;%߶4q:E@6L0Et5TiMd kǵu|d/.Coޥa+rsK4/ 0ݰ׼w^.mXrJJƥ+?](XqȑUGOdƵU'\I2=Ѳ{O Wt<{'N_o7]e:bD81͂wյ+aO^]gu +=[A8`D\J}SK+"Z[xLT-LSk5\Rr\[[Wo T~$RymG:dVp%ωkT"f" \O%vGvLg̿&p/ԧ㯶RBuucib#94y:~x aɎ(Kbƚoڭ9{cHI` QUa:Y9| ?:QM>١v6˴ ,]j5Y >尢2ޡ㛚V`mŸxmrAE8y86sa`}K,Fs;kU73}|03GNlgY@US2cqEfl4WJfqSmXH[6ˉg +=Os9VV#>UL3$ij(6feX/sw5tܬ4ˑF?fG;Ág5Åz U}>^~Y-}>ꢖi M%'ih#G$Vd',)N |£Ղkܵ&2VShBxd:k{1;e~;pU.D=:+EZ.17^/} <ݭ.֯e8WIJtSc< 0T eX,!L2!D)Ú +Kdg(ǶzDMG3+B8P3Uq:M􆇟v@.M}X2QRN&v5]ִg9s!~@>N :luƩ tO2>W69>]9sB8rJ^uY鈛N0s_C-x6iKn0(jnG + Oh{t +l.wѿ^?( r1s7YӛԐ*hZ-íWFiB1Vggs;\u(dBA&&bg V3S/ a{j询cY ̊BLr;csU]SUŁʊ .REF_CJ +9E<ϔᔡȲ6"mUzt+[Ʋcc*/ +!^ԋboV1z,TOU Xs Tί'hsv7 jCtCW_KuDʰ ,PekGBؙ+uUX,_ױb@/,tvs}U~~VgieW- Spv@k^7v8k6b&F̀>mr3%nt Ancox%T+b<l#`ˊ:h%}acrZDI`$dG \!/*x1yE#'R2ٵKG~eUp$4;`7ĔN+[;)8 BX *)`:-Tr_?r]S 7*[\Uɜ+ׂcs"8qkYSWᦱ  "\ҫhim}Kus-9'6V~H]n?K!뼳/sb7뿇qT[T VMGZ>m3kef5.(#3y-\nH@jŶj],׮'M5qt4#@!TD3p @H?O)ʶ/ yť-J);x+x +4s1g#ˌT+-D'XV.ym,5mwkݐݮnhM wW㼏*l' +gWX޶M pKz^e"(9> IΫꢶ X]Ǭ]_Wa'% Mg$s3:{XD?õګ3NnWin7s65;}3!fl3N^֬I=}D +ET'}ou])pHČ ZwFѢiҫaT=1^ ;S2@W#ǚW3nYh[vz(ojWN۱ZnB\zyPf;U{'4nW]Y<f΂ay<3qːsMssU?M}ka1x͖kgY0A%u:)Kj=D,Yf}4M +Jƥ~Kj-C&6J9ռ94iRH֙qxeS#ȟV5lA϶m!8Fѕ +t7}%KA>u9ԃ.篡? *$^~liS dCLYM/!,AO% .\˳hjO|Dm`e^ﰒK(Cs]iVW[7Lj舖6=-NY`X~mK3b&am_ǵ"y.gEkJi)mWr8ErdQ;֠Oi+<1 AG VbtK׃G*>&! p̹%aMʶ 3h;6,s4FkM?Yk|ohLٮ|Twy;$NQ@x;OE&W3lit{b%.aF$' }p8Vn8TRI `5bUquR 6 i4 y5P05}8$mO1YAbiHՔ׮1-j\K|;k^传t :[̻4ٶJXT~E 6+XaS$1=Y+f=oypU4}Y&fү\7cSG$©=2GTESj:YrZqj H#e6vB;LC ֮iB.).r ጰl4S;N7\x@}0%06:D'6̼Z#XShUCG#^LE.g̦X|33v4"Nۜ^g*Utqc\9+^^-&m#H,Z:l#nH ;>kԌ| ӛJ`݈/> \3,!vbdڃ猪%k K%p* (N<nF=2qQw<1<8C/[XTxJ%IY_?AmX%WekpRݬH3\ B0Kuv.;a\)>Q9hֱR;u,ӷIҶ@گCygE^EUa:U,eAyԏJN9Q/>!Lv JӸ8!4@_N#4I xOʵMx3ڤ>}IJzq`b}.ʰmqEq)po;AMojMs m~.Wm{9b4ר222nALZOIҖk}'=blxbHun+zm[ 5B6.nǠ4fZ|]Ȍvv\pvKET,| ,;Dhx$5DtuFѪQӭBQcE4I/b-#Q1WZukkw \o|I(!G|V$Oߏt#9DCj}y +R]LN2.F^ $'*շ6EX EQzT9tt֕_ gۥO?1_rD.HCg~Ke~]vKn[;yL08zsoZF0" 2Y9~ƍf.K4Ӗ.ze&B܈ףUke< Pd-!ũ™J PrTҥe>0p*uA*ΫNvu 4axxXnm3%O` + d;ݨ1-ylD6 IOЂP)ōtP}x'FY'0@}lf0%!8mpŅsUQMTFe-/2"Uc])E{t\f1 +WӸK8s;47yϸ2O4Uǿ)"2 +nXTߌ hYc44%D\Qhg| +FF*zM=42"Dz +dzْEu-fO@+SVˊbA+FqQ@(Hl1qKBtU,#8}Aٴk*4Dx 6ڟ.C{ehXHzIj#ij%+WzJK/ zӈ`hT"Dw-罭)اsIjOBB߃<8+׃E@^ i7nAߺrW+G2Jé @Nc02̓M `Clٺ++2nhUpۼ0UŖd835m=ѭdM& +"OF!KJ7:<\ +̓k'4)ֺm*F0M-=w^6a¶!n +d־^~eI2e f LIβ]i NC?1maKǯe;BxJ`Ia g=-p>gpRL~ Va1q kizUPriH0=Y`?Ѵ 놕=3vJ5]2>:u=[cDI|ny +* +4eF6Hn;\B;=R`J&v[ ]Z*XB Agj)_udL3ƦB݄Ը1\S.Qo2dny^[Bj}_wQ:!*_K(@geeb#B"RőS +5|[#%f!E1;Vס)aJ}|wmcw0L ;~/m'"jSMxM-:1 F 0$dFW%o:oT#y1 TZVZ4JA/}^y+@"(nKK/Ӊmzn|&S#Ms&.2MNgX4fת)6x\Ӗ^"m_Ψw+Յ_[马Y-Hek' +j4*/ims_uվ0#]M?kzI`*pЄ4(s\e-ӹ` +Pa*F㢪y#n+AEdm ': k:a@kҰZI%\Sj_a?C{.=݇>LfvftBMՆաh[JjTѥR^y E*Ws+{թk #gC HR#Z3ŀDz AK1N{1-ȉ:鉃UoQZש2Y Zfm֡jw1 aKOy$9@t_ d {Y#f)B  q[0B@=M2OE͔QFDLg Sj6?Te߮ir̪ݞ^lmb8wBck@Q%*:yaIwtUmtGz]A6-d.&@Fr40vzzchkV:r4$Kㅉ+E ô6"g4߀!^ mKJaH:/ԞX9Y׋|ۑ jf~`e֭J=8a+8jrjc>|GϬ')&W<Ӓ4,ϰqtmYu%ExO2ܙ7^棲#!$bRc)Hhm e'6gܺDh6doZکb2Ԑw߹;?NxX6 +~-=6Gkp:l@_pգX,=įIJ%Y+v1g*,J<> +axxU6NsRyyHi8Jl,ӷ;GD7B*6TS:3Z 2.=kBͰRUcl2) @>v O{mOiFd+@5βf5&U×f7m,KTHFV] (4>$u͔UmDj #IS9|g (aL{kWhx_$l<Ár P#e9G5sp"e6#٨B߇62o.Rj+L|4 _0S`qNRH5sPkYĝ0Ҿګhs)O!<(?({ճ%*#l _oo&yTyT*{A{X",ȉ恃;gXvs67bzodDCG3I$J'vUNWZG!_j+,d㡊 |W\MR5?. lzn(i3pJ'=ӞSjnawv17]anvf2ϳUy݌,R,v(G;ҡUo<\^[ nwY1mOgVMdhO@*hDZhezô8z"6,D)3ۨ5=I\LH +7XNbm9+ wYi&[zbcyףYit:,@Q#xyVx|v"s񺄑,3?F-*/G.Nξx؂LJ㼒X{ h`wC遦Ϗ2τR 'GMbɧ\G0 O![s &MHLВJtՆGT[YV8+2VQyɄ?D!Ϫs_ rXT@CY*#J3ZǛrtCH܉! v Nmp !a0ۈ{LڴTg`oij\է=⳺5ӜPigY\NU~4hP QeBiCڭc2T;tcA l\hu"-UK3mK 7!hZ\U!N_!y@/96k5w3{O!n3O1fw?zu~ZR/ +*ΘҎDZ4k*0s6!^S1i>AU4b~,~k<5fҾ}8Gٸ.+/;cI1.s~tvHg EzO'@ 3! C3 pi suy}i;ğk{ĆOL.' +#eUYtnXfܟ,e"&Ύʹq2&L|~cUssi| SV<ܲm U4 Hܓ7n խLcc4.U#W +"%zOEb=G] +>Ǹ &Ox~- 8!|ǩFl_ɩ"筕o#hƮPH/gr% B͗I.*ʭ*"P|8iVHS%~uT[S1Rqnc8OqtW$={{T%|$ U6BgBd$_ +2 -x8w]J"i7 +5. *V{ß,cSi0b琰@Lb7|.[0͆xfT4ލQ?o?*\9qGeTku0sH>^Ӕ ļM8Kʫd/eخ6JaN5U=nz Rx|\f3s#ֹ{yM:qƉ%}ѵqoK@^+Ru#MzGn;vL[gS(3'mrk Ε1)yJe|pc=ISN9h\03%QU!/}=CBN}V < h|٭m37l(ױ +8K{(1vb>P8gUwDv~?s Yȑ*7%]܇vťym ܹh"::y3j+{>>x=ku!H]2Uw>La-m4Å!|dfPLVwV'vnP=[[Ƹճ8w$:o6eMR^N/{"_ M")-˻#֥]߶e*_N$t+l'X ~S`E$ : Or`Pc&J +˷f{:3 qMyxUUUV]z?'o%XH=ȸ`EKr.Z]b]Ќ%C(iwrf߮`H2)}G33J]u4Xo$M9ʟ#*p:!7srGϒUޘjK{"!Z>%gESn).ׯZ<-:>‰~㮯mX4mIјH[(uyR!%];2;^S4 %~~>_4Ck?4Dd6& +WR(W&wn +Te$]q3pu);*H6+HDQKCap5?b߯d?JW|UxRGxkwmig QrFzx՗2e"Yęόy_*H\ȯu5TCʱ2ԒpJ{Ѣ)/Fr$ ۺ~yIUuo((э%]p]ư4Jy.x1}c+483Xty;e}*\cX!_~n>p4Bm߲//6ܮ[$"[3.'vvλLLex H)$HsV%.;-Un_ص.K&j9ccozQ_aRpnmn:WҞV2Ă\iӷNu6{IeտͤWAaRzB.5)"c8ɯER"Pk4#n'#R3Mn+Z^_#tt|Odvv=݁U4#"T*rɀtQ¤Bװ]4i!TVDÊfkg'? vי3 і9'B}Ms,1vr{C$Ե_V[0jjY-g{{ߙ"2T'ܙAT_O>bDcS[2uoؿE&Q]A+.t>~26~36CS~P0&9f,8o8bԪsCTUJH*J|y(=l$01+}1yAN;X9IzZKbdq̓gAV@S'/~1!fDe'Íp-|8\KŘPlh4$$[ˑr35K)-ҒtI& +SO)] Mppʝ6XNg##Xh;[=$WT-2{:v#= ΃H+*!=R!Jú=C*f*x 8=*Z.vdJ׫%tamh͈Ujk l*C2-b7tӹ==Y~ylƚdǙ6y"ܓӅ{p;*BoGB2-Qvnݛz&YQF2NcviT5[O >wxr0ǂDS/,ރz+D:<#eGT9.]B}A-Ê+m[96",9Ɇ淮vVR{7rVg @EbZ>a/ެG:LŎNavx۔˛Ω1cv-2u%JG+/FXP.qGW` ]+~KZ);f[sIyfĎW`th:~?diNiTu}l}yrW4&Y5f#hkNJ(/b^@s%(zO+Y +E3vCR64 e[G/z  AeHHoɪ.y/(OuB b Qkt!I%\GK#oIZs86! +LJJ#E``*) ?zW-:ߟUC;>V[\/e8N1]P!LJXG:θ T ĶyN\??^Jtii?M8}Vgʟ?4kW?0H 1-IR+ydھ||gv +@c\L=#lRfn$]P &֎Jt n%M[" S h7Mxhw:{R\r1)z2\݋_O-F *0N$-,j{Mз(\|]$Oጞ2c-~NÐ2WJ RbNLk_߬nOf1Xbv~7IieɊ2_#Pz05楊v4?SjqK= 7/ݓ@RqslN o-^ϠDFBmsލ0* e7Q32g`IETKLzư5YrZD qaOΓ >R;ߏlH xQM~('Ƌ)U%wR>P#=P{$2PګkKbǙMl@V#ujaZHr`!{/`X`yN*P99YQ,kX0m.&ϞfL!*Ỹs|枫~R6 ӬǶSőc}"ֈC?-vJ0۝.}Dah[ŧ{`,fv Աs:j32^/27װn+gWΥ` Wm'hT->18 +HŐ3Vy -_ I_4ulꛞ?'?|hS׈77uo \Fׅ/b ĭ@m'bUkL4YERDG*X5DivJDb3."2a$e<]Ղ晘%RlCWcgbJ]mjw˳N`g )iMXQq7o]2 }'9QUCg 쓌{܁BHsyo=#]`^fUMs?NKL{0 wRC*X"-NUY24/Ob +0l[4Nl fzEU_yюd]k蓨|9 -:a+F %jPWkYsninD$֍=O{_1eqY N-[_]I8HBus@fvTg6G.g ʡ@9akAms7_،>Lx1EU{Z7_~^ q@oK=0O튤#`./ݾYͧ΃yd¸[ęd֟2[l'e[w}l]4us8n˂c|Vϱ6l*&y7ikn^+b׬ ў]\ hRc*ʮۙ:r'fA0B|mf: z6uzѮ Y_ _`\0]B +[-q A}6*1eAL7EJL[ɥ`a:ޱ?h7'J&[ЄCP?"ơ'rxW3<t˨ж2lpk+ns[cZ̈W)εSklqam洖-%GsE +I~[26)jvs2̿ǐsaX{ M{Hg refy+a愬Aj4o^.m4esȻ< Jw] -F#Q_hz^EYǁh$uJ9{!>҇hٰ8{qWX߲$˓xR?̮RY;U\3+MY1 uצtk%\`Fǝ ݃k%ߙeq?( m[@¶tj +08dgrGFd. >p]r-RE)?>" 5Yw9*$ƴP@biַ5=-vj58ymb<ُKgNq bnbֵR9̈́;8sfq؇SW})Ϋǐh Z=pfz"`1lH2u}2u*yWs0+p."fҜzj#$N|6.5¶aKDeM[H!ڐ7rŢoH+-GhH23o/ kd +d}RZeh;Er\F@ON>D#>Qbb2z+ènV;| +*̺K`ۻG1okdG4'2fd96mws4)ײ:f+':Ւ(`RUfs6r|\U&2֯Ι1=1$V{W cl3ٔfA6R| U׆ l'7r2Sқh-ýSGҕC۪+58p 2%+2Ѯ^169P7-N \=P=[G/UW< }qA|%"#-Œ8']˂ kdTv:X7jfuN6JǶ uzy*Ok qQ['ԝDG>ҨUCN R1hoi9? O%E_1ĻYeb.-J9b÷ZY^Wv77wNנ!a۟5񫹝~SylE}yOG#Xt.MQ?Ys 9JFIM3{QM$28P&]#9 oP]KdWc\hGW^Q7Rhšɭ:P DlygcL +Dmcu8Y~);\;6umlԙ,E~nG9_*;:Z0!5wi{;+n;qpnţ4f ,c7բV7l +tIjIWR7cy2w, q;c:mۏυ~ X[S=i\= +VAz<[ݚ=g2I$6cy'ѝb +7w9o xjBZZ ZsC/ e`ߚ\E<7,7;jS(F6ൺ s8x"Wq^l;d]> XmkҧtFA 㘞UAuБՁQӣY9;Q _PYWA隘ߑ&!fyh{ߔV Hu~4647}|.zv}9- 1zӏiz9ԣmk8-eFCΰv0R6 YuˬJŢ;VX2|W6-Qj66~??54NZ3<Tuh| 7i{{R}6M\j\\;!nm{E-[tgu:M96KmYVy~> ""1ZW3WlD~~}_ sy>M$YA`X&oZ/AHx +GRup"6,&%3ֻg1eY mw[5{Q"HjFy`hO:{*-s2xn? /pWMm%S2Lo 0)#KvKlEo=[{*mNr gn GP#lK j2ΎZ[(Qc"_z!oz(HC(266cgqi!9@\׵V{;;䭵{žv`6bW!$+AypVMcTZB +#k]71_ aټ0ǏװjI| +$."21%Mk-'lir +6@T|pmQ + Fv,E!$jޠ%RA[ݖ(L 㵂ilڑNxvJrOIqllb:4EgnT$ߚOs^*qw4dn zEhNZ.ElfAͲ$FxњNڙ49|{aF`|DVc18VcqKu¥$n +}*? +SgW zxy6=,.,ǻV[U[hd_6y\\l +8ݴ2^!s|JJЈQ#  `94Bm:Y` ]pCT1cV9⁼#Q`,f +$)vG[ +iU2#,&k[X&5,X ae0q1PqR_?ʰQ& +pւ8 7X._g0>2nBς,cyol %irMiXK?4,k02x]>d<򣴕P%ݹ cEAwk]mzg$'H%SDy#8רB,Ux1s,nr ,kj|{J48&Hq~oM8r&˯zjׁb/ V8z]HJ?Lj&~) Q#ant)Aߙ9SЍ9I@3Z{]J}-.:B.9RԈ(dP?< e)&CTt8e}{c +1Bs3Rszu^wo9>S5Lu2|Iќ)vFmm?jdoe-}||=X(Ӣ=qm(0x: +Qz]u+=WZ֓BI3MQyq-ۉЦ"Cv X}Sk{2\`rF׋}z0WM5ݲn햱:pgZ,:YbbЮz/:`slֿ$:ukknqMַkӭ4C-;ڷPxO3=ŕv>w9q3̏N'liFjP+fkki5XF]b[a@ݽ[k7͑[xj"%=ӱ;nMq4D;6Cnf8:f~=3ps^T$_~Xt.{ʑU~$tv7*ڼȨIB VY| L9C{`8Of ;M=5Uޞy|oLE4խ?,]=_wO]4v.ßq rBnהtXK]=÷ԐA"pt|_1%jP1 W>)eq S:Fw_լ5K'"p! [BTɢY/DeVN@ҋ>'_%.Cv* ++8D5G8$&bռ@&D´.Ά[2iͧwf YXWbCC+CԮcb@ư3qȂ-Ԥ^ۙp 0B9M'2t γJ7(k4~őkKVg[wuxQ] P:>TG!9k}NHH +]ILGj'a ;63s2_oy=q-*b<:TA`Cvʖ/bԝPً}m`+nyg*XѓqMK>e㜧, +ޜ$r_dsH;F(d \)YMCr Vbb׬cjX]7Mힱ1H-`NPdmo6d& h~؁4̕t*+!5lW_se)ܲC;fw4U9qbVUy'+=aT2VfjuJ= XJ Dgo +v9崞uZdsYawzI_JyT9m6V'm8udmMի~,P>ZQ9ÈOG baUL78Js+{Ą>^UR}Mt3Q6٦S#R!{&$,K3V NdeOٔ߯jڹ^ +D"}m- Bpܚq",[ÚP'fX`{id7k?sy|H9etb%Zgiw]my2v_"`wyV DŽ<(@7'lz9>ljUT-UOL4:yjm5pL7S]tLen0 ւW̰UForik\߻OI]4a7{ 32bٞx)F@b g#vۃ5}Ra8nM(|e.*zb垮^}rkEdy5ES,?/ <6(pW,d竏k~zx>"UL1OTO[>יQy{ ߷KC&35u3ZϜTv[m#Y >:hӷC)ҐL#$>߯ oRv#64{ 4jwibr׍ϼ{ bBeZԧ{ru<23p6KG091{U#k2̺i);'y ܼ/ sVι;zH]N#RyS]'ͧDD9?f,1FXѶ88z2N}䊏YE@:Κs{#vYPi0x&ƙ#i|hbŃ`GF? C˟k{;uL0됫llC\u:+4l˽=/'sS)TO=VɸPhUZe\ɤqRtؓui>LVK?<%/5s*~h毦K߭h8Q{na4X[*[Ihަ=߯Œy2?x7g#^G Ze: 3- oPjedΚ`Qm<]Tu8 "Ȇcr݊{ڟ5RT>=0yEK*Z UIyW=, DD:l$ӤcE{N[ x\f xeX\Ƞ}oSBq@"gSmmcCAȠ^Ke8&Q\<Y%so Gnvn<-ϴ]@;&-hbծW( wFmy ˼$Q1QCGu\2"SUǬ0~ޑNQNܴ>Ռuo klU25$F:r.)VEL9=}{hO+,uN]<}gI\cxw|RI2"z-Ozov[P`]DAi;qLiɚX 3h o4; +6Np\9+;~Yx#P+AXGP<xn [H7kHLNMu,. VtF4wCj鑏2]9N&|P_(@.Ϥl43s21y(<`"pwi*Y i^(+45? Z3gtQ׷N_ k1_nKI7ܝv_Hf،s{u"֕4Y@5c@ocZ? D iBgB-!K\t29J[ZׯIpH+r+؎Āfth[NߩoUMSKKg6}_8?:7{΀C0Boİh1uGkyKvX.ܻtu״4&!ܗ> R ȁa_'luC:W4Nz+(Yhf`Nal~}B$`KTѧyպ"n?ma#0A&/x_?s +(Pߥ.ĬjPpwd@qIL)J kt!=ƋhڴM+ R\at &q*J-ƕ$_-jKM8Td*%ytV b&h~ +3-쌖k+hNǹt,@֭?(00y=Nвl*4Y gF7LTG3vսrfsG|wfc45cBI'^T:³G!t{hB{~}`9Ŀ3pe#iLhYfĔܣY3SH','y~t`N/#١kB}0YYs +ӛftHr=ݘ,=?#q'؀[ru.']Omr.RO޵'R3iw:TsM|Qn-7k I_yVxElI|NWݹLb@bɛjnÓx"8$w*j~v hTPSԱpUӣK#FZ"َB" Z|J-m.cFjk#.:ĒqJ ~ (iZF5]8M|>~j58 +Գiֳg.eOjiK0' X¹Gq.*ozEHd)"N Y~BӳɁ[sā/E!C ~~nuLO0q:ݶupbfl鎂\ݬ>C8;jR +ݏo +f5uP*%W j[OI VSb`H ꊛ`O;A+hUkkT{~x]Eq3 :VR3ծE\~qwS!;dJ0 U,y zHB)Γ0/ke2rZgbTtAD 5a(\X@[ SKl/T}d 7 XSGop.@ːxdM?eXVKcIԓxMҠvu+Ir=0|=֒3I"o;m[l,cMF"fEa+C{ }y_{{Mf;6exc<bm5:SG}4^nt!I,}ĖVL $%dⒺkd7'6sxꯚF-~7R}j;\҈M51ї ~Nhgj[Ja^ymݹόwa;OV1j-J4Vd̯Aʉ`?ŌQ)j Zta9g9 "$aw-}BU,݅WC `+эi~Oh[uYU7ܲq l`{O-0etD(5n*Dۨ6 Ӏ,_v` ]{}sHΪWA0Yv밳 Kz_DafGD޺l^W3, +)HK$W[3:FH9ini [ͨi_SGD? 9Lh׏Bz[>^Toe"krqK5lFHkbgEKI.}XփxbQ# lH0s(؁ + I;_;E(32x.BbדxKFeo[sg^?d+\E +zg60AoY#N*6N깩a"ybNV Ϙ.Yx6k'wq;}tʣxHڸIjU[xwuڊ"wbL)b\?׿Hjڢ=`Ȗ(-kKy +%5 B:.L_*ǘn:ݹ f#Z9sԯG'>jyF͆R6?CjˤRg6\2N b5gQC="n i|teҎNʾ^ PM)R]ISAH[-E'Džp@/(oPITBpcQR-=CF5%7!K6rϗv/ѣ4}N yPuSeW @ +HG k˃ŁW΍愸FKk[&28זԦOƧi)]q1_0Z:bL#wy'dFa!n>!W?,SK;9uB2bҲw2F)-Jр/?v518Ȩ' (䗆qJ6z:aC%1u5COοcdyb<6sa0fZc@C7DaljYӋaBK@ 4BMsu@zNԍ2>1GqȁDmrRC:8r[U-u.,♷b^ |~ɦu֙@kܵ|"HG;y1@mrhشS ҡ/ʢV͡+c°v5 9ڠ<4vH6&CG:TXY}NRfPA/U_QZVV&EV)Ҝ(Y٩@9HcT@:Ѱ gl:ܸX3m+G+, ^G#X-I-cN>ȒlJj߉*e^=T*Ig =[Z'PRfo9o 2ϭb (؛B28uo[{ovRu2M=e_poiRs^w&.3 {!;ѩMhnV3l#U~e - +0>};}v sMYX)B3`Ǹn<ݢ3*h`: K>]\t9"3MIÎN5nh%$/Qޖ;}YϚ!0AYZ&΃*,qx]h[Kt$Nz{hצU/Gjh穏isyF4KȞqZ=7<=8 Ё N!5k-aX5@/t_jmE'ZKSJQX0 epVрjjxdMOK18ҊooQZ]I+HAa9J)'lUͩ(Vmm \ :K&l]va@;?(ys}pPE`Ki]ff :tiob=cCsGD6_+a}n[98݋ޙDRrCR [a?fGt^k^-m;|_?N 6F ؄8 tDҪk:XukO.';~B%+kG&aJ6į45~˟?bI!ݠqiA&@jN !oވr-A~[D\fu7s(aP`8гxL)A {ZaI"i Lþ?IJa{M}!I B۸OHˎKoDZ5|K|%ItĒ$ WSb^ Y")b J9o`ζ4[E7U:b} xў46|7D2JtᵄP)",k7f}GUVp$kW6Ko>ql3[[Y0n â>)YP,p7_{sEw&co]0Fv85j^{)ۇ&KڛN׷luK?u;,ޥJЯAMv8N'e~VLWd5i 6m&#,V2Վhײ8F$Jv'mPMҷfgIJIL%mXM*65θ+\?08t[^+WtB蜡z5~GɪAáCй[L.Q[Kh$ŷ_ߔ_vs.WA3ZzH1jItr†&& Lg^H8ZҧWf65[nkwQftioql;ޥ:W-^Lp;a|]\.'`(@z f-rnrfž]m`\?F8H'I/fj:E%۔V8j~o$+Ҟ> g#. +6metwhles-m K_.Ђ^ZHoi\#OfmR9"Θٵ;IQsyk[Xݽbx/Y*06֍Eg,+YƆ } Q f(,]W= (Df߯>qK:~\#{dj{S&r5%tkmm; ,ZajK.adI.:^fwݙaj=K0BA46;D:#/ #-,PrS'ÓNR/gYX^UU;gz"XaUqn@1uY[V@1sdYGyd9@t_ d?ÝoRjjٷ1 Lh(Zyz@{4Efb3vA4J5?AO/tϵoÉ[ n~,W/izLI]lRb +6V&d2rۡB j4C©6ړ2i o,EE?JTʢ;ӭ ]Z\`ALoYD-^)}8 辤ۦV^.nW=jzD_;Ȫ`Dv=vI aS@[ c^Eb`y AuWb~VYFf?V~ӵu2ǜ͘-RY<^\?I&wweNo F4Z}[1j.m>&}‡No7rۼ-JAMeljݞ‰8h%;= a՟[}b)jMެ9lR^gAe"ѐ +T%9ӯtf3T^ʥbN|f">y:jO/$A#M[ R̲j^zQw 5kZ'ܺz%P0j4*J:o,d6L}Z1zzXnsHXq2ZQPۼv gɆhWF&]GPkf_t4G{`]4_f)y+, +WFuOR z Лّ< b 5c}WTEw4,meNխknOVl,,EA!!X,isK;QIwp0SP*k]I,z{W|8zk{jfs"jC3 ƁB r ;&}lӖjB,1?+khD +Vƨ +8%m\c֎?(]óٌ"p$6`AM|Qf¾*_",Uw*p?5#wAXD]CD2m/que e&5dUsă"1)%!rOo.PMK N_UB߿A+_VGlhO![<ئqXb(I!e jY30@Iqh~7{w#[Ug+N޼qHʬy5 )}2L~U~HFX6{1^0S#@ Yt>Ç3t8"pb 5PQcYS8i[Do},hC!.Z9B=gE">;A,Q;҇q_ ҳjQ)'l: ʒS'Es,/BG }rt4~n9, M`bv[m7"1 炦VXHTQ]+vˡ*oznzC*7 fB{"jղsFE#b&iv~ޗ+:R7k'1qi=JDzwL<£  4nOO ->7F琲$*[bFe,ONUđOEaE_YG3@9C) >)ًV=;tTݜ/ EBq88i<3P$<H&`08V(P9nyW}-|׬ew7(T&Z<^  pM3r*J R@ :LUG?w3z@ EjwSZ81-.,:NR$g;yla"|M/}el19u|p E(O FO|28977ɵv*uĨCQʍsܺ~c{svxQoffjLqUM +of F\&:]-h‹k r^:&a|%L +]3MH9sQ=#.m%G%*F̬K7ijUy +6 +K۵L`:2{c{A+x[mǏPljYꬬ\}qW9sݢR: +c+]=F+:"ǨlK m#U]11&$UP| K'7G&3#)ͲGǽxOS"P0rLmvFC&/ Ueh(O'oYYW4#2KP<=1ۄnyhnj18uܯ_T09>yJ|󾗕{$}"i S4l668=qN_/k^rm|k"( Mg[MV]`7lH6vҮ x0j/75Z"rcYHpq&g LJA妙 +jӐzRJ߉Z^*6J/(Ǻ$tcj8E=,z5#˰3Kٶr:"Ewh5|:s֒+At<{=pvsP'lJAZg0_<\BH7pg`jCguY$ef eG!햤oZxΏ_RU-}t?, +}2l1)K~j5J1=&ϷrjNeg$}L:?$+dHɶn5E粘#29jvp%?gfCՈ\/(^_V! )]bN&L=M +;Y8!ΩiSWZR)Ru9Tά­ 9DX;zNlՔx>cU\b;] ,tv{ %c> ++ EerUkn;jxÌ3Nҽ Rmx +"% +Ղ'qͲʐaCX4w4(F Ȋ@ա2޲ 9[}%0p[I 0jq&tV%6eB#Y8t~YiL:ub kj)wrg5LIUJ)g|Law;^NU6G!u7R?1N# jfLmʬ#46YRz '~Rn:?FnfC*ÓaH"em !wS4*XvЇ7]ګMr/r*7 p ϖR4RNʙU+Iih tN_{ Wq#ܢc L%tʌP*Oz 33{5*$(TZ4[)vLji,XNEe +>.P%! 6,)>sJh `y +Z|mAth6='0Sͩ)-bAiD~Riu,H_ +Pz'1=ciJ :[^f Nt*]YcX21= ӌzUͧZ*` +.i3všF1/~aeIԟRbГ\n@̑~7Bi- +:ØU60Fk^߶*X訳k*97bZ-Yod7jˡr3U-b ^W-{ .қÉ}C| f28S0 H|vjW鴛,g&ӹ=7_-9 1}Zd.9az#hcRӞ}>=8s96Xb`tӇٞξ-$1Z{[x-TȴBRH1~ wc>ſgC~3r)ƛwZu@8/W.f] \n_y${Zf#9O'Ix=p qLd=vVU cyiMo<'0#Vyς2M@m3:-r)]Ω0,>&m:8z[c-W+̘S0 ]qT6NeTn egCKElүVQE:bL:§lX%T/Qwa?]Sh"i@P+֋DS6).oǞ|#fgɡuU",1_drDjb,Oz\ :JqLzaы|TL[淄/amfb RWgA(J{%S;ºXe{zB^Y}$X1+g +:iaVgr-= nb*8 PemS +:K1tsRaHcOr%a-'~a7;`*yQp'i_"aI|1;/kܮꃭ]xa,(9GqY\&2\XĵX%HP`ӏK=qffn6Lf?#>E2&17Ml yR _o<.Sy#c-p괭:Dy"XM$%_Sz3^>ZOJ)51 2Ѵ%w@N^(L!.}[jVDj7\y[m!*\#f7B`L":&5OFNUS"ϼ~(5*ζvTSI͚Dis[Wk9anD֌tq>&DeG7^dZ;=!Nq.x Qno':҉xݟyrG.dX|iAegݶY+3mj,ux1 +#EniFu,h?lxMq4X;Wyp,Z W4$3IvP uO"ԓU#[s{աbljhjӚ'h*Ky9vE:9}wʭ{Ri`FZj5<Ȍ_۵t >.ͣ`*8ISjUIJevһ/jVh j>VSdHlM̋ I|J#q|Hd ojï Zzi- Nuf)L1m2u]jN^W/?RO[۴yXEK9kyaPؑIi珹aPz'q ZռkYwI"͖c]8u|^C(Wrm>J;dX W[϶-F4GplRnBm.Tن^ Y^,i/u8{:"ɝ'YG?"<̈^] τkk฼G뾓VrY+Ų+m3cNni.o{IғIAIeeþv[:۟ 6"5KJj/Z'>ul8#GE2.۝9*>9DA(~r\:lEj)/su;A8s”J9eh?TmzU?Q]UpLyg =RzիA~hug3/3ey+,ӧxɰB8&ڧ~ZlptsYP)7.:*_0&TFL}:%N|0~5$4i&2c}(fh~:h\C|L3̼q Pm`B[EX?LlYËև,9;e6bRkJ1܎/ddxFNd[ɋ5pMCy}/BZ`ҧHjEUy5#Gl\8GŌ[ 'J!i$eL/9:c4M?#ekel4JrJ]ZmN wYvDDmG^kN} I sJFv= :cJ[b\险+/E/`A;ɗ([ݒ'f,@@@%O}>þI`4RG`]:=hi #S4y>0Bz6QSH1aR˴i>jLc5e\^ hQ A&cjg[gz1AϑZ IZq43%UomZfD$EjY=KӌPh*ܰ?\C8 80ϊS[c>ǼlB(8M#G>&df\z&maj4g7H` 9Q$u2,i9 Dž +vRUL7^%Kߝױ~ů ̜9y/ ?m; a ٕ:vL-ʦd[m&~mv&B6{0CqPm{|_KJĻbKݽQ8a"x2˖'-XʜnCBXf4B?n'a6./$ rMt.}u;.qv3)v4[ οO f*C:WˑʵLj'zQ9APϨeB$ty׳3=Sטfs[P%kufԬ韩ai,O:l>ނ2geb0? +h\GdPeNix ,Gc~wsJ2 L,3B乜nz\k)6mby7xex9Yt_w5ɷ8+9\{mC[SX $Pbh-%ay(+Yi44FUmw icӒ)d~; +Үݘ;| NzCzI{e\9 au^^t-ltjmqWw\_( +иb|i̫9m?) +Se/)*.D!$(CGOF^m_7\40g:6-YOjLPÅ#ҁa'U/͈0o*1к]^lLǒO`k-NkO+gE ]DqZkEݖc2KU.n3yؼ0˚|Q~;P y?/Ԅ1d1.(0FVLn*aN)1<ޞOp&(D4}wA=6ij€8m:!~;=* Ҩ9noLÔZ SϿc,D;.%!963 -xU2fr*m$Ă4D9d7Sl/yׁ#<!zt +C*)u*eNRWz N8vռLc%|73L{ٽi-Bc]FRDU])6ݰoxQ,<\s 2=o G3:އ 2q#䔌`;-QF@`=7$8oQp0RO :^ [;-T~$ۤ |)a__FmI?̵Ń͖̄uOG7!q~}+^ut4N#tW9tu{ &FPxDdܝɄv^-ҧs.om4߯@XrWsi_ n#X9t70SHCowl.ձ"b04R rPaTUr8aW}rPVЬmg95״'n{ۊW/I{w<|-@A/-UFew,5k;mGeRg:&Q, 'ȬW4neZ"A㬺y_JP^!:=yA[c8 _&wp{vÑ2%;WwoSvr=yE@3٧-nn{On|\m z_@[|jijF7-qߟs'_=΋M^Y.5* +4|c[||P8#"frlBGƫU8 +ݳ*W[HyXUTklö@5Yd쏒Llyy,ͮci[7,1%$U /}w jg0Fza~ZĥCe &~3 +wMxhUAzDٱp8$%˫MdL>1KU*.6}}kΗxp8B镫Vy9P%ݶ-?o${X1*Ct׬gW%/}EONVUg%]Yɝz[gb[>Lm#}ӆġ xƽP3 /kO8:Bm_)d~A:ϣ^H 2Eb\(V9E|K!;4gS8Qn3wƩH +PHT"z =V74{yAc/VVEtwWݏxs=~]ǂ"uKt5|m4ZpHWf[ǰiɉ[ćO~,w>Z;oG\l|Ӱ{l @ ?u **B G7"\$O‡{e9ֵ%¶79htF i >P,ET*$OW+.0;Pk?4rj@96ߢ\ UL4]<%@/E"% \t92'Czݬ{enj"'t)(I\v)oR$wyĠq!wub/1H]`bs@1,Nrb-{!IC3S^&8Lޢ +㰋Q_0#_v$MmC-̅#k1 n1BMTjkR}"-]oh,}e3݂Ιp8 h^]*|i& {h0[#δHG^#[ Ui:q$55}bE*k.3/h k44;M+L-%`x מ +]֊X>ĨX,hK@8K.s}}115LWӅ6'nAFm YsW# ;!I]wN2 e淙 ۣ'-_5qvw74{ +0ial8K/x+k6$S+ΌWq0dAA㍜zgu4ܴ(cs(z^q +=ҁKR=7x#=aSBlc24Qz6au31V+*Lr,^݉ڞȽ܊i9!y(>ד阁]?Bo\|;O55h\G*74Ǵ 8r7F1$T,|"J_*CЮEڪ|]) Zćeom?'m/Io&pʆDs95q{fҌfcWQs;]ɶs(쮴iIa/! `[Lb˷Dwu (;kLu3$(ʴ\%p9ܿmֈvM|2IF螧 \ˬoeFKs^>WaGsRo<3Hܠ47A \*FK:zmη Cx' +3]@Uҋ +(쪀4aǩ?oUEȚJeO#⌻T+~FZ"͗#d,Wq*T+K+mmNں~kZͪ8W + +'U˼Vc%,t!W1ȹ=q3pjЍ& +8w_JWO:zr[eOb9d4c:kE7)Q\:>=y2"i|S6&2w[K !4v(t|6`EAd_ЦSZ&S(u0}вj,HdOt3 ׋9qd /eb}ʣj2pVDCud6扭N%rY0lFQށarzs}V<g6,JMNoJIXä^Oߕ/lڛiqxo@(i5y,^ +_f/|7m 8'}--2z =[:czun׶tk[zzIø (S;ڰ!ǃ&fd0a +*,9آDCj_@Nz]Zێ^z2VS sD;n_)a* (^ݺʛf +:㭪yw! +t[Z]&)9Tx$f Nm֓iwNx4}XXLbO$0ͩnbr~v%IBXS`i3;IX+ΧeOsݤt hО,=4.z>_AG_Q<Ԭn +|y:As0Uq}uK4ech˗ +RAN woi{;{ڌTnJ+?oC SjM'<6v%oXwB*xaT|86*v <ɧz؟C +4`:<.e(Su~R,l8 Οi~~1ؼ w#i.kϜ`8BAiyM܀s7\ZȬ ְ^'DY;^N VhLTWi*e#.w7icijQǭ2ŔTŊX}Ѡ0|k \_w3^tL&T[qAqz&Y}6Lz$I|J)XU-cY%'6l9seQ:Z'ucR^jquiؓ[4_MXΤe-IgS^aǟ>߻"LMyJO%-dṞ*WO5;mq]vwxEOڞФVÆl4[O!wq&ןͅt̯U;U~+`28HŸ_O; I,#yw XZRW_2q}~t̤ʧ1 ѓhl +H7æOMQ{L;ľM5@vϚaR+.eCkɨHFմAdZg 7(ܠڡ"(~:aeN?`~n'pWi&KpK4Qbo/Ǿa9\I>ʎx1GG?dYjhHkC1 +*yj8 w,OӵHкHn6AiV*@|!(:1U8ɴ) +RȪ;FՒ@͸DYu7c$5Rt޴;Qұ_$O~MO-l`ahBZhSԀZ0c܏nt[Jdmj7dY#4j ˦y6־3F[(;\<ڷt3fWզ|Ԡ)Wv Ns9"6o[:whTrKPH"=`cUȆpMVcwU8*OT=a+`{((:)h(1uFRK5lT"tclF^5\\i0#ZEmPF7AL[0Sxll|mvlC6Oy%Ǒ#AO1 NsG]ljCU] 3#UMWc +F5eKd6o 0crS햋3w{%rMAGg + K IF +>.C9ϵ2g S5; +2`:.W%m F+W| nH#V%e oJ J倔S) + zo싐ZDNJT,uX1<2Pً*8!pR#l[VH{boٮヌG؟KUY-_t ε[7κ 7qXm :-i:SCS .:Iq<%#üzE1~P/R0-]eG+Z[h7I=Z(=oaϟtN)T@ڵ+`e~?SCLf DytV1,H3a-&̠SHzt hH6?oIAbb3*I'@{Lpk"@Q;0NԬ&Z +T^Ov۞6ú) +Fա<=_Mp8ꙥ#HZrAIP3B˪^V{jeôNte3,eUW"R*s@di͗u|dA [yY-Gwp r%ɚxZ՚ȶ@/|ڍjP@}x3sOk@Pk.X(^Wn/E;$Wi5 psOHT^9(+0Z'sp 1)In*=U(Sw@4֋Û8R4i/wuɺDch/ jf75:lY,άY~N3=K?PR4dj>Z7׃ Rr@Fa (R *_B ހ=W.]}-sS@{[ ¡p)pd=<(WDTF6CF7ӼXic3@Əl$~BK0R57-Pm }ŽT6!GÏPS"{弢 UAç+6(KVSB+W>uiZʘNz,]ڮ.V@疊j\v):Υk?=B/ 'ˤZ̆ZFp^92,מ96+,[pTI>RT/Z_fC^FQտ5~ZQ YlzNT&VyR_mkMlUt >֍␤A˻:~l{',ek sg9Y|^Vhex$4 +/5/h !Jy#j.@QʃKL7|B|=8ꥺϴ'-ѭ|K=ptd~.}9 x?_zuRijF9mBA4ÑR"lnHڜYMZ^zMx9BJgoq{mc{O@(-c5el'mrChݝ&@qd>5lI?Fx&55]+R}ԩ;ek#!wf3E#%`c+Вoa[/YJZxwa>NX1EcRS/5hFNMlIꃉǯKCઔ Y +1^V8véuʓDc+M=*(dXFZ"Y1$?t)/Hn$u +^FztR֘zSd@ . w@ngm߹ n;euV ..ϸY8ךS,uIº۰Mǐ0i>sJbػvkGNorN9is`@޳דPU +t~ Gsq:QsyPhJPU/㝿O=3i5G7+ 5l`=wEF^fW,o ++x]u\uR?KT+85ЇƊaW.xvgjp~*v |J8w; L꿨0TOL[9@-,Aͦ +8l*?>ȿzt׊0EƠ%PHZS?SMz6rϔm-UfA4.Y۞\_,_'-=Ę[j>j%2=JnFjxj[z@ƺL=4׷{^ἅ'Q;t1d] 6f98ݱjc(bW29_'#x@`Fd] )V>G.6U%NNٍU/mOm 4û]inxw`)HarF ` oD*d©+v{&r{枪JN}~lDƘRQ|L9b8umpls2 i*dI"zIcFu:ΏoWz28E=4(eb naJ摫a=Z>}tSN cMQDȂsjk7RZKI%#xO4Kbնn=]Q +91 "͝ ERoc2RꅡH'O%+Y&uJƤLv$gCչi= hp4-ö5[e UI,7 I::vWt5V- nPv[RC;)2m +ng Tp ?a6_j}Ysw%ɬ~=i-್&^z)j eK̜*˯rն";Ub+Ʒ*܃ Td=ºUS*8< BS zޮL_, ~vA\W:bz`fzO@>UVwƶpMZ˨FHXZLzԱ#ˍm(C\'}ԎZ0CjVeF&i$u39gϷiCr%|]^-˽Tn#3vz3:P.2 ېB-S9lRe\cl(3tj+\-Sjw3$PA75'{\wJrR[ /Ϛiw^lpT?Ig+` OUGD ;|j~f:gefrWݓ@Zn='q&=}&(5)Y)=p2g}*yIyag!0PJGGD{JdG&ͱz(2,͊ЊhVG6 +`5k=Nz0`\=4\mqƄn0N`}5c6<^Kfw5ƔA:0 vizy;s}l;yRSs)_3i7Ͷ.O"Hxp)L-GN+RI֭zOQVS{ Jyjm (AqO|[՝UBNv +6Ȯ{[C񲽝7|Jbj_>G^Xzqzefʎj^XLl&y\mQ٭t] [NY]MaPc:P, Ggq{RF G9ydq9@)s%c{KFҏk@|g(2ezN-CߎӖadtTc4H绞ƧBעh>9c 8cmwWV3O:>ҵP[F4(9Ȥ<Ǧm}ד*TKXϞR#7~HLroC[u:fp Hnѭ Ix ޽$V( $<s]y^0I_sOZ{F>6]FLcno?d1K+~鲙C}nK9i5qN#-GRMV$ߴ+@r-ѥ?ncTw<21:ڙ \`Y;N )_)ViX>HXvox!)4.?tV~E +5"qqSPL?mZ$քY]睍+0Na;y )Ձua/ݘa)yb1bAV{, Zӻk˒?7GH 8[8iU3xv ߘ%Tj1*OG\k;4̃^RpC, E +?pi捿_r'vQum1jYf͉ r4`ba;":H]x-*5Z8Ք*`PZ.\&R|I ) Bx[z_ʊB/ڔez],t&-H~a*73yXpX./n|Wu;Sȼ{@9a Y; lUlx4*gmW2bqpI.:LݨՏ';|Ӛ-՞eB~9.0P&p0 +liuıpO÷&{1:lu;kMq9b'AB TmjZʡ2~+8 Q. S: _w%. +ܑxjnu\o:4c` G} +LdJv{G%mNs>jvޣrTHkS9IJqL付 +v"cք3@ʓi:*|~ vqQ;X9hx=j_^l%ihg157**joN4|`;pm%3%{S&paA5^:p[{9񻘛sh ‹߮bscI?7K)0Pc]2 .)ZYd)#G%nX0 N3v4YIz}Zo )rTD: j.k6SI簒ap~7ҷU+pHDkyM++?LE0"? -:cw23ܚ9j4~ͧ;%H|~_MQ^ X\EI%ӫԖj:3+f! Y|n0QNImx^)a)w$ aU"~SPvōLF5Imz)lT{_pTDV  XfJg=mu#5X+ICPz#ꋢ˗ci/.>Ks7֒6H:Kd 'Xip2e|ued+7쒸eO}5)94ty)U'/PKv3v^V;r1xs2D_RqH;@:.&1_DiegɄB ]#BeIUs!LNިU067i}V=2RMHGD~vp;yi+xiMcL#a2tWuh4G*;^.?_kVLF3roi;\_vK-[^KN$m#c=s-K% DǾվ҈IۢFQ3@'AxhUy;vğ%JW܂nV ,,&t8^I=- dTWg)~#-Ͽ ~lG\]搒mX=H޲-9Ө8Jhrf5`Z(W/YKEeיX 'F:7V[VGIgvQܝ<–3 + r c@dy}7z8bhK)r͂+y4rFT~4'n ӂG+j4(z50}nr v҂ +A2 !%"]iHa#o)gFQ/~00+ ֭/tm ߶P +gVH '] Y9ޫ~)]ZIH _hhP3gRYI&&3hlMlRǒa. _^w{lۮ؄Dk,Uo^e|ٰ3SxÜZ#`/pSET ܰNQXg;tGjJT\\lHD:_~jo'59Od(U&}v^o={$ڞU JdPL4n6x]nX0mu_P+ +F;ޓ|0%aZ't;W΍b=&h`#'I|^"} +߈<=ʚi,ˡH-|fEk\CYbj.\lVq#VmP}{bך~oCs8T 4j\Tkx_pfЌ[rKC~z9Mo]5S>]&al#i/d.;:p7W!-syYi]bliH+F^{"v VSח8q6WpW䊹~LxҚ4]hZ]Cl>A{J9L/̝J8Ӗ]'fYoq +PEhrj:wJ+3y{Ćf<zo>s@FP=dcLJ;!E!?Q.w()%*n£ӽ '&!ZT;X#6r +Xz +o"v#'|0ZOLd4 c`yIQhfeܤ=L~ޠͷVs΋E $g#cﱻ CM[e%yf=u'o# CTR#4M]Xj\AN˵<lBw1ObRuddXf*Zwlױϧ ̯MkjskJ}~Y_)F|D-)]O3niVC'ÎvB,; qX#lu?L^cW:FB`!QZnu,E{1"ph^@VGr6!>orӪ)r Mnn8B_fJX +mZѻ5-vtq}*9#n͡+[~!ᾂ'AzI:i/1)dKyX NAՀ7G7fb KOtA:WfG?&%%XS7N^fdG50 hUͪVu8Q5([wws;C! Q8f0ҧ+zI:QwnA#6h,ޭ mJ/Ukd7,^TґNaZoX  #ippшLquѩeC5.hsGeT3$ N,Ka!cB+֨ytgXŶe]̽d96%:tI5^ɻA֑|RF〘*/jo:4G-a5vҳV- ZWEqo"Mab6b^e{^: ֘Yzg3U#UiIP*+p\pNh~!4.Z dyh8G6 L>c}^51L2'YwJM6U_)YdeXVJg" `(gu%z +.B>#{å3H=]0U?o0Jf씲̑^SiJЌf֯P Q>-xc4"NUEfGl Ƚcɝ-rvǴҙ;UUPNYMw~CpEket ٖylc[VOgӦR3I]PeDiGCa{h5=6In{Dg[tٱ):'eϓ7I(%h X\t$;FJ$kʥM{ϙy1AصA7wT5Q Z" +FS/0Tq] QWr`QM=D4׵RH݂l짪_jk#~2:Nhўq&~^i bO'Of;!A=gOtf ɍgsB%ivT}s+ Zy<50*X9|vc~ 0gLZ<:((KI76;48M] tfK$0RQYZiC+6}F􆣦\\X3ŁInwy _"67߯JM LHYRz5-TLL8eA=>"lKv м39 +?YD*ަE<䗧Ry}R#({*bɳd /W}YggZ`&aEWVsIv.¬\nI6z;jʝSht>uC9MfkF^禥޳EemG8vȗF`f3&rKWMĺ`G<Sb38`NLTsp/ =X{Y^iGzde]R>b+)F|pZxf:==5ȌbJ6c8ha~ATB |4P9| ;QyZ(5@Wk)lCVf.yZqA%"i2Y[դܶйb?YF: mzejTj٠1LEBKpRIaRqX5*"uhOkgw +_ןCQԯuX-ٽo[^7eU< +ew0IP~ `f/\ mXV*dtRZFY9ta enkc3zgeӹWw=ἺYjdpInh30R"V?JKAj߭lV` 5^rVԦ/^34'jB"^Vw"]1p_fMSUKi~$J"!z|ۂ~1nϺzP;=GEKQm nHAYt^loUnqm*j,[Ik>pŦ@LYu_A6vGEhvūsO> dtڒ?/mpa_;qB3ݴr؎Em^ +HܩP \OGiV5vty}'qpB)W>4`nM8=_g=>_Z=ϱPcא.V+G2#%dulEr[&[/U5gDՂ#L" cͮ$+)"=++.t0RaOfpr@6MK{e\ƌJ>uIQؚW|A_Vno5׭Py1r;xjF+Sq)Fpf$:BK7b>#p/t O2jaMxbDLuY`GOVZpXC@r*sN 1of + v+gfzs.J٦+;6N6⩠J>.Y֒5}p `blFB9D"`m%iZ}.W~f_CtIkoZS弧u)72u$ }]KS@վA*yIJ K00c0Sۨ)pR>ab@c +a +]>Ro`뗵oܛ[1LaXiQ8!t٫1:=d@;Gg^ע 9iߚFաS U%"XSyFғ +D$)Z3v-K(i.PN43pRntlǹ _ljOY0ӥ Ke=.EKY|N尭ƎeO9߲OzD?<PENnxҹ|_N1L-;d&ߠŎ1v( ݭt4|o>(tocA5EtйJfQ5?&x +Mv#ݓ^N )l@4lV9?Lmǫ]~i9ӭtsr9ͻ/~4k (jQ~ 똈d}9.j:<3m-bǔS3U}".FNK=궭߳^!ڏh@4-"dϡc MuNm +K3HpRCSPYHM++M +'M_|V%{CԴ@F@ؿ1$#eaULL @Q_A1,4&ąvefxtZgdLLifɢ͐V&>62W?NmYZ>3H1>2S9K"/dCj(jzNߢeU m!dLDf2jt4U-8b/Fš~b;gĽjhD19vlEK80!\E0dY0(b'^1ZHT]\Hb [t,4amc٪M5ghqzS/l?_,N5L+U3TqkaI +1ۓ2/EvX<=6x~7HC_?=XTLC=< " Ggb\IBV 4WX!CZSHBnjDC@ױҒpi3SKX b!xu1!27'+مl)/,9yт_͑ͮf6IfWVVp7WW/̒Q*z&s$͋p y;˞I諂'g.vn3믒Nw/>E1*4JL  EySJ΂*0iڍV=V>v}FC!|lxZHY+f3-`i[ۭӲ7jDr6/s;kJNn6{k o ,tv0ش%XPg|aGTEMD7 +Pt|vԉv߬8rz"# cxwm Yݔ$Q^U)=a+&ʼnoc)#%/v f 4l ӡbZ*@nM^SD̟HupYOnp/'z ^I&"*U&'mWRKСT*Wuy[9S{vw䍼 +&7h:'@]/IY2쩄&*,PU^~\I2gert bXE7}Z5#V߷U 6O{(E5~89*lq0ЪaJdh.jZNcFhGUӜ!snwYQ.wW<, oXql7 odr-FQJݍi9"]ŶnZ"&QFC{~^Vtt@hv5ǴWQQy@:TMYRL^1N2&M71MgVi j67SPô? ZomjQr 7<2aOD [(`]< + t fW%)N9cF`,a`?Cjgμou@uQ""I+964xКK\؅?oړR4l*_MGWIu/TOM}/=Qo;GٚKeO"d4TԇW=HOCGR7i/(ĈfIԳy7fO5ڒ1ƫGg=OAZSmJ4X8p_9nT%A"_}?OFkUKV>5^+ 9ګ=aUڙaYznjʜV67Ď٘_` S5 mSg7KLCPD1nY=?.t)@WܯF-ʻi%N{3:$ڪc|`He.N~q{ju WoTEfW[2Yp)֨Z5ZwLãgN("m7 +MR[ T->-lvQo͑fkxA F9Pz/߃Lخs~x? 4&jx3|Zɩ"?x}xִ#ŢtIH!^2yPe(r<|Pa6۴F|xud$)~uoΗ4/Kiy{BQ7FnɫfIaQSa^w:V_I#Ϳt۷g| @Tͷ9Nm0cy:ʃƂ&/6}Np>|g6s_cEQ[nB=l{w+:DM#,}SG,4''$)IOBCqbilzUq@U-[z昆Iea~<ؒ0+bQs2)Î !-[dg?'^D8c:t >Nܭ,ފ0Ӳ5,q,S|\l)wHɑ;CQ\LwM`NazE fX@4gzK+Ggh"2VhϏoͩ);kj U)_Y8b=/ꛨ sHłC\\B霜wL<= S +n\=5tmi>|o[jGo!UI@"_syB烟}s9ـAs:M<8^Gʥ}U&ӧpT1/SIa쎣^FK)Ets0~ s;MSp|G_捔5jm[3~O SSs_eeYH{GjX1\" !!a y˪/y8ex-:dW&T)ßW;sxff# I{vuQ@HL8֕W?fYX(YV}P-Bc,UWqS=?;F`#|]aORyd K !07ʵ}8m xf0"xWNJeP; F硕5"NK3jЀH6iqצ:qt "KsT?WEfvvɭ6¶zv)[N?;!5ȓ~nw'H4YIwD7L ǒE nާMҖr=cF;އ*+?%ONњw ,;GV#4y[!8q#fX 蹗Z\sƧX()P|D&%Z{KMWQ$4BDHu!\x7`[%򃌲S׺sm<SlQ hB$4Rkc5|+[B̬HqNmͯwoR:T^A}/a%,:vtӦa'RiualYT]/Ёܨ+Ђ`ѹ(^1ueK6% mz+YpD]g,fdX2@~z `8V_TG/߰dmt+50)p6@/c_OTWmVH$z;@>=0w +'*h=GE $gZcaO"a+ӥ﷽6Dh}5y ԰T9>FdAQfXv=OOH wfcVHesP]L^3fe؃L/Z!w0ۯw"C(("39iy9?u$ +gQi+`[*h=Ðq6_E4,zRk-s5:'\I+ISLvÄfȇİaM[a1ك̕)1E`Тg*]{c0m+yhb[=걜L jr.F˝#zX$EnTw|e1|A^TLpyv 1*DȠIXu7 qIi>LhC@]:t!5Ӹ IuVQK$ Ǡj3n*f= +ST:i] J/v)>ZY^׏&'ՑYo@ u&MuN.gkK?972|Ru'dq)>a8LJymSv4&mҀI7_RO^?PjbD~bvm8i8qY'EV:}>܌#EW=mGmN_T] f/ﻄ*Y+ɬ/Z󄷑)aHݵoeix@.:H9Z;+4 [Vu{I8/cez`.lzL,N ׃_ח;Ǐ8B"ۭ{}6:V e"wu>=sNCF哰*7Hl3FvM©WtSϘJaAXJ8rzRċ:&W=1NfrLCO1/iw&֍JMIhA:7ͶHlYNy2zg14`4kR 4yC,3 GÓ7ǵ mCfNY;X%#F;nZ3}+zaVF o~?lނ~tۍӝe}pt!2{nD]EX}ALױ-IѴp"U:@Ė; z1eU_J+5h BP׆sS/`MkS\=[bđaDzKUBsllNI6YRZ-+h{JC6V32R(ɊAǢfj6֊BpKU)j@sz>ݗFNWBs 9^l:CK=8èЉ;(gd{8>q=fMw){Q9Mw7~ќS.teKTVwr?RQF^]nk>dBCIXXؤssvsQYnc_2DJRо):؟ 7gTŽFn?ݦg Mm` [GiZM|eop~qgia $6j=jbNE5BqJyկoMU8bl'E%>oL|+ɪ +_8ƄĄ4i+I8&~S7TUŋLhRmky4OW,:[rko瀣 ~J0ur[3[zV*W(wZhOpdc _Zh֢nlh)+ t7yX4uVMC;eǚ,(/].2ryΥ[#T/ݭ~WAرf.suŎy8UfOhf +{v\4;J^,D5r$ҵ7ݝF٬D!g p7z|IЬdf@]@4>>- o~%cdj= hFICuAgg ,'Z ikG$5n 52ѩ##ԱQlPC+_Z$=)XmOuSٳ^"mɣY=qFѠY?ys#Xt5P2n_, g)BmTᯛ姺fTU{e8ޔF.L;_u<6`F[AՍHf֌m.\xp`;rpO3@񼼞f ȷϯĿK5o魰_8lֳ@6`1̀z1~Y yd{0gFj۳q50I{s|z|=mƅc3gGV9+Yo)0L[ѿ_:zZ\&f4|ec'#d)B;3d7aV֯9 ]<@KQsJyW +h&-nTX''uAd\^q|jp;M&H#;(ưHQ+eN<(ud(Zc~nX >O x ia% +4~7Ej9Ǚ)%ҭ&§A%LOь|/W,tmt$S"װog˪QS;o 7hπxUIi\`6cjIq#24Us +WyR@*^6ŲZ4qeo5Wvz<[UAD:XyvknoPzIvu? +q+qL*[;w=VR-mwبH _{v'giLukό3Gm II=0Yjqπ}G}PU qqSX FdAt%rETf6D`Vq??/MIs$_ +G> rvly2ƗIj༯m[6`f3#679BPhZǟS"SeXd&)I$Ws09A&ܑ)akFP,pN _zS| +怆bq.y+LsPo'a=X݋꾬݅^ XsѰ,T-Kj>T + QaڽqH@~ juJ8U]j ynYZeĜf!7lI` +wZss5٣]4vvS$Y>cZٚ0EI8qj:71ՙQuZ$) !:u4&8a9H-k0dηARDA"4,cw :NG&PYjFTZ6@h^wRUgf,F좃x"A*T= X{z +mΓDzϰ ]r +GYj|[igoHW9q?>aRc8h6&bdf!UQf.nLCOu/dÚicq(tInB'`5/GHK3y3_+})k{-_-HaYp7RsB:(:*֍*g 6 )jsT~I:o>'-{Y+2,@ _IJwq[gKf7nkڹHӪ??>%NӨnqk<{Ѽ_U_NA@'WhI^|? -믅qFӷf1aINkJ5 + !YĠeέT/[v +mNPK'hu6Cno:BJAG wSZ([$Qb܃&Hd0+w;!u=wn~J=:z(s4Jusk# ?ձB&bخӺ+.knXJ܋aҧc78wpL=z&^s;Z/r<~.&1Kri)f9TW)vXxD96SN&Kmy8#Ust4wU'K=(?؟Zsg4bu w`՚ vƖ ϝrwBr43MQf8 UU;{]22ppWE#3d U_n.U6ds,p7M#\UKdGEHֱI iA`5 \%K om7KeܸV ;Ŭ+`K +=-2|$_0X]j-4Ⱦ<]_%!cʙ]9#i8I݋@IupvʨS+?J."t6~q'8VnIV:)Ɠfʔ7v32j8e'aQg\s!JFޞ-:H[t;':Y\] 73KUa6k; +\@ce'qM?=f[\_#GȒ=XYh ex^WעDbh(튕g<ֶ#[f\iȎjysٵPrHI*ܘT/DUs*;y#;-!$Hl6Hs=R^ 8$WH!x70}'p(, `(ÐNLw=^ĭ +cP> +094@cu ݑ8Mo ]w*~&ŎDabnR8\Kѡp0MRVP?!rGrP jj!)hA<ڞR{QZ,38[ۓ-?j//jě #FUҤiQ4-RSӈe`>ƐxT+"P~Q]|Q0hٲXGv мHXêZj]SZьFL1Fh>N~*3OQC^9v[4U%R66l +ne&ViB\iCt.dD*jl<6E⫣8jLN8=M6Vm#Gg$)V;=W(I"gex\:w$95GZ'=CIS,nW?ut_ЖS^&ɕ8)t|Z۟V b VΗ:(piHE&#3+ı0Mz?ZI6D`z  i]by{Xr~m^˿f< +`}xtm'á|E%RM;ݞ47G" |b6a5 +U&˶@oA??ܓ$l0ѰF >-XBa:7$3+{̀xf l(^Z?cLw:J!0X;3]*4' D=n7Dsʃp3,s8ߧ1lHk50M}bs+切+)`{h]$N$\{mz"8ڎP:8c֤?}};6_*g;gwj}q-H,#n8mԏ Ÿ{xb@He8V͸ű4$M>^'z"n_:c K44PP/a+sM5x٪VLۧh2ܥD7s}D-S4x`;YEp} 0ma(Iwxza3Pr2Ӗ}8~!RWO.FiI=a(ɬ;Ei m7y/ 'v,QSЋDa@Шgc_׷5R&ԁ6@j*=~FӫFǷi$&ZZBAwZ%njf ΑSy/ +ֺ]ΚZ gäwPaN6d;: h,tcڛzfIU.NHVr+mr8#ѵϋ!m9h7W֡Ԟh9O 82XGxAw*9%sn +XK2hЁek:bo Rbc! ;lp1, [BT`cX) /ڜо#P$rKPWKڌg.WuFF2N̛ue`%dU%rtF_.DApz(q٬p~,eZ.Q,L7MI/#<@z%,~î5t[, +=Er۲!|ˢV|X&os\ZSmn<;_֨t'^mkRK77F$g:ְP\g03Z(zЪ1Zͺmf7 ]#_(v x\.9GveFO0~$E訥 +S6 ]iV6v:L0㞔"S;obPF7F +?ϊ;4\G}cw⡚Ա=lv}p9hɦgکbҤr&Ͳꀥ>Іg}X`zٌ42˄ֳd1矟 |dYLˑ2 nRT-t![IgfVYg>H^I^ Ą=TԢ50YeB;i`mN$O3XҭѨmsItQi4¦[ l~54V|iD m"?315a!4V_i펨Rn𿢞Bz4U&r3 c_IxPh|uAZLDftajwp+~:8XGdԦcİT+HE PI{:u|ieb"7-L-_k=i.`$D s(zS~iR[٥=}{ fjsM'Ä|1 Xl=zUMaQ B*E Hxw +Z Qo^\[atcd7;X~awN 7@cT$IagKsk"4QΡ"tpp94m[2WU䱬6NWNT 0[ P}ҟgFl +`f {V, O0\!<1Θ vqYQW4z$PGfNŶJyعFiLg#d[UsPcoKu.Gtv5r^0鐥?+}nOjp&da7N[8ߑ@(L3y~Q]͖Zu{? EPWk~x+у;-9mYp$ƶ44=;d3^`_}}+X+4{G;S^%;rA>_10_A>rA}Gl!$ٖi KMԖ-6P ;MrhOշ˝ER +ɰv`GZY 667"d)5#h3CۄW&p[VH$%)0X^vmIbiGk}9P;Bʰ6  Y 4q9Q(%J('CljsZE !\.ĸЪR]\BuZCr;W +t(Iwiӕ>꣠SZ< YRB2ie0JEz9~Sx_YEZ,p$\M:HY`iXnvZjCK ~}`&afJ;%3l_lvJpaL7pknҾr3BGRD.U4i~5űwKkH G:gf+ E>#9b9 lKӟT_[a5q^N0P5mch-I4_,aD5S(1!iZ^lVTi}ń̰3W?E]b'i\q_&G(Q--I{3㠆W08oYMW}i(U8C 9p5ƴr-;iSCY ^e)278M հ= (}VEɭlYg0 +ު8+1A+uIPJ|;m 6r5 +LTĘ&^QH)  aHAXpR28FcXj[E΂96*J[o34>nzfljGo&=j +lY ^uĪM K-d]4BRh\Eo,˹WG_ <=Ui9 1Y.u䵑{LCue>"O>x|ciX)C̡s\l2>ʮmv/᜔r$˅USD].??ϏQh?3cQ+さVt釷_]~{+xOǕW/z^#8^Yfi>!?E 0j~_Pp|OGIzT'Im|7{>ߟԻ!o޷'={ +06' endstream endobj 14 0 obj <>stream +8;Y8d8TlUC%#"'.?GUij7`BO65EGb1e#c8cnQhj)`k4q*lTHi11n,e<l%qKSW#&p(!kJ(_FcW9[G-KUP1 +8FDq+;P!pY%usX`G*&V*)9*Q':HN9o'=G[: +fpn^s)X^@242-@c_<;*lc]F4sQoZQe;CPG;h#P58m/PUO?Ghg,N+F,o`EGr05C"Dm +U1(qnMjEoMT]T&LSd+'8B8T7b&Cd?PiCYqbPU?ML^;Io[D%(0KkY"!3@];Yg-F"DI +^_Z;Gqr1"SE.CA""'EmA4un3HK4=6_2f-AmB8Ro(UX?DO^TPUI!5;B'E5f.Hb:&TF`72gq"q"f<`6^j6<(P +15ea>CJ(.$J<$;'3qJpfNH?l_"7[J#Cm_a&^")8`Ah\J@Jr +#S")bH)Zm=hc))4-^d6odpXrm@sAmQ_^fD!]-nEQc$Mn3eOV/KNg+&s%eUUFDA>IE5Kk!@MLQ=7aV#;JGk/):<91G?M6/hYanj,W;Sbdau3P*UrA=^ +,Ge$!Ud8HVMBRDM-p3f_.mGEnR.P2S+#\aeVO(+3TY/I(j25IqX=F9tN0N^Hc=6O` +c&b[HiSTs!ZJ#M\O-O4Um"sMVNK[*M?tpampP/s#/(KJ/88$AgHM*r!//J_^/t3[_ +0k3!;4bdZm/2L9?%Ve6C-Ea3N0qk&="Q#t-5Y@`@8q"3Z.LT6j=[1B8%^;tif.ChD +oZ^L#d1U!Ohon/$YY.XhD98AZ\KBP`0*^=.RYYKqgI?CoA)^[$`pe%T]>PQ_-n?d:;'#+,i*Q%7W=F;t!*u +fJJ`-N:FV6Rf3n@/=[rDL:sN0^*L6TN*!lQ_Zc+WUn"54P.Kr8A8*W?>Em`0bTVSq +Z^,"39*33u0BMWs+@GFMH;g5nW"b.]%Wc074XRo^\u6lM1@s1Qc&Q\os1gn27+DQ# +$OHI4N<;Q!/gBbf8ao(s>h^@^M)/U3Z-W4+RH;/2(L,*Gi6J/pj\MYVnX;KYbh:qr +?tlK.Ygo(QS?oai1bK^4 +?l;i+n69,1D==A"=/m4k_6]7Q6Z".lJum:@VQ?QX>TJqq8SQp![;q"r0(rE/iFTQs +E%9jU.Lqm((o1X0c-CB3hd>-K*Uer17TRr&=FC[KIKN]X@[AX;J&bMX5+H-lphp!# +%q12jf'_-KK8 +o&dV,)IQVum;!0BroqaIY%-mfo7(/.)r"\%X^s"K$i;j>?1[QQ[9ScLI=&@s.^3L/ +q;sd$C<-0Y?/jVhCt@1+mriT>DmqIQ[k$66ENe,%*H`=mP3^B;-02*%UR6JIlXou0 +bl.^Aoe2[K]P^a@"`k&4$Y5OFQ5\Lcg/ZAa#I`K,FY^R?X4^L][kc=4;0,)VNufj; +rpebn9_R?>.qi55cfY+O0tgamrQPoHDo)1C#DNUJLMaHl>/I endstream endobj 15 0 obj [/Indexed/DeviceRGB 255 16 0 R] endobj 16 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 7 0 obj <> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 6 0 obj <> endobj 5 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <>stream +H xG7]8C$.kҒj%!!KIRD\Jj6Cn۰4ވT.`u9K[tywμ3})E#:wla4~x7uL1a`i@F\ -q3q ɩv8>Scn'%D&yF'Ěr;%;C0!i{Cj{Ldyj*GWhTo5p>4}P{aV>_~h wݘ׃if4_Wּxf +H&jA]C}4@CM-h0C6h@C ڣ:OA^Ptó^xϣ7^@E? Ƌx a +b^p57&Fa4"mD\x 0q3&a2⑀w$LTLC2R#3XYHlc1`C,B,B&# KaVc|l kLeT>cAa=6 `#I>G>6>[ %5Av`']؍= +-؇ppGp=NN JqeP +T +!}y<F:QkjC(ZF+hvA{~Z3-@SZCEh mD[;[vT;kׄuEH4D]D/_ kbH3EYbX'v[8%JD *D!#x9Yȕr 7˯nY,Oy^Uy]2jflimEjTgCU05JE15Q%jZV&M}Sg9(QǨg dsFcd0ҍ9"ck[,¢[j[YZ KK'XKeU ֖Vu5mm0p]#'kw>09::Z8z:œNV@RGGnrhmchPA5tk5 XZv@;} +&VO4h':U!٭λj͕_8W;X.12 +hg-pj ^giqQ +8N8.iKY\uHfg#1O_eiE +v7ZwtUkTT_U\Y=r9PT5:gxC;S~jW =ϱ'p%?ōHUF|Sm7m"[ o_-6?[i$WK=UqP\_ \__1"zEDS>g}O-d'7zQkoN>q?Gt6>1o}qEn_k嵳leO=X!>b=gSc|VNs*8qYo` -68L>YՓor˵2ܑ,Q{{~92>oԗQ@]A4>FCez0[/uE{; 0|GPa ("%6F1c5jtijWcS1&1ƨ1V?>4uuY{߽9st9_4h 2|ߢi5i*TNPlKIch<=G 4BezfKh>J ۅ~M"w~ vҟCڃd}tQ:F'SN!|~s:GC_z:O_W5]@ƹHhr!eZJ FKT +שޣL#h;TGgQ9ȉPCg!GXgOY 㥇|Ewx0WL&v-5}e)EէJ)ڬPSY@]ẈHIAmElgNqIuȢT7(ZPٴ=^ +0x٘a,6 +]7?8bCcCOArG߬2݈Pvo3<#ݗ9%ZѺ3,)>Β1 +>7Wq1)Rh:7GQUMJ- HՍ>7ݝi`x݀1M{֥hINMIq gQaπ>lo DM(uÖ:hYq}S +Mɾ~}1CX\v>#ɂ6uy+ႎ9 t jmKY򪳗 nۈ4xћQtu(S"Д^2a)9Oԥs\;w˄XSsOrnXMvn8Oכvujlij{aVt!yQ}4O&1',z</+C4xc*LӼ[[Kڃ~f }-RD=_0woCC⌸NHPcⶑeG]voe ķ91" w*߄A!]fi>ѬN:<( +) Xu;䲇C^֐Rs?yN>#[5|"ΊR%JȍZ;)jbc,m(ױ>(@$([/\F#(f.-:q(Cb,ۍ. ;^F\!PRyh2'N*tKõ2{ ڣUϯ&῅D,Bp(umWE fuX`> ^EUm>Y= +mWxb{%r$OG>aԫ+b؎qA|T.b P]̉Rp~+Q&ȢTt.~v!06 =AN&t 9rY8wo>2YؤBWIE{*]`Tƚ4O}t2 ,MCZ{XJ=.sD3P&iY^R[)/OPg pu䉃 EF"59A}9y~FC3ln{<49YKEٞ[h&Ӕ7*M9{s%ދȑyc1yarP?0Z 9F=@ExSy~asT}C㠍FmX>2exdGl2/cL5lblS~’U6҆5! ?UT +S$ݦWmA"W}TRrVqS>%Ζ:6n㸥q@&ڃ0k;iV 9$H9߫D}:y +I)TN rqNrfk@|܉hHh]V.AJ-̇0 +@vP6<(ϐ$}fh?3$?eb e9 endstream endobj 19 0 obj <> endobj 22 0 obj <>stream +HTiPSW_)W!APЀxH0H&ES 0,.XUZkkCv9̙fnq89^~vIFSkV2Y'jB[Ŋ8,e7cg)/dl8+̌Q$slhV:"IPhX_Ī mK{8etȠZlQjut4)Lg|FQFDl}FC/cX 0? .&bMX:Lup<8Uf2{eͭ[h$?,-bX ܽHND,H S,1 +qT$c8*4xm0r8rƗ klM?#9Mm.*d+ㅆl T^LaEM? -P8IBige=W:dz6"Z"Wmgza1pTמrٍ]s 1Jߏ[v잉z]&iL楂 Dhr2ɔJˆ <B5䏧BBAҵ_ +}"7 r#SلqХYS-PӊmVH:`-p5> +=©-|S'z5>uMX-!{.BţK ;bA &UoOޛ<$+؉)̜J!Y{e +_ +D)~!Kw,JlJ(!7YZhЌ0T'A^ 3xM'*EJ>7oc#>Udi%d*iypܣɰ=M%EEpw(8 ^y~'o`/{G=ĺr msƐ444;LX!b|40Xw5h:2sXO Ip{e{v$ 6fs57eº!mbF Jvv^9GP'Jp1AVzxɎ2{E@mř3%1Q"ڮnoUg°%ʯp! {Ŧ~W߆2W6}|kЈBߋ#h~E.!2|J|-k#Ⱦ+fjҬ ` k6CC6d(;w&|+o}<'U69-E'D8Nuu/!Ȳ]OyXX^*%|4qT׿5by_  endstream endobj 13 0 obj <> endobj 12 0 obj [/ICCBased 23 0 R] endobj 23 0 obj <>stream +HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  + 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 +V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= +x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- +ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 +N')].uJr + wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 +n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! +zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 11 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 21.0.0 %%For: (Kenneth Reitz) () %%Title: (requests.ai) %%CreationDate: 11/23/16 7:55 PM %%Canvassize: 16383 %%BoundingBox: 2 -1314 1022 -6 %%HiResBoundingBox: 2.92169833255775 -1314 1021.41238881833 -6.5448391922846 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 223 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -1280 1024 0 %AI3_TemplateBox: 512.5 -640.5 512.5 -640.5 %AI3_TileBox: 224 -996 800 -262 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:17 1 %AI9_OpenToView: -700.448496019698 209.999491681081 0.396269427797295 1350 720 18 0 0 10 42 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -700.448496019698 209.999491681081 0.396269427797295 1350 720 18 0 0 10 42 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %%PageOrigin:112 -940 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 26 0 obj <>stream +%%BoundingBox: 2 -1314 1022 -6 %%HiResBoundingBox: 2.92169833255775 -1314 1021.41238881833 -6.5448391922846 %AI7_Thumbnail: 100 128 8 %%BeginData: 15058 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD2EFFA8272827277DFD5DFF7D277DA8FF7DF827FD5BFFA8F8A8FD %04FF52F852FD50FF7D7D527D7DFD05FF2752FD04FFA8A827F8A8FFFFFFA8 %7D525252A8A8FD42FFA87D27525252272727FD04FF277DFD05FF7D7DF8A8 %FFFFFF52F852272727522752A8FD38FFA8CBA8FFA87D27527DA8A8A9A8FF %7D27A8FFFFFFF87DFD04FF7D7D52F87DFFFFFF2852A8FFA87D7D7D5227F8 %527DA8FFFFA8FD31FF7D21525252277DFFFFFD04A8FFA827A8FFFFFF527D %FFFFFFA87D7D27F8FD04FF7D52FFA8FFA8A87DA8A8A852522727F87DFD30 %FF7D2752527DA8FFFFA8A8FFFFFF7DFFA8277DFFFFFF7D27A8FFA87D5227 %F87DFD04FF527DA8A8FFFD04A8FFFFA87D27F827A8FD2EFFA15227A8A84C %4B52527D52522752FFFFA8FF277DFD04FF7D27527D5252F852FD05FF527D %FFA8A8272727525227F82727527D7D7DA8FD2AFFA852527DFF7D7DA87DF8 %FD0427522152FFFFFF7D52FD05FFF8277D7D7D527DFD05FF27A8A8FF28F8 %524C2727F8277DFF7D7D527D52527DA8FD25FF7D7D52A8A8A87DA8A87D27 %7DA87D7DFFA82727A8A8FFA852A8FD04FF7D277D7D5227A8FD04FF7D53A8 %FF7D27F8A8A87D537D27277DFFFFA8FD047D27527DFD20FF7D5252527DFF %7DA87DA87D2852A87E7D7DFFA8FD04277DA8FF527DFD04FFA852A8A82752 %FD05FF527DFF5227F82727A8FFA8527D4C27277DA8FFA87D7DFF7D7D2727 %277DFD1AFF7DF8777DFFFFFFA8A27D7D52527DA87DA8A8CB525252A87D52 %F84C52A852FD05FF52A8A85252FD04FF7D52FF27F827527D7DF87DFFFFA8 %7D7DA87D52527D7DA8A87D525252F852FD19FFA8277D7D524C525252274C %527DFFA87DFFA85227527DA8A8FF52275227527D52FD04FF7D7DFF527DFF %FFFF7D52FF2727F87DFF7D7DA827277DFFA8A87DFFFFA87D52F82152277D %FF7DF8F87DA8FD14FF7D5252FFFFA852A87D27F87D7DA8FFFF7D7D522752 %7D7DA8A8A82752A8A85227525252FFFFFF7DA8FF5252FFFF7D52FF52277D %52F8A8FFA87DA87D522752FD05A8FF52277DFFFF7D52FFA87D272752A8A8 %FD0EFF7D52F852A8FF7D527DFFFFFF4C214C522727F8272752A8FFA8A87D %5227527D7D7DFF52F8525227A8FF7D7DFF27527D7D527D27F8A8A87D7DF8 %7DFFFF7D7DA8FF5227277D52275252277DA8FFFFA8527DA8FF7D52F82727 %7D7DFD08FF7D7D272727A8A8A87DA8FFFFA87E5252A8A852A2524C7DA252 %7D5252275252A2527DA8FF525277522752525227A8FF52277D5252F87D7D %52A8FF7DA852527DFFA8FFFFFFA85227A87D7DA8A827527DFFFFFFA87D52 %A8FFFF7D7D272727527DA8A85227F82752A8A8FFA8A8A8FFFFA952272852 %527D7DFFFFA8272752524C7D4C52FD05FFA821277DA87D7D27522752A8FF %272752F8277D7DFF7D52A8FF7DA87D522752527D2727F827A8FFA87D52A8 %7D2727A8FFFFFFA8A8FD07FF52F8F87DFF7D7D525252FD057D5252275252 %7D52A8FFFFA87D4C527DA8525327527DA8A8A87D27277DA87D7DA8525227 %7D27A8FF52F827527DFFFF7DFFA85252A8FD04FF7D5252527DA82752A8FF %FFA87D7DA8A8272752A8A8FFA8FFFFFFA8A87D527DFD06FFA8A87D7D2127 %275252A8A87DA8FFFFFF522727FD047DFF7DF8F8522752217DA8FFFFA877 %52F87D7DA852F852FFF8277D7D7D527DA87DFFA8A852527D7D52522752A8 %A87DA8525252FFFFFFA87D7D7D5227F827F827F827275252A8FD0BFF527D %FD06FFA8CB7D77274C7DA87DA8FFFF7D5253FFA87D7D525252275227527D %A8FFA85252277DFF5227A87DA8A8A8277DA8FFFFFF2752277D7D277DFFFF %FF7DA8FF7D277DA8FFFFA87DFFFFFF7DA8A87D527DFD0BFFA85227272752 %52535252274C212727A87D7D7DFFFFA827527DFF7DA8FFA8F8277D77F852 %7D7D5252277D52277DFF2727524C277D7D52275252A827F87DFF7DA87D52 %27A8FFFF7D7DFFA85227277D7EFD04A8FFA8FFFFA8F8F852FD0EFFA8A8A8 %A9A8A8527DA8FFFFA8A8FF7D52527DA8FF7DFFFF7DF852A8FFA8A8522727 %52F852F827277DFF7D277D2727F852F852A8A8A8FF5252A8FF7DA8A87D27 %52A8FFA87DA8FFA87D5252F827525228527D7D527D7DFD13FFA8527DFFFF %A27D7D52272752A8FFA87DFF7D27F877FFFF7DFF7D2727A852A827277D52 %27FF5227A852527DA87DF87DFFA87DFF52F87DFFA87DA8A85227277D7DA8 %A8FD04FFA852527DA8A8FD17FFA82727527D527D7DA2277DFD04FFA87D27 %2752FFFFA87DFF522752A87DFF7D527DA8A852FF7D277DA852A8FF7DA8F8 %53FFA852FF7D5252FFFFA8FFFFA87DF82752282752277D7DA827F852FD1A %FFA8FFA8FFFFFF277EFFA87D7D27522777FFFFFFA87DA227527DFF7DFF27 %27A8A8FF7D27FF52277D7D52277DA87DA82727A8A852A8A87727527DFD05 %FF52A8A8A8FD057DA8A8FD1FFF7DF827527D527DA8FF7D7DFFFFA87D527D %277DFFFFFFA80027A8FFA87D4C7DFF52F87DA8FF52277DA8A8FF27527DA8 %A8FFFFFF522752527D7DA8A8527DFD27FFA8FFA8FFA8FFFFFF2727525227 %527D7D2752A8A8527D272727A852527DFF52FF5252277D7D52F8F8527DFF %FFA852275252A8FFFF7D7DA8A87D7D5252F8277DFD2DFFA8A8FFA8FFFFFF %7D525227F8A87DA8A87D282727FFA87DFF527DFFF8272752275227527DFF %A827277D525252A852277DFD05FFA8FD37FF7D27FD05FFA8FFFF7DF8A852 %FF277D7D2752FD057D27272752522727A8A87D52522752A8FD3BFF5252FF %FFFFA8FFFFA87D7D5252A87DFF00527D277D527D5252277D527D27277DA8 %A8FD40FFA8527DFFA87D27272752527DA8FFFFA852FFF87DFF7DFD05527D %5252527D277DFFFFA8FD3FFF7D52FFFF7D52FFFFFF7DFD05FFA87DFF2752 %FD05FF7DFD04FF527D7DF8A8FD41FFF8A8A8A8277DFFFFFF7DA8FD04FFA8 %27FF527DFD04FFA87DFD04FF7D527D2727FD40FFA8277DFFA852F8FFFFFF %7DA8FD04FF7D7DA85252FD05FF7DFD04FF7D277D2727FD41FF27A8A8FFA8 %5227A8FFA87DFFFFA8A8A852FF277DA8A8A8FF7D7DFD04FF27527D27F8FD %41FF7D52A8FD04FF527D7D7DA8FFFFFFA87DFF7D7DFFFFA8A87DA8FFA87D %277D7D7DF827FD41FFA82727A8FD04FFA87D5227527D527D27A828527D7D %5252FD05277D7D7D27F87DFD43FF5227A8FD06FFA8FFA27D52522727F827 %F8275252527D7DA87DA852F852FD44FFA852207DA8FD0BFFA8A87D7D4C52 %52FD057D272752FD38FFA8FFA8FD0CFFA84C527DA87DA8A8FD0BFF7D4C27 %7D52522752A8FD0DFFA8FD28FFA8A87DA87DFD04A8FD07FFA8A8A8FFA852 %F827F8272752527D7DA8FD06FFA87DF8F87DFFFFA8A8FD07FFA8A87D7D7D %A87DA8A8FD24FF7DA8A8FD05FFA8A8A8FD05FFA8A8FD04FF277D7D7D5252 %274C27272752527DA8FD04FFA8277DFD04FFA8FD05FFA87DA8FD06FFA87D %FD22FF7DA8FD09FF7DA8FFA8A87DFD05FF2052FD047D4C27275252FF2752 %52277DFFFFFFA8A8277DFD04FFA8A8A8FFA87DA8FD08FFA852FD20FF7DA8 %FD0BFFFD04A8FD05FF7727FD047D27274CFFFF7DA8277DFFA87752FD04FF %A2F87DFD06FFA87DFD0CFF7DFD1EFFA8A8FD0CFF7D7DFD07FF27277D7D7D %522127A8FFFF7DA827A8FFA8A87D27A8FFFFA827F8FD06FF7D52A8FD0BFF %A8A8FD1DFFA8A8FD0AFFA87DFFA8FD07FF27527D7D7D52F87DAEFFFF7DA8 %27A2FFA8FFA82152FFFFFF7D277DFD05FF7DFFA8A8A8FD09FFA8A8FD1DFF %7DFD09FFA8A8A8FFFFA8A8FD05FFA827527D7D7D27F852FFFFFF28A827A8 %FFFFA8A8F8A8FFFFFFA8F852FD04FFA8A8FFFFA8A8A8FD09FF7DFD1DFF7D %FD08FF7DA8A8FFA8FF7DA8FFFFFD04A827527D7D7D52F852FFFFA87DA852 %7DFFFFFF5252FD04FF7D2152FFA8FFFFA87DFFA8FFFFA87DA8FD07FFA8A8 %FD1CFF7DFD07FF52527DA8FD057DA87D7D7DA87D77F8FD047D27F87DA8A8 %52A9277DA8FF52277DFFFFFFA852F8A87D7D7DFF7D7DA87D7DA87D7D27FD %07FF7DFD1DFFA8FD07FFA87DA8A8FFFFFF7D7D7DA8FD04FFA8274BFD047D %52F87DA87D7D527DFF7D52A8A8FFFFFF7DF87DFFFFFFA87D7D52A8A8FFA8 %FF7D7DA8FD06FF7DFD1DFF7DFD07FFA8A87DA87DA8FF7D7DFFA8A87DA8A8 %FF7D2727FD047D52F852275227A87D277DFFA8FFFFFF4C27FD05A8FF5252 %FFFFFD06A8FD06FF7DFD1EFFA8FD05FFA8FFFFA8A8FFA87D7DFD07FFA8A8 %7D4C52A87D7D7DA85227F8272727A2FD05FF7727A8FD07FF52A8A8FFA8A8 %FFFFA8FD05FFA8A8FD1EFFA8A8FD05FFA8FFA8A8A8FF7D7DA8FD06FFA8A8 %FFA82752FD077D5227F82752A8FFFF2752A8A8FD06FFA8A827FFA8A8A8FF %A8A8FD04FFA8A8FD1FFFA8A8A8FD04FFA8FFFFA8FF527DFFFF7DA8FD04FF %A8FFA8FFA85227FD097D5227217D2752A8FFA8FD05FFA8FFFF7D52A8A8FF %FFFFA8FFFFFFA8A8FD21FFA87D7DFFFFFFA8FFFFA87D7D7DFFFFFFA8A8A8 %FFA8A87DA8A8A87DFD042752FD077D27F87DFFFF7DA87DFFA8A8A8FFFFFF %FD047DFFFFA8FFFFFF7D7DA8FD23FFA87DA87DA8A8A87DA8A8A8FD05FFA8 %A8FD047DA87D27A8FFA852F82752FD067D5227A87DA87D527DFFA8FD04FF %7DA8FF7DFFA8A87DA87DA8FD27FFA8A8A8FFA8FFFFA87DA8A8FD04FFA852 %FD04A85252FFFFFF7E52F8522752FD057D2727FFA8A85252FD06FF7D7DA8 %FFFFFFA8A8A8FD30FF7DA8FFA8FD04FFA87DA8FFFFA827FD04FFA87D527D %2727527DA87D7D5227A2A8A87DA8FD06FFA87DFD05FFA8FD2CFFA8FD05FF %7DFFA8A8FFFF7DFF7DA8FFFF5252FFFFFFA87D7D27A220FF7D27527D7D7D %F852FFA87DFFA8FFFFFFA8FF52A8FD04FFA8FD33FFA8A8FFA8A8A8FFFFFF %A8FFA85276FFFFFFA852F84C7D52FFFF52527D7D7D5227FFA8FFFFFFA8FF %A8FFA8A8FD06FFA8FD2CFFA8FD06FF7DA8FFA8A8FFFFA8A87DA82752FFFF %FFA80021277D27FFFF7DF87D7D7DF84C7DA8A8FFFFA87DFFFF7DA8FD05FF %A8FD34FFA87DA8FFA8FFFFFF7DA87D7D27A8FFFFFF52F84C7D27FFFF2752 %7DA852F827A87DFFA8FFA8FFA87D7DFD07FFA8FD2CFFA8FD07FF7D7D7DFF %A8FFA8FD047D52F8A8FFFFA8A827274B52F8527D7D7D27F8527DFD04A8FF %7D527DFD07FFA8FD36FF7DA87D7D527D527DA87D7D2727FD05FF5227F827 %527D7D7D2152A87D7D7D527D52A8A8FD36FFA8FD07FFA87D7DA87D7D7DA8 %7D7D527DA87DF87DFD04FFA87D27274B7D277D7D7D52A87D7D7DA8A87DA8 %FD07FFA8FD35FF7DA8A8FFFFA8FF7DA87D7D27A8FF27274C52A8FD04FFA8 %52277D52A87DA87DFFA8A8FFFF7D7DA8FD07FFA8FD2CFFA8FD06FF7D7DFF %A87DFFFFA8A852A8FF7D7D7D277D522727767DFFFFFF7D52277DFFA87D7D %A8FFFFA87DFFA87DFD06FFA8FD33FFA87DFFFFA87DFFFFFFA8A8A8FFFF7D %277D7DA852527D2752FFFFFF2752FFFF7DA8A8FFA8FFA8A8FFFFA8A8FD06 %FFA8FD2CFFA8FD05FF7DFFFFA8A8FF7DFFA87DA8A87DFF7D27527D5227F8 %FD0452FFFF5227A852A8FFA8A8FFA8A8FFA8FFFF7DFD05FFA8FD32FFA87D %FFA8A8FFFFFD04A8FFA87DA8FF27527D52F8277D522776FFFF524BA87DA8 %FFA87DA8A8FFFFFFA8FFA87DFD32FFA8FD04FF7D7DFF7DFFFFFFA87D7DFF %A8FFA8A8FF7D27A75252F8762752A8FFA82727A8A8FFA8FF7D7DA8FFFFFF %A8FFA87DA8FFFFFFA8FD2AFFA8A87DA8A8A8FFFF7D7DA8FD05FF7D527DA8 %A8A87DA87D527DA8525227277DFFFF7DF87D7DFD04A85252FD06FFA87DFF %FFA8A8A87DA8A8FD25FFA87DA8A8FFA8FFA87D7DA87DFD05FFA8A852FD04 %A8FD047D52FD047D522752FF4C52A87D7DA87DA87DA8A8A8FD04FF7DA87D %7DA8FFA8FFA8A87DA8FD22FFA87DFFFFFFA8A8FFFFA8A8527DFD04FFA8FF %FFFFA8FFA8FFA8FF527D5227527D7DA85227275252A8A8FFA8A8A8FFFFFF %A8FFA8FFFFA852A8A8FFFFA8A8FFFFFF7DA8FD20FFA87DFD05FF7DFFA8A8 %7DA852FFA8A8A8FD04FFA8A8FFA8FF7D7DA827212727527D7D5227527D7D %FFA8A8FFA8A8FD05FFA8A827FD04A8FFA8A8FD04FF7DA8FD1FFF7DFD05FF %A8A8FFA8A8FFFF7D52FD07FFA8A8FFFFA8527D7DF8FFA852F8527D7D2727 %5252A8FFFFFFA8FD07FF7D7DFFFFA8FFFFFFA8FD05FF7DFD1EFF7DA8FD06 %FFA8FF7DFFA8A8A8527DFFFFFFFD04A87DA8A87D52A82727FFFF277D2727 %7D52F852527DA8A852FD04A8FFFFFFA87DA8FFA8FF7DFFA8A8FD06FFA8FD %1DFFA8FD07FFA87DFD04A8FF7D527DA8A8FFA8FFFFFF7DA852A8A85252FF %7D277D27F87D7DF852A852A8A8FFFFFFA8FFA8A87D7D7DFD04FFA87DA8A8 %FD06FFA8FD1DFF7DFD07FF527D7DFD04A87D7DA87DA8A8FFA8FFA8527DA8 %A8FF274BFF7DF87D27275252F87DA8A8A8527DFFA8FFA8A87DA87D7DFD05 %A87D52FD07FF7DFD1DFF7DFD07FF7D52FD05A87DA8FFFF7DA8A8A87DA8A8 %A852A8A87D27A8FF7D274B7DA827277DFF7DA8A8A87DA8A8A87DFFFFA87D %FFA8FFA8A87D52FD07FFA8A8FD1CFF7DFD08FFA87DFD04FFA87DFD09FFA8 %7DA8FFA87D27FFFFA82127272752FFA87DA8FD09FFA8A8FD04FFA8A8A8FD %07FF7DFD1DFFA8FD0AFF7DA8FFFF7DFD0BFF7DA8FFFFA82127FFFFFF4CF8 %7DFFFFFF52FD0BFF7DFFFFFFA8A8FD09FF7DFD1DFFA8A8FD0AFFFD04A8FD %0BFFA87DFFFF52274C217DFFFF2152A8FF7DA8FD0BFFFD04A8FD0AFFA8A8 %FD1EFF7DFD0CFF7D7DFD0CFFA8A8FF77527D27F852FFA8F8FFFF7DFD0CFF %A87DFD0CFF7DFD20FF7DFD0AFFA87DFFA8A8FD0AFFA87DFFA82152F85227 %277D27527DA8FD0BFFA8FF7DA8FD0AFF7DA8FD20FFA87DFD08FFA87DFFFF %FFA8FFA8FD09FF7D7DA852527D522727A827527DFD0AFFA8A8FFFFFF7DA8 %FD08FF7DA8FD23FF7D7D7DA8A8FF7D7D7DFD06FFA87DA8FD08FF7DA87D4C %527DF827277DA8FD09FFA8A8A8FD05FF7DA87DA8A8FFA8A87DFD26FFA8A8 %7DA8A8FD0BFFA8A8FD08FFA87D7D52277D2727A8FD09FFA8FD0BFF7DA87D %A8A8FD38FFA8A8A8FD05FF7D527DA82752275227527DFD05FFA8A8A8FD4C %FF7DA8FFFF7DA8FFFF527D52522727A8A87DFFFFFFA8A8FD4FFFA8A87DA8 %FFFFA8525252212727FFFF7D7DFFA8FD53FF7DA8FFFFFF7D524C2727A8FF %FFA87DA8FD53FFA87DFFA8A8FFFF527D277DFFA87DFFA8A8FD53FF7DA8FF %FFA8A87D2727277DA8A8FFFFFF7DFD53FFA8A8FD04FFA8525227A8A8FFFF %FFA87DFD53FF7DFD07FF27A8FD06FF7DFD53FFA8A8FD06FF527EFD05FFA8 %7DFD53FF7DA8FD06FFA8FD06FFA87DFD54FF7DFD0DFF7DFD55FFA87DFD0B %FFA8A8FD34FFA827272752FD0427F85227A8FD15FF7D7DFD09FFA87DFD36 %FFA852F8F8F8277D5227F8F8F87DFD15FFA87DFD07FF7D7DFD1BFFA852FD %1BFFA8F8F8F8A8FFFFFF27F8F8F8FD16FFA87D7D7DA87D7D7DA8FD1AFFA8 %27F8F8A8FD1AFFA827F8F8A8FFFFFF7DF8F8F8FD18FFA8FFA8FFA8FD1DFF %F8F827FD1BFFA8F8F8F8A8FFFFFFA8F8F827FD35FFA8FFFFFFA827F827FD %06FFA8FD15FF27F8F8A8FFFFFF7DF8F87DFD05FFA82727F852A8FD05FF7D %27F82752A87D7DFFFFA8A8527DFFFFFFA87D5252FD04FF7DF827277DFFFF %FFA82727F8F827A8FFFFF8F827A8A8FFFF7D2727F82752FD12FFF8F8F8A8 %FFFFA8F8F852FD04FFA852F8277D27F8F87DFFFFFF27F82752FD04F827FF %27F8F8F827FFA827F8F8F852FFFF7D27F87D52F8F827FFA8F8F87DA87DF8 %27FF27FD05F87D52F852A8A827F8A8FD11FF27F827A87D5227F8A8FD05FF %52F852FFFFFF27F827FFFFF8F87DFFFFFF27F8F87DFFFF7DF8F852FFFFFF %7DF8F852FFA8F8F8A8FFFF52F8F8A852F87DFFFFFF5252A87DF8F8277D7D %7DF827FD04FFF8FD12FFF8F8F8FF52F8F827FD05FFA8F8F87DFFFFFF27F8 %F8A827F827FD04FF7DF8F87DFFFFA8F8F852FFFFFF7DF8F87DFF52F827FF %FFFFA8F8F82727F852FFFFFFA87DFFFFF8F852FFFF52F8F8A8FFFFFF7DA8 %FD10FFA827F8F8A8FF27F8F852FD04FF7DF8F8527D7D7D27F8F87D27F852 %FD04FF52F8F87DFFFFA8F8F852FFFFFF7DF8F87DFF27F8F87D7D7D52F8F8 %2727F8F8272752A8FFFFFFF8F827FFFF7DF8F8F827277DFD12FFA8F8F8F8 %A8FFA8F8F8F87DFFFFFF7DF8F8F8FD042752527DF8F852FD04FF7DF8F87D %FFFFA8F8F827FFFFFF7DF8F87DFF27F8F8F8FD0427527D7DFD06F827FFA8 %F8F827FFFFFF27FD06F87DFD10FFA827F8F8A8FFFF7DF8F8F8FFFFFF7DF8 %F87DFD06FFA8F8F852FD04FF52F8F87DFFFFA8F8F852FFFFFFA8F8F87DFF %F8F8F8FD09FF5252FD04F87DFFF8F827FD04FFA85227F8F8F827FD10FFA8 %F8F8F8A8FFFFFF27F8F827FFFFA8F8F827FD06FFA8F8F8F8FD04FF7DF8F8 %7DFFFFA8F8F852FFFFFF52F8F87DFF27F8F87DFD06FF7DA8FFFFFF52F8F8 %7DFFF8F852FFFFA8A8FFFFFFA8F8F8F8FD10FFA8F8F8F8A8FFFFFF7DF8F8 %F87DFFA827F8F852FD06FF27F8F852FFFFFFF8F8F87DFFFF7DF8F827A8FF %A827F8F87DFF52F8F827A8FD05FFF8A8FD04FFF8F87DFFF8F827FFFF7D27 %FD04FF52F827FD0FFFA87DF8F8F87DFD04FF27F8F8F87DFF52F8F8F8277D %7D5227FF52F8F8F82727F827F8F87DFFFFA8F8F8F8FD0427F8F852FFFFFD %04F8527D52277D2727FFFFFF52F827FFFFFD04F85227F87DFFFFFFF8F87D %FD0EFFA827F8272727F827A8FFFFFFF827F8F87DFF7D27FD05F8A8FFFF52 %FD04F8FF7DF8F8A8FFFFFFA8F8F8F827A8A8F827F827FFFF27FD05F852FF %27F8F85227F827FFFFFF7D27F8F852A8F8F82752F8277DFD10FFA8FFFFFF %A8FFA8FD05FFA8FFA8FFFFFFA8A87D7D7DFD05FFA87D7DFFFF7DF8F87DFD %05FFA8A8A8FFFFFFA8FFA8FFFFFFA87D7DA8A8FFFFFFA87D527DA8FD05FF %A8A8A8FFFFFF7D7D52A8A8FD32FF52F8F87DFD13FFA8FD08FFA8FD43FF7D %F8F87DFD04FFA852FFFF7D7DA87DFFA8FFFFFFA87D52FFA8FFA8FFA8FFA8 %7DFD04FFA8FFA8FFFFFFA8FFA8FFFFFFA8FD32FF52F8F87DFD04FFA87D7D %FF52A8FD057DFFFFA8A8FFFD047D52A8FFA8527D7DA8A8A87D7D7DFF7D7D %A87D7DFF7DA8FD32FF52F8F852FD04FF7D7D7DA87DFFFD04A87DA8FF527D %7D7DA852A87DA8FF7DA87D7DA8A8527D7DA87DFF7D7D7DA8A8A87DFD30FF %7DFD0627FFFFFF7DFF52FF7DA87D7D527D7DFFA87D7DFF7D7DA8FF7DA8FF %A8A8FD067DA8FD057DFF7DFF7D7DFD31FFA8FFFFFFA8FD09FFA8FFA87DA8 %FFFFFF7D7DA8FFA8FFFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFFFFA8 %FDFCFFFD9CFFFF %%EndData endstream endobj 27 0 obj <>stream +: Z\dDz'.cg$Rm<6uEBֲ:߱S(Ӓ +@ H(fKTs&女M~9#Mnt?x,{W3K0YKf4r 2ÆK?Vo*LDޢ +#iOh1G&N&d\갢x2/XVh\ҚA7-*٪LeOPFVǕsXs 1 78ﲇ`|xQ (ΝOyф=#n3%VËk GGyP bl S'ȈXYt}Xi G3YQě)؅ Fy)w݂~Jtt MҍTMN&W vDD6d ·UAjA6Y[ܬ4Լ*yא65p{jNn 9a Q(EZBtYĴr;H xZt҉#4F9]R\~ ([)Eُe{0QV&5IlM&șC8W;s4J`3䬑5\8cZ8+u~Ld`x'dgVx j{IPq ehDV繓"_jިhyo(n`׫PJ1RQkR4c(V&\!Xrs6'`:Z/ލf)XμFnهI3"ͫ@kT&E] s=(EF/({NښhS4Lw"bپR8?s]n9ؖhq(qТqT }ڢ +] fgwhVخ7QwCWOĤi+*6\&z5n>ʵe/6~nPl@'L ss9BT]aXT<#4:zh 򢓱m?LQn߀J y1ʲpuRǫ=NЏ{D@ ݯ;\Ts-MUVU!]8Re9r0+h8؇/&ʊ6krh^ǖiGt2ä ?r؟B>݂Orr'Ա LT1\A*"wx!7~X9w]+6 +-,#(͈MBFw_Iv.񻭩G+L=jW֚`/IIZtRyy阮i8}慇1i;!ԎG 5Xsq"4yv&`*jNzj!j*"WkN*(:gBTdV5<\բP\ qI: y`|=I~msf;q2!"M 浧Br8]j_ǏUU*A|Kz'w%Q<3~!kϤaeZ'TP*|i$kEurj`ڂ-2gB$=('HgQ b`9hI,h  +<=բ DA=[3?^}4x@('f-Nbݨ]*_#NU z_J+b3lì?yW=yfnnS6Jk6Ouvr |~mS\N B2skF,GN3`B5}Oě@^!`U?LrN0cU/w11xb6NjDGՒ3pEV0nmxCR"}̽p?6?7wpKExf\A1u""_r,aA;yM1|%Ȗ=]'1?~lKC^Zi!;^2} l fREһ~K4i")W՘Áբ 9y^0=Ym=WBP0iK9'e0@_>WbdjL9)պvIļ! + zF4&dS4owhTVhKu~gZr Ͻ +J]SdK-n ȁH+1ģ!po~p*881#w3ܵm +~ 5?YQ,͌WN#L=Z qd9{uNc,Z-QhA]1Fb;unsR1a5 X|d"p;zkҲ}Fm(xFj"nι=%I }R[^v=BoXwP #]B/(ZSH)R{( vZQcL1 |/_Х*jdͷ1!i6#FӤw>v$"h;W[BU dM+)ڌǐeLjv^ pwM'C +>kJ"Vwuт!<1Td떱4o7G :lȥTgl#q}PQ9;oT* {T;y%dG~Hh \7ac{ 䵭BȬplmOI,%rK̦6<.}+Jcy])xWx7+czfR +wICI)ޱm)g," UY/2d\H+F[ FfA;ŚvL^+`3ߝNw6 +H~%)'~e C6Zczc8Z8zWu`+{x*BjzJt{^%,i-}F_1C4 q=e-ʥFU,v]I7Vq@$vĹk}_u˕7~c˞1O(i@ΓFd&}:8UβϷ +yE{}ׯ(%>;^ը%is~#dJ!1?jV3jkY79t٣LPE4$ݖIcVCWKFc8uPaĸEj;^YdR$('}N8ΪMcoA.IET]Pʶ1SɩBE~]A?^'gLF]=I!ZB_i?bQgO^q,O˕[6hBMX [8>&؎H߽_FjtmZ3 ޹0h^鑷!i;lRT(m QP?c˸("Rv/bpGôOƅToyAY/$S4:Ez'}QX7nL=tЧ"Ίw2˩ ΄ސ wiSԳ>w̮z "9Zko^OK]Gpn-fp_'ioڇ0hJ4|@8CR?QdCKL+= C;Q)DM p):YU9s`q=.mTٵUR+V+۲מ0cRRhahPP[jٕxfN/QiXɆKi#5,oNg;Pz3G 0tZ -No.n=u1!NKu +ԚmuP iinn\SBe[[. 3bs)Lz:@9iJei-1 8M9$S +4['(78(fu#3NHwǎ*T +nsr'MvlqNyNYq#a;GH|=Qz0K~ # wG@3 C,y6]pbyP;|uA`߃ly$16M/j #O8C~jROWKn]m]Y@ FLDg<9p(v#9J`貓e;oh"7N\ՙ^#^h1Gm%K 4*um-Jt |w<1Րa@~kcE١7w;:qK5jEsFDR p8&(Π2uuF4#?ზt#g8/6r)l",l>@Y^xl炶)a" M0'ztv.dee~Qr(% +rXf #3\b-5>Kpk^D% Cm5Yng}=e Tq\2S|RW [ҵ7k~-w1GuZv+lAAD%]'(XĈ: MS9L}SlNj^Au gTEߢ=JWBvoo&]apt\w>W5b>h52d#G.Wki#7ՌUB)[I=\AAcQy!B3{Λ/TB ^U@nfӻbA7Mi jOVBT1qZ p=౸A65ˤB[l-TlӀ*3q~X:cJRغ,'p;mu5ذE受 +ޓL *+J+C"0*WӝFN Ih*XHʽhٱS%/%Z{9̞"q_5t9LQ`":0{)wDJr~-CnU_+O7"zWxJQ4̼' 6*w%/dX8Eq۝h9#(9K k{꿊V6gT]IcEX0B +RLFVbG,",^z3lv΁t&'`krmd79_3~&-^F'v=/^ΨMxh(skwmBkȞ05SpG*h v@w_Q,7Z@w#h^>$&XN+-ħcencmUT={ai}I1 +2J;+%SqKjl#qjuOGiJ'X NJm8~ܐ\Eq2̱y&O)J)`N8tLBcw_D߳ݜ"#C4-!3ij̯ST S0y#LfD"x࠿d#={O7BUV|HW1L-*02jҽqGg){ +hI,wIz[L;C=Thrl%W|wLlkbTdVIٕ2V94J]J 2BRF aЫ"7".\#39(qUn{*2@ڧ͵_gxt{VW5%'o K^蒧sSXoCzFxGuc_He> sGCA@?<1~VzRhj}svlѰ4 +qh!ʧuvJH0ыH\m8yuً!quzQיqͧA!/ DVpSE_[IIc1huG;DNWCkn>[;tZs!~Jzne=w<̣xrQ15 '&s X \}xso +DJic]lUA*}ob}akps`a(J F#u)5k\z_MǺT*[n%ՊL;E9k~).I;27=~|qvU` +Edl{NV'KS՛ݠPXr8K7DuS x(jQ}ܹ*wVZx#nK' ]@5ڋ[!i : sTH8jߩ~cCt6)],/ȔzgЎs 7V-˘\zU:V(&9f2bf2 h0>;@zrIzw%e/G/F5DRKS|b9]19"?Ռ|,3.6!)t +yGG+J@9k]KM+L-pj7?ԙ%R52dCE8;t&x$ȹ1%, Oƈ_%̀TE "^_pHauh4і$hZG/#J;KQ _|#~q˥h͟m'E&c+XE2kBSU+YFZ)Qko!ZR"Gr,u[652-g/s2@V\Ob"zJLV..ՏϠZAД~U5Oi{zH?Un[oU$E Mo9F,D?SN DyT|D0UŸH+o.mhCMU7"bH_{MOd*ZiG* ХoB! P˾"{콘JF~*!d5A04X;qX<  s]κ)_cmQTdQCF=W7v0[_2 +F]?OhhɰPg2=b =DeRz͹- <93Bc.1IaDK#B+}!yZ7݈ud +NL;~W؝-lYVS/mN %~~NǢІyZ;;Q-@\7z z4=皘WI0]W'6byXҽر\j sEmC ?28 jO[ODߕݼrARH!W 1l~Q# ¤\ltvMa[ftQ&3+W߫Xs`98Si+.bjifS#a#dgwk4}Q]canUٝ&|$T3C>qȩ'tE"D EF Mr7p*cVL)2ˠt3 @0GQ`C.G@ηq'̭nOIom5wuѣ߼P P[t +4_'jX6@x <]^GhÍ oF{(=It*nnw(ԃ:Xp07-o'lJs'+k #ט9p9B%؋?k[bCC8;܉Ou<9 `07e+{V1o] 42%x㢐=sUΕ"}Ǖ !]{i_,CJ)7G3(󀆕@Md٨p+|d>O:,t[^#+qZ&mDcM˝Œ!C+cT At&p"DIAb*tsǝDaGmEL9][Y0J &!̓/a1q9d}l +a A)igf2EN0$fAPvC C ?ϱlw|}qv7&lP[,h]6v"k;U ⛰b!||nEžfYbgt"ڈb_(0-:C:;Spf9 +7UB [{w  eQj+;!jg +b&MzIx=w&Wo8^^Gynt>NEeN` .='7g^*vj5 +f يV^tdߒ=n +99d^ O`ͱ"p M@#9ݩꊪƕY~`=rE4(| bO&SH+@%%ߛ:}??w6^K-zn6ӑx3^>Dxv3N*Rxc-:EuAwT*JgQc>57K]9AQ{3Թ/./swBCIql +`#vM\Sz^w4d9v'j!s|SMhvRVtnEW2Rt,R.së+_b;T8WQ + Oc۰sթ@rLYiSc1ou)|el3mW}GU;R԰s` 3qKGk]6zAQ!s)1Yi>8ynD+rZnRJYwH +nǥ4Gs !я~#,#"YqyCp$sFkfF\{uTp IU.[91 fq |F}fp!aDmĆPڙ9h3C +M_W)uQT >8=C[H4:9qyQ|wz,;UO_YAp@ېk^>qG[W̰dL}}M +BOwk 4ݢY‚,/?8Avc+*TZ'k!%Գ|$5dr:9ڢ +y( + xgU.4#@HtEm͝ÑuF>R)o_JUW?*׃q\K^7Rn56]9XIe 2V]]$}*1R!UCw +m[~> y1(lsJa+q)| 9-7i1S-&3g>g^#`HգFDxL_m|nȎ?W C=uq.NAF?ij43[,p舜?ъ>K-=߲K,=|:yu-28U F;uH[T܊L ZX/ +b}G/UO3w +2aA%@tDHTRGVm{,m `5m{f)h[~9{$Cn:PLVi{8{sbgߑEg o99bw.T\h:9qrrTKwDYҰlĥf5>d/K*|^`~bF<<[9}P3oyòj[2&Y_j+’^\*ݩ"a;8/lIow;cM I]mOD١ ǎ3t ||4ADU"<*|\P;Քu4B$тNηv@Sg9EE!K5Q.ftLE  pypٿR)l`ω; %iPS)M2}^zM.!~XCQ_KF勞zkGhh^ᾋv{0JNtlW"EbGmVoR鐘x_2w(⯔z-.GP$kxjV JF1Xu.3J%3p:Gbz}אxLVW@z+bXt\aSq(쪣 TY4_fܧ%z7 yō02s׆k=a:Qy"MPqaf[+ދà1xnWj +z|ă/{5QXbL?I(z~m%'OLNtǵa[!1p.w !ϠVn4ȆIK";Iֻ!>Ɵ`;*3QD~5AHeOTf+:7_tn* |qsۏ@%3FgfCwϵ4*ti/jK!8vO!W3z#϶s"1H43%_5gp*/̽Z#(Pp +8NCi;Ssr'܍|͌ eeWHͩj5Zs#s4W߰iy'*j.*v]$se$s!k% +齕Ryoꛞ }k EDZ"qSOK\`[a].cK1)A_(܎\şft;?nHT]΂}eR'e <$ :\ '^h8i4)L򀁲i()ǁalC>^ |1p4T'CFA;f?M' /Yr3RU؁~Xf_bq"*cAϽTJ&x8琉YRPՋ0Ð Ruʕ|객-]|* 5fFUR5H^C!xE:jm!"93Le`k!`|B#?Y'ZC.3X7Dm[æ +)#BKy9V\Q]x0)"@5 ֑%k:ˠqVzb5`:VV5 v>DZ3~(3uFt+(=:õE{w;٨\/Ds .оJeQxb/.sУi= 9Q[$KV# _ojV6w\pQ_9˫ݫFMm5_~Z#~{[4B49C֖ m9MNkC e[󟽴{_nZJD%YpRՓwW3UK +[?fD"p>Dހ{a10lm[RݬAomF.L4(SBW:s"(ˑ!wjqijѨ5)$WF[Y/ĎXzRZW):sG,R)y{uO#OV[@$cQV(jǥ3|~D`W/ 0jY):s&6?(u-mz DtrbRa0F#LRXŕ +GmEqET]#rhV$th88'׻;&RIRnU0K v.s T%ivAT OpW|"$Pū= E^f +Ft0=)@AO@+p.瘎ⴝ4V/).7VmK!骾aWFdd&-R@:dR_ X\\2?gas5茙3BiUDqo*dhZ77*^#b]z.&(\ nœJޑ*ohg9+DmG5#DA&ӓ6=ŵI(Sz Q:B)T΄pٯzE"_Sݽ7!+iG OG^VB=mSb;Ch%W\ . ib$Em(>`9X]!&0^WMYӎkAԤTt=4̖D|rp_[4a"Qpa>Dՠ%F ǻK`Awooǁ8=^_5S@N L-;}etJ}j +)󗟉u=Suň{;7gsmdVX% + $TuKft}KLoZ`)ۇRaјBu*˝iU#նCW` +!]UDnb\XN j@xZ)U[c:EB-JTVu?>DkǡۃHDɇex;c-h\9¾d`^/@wdWYL'|"TzK EdHҢ,t(o<*5 +ɋ +ߕGqN#GϹUp>2ym=ݝ9лRp4`].%gZv̳>N3ϗZtC6 PQhˈpң|-^a>&NTD)۾Չ'&/b_[eLbT'5Cw? DkU$XXd$%D.U7:B**{[K#)`f=v n|bLYqPÜG_P;A!5|w<=LT__/R ڜb`-B(684j |R C"z L/{\)b\W !T!ЮX'D*/CS%~L1EioKNu0F2/ Nj"n(΀<<@ejΉ݅C8KKv %g|n] R%lE9'JgEU?c#&Jti<=AJ\kL rxU假M X?4iHL}G8'+;Pሀt8L{r{Rg>@(6C!8p?Eǀ7?vka!S*%i]tSx* +Xio7G0L’É ϖx0cpq7qgu{^_XU6Ι+qT3_ZLC!œ@=~ol>`;ç$p"W9Fpa[εGkF1UIȸ"k]%)ӕѲ6+Ȑnlޞqۯ# SiUOb&?{ Ȟ!ʊѕ:Y -z +WxFx +6B θHQf"xD2X*qڍk-R62/AU[p T('mWr?l(bXHU,&] c|: Ś"H}l)}Tc8ŕTtߦž'<5M[f><̥x֦}H -״2HVvALV}Ẅ́-;`6)6þoKH_kٟ{F0C 7t9w噻DI+x :sbL]%*U_&QQy0Tמ4"|&z4wH'6U> :OȹK4 jǜ$=ti'=\:Rb:S-Zo>(Vо}}KJrN*!hQߺȓ>r!a\imCgh^G} v= 2P9H +{]:6 X.d4=g=_'n+/!HAH7[I4]#xKkq:w@Zm]G+EzmC)z0U'3D4IfZphҕ;_ Nܠ0!3̜ӥRO @S/RV\+Uߡ\hNowd& ʓ +ŶmYL(}NtR½Ogmnzכo$@lKJuT<.s1YzS?FrI+/0g| hCQ/x\ZP^ɭe2`<2|S]X)Y`Vm>"AeV'\yiNJ2^'kj;.Ӎ>s ( QDVWgsYO3_,_eQڿ-69{ [R~ ky4L/rS$k;L8SK`{\a\ [qn}fdY}iY5t@ħ)KX~ mgS>6ےl`VP~gوF"_͘;QS!Sa,n&@X"s+ogd A}yK2;fK%ct.doU\xGJ& H:?rf.f>*rNvy>F艃Gg=7"e`ՙiD=n^MhFMcr"[V\ ;C3`2zcb@B!uX4%?JyXKY'/5|,[2`*Tv +Mfe__xv|~կ/)FT/6ן_ +6$.,&puNLh)m]D'~Uة{_h. $4VAĩOE빌'yTTNCgxѼϐTb{9 tzf``:"N%е2d;|MFe+ʰ'c"~̠_FV p0G*!(2bcCqR$O0 z9<auQg6i*< +l29@ܑX}H<H qMK͗7?Z7:= 3^(dS u##8ĸ#Tù_)e+wǷАMp{9a!Lb \Ct#ֆѝ5 [zN {RtiHUZ^2;[5Gs[ b%GDjD kF9Sh% +y̚ 1ywc !Π0X4H5W~VvYZ*#+3ѡL(#!jGu{_?7R\yj v vZ#.Mb۳NN> <&<{r'rJ8W$n)xc@CHLRJGShPm`):H]GIvв9׾_,?ᗂ+ܵ`خ8iY<OBzZڵDLG&zњ)8J7[ 2`{q% }| վn|Mpƞ#lG#¡Ţ"lWYT"1<Ҏ@w{*!$F\zDu|dA6lK8Eϸ|sy1S ZS}daQn< K +%oAp9h_ [4{A3H`a5-܏>?G8e7 +y1cj >N1DFl!MK,}#LQ85@=0b"d( qNu9h~* 4c./:άUuYl6^=]T bA GuRu|#zTHuф:gem`Fx7МɭxM4_2[ȹO:p`wGE$q +֌#N J+VS+ lmF +r;P*P=0qRX}D3_VX`/>Xns(55i[9SNzvlAwLʒ3QCi7W2sGa(o7P6̑砿bBh[Fĥ5ٮI'%G?(Άk'y8+jvV" vD(PTZ73F8 4}諆˹j)=@WH ?}&Q+ +4 ҳ`(^J= Bg.^!!f5$}GI{{HY"zu+t[<`Mjfs8A<܄8TҟOvҋj! +pfH +l nu4.a>?_4܊0'T"ޛܑFO陱U|hP5,gMȔJh]Yf€X)HVRŁxHԨ#i:-3B3=OHW,ˉy\;vd>sʼn G~ ɽÚ&[] az7 #bL5B{ÙT9)p=#[,^]DWv\O&@aX/Cgntfl5KGE.0>]=#\gs6OAd!>2(r +%5+f"yu-~G~߸x?ڌ(f) ה`<3oh !2_e+Cj59Ȼ1@AhÕ zv%"FYH:w8kQUnoUsdr2G.fc8OT9"fdx>,lQxJuB^5j>"@ٮ!:piG8ܜܥvyNJ}L/"^L( >tO''9 B=3+ܫ<yjK3 CGzԈ f;F̜s+vKO}+Ը܊7FmDDr^\UOFC.9j"碓swŒ>愀#XN-:\=VRϊMD~DičagGDMz1M 9.3VYK==gf<,^yA⛤3f!N6sG7{.WI(ڹ=Q]YG#Kː-.CcqINji2G4$ y8ܪi> 0F+kx5uG٣D2c~#lгFh%`({E*?G|Y[*2I_/ɼ!&1X9DN4B~G&&p7&yŨx_VibL|0񪝋iEn님w|~rpU +;)"r"QPiAZ T؆3OQSwOi'?)̂:qZ1&K6Y.?l0WC6IS'b73(|aT ѓϭfGqs)b-b%9"}|9h-W=[EO0$~Ыy{|rf +,ۄ*4֝^;STUcbd{B_gG>8_-U>TB>z ak9wab*ڨ=QBZo${H=Hآ{*rRpabPcE*ǣ%=H4hF5u[C\VDe1Uw.>B*Ԗq tдh8Q/ `€Q#v~R| ?(# ѓ]GM$E=`#edTj\K.e֩ ¹T6S)VMWEpIɍJYHdC}ݕv҅:v}Nj}%[ m`|Bf9\AAZs7?J*Q}T.&}N^Cv&"Hֱd +j>^ޕ`*&G3eL>w22:zMۭ8xWm-%V+ QW8Z1O4)N_կ +=+ܡgϠ[m1)^+'}#.)jB= +;W$O60Os%;F|@dB6lnJup6k28 5?F,J%Z D)% -).ȭ~tLه>v3q/ZNҵem.ZrЧ,W,%-'>!~ X3=D5E1Z-'?x JļK [Br1^?6"؀\Oq'C0F ?e']BK(5jxiǙQq@P~ oT,힒)''x>AvNvU.h=(ť'w}! ԝjYoFP#xvR@R~}dySX4)4(z[Ql0z!xhc^Q9dň(v3DPvg&@̓R-D[LV;sVśN:zOo7gT W yJisӣjQ:"+s[d54;;oЎ\YA\ɃOC|%95s8@<&$/< +ϩ+wmZ.3< q +qM`z4C`M*p;2I9jU=CEal\$I{3c/5Ikho)kRlzM[il(#T*2B]:o~y$9*px@r^^+ +m^2z 7q'䍹{۫Ӯ1Ox)gh>G?~X:ãVyU)sZLs֎"Iq;? =Nu +]8Xgʠ]\WBtzBO8=DKN,E/!L|wթz Ej5GB$Syy{BaW #ƪ.;PjM.H'SxPTռ/hc͹6#d ^Dԁ;^Fa?=^Ƶ|ИјjǀN`^{PN0 ”?mzI: {A?! HdTZm<0ҌɈ2\Nx)wd`Htmal!rJ|{ XxFiG[zA' +(,2/#?!Ef,7GwqS/Q>cV⛍{=_Qk$? `E- <0g >e&qL +VE~ *I!QEhKY!DX4,Yt*qyZNfQxifj M]$aL`-+z|fҼS eJtݏi J ^9nfH5_vF±=a$wԂzg H[^ѾѶY8z}_f,BJAmQtB!|<*{#9%.-ɳNn4A4'əvΩ LOq%R)hX3h"mq紣8Hҧtr\6BRq*=3C5WGl_!$6x Eұ r* ^\%yJ{xL\ w1)H +J8=\v?RYzDδ:7G埨GF8vg˫mGqW ѯ%sɡ&:_zV'Œ[]yA\~"G[ hgUi>?16h}cM˔oA*NM yޥ!ѕ%$9-8_ ׷ZTן ZuT4}4?!`b;ĭ`y +lZ N0/!U6_^~YVq ɧzk;ˉw˷0왋 DkOp- =Zӿ8>ԇ#Z-JE$}O$ZvJ 9K;Zm>3iDZQS;ǧbq'ǕcS6.V@eߐPКUnRHD(C9>7h偝Œ2{um.~:F@fNa_^Pw& 8N]91zpG6rS\1?{fuBŀDgKٍ)><}h  +&.31zw<"H2ڶ`++eͼB 9n_ϼ79=hD$7+|kC$ +QR,{H?$ڣ괫2lˇ;3cDL$WDF?db<[yk[_xOxZyA3'poAM5Z#J+aj"g?cksɱ *3fE}aNxO]֑)F\)12v C8m{: @_bdTγouZVaYF} A=Y6+Ir*)D LQ߃AV%(lP##@$/=4,:[Fdk)EICdq5!tjGY/؀"v'ueOw9C OSnՑFq7̖-zeE[SaE$$wEp 8 F +լ4Dێʂ8k#*_ ,\DGrƦuUo':mF=YDS>f=/-9}pm7kjaI+v&E24oRkP'yDj3Kh7V- +$Gڑ2RP-Ȑ cHgcu I!|[T+쉹qZڦ\fzcд࡙4Ahy=nD h?-V]Q:^Wm`iRT˟4n^S8>7ܧouEZZw#~=vֿe6K/1Qt%1{yɯ=s18ܬtD9]aGy(Ɛl̚x\ #[qcڊB, NS/sƱ; +NőMzK][ {XVZv< +vp<0'לAl\$hf"r9A,d Ki#3#х߇ 5m·V7Or ܋G{&+bņ tVמ9lSg s!%"5eJ?oҋ0̀@vTqЬZnG2U;f_fݔpw*{ xB՝uF%6a<88F|Ja:!(=h8I(1w(\ֿ^Gg'Uu鑬 lXV*| 4Xa#QI$~gHl֩n ʆF)֯ZEIo1GF:)U?w JSOuI&Uu L+MM Aת@>ƫr,vE^*pn((`}?15 #K& }Gz?ydlbU iɛJw=fEѤ}_2w8µӞ7IVv7:Z`M~ t<ĝAND%Wau>$vSMRBzM[=U;T^^OQۄltl- @6GuvRwyAC83Uޯ?[BS|Ϡ9ɷZn|vaH[@љg່YSK +45FlD6ӫDTFc[$`!MHrUaLER;9[ +ףC5Y!rm{VسVhauUf44+ESvV?1O&6 R"+!^@H_$X+ò14>hmSoLڪԪOҬOB sF $*5GAJM{bK%5?Ϫ +H=x]ݙKuB +m,5Rj!Kdz?~]D{XS%!P]X2$/ڽSBVÓ|w`·J}[ ޞF ۻU2/VBun@g@#Sn{h*| UA<{zZ!2rWž,jHHZѾ*b:ΨGE$\ !oM7ϐC6|!#wvA!rD0 + ?*bݞ9" [w,9,Ki = +ÀF[o9}!iG=+w8SDU^zj|)on R<G(A[>H!Ux01}=#,-f2a>OWc{%1 THwllˠ@\DK*.zt:駎Ok7"26G?jA/]uX=TvAcwxߡY`K#@U՘bJ~>F~NRQ @)3u'.inO|(PUOnBw(nz\3%'xնk#W*WjEFGxbނz3$U#>KOr=JgL0ԌwͲ5W@]&c? LbJE{.Ă*+>9TSe8)|* ,s3Ouw)w~~(ץp'ZCKU|$ ". F;l:=cԃf#aY6WPiWT.y6fOk? iH߸ +A ˃ 4ٕo5<۷ LWOhf ^$VFy'Zw>oSJH0Miiax-!dZBQOۣ=7Y6I2a & iᑴLɼv7s]xLD=fg;I +WfĥXLQ`nͥ3r.)EBkא"xja + Ş109HfKec@s=Ȧ3; WC5)ٰ;=ɒOUMBF_/Fqqwѝ|~NFHV ǀ])4mDT>H`Itۑx!BN5`cR=Cw)ρ€8m +djX *w~;bb עAO[0?6pA e>t"ƔffsH7B!ޯ>RcH>X6o)[hoo!%Nj'Vɛ3j3nrA5\[9ͯ(쩊sBDz}Y=~^GA׳1Q! vZ̩+Kpdk力d(vu0w+\PaFwv|>;LPLert¢<ͧb|vjȦ).ߑg ~*MazK0- +6-Q.BDH%g^S4_* +M&lAb&AI:yb>t$3Ża̫8s0)g=h$%KL>l-ȬNiq{wӬ9DR^q qEBdx'# +, n -SQh5+s $\<ϸ=札 -Zrdµv $0$xAJM&זW<:I׽` 3u?kQJ3p4$W$5j8i}?őM`."+(QEpa~ rҭJ[E[`Io6'zުB&Q05^w]g`4GNLSǫ1 9E7̟֢:m8w a +8T5%z2PX[H?y&'}MY9UP3Vx1S{F[@HnLt#'*](oϧ;ע:T=_beCx5D3y1)}JiHVDgkȨ$ M`#o* eYS)k_!iDVpgztr+A,)/63*_1ldd3y_[<*i'X Sw7X u{vW>)-c^f;"l'o 8ܐH.=BAqzpJ-3SsX2ea Cjҽ$'(uE/o(K&=g8I0wrYH0'e:zQWeBˇlPG7HffP#TݨC}b<^iX`f+by8R(anj>dT!ߠJ(cnXqd$CYPNK OViz>޷F|uۤנt4! փhӽa:d)WcC[WV#*hZ6zĆ貫<>q83ʶķhAQě6⾕:CzxrttOqѐSt`G-i)s@խIa_&R +6ʊTX7v!L~n+48G#x=kӽN$H>2XIoe=#9lAMHy>9=*-BnIa@Ξ`T++ְؕ!s3\TG6jA%؍((^!0 ++\(+܉QIɻb5 %6>Ma<O[Ȍ(~J! YCiu+#mJ!%\#X@'0gtS R wBg Hnd]M4?, +߄cu.,أ]~Y };~9—3̡Bx$Ow>5c!G`T|OU7Q72\h/msQ'=UCVE+qUaq0\5f \zͽ۟ƉH kR/ Ыvz(JUE0kjWJ|W~ UTOL?Xp0EѨD +P%YZ[hXUi&&<p + +YCWLI- +$2Plw2_CIQN᝺hJ_7Z WQx囧rn'2q(6I3VJ+/ʀ߮A$ kp-zuE{󟯆v]^]aO{={+eVOCm9~ U-2rCQJbމx6wh[¯$e`ꓪk--:We<]?IEPU*gpRo:{# ޵6«}Of fa5Eʚ6%ΫSRF7l-D 1s_Y۝vm9h|fA™FC.cK%\+BKPiVL yc۳iIKqcj J ZntX;{0 \|yh pJGzX!(yBrXDgJI$*rc~rq;!4e2ygCuz;[;esGv 5z{vmW̒5l[!y4V'Ez =_M}/A;9l6P!q2) O6Uiя( CV@zq!ߋ`N@3U^FQ{\"yH䉣@Olr<}%SPZ7!!*QL9$ΖJW4råߤ2T?C.YblT K lE/]~JN u3_x7*-\`bhE?nv%+Ȝs)v'-9- & w! ]=STJzD,jW$oBI~Pc/'WvD<%m1+<9vs_Ol@4l_Eez0Mp P \Xmϵn*ly=T,vVsHK$W4PlpiJ8YgC2BubT= ;cR}6 +i3w'XW{pBcڀ5r[@M"zcs@t;L#%m;x[ө"4O%77 !k͐N镌YCj;KkZ&@o{kY&3q4 ZFʥ)ϗ3)hوC\! +(_'CsD|=m ?AwR2{Ɏ +w>aY7ݔǴN Ф?9Lq;Cm|YPs3Tqnݬ* b!;lnFP!*2'n)S +2GE3artԴ*kͭ!-Lkei !@KieEIgV2RV+{FG_ghFIJOՔa %ǓK^T]b09yK&׷qw&wBǢwU d蜣B+(!HL{!NCaOq?B͌g.0|)EY^W^E*_oޏGXw{lsC*UgTs7NKI>Du'}4A^ΧjY4́ pQ4U;>e$,{ )lfX pm$8Byb\t$“p}mz!Ub`_h-ll3'Q{OYH sm[7E)Pc66Hss&ǒ {y:?*{Fi!M=' ڶW%\ɋ&lk+U̢9ޯn~;K%oQx3}Z#Ɨ+1[73#\1S/#*s+t7ij6VMrJQ~0ްy!=۰S-HxH׺>!n=%g AYGfPL"Q6Mju6NL̈́?'ǐ'Zt_ +wxΣٕ|(l9DЇ@{Q %@hYvwֱHS%t6r/!PRzS2`65q$Y>;L'sJ-^::Ww+}0w˵[}Ҥ\G +HhQ_9 +1Mٓ([m0Iҡk:SGc0}T U ӑv!"34c$ţu#I 0uQ,nY"P$xӬ8 >p"G/Ҟ!'Ja:N>HW\a"娅;^ȔR*r|2""9&'`c.znBx2ov ɕ:ڿZ6Z +sV~}zT +WȈ5v緰0zJ2볔E3h᱒3]D-֑ZeyQz8"v$FATci#{Hd\} y9D}XH^ &:*pF +t#aդi=@:mv'yfPѤ;@>êH%(iLE +#qI~]յ+Lڞa'Y=%.W$:BL B#jd)5[b:a|aLuP%:ir\}@םp@NP0v=yhߘ_}RuN \]#:5zz~[A_č͔ȽJ_Eh9ոo(Jj Hw%OZ!ԙ+ß\]ޫ~ _wc+YC:MD(7R;#cIٵYoHwfӐ+./u7 U(Xe 'F}F*,}K>ӗ'dIms"9jc=$Enۏʝ՚N?uJ5u +Ģ- )n~#gԮA{*YSp|b}2'JT{2'H7 1/Jrwx+T0RB *8r|6ǹ^i +X !Fmڬ/y5X +s5Quv䬃r=ӟXS?'÷ '=i>Hmy{6t ,(:ykei(_C]`G.& +X'dX3y*Ut7*Ly=")Yk#آu8XϏJ +_>qjK68$""C.>9B^DY%w8` 6 l4;ޥ.sZ2P< }N$&` ׽+o1N&|&&ЎyD#{ykݬ+ 箚C^/v_N5p'UK׎a'JJQ^wi>(98ӹ+ +l `Y8"/(~nj[0s0/=V 5MX/?JUοheXo}3Ƶl+j`7"S.!FZ:_zYzЪשs!27u3+, 2 b Ty##|'7k;Sy4H~%Y1c@Fh1%T`Iuw .$ -x}lkqzǩ +gbXxJtL-#)n)70csIll+A]D"%)ìpu䨜I*W"+F x1kVa IZFϚX)T(k;;UG5[`hPrDE6j̿Es"D8ٵe Z\yg^Q-*";w nFP{G$6j¬svw"%h.`ǝ ;zB`9$Ҹ6t#ߙd_L>ހPlSm{Ê~ +8iǤ\ :E^kV$_Ğ;tj:%|xIa~'Vͮ( uBHFץcv)P kۢ9=u✒ QTr}GwN~RȥZ⹷z4bKڿ)dGIrBBylTg8HfRT\ Cl~=Uelti kkҤ7U]F Ҷu&&[YKCH-Vlޒ]u +m̉ +À\c]8W#k60}8go0#X[oZ|-Q[~X"bѹG݈/hYiO-~>bl Ғ7j;Ay=ָΕr@\38չV$~+麬WF AuOe#8ʣuSm6? r㈩+_a=?hmP1b:I69>8tBzYzWW*ĕTA߼wS ~YPȔݹkKLYQP@A>TV˸5*N +-{eV4b>ڸe-8_ Y\{ +SN{?Ʋ? I_;'U"!gevA}Gt;ŠhУBʝݞ -nމG ,zx#JnKoA-Frhd;`N4_T , g|~w AYW 8OW T9빉٤zIxE9 w-mkFEZ=zm-OsSb9GV_ YKh)>!gMx9cIlĪ)_8cV`mh"芄z=iyw$*g}I|c:{{t ;>,( %|Dŧ`SzMn{[TC);v#<&&KpKX)cǛhM_/2< ~[kRrXK}ID۟b̈? 댌DHSD},\%'\xj쿑Cu9m)gZ; A^lHN- #n2\ÆG:*#Q9e4[U Fx{zMA,PM@#H5-9!K)%Th$[ɦIoٗS I +(CX:a**ޅa@"MRg5נ6?.\b؁+4VCƾT *EK3@qX#GP G6K7=- +\JcDXO+cj@j}V\+,>e6DE՚yFpot +S2䅔R&*7Zvb%4%+'lQ∧/C *&Q+JDh$V2әfO(jO #İb3`W?l^Qx _-R\oAo΢ yTST)-6q"S=7BJf[0s.Hі8$a"uV0tV3)s/u> +¾A!0, I*UH uoGOiWCm0On 5-1LtǓ"fb8s<'W4f' +UsYq-pp1O@z8jgĴ'-P f)W3*糇JDQ#OD HKQgىC*ڪ^~G)3b*\b399TU"JnGjȷu:{+v-30͑0\`{mŸ+֟xWg9:;JAYI,'Ωoeyg8 +5Ȁ?kW=(i,AzJDkW!(dȕN{GR|4ğM - XOj+  H2Nz.ٮ+oSKh/`hƣ+>(82kk1\:L̆ +EOM] +oY8(M:( Ab]iFDT%GyW4Z> &?8c&06 =}#}x:yڠ3 +%еcQVG:W$:N}qPS̎jЯ\󡈻c[j!Ngoҕ/$xL(Mu/*Kt/0ſZ}jPWt :T\9Xd^ԵqVH(rDOmHkГQrw `|"(W5f]a}9Ƴi +tiGWlPձS0J;2kQ)fbO()r˷@6W^؈oe uH.аΠ@b!dZBZsaۋl*6sH)omdMe;ku[wiO.Y>AD0tY ;~|c}9zr3^#$ U1wG $c73'޿o IJL8~8sypM7]ЌMtvW 9$ B{)I.ft+~:Qr M~JuP{~P;߱T[Bz8",T> ({xǜOwpm_F]1De1%/ I'kKӇÌOZP199^(NS:,HgA4|_ Xވh^#F<R::[$D^=;Zb[g_$B#z)[g <#Iˌi{_A-ysNoJKz%81E?}q',J*Σ Zx@Fko=LAW.]աE9WLO} $:K dscv܃>AhG+R;jk*2o$WZS඗ϥ)IB,::+@^iGӤ: 5 =)$(U{e4&n \0_' R>/dċH+0šV0Waĝa1 ¡K^]a'=XuxEO n(E+E^J1,„h|rg)i OJ;r`Tz*&.a2|/6S֡=l97dԞ=' !ӰT ~h3V!L$EЎy;ؾ@ ɮ6nbtG%wo#}jV@oƕ.^[GDS^>:j0ܝ{$*Nx)CV BI߀liMMin b%#<'Z߁S@Ÿwm~@> A}{6~C^_Njq=5cΥ(s@ ̹u(]\l%LY2 +l鴖]:tВM>nwD !Y RAwK׍V$`@ "*WxBԻ+H}֧<FzI.SG@FiKnۼ$ambH#e9zKTbk7ZGf@BEYvītb]hX7kPOlT#XwiePḞ6R#vl_ W/r<,43䪜'o>%BV{cBQNN F$[d.nA ü&²K *=]ΓT$c9^ʙ3z%>Z.uI0kN7ap,H?T>Q $6lU>bpH9c#jnᕑ" ۈlo#m)MxR_3O]W9Mofg+ srQDT>e8&1C섀M]rrvT.IY$2qyD(S|/KoŚ+D7_m^ *nB;~Kżw$Ĩ-bewb'A}vxc&68XMAmGi4dN2Yc: +Ϟb +^#*l$lQfԤbGC9!۬ϔ sQT_iVq]ml>Zm;=jҿjԡw^1M?q$_)ޟ~![I$7ESX{1=EljR߁Q})J5r|e9գemDzo?V7]\mre +GeT*r%TK j +(_o"?eʶm_g q*W.Έ\ Qz:J&T_\{r"DvHGV.ZhbAY +pI@F{|n-*N_xn{^m0x[+2եEg\ޑi6 x7>UAW JaXS,w X7ijef'ZY>NQ]##_{ϷV~D%g%Ng vY9# CQwۗYJ5ZHk߼Iig"RO ,SGr +Xi~˘!CrbwEE"p}'cvsl .{9HR;[^ckpQ߉Va[%Q,Iie7;R_}zwnq@>Ri>uHN=?k~kBH⡂B0qo*t3Wj@^3-1zEōiZd~ z0Qw#D4m\aޯu!MB&TS }>aDĥԄJ˻JFpqt[͝3/v'\F ])O;+;eň9rI$(Urt>LO6+>Ro`[\\!kr&,!S~fx`0ЕMY!䪕2j3U`oWT=&5JT(J~f[p,;1I(! Bˑ,:SNM}/C"Iii4B\88F+Z +A_Q*絥HˑiIJ^W fΓY~p<$U# ̙&@'T̋GP֋rs.!rPs"xs!n>l| 2)7?+}A: +P W(9fr]4HwGiT9 SgK8ʓ-sPlS:W9k>"A>n'}l9ai! HZW887ȗmBi?c *;U'5pV&A[C(Q-eDꎳڜ Ȕ⌸Ulj*ZكS08;+_GȐJ #8~&)rN1pːpz5dr.up2kP j}.ŷRǙ1@a^6$+l:{-q+-fv"ŎM7OoC +),EXwǪu֤#.#ƱDrz8A0+9Yew*.J5g-+ hrO0#BOFIk?vh"(G5/#%D4CV{x!Mr;I..+q[/`Uj]_sҼ-i>hfUf[~и1#+,iDSPkRjuS&0l'ߔ`:(PצI%Ę\IFwd9p AaId7Q 7F=b_ҷ&= }]c6->e ̨ݛ]A +tUܿϨ)rR+ԛŒ#A$4#1~~ dAIFDgrQ3 "g'&f7@;M_?,_Q8zaM6fuJړ *"H4B! +۪6#~q֋\uUآ]ލAJp(2QU/F~Z`߰0]*#$C]tH;%Tq;+!ǖz,.#X~6]&zW}+~if-I?fC!UG`O⍦ZM/Be='^~[ː@Q:ƖfTKR8즠0/FL<8 AFRߣ&,cYC2@׉ވ%Pevrto9FS*R'ĨfݐaZxIgEMgCpR'"׬Jbj5J#sD BmyhE r66_~U.i@Lp/W.^oD[[|Эa[ fx;XWz͸rV;_LE.c;!A28ļy-j87z2|R_ŗփEryfKPi{k.YF_ 54K 9XӠm>:u6D{d8JL mYim=†Ci}Jt>B:MXk$XyfLłHȲmy$x֧KAAuX}pb +X[/'~S@~KGɄM zz&  éESgJ AF o Yk!W:)y)`&t`kQqQì-ZN` >  MI +UhB!P)PKz7?l-%c릐8Ɖi=7m qĠ5}.ͮ(@ +F&.T20,u+CT k@Ẕa/9ћ& {dtzP5gW>=*gPQ圼p5yR(gĉG:V߀& 9YfaaE~@ +_Q"SG"}>&fiLʹ'VvMnÁ[01+uuD&K){pzk a5QW1) ?4ؽd3YKvv*p߰AIwC@ m騒E +!A6t۱(D{o@wPwߎ4~ke#,^?Ud Wo +yQ4rLA8cXNC srOFo7NUW,D[;-LS, fAO*(xcYѰv΀uch(|J yՠ3O;Z4ݓ ~_#MYP=JB! +i=۷?gxM&~HQ/gaޢX`kYdTBCt +ŎdD>?BWS#Zccv鉊nW*@M+>9i&Tzmft4YO)N)E#0,*?]j4BSl_Z;<߿ouԑ^ԑ] 'nZS:=WoZd'ߏD=zTH7` 5-AU3UMA[`w[aT +dap晝5X=T'v|)zʊB +<4Z:ٯCISFcyˡ bD1WxEMutjk)5q5<9'h:SOŏK4K{~tם0.J3G[ Xoʥ脢1慯؏·iOAW-zIi`m۾7aD&7̔u);# m];i% 6EIߡ[W4Os;{ӭ&"lD4烮?jyKEiScאuу֊ .brA2nm;fmkATٹӕcoYP5?Q2MMX)# 5Lh*npZ<-Vb*m wfuxGf0\8BL{t/1籥c'bj_QJ-B2m5fQ2C^`V[QG 4gSpڊ0Ƭ&57Xk9Hi>DNM"c" *'Iǭ<^V eP*}33p7l fZWYE#J.0$#M?9]'"X#xHK/,mz((NK1]ޤGl3bNwȎ.]bE0Xq ֣߱rLPzp:*uu6W:_kt̚`?;<$z(zlnq lxj&63PZYTCO᢭ !~}⚿JHOآWt\ڟ)q+'ZwL(~|ۊ0gED'+IV|cE3˃gfYƞ[YDqCR踟ޜWׯyV{MN~ǿcBK\_ok+fx0@Y/62dxVx L>;ML"uZ"ձNcg\cS_?9\l-՝37:} Z5zat6Rohcdig#߁%o DةE[;2hXDYaDےs^P,8~v"^vc|*"q7 &D@ϯ}XP݋-FYg'!Y5}dLd܃yLX#hw#׋kJAuFjAQzlmK #"@9~ݙ`qɻK좶ф~k/w!dl:K#B}Yg^Ӗ}DSO 4 ' 1 ^~e澳XKZZ$=^kTkvt1<ОJeO0N  됻2uq}$zQ^=l |y|TZoUr{^I24aG,0N/;!Dt}6ydl!L}H#*+xNȻ~:~8 +oɗ/ԏ+vGT5T^=DoAgEP,V]*Eeˣ W-S9Nh CCc'*G_lӶD4(Lg 1~G>pSI'-+r?eFupGECYUd̸m9!2T*GdI eVCx0X%/RLWA{莫9 j`g*o;&ΐ$h~4#KIvl>Ԫ6/"3n-X=ҿp $3YX#SI%L" +0 >fCkР<Bud kV^;Q`8^;%[{`GUba;%vI$5odY;|aho)*(k:`ۥ(&sR1FX?kFuڰZ ęVCC5Q ^CqVUCkT؟|O4x1 -hwKϽ5>I0C)+ek1נ%+}D9/pŞa>]Z{*ܘDF+%R=F.}h$&lKAEP-gu=JEzDMf҃i?C4nOa\*GeI{=9s۷E~ 2CU+>wh+ۼ#_n6=FA=wr92(@cz3g*Ge$阞ABf\E35R1co=驵 OS{fHv{>y'?CisP3"okVfFR3Bc72$iaL9S& +#k|M/4:FB0;bRFC9\gQ& kJ̌x:5+^|9"ssMJf̌8Zw$KV֐:w#H Є;O@:XWC*x:D"6[##X.[ *;˜;R3U:גq$kSԤ 3ϺJ-[29~(ͦlwr%]m.N7}r1i`M*\JsG>|kz: DD/k$ou6ן[{Tjq֥i.{7$ ,)\o4AW%>JV>.Uy7ݯ/$ռJme\FbwI S(eǫ3CDBХZ9i( +bfѣeC@͟X(Hk;*=֞6"[boqr9'dBY{_ sdNH(bG}< E+=R+qZC MR7;2טu.葽$h$:6:V/x7+͘Hʩl↶D~q7E(@Y%=vEG:ԿGm"J$>w\ I{I"tSq!cڨ} :zB[kB+D*b%BJϓi ["#D}T9fN4ġmM-)T^TQbٷMjt9|@י_}?_P)l[kVteÇįgDeubQ[z{.\wjwGp,LHwqK=#*>w9X=g"#<~sD|LkPŶٸuVL$#ĜV0rR>)Csd y4\NJ>Wz 9Q OT⺒I5@nJ9d$W&g|Ǖn3o7QUۻGQtIZ֒ywU4ߠ̆]٨@TIWZÎj+ c +}=s) (b "3hCGSYL*_ +P,Ni<[fG Ls3:#WtCs +!1ATA)~- ~=b|Ѓ6S~ V:- c"+Іcl=|+KZL}QNpı6ƑFĚA'㞫9x /+`,~@cvZ۳V JlĴfҬ}Ji,ɺ™#L4KLX[S4&G@4xYFf/+tLj۟YZ ./$8?gȽ1A +L2.= +/mՑ`M` gkt]'ʌ@dx[< #" `oO ZK~'$yPd F ~3KS +[OΉ=Ao|hCg~ӊUu4mI"ې:Q䈴PAFbRD|Gɴ;rڭOrD=2#2jXT]hE\?#oHH>cgZƩ`XًzGI2JO᭣adHvjzDn)ψ&Ne }lQgI. { |}9i<`aLV^vG[XU Bs;/‰ !Y3Qp@ĕRjqT!XB FԆy=RzubSn]GXR:nЕN5;īdtpEx6B1Z-;5~15~L[(WXWjr˜Cz2%$*Ӕ~R*Q.~#%B&\pCcRϴ$jbW<=kY`3%Fȳ>f{vybH:;,'i&7EPc#|-U+n;-)A9; +M f֨OF'%u>.t Xw] +↾^/ +B`)9pid+[."Ǵh;eV%U34ݠkS,$i܅DjFC<ӿH  NH5ѢryRr{txV>f tz2I{#vq?[X!*Ӫ4=@C ȭ tzd.GfMqE\4#=.J#rz!QA|=-y:c'‡4+ ]F![~'. >hW Ddw#:76|Ct+-2w@~%jmuxgN.}Yu7gbjs(uyZm_Y+udhQ튁*ŒUcHWZ:<ϯڟͣwu)UkR`T8K:Gj%o :xQx/W=eh|mO|$(HG' ]լw~13UEem5=Q -wUSlhI՝|#ݹAX2$߁!n`<: 9"`Wny4_`86]lJ"{{Ezz +\E֌] +G΀X401qFFeJsT]_(Ӄ5P!`ΨFIx}utWCǣ܅^(}d`DUڏn -*) WfwŌp,U ֩"4%= +ﺔ%k*-pe6voDfDwd*yD6+a.E bmӻp:pp{Q˛dǁDWAj{Πuቤc(?wxrw+1a<|E+FoC#ypz1g&^>9Jk>aѽw{~ĝu[,p8%hXKޢ5"mtqԶ8ĈB +q*5:6 +t7„ FͨZi" ["LĚJmuEգp<TĨ:wX[ʐ^\COUQۡ?汘HmHt#3s=zځW̃u +BZ׆NFljڴPS$^ȧ,uJ#?*<O2r%#Xguz;(Iըq JXW9[ΈfY~ ]Q`k ,N[N e(:0f*"%_\=/ O+i'l[I.XfMX'Ia]ٟsɬ?Qh&Rrg_yFoqIFBL'>^8f~G_S@+L2@` $yK! B⎠42m(x_S&!LMwe +VF#Ie)Ӛ"^ @)oﰉ:߭h1a II >U)hx\2GO`ErF0hrT)o^/,pKљP=sgYMwb/sjnhɊ').n + > Q]2b֖!#i6,HMsWޝbQ +yh +;v:M ߯eSQ>JoSy8pϔZ x4j|Ki|&R^C߼ZVGiQ'=ߝ,ИLʬ`p\S4TO#$x޸iqv 6*`um6YX O!IiD=hAC; ;k!o" +~C(1- I5猩d.ޟ'Cf"3ol[m 6K7%֤8.;eؿlԿ|%Ut +Kd 8$/n[ŏqV~F~3S + x+G"fzD-,Ҫb$S%B/] 8~ҥcѱZ as *%=3_Gt߮'‡` V"VYZUeR CcǽMs$b\s\(w5" w/T؞X΍GQO~,/kBEaw>|Jʈ$"e^VzPV?#,nxTA8RT"nLQAb3!W}AMBJm 3kF|E5JPL?nSshxLmB +nr^E+ߑOrA:Ph?y*"Ex}N2_~7 +<:qƀޭ;]2Ebf 6qӸU:`5(I@~h* %d}o_ n}=7_q]udNՊ1dFR ` %w m]Ny72E 2m@_/,gz3d3ѱT5.o%;?sl +A,0m2) np7ps&q./bo<_wTvG~Q'ݐ5-kPQ+%z5 `d/{a|&YNٓ^KQK=)GT=9c"\y8T\*x^OQ&qi^gXӹ,&[+"PJGmєc׭ipFӭ^*BQF:e +<X#` ե7=(,;J2HӠ%hx tR,~W_|_+LwSK|-UH'p+)iI*p _!Ih +Jg_gaU,&'ę3e/PjߓC*_'\֦-ݻFz… /'_%K<_qydt>K5F +Fv6IR W 1Fk()J> {'H"$$ڝa>`z"T#"N|k6ք.F&>pzy1p!Α&Qod=iYC:Z ։!ܡ*_Ep~sz+;6GOtkFx΃@}"/yPCheSnA/l,Zx~ԓ!& Bb&`oLXfTD 0?is(#eY L4K; 7 +:xwj 1&BvX K*ĞqIshY$rpo_73h'2F"G Kr Ӕ>Yvz[`jݚUdgȑPI@I\Ƃ14^^2Z9ܡ]rs:ŕu2AJPlZ nU͙s+ זH:>^OOl,Zpi-r'|pCF2)wqRώRPBG3zw|yX*LqEi&67F.WzCyOF5pY4rה!ZbQ:O׸L^X,hLgy1kT$\PL] !QU9eJ@P?3! ۛƵ5\H 9?.lTq3vO)>3dMz*Bhy3M8?SssݚC(Cʹ’nw@r&GyiQbWL 31;Aڕ8Cn \"1뙴$ԧE;=T$*x;oj B*p]t\'}[BT !կєIcu(K!CӴgd7R`K3P&3\J h3Nt^ +{Q9twݬdܚܢ踲pSC_5r>wRك'EYw S?QHYaw4IZ$q]=0u e(fh]/7gijQ^ojlOh>{ "1 +`8U6CY8#xJjl|{siًfwxjaؑʗ(I'ܹ *"mwM.GǘuEnp7o>Pp]۵'1;IO{G?5Hjx@^!gwb\pt`#Rp]yR*EDH/'IGqcK6F瓧!p+ܷfH +*PYg5GN%Jh׺UOn@6kP4SX͍&h+P} ҳ9/]oi͠tDȹd 3hŠl\ hx(e1d)BeD${BC!㑢XR*ѓGcK|ol4wuy(H$pjG9dOްBV^uʓQo9a=@>JrD2q~20/Kzgw;`r]N{[ >%M˒蜜s82 q<`=DM&v6tfK.+H\Nvϐ歈-3"L# Ϡ.;ԑ A 1Wo5Z;<#?|WPʬ'GG{'O4\JA4}}Ci+Zv"ŠhU`3spS5`נcEŪt.?WUezY|[՜8]ug%C^ -ww7$l-t?i8<7(د_b>([,VO!XJ$dG)^]'9<=2T3 jHfU:*EnE0sA- -Ax=Ցqw Ksbh \NTTlhm'zҍFKH'C+ 呌nvϟW@UZ-)Xa(lKut[4%N e\!kwOh3w}?0GthD7n5 aL ; +iM3z=ަОUag%P KI +&ŠArC"4*чNğ+C /yBbw +ŕgքc;ױ]#KqgL*ϕNHԠXfH#G +HB'6ř[tdH**F͉S5>stream +L}%ב͘3xpU?^S GfyW07tT*pξRv5R+;rj)F@ 9EAڋ8l@EEY˘HLqiF6A=_XV_՟=H}MyzNv!R7@OAܶ=uzU5$! gCtu'c Tr8ĵ0g7xA`lƿAE"Gf%uϥfkrCO>|)wҜՐ?68 +Ul܊'QvI) ~pf<>^Czs`uoW^M(F M?_gvz.WkV^J[5\U[`]CN;XiROŗ .ZskK%L +V8| (TN+e"d_B<7$D[.lyO^/sU*(8Xǔs`tQEL ioQlMRHߙ5d{AѬҋ5u?oIE$~ YL?8-w6 8dOI(ea)N\#rŎ%M^IyT;TJWBi&bO~=lAB5jU0G֤:~PJhZ컣\F`bp|M^ %3^noL<6B>yD9Y{dd6-.͇Ws{Z7jEl_b 1T^k]*8~Dz a 3ٸ&'$IaD!k`wN2Hl 31:tY koGtYmq5Ѹ-ѡ(9>9Z?8~8J?ce=;SRۻOK ڏv֓C">\hQ YK aYlkéA0k[nL1Y4=p("?V#L%f+JxPh_uּ~wSi{F +gnmaE:4 (Z~kY*9u.7S`KGOF# g߅0Z%Xyiiw] z F)/1δ!`6r r(TkZAز[}S˥W9FVI٥x+;[wO}w&>ސ] Gqmh;xKhM7q% 4?YJoADU +McE{vJ,R*YC3h[o^U@Ӽwn,0e\3͞#C.rvuDay9q04W.[Tni\]q(JDŽ3*lyzBOP<$;x`DXCEIf!iCF*WmLQ\a| +C+a*v29kpGQPT`"iBFɇ r~Nͭv^ۺ\ +eLIObʷn쁡hJU?^Zj"A@"$0F[<-zROlJO ϧdC 6`8'A8 +TiH"e3Ko +0U30clҋC.繴s'}9(et~m8h%%G:hlgSBw,YCF)AӞ8MլđFХ;dΛBW΀4 +, }~P#qDut(*Ki-?R%3ueBbNw$=ݍ +VRBuU NAl B~hRae2]?(`*!T + :&OIiwU@KʹЯV΅9>'쇂nE&q76MD0EeJ6 +S;m ]|6]M?|KNc[5Z*je w=اjpL2B +?bIH*qU{o@WP:P8ѱp"I1583Dd N-k + +6tuKaGUJTpt(&;n СyLNdmrܙDy(a{=yE9 na` X2>Ys˂.Z5TL7t!5֐HҜoF.8tpA-#~hHt$4} -Ĝ{C9* =#]9S: ]2hwe}z"`4N0'jcI%UtPۆ(iè'\!JDgN3pB:)ںG[f zoP9^Jc4|Fz`Z*ټ"T9Ŵx#jЌUrB:j2; +-lX{Gurfw z>Y%9H?1SG F_J AY4c-ߣFʶ)瑼쁉iמb^1c?9;,xyIE/H~@s[9("EI[g(-9~iLf~C͙{E?Ұ rm?M K:mitmjxU4f{;Vۮk/ƦhvqJ\&k- c$zc2C#7Zȣ(m +gG&['Jo +m sBx&5446b;6:ig~%)l<z_y}>Tb})4't{f-gRdEUp涊Ӿwl-솃EC\L $fAp.Wr}DƷ- 6}}IUw=68AT_A?QmO\8k3!_Hqآ-_k|O0#fc/2C:1B3R&±KFʅ1d*Qٸ:I +S M3 e AP] +]p3wkN*,ci9c~w a 0m)a'Iᕒ[%G"PwOVL" 41>v9"Ɛ\̱[=$kȐ"y+Җll Yb|穞zw6"}V=6pR#>ө+EH-Y|Np?ӟͬuAB +NzW1$?5 +îs,0ϣl}/V}li'$i&`gq\00iʃJH&cs7I5ʫ"[WH84^2L}FOA}@e"W9}GͿ:mr +y xSyd2m!6i'X:p@=2ȻuX +Q7h)=S J2M93_Ú*X9?@ok\)]Au+&X\(2| Zc6ͅOfy5 +GtdLK%NT"#[K=50eOTƙ"%1c ) +WCҖbXe&KW %=pOٯ- ?aTmSb>g䱛Onk)h;d(I$1";!wef c/3>2F7XGuC9CxG Uߘ& ىd57`9A8MO +/:"H3,GzcR1W_aǝL'A:03I⻥BAjiAO9ran%EX2gd+j >!u[΀/B9A5ۘW8ji(cS/aV<#F|Ie"l%\v-񄃶PY= ЕNCI +.N;𔰹Vņ St`t؉߫Tj!Pd8` "G1WLx qC2nkQK~ -kr՛l@C*0 p +u=e/)Bl$\wħ4@GzG/k#I|G Cm{aDo)2p²;AVji3>Tr*m]!\yu𤊠F%4„3QX6QѦ#oh25mn~@+dZl"Ɣh}~9 U ^;_Ql-Yᆿt%u8j YNH,U/4OH9|A[ %GI[!R44W59#J- 5Vgj(K$MzJtt=x+W! +oda\'D.ڃ<Yڍ[yIwkcҀzșEͯQ6 Ȋ S |OœkAl:;c"Sc O2$;8fg@%NB< ;JFD#dM!HBߏsvӣa s)F$3jdP_N\=Z-y7O3CXcB(;A9RAS?-܃ХSr)0aùBs Oaf3r^-ߢ<#"J |nR]w=˫Fz01b^*C<)>jZq"@ JlֹLxui kb,sI<\ ^Nc `̃!=#30fIuM.5AgJ Î B7Nhy%c5ď970QV^Ղ᯵[^FFBt hg#btD]6f.ܘv-׭ xO +q~G}ԐH`//@QmSzWgcr'v, 9O3g;ߙw =8G0^v/jṂ fmR혀:,Hk^@èwŷzYWNIgqI,+r@۵vO U-C)5S+I;_tfr0]Jtٓ{/z>r^={pL)e~d#ղz:̓7{y-XXCE~8٭`YnEGwU`,v=a@n费l/qNy8ZM~`k_(ZmTh{H +29YM/?bp “SӘCG7Ÿ] OI)2=;GFTd(ى9 +ʠ>;{g 0eȆ*w^UsAjA8Z}!4i`tynl_C"#86Y7yDo懶OX3?qk)eB +S8JjYx EG>ZPBpdC3,bC"`OCΉՐE; wkD'#S7Ч| pi$|3A`ec~pt3Ht^%츓 %2oЏ7>/Qd Ol_ix7̓tC)mt.|{8>.4U0--ޅd /Q,T.,Z !:wW.iQWZG{0DK($jnAyk#=.O 2nJT/CNmT 7 7z5+8|:yLIOG܂m&qolu}tOq0?B  CH]^#J(dE+wD @dTEf6?'F$;'QW ~3NcՔ+1{D#ƌtݔ]bD]JIBfu5,VwWdQ@4!QhmV`X\W" ӹ:(uz:%z<=\Xݞe`2{O؂6N`(~G[ LcggZIHBzޑ|d47d9U'?ؚHQѝfK]=Tf};|;Ba 0ja z o?_48;*>>*yo!KgYQ{Wiu` bͩD Cxk|/*yW#R6@qI |i HP^yD*̭/)t0;gdqk*A1{#k^rDV;<ABS ;cp'-F>%ӆSߏ`cGWz;)adꁯAĊo.ህ LKj_ߘo>1de?N/9SF#%3.=ݕnN#-ڢAǙi@PÞq E j92BX#.q,6yϐ't"E)' Aصk9uxħk_@hy&}+!HTE +{͵P>: ٹ1-p"L2_?7荝jK|?U9i~ty:sHĮt!Gșp TwrVûndx@rg9=accgA]ii睮FqAd +`3߅8]&Hc>PGό`-1du*ކnRːM_.̙x]QpԐb6c2^>\>o}7cK0 풺BB0gso+gF3Kޒ#cَCg֦uX8'#8|QүUW)j;#LJ'/ҞvQ܊s^v& +tC@fUs\L$lΓ2M{lvCvJgN*X]FDb<'D3A{nz`5n=97`AaHEDX0FF.4[Q``#7(ww<jbSG10.f1*dU~?-^`1n2;x}bݣs>{_pʲ٧"'s@&|H)";]p8j>j#~ =s^ޟ"q zr( r[ѻT]{Y Wv = +7qv˯żG,fjIvlrQgr=|(\eDz\!^ Յm/PW+wЍ-6jWHEE_őGzEvy" iA%[u읡ѷ:w'p7!VS}|}S^zieƞׯbm9-W1XFlPƈ{s ."dB;b/:Dc/LJ34TŗF! ouPZ͜eF9{HlQCvp-ĿjC0Le! lpKHf=׉e *QǀfgʋW~v>iSrm.h :GwIy4ErŮ>+ZoQ1H {>A#aua9A6Av_^֭FW퉤,2$ʓ.g:+a#VLcK{4^ȱ@KN]@Ѐ$9K8kx}l(GlFϟ^GAނ!PX[K61WO`SbL+:Ղqmިw33gW֓K|g3{3ef.Iiɽδ[zf2ҝ{M4Z A%rd{XAfn?r8cl*{ B)Ue(+V>% w OLSW1Qc1%Bz=zŘl@LKAmPகZ=X] a.+hm߯T -RV#T0h9ī!*0f p ֨5h.1Muu>ۜO.<{94H#sD&VC>CZRo :*ftDx3>+mlx:txi7ǐW8WѾaA79;%1~wko׈!l/˯)g.^ KARaW/O`~;iJWU(k䑲Uj{]zDzz}K)sobA KtUzP +cPHcWPȳ.%J#nI`#61 j[="`pl#]Fb+jΆ6-ň#'%OUNhbDܣMF +ȣ >F2Id 25lyԹ0حdUbE= +hf?>wnEPX|4qk`^k^Y5OΧ"STr'7,O%C:]׆ZduE>~R38G?C?siM{5Ǻ ew B7ˠ N,Р&mk|CW/TJud{GhM< WbHIf2Xk?,׋nU'j 7^X4h@ 3=klUQKQardk0Vߊ|ƺFFМb S r7]sYz&5)oHd{+٫jkݑun<{mmTm_^)0d2./q2Pi 6JE)GuKŸ%f0YTn;_~+邅?BNZSfԿ3$J̪;TwH/Ϝ1f1l4 YιvD*|0uC3zh~q jt52@HWI?vz('19amȑY"(#ع Hc ;Dm4$Qb no:"ZvTvvhБL| M$zJ'{/_0MxO AA752S,c+-PGT/ +xac-Ank"De#GDxk㘎z%:=-Į#3+32H@;?)cTFݦ 8LY$j-A(/vS_IiA)ƀ?]`c5wآBKvgȐ-[BN+k#48:W<i$EŔUv3SΝD+[)+x6W ogPD92,qľ-rX@I0ɨmm.l9H0?cEh8$*#ɔJu5<!d׺]Ȕo +ET :5*YA_s(Faj3@TxyNA? R ڢ ?c~m 1+:"+ )#w#*s}#eR R~w;D(8JS[''ˇ;:t=JIjg’o!@<1~*I:q17܃f]XG6e* +ƳxXQ[_ߛ sF:d,ͨG[4yF7&!xHa:ZCё5Lc#ѡIyJ?*nq~0(<CA7G|P[\L|GO2/*uy]Gxf|KxJ ࣝ~ 2~(wP +mFۉAˆΐyE,-A B~v\D9[>e^dw޽;W8_*pPB^gT婶W5CľbϨ![@^aDh,w ̀yn$}%uKnu +(QCBlF%\g fd7)Gm6*5=_G^io[}cJĞa KP[L]FaE(  c\1 2N ¥`GQr.`>=:NkԙZЌ.͜|'W!>nC +3zp=x֭,=d1ǹ`#v'%diq: w/Yτ!6W#ZԼ*#>vG|G y?\S(#h-ЧZ`:ܼu$n /JS(CGCƥT#[ Drn ǎB^M%- ^]X!/ %`B1 B-ď{^b<2#*ߘ|*8*3j8EDlp驐 d'a'Oă'fҭ2(B R&9dk&#z[J]kWGVd"Q!(4)cA4O4?S*"x莪y8kZ萇!x!rԟ.6$oYj~wԊZ8*L7#ʃ#F- !V*McoS%F*ʂz`KOzG|s#L!]=/NkS1I`*=o19CĹRKcuP\}hh7`3ͨy$V>Ww7(pҋVd?Ug۴wإV we-MR9>\6+}]ۋ-Cd F j4IйyRxk>I H:˚,ҫ|O]L(:c~2$-p fa+P>*h'yUrn$]#̟D5gI1 %ӫwDR:꨷ B #!S)dp}=p|S[=SVXK ;;o~)쿩]gVjAMaUA@w+3v:T8SP%9Quv9ߕ=irxH^rdnPf6daR}e5N!_-a rTU@wNFmHvrc *[󷆜iHJw+SUSS5}}`)_~ux:5}~U42"qj론9>3רTwpӏzz&4^tDkXUg,[Ҍ!uBn9 #84ُFN:\_O?~PQVepsޗ-fҶ=*?7ad+4Yڡܑ]{n{b9 !Ɋө?u0o[C.~#ZeBjXe2 \f)=ø>*Z<} ϵ k@wRڣ׻GuԺ:slͬ\L3X4펵ʏh^VYםGS3T h(IO' )_N䔥7e[N#z\_>?hyq׆\GLt+a)N>?#Ԡvj ZyٟA<2k9NG {+q*u'dE0׈DZK砊rW(ڣ%AaASkQfcٳg53j* lQfI4!`U԰آuS*jsf|􌷔o#.U)buP 6D9| Mfbɉ%_eSk8,8Μc{@ʜHiʨ%'0+}F +abD5->8$P#Ռˡ5Vc AΠ݋́5Eq:aI;#1K#+&گ +(\!MiH $V`+u!WU<Izk>fFL!`6jcÍz\Q[aDDDqrZA5 ] ڮhn]v +J3({!W? ضhd@(]n@y+FE |.^QE.=$l{tn]Ȱ%Zj(pqomzj~2Y0ҾR">ʉ'3̨R5ȸHq^gy23tݝ90G`[ScA8)2D,2W9(BM x?^Ctȭa@p^#*sPG_dGm0xx5}NמiEѸ2sf%Q_ϐ;hfxLNq^y.u+b#'*'%"oD z.""W߬Yuw/Dz+iTosw9!k:{q=N=6Kľ: (#|9)W_aU453Щ}dw%P@=Wc3Ĝ&\Jp z4͵nJb2AR>^y"Vg%~!5,iGМ嚁6,V0{,8\b< 5@C>62CJf at&?CBJ\aO9],M'@ș\ CWWWIJZ8Oi0$\Bɱ)t$I|UXɶ,Bͭv w f.Ʃ "c'@;;Tހ0#(빡!ŬX.7[{#k-MYӐ0nq~&I"tf,4{Sd=HTF[.CCȳa1FerqgzN/?8 .?CQ=ln0ο+ +¹xsDoAa ;H}RqƝ|D:"=dH϶͉fdӋd]h"r/t9>dO4y\礘SVUgCєq]rXg!تh&AH |E*QO}p<+|'zxoXSP'Rϖvb\r? LjH+g<3 +&:,y! +Cpgla8 }k0j*U0~7YM g)C<2TU#d.DNzp>ump:ե3w%=SOl m܊Bu*ͩ` R^R`\`Aܼ[v7S)>z#gYɿƷW>&И:b}/qRzN Jf8KazF4^C4CZ>?r=q޶#ރLŦɐyA>2K+X߀ʇH]tFlڔ7NSXIԷ%lSAxdtm0𰖀ߪ;7}1b2p_ *BȆpSv5:͌'ITʵt/Z w5cXR4Y8gx+y{ lE'Ս`#`Ё*6#R7x?^LU3^z Dٍ=bRGw7oE=Ҹ<1\4]y`$NMg*ǽ#4d_,;w/C?d"-R䟷,T 4Oh ^H9?>]7* +fsHW~?y&b`Ak}XyGT2C׉I+<StGcomr$U8Z,͘L ZKlz^rB5?kvAf)bWd-댙qf39-٘Ο\?5NInr0||gF`B4>gJD|3_}{) U8<)^謟DHjtϘkAZz>UdkHk5θk1u*e3rU`[3Ub0JE7qhd>;m_Vo^ɜ^-bWL'Ul61$=lZsC{HJ-KqJ@s\g=<#Nah<15]\Cs=J "xVOٙQ{省:і-ֹĆ>P"E w,)'qSf8-lb2Fnkfb +q2DCio|M3HH1?1T0M'rj/i 0Gih+dxV.4 C>~\V>ą1t}t's Ww ̌Mo:PEF3} 3KPŭozЩi}6:l65zoog$1r͹M e_Ytu[^0P +k 3##=^;`o~y{Ѳs5m? ;7_FYe4V 8T͟}?q©K1pWr*I9ȘhOBL4)*GRQz>Q*kNh陆w!*\{8~9`*mbznDe@^+kk;{7xEG=+ +n#`wtvԐM&2ɷ>~ 4BUNalUGLs %}!ϻO4.DIX"Ҭu2ԫ:&BpA-_ "._yꐍ uVE-CtȸۀOWEҢ`]PX +1{@Q>Ye,?t;Cʏ1-t[FUj,s {/6{9񊌎V}fDAYW3ik[o/gI]PH[ҹVzwß)݃zyfQ}7 G*3jssFAgs# +MmέapR\S/' RJ锤W`jp +߷@Rmfa~cw::+~*Dqlqib]$~^' +Q좚E;i{9ȠȳjwG;H/ vsz]ήgRGxö`̡Fބ<Cq{=l vq5+U%%X̹^-TWoU`zCGL0)tWԧ +N 2ANhyióx9hC +.ݿ(ZwgulJ huEg%U7vNn#,-zmfH zv@L{dK <b ٻ~fe^GG'D ߈#nwܼ6"ۊJBvs,(SBTzE?{H R]6}g(I^EnaT#ΫdNuiEˎqn(XƗ~ң/0<"P#6H)MRv{!4x|ynX+]Y c i̙ ҤyP>o!FfvNF4tu O6 +)2ɒp}繱5}3\l +( 6ww$x]T"Gw=U 4 kp-͂Y͌hPBUtMҭ7 +E{~1f;DM#KU{ڿ{ơbPicz[U?v4Xr1-y9"J ?:*)ѐaqL8W(rJ$2^c&,8ڊDoTcp("̒W`~[BHUՕJJ#]ɄvFA; >#m;*+_N#y~;B[3K0be@tj\09\XD9/;%zX\EJa3Q\E9DjSc}s+y#Bsrٌ<;˝`=頻H~3s.ܩks*B-oC %#ߺ[l[a)Pi  + _ + +-6GA/AvƕQwI-9<{0` +ʠgwdij32N@9:ο~1Sʐ&8p+}#z֬S6J@tQ}Nu]mq,kpo[7aMY4 ;_V w QW.pSh|O|Y8U4;G4v{LH<1@ +./ì8x,5o["24^Fv @+֘MfAM_{SCryFFI~s̕7cpE͏\Fҡ _*Ъ;|θ -Fĕ '++4Nkpf<}2w>_rҭ&YO|$ eT;&kATZ|888 + k6#)r46Zlc¼f?4i&H.ə/LPnQyqGt_Q_>"}hh;u"8;pR  dM C!c71nG[2POF-Ck0yO# '܆)Aj_D9 E,y~Sl8\1z[ZW =6aBuIfi%'PU20"  (H׶dCF֍-` Ao (b^p$gN@ ԱXB|}`,Q/!+TuF4sT(QmV?9vhXoʌiR +U/$:f^f +pyRf2s<ܡ4<UPaU|,KŒ*LDqsRY{,lvde1' ƞPqS,CTO sX(vD3R,:4E[|T=k!(;\'>YPJmB>{)˖~.2n/# >(rĄk!=db#NX4nv!/lQ^˹%]\5U wa4ŞܪۢE vV 6b.Ȃm++"??"[ݣÊT-UtKqmA׸I[ @xXD?$gCҖ PԃYr=TJ`Or+8BY2A\$Zo:M7N='*'X{9ZWYc#ia >:%uzJ葉æOVj8_`zQi: ^~Isn4^ RJKa{la &ܼhQK3{ַ5B֖$:vEddmwmqu_;`wU/=(V8yp=k~Üp/P +%+Aܚ?µ'[YJtjQ)D# P鐔[D1ruCVJWע@XrVWJM;EwDn`/y>g\%Q\ $θnIm2빯D`<(ٴ/YR +"]F%68_45bD_i-4 * S6hzZAs%Sj6t0Kl; ?˜C.C5:>>2/ ̮>uR]!:b3QG&lG2%ꮥI:cJR _ uq[$JSDIU_aQf;}o/TEgK}?b3a8S^U -S|Ɗ0yYՐ@G{tb#C7 MWS+B +"l,\38nk\4|C*:Ǚ}1aSň/pЃhm d+(T ! ۮ"zQlڂ`a0䥧ߊd)x%QMtGRL@PF8ԣzFD/ԣGs#l[$5dV5 9D.JON}ո}q#NUG +/#F~?3B'HL@r3@ $U+ Ճ %@竩m]ez0ʑŀΨT1=u 2f9Pi]EJ?{ܧN1R` ?_$}Őyк Q;jqѝ{CUm\tqZ*r\L v-yȰ[k*$SM0\Ik;#9*f,5^HVefD< +D^Zw֜f7;"poQ1*;CJ|,r c=}0'Vmڢ9ڢ}D@L ɇrA<ۤzCo`h:b+A&sG@AC!* +1T8c^ GdH`RGY#1KJh W1-X{w0qz_]`6`Zg^6'O&Q`ۅEDp10T8cSI,pK`TI4jj9kڂ}4בS=K0&Y9y6gE,YzǵeBPmX+z/5wl3{4w΂H]`D5 +l&CR±Mf gK:\MjQ*gBDvW Xd肍|CS[ԯ ;9geZ) 1A? ZGuΗNWԯA[%!At#ww<:}#K ,=c5_m$Ry+O//?֠!)d&g"ĤjqµxѰn6C+؝,to ǖC:wRC}[^/_eCu+5+ i;Tqh(g>:H_Hyk>6+!O`T]^}b?prA++h@SHi=EGd%0p/Uz*"51a L|oL6*D\6k 7#GUkVRj/M-Ey#2z-3\8e{cD-ki7<Wf *\t{@;s'_x;/w{FI.X voU^DK LݱiM띊.WE:'+v9 r3AF+ۑayB6w ;Nx̏ߖ4cG{E>BĝsAIph 2LO 7S0C\SNJ/;v\%rNDy4'dzE>>8=}@\SaET(\4OyssR"PLY"(@sǫٗToEW$论ҟNKni6 +ٙt6ZB'oXh0\ep |wg.A8C@ 'o~}CeJ#.!/HvEqskw|M E1b؊(zZ@ӯ (Ig؏ͫJcMR!>U2C;g=*̄@w롤tnc晀 9nZ ͨG8_>1UfJ`k* /(c~uO/2 v4#4 +B{&JC 5t|Z9 NtKe:᭡_2B. +М8鑵NH.Y ׹`t"(\Z^e/a$ `繶oyEIc'*`h\pn$gfXd^w>І%#foOnޜ!_SJY8GAQaٜg: +1rEG_ e7TZӨE(J @-b/(Oe9P%c)TmTgzT5wҞTo 9cP|6ROD&k&uf BC qxBp#Q4cM7d;aaOv$n;#UNE*rlqa)cyTWhr]J?{`+Nr33?N ȕ^D4s5lL]:.2ƅP" rrAЪkZgom_Bq4.( Qӥx,m9.]Oz[ IEL{O v C " Rw~ {zp]L0vJ"2!jyӁ`Β +K:#CfxVM0J%'0n8QЙGju9-KNOfG4:V#!KS'>^|>(wuGI0W&7ҢiiK+:NMC[mxwSg\PA[6~4) \mQW(}s*v!Zr bTxm3xجkw3޺aH:ﵿJ4 DhZG^\]?\m3DV\|.&شb6Q6= ½/\6]; x8U_\w4-So?AKNܠ2cvg̫"99*`kF!+x hQM%\`kJcXd94L? j?,C te3xyQWBHVXVDEA^;ϺL',"m(9c׻`'JA~eAjHtZc%߀#2sqNV<ʏ.řQp# ʂ j{>97+D1LAxP4,Y%akA6S(sCn./g9r + 믒6C48@k-͈VŀvuYd6?czFYoPKJs7BdƤW(X&:S #;] +z)Hh`ĵB=3;"}:2zaag.E۶H|&-Bӿ7%lI&s {nW=l jP@m"GE?Im)7XE&}@HöKs.ڣ[x_p w3/4בihA@3CR#ܯc]K y{L/dp̩񌘃NAs%1A'zŪ0VtALrbZ^W2MvgDq|#ѱ#]Ծao&ݙT%9s[$ȗN)"#U;Le{DGuYGe8UapDGW&㥓\u @Jgԗ&fߛاނؖlӥdÐH * \P%B+vBcP葡\"cݔ6h~ п8u&pzk;&q5ԁ-,Y3T`z G |9Ps At 2#2 !39V#(X?X OTi791sվ acDv*vN\Ÿ0|a(Sk8Dn;SA'gB7۪AJ+8 xDMA^TE((i$gjeQW8W50R;Z@B\u߳"a$M"^.>W0 +I H 5`Wz*1,pՍfiy  1jtmfrť Ed JZigzYjXpP;MJ8Be6Hh6"΋ <WoUni`%W;r W@:HA0ٳnJLqIxh9A5IKs6#97_W`G3' 87EMB#[|!nCdvs@w.d}*w̡*Uȡ ᩯz5ĺcApXk3b$2?EC0!V||uffW$Εhhuz†v!Ov?G^[_2tΦ;#$ Sא-r=czx_ +0Bs +,捯 j8hNGKfflv7MI@Q.a RGCi{üyk\i +X5D^Tk>w]RߠFP͌44u<~ph'섒|0C0+,莡m‘J?AyyV ^y*MJG !Zmx 1e͸C¨*y^p]V>@+`gژO#DؘHl擎[OxY4,s\#V=N5h$>BÅ;ox3#̏C2~FGv0E-+Ny=Kc+;0xrh5OO>Cwri"ZXNssô ~Q{G A>Ghc<>kb=R at .&sS-izRP5JaԺ {2%h-)[~HN;kMblTKʶg_qAY3hAe(,y^R$9z.FtƳ&sSנ@O`0g8Yxc|x14.7>/ϐ˅h]m]۩O?ZC:W{gwt:z;j}P,ټ?v?nΚ|KR8sm:d!jHjE3EA&I4@ӖK9iq4_2/grcb.5 c"_h2"Teȝ-z7\2(&ȾDVb )̪u `ގ 萕[mx}LJ5ɣ-\HjR='\m@EӨAoY'a{ĬUa;0]x ET<9aH]K䉇1g!oW/͠dAA:xV(zڏB`~JfL ×J5Ͱs0ݢz3b.DTuOV +EsL+f^ZA^Q4!~BP(j={oU~j`V`~-*^[04h{/M=% <(95]Bjx{M^6ˤk0\yk|faP^4́|Z]ʙn(Hg`R^7+kr8-Xi:S3LPTmjFOو܄-xn}DA"1"jтgk&]sD9/QV.PL 1ID^)O8f"1yגaEVA5w9? ɘ\G XϽ(ms )빝sϵr>xzmH^2<#~U! p >&#C:4w8h{a32DFǐ3O=7?~-b>3iDK㱥=G<޿EngE=<"MXObyg'ϕ(FPƕT63DY!sG#kh[|֥1HQ,#-iKc${X͏t;Ug+m $S5H^OzF$jDmįyI-"GByR ڍOtrX{k,=bjm)h4(W'y+&ۀd6~.Xק~P#~m3VqxcHAb6-~jYUaJB7aF8W `n}PL"}Qܪ>?''4_B9[ fafH9vz-+3y^D}n-y3b%e- H HgH^u A'ˡGq*@| g;f9 +!%["qO b_=LAY.J_ Jh &-?SGv0#Nj,8 M<#[0ݤH y萖vndR@–,xN#v(ؘ;=yr5,L/Y!m!"ym[s Nkj~k4Ֆr4s'y)X Be4g mHלwmLGLҩE) L<{ےE5=4{W,,;h|;ؚ;!tBrJb0:ݠ+C;R&ܴh$R-aek~haq'4H9%͘~EpD:TxP >6L +?((TC`k˺ls5Et9VR<>3}2lR3p t )H׷Gc*ȩ~`'" 7CȈ2ﻃ yj@dW4(A>2re#Ecn5D?O] :vK'৙fSG32t +\T'_c0[}|3L#E12G "LnL4wYSۑ߹ۺ\Qwt,*i4& Yp ȕ9[p^x|MԖ)OanW$Ϻ [U.JÂU̍vP#=+,];gzXct- '. U[#x7ѯ|۸ˈta)v6=/̓],HD3mnsbxrd噎oU|U4Z@̡͙徃?b$V l.♡PN_}Xl\!c#@4#͛9 |p,'EKy tW|r{.9uBd'Nd7q sNs6Lj1M9NxV` iql)r@ fAM/TBIiW~GN&;}"3)۔'WRS.s+N1h7v0x>yG8vqrB=|/#Y\"Nh1IwC#%M垝|.731w".qT:agFR#3_휑(lp-BnLE7RE3cdo m{yuZM 3Qu4A+#sȑ[{~)f=UQ(]{Sfo?B]Mm4g\T.uHi_^ H|/r:hҸh7fHS#Lw1:x4*nDKSxηAs2L,r͛Ew"qb8#{b~']h{V~zZ70asHC9(w]57}v?hLClJT6LL;]^x\O:7 &g[EoH^@v%:[\IsvjZV4 +uC%BbBc-: b~i~D9@CvH!C<* feuk6#\/늸nMy $d@*@)7lINU1xvZtZw8 '!eDq6k!j;u}߾|O-Zד3baNJ;4=Š{"WG(2Cji]uW4/YF iZ/=9YK@ZKQXhŊx~ESapFh654cĐ!Lۯe~EҞsƏ^ 3MkQH؟Í;;ͥ';v71@λ#f8;C)ݹSEn @5U3Črj6fȉpVZ,R d+])Aًf`V^J(K}ݰE(AWO\t0*>B7P*x +rwq +W'-*sj0iWf&r(J)lWuj]N%4H p,TKdWxG$P%5h%t 3Q`5^ rWWYkW`tfLIN6tPs;=\ATَ}grA)v f"6KV[~nw/"@4@ɐDX냫5hv>oJ(e/XP6XG_FdpH1v{,0/t9yY(07h|!+fMr:䇮,JH~[}l{^/(TV1;zrpϻҼ2{:K+n10;M!0S{l-Gq4)Tnrv SoA1V6@K]F9\!JH8ДWM'/oQqDh]ع\#>Wl͔#;WKpzeqju:ac/%y|hZL]40 W[h9byh=s|j{=xBɽ|+6,+$"r1c8@/3* "ȃ< +~97gW!-3|BՕ *;fؕ LXF-DOO_$@8wz=W CtbnMpZ8L0؜ Έ#i̭)5`Tr0T Kqhv@# +'х;<CHuϼ/in GrYgGyqc$aDP=10Hx0uO[9pZnhhםdgg;szEp +m;Mze |IGy"@Dvdv !iBF3Q4i*7C5/$;$!*PIMp ӞOzͅw+EU"P>Ьzg+s%zԥ'UNb_OulGZ4[v+P)!㙵K!"l?!M! E_{?k_܊HDZ4IDmO]>a2jH0ؙҮ T{'zԐl B +zx|h.n3fbbLʊ܄Ѹ\' i9+?is`F*Ow_ +WkDĚRdBQob?BmBާޗ/κ|vtfJSu/s_Q8|s\^*+=.6GQ!(7H4s&XơFH '==yqڏ|{]Dj>(ߣk(I4i6 Ã<GLqy +OԮ3+3ILk f c7b*)|FA3M+(zp3[aYfzH$ہ>;vm%TOŢRg~x#SHL%jP=k*xXEE#Qݎ3i/{ "Ν + WƵ 4"X#Id1< H/D?Au1)n?>pࡐ9ZrXƹd*Rh]j'pj{/身 8kȑ"HIn[` +a\r{DhH0'jrgF؁MԠfes6Aq M*[lȶs栨zư||'F ܂*CXy#p+ɡ\$->{iE7P,yC"fz[0&7Э6 bΤNh=eHxʕ.Gg -Kmc[ryb.2`4/AoW.slnZ3eck`xhMI +Yz÷JN:qXʣ9 _|y Z[$Je⹝A`kDq{Es׹Bx&;FY辥Z\[4S/zGD)R!r(bu$tS4O]k4 !8W< +XjvN XNd]T7įy{;bPd?u^5#~QOknA# +fC-`^mWw`xs9R ~}+QjʛCWfFOza^GIn{ѻ(=U+%jG}&eoh5[XG"C0q=dIgX{ V߂PťhAp A:^X1TR^B8K^j:M_wa,@QJ&e?տHI3vr i1{(^3}=ipwP.r"dNkǹb>rHd<߃wt;1syM_ߤB<^xeck0դx)ȱHE톩mCM"2D=E:FMz9tuqC5@->i4*i_bg$]lAp 4X8PȚ^шu"'Yyb=9\ɬnOUil/7CGhFj'/ 7O0x>CD${QGy(sÈ"P :1}v'Go AFXz,rkW`ĆP>w01!O{ICvThS+dr|]z[b&9 FauM;hаqbM} ct^EK'LP`V_XcL ļK=X;$h2r V$A):Zs +z䥳% J>55&8|m{ T'i5q~.Җ쌶 % kIZ4IIdF#ɭ꫚[yD# &!́@榣*bu|Ֆ+5t;a``hJ$e|+}i[B2^?D@[˾cKȆ~~GJ Ȼ;*g1h9mlGn]xF;J'=yCw#C Ѫi5(GЪg"NMLOhA={<'3-tv=s@JatwW*ZlA+Q UiI"3EmFĵHdcgh<_&YU +du@e:b 9{EV"˜3vol 沃zi,}&}&TM8RuSwD  ]0ޤG'EHW|hW,o'jRsWHMk%HэЀ\J_1ΊJ1f>Ŀ%og6[z lc@Hhr,WyG6w\bHBYK-+F55LJqK\(׌T 64F۝ʐWDQIHBܒ2˽YS <ꑎ2ROzbS]y̏IJ(wpGΈNpSI׺[ܢ>_sG{a3^ߝ4:k$*g4zsscCU6`~_Diw8^/̏Bo/P-:c7ܭF;bHE>T =$~Xu$EΈȥd2$ + ]hXjr\U>e8"l{7ԌH\NmcU=eU&# 46(0Bŝ)cƿДM Qv^G?3q6,BtqLl <12LGW4S$̖j$r;)Nr<@!;md4{@ofȥO^5%9dF7y&ί(9DIfȢW p)8sGzDCG3 (>6}3t*Yl +^|]vw35٣ՠ-;1,sГ1?k*[[#@MZXL +,泂6F4|ua\A`lvkWq#c.2{"?7ؼ L'ApD$}ˑ H C-#"Wyd…K.I[6Zʼn5vfEnh,Z#RR(?nv.YJA<7^L[Jv=TاaƓڸ&;G$Va{e>Qz([K/ v( LR0ѓQ/FSx?+Pijg7`qj䏠)eL0/#}k/D2JxFTY]%6{WwvEJJFO5/A/t6O3ʖ3JE5H$0%M==_o%[cPiE0pp&s <$:v@^\N[y>*'F VE_l0X)@^\3a P:7S+8)3OuEs/,{#]gO|Vv#Z $|B~gP_~K?/]RՑ~z# Ϝ.KY0[$ m. +ڌ/A=kRë  xsv+.Ev ` Xqo N+1Eez*Y44=ofHΏ$hVN"]Q)Eٹu):\x+­sb_cIC_*.8~⌫tPyHjk쇍dcx(X"`v. {d;붆s#Ck&ɞOQIDh!11vv9ŕ@55ɪ>=bVmvT J{f[NJqoytL!o>"-85FȀ;bs{nrv>6*+gCxj .y}LLؠ#o(30s wT4-87|m< c&E(u}1 芴{m2!6qf^G3{$٦ic!_?S~?:tU~x1rEq$3g gP!JT73H!->qpDD;4o͈x<$sAD^פɷ-Ye/y?"t!nwÊs\Q$HIU>SKi(Ip^*ɝ_Ef©D4c0ľ7ܗЦz GZ_xxЩ%r8HcPr~ ?[=[bu(Om u>q CbA9QR^ޏD'wyz +LX8K~iu?0QR/4dLZ]*,l@YP=c0(,x̂xAA2.+ro%C]!+rQԖi+dK*8%Zu ɷڒ{ Q_I ^%/=| +]T@ܲ='7&*c9oj{:TrQ+0{B9 Ưg#LKw{BZ| f$3;ƴݙI\Jd'1^\UP; ._ +=O+KקgNTٟ|twpwy迋!ڣO?RPH(hS6%zWie; :ҹᕾz,ܰdE(X oB@ $e^8p}c`| Rvݩ̩!9hsFq@ TXz엙2$Ψf I(Jfyħ(^V.|.a*/Y<{m ] X zzTAc\+NԩQJ~7F.R|iH%Tg`Ή>G!W`lT*al|<oSjuXw~""z邾IOǾsWCFDhr崼O OE?WPsq硴d,^1/|_rbݚU圻"l~CeEgՕoY|u^ocHҁ 0_Š.ش[7t׺- IJxR"ry֧\OrD@vC9n1ϕ#"K)='+*axM<2!#lɏY3S'Idm<&d+!\*1=b1# "4q]Yu$94O4ZzBzgڼ/UwPhb/Lkcx ~ +XbX<`j 9䵜:;~vkiz$ 1Tg\m/Lz7$&֞nV<%W ,zM/PgЕ`F)PaCna'&̅\ +> nJ wp1 pDӓ<Ƀ}lۓ7H U-- `H8q{u/Ncid9-BĺI8"e]g+Rټ8\()P]C|,^Wn؆`=X^~'rE;g|MKCvDX;;c܅UgMG.(A3(Y,ee.rDBvT"]Ie ծ>H;"~Aϖ_/p U3Q9w+S?3=oHa :|2Ռ:!] 2qZD\?@EgV /B&gQ,{elJ3WTGm;LT!O& 8"43~BPr# "Lej,Auo+|<*yw6PZ"!?/uyڹ.LwwȲy$Svb't"7mdL㑷*j|LF"H8՜=G) <9)zt{1CnO0w)/}$;LL v[TW ϦkBe1ЬVmo*G;Ry-zEE2KuA(Ǻ9ºR ^;C8D*(^^_S:Ug.OeN5M$&Io]*$|B9zq`G + YО9wQ*-CH0MǠ qy{wi,2B=j6RJ(ْ^FQKEQi-꯳cSw +pOlD.qc4}1{1Vdyt$_?3W3Nix0GPDK`})Ր”U&nsCWF[Q}'FJ>UG[]ؘul"-zŜpn3̒"Fjj)A~RwC`&/tUSO J`Oݘ:8lI]RۃEtBetuWWHTA(0 i +o0n1(Lmob)GLnz骟2˵/C@uky\ŃU* +YQ5Wkkm;q}ff?:΃8,ؓk˔S=;!6( +p{eix-ɞ1 !< +ylU}3ُԻVo ˃"XC8CpMCH:0H8 $DSvR߯BLoZ?HX2HbN\0 q*:ή ѵWlHj5(\47⤠QA8jɐ Ɩ,;0ꑊ´e2os`# jk %TСx$%e'*ŀ@U.[ I *CPI<@R'"u +:p*#`_s)pUpM=']y&Cu)#;Z Ѫ_ٻ|[XtY궻 D~Rٍ2^Q +8ˎ%giHrVn,pdϵWp.X9֕"JՓNFH +4N߬O>U)^RUMUo7gDd0 }I))ivٴ|/Ede~jO&߬e XD@jkOG~Ge|;RwG^gIAb b'Q"{sBI{,{wU?Cd79_6{5MbNoGu҇Xz񖃿⡛_i{ n oCb]в,K$3x%J^ܟIH쪮T` ]?No*8,'t<7T{ͱOKi S,)~$39&gCa>~1zF`KB +(@D\(-!O+b.MFP'Dxl~u3(ŲX/N0p=D.5vTj +MbmTjc ҼS}=AYE8BTW /ݥJnR'HYͲ`{ k<>R w9ל!+ksf^bdMݹ]#A (llkbv%=S:agKBe4Z&sϢ0suPǐ#׺*Z0B16Jp95qG`QGӻmTLb͝VIzNfQ= 1ٵ"B@H( jނS?#=G)+)E[_G zȕN35ʲN48K3X'7^Hs61d:?;9'B(Ƨg +GQZD'q6ްg + ײh( ً^ +FL=rȃ5-Nݰ!=rV"{fĿGt4+r]ҢGU)܃'FpF+[]CfKr&c +pSrǦ/`V-G3S&]XX{!>DW1HkHy `]{3eҰ6&|O#b|+t=G)I#@\7NաSwr;eg[[VP.<vTl;pRnPCj|RW]9KaZȶnE%+հ c?s%d#_2NMb-{&&WBu] Yf] +ίm5C% &!\Yf́"6|R_;l. 8Sq^!9ke+R.?+p%ܣ>(C3'oWzpU%h/,|1?3i>R>@Dqe.RCM]rf)۝չ+ 0м9J?}7ic +1B((&!OD07RLߙ t⨚|Ԑ'2iU/KjqDrwδ mPL>¸9p3m1LdY5; X])#Lڥ.EiU{g??BP){\D^j' "+o+SjX S?F5%;i,Λc"C$  F*T47DQɰ'dV.э>}+ ^U43F*tK7km;l_lx;p k>T>2c(*ũՠ+b[p*q#6\Q8US'GyGB_f})X'_fOY4o;}ݦ on2d| (@j{2cJTϫh%ZDbUGmT{5Gݾv^c0-Y &Ժ;h9sѢ{y|={ʜ?È49 IlRRd#Rip[zJ? @#Oj>򗂂Kž4>{ VP8" T|qν@k<;)G_`G?EHZT*E"`7BNsmzȆ=竘;׷(;5œ9vmumELv#= r!E2#˂]}?m-l'z`;UP(إՆ򧒖MCs+9tÍu i{2ץTO ӥi*\!RJ̫8׃F:Z +tXmM +鮷@N}KԅA0`#EdW)P &Έ2mBbbe׎i{v$N4a +l&̘!u[ HGp+ 'Q;Ys|1i?aKv_~f5obAjW 9 8 B-k=+H> +*FI̐*m{);cBh>m0\i;B6|ǂdב$cyް'M/5HliRGc-9.F 2U= 2ύ +~딏g ЗRuj ^;'lSNRD@4Z(|RPc05v婹v bws%6st0N`SKu=; uL@gm_Qt'ߓbda~j[%w<ശ .e"~wOc n,nI E.jne㊑T!89ОwNWUL0U +._ H0Cͷ`l՟{޹Kt|1Re}>d &!ysKWF9?''Ⲇd.ԑ.q2ۑ)~/-]RdžGlVW|Оp8RM}qcm;Sy?eGG:DIV-yXC w(0ϖ>hd RcwVs1_zt)Ny`ukUp e9u¥ͻh?o=ZȠHQ(Y"tF<>ઞXLmE"u8섭r!Al8ޢXՙ ˩ |TMEo+t%Lbjg9:|s +kY%{a +g[^0)>}}嫔BґZ_Z2s~)S!{m auץ`R5?Ygedv@ZzښSZ{ÌxLypyx9Qe-  gvy=euث\'2pס_^ +4jV<~p(r©'F9,"z-UWCGЖ0wgk*P? -;ǟٗ)T)M!@VƷ"wGI=:Y{#6׽(k N'?K;j> ߗӭrYX62\%քb>Ouo^~hqB?yHZ=Uz{U﹦hS!^QN:8c4o^OK8_(>,_}_k-jeBŋ֕ݪL ya鑾uSGNjK*1ڏ~JH[@_y6i!7+ ی nhoʅ:pC`/s,+xޤg$?xL|agNy0eM +rY3>2RFBk6+брV.r͌y)bP)'S + ܝXc[A' RQHinh}&O}xLGR8.@a*xJ$c{̘;GGF oVE+'b0I86&ҹҖATR?Wp@סO.ΡMvNK,S5ur_:p DUUv&ͮ"XomPJ|wc7%?Zosx5fR0seOy[eC 뛛0(ɴ9ě +|mU!S U^Ԍs,=[=ߙ_1UPA?J<[Xpd;];:MNtC$7஄-CI1iLݐF1PĨĹEvf~lF,!u| i.}QeFH5^R׼='L`JXK"զWX4g2KU/˥deXqW'#j7zB27 #<{@fvGv!K!^OHV{Hh̜eO8؃_yusHZGiB )۴_x)OI7O,"|iT6u_JB{N".]]i;_w@/v:)Aʦ_[X-M /ғRmE1WKÈEʼn|4xig0*`ncF֯ ®ITyL0܌sr+$A eF?4펥KSfV39zՏ2gz.hrI"Z9DѫEN˼y_&$sc'g;('~oؐjW|CYC9:S堉?ZT%#9ܥ~8/A4h*~XhM击20Ekx1;Vgnw.x8'<ᚃg{u1'ڌ { ii~ 7q&y~vha|GftR:`0ЊW6"9S4?!#wUƑ +,qh Oug?RbnC=t:RfwhHjX?e 5s FlP&Mا3xG~fd-lJ/*6t3{C<(V (ظңTw)z03?D@3VPpSy!'Hٝj_wHEQKfa$"n̖" . c? (㌡SMGLVi~ƣpT`p>j7z3zLBϞ!oam~)*Rn94 _w*&v35DC0A IĀ +=uP9_+W"jF󆋀w<\ 1%#oX?95K'"~GvFբ1oa]B3;P8D_ rPԬيbz/}W[;'||٠2G8/'gFʈ \i(2[3fvtAEbS q֓Xv8|-):I'Ғ!w{Ryz|)/; 9[kO!SvgdI}׿ + GHt0 RTlZN-ȴΦ!rQL܏`5X "۬S3|+ d`G^y !3"[};4Q'm1HN혢WMMmf:N+՜ ?ϾqC3:zyCG}ߙ/R9Ehl>&+X׉0YxV(`dCljrm2b"nVu;r=&Jp{|uP:ӝ18r&Ѣ1'\Ep?%@FgHaKR0JAYHrzKrQV N9|?38C)Xcr0Fy’.JntF¡9IzcvKn&PldQ}a"(!wFwE.mG~Gtt>‘C +,=^W j_{RZRЂ2;ֹ(ΝWhu\uYw̳jAsxN@k/z.EN8I,?sH eIuDӉf# v@ZtF{:O<!̋?Z$G'E t8wa=ƭߓ#Fճ '3I5IGޙyMN4Q<.b6@ASlxфS&!y)%,Ş80`/$=TS8p^ dr'~%l.S$}rMLC( WFIK4@\JzѾk%mh(y(f'_k~˗nrī[w*-KU4de7Y&1`oo.iXl5* 1`R|rWNCV/89=q6|l,-IiCL-;OtX0f_V\&ͱ1!ˡy1K #0r|^0[7ކg`Y,>Xh,_\l',5%˃?y֜˾IfqpV|6z~V F!VPj0λ>I6O O t[:%DUId4ۯlIkb>X_ p%".H;3>jtm݉L%#i5bD 4m`Q$(UB%ɕ9)*@({#!Tc;YB/۫TJ6g(@iЪX5wDgiiD9wǀxp)]F4"$xܤc9*"5mE_Har@Wl%4S +Taݙ1wo֒=7\AϿs\5/vqz +Ӟ">@G3)y'q9OoOyBW~M_kf|fӲ|Ku/ꑉXgmf]392lf[*!wjWߞG*ˑQPy-Gh1iH/3ޜ*](@99XMo a׳Ȗ>!-.d_;};U:iĠVdlβ Ak;ku#T%fmqpѱ!gĄH8R d,4$JLI +Wxq÷ktD}="u>1w, yHReEz^̯[ԚX~R/hR>JwIB&bG+-?%&ᙍ"5PiTrsQףېNș.pLЀ+J{gq sтUJh 6M.ay8N,|ejS+Imaw1{Sz D'>G PAvƸ[׌q񦥦yy8& +V qL ֤AW/䄺.W%[^Sֈѳ2h*0B{Ϙj®*w*߶Pm"v?ӃdO(wGv=<6e΂ 'ߝau{:@H"au+ jT;ќ^Cb~ȝ3b#Y*ɕnmic\hQGNnrsuZA+%Ęѹe]&m&XDO$30g B> +LB)TGZ/5dgB,|G[ppΏ KQ J+'Y_Jpliw`L[L ,€̝@bt6r& ;0aFPUy6=}ʀ(ض͘b pHC 0!gk{Ǩe8?ԯ(gll7ש/ 4]p9m`6E#OmH !n*hTM|?1W52HQhnj"\N6 &# +ʈ6 +R:#[ 1wYm RRI h{).8ӬV/ E'wmb\ RdyRt~q8 +%Ÿ8u!o86s'`٤^ F +*ghSy/:,~&̝cr^$ˡe{D-#>1+U_xG2A{ +L>qKq>t9: +Fjeİ*[߸ɠ4Jv Fxϩ4/;A=B۟Jov}{q-}7}Xd~HmA`6! +8VP}јz^A1 bў2yJ vH_Ω?{T)f[a֢@g& $ϵF*n&аiᕢ- "Gas(Hnߋ@);~sT=ڔJ' +pu/kd|U?µs(zlq}hE, o,HD2eEXL_ ݎ{m)F)YRBH\pVy+^d^пpyb/#U2Yڄ5\PaIh<)ο[#Jz?G?C-wqҘ2UfnxU|p:sxgmת*H +ن_DYBn:'s. R2d%ݠBS~aFzPtHp ڬʰ@dI;\os +Y'mY(R3E3ꁞ\W)k[U>ndIt | R7/oqul]ԠB/XlKWI @yK=]O(TV-9 PDdnVOȡ s/oϖ A6Bj܏BrbPUC9Ql\>J7TGB,ݣaåN~^qj.7k>%ǝ]B1kn1Z!p%njP(sER߬g@oΧsB7e0"=D +D艜֟BYǟywZDM13X BWR-$BLc_k![rY3`+g2"1Zϛ%_a@yJe(dHk e=޴;&"MuúlsJ`}AYC@GGW R-L /Ђ Ć@gW>cDC*oh<"ۙMH&΃4pX|&Ur ĘJ$CboFzy{dͪhtey)tbapRǾHN3o-B4ѿ(VP1gR2؉;DxH/q_gmمY0 H)qq#mu^]$6k VO% -&p.?oQAA#%ĊTV䍲B^`+'2S_3([5Ƕ9e F:S{ET͐R5C6ɅbiIօwR4; QśA|"O0KypOCv!{h!"0p'x)B(OJ9}+˦("gUZE/3VQki{5*nL/[l+PG4?ŜÜQ?:hy8-LrXF^dJkO0zr)]V +EdYV.>ȉR,#]qXvȬG:U-%[88m.׀oFkzM97YN%x 91{'/rnUgst'y;t㫎ķQ:2 $y{-i&sm/N?MC`k{K솆;_,M V !2}DejU_)vPm{]J=gn˟J/HͲ!$̕XK%S0u9paѦMmt7Y,iQvMA#:#HR$.u=cL[UIS?D\R[<ܨI7hvZkf:j@_aEҜN~{XߏZpIjI)^>1JdcΥ̊ 2_|tTufGH]D_*#7tf b!DiXqJO!@,$Z<A`J`y{KQҠ-[խبzxFG# C"_^;qi +jt֭='׺0_HI]9: +pB)H]Y3P3992NW*"bm̕F'ԽI<0#AcNwEr 7g^,PHǾ27[aK8ҟc31*GeN؞iI`@ږEדoy$ƾt(Wt4)$T+nB!G 0ͩc)%7u^+:Ԣ_\x +t0y9u/g'#\d/ʍEvE&.&FTq|f-U@o%;'[ݛOl%--uOY;y GMޫ.: ~.Dvtj[P t,vVmrh%~2 + հX?xB҆62(d0h) EsߔH2Wb|Ԟֈ +UŨ#*%fR5 #8.2=(3s㗷 +]d)qp05'HiW7j:l`ņ$ŦKr6g}> .W sP004ܩUm?!Y:Bx+g^m]eҠ8" !mƢqoi$s]a 'e׈<._lEK0lY|{Rg%xhgC9HcKqUnTRT]2c9IC%QZXPKyhn)Ƃ[ +fm=]'L-,֖`w:TVY*Y$G-BF.r9ԼQݏNs{?zA')sA(ug._i6:*lE]/Ms%=!'?E(s!!Qk{xq),b+'_po#O|`{yYCZ_)z e) ^+*t$PJz~,{& +3-}5iA:F~ѵVHD^omu4PȈÂc_o+qFrD endstream endobj 29 0 obj <>stream +4 JP7 (Evp.l:B3}Z-*żh( 6620o՛rSE,t GURX +Ohi,zznXSءZ":#yqϺ^F4WnaLW|6Ncr|brXnع  B+zս]ڢ+[_[V5[žQ! ,E@?mV:񑠢 (8/7 '!bK +?d u^:6vscӄINH2VQLKJtCٗ -3!^@'mq X¾7_>j.֥%o]=\5cT*K54/ G,D*O]c;vdbL4\Dxdc?E%~yTҎ(yMhUAWՅjbrEeI7A+Demg, K^ۙpEZL㬽mHncA~G Eqm u:jUMfԈXo,MBV4WB.f_*gztx}*־HJb6ʈQҭUx߱am;׬??}7~J#fQYw'$1 t1+k/1$QVa2K MܢvIl<*jxvF5Gb*#w JúTNdt5HQ/bu@:l(Vv,څ5=v(-*蒿KwWc>QXךm1Bc30ܫ֦ $BT~] HıDH^j_ >i n>{ RwfJk@+%J@wo$O\w+wјF}Nz=E0G-fxHk|Ohzp,g~+Z9!K-Tm9Wq4~d,qy f E,Sͻ@7`WN?r2 .C)t$5 P'B6qd"U5K}'& +(NI3!< |}-< Ɠ3wVD!!v5=-]#pPDΡ:0MICȜ 3gq\qC[{";^Q\%I&2Qnv g?>HW)h!Oz;l9e~ނ$ +]>kб~d3|Za?Q#q DjRsHא}R`T;$D:&Ԡtt̋l'{1 oSq#Ny @5by~0ܞѵqZh ;'CNubDaW'+pH̜#QCH?| E:5kC8 Y%i-<Cp4B5?wP&yא(pa\:S>n,ϣÈW3J3 s:Og| SLʕ3Q +TgR7yJ ֹ AoK1sӉ>{KG\6_βX!\ +7jkhYW'vYFK*!aCLɈM.pZ2]q XE| ْ{}M58!pr}I3T\SNZs? wpi3nu1>8CKB:_IiRaۇH}aK+GB&)vt%G[ Jɱ%Ơ0g\+GXC7L;"H)Μn~#fi1!@'w& e27֚񝧃v?VzMp^} nFsa =㪾>q A4f@apͳ4'fqQ6?Lc*P羃5$-KȻrh6VӜLϏ38ԆD[ZiƸ(Y60JK# hb=-ՓBb>F׮a;*~"D7/doe|D٢WA3Vbi:9&wp؃ IyJ1g=7r26v9hc_3bZsY a]#F;q҄d_%/j8\.?,Ba2$&x.zKx̱HЬȥ"`xk-Ko~Ϟů\GVAg~$svOCM^d 1sԀ>\F.лvIiddI8?fJW= y:A

9 @tF3GZUǞEz'MIPpnKћ }^_EgV5a$=D#rՄ"rTFet>RSA^0XC &–lX9rR&(꾪\,ŜcsR\Q&Ð \LE;6‹)l!x& b`=߯hL4SP<6#.<?iGGL1vUeV0OwUNw—c lP8EUBe:LjTӡ!-k%v>nH ÑYH0{"rAz1W ڇ +!pq5y3hy1GԻ±qc2v> qUHcF})8fH *uB=t @=7^#ȆvvdN/zm`s-QR5.Jk$1^D/ }p}.Z4x|4SGzL`i12#mZ3[ =#TֹC#5K"kcNj ગ%XCT<p'!J = tݬa͏1dMChF9ں5_!=y\֞*$Kkn9c.uaw-zPu}O U=rWnVC`^=j`{jYdWBM+9A0DX˱9QjH\|a?ڊ@DaH8KZA#%X9ǽ*pU,=GoU=~[TW|Hzji4yaFlĚ T%> (fp/`VpT8Բ=TUu`zR_8ԯ?R!{>V|RhU+yg bEjf󝿟ץlQ$dD/FY!jUr^d0,57| {brl}J,Ui4lt'=wVo(؎TPO%^G#nUAa\*7>!F}؟{!x>KC(ڴ!㵰 )@ߔQ{M@muYA?r:F{KF+n#xiri,YrknGdH0<bMP rS*]Cu Gz`fpQ42L};'_)01Ugө/odJHm4KHGP5*+="e@l^4*}w?Yȩli{>',@*Ȣ#(#}{tgV6:-d+Qwn1xNbtyBAǾXEIafD%!(â-*Mj:0Y(S(k0+{"o _~&ѐ[d +spV?g*JqHL+TU:3JToe98rX϶PA#{E2IM(ӗ|U2(\\syzNMSr.R0 H4׃%kI*o|w{G٣%3V)985f IqFqAt +ľkbkEEĈ.xA:נ#'D[=k\jӌx^A=* I2Vp=>aզhx|UU/Aw2Xg +b89Ưv2Nd.p,ő</5!\53w2bZFJ`@l=.8Ϧ1gtkQNUƘ&B[͉VII8Ena2 =mU6羭Aϐ38; "l]g9vO%h?J^p`3=A I^ĬRyYoyҬ{"V7"fs[朥[R!TL&"G񏲧󮰶`TLz]=JۮpXLP31`~O7 Q 2i] QCx`?]mx6>jBFdƍZ ޗ+O;[2ۖӨq5Ų"+#E˿{bJHmPZrd]W+֓l`L7<Nڳjsv|ɉl=}5jxJzX9lGAZZ.<D +ﴈFrbwDr.tV xKI7{cE7?oQr"a.eSϜ3<%IO'd~ꦰ49L O5vfs%`⾱2h|c/7awc_]4BRCTd^V1Xyg52|V`h`0a ;G_It| 5V>KF49MX!rἣm|a5Nz\;y&F K6sWaF9/hfz mk"8zGzrJ)2q؎Bgeu?Z[S+߉7k٘7W#ጤ~ 6/?ETJ)aQgm;TZd3J~c*7r A4҈ 9gW;5{lx> iq, ::SKzʮ${/WS:žO =s +;kȎLFsW rL@&Ԣ;8qնI2з}+[][DI]n\sZm~%J>'H>$L3UsߙsVl׷ڸXgcg]&0 2J" +oS'&oNh.DVLU +_(iUzδ7if]f^6A͎ew\Gp/bЉQl Ck6b=gϓ"][I|ww#^JhU +2WIASN +s:|sJSlW;zo"!CR{$~&f|yիtsY jsv\VgH;˱K\05䎥EK|;%VQx V&GHE^Bu6;#wERUzUGXy\mQM)Y"9Fy(6:ߔ.xُz1W5R|W]7VOLO =AsR +W67bvmpv +<·.L^E}1<+Cޜ0EUw]u`08yDb`0ݿ\2)6lҵTLx}qFar;1rJZvE&8RN6Vw3O[I]:;xt1:`w{Z</-({+\#ҤE?ch`ϫtD\$1ReÜB'Wݡܠ +QmX,tʹt-xa!۝?*'<Rܪlpx%]E†?0c >T 95!VzT2Bl/4ڂ0cd2 ?{ pWF1F}XX:n.Hty<'=NmpixjpcQ~TbJOqA;d:W۱=*(YdRQʊA-Xwi~Ir)R~]l{3eذK:JPR!ǶW jNE8k"7FM[DqT֐&8^N떱vPr-W8oMxv@C?| 3s2x_2;*fZͬ xHvU5gUEr?lQU;iE7G02m8^ adzyBOtc7-Gq$]@sO@USxo1Dbcb%83jd٥ٞu7#MF1NpPnpA $Qʄ plf@#O^>_s _ 5r'3A<5'ںUAe֊ӊI~.>[Yt?tt}T.4\"]=Sֈn@3~,5C?q]Yӑp.Jlu j.j={B΋}^A!nv*7gswQCR_=2,s/|{1UXm zQRDiwa^il'  ܾ!yA +^sᾒN{#;r2T=R7J9MJ5'VimP 묶3I0Q=Nw}0)M־>/'2)M+/@@gzGZxP"E yD4GUb9j5^kz(fL^Hf)Tʾӫ֮e`[ *k j} KCJx*$ lߚG%4'vȐ̊ ~Mwj5x T + $  zrƦtw fM\cM:dU (9Gʑ}=^&`=+PFb.K^W><*mR}YvO~ HX o=]M|0Ug#W?WkhF-$bG%U7?@ͶO۩p'ŽE0| +AF܃m-[=jȈ,MCCyQ3q;S,ƞ x}l`<kڳG$K>enjtT zA$I{ %lr<2 G'bOT CNF@U4@͡؃KÆ)9KPȈr Zu)ZDF y +H0inrP g_P(R>Ps9/=|;y j*r`md%-&zQDh]_T vTr9毤{X{3> z:v'BP BB G BZ59RGWh  ASW=_q!1h.poOss>Lj{Y،PMJ8AeIܯ?0t"0yU8La,ހOM=2>ޘy VK9YIzZ i~0{3/_`Z!Ū8%JVAhRٝ42/&.=b57iKgU=kߌ5(G&X:dbL2:.-}ʺ9ޥOB57̿{YR XW4jlN*Cny.a6g=;UI)q)'~W4&Om"Fd<Vȟ'QxXAν!/]. rq];`*&"Vj1&) Qh"1Ҫs~pFhptG +W{e|)fq1h>@ţn@W҂/D=7, +r/py |G#Ѡ&kfϞ>hJsU U_9$kCV5@ѐ֭DiT*`kɚx1xoz-D/_`(n]*P +dوz|^z[qy.t+=Z |8mT?c9 zpգbىUz+C*Z~Ԝd%b.(U|rɅHŎWwHٶh uPɺո%T/y+փiS넖K]AA߃)U&#?VJwI^J (S="q|3^lЌt0&cWޟ&V!:$q@Qud}a//eإ,9- +@cj3Z̽WkھwoEiiv\yO2$&]z]je,nZϷ/q99zrd +GJ7Cðёx۔gr''[[*{z"uwdn> 8uא^oiD ]7U۽^閘KoG%aZ(_jϞM,r(y7cS7laZ'/ `<4i;LW1Lb𾫄'DK{U2.ūzQPmrVSJk$*b\V% ڋ0XT3 ,^_u'h3 C /d||}HaA$%zt|ML&Q?"w7{iFQT*$u3*#W[{zSbtXA#lDM&Z{ZXKNҥxcV~Kj*NQÀNrx^ogaY?* +ܒ@;@YWh"!2C\C4_J1|`*F(o+$tFx9mj{]=r ЅtREܞ>܊7J?zQDn{'}7"Т'œ5_Fw\Jqt,~'vA:)y!,26/YC6P25&K=s)/n #:e3"'!7#y˘J#Z% {ۖ3 84%?S~.z71L~\Ho ^%q<朹~UrP<2ş5> +EܒQ1U5ɾ0GެiB`:@fpOxmzS]U-,P7-^6AxO6;nPr)(T2ϱ~"K@)Eh>QeU#V^~e ! ݟGc :O") AXr+oՁ?Oi^uooPbYv9EGWms~Wb$;i?(Eqۯ`>Kcg#WJM>p]G 6YhVC#I9hU2ntYA,yVukf4 Q(_R3Du#f +kY a!툎o=ev%`vF\jmY2zpJ|걊\uըJ𮩹tD[l黰Ze5,+ji #$,ٮ@ٮ$!';&}9\M*`>jԯ%WRU) +Bi]uf;ۍ;,SLP lѢZ~)1Aߒ +fABM]4p qFU10v#q)D>_7?3N~m9@b۸78 &$@5w[ݶD |JY \ܹR@IQ@gǬo ַ>V?lpkOAҡ +Wv:E ƏC)s]~.1\ɚyC-_}%`p`EH\[ZO eDiТDW2ANtWK +@hےЉW?@C+` )О{Y Hs!=s +ϗ*= 8C +8wGc<8((zB󡎔կFǐ'GP#3r|YuoH9h ru9rZR\͈tRi8"HtABw!O`J);$9sU :Ι3g=_+n>5%oa +tz<z) ]aBE RvbՉ0ߐ-܃!Dtje~K#J*@]LCfvCԽ},b.R ƨ`C4tXKTC^ VYwBR/ 3CG iYC:#NZm=njk<%ȕ СQC9ś$ӐyHc_BRF0REW44%.?'n3F9r%D|}7X<@a.ԻO\j2&1_I93RR2.. g +pW}rGt쀭)%cPOb-GxtFٟ,dl\n$x3x8֮p 5ؗC@aqǏxvS2GlK,~j(\{3tR~u.Af^&p%Z+41`؎ +vOACpw:\3$X=%3܍g?%7G-"?47!T-37qln@7r("K5b5#߷YX3hy+u s +!_A;2?LC3G'x;`ڶE0VQsX~3We k)VQ/J$]ҦyJh_ZHӀlHv߿"oU0R#.rj ~{4y`e+jHS;y:w:\VFU( H{XrO=בm;W +A5g{36=9ʷ[drCScU#9Ý Wѧ7FŕeTS5'*VR;(a^t +{]0QN~^yT:H|jCd@T "$о^.jaWyOEm +/;y(L/JNvLʊVʫBIX?DD|'ř*䧜. W_,Cqbm܋'@٪mmymu Ч;C.rLc.;:U֣n!e a& z%1O]hۛD3ʦf&*xpC!E7>gƀXz:ʮ{-q#ۏlOttb@Ȃ;qTӅ2Z"M;/t`Z-NGJvB BKNܰo_v5ҢZzOR;ٳ+n̝sgwPyޘ/!jHتCYiAB18p#; +#J+AjFc9Yڴz7r*PS$R%jz)*k +=-1_Jw*ﲗ|Z޽gZplJ +Y^sUGJIl{Tb$$IJ;="*RyB+GiJ(32)Sgב̟<-T$z ῎߶H Ҷ_T&`[Te>d"Ը,<ɚsT%"I쀠V?%ҕՍO>+B-<I k%&dA =u %By{χ_#'t8>ߢ0IǪl?4y\,]7Os~"#[H'L+zQ싷]bwSﱿ#ܠ%覂I'<?#E4,u/v MVttzTy#^sU0` +H猾輠J4KJ =̝LXoo;橎:GI`KƹiE~Z"#Lmvl=Q*-|r*֙%VvleډyDV:&i%X\!ƍF`PXR1ػa=|>_ @^MRzHXU #Svby 9H:.c5P/uw{?0Rmp@ojqUöᎱdI+قj6E$kw-P?ôw'T-G>s}U782`LWI2y{!kMegK&W%*ޠߵ`6v.x€Y:b̷Vs- ěEN[5=5X@ +)x\ږra *Ą?fXvY_^ Wtf)֮OrlrYKoC:kr_8h‹٧J׫zJ[SQg/$ 91!F%=2qPe&ChUzG䂴84+]μ\~B3;ˆv hYaLua~Ԥ١Bʬl7+*M/7b>`}oV,;2>ʈ)8sMzfcMKK'c"{>c[oQҫdXxnb=~zRKF=Y1!PE&QdyБ!Ϭb>q>>|&eki1mzHWJN;|{&qM.&wN?!#dX#r+nzf"Q2AZ<[^Nx,Ƣ_Hnr 0_bb*vmAq^*ye[SG[snK2/b) }._Vv/zju6YdR$ޞ尾DUsgZ긭l+6'qMD6Vx"Q`,kru] ҝ$?%rPwYb{GK +t"MyF3jߙk1]_"?Ic96A|)Xd;+k)jcVM#AYp2%a؈ϾSRq~ ԊR[|+O"¦pBnJ_%*L +X*kpG9f"m_,hL_eH#>FRݾ}"፩ӯ̘\/; %vKO1 0%R -77yWH4Aw*?̂Z[/`:,Y7Sh%6G)sS\kLtt#4W[~%GK|gor$x џ k8Q1}߮B-q^Ph ߙ FP׃۲HxJD,|ƶ(1jN,i__SZQ* DYa~-J7+!@"'mϼd;Sfě¹"O[lk}U'=@xyn؏0ߟ$)I&<@BG5P.$I2qi~/wl8_tTkx,]QjKw!umq+?3.!sp<:H +濏b(nixvقKc5?zdXq$Xug|MC%}[la2BYN )W_i},YY7q\`sJxڢ!42s,b4WߦU KN%v~Խ'.v 6{uFcIJ/N ӜZWXȑX[^sEZoB<^-oدR(o^HTv<.%O)~L2t +Ϳ*z$AAE| (;)m2!qY{_ĭ p qvT pYu&+ 8CJPIKIgZnpS ~?qamIϱXygOj!1;qٶ_6Ojxz:wŶB Z4@ci@gAT%iDYI<8bS~飾WjL7X:vƚ#)eUZoR\L]Hz%'~^P^aX6R cq@(h$"4{ kοc<[w7V=֒ink! +޽`ECdǰ{Tʡ;FJ`\Rp)_mfe)p8 o_ p/Up0Ce2gj<9ƾ+q%s==U$ iB_xUg Vp4-2wIh5Λ܏A/㨏B۔հ;p{LDR;hoLYRyѯF0M;ә6z\<w,! +{D~W {DMHQ;(ٻ=.2hk.A`[w 8tJ撎 >>sΓ91룐Y}]d#NMD )K˹3"mvi;HP\z2ٍ}_/'5 G0,Oik2'*@\d(q_8;_~CXuB3Rz2pF2;Ўoy(lF4!+= +v6mMJj߇ ,NotGB,?/ltˀO+[_5ݨC4e~M1K{f/3868neэkCw>QO:ƪ|նPpK^}6A_JOcimYA*3B`]C> ,b s3fJ^˘&y 8J܉33.-Gz.jS9 yo :" n[W.y48? D"R1ˋ$z + eK# H3up"n3?BQ.j}?8TiNBެGhPB8ok eg}~`d[l2xRfQ4 7DTvfA,3me#(3.y 1T/kю}/;;"DHG]C }Yś')۶'P:aM)qY;ڈ#<@[v+ҾQf([dgE5꒨qjv`|u9Q`&GW +wouga-npw2Ou_Y)lBK*'֟=r o8Y=nΪ%gg^2NȴS% O3[9ݐiޤHidc!3iy"JjU࿮wYQk ńgcO8:Q>x#°fMwz=P`ll>k!=ͮH2q4:~̐5kl0A:=ˎf/xP_۶]g@\`9̼!R88Vg&czҮ,+ec?y(Y'ISn8TC[%{D|p>yjx},~.]Y+HQw!#(-sFL\b<6#<)KarGi>"]H(/XcHMYYFYLuF6}2Vz'kDh wY>lf$U># ȱY~s|6bL(Z gm 1l4IN]8tFau>䱮mJ~SۻW}1ҥw☥ov-rQvMN.)%.Q6A,$ְ׫L*6$? +5Hkˈy ZőKX_x擼kvg-uBu,0P?s\IƂ=9Mܺ}p(51o'ą8-\ZՌ. we6a5gL^GTWj^DrFJ6AKr*Ѿ ,)\j:'@Q?w%QE}"6~Rm$|-S|qvcۑ"EACowǘP,'6To S[yhڛ=E)E YCdwvc8OPSf{dS89P)2 lb]Q:;g2xyqU]`"u0GvǝTkfxD)nDW^g{58>ؙMn.9z8떎Z66]QFҘO߈']_/|E~[G%c]v'/}Ԇ^/%IOjw̃^kC EO]+FL[xƺX/us}R -fC)x"*:qXG-8aYF-}3k1Þ +x3srMEi-U>#o-"/6Oa/s`?+ZYxrV*uŃ'ۋn`"2xk +E! :涶9o=i +~O6%Y<: +IS/Mr8͟']@lm8{ڕ7x& ;V$2/u8=s7{neg%FE2taȭcm`L{!v[GNp:) +%J:eo Y>y3č |=#_be'];YP I8Y.{}pԎFhPXƣCoaRt,JiU8Ƶ%;0,^k^1Z&AءIQȝ *z[wrK룵xI ;4<-C N\ۀWڃVh#$ݼk]:&auQٌB?ttƉ +^mk\:֝xda5)Bk3<257W+5QKWjNmp>շC=Yj--sM^c< dN-9ꎗSG!4FF}> .Wܟfu~#Í]%,uZz,GQ8 +, Asp@wv[$~ZU1$'48XMEzN ;m+p wC鮊O`º7R-c2;h/pz+ex)T)_=ǾBw,tcIQn^8o$`] a9ͪZ-eyG_8{Ye~+gIyLi䅈*n]ŷ> +Z0$ W5J:fIAQ{wInm#w^:'XR>j/K1'=٭+>N$0إ# Ln EOPr!8 >K jiG'm.do,{,!Et,&q irrMkj_Nc1nf(CM*fёBè6V`, 3+P%ܸIԈA$|[ǿÁ2Kp ;4?I0|T9SZ;۷v) |B^XQlSi,^Apߣ:hGeC~iObv|Rh DDgB/v%eC '4ixq`7A `*m҈L +Rp,;C7!ca-۵ITNdJSۨ: +p(c\Sskl^v( {EE!1Ҩ]8N枀6˞ᑘҕB=#az˺f-?<:=)"€6a-d{8eW"]8yg.4=^:ܛ:m9<㕹O/ M:x^OL|Zg frQ2z->.9sOqVUDf+ՏHx._8c]jv<]dG -}vPn‹0Uw]Bt<ڷ"zq;G,Lan4NewL҈^j/J(k}:"9"KSϻ={8Q8a_1 \>!W Z`# K$ jQRKmOX| +g+TovO*jDԱ{"2z3_ +M 1m}&Pl!鹌`Ǻ%rtĀ&7&ˮl]b2l9'{<[1 +lpFt3k}W1ji +ZG Wζ#/|4b &?4KR!bZ^S97-8IZo34S7FIWwlyhFF>0*F9;)%_ :}^5\:E Q - ܹq$7b0eV>BkYۮx䬺S#d z 0+;,{}Ԧ +g=d7nگr~j=?T޺xW1\w^ (rw?=S}ptxiY$ {o`53V%TXh;BQ)DD0m֡Gêҟa>_6fҲI?-vp,r*sv#Db̞D .ʹsmgfCT`Bg`gDłBByGz2hB-3P^V>>g5Px ZGx*"vyM˱0O+!O_7ܮ|ar%jYڽ~y. E]%i<;xHߓ({xzlr@ZcTp|X:-V=Ya~.h4ŀ훁[ZƘB]0_>4y ]Ɇ# `gsHPd>POc+1ĭe\h0u܂4 C⯧KXV6@RvՎPzxq:B[HLѫJ5"ýIZm*mcHܹ smcu\P P!])X#&%-jk+Du[dFuܽμave"%KtF$/v:8BM]:7zM&8 +4^bߦkO^.A\rm6;eH՜aSΊfo~>_W!][\#h{@g. Ily# )|(UVe%~tjCkS MZ)@g;}jYlX+fGy{ΕBv%hY;bR8wQ.x] +vq()L Mt9&쮂*)2Ң jr)*4we*.GR|!V+T]c[1ew7 .B'O@Ds.AqGXMl$ח dua}hcMK$LEMw_!^秊;l188d}a";R?b= ?Q~^~٩qC5y#}mŊFPe$K3 XuV('ɟpݛ}oꢁ}>gζ!3ؠ7%lY4G`dTak^>H+E 0@"WzzAR)ң(cUV2tsbV$2 E.qF_z-Z"<`7>26P sdHB*E`$˝a˳&ǻ4Ж1.'3$u>+SDމKy@fy1Ss!J>o_-G kxà .m)y1Rj;$YhY־T^e;=J+' +Gb20w$#(J2s vY@Hpnu;v|&lAQ,-kO@|YKOǝ+X<rc=͆\5Cgc9e|llU$ yB.ʃ +d9af4+1 +;)%=)d<,[LjbwݯMr-Ǥfͺ}Wmh 0W]חgmGSxf{OdzO#YhM|h>V9+코M;'Q'Qhiׅ):-YڨP\,.D +{Шh lQb+]"by1=bA{%"*de!%Æ-Qj!z%1 acΜ )#`37_>Բ@o2J.v<%M"}Vn΅-H$ǝ֭9/<Em-v#s'a>#%(*BTv(2"Ld >J0ZD!Ö+TEɼD(&:.Epux73aܧSwӘb}@6VՑQpL c՝K TV&k[wS/^װ^ַ: u˘w-f X!˔q[68q#y!g|Q"|ۿf=5LgzZ'JX7,hIJKmѢF /3kkROh]HauΗ:y&8]`[smV՟3jgxKvUL6`1h@z%DF)sM>I@*K6qJ;l ΐx;dQjܠ蜧VE3k<;ܰ{ V/')jºG]”.٬HDnW'3g'Rh7q˕hɜɠÛL{x6ר4枷)*u^H[`\ ZA)#si.YxhFSJї>ޫ+/1oMq?D9dWe)e;S_=9R?MiQң+J sE3]VxCJ6:W2cOK( 9N,``f=bMf9&Pir(Ȇ9j=21 h +.C94W{2⁵L;Cӕ08S۵b3Y e;!EN-GѷA~xmDQtۉ\]qqI+dj,hZdAݽ8qgsKZOMݕ')^2oފclu}MG˹*R^W[!Y+v}˥Tx9|N|Ivǯ\mp3-67>m"↰ƉȎz Mx#O(d6vEQXhc}]4pg*qظLZQ .y>nhcGн@=es;wES4gu#׾ )G- -:sPM$%~ޑf }P ;}X +ϒqFR?y3g r pYK \h,όRx_1=S1(L]\a^_ʘwGAc(k OW|w7L"̈́[wH(xo,쑹P毨D:IkKO.欬_'jmF|Uxaz)6Y䡫 m͘L2bs!2./#NpÕh`P;uH/#% l)TBxP[G75-=z4vfUr^"TuG3-PS,a$}xX:4[;9ߡA_ֿ̳h ;1dOw1>i tҾxD&z٬㉞)iߞ=T#:ʆV{G^}g9)HVOWQiTĴqY$]7ltVHԔG*l4C^<QoLu͵l'ˊo nԖro4:O/层"1We}U{v쎃Sm0+vRzHF4EjOy{Q9ne2us=SV^jqlKW)_g1סgU'SF)@/V1Dx\/LOPȞ72UHQy#ԂAI˕0}bZ;~#~"s";< +U$<#5B^ۑk];ap.&^vMjfR]e4o|Nh'XH +OK sb . Ujik!AK):z:m9?QvM,'zd /e~YVn85I +c Xo:XVt8~u#bM{Ex5\z+1TGor^jP ܤz 4wTlq):oA~?+4bgIRrt+7w_f$lU8v r.'* z7PԞ^K>2??Ryb|X%d,i6̜6됞}O}2ݏOYFO%)Ԩڮͯ@ï .1>yxRVm@D^ͣa@$@;%MW"HGv˜=^`I@}1xi7tp02QwaO`5@m +Ȕl~Fe KJ{9δ| a"^ŬLձ54Y;Zb"Al#oI@*VסĊ&}526:;jyq:k~&r +=YWWݙcJg*;윹p9%`[ߏo2 рb&~oR$d!%X<|=j]ZHdGYJP7\z{5^I&XHׯ8xjuFU,ƺҪdsA\UbCVl\BP6s˜$!S )ܭD +qr؟磾[@ѡ Ho^l*p@VVFr!k8FxG=(ynu:ij1eKEhCb1}$r ۩ 8Dz;9>Fqq,0[Nh(Ozf 7ŋSԝ080BqP T5)Is)Q]a?B<ٿ/g6s/BKB$1h?Y yolq+mOŬTUOÒ3]J1H~kqh* E6d΃(ν#{l4eC~sqf`+=&Xw;.Ub ~5'c]2O%(\r=+jxA>lKqEY1Ĉ=CyuL0n+]%yDMѺ_ynX#a,!rQDhr??c$Fb`K-G_w6)Ko<,'_pS()L#: `c}h Swfı=u yOnk/c}vDx>y] Zs,36onEH3pZ:UXP'`[x'dF{|/n/ϳNcHGn2Df]g˷08oȮs ĚrT}Uf@H4!X/749E9܏ѯ@=R%} _.  +DPH~?}b!(@[X* + uPb2rHo|?S5(%5p|0Pyo1Vc3:10DPsZ 9;[5f=b>3*cDg0Iak'/e?ˊO;<"J]w匞,#J\"lRD:l8Ce%cmrE-w:Arـ\s =2ߡ;Y90k>6* L#v^FP9; +~ϓz HzH ++gmaIa"=BEJog%R?k?\ ]O7zW)B(Qakj̻C0X+j_'AkzOI^1/xɑZQ]*ON޹>edD̵R Q X P_١`IXݽaC`-krdW(OQ \΋KktOi%&DF<]ZGNɔR}ܒ>WR|k;9hi }Oa+u"R:uw)94zpZ J /eG_e|T"!Ie [YQbmQvH~.[Xx/7V8X\d\ԋxxyM}T!3|̟ `Gp7?s.01*5h>,t@LSc?>^.e~z;3ܤ3+7X_QT%jKIDwOWLt[waKe u+S֝LZ U.׎#o{|\%UGygk[QԘ9vV/Ͷ]YS/ciƵD6A% *Ǡ 5Wnu~)_`PV|G*`pXrwҷoi*J= zkc!$T+A#aQ:f2Q|$B|вmCï:%X.ԉ22g5+}W!B4ުd sMnG(ϙsp qFP=/z.ܞkvk* 8g:c/v_ƼF O=yWÄGgFR勷kyeCV5brx.̫%4D5L Ll}rIR$ubOm%r~qvV}&5j +nReӈuU' `&+#"y?`8?WgbmYjr6=n8b] yz}c"yc; @>nee2#̕OIgE<s:8qSP&>I3oCqtaA|>X3L+lN=qY=cN|1#i8;# GgA}ķ 2)F.R('qE8"'r Ȯ}KuB@ێ]RHjb#TkW򹾏tY\z;sjj^aBI䣄G̻6UC&.'0}6?Nc2LFYd\I92Gq|_۩g 47?]PG0]l:ci]nOZ{ٱY-J\6HU&.a'cـI }]Rr:~^y"B su2;*{/# +|w&dZ%F~ ʒ٨`rϟy fg-<^';`2Q[tm%gYw_ +D G諄,Ttl}7?zVGb,+J/|+Rt-7ah,?Jfw ; W8d l"qݣhe48C߁:žS^N3qk.Ux\°|O^yw|mZ4܂ #͗g%}̯˾Ҋ}&^R"({fS;1yb,+rAG%1˯Ϳ|MGԱ齼֍0]DyHO)ufouϲfA#;fsoڗq,[Ww^b})v%̑tz*Yx'Ysx"o5u~J2[ϽWZ<ɕ vv;h$NC4^@"Z; ۚ )/P &{:EhzGf"2[چ5p<cv\o= FʯLnW3;džc>0=D ,,=ųE!1R69OD xCWw3@gf?- tiOz)([h̋A/_>aIj-x-~a1Wu[:8i?ϪP\> $YS1U]5%#~GLGGNrV\]g=~qxF2yJEvz- ؠ%_Vr!'3/FG.eq~~J6QgFMuNOIY:3" +uTe߶W]"նbpT۩?e FouC~Mz2vÿHCXf_zfݣ~Җ22c"8"R#E*67wı7l} fNHcT: &wr@Kk c3ɫ+y$!zL]#XCWq?1-cpb +jKlWoCBĬ8" )ksHiғ0* _X10a5HQ} +?e-@_q4( Û{N Q;Pl#zwS-N*x6(?\|mX@AGF w9Q~vA_=)M!4djH uz, ?̰;Y+H2XN1$ٶcCtP5)?3z: (xȗͲ>gO`ê'v"ygw%ᦍbNivu㳚 *Mn}j~k3j?pQ%DٞqZqJwNk2Ɵ^|P|2?~-I9ۨZtRn,QO;2w,4Nm9͡v8;G/u*#|1Ew.'?|RXJ}#\5h[ʖ}JCZtqUa|qb bWm_oX|G'eAEhf|+$^T@fde)5wSqWqɆ[{fsɬĐP8Nc M} &]O\"ۃR<(Qn_"q@#]dŔXb>_Z޺G}x`7DE1!Xvb0X.EڊK^^<[*Gƅ9{Wž01HcInۗsO_4#5_KY]M. }AQ/z *z07/jYE +E]a?͏`WDLtS+|W݈pL{wi#ӑ-J{YT}wqᚠa~5PوφjtJ$\O,UCp] 'g\7ԫW<;XdvQRY1/\9}z BOf߳Կ,ϴų@zS0&paDt0 8\Iچ\^&ZsԓQ݌)OpOtwuV@pmRZGrgLJۮJ/3ȑ4r?I2>{ܣv'jPytoWW{X؟Oqٍ7odaQY3p|_."3]r #Y_.)[hȒ9=u/; +|z+r^48%1G0pfy^ITUÄ |*!l*am?+z'(1Ss(skKj0m f1Z@ + =pb}xz*sW;VZEyE'sDbO;6" Gj~M c|?8)E'4R8Q(iN|qflܘf\wr-ȏg5͇|>W}.;HU^T_VqH ixd섧&2{inmE! 6u{oVGr'4J^0s%3`Zƺ;0{q3r1:9tbP0v<\TD2V"ph%+Is@GpCy\tl9h(!d,S]9oL]6|lȺS(e`NyC<, .!95n8Pn6`xó} AM},-fW= Lc Jrdh!sFB+=LH7U{d z4ΡwAC 7Ff#sq2} f "83@w +4{A| .mKs &Ot?6!$ɀܫEC{$/.kWVCBpǒv/CLˆyl-#!g {C=F; +9Hu4/il_ +Zyx /䐖r #I"|_k«FT;ONTo[ /X~ʓ;wEļ%o⺍KJ6kF},*CzǏ-I"ҭ +ݖ/~^D&8j?G7Dr) 3N XwziG$Fsq Ӝg-7'Xg p6Ȉ)"yd;[)=tyݼ,j[ п/,EPqV:č<_AIoïj/;!aX KVAf)##-,-e"$8RGMl4.guHs<}Yֺc& +*€1Mw~=ڱ/g5-9f,>M2NDp !IJ*ޫ? hԭ}Ut$=ض8~?) + ľ㽃M0:-F@jH:_SKUݦffQ$!5qH5?̅2NaF7l㒾]8[x%ک^6[yhm_n7 |kr5`Ĵp\p#R1݊zmz܊mv3?bN<  +&c(kFa}bd{۰j#Z/hXi60o\ yxg4>߬xH,8d;K7-ӸAMy MwGFq [Ar9?Wes_FgOh-7Yfހx~1B6xw{߮eTc #>qD ĶVJ,+ps.+_QyuĞM"Wc%?h +K09).noY1?ؒM? #< S<¡ß}$̶?mIOᡗD1UPN%4J-4#AaQ!SH/peGc!c"SQ7lݺwS*-XĐ]ڤ,FD֮p|V|Y$heC7cL~5sqIwd M\;+˸GnIYmv +"xH$kk O0Ƹ-牛d7M,t$d̃!6n̓P6^ęyBZٍP2xH`H~λwD?J#]\Ó7<*4<|ѩQwϙyee$vos}RLOJ2_Ű|_ʚ`,)m[j!o`~zmĽ2fna%J 2Ɏh!s31U-qŨ+Rԓ\ЪTG`3;m+߿ +$Yr 3,6a`W9X9=N[ XP\ yd d܀"-l`6D'_d>> !$Mհ.Q?S&FZE iëz-k?&nO +{E<7, W=Kdy=Φ1#-#߁TڼHxְ*$4' +>< ~:wg\w,GCٮKMX~*)۳c"|#,CE{$t=Ӄ3ȟWr 0:}ciјU*}Đ\{9TO얧83~v}q 4s7ɹ^vc8CSiv\Y{\7HT)j?c!=̆zFj)>Gȧ{ CGj"dؒ|g=-ޟ܋JᖈC2Vs79+P~Wvð)).QOdsd;8N}.v;%+q48lA~N͜8#F`=&Bd]yFP\.x^,5BQ!/3Jgį&ur,tqԬǜBY|k•3|';-6`^RxOOs%6﵎\ptu Ig4$LkQͿr$/(gCg5lsW1Úk!4_]4eP R!q'?X/\f]S!zOA',35)ym_s( הksD&kF?Pf4rѓt׳!r+Z@[5%1JV^ x;t:/"^cO IǶ[ޝ}DCjG]"Q8e\t((Ff7G+R@5 0$r؎)sli{[\dA` ߾4+$|?@m(tFMM4T/AU.?#z9DQ_V*.rgy̯LL(?㵥nԇOy;j4Ҭ)l0E@)G)}/++ܼ4FUot +}4<\.aDC5_`A؛GD0gmk/yߓl C0}56d_2E^%}Z5onP1Oct׏B,+HOpo)G/cɕż[lQuG[t1K|.q( ct\. 3(GgHK ƯEpka&{Ur+!"`w$ilRWAK+6a_c/j{}ن-:722ݸun9sjYN '~vl%D5 +46>=2`X&Nƨ`iy/`{+T;MH+ \=Ÿ<!Hj8b>?lce;JNF%uUbo$$ҹGM1ħ_!fpKwNhŚsQE)?*x@L +/abgc6?>_Ysۓ5%u@X~pXb*;q>k4?&wi:K(ؔv<9X>11BEFak&1V~ud$ak/:^v `Q`LԂv.1]~|_d, B@ĖUj u-ܙ+P#xUw[A控ŝ]K=R~M anlx +Vƈ|i P)b95lg1|cY1gW?Vc #Y@kjc{L!SG=]8N6d +(DkfnB<εgX?h FP8kPZkp|]č`2э}l7#f份ZeEjJu%V&z$΀]*gLlmX@ׇk l,0BZ8\"m KGR +Obu|,'rx!u)L7{x9ZM?I %1[]BFpteʈ'W=PU:|s?K`, gyMn܂\YJzn.Ař9It &ݙ11/ '80Б!y +S>VU*ԙo}N7%.fzDkeNȒ H[I="شۗ=HvVƳ7bA1oo,ɐ>٥#&yNV\YF7 +U5>V"e=7ES}XcSZT= {NUܯݯ2<~[" ۆQ{bOja/c"-cf!s&«# D'/ߔ[0'q}5Yx[r4.ܣnw]9ٽc15_3.{ۢ 䆝xR$[fW.1嫶}i|8% v->i ^K&z"ug{Ro.8,}D I3u bO_j0*V>A* +B=*%y$tDqiє.y +^;Q3aK2Gq0V$ PgQU[`@gp{_0P`Pf](k@^P_tnE;)mb#?WqF)lD43p3#W}ϋ2> $-}ϴwl?$ZLgzCDLu/kIVVͬ'NG +lp4 Q;ghY%H~ +vk lM8/xg⳦e:>K@i #$"Zg+vH+^[iiB+&О쪁ooEou|ѷ@|9$iA16bgsj"\ +rN#\8|$rn +3q0aEc!%L2|/F4`2^(cxD?KXȘ1Tǰ'-%VPMrA=ٽS"}n0Z>: N>#7-YN `Ҽe׵"֛c{17k<͟7s^_1 +DN쫏-#xyo]$n+k}$GG9G}az5LӸS)pbx0xy%GY .l +ϋ[jA3vVn6 >{:W$sOJ_q=NfiGFZ/ 'VE=؈ϓzNKg,Q86!ڼk  +3L~橒02 BthSRAS[{vt'oٺolvxWRdZ Jr<;Ly/-i7*|@ǽEGq D{_70 wS%wO :5Ljݒި~UnD  *N} CUE6~mvfOZ3g>5[Q:,rL%goVG pm.2i;Z!J|0GL: E[UGs@͓$fnX<*q4Dk/p 5evĐ$ŇfCFWŐ4-k{e~u?sTbwGP\> Öo.ݜ.J(CcU>P#etֳ Da~ZǍ U +q}~<7AYz~VI CSJ\;EN~X__/b? +aq%M 3tt YuV^ 3V +޵MI +#d(۱(g,Uu0n P۹m#prsb"gLVO*;ZB"ѺяÎJ r-'Ll`ɣdm H:7\P}Һy-x-JܑkC{K^CeOO H:MٳYJ|sD%L6 +"K;_\)Bwt5foU\1'gven_m@uj`fBqE{B߰T|ll/Qg%33(g+͇Bv,/'i:KF(Cs={+OD܏\~k.3igKupT2krw~aFۿ̯tDBu=]p +jSOp`_ I|Qtas31s8&6?Г\z3֟@XEC[}!&S1`S˜?:̎ˇUftSu@a=D1ϣ o?nr> rgX髱 u7<4]gr (0|MG=T˚Bo_LOҔ6u$T@a#sH?̣k6N6ޑC>F70^{qt"/ +{&|3;_ 65$`s'zFo$J%Ky9(mM+O'F!z%FL:;;\9D8$!A9:CfJwؚ׬1M[~Xw>'txb 3POk'plڃE2I#$*y+ts' s3sӜ$¯ߜ .3ў:YŶH͂ɌBHT,tϩ9qx "Z +;I6'N:B]$YB65*_wQO6|Wy(@3C1$q(->=YOͧOueՠ9KyϜfP4$5bЭ{H>O\qԐ87MN.^ƸdwϹ8Of@ffNtpmi[Ő=MYelm7Ñ *I;mF\ 6L`/8<.mEPViVJ +Iå,#<5n187;J#'F~pf=l֖5T?a#zg^J^r.HsAca<1N5Hplmn`756gj,<"/mo~i;߳$-K,7UXXg7JȐ_|Q'!bI5$9y#A7l[F\Z!#;<=QƼ'?j|נrә:GԦoL3o_Æ19'Fv}QowrsNKn4@1wBq\{y{=?G3p?sPz/=n Rb#c]p=Cn. Ց*ls?233s൑wO~ +~x}#d TؗLD&ཹ-T!?5?]1Cng#q|,iAqT0y<ڢ-9Rzm`mJ4|əL`wEBFЖ*z2Gj- ;;dXXٌ@y*5m1^C Q(iGb\#J-+{6q{De(u+R H,QfA*QBO7 + yz8O֮R.@(ެ#(p*g]Aʞ"+3~b@4>_%pj Zؑha~6lFp<ɂMs_ ~WnŎ oY8 m@gugZűrgcs'*# EnJj7!`%"~JKk_>,,յrYb4tF s{"6@klcUs2m:Mi3Q}:3o{T6z+Ȕx$=:S=A~.zUt_vLAa>nZD,RIEl0n +|ReҞf{eԐ}szibh6i <#H+󿑥)wx'^Sr +\QrO7XuR"8hBhQÞ?wsǤ-3wDa,虼CNn]IvKn +E]"._D9f$<"qGwH Z#:hP;O1 +Pa W\G;w+wޒEȝe+$cL\{hͽA!< ɩ{7N[:biKcʠhF(uKܮnexxQx~:fbQ~Iy7q;2p{Ve.b1wJy~DI0BHi4`eyͪ3.N!!DSG R͇bӝye$a|C,v~wf=!NN@( (MeJ6G\D`5:-=GMw&54ybxkBB4 rS- 4,M̟:*tϧI9D\1T +X텓~UG'f38gѲ!/:Jpտi!W|я="njY^cr˛o$ +RW!'=UhnPޟBd.zЙꢥi ~*iGxyZmKvt<=a] }:ϊ~ +1C]rA}00D8l#end)܍ؙn$jJHjoRc0XHDl~;L02 DSvYx]Vs{ΨmٍO%+Bͧ腌8P3CTV>ϓjjCKn!ׁnٶTŒr7X̛\; J^_|c*!Q jKGF?G9J倅nHЦV5*!Nl:-aӀ2s9PA@U-/QafOQڟWLU4P +ƻH+GA|dQ89 R,DEfD,m:ah:r~nq8 EBST]O[6xw˼]$-tn>[`)s63ls40F#/}8SӏX =ŹI8Dz&"NFă[ǨTdoA.C6;f:ȅǯG@:/8s!JZf!d^說h!=S}ߑO>fPBuS2HgL= ː)&0O0 + Tk,ص$egD1g7M2UwZ+SX~j"RVBvkek9nGr2+\|' [x]?5S-w9'INodmK Im`uFR ʼn) +@0EYdoQ_3)0^f]#.H#-r_oQ5ov ` >Ka[TvgQ9{|MmBR?3NR0/sGA_%c pӶL^=?%: I$;-߹$oJ-1襲0ۥ&Lma 7+\M:7:vv4SWļe@u$y9'؀YӫǴi6;\qF AsCy۝C y Mv>\b + nאEz N"4JpA<)7J`[,|CjꚚWC2ibΘ_%4-[T +41tbgsӶbSyH@< f.+%:֙vAo[] P9^XP/d& & |4C{řVAkί+ +6 D*R{R'VH, dΧ+a{dWOi kwBC)e>s'i)JQUExޛ/ 3U +M*"#lgrl( &iU w']^[cbWFl)aC +y~Zؕ1*s?9)HԠM.Z>׈v@/e3d~fDz +C3Y<ЕOBj&Kta)_hkЭ%I "1 $BnB=#NUGl6F6A4|DڙF?⼉ `TTDGyP5 #$bW{q܇|CYq(7"t~E^cbEmخw'OVt3t)/fa{7ĵ*Dj-D*ARƊ9V/gЕ~ŶR *9S"Lw-5@uY2}]hv*j>2TM2h爜|1AdKv)O/.Ns<WQ/ӈH="]? X؎Q b"E誟QTKlԐ)wESu\&c1 Էi쁤UTƊ{i\ӑțCI I&B:(Fa>xA%;g8l:h ^B\D"2#\`يRaq }ftçdCĜnQow.LS(|tzxUydphgX3yi1!Gh$70ց='}1NZr+6r?e(N<=a.M WSCxԌr>cJgr|MEC"V-FH6b3ӈ7}*MFtp\>PT 3/l^gC^ЫX77/+JHgcСx* [xs_xKce?U^ lgl`p}h@A@ +o!Q!k +S#3Uu9‰1zwcDW'Yd6Êû" +*z7?M9.< C6IKf.:@iX`wUͬ̽S)j+:?jJ{]3xVID/ m(Ǒʌ{ T4ߞd G5"sxqIwq1I[7⨮"fv;{ y8(!zG#G y-퓃?W (#ӟrx4J[T?>4WdveʌlW*ܴb[Yć8 ?W'_,}{^j_-2:>v#bW80s+|9g@r6<F\_j`8:g}]?uXvcSzt;Vl3]Jy,<x9&XSʊK|!5D3_}~(H5%f(MK`^2'D,kϝh#NrDhHmTG.if+^ z25j +!>'T誧\YN#UdOݲAy`Ee|COir z/_Se ąWi+~.OƔ m]3ʼn +*{=/i0G&]E49Q#HrGaqMѹF +*ED(~B5 mtU^:$ZtW4B¹b2>$Gu|ΌO"^QO:pařE' ǐ3ƅaPIvT!F2 lGJU[^tr7Z^N{9O:ӸӗjS7K^ n_n n@<]?E21<-NAw:EĦ{KtPA +Δ@7f6 |ZM +ѲMn~jg` zLLʱ~".zRꟐK[T5<X1E@-=(h-Qj!ݚL=kM5PI GEt){{( zs^6$#]^dÀq?z'lBND:`qC8ٮ0\4y+Holɟ1|_wJ}֒r*dI77@l.[l -4g\9Sm Wl9vC!אC3cϠ0dsXşbM\"琐hCW%Od)Ri?{jΝrgt +u tqUQK|]3e̔;Ĺ%EVU;C%f#0 FG7 s)+īU&S= :ZMdE#=Rɠ'5էSN&I/e]БL)v/ԭPYJNZ= aTKTRY| j~&qh(3]UTݰi3uR++O݃9ӶT,xuP>B>XoG3yKzf퉑,WKcVB|Oa+4C\DooC@{Gb3ХbxKHT1p}F)̹Q#W4Zŵlռ.uB"EftqH}*AA2!-0";y,=m5E'ՙ*TL%uGD󉨤Xxn`#G tkv/O2YQEp!b 冏!H/@#e+7&rx?䙎pMY]pƺ6baD![[[9e2Ik>'D{] v$;OW.FfQ=Ć ڭ5"; W.A>2[^"]) (uZs5HKiK9u;S {d8@ڑίI7ܥ?|h;v)ŢX8h7wǀfTz̈CeڹUF>#yp)weEYl&^Aؤ4zԣBJZٟnnq[ca!s]Imcq?j߫,p f>GAڵ`Q:אмLuZczjg`K X9"8뛋-}!-sూ 1fjh~Rf-Mwʈa +4:,3'lkGYBx%6FG GRvYGx fֆcU߯e>͒PC<X|  zñg)g\ՀA#?x8Upef նgUȻ* w}f~Ua:@[hG{C;TZgrr,x'O(7 #XgOᘠzѩ\7Xc_ܗΊ +?zY*+ #w<)8Síӂcȗ +-[dY Km iO$PA[>sQy)j8= Wqi9NjOѝ[Ԟl{t;sڬ׳ЍxQbY`D^غa^ɞTyVէ$`|cE1{1yFȗ*#;h*A$fWék~NwYbnÍ0'Mik4DdG>rz!!*o +DTY## 4V!W䘏lUF +J]Tncҷr oBz?(bKص)r%QYw,n49fسr* (F ''U`<bM:j E#)ذ߶c~*B$XO[4L(/K)p# Wvttؘ=7d :i/7.8U/s$E@Ɂ<@)8Zk TWR --z7y,R%yᓅ3g 0{u3`įQ2W?eYQ 1OE2b"y&bg#$hp ݡhA"}m9;C2p3hQFdGtn!C3+N,*;k l3|t^AcLO$#<0Nu@wGgr,]_xNb91bXQ;oQ/"894.F> +i t7v +Wl[,˫D|sH^Q_X/B[Bu)) z(NƘVOauGGInB:8"G,.ÈyF9)NP}SGX^ǘTrX~FO[Z\K +Ie4dt$_|W*4Isd@_hL}o-8uշI7(yz\DOu/%|D_Lo\,`%6N>BT|#DPRԇb۳Xa!yž kw (x\$p]e8N" +[tߨ~M0LKAg)1☶<Zh'Pg.*& +ΐ# j ?YSd}zzIӧyXxxjHi|4ąorW#z;4߬ +맼b>A|w:ηǵgC )U &m7GF:vS︑>H=.F`rgՍǷ!3$nI7S}E mDQ9tJ,$ZlwJZ~KW䵝aT#F[%I/ǠW*irA%H7r+J +3TȏPP]tV ΆnkBTTآ+>UeK6Ϥ$CGD7Ng}Hn ko)v+X-5^Z%WPlBn??ɬSȓޱԎ(+0nLED-Qq+EqY2g$m-5DYDs[T79U4<6_#}2A>)|lz$u}'UQK-(凳h9Cy !2G l椽]}"ɏii+ԉ2C';I&U- GA-*BTN*) +|A_Ƿt!7˨uo,HldԌp`*V?胢}9,c^zȗsL29^v4!t%aKiKҘSɻ ;)o,RV0{f[aLG=(u<]aJV]feP"ZF\xK'ftr~ڲIjr'hNK λvy5Smj -yJgebS*>1}*6"E)lD)!J wx4Y'^'~!YdlO0+X57CΜ:nf|յ~ +X$\*NGCHP4sVfODvrTsn?k~R~<7%x# M !1F:vnDH*CaZk柇>O0={OPރ gI: } *-*m$Ո;1`}2_X:7ՠ%@e6RJ>#2\Q= "/9qyj+EdVw<܌@IЈC( W#,#z>X4ӹ^+A,#h֯rФ0-lxY~j՘;~YJh7VSL(d` )?BNPȫa# בcf&VO")`L*j0;_6,SlfA[Ϋǥ-*kyX@]N^,t#ʌiꑙD" +3grOgjDBb(BVwӆ[Et%]=$ɍ-59jLyE@Cۖóv`R +7/15.4Qee%ʙ¬ѳrJ)3fHT= w7 +%`5Qy9/s;fxj.jVlW bO U\a_=NȮ~z($h`F 3ݥ1^Ct*+o]HрgO Z&"ét D ^ )NH!IHwNȹD"yv*p% pԈee{b2gIQ$_@{5&Bg*gݝOwV !ڸ)5fלzwQy_o>}Tń!eW sف;(CnibYu!;2Y?ff@Dw&*lEH0;:-8K +LS24elPi 9.Ky(X#̿͞StaQyC>=r-}˯ Ed /0ru{BUjVE6=ݕ5XSsed`AJ|E^;.#\Ȼ}mt@ + +om)yc'_b -|hŭGOE2ܷ{]G:I* ]WavB`]պW9j ~R|^QJ, +sozaDio?7qx2x4L=ƼsJT#󀌘!"Oj$Uf `EOEWϙC}˗;3)V3z$Y`}Iw~y 7k6cS۱2SzͪzsGA'Sm9s(Peۘ+GXuLBP +γ[/ri'-?NѪc,MI.TKmT>_`3 +fZb< V[h-NA۞F ZAA瓀qf.m;K,|j.%kaM#rߣmW6ꎄRl,, ȃI|drjJV\.fJ 5{R8S?c + 7F/ jzJz5wY-R2 wȈ&ot躪j?HV̟# c9eQ˱w-q QpGN}-JwԕO6B©.@>stream +wǤ +0 H<47#x +QJo6@Ր9\9QKȩX-8'=)#k $.(ur2#Ȓ^W]ǹ +ǖ A[AGx1%<?"@;8lG^O2 +_Y[JVoS}aAt; EQK*{ݓPk֞8^IAb)WuhbqnFbqxa^&gy.F80 AV~p﮾=K"#8(C⦠pm}吋nj!Jjg0'B}E03TK8׸{ -4 L J+ktfUzZE id)tG;g,77Ruy VKI{x[JD>\b YzOu`jQb/_T<*ck{L0-Kj m B4qrdk:d2:]=|gA07sE4P +vWƒ#5s Af&+ʐRt ~KGʥ!৯؀Y|hJ S?'F wlI˰Rq We7S` +Je) ;l)!7 pX*E7Qסu3(pun`>3qtNX.LjQH|*$q ĤoK MV=4B%|Mu,9LRi հԉjF@lUU/Tcr`e=q4c+Xr=Ef|wQko0Gl+ii).9p$α Mܐ?[鉭#RŤ!{yɩRH(GDF\ok(#J7!<tD0$o%-4T>E+a\xrZq:8ybȪ2%4Lze>1O905#fI8JPH)~\L:kRU$Uyzk{D,{d/1wZr'dUC6B;Ϊm;/6 ku˪s"XU \s!󓚧9N͈$ :,ўx! 1u_ԅ!-++gi2q![fPWT0udz)Jt`bHBP"#ev^QeJ ߑ &<,g*hhMXV*kZ%dB(PbQ4ԙ~/hI':Z˼[];VH2_1,Rs} +U|&G!)>HydI +8WNlB؄h6U;qr/Pk̳ïT9FW\K!CHYxexГtC\ FPa)Exg@,۳~Iuз !o"[*Um]˂.$hѕ/'}`KZ*)s rco̗Ps?;Gȱ4xmq/և +(*TFLnN`O8i)ÈVc8J >p~L(#[Ţ˲~>YH4ť1t d±-lS J',+. +;l~"a>{#lElʧ(Z 9^z#9ϛF\AuS6/ZK tYb,bEC]aK!fY E+Cԙw%|!8φ^U61Arg)#P\XX5 !suâ1 Oin;f2d{B&,ۣ>~g+OEEBAq9"@\P?ƈiS]a,s{4#viNjW%GWY6gǛg{[/ BtjݓJ1=  1CAf|5)iW W'fԎbE4T78AX$EQy^ P~Tg{9X,`qX}O>LaFɑ=k'#_DJiss*fw]8W\W&r;˷Uۉ5/xO$h@Wc%B>slI5$'gCTۻ򻅟;3#!~ɹ$ 1+SC<9H_-%:wՎiLbmU2trˆҰ~zܦU}=PWeq.h8\Y$&0猉U0΍]0 )a4Ϫ %}%n0 cLi\s7&߻NwuWd< wFD/ruP{7#H VVkϦ2(LzYecyFvAq+䜣Ib+LTR:-]r')R ͖B7%၉̩{ KcdW54$P] \4yģce|n;q9u0|V1@+zFtP.sqYn)!ᏅuTQ^Ct~coqeՔÜu~#q^7;a2Me([&۴[=7ي#6@nψ7?$a |ol~gҟ|}t㠢żU&31wY!@v})ƺn:cȇqÑ\!Z_C3penc1NAO}1VXSFv VCJp4?*lSeS|KX-pl8v5}8BZHwBD&]D%-7V,z(ȡ7i/Men7gjHz +2P㬌"b= )1(z +s[:E[d\l3{^ǿ)dRG{/NTjR#yԐ|i}~T ҍCzRWOE>S +#"^]:}FLKiƘ#IfO\ ~"hbxM- ) gЉZ(׹?J? +\<]g3(_WRH4~$H`A1:wc/`vDqlAPa>*9@O3`T_"p튌:֎麆T5B/Ѽ  , + s4b3Odx߀WM@NBO+w{EÉfꠀ|=|=7#ۤiFמ_>#]#mځt-S8Ul|8bpL輅Ҿ~a >\%^!6g~騝 BAE:e$K֒GRVCثo D羨}J%Sj0z o_Ic(h+ -GrCQUyulgzAzY㾸{\N7jvh"̨!Ȉ_Z0"KdOBCV׶i8Uo ]9t)/^ ֆ9_wrtX4h8a8X9vmafqQ=^h%0G^6T3*>cȰ3o!pć:|8duL(pU٢{yy)V,d>&2nڢV8zTE/$ooW;/@/G4cp6P!20%roHQZ*O&"j\g*IV)z<įN HDPsY3ՅCT`|u_h!dAaH،1]#TpћG?f6^|1!,oHsL 7wQ8nmV[~=}щzwnfYBsyMYTZGy6X]{4i)M `+nA9B0ĨOTx٘|RC&Q=4a1Ł5K_͔Q+98JIiN'\Eڄu˘F%9mQ)ݸ}ISƜ^cj=X1@՛ 'n +Ta<2}0(SI\b6dX;J^R?#.dޯJEP5;R”xPT;?|E%<255U-dh@]|:^K5RAQrCF<윓Al=j6sVmKL_7VT?B iL4v@M!a;@Җ>h")d*W>s!:FB "XqVL#Kz̏ s{" OUF1GYyC!Q qgdI }}W:piƫT9lb|زߕ!7ΠN:pEJ z + .Sm[C[9 +A7b^ȘgHyѪ׿{Q+j?O:{WX*.R*^P8}҄*s`6f + OQݑ-r>m ~K!EP$mBjM4w(NWvIn?eLa[a^FZFv 7uq*ZF_ϫيXǾfvR.t4gvJV/Ŗg6׸5?ZY\'`jwrT/LD2O<9 H%!7Fk#͹s[@G;ˮ3F5Y7Lw;l*?yul՘x߹ +SA /.VWm_NF "k2- Z}ݟ[D]= 927+wGxXX+#oW8vivӡ}5䊑S qn(яn^ńbCL7 0ꢙ, 把r_/ng0IA + v5JOuz2*Bs]>MV䶩S?pt~R, +<.N)aS./gA44<ZϿ4>_BAGhs pمK>kC s<"T6Gjl)j%JSx=6t^ Rg/žlB*kiYlRBj&nf~7TGDPԴ.;-u@z7v!P+*dZ1 +mP$TmDF? &?տgSE,<a& +P ;2 FV_U$>5(Cu;$$!r; L-@|*UrSmHhqDߣZ[S<=/ J8-en?.{L쩧2"47WNS"&K:]y? +J[ 9|>y~HAQcHٔR[#yTK.EpE))Br壘'ix7}W{8gy͋[N|$hT1cugAsc bz?a5=TYdo7F72tus*5EO%Tu̗ CS!zzJLԪ+eo&i9{/^7`|>ADEZV`^qg<Υ,^aO1_al0YҴ+:@1fWpKpU@Da={ .."K$O)`q.k*D|iEBzwc)v{rֲylH{.#Dwa- (wEV>pI"@C( (#P`b'rJ=5I@6DI$IR";G|U>q@ 5UM.jss*sŽ ""ޫd{:{q+; To@G犅3w%#"7 cks pR$]ax#V­/ğJF[Iӿ8 +~?QuKSv +ۣѻ5N\@ڦF3Kq1VWH:b=v Rb-s5:Zlg)tJ[|p;\dkϵ DK71a*w굒ڮH*܉~}նNtk| \0Szs'&C}C>[8Ţ$|>Y鿍TXc !{ΨE@+bs#h•Qe +sLs^W7=w~3dP0[Ɉ_&|bWIav#IOVD׹Q=Y6m~m)lʩI;"W<{(S'2{!l5$삏S3o=DCN)>U#@PJ F/,ߗx +a7^w]-ҵ!h[J:+ !pνUj38mi=Up1>$?Y +%r.SMᠨ3cWp_<QCp*$w rFAN*zҙ3ep3sxK"H\d +PAm{Tc"F* ϭ!8`E_%+gge9bi2=r|PbUB$A$G䩸z1 R SD}|0Z5%yH-I!!8Ws#U|->hjy>B惝MT(^߬xf0WsCɇx.1ą&=Q51!~1Sor]0w~5F3M6# UmŦUޕs>VK]N~%;jD9E^߈nhTpH*B^zBu9;ͽ\4bҀl}ϿjR}{`~m+x%AaQS^)kc5A\dF7>qQB?c?>(/#kuwB.).mO`{[Ҍ*f D)'mb/ߣ`ۋD}@UcwV$GU < s`,ŶʍU#2|ll""ts?ۖI|HQvR*9@^j+1`bXA֍Ծ2l#"˜Alf?{5F^KJǬ>bz6&ֹ-F7: e:UDמ\e@iHw"9}i +_t} 56GG (+I߶ @2sxfy}Yh~)TPS >.lΞhT4quDz^wGVb2<[D<LGN* '\ ʮiWfJp{69+=睼AJ^#׹=?Sٛziaw"1=gqW]zi2V\5Xdq s0Ub!iw['3tlo9a ?@HO3WNҙݱs:^<=QmcBjbᄮx8$JȰNzp{&M-'Sd*A. gޞc,,V+p¬UE{H=:*,>oӊX&'Ś+ (Amfp}H⅀ѵ_MNv +,(YYhXΠi-fҩCy$Ԙ9 +UNUC3ࢄPLMwUeLC> h4!* ͉ʓY_ba0O zK8&rQ5\FIzB: LȬ:K쎾!_{-ĊO6[J~4o=RFqQD#Uy +#>?`sLU:ǽ)9\C;S9dU=c7)ZI=PN1z"ʧU%TQA#TU|ɩƺ+܍A-~L+A +O c7?`?î_%Π'mi>CA+VZ0aKֻ) =jB3d PzALH1+c1!Q0Փdk. NɧRߌ(FPyOZDc>GJLd@ջb I뗶X6@ \M;n+^xɁZ*0JlI^oێW[4YRɒ;!]7>3pXlZ+I qOu6?4~@$MHpo,Uę@)߯*OĵhRi1T1Yr7MgWIvzi]q[Ӏ7Y's_:O I$K<; Mh^ i ? ɥS_ :*M }AU͘߹ExAd:gh 3P 0j0~8?%Ir> Q@65jHx%R/}`nz$)|S3UO@|fq!V}(H?@ⅷXQ d)g䊖lc6^xw~BmR__F:q*>~*uWnlǽ_68Aĕ͖gO C#Ɨ^t9ߌ᧙# w;x검٤ S]c+0HUoe5ݵBw@,ٓ7?>y!y _D#: ٞ"6,Avadےl=JqGT+ZQpX qOI9i 49+\2nfO,cꔺlo{E9XwRS:#Y|=mmHÕPb#wE-1 i"nZ3QڀW=RizSJ(߭V*wfgcG87>S%zp6֭R;>InNO/OOk6@( +Rc`sm,] LZ*QuC8J3MZjrCiAmՋ}>1+Y. +5׈Ҍmed.@/s V/D-鷤]UV`z\8^i٪ EF +XՀf n\xDlAr:URM +sǍ +ǡ^jၑ:3Vqf({tg]?iiaB#5`}b0B@%,<JӦo]Bfqn%}0Fm>?>8C2nɕocH}#m~Hap +f?'dШݽb:[ ,KSg8ˀVR({Cp$hOzAn56H>q?k>ҩ}u),cǺG7msKw^ܽ<7^.K$pLV g*6BtH7%hu]̀\y!%ضi[Z/Ol b"Gboqxl/]Il1t8PKWdr_e<e[*!Ɂ~3^:XmEWQÚ? ɧ3nɟyWLuTߚ'BkGGrNbt3Rq=ԗFSxRqh[sFlcN(סlQWL$oVcD!mS+ Kowd.!:TeO;lWf |CKڷ +f,*f]j%o׵e|UV=oP(=KI&2^\K: ;#g a^_DHo0lWnE9|.~Gė`uzDl^ tڳf`uNly[ʶD@R1&jjD*]SPaǴQow/2Syql!^1M҉=)_/-۹<J셤q?9 ,J6!{ +k>ogl0 +FՂ 4dRkNXyan^npwG+@㿭 ]ѹo4շs-XtUuUTv~1C +&~bTFL_X_ ?{aR-;˷K"AB}yCesKF.x;[ <2ɕF.URǣS*;̰w69%|c"QS;ܔp!]|^ C_p?A 0'`L bC(<!rMzdîNwdY\v܍ *r-rf3 7@WZt D3p3L> +?;uEYN&/Y4GXKj茒dq*D<:v\󴹋DxD_:ym)nFPd3kjŘ`e7Hg1_5MxbAS̻#6_c1⛠Z Ĝ_4dI(KVXT_`%8f|K]{?'ɲ#R,If,2F4CL%hǤ Dyv{tkщ L 15gɐ5f&{Nݑdr+<4KB{ϸS̈1꾑<չ1!yIT|15ԣUf*pzEKR% +Upr"̛wU_u>_QOB\$=Mvowq0K]J +,z< 1‹吭eEa, +uoz qαY$HOhլ6|Z}L^t7Eq@XA%VF"9zc]ip1fRN;WFN[P4ƹIb@QK[s/o6I$< ˨ +Dw3RF}Dl{lQB{7e%EF1P\ιogN)ļ[I"C_H^h@7"Z*HĞ |;xНTmCBS%eERV`uPFÿ 5xOcOwcKE^ᶰ`{ox}#N8W";a;x6L^- $2(Gy!ϩM|_Ew\7=u')p`BayAHd|A2 _\b 6?5vq;7d;zb~ "f~/AgT7'<;׉_Ty@hzH/G2nzsW8[ܑK Ep1DsWݢugeNa^@P̊'0K XafBBۂܚ-,m!"A  !YUuR'j<5g 3_#-Jx';V+-|!5os|}Cc~?fej<$5ZqQ@Fձ7oT$'^?qاOVߵ(dgD[yN-i=%9~+T@9bp4,P“*_wǞKUjF>u\zfC!_pD^#98%7xK2添wE~6T멢:8*K#P^\ 9Y0~WiCk +Uj)5 W2Tۛ5.Uh/ QL9[Wk BټK$'%bFKsRmsfܭ*[1n3T LD%?ɍ_7@)s`ܜuj@s\E@!zW~y`(ha3葩V OnlH+hT;F[K߆z'\Ko<SZ]ꀂ$W1ۏԋ=tH .~jT'0;]Ru5(i6t,F$Ģ&7tRWrfǪP71'(1a8qYt@ [Q1i|Y(֒SGn] +NǥM/NXxuSjP- nFDVڼ]0Zf{{X8Jk]){n@7%oCپmpfY<M 4 YQwGCuiQĝ HiWՃ6zS;UD/"v 8=-)mA"h:W4Fo v k_n>xuOQǝ_LOBO@ﭻɾord%ԞpKKwpWi8|[;[Udǝrй ɵ{;Cd:B/}.->%y>!gM*yD +ҹ :1^ҟvlh!=RZR0Y֊=;fB[%iA>s'uЄuHL~7Nx`$Aqhe-lvb=f6ny"sJaAe_pRqe_d3)K曤RKuΠG9ZK?c^~דq^,vɷfq5otE{vc Q$TבӣxD0w[yTUco+]"c_|QKb~oGEw7)nZ`az?o +1tn5[{F|VzF\>(Fs""4py]HSn>^ uf"|CBY;-H*> Hg@tʐ Z5>=tw}HJI(gv:Q\Ɂ\I<&vȓ$pKU<<)Q#4'H{96z(23I}PZ +I5 X4\wxwіG O܉q5,*oDmK"k1yX\M<*]ÏV3F1bK+&<륍5Tyw8seb?3 +&#lwӯp/ ;*snqO+96\(n ߣ^4{^8g?LFqxEzXrđ]&v$P`F̄v%ӴY!|*q9iB' ͅe9鳂LZs؝B! ,U-L"GÆl@G %m +}^=6ñvF-Cո l2"-W+ȎyBYcyD +@5-TBߢ%_km~P +d0d^y&FYzbkH"Sy~ްy&vϒ}uͽy"Ȗk%p9Lb ++aTI(zxeFv1dJSXdrqp +a0k_0ad9XDx5LG 糧uvb9F;ė;W2) Q6h9j1]鲞ϔZ_(|i;uH #aaɫmsN8QJYNÂCTG:4k4&oe ,qJ8gGFes=H%e A=-a@C/3TvZpcEOȃfd8e^O:o+e! ӲMEy4&/OH~F,!dzȜG3Y$9ڝYkz2=kH)Na)_gId WH4%];VBdXfRu6<wz +$^'XKonUОs cȔ^O7˧9,䍂C@IhITKȣXex݈TYd:5c!0H{+$WA_?kE.j[C]2kRZB[&RDݨ2u$\5~ r~?DT#Hϑ9br<<ƪGyK76D^Rk pkmGL 4&㓞| j>G4וTPD{+73{2wVWP.4]2gyiCW6 Z:$g䌋Q+xj8½YTAn!屴=ax}X t +-|A舍"rxjIxǤ *!ISE/({L3} rUeOFu]%jkh˕J6_ +szmy{7!R(zKS:}?;(AmdځGD]'7ٌͅt'+ +zy[WX2g|]{m01cNpv6񇇐R8rwgPN^K<.r:- "¸-e#baj32گf$a 2"&<' B=q3=#8D +%~dzИߞqۏn5IFGB{V);dʫ'S7mPb jSz 5v?h,^b>W3ݨ+z\I0ŔH9" +8~:t!ϕrc睨EqZqȊľƛBxCOR210+hR-U_D´VDq`~BoKnr> *ZfVAc+t q,Be6hjrDBE.2|-U+JX^,p>Mgv]K!tJyȅXG +~'IZ;ʕYs@=X_'lqxQVͯwC;!.1RxjtM9tD+-,h uةW kHjMt,Y_QSE]K00pޭF(3E~SP`к/,q1U]{m %8zNVCW$v}D"pFLW_ DP^̍pKG#`z\*-3}rEDxD Ƌ4_=qGxΟH!)O} ٝ +"^UL +7l$fH $;`|VאNdujƛ MRWDbfMOa$I38wHѧ9 +IۣY:cQ2<_2:f@G,0ЗpUhq3ulÏjPf1GĠLH'VSznE qjtBFr0G()HG4 1dCd3wt{ڊR|"G32k4RpT\#s5XFD7|M.]9HWQ4wZeшIL/n3: +yzVp 1~낏fF"MY{ Aٓ~in~wpQv8m5ȓa'O F0)-B0b<:&B)7GVưU4%QC%mkYeF0D *}.ˆ8,9ZwDUF"O>u3:<#RϦ=堁zFΉ ]ACma$gal~A/_c_~ɼs.zW; 3,H&VY '?FƴtuȢ8{/lP[\I~PF}|ߧZAx^{%P=AT'wnLnZ1 5}4jp-ٜ% ߸c5RHz1ܬyBˈV}I玥VIsGB{QÒ_y8:0ϣ`o&-V$:BKUfcN1ˀ; -uMx +K|>|.AC AK?e|fT]MH~g+ SzHX8gqzqFb٩w nPl ( %63U X#;Ԕg.ѝ!$?^f$H{E#B:pYn/wZ>L: ,3=g|/D!͜%$+T'Rþ";>~^0ڻ)'xw2~ vXvG~}+B\.!ADjuD+fsk,xFnPB4%8S2 iPKi=ˏLbVvt~dȫ< 00Q|u.pP WhzYWN<6 ѹ`$Wљà^ +CMꄒt&JL %ьս0ԓ)^r?hlFY,[v9WmIO*YɹaC)^r}M{"ݾ8 q[,upݎ;N\ +ZQΫa30O{(N\淿y #tmGF^2j.ΕsPa %z2ax[V`*sgzO_0 +LPXqmk8'~+>drSBG1c^)BD эi ¥ &thos  #vTCV+̩HW*JKTa+9//ݒtRݘǿ(8q" 9w"wŝx>TD:Z2 ĤOrkKy>pe:޷va-75+os֫:'{xr3?&g}cOvw43 G}c)M/wGI09_1hڒ.sL5y E{~d -V-3^?kd[@ e(u AE2t8/ǶJ;q͍Hr]Czk<8Ax Vy %u%;LKO9B:#~SM -}`*,|A_Z&8̋vDmL+h9?XN!j;Loutj9ǃ1 gg1Q9$9P 6VB7%nM;KMFXę\4mLn51 +OoF{| 6&flnz}Y/קmJ捽Ad+*r8h{ L3֨ؼ%jpC9"xdIh)3T2G>D:=]t1R[Vܴ)=D$!K8 r ErK1#Z6ipktNcq3HJ{m'M>7vfK+BmA2oI`6ʵ!]IYP" gsҊՆȏ E@?k7O]#㿻~ljwy/Ķ ngH$칧C=C(#lT\(hQ :*J{z PQ2Hgb?BUǼDZl/bUZ /i9{ѷhD\,;<2ˑKQ S{nO"||1=\[Ս׳+;gTA),2Q)#i Z}|-Kb8溒W ha.D8N#AUb}Ôpb5Sll՚A#OSϻ(awJ `-i%psm^sJ(H,\Cڴ,C_'d̺'] +ߞ%LP.43+]G/w='*zKPWM zP.Ia=0_dS$RQ^kHg 3\KDZ=lN޿́Lt y%ˢ'5~Wk!AlP7W4dg7cT C>0T4ը:T/zE +!^_&(okCNԘQ7 .mE|$a1x#t q UtڨK4AUkH s +럘7u l[fWچވrbjoYX'cYYA|j`BQ*T SApcT>0:3g9^T{FpE%@&P4nq2ރ0܂ f +|B)܃/D55 oo)t6L=lX3D݊xvų6ؒ2"c%^Xt˘ߝ.7 UTb3lAT +YmOA$V^u9IA +3Z7ϕr gGgp1((Os7q3)o,!a^1mܯw( PHs۝Nݣ&"]WJm̍vD.y,?h=*Z<.`,}HSxeaIYDhV @O$r1q},#M?$Ȝv^,gg gpx. O9Z=Xp|(D4+tB*a5lS̈׫ l4ŧW$@-fs\f@?VAj{8jߌ.eg {%hE\"J#3bxͤf$W&"@q{M[X|F1_KnY4S]+j/_-eEHO7^FOh ^}\Iw0|pCmq2u3tj1}4/8͌ 9CW!9fN wagȷ0F6/]%g'$m*# +BDiH ;ާ>A`N,'JNdt2̕c~~)$ـ :H"K$+#^h+'-?43CpGIXmKk\eTu}f5ŞӶ1:yMHGF߉Q栆ޓZڈҫ|v~rt5sKD@‚̽skM"j~Ɖ1C%B$sӹ*}Q9 Ȗ &NC^u(<6bN1vx4 +Α2YŮEk̼3Ϙ7BT!lv򫆶N}Gh0'ի~Q"(C/E6ͽ ^'rs;{\δd7un/F!3Sdw<YoyJ? E>wSZQf$~tʙTWoS~X +9/Zo4>6z'F Mt]:sj!MFĄjg{gɮ>DE| +k5xu)@YRbIw8BsrY;> +7a+g %Jh1Taϥqd;2S5;5/p\h*^nd˘$―\~V#D&=m + "{Ԫ=Ak+0jV!\MaѰ.avf=_m;>d)j #Cw6G&[{ +?]y&W9O%yrQF=$YA Pu̼5ayqbW!L#{' >ܣ0Z=e?{b 9rbXlW[Ӓ![@=H:(I D?׾DL}O 0(>(<|xAëe*;OK% r q?vm][L_v ʉb@@"hUn 'Cϯ$YR@{s;,rđGG[ge,lo_pkH^9u4Nv9q15c#*{vf.:1[BD(X 57]Kǹ^T3&-K2{-{q=g|Ug4 +mGh悆|߈y&UR +*,,h7'`N՝6Ϟ!^xëipg/)zR'fy" -ccThE &16*GP vS8 5s3aDh4Ap%:7<Ģ,`T!dեPf`zz\p}즙uFP+7}VľT`L^#qj2-Ϸczڙef]@INrLdIBN‡wхvދo~8~8FRkVkUbt=)GnȮd_߮A:cgHibbi +`JKvZ}f P0sNT ""7(M:RI9zfG=SWȻJS`3i`jh~V0) 4hAW ן-R\=MRۭ- op.B&m=$ c]`wR8 +i9, +ۓ0SK>= pfXwqp{Y6PH5Fyf U2D,lY__%~`GbgؒٽIg=Lt'ϨK](#'q~+Ckn"O̿LGNgz;*c$1!n_>U9K0ZjI_Y(b%Orhr"xPjPKJ[k2\PUõ{x=Mn# dN_ɱ"N:(Γ%Y4C'jϚC:bG)HINϗvHb~rׯ򔡷$M 4AV e[ ڃ_"G0*eUܿ;@U-~C}.qfO'9y%9 :|Klt#dx믘J :?/<ľ`Q +Ji +W}vJEc38;YL:6iKd.hm,[!k=S ZUATNEf/,f'` ߋ+b> +!;XUi1^{wDPtwۀi؜%h2}~V 捽LJx,EKشw-9W'`J6%q2N;h#Q4DYё @qŀU0e+KRrD!K:Srv/'-BhjJehʑ6kbcKQؙ>Wi\Ȉ_KP|7cD"x2=1 u|"RguNSzj$6|V@le2 /7'^G^rnC!,W T;-)!K]x|:TSG4?|ʬlm2{:PX޸RoM\7[YA(Zq6q'N~rP5Ü:iZُJ~$xVQDe?O:NxJ`0MhP!vmm%B:N|\So4TT!-#jTw5>_Q*wToɟ=$x&\)&K1s[ -_aG|'~zn;]6kbQMA\DIJaו`?A١J."ֲ-=rb&j'`c)Hw1OZ#&1 Ҩ"J\絳pO3R5? +$ y.q'mzAza ߥHǁݝ >Sf̢^/#KyK/ ^r S1p$7'\x";$ѶG$z2~gN-@ +~27`L 8}HW\I֏yVtߐl^2:tӆZ5CE*.+1_5;(-2PɻB `h2hIO_q}p<ʸ +~G}wxˎ{n>T_Z1QV>%H)|/2HIR䦑G듖K$?>_AtUa(mP[I@WKg ( M\=eZdt+#t5 {ul02Fyaz1Cw\ ];?{yC. +HշmMz=XԭY񱀁$B0[_hN"7c*L}0^Wg7-$r giGL!D>H EFA?݂T/3ou}hZ&"*!f&Q4+rKy2'Lg-91rs1:D$-`INhgP$A&^v[BJ:eMx32'P? +#1!#$-)3rזvN.+ݰJs0j*BDg gͱqu-ZFjsF&[iGpfYrʠ+x-aEZ,_8hm!d+rPQ pcWVgpy v #2>~׎,EQx|1XGn-}h^&ws]˽8yoٖ{mG;<0^qn|F=Pwɳ:"Y)} Rԏ5f/ވ1W +`-t}n ppOǙl̥0qrirkR{0ߔuD#̻s%qj1Ұ"Iu I9@ʴR:@w,iѫxbq,Wܙ׷0XASop&Fi/AOH_2 Ta&F=xg()K*FlU\I"f ;}Iz*xO< +]gM0bO nmόGlee{ri@.NA**A'S[/ X5|mأziﺔܗ {6>2Y|!-,sی`ʌTl`tƑN"67iD4Iک@u~\d}%/FOWIqSH@>͇.;>*?ٶԚK +w{UfVYO +0#YtoG!bڥ&]Dh3c 'j_c $`PٹGi'B^o|Ehy(uYc(6ƈT8{5TTlHfxK:C%gr}D>cY{@p7:Q3xr<${g~Qiwۖ=I._g!rn'e~c'9q; +<9fԿiXG=)q=f، j9*eK2|FuszF`7~a +l'4/ /Moǁx" {hޫ)1n_T5+ +8*%P+ ջ#X@`ym==]D-!j*{0J疓]gmtL9oGN_mGpJRT>h|2BgGs=ś:a'9( ^1E&zdb_#Yu,rkZ>KwfKv݂8Ca])<s xG꥖uDUt7 h~ov7tמ*IxZ#y+0d`m?|35Gc=KӰdTҟqR-c۸"~/P4>v8Vɵ%~< 8"LG#ꈒ.ΆZꈔ yMC XxD + c JfZnq&ܹ~_nA\p 47&̌Y|nƚs nv 1*Zv8n.mۛ 6˔l~wsfꭳ#.Dvd]kd7pjU?,_Lbȵ|\ +g~*)R^h,*$U_wKpn戌NKU;v@k%!t] *x;j mWUOn8x-|W +qw=hnLF6_=kNڮzfQ`yTȓn*yEQS0^>f1uS^dࠇjqN?44@@9UWPDPQ?MR!?*m561 d7D]1s`,k\WF0#~8wuLWs"ffbPaX#jaɇ}/!&#z~Bϼ4$&ED%Dhn·80fh +~E1m)Zaf{\2H vz zAE}l:WjO|zF2ZN+$AKy)>Ք +uT=ƩB_]0 #2ʷ& nؗMkzH͖zG)G|/Ojۘ} L,G0cDۘLyWze)W9ӒɀzX:%~pپfۥCR? kLj )9=絔f Jn_+XbRYqA\tVc+;f:%vFn΅Þ6:˪]@iOz:x]L()t@!\-+wboZz,ah8Kn(GKw^{#G״}-~_C%KDj*8 Z홗z{# YYĜy[n@&6 PDVkLvL<2ch&P$YKUM5ג5 RhPhR'xtt&(jG6dKT1wWhg Ŵr#䩮;Ŗf4mAhINϬd겷l6{dH>Qt9_xXw<H@Œ0匲u;N1؞k&q:ɩvXy"YZ jDDl)‚IxB1E1u1BiLԭgu(_N@2zFZyH|SS4膠 +YR&==PB_+ 8:S#&l;W@Gm-KCĦ3q !mu}D?aY-8g$=3^!^yg!;S$Od07\rґ;CarGB9I`G¦jLunKz·ǰl7ONAJ^m6@&wdpF1 J}Te#oyjY M%gP{ԩ8>Ǔ> dzm",.RMlw83M)5fȻTH: ׃9K!" IIGlu6w%^A 8-tKFIZiT?5I=&EYZ>=磜x{/JLAx)jR)sdE4{qErz +|j#7_M]+яw\&P(S,VR leC%l])11Q&%a7^G:IS&sP*FX Y.$rS;2Lȇ]CP* )=Axyqgm#z{TyӚ&F8 ~T_ꤟXf#3ŰGF@R2IF)Iw\b(ѕvwu%lڄeK]vVmKk@eGn\@]4Pفڂ5#o \=34f$)00y鞵+}'RZmlOh \Gݣ.Ft`Q i$SLcCSހB8 +__f+ + ĢbdlD"ey}ð~7 L[=Ȣ,뙩8mض [* V-ljǞGcOe~+H#fOf΃ 6IG G^NL\@j )b1=hև";YO;zL!P FK<01{ 7GT'湙 Ikټs)d[/_ S`7n4`ȁPz!T Y8ix} +^D/-Mǜ[ڙ5gt1 +D|IQ\<:܊O)u a)XYzX9@%=<3]Ծ݀E8ߌouiηd# {Wkc[c U8A<="c̏!tR5arbP+<>gnd%44b^>vĞaqiF퉡Xy?^B "caDER A6};R:Y[_ žݙ LV'R3h332$6R\hDm)~pICo>A!~(2|h`F"@̴'cO%(ECb2G;1}b90YBCYt;Z׀7ϓ +. U?9WN[vUFrrZ$XQr "hKb!*=0m3% WF + e7LE=?A5K c܅g8z@; Z#᫔ +ybO 2h79Y|HzpR2T̥/t ìVF0=6} LPl*4oޫvl0ZF⨧cpk1mSn<6~JVmj;Ĉz42Š#F7%TM +]\=8?YBF˘gpݨhqmh3G܇Eٕqbr<"I$il%iaبSF "w1sF;U>o߃"Yĩ1K=ΆE<?3Hjx}斚_\QtζFd\| krBK -l(.c` WMś~I H-%hyuU$J<"c}F%KLdѶpX8"ͥ-s~(f!`FT`,uT0B\1Cv +1UR/`Pƃf~%Tq?6z0Њ{YSCSC9soumlAUsrT(uz0Q&QPInAOw=0J1#!1t/ K:/)}J#sUɗ^,);1ό+L#.d/ysUO>,#\O&Q3.:M4>zPɱ!P'e +|*54?279acrSB,DX@ulxc&>tV˷q(x^E?g~9Jd}eĄvsFenfC[cN)`.]9גyF ȯA!3/zV(;F^'0 wگO)q&O4\'n>gkTSvvcw"ޤ+)_\YD()N<%[Z4W4FWDiYʔ̜c{EGw$vk ƮC[2x8"ٷu(Yi9pRUK6j q)/ ץnGdϟEU6Ž爝awؚ?(s?jըѱ83y +H{W͂Dɋ ay+(KJo+eѭN.O@r3 +QFl"s?cr:YDƊ΅FP=ss{-0YfXNfH'V8҂yj5E92S:T/*+K&hD(݆'Qy +9oE'؟2ZېRѹ#(xgYF?fWP4+Q ?e;,"}Ǧ箊ǓB-'(FU=>]1HWhؤAx8OfϡlLE +yCm<>H>*1`N +|X^n4{8ZuS|/_9fHS< i +?)PKEv:b52BGͫeKJ%sy"pg|_# C U]K]8EWԯCcɀ>Bت-td !|Apȑ g5{lk,۴)bQ'DOa j4QOK{ZJQMw-zY_,!{{.f=kCb{~{Q05FKm7ճ_RpTZ&z:؁`pDsf涔ԋ@h}a ;mzP p=Z]sM8tIߘ>6r#Xj]^{PތW5ʇE1_h`P1KH;G~ daWK5M,hms}d_s62;b|~D[ SNu!}; @̹iD:C<j~A1n+7 +XXLFt,Ag9'2 P<^'B餘y1]SD P1N5դY^cVZ̒WK=zk8Щ<5Xwџj<zZB=߫=5H"!9Zncp0+F keꑰK%Ag[P'f A&L(:l1=jݡ=b&||yI%7h@%Rm%%9XR(fUhD )^eY@f8 g sA+:0cbK)-9hwmU#^L_|=L.AFϹDoncؾE#+Ա 9: +8>{$=+tC Nn8mn9lVteEv)(7el ((#QI#Qeb|J#b?l˜e9a_}VJ3F:b PUf%p$KgFhGd.j)kmYA^Z\9k0A`59 -m k [iT~"{= yzrE&CB7Lz(O M8ILtc0ALvV9nh-ˈZyb̋:8_3~alUS2tVdo)g.WCLSQ;ҶdH@Fk Ϋ'y 1, +:)ə^qdC{L?=h=D)V+:Vq,v/͢ d?ky$doW GzFh*Ui"o(\llE&E#9JŕW9_?IZ-"za2R6 W*ьqm.Wx;#v ?۹ZTш.W&Q<ȍOTx>'k[ދH-Wq{)Gn>QdBfCtmEO`!5?E;e2:3e)I%9%dfOk\p. w_8᫙edŠ;4>Hs}"x,VlvMNhbH z^Q9F>w>o]t5P*>n̟˜_OW_ â pہr6>2y/IPHi~6׷d-4%ZAjt6[8NJjzbOT/z:Rʊٝ<05O.f +pt\NrU;=X^vG>:,!Q81m9!ؘ@<ץ6$ms\nhv;;l5?YLf +%B&t]0ć*ycN)#<.fBEst 4򒒤xr/ca9C0OfiܼRx2 "<)~vuTXa{9_F>"FL2@[r%5# #=Ŧ */Q&:|O{+xAj=d#OyK< +?#< WV aS'?GZbٕ"BcZ>5$"~^5EzШq'fo?u݅.h9DMgD5u3J2 'v&ZuJĺ;[F)7<6IɈbv4w=C?M δ=tVu`>tϕTڠ L_{H/V\#GnU4'-It.u[9+Q(Xd},J =EHVo3A wE^}Lj7OajdzrڍGriv4]Wj@topdNeA5ou89[h?=d;U +Y @o|7Tơ +S葿 + s.}t$ݎfFZ=y<"ڡFPa8I;y QXϫ? QX*@q‰HRhP +@Vv4a"֠S{τb:1P^C-G y*!rdrWlץ.{ 2=&ǜ61= ډ@t4, )!s:iSD؎LZy%Gk&.H' =QK zƮ;!O\S{!+R3a8@)2a0u+2Nf:;ؚ/ZX9tm65& A<)•w 9+̋:jǀf*0vnv񉝏wX!Dz@vyᚩcv^r H#·XEHb'UsrZw h4V3RV`ݮ5>G\AyqzW!)p@oh_3CrMΉ0W#As=7({ޮD> ۡgSw# he[R^6?tYE L#t C`Ҽ[f[0p-e,1c<{Y8#G0GJC qV7헰G&Ҳ'p'l?@k\D]O b#!,vk?CxoڝBɀwQq rwz 3q&]$4i:28ͩ^`vH|'+`v"ܑP'xiiy3g6R>uE3w$j<\;?c%$wEO(;$Ѡk·,x!.ōnΛj/Wq6g}X!Po EAR23NTCO= {W7CF<'S<98Cm.')hx=o!h +\йaI HLkǤKג׷9{"5bץ>tɬSl{Lя;鿌5*.*Ϸ#Ŗyw-.vFL)%8BW<˱mo mwGj)&Qi/. ژ|Z t(.1(O&+*þD]˙C_NL3@u6;tALo3͛+ 8~)gu_hjK}_|3كSQ7н_D˾`]LVT盿1) <ιaD^O#~QjĖt=ط!ɑ7#V쑈QA6|9ÅLWY"K-!88@Z[|/°c9Dj5+ctHERy-LdOs +R׾J{CTfRdD@0;}WC.Ɏ& QJhh)Bm %EW7#W թp~01M}JJ#9īIuJ@_##3Rkw!eH p6ޛ^P߉Y.v }G}9_i<ǫXFN@T49`̰:r#8C{1|E':Ưҙ TFQ5ҁR#g$-.}YCv<4sR,]5d^^m\k ?R0E+Փ3P#\6ZATkj.gAڌfI$2Ktl%#ʍAkȭp:?7.dx/Z!QFG,Q'e;nwJIA:_%l"Y|yF)"B.P1#O_@ I ѓ'PÈ6&f`6N%y2Z+NynJsH ? +I4[w/6/aR%-9߁R 7k +]^}E\kT;qpaCrC4kr[U91uIYmbe]+XV)ms*[{ҊIǨRZC+Ph3O<T4T rgB"K<ě3[^W^DR23C%5`0 a䌟Jɠ\Um{z>Xa^ jBj򷄟{DPf~7C9:+qD1őD)\2$.W@ƥ>pW+>J<HOX= Ly=P@&=BT))Zl +^B&>cU/܈AU{*- +87< `]e(/v^16=i8+Ǫr. ,뜄mAskc V3÷45'!STQ)Jyg44ׄ!BjɐXM=Dǝ}db-lPolM7|y yS9sj]9 +"D g+ÂNab:t2$b5\#i3w oQ;mOPG +1ОCO'M+$ZT';}ȅJ▌J 5D-oU>Xl=qѣ[NDv֌pFdKT8oqN o^fN: #L-'zK{=~>MP +D=wR$^\p!' CJzQc,ACw/uF&U;O?8s Vj: &J#3 b2ʯEl _~nlш9ojP*(546|mȘԄՙgޜ(}1j| tn~UPb:"څ@-[4DY+ۮ6U(ʦ&4Eԗ,j!tqW:s0$j`&?K4)Sе"|ThB*~x}cb'o_]uH^(-:Q݂qBJNeWΔKO$GJsǙ˶jH0?Ȇ쯣oR߷g5c`0 QVk'\ +_+ +}K91:Tf<1Iݴı{Z!*;J:?kL+WODVn8[s4ݘH I1xcQ-8>OYG ˓o18K w0hj'6o^"ԏbJ*(uO,Ic\qoڪ$,9^֯77+>s&|U6ۂRG|^琙\{lw0{ &`oҊKECR xga\ +Ud~GI)#Xꏇ@;"kuĝBK 8QniBһ~'FA#+.gRK41Ϻ93feMbGP{[Н F\.L-R'keUJyG#_{\âaM* &~H%cf#[X7,Q>G)_OeνEĶ3k[~?߫%eģ:)ki*VQ,(nPf=@'>C6+Q_ҾU]`{nWenߓ4@{g<" + ܹyՅU_~П_@!=Dڍ^(HWAC=^C,7d݃9ץ$k:uL{ kqO_FD5IHbux3쑊h,w뱖&>F1Fõ_r6VjK>"B3dUz8wLw㴵WGMt=u/Ms4@w Lel}8zDq !W_Z %1kx%C)۝"uUhZފvgtRlE4*a/Ӈ/)eޮ#X-2_9{ՙ vFWB?jX\֠"7ISG):6Yi (e>〾E"ձBXp&5#r-qG/ y-,`EG t+II r=L#~]Oq.MpKIR_vDmDKP#ޘk:x}n$<3I&:?;@L؞A|~}>k{YvRS&.[['Ex8ơ3 88!G*xOAoD)W8;zw60s`wCgwnpp7zs7Gpd,΍40<{6OylD,$zB1Z75-Wv=~N8 ӏF#[ׯՕo +LrNK生_E}GbFX lbRsұ-pcWmte$BR @?O}/ETaݜ̗³>dh~u&yz`I4t3kEC1=X׋9}ե :լf@Ac1CN06`*~U}xɹ`y3 ז_}h!^j5@O|*C 6}{b*COet\Av̢> !*-gOB( ; Z̵H*IKQ^̫&lWgԜ~~w7c4]3[/}Mm/-~yd),Sm>VLSxؔ2"-3WD$L6r˷ezfvi,MLB4q +C+D"޻I+zm;|NeRx%6Xò29i詯)3R~"ڔ|-K1}i('2S!-VIX_x:yl`A@wR*9B!?i)kSWлLZ Cd{AͳmYE:EO{1ƾ>a%R[ y8Yrt:.3 +=ٕ}Y7vԻh :>HwYAʋfԶ-4|SQ[X|9 +Eӧ 2'Y.w@ABZ/~0bQ_|:٫: ( Y"}tGOA.-;щ-3#啇]HM@&߷:<wߤx']@+ wHϫ*PGo( :15>c@D'`nԁ +/y%^Af'qT;gFtYp$+Bhi +!8B#R!CbmKܕ!)ޚG8 -[f@'$2S?3nOm% b ?y|_v|ŜZcFG|/mpPzߺСPoOtehM+th4Ȩ=yڮ'(ˁnDv+jVgx gi䛄=+n8K[9{/ 5U*;0*t028!!_--Ļ5xi?>i;}{Տ8l/P$;w *&'e9)&ds +]!oY\*rV>]ل{mG AൾV\Fe +N(l! u P'aSwOWp~cxr(@ "sU?(**'`4By^x; AEE7խA3b(L;U0-x{+B7$*@KD +IxZJEC%~%m[L?^<^,bV0dI`&sڥf0. |Kv=[׋6U|uQBˋwY])BWj1ETcw9 2jAh9 z&[ PRaIEb8$@ΰ'1!ϐʹI?5 a6dwԢx 3!$gKQiP&LH?Tzw)u +,g7(Qj[t~ckzGD`tgb$C},^LCC**A8J6|R\iζ~+dA _/@60Q42`Im!,GQjOM[lZ=gp]ero˜ŁJMtn^Iue̲r"|C`A< v7\a'9z=Ԝ1n+K!l܉(!+Y1^u鞢?o|p !QRQ!򬾣-wCOv;r}"LlW?G_m+GS`Ԯ],!0gS 3Eځ`u^zPI}i& ݀wxҭ +S"p pBXcDlC[3$tQ(3D^tDybG`vX``)w6d;V\?VHTx*G~h0"c +~Q\/WxqN}&GL dEs7ZVZ(dUzbV;huϚHewY ՟ TiKcI(K{bR5=סּhI=Hٺ_ȓ/2^i;oSt˥P2(ւ.Elub}p<'gcB#!e菱v/BD4 s5.= iˌzhQuT{sg4%=~_1B6Xe9C8UX8*l[817BH{Exb?(1 < R +KC[8QYx rGYМ最њ𖻽"[Dh%be 3:`z p然C~̡?:^s!r%kVaFT)YʥU Lno,Y ?"VE[rF69]Zkms%'ȥ҂5 *9@]v +\9ݠ;chdg8!TrWvsAKTm5J.]33J&Gp$l,#(d-Qޅx7|ݹrz[!^e*`  𱕱3z5{)`q;iO8X!o-\ {rof{cuE+8uCxzh&$L[A&ξj5g]HרS=k֊!r ڳAnw HYkP&` +aEX>J̀2],d ?Sti ϴN@9?o(}k~jo2jSdA* RC  0&qn[ɑRH:Tb% _ݕ|@r;"ڄSȢ {ae,%uBvupaot4"9i!b׉ D!G2Oۈlphĵٺfi͆w1x~ lҰ-Qi !ԟ7W%]tds,B܌$#2c3. +^<bx򦜡靳N_>8~dNtm\OW3D{]$k|>bZ@rZZ,23)Ft +o=Yf"qN7h@]C9t Nhø-mlhf;~0Gh btx!nx3hy>EEsNgǫ=XWp* 󛆲msC@.κ#GfG\u!y(5\3WgCY +G DK^_\2c<{l{=i=oǍ鵟;#.'MFUWBwD,ٛk&CKhw|,i`SKŅ'!|tHN;4m33XwvUba¬Z/B:?2Ŗº Zۗ+vYw?֥4y<-#t^r(QHM} +sՑt +鰉 E5\LypCRo4'v$_~T#ٚϲu+nBYM3EM@^P|\jD2P[Ǯ0 _xFbn,ĺ/woxq:Oz&#W"AtG$R+Oq?1߁G]znDΛʭǦ٬|@h3e]g#ޮH8Nf$ +8R!WBBBKOlh;!M4Í$#oo*ϲd<e>bM9h;FZ#lM(.3(3e]t[UNT*Oq-ō7 TC 3VJp;KE>;@AK~?͗S^lHg~rrpbjQ˴KB)xoIDERߤ9A& D;5խ `L;q3(uQ$./3'_*(I1Ǘrj,҇RXW;DRO|yoqY,~ǜLvD.N{O)js1v`٥:Cg^zUnѾKS,XL{ɇרҁ>QZ^U nPGm"{uv RW1%4ψU'mZlC's"6 +qM`u +R +Ff Wi*Ζ͑HyneEs ح1n9(4MB4]\2rܓM_RDn-;BWNړN\ ꏬbzS=+ 0jkUrV IsW{R-lYmݥSb!3*#sv(.J,EbJAbY`m}(9+ϙF>?n.O>> QڎG:5 憤2:k:cC^?%`ONlzH4"! 0ԣM- + gI)O1 1o(c+Xw?`iE\5Ȧ#.OZDsc]4GÌYΐ~e4Aj~i=C(l/ +Ef1{/%W49Zj"0K^lC>D"Jo <0(lqR*+JMcp# | MIC&I![xH`+ Ԯj[3uFFb~S dGTONf )ZlClVW|@jtwNZiQ D%hYYq&}%cjo̚5opCy2d +4ŞG@k~&NgbN^&^߷/fQKFdxkoSTIw3X+c+3yPb2,Ҋs#v ƃ|ϖ|ӑ 9*|0;<9h2"-/N@+ :y%&^ҘI1r’7lxSG䋗bÃQ1RNΫ`%L`IJJ,+戣jܬ)s[k@RaQ:ЅCDjtj +QVJmyp{m# kǿxl~6zNm-ᣂg?"OF6-Fu}-Qҏ:RAȭG+dY&[@0JR5͕y##)S)6@ޠsas +,jt^J ŕDwKt{$Ahr ܅E~p}RB斦Tnt]UQ7U"Ξ@P5dD^M1mxGG%J)C\ۉOj?p*xauĢ!pC!ňЫ.eɬwf $وaEH_Ji#4EWdT!wكc4ǡՇVz_}heڎALBpZ&M [̱*`g@!^y*H6{`yH~he"=&-s#kG14sCU)WHO\m_@zgŮ"6sq+fQ"[8-W`bt6犙g2jFm? H< R:"cty9,UX\l4>rmzB+ O^ TAQ2O[0MP"hvY/½R{M2½_ +?AFLl>sP@iQoX#W3C1 C(q?mٖ3"x2}Ab-$z|BA +UC`4y0| &`_TH$dؖq &zN]#y^(2߶gncɆ)4ܕ1E>0J2L%apʩ(Pc>gR=Y@DfgI@nʸƷ@F!BՖAxEl>f1 ~O =חCȈu'ng4Ԅ5O +P-2$T ,{M/e8މ]cdž2Yij>VGc5O.O>}hy1 ۣgYKt;*ނD +'p\cR\QK.0a +$_CxlkͨGK2VPz = +]{5h192>j J7W+M~9סc<NUz$ jy8ȀNǢ[Ju)O#*0ŇV#wjFIn$}ckwGr$QмߴSo%Q#JwiGШy̸LQk患5䈚!X:29>?F[6n!/tG +Q5Ν{?Z'68kS%^]2? +r~F^= j 'fL@л "TND'+:#VW;+Q}"dRJZdr=kyľt/O6_JD3 C *3ڝk/Y뿂%B +b:39 R l u$jQ$f%CvB-u%yXRz旇#/l"4u*;hOP18%Js +z +D:]#5RP1B'(G\zSc| 6b۹ih zVUw"VvEӷw&X%4F5Mf#QfJd;Y~y Ӿo 8iM^31dN&*mg"1X<-("C'#%!'iȋˉ7^MC;0 .P*$ OQTH&9xӃ$AGBGCsibթԡ!vO/ ۢWEHɛN U>𦻊bæɵbf++ +\H31j> +`c \bR +aS>Bq2ϒz0J䌍+W}} - :V-Ës)朞[BG M4~"gi@7rRuBݣ*U#UzHݾWd9 `*ε:w*V͟dMHk:"$TH΢iǧMvVbkLrNS5D -R;q=9;~6=`riS2<.v2pdȁ"34dKq6&曯k +#}~12G ~z_ѹT;\غ>s%lc=3^gnSw\S8kU '3_JV ӥ^G)'bnnUd9?|W=~:x_G'BAT_ d)1,*h`Cd2j4+O}עlѯ=FJ{,MxO +< 8t_@&lɋ2,Kݦ qJ; +iVa4؛`>c>yҕP>GgKJ,`Ϗ1n!lvy"n[L6k*ܥL<PI.]blZڱy^Gw}0T-3Ҡ:_rG]#܌Sy0FCpl)wآ_3̢ +~,!5~";B*wL<o] F0Q]-KbVW<# Y\I[.4}53'x?iK\BR=m0%RFQk+VZB]" ve9X?ှv*[<^,L2QZSwB 2ݟ,dPplnd^ (KOs3;_ ׷Xk( 9'nH<6Wx(R-WGn A}f0& ~YYD=+>8Wh[+mn[ݻ'pׯpC pzb@z]mdץk̄-#xT +A!A+{{Ȁ\u)oBh.J%TF2gSKQ~z7}3$';b6m;` KH{-S,y-;&b!#9nݹ.eoLo@bŶ3?IC:kJ5s甊Gq.=0K=_HIΘ-Jnٶ+ϡ۫2ǐ߀@dʂogY "tD {[冡w&%[Mw3E:dp5u>T,| Syod:1YvԆSIMy.v(I_e;ϋ+s/?eƛU{Qxr|7OZެ^+vD+C{-TփLbqPMi_ݿL7D9$Ȝ,e.nHj*?q~Od͂;|ǥ7m o-=͙ n=ϒD&Lo; +BmJZXX̥Č#]j{ 槌:zuV1ʐ=G$ uZgcyVjVÃS[SG|mE_Sa´9D9 +LVKA;n9vEpk +;pa~MF'\K?ۤ,=z(Vܣw^}J MҝS&|@j To7ğ,NOlI(04-cQ!gˤϼe1jrB+H{?$-턮)ÁS''9Efq$1vf~#"jܽJ:JZ3z;N`5qhFQ יa@;Jjj! 5# Α2]}Ch8 ̏ثOJ{+ <mQZ;T)MZ,O8BŸ PL+eQaΰ?@Czyvv +Ş#u$Us)Yf a:Ər#ff{!Ͻ63ڹHI đͅL7 J/5;1'vSOKw HO`D;,fsrCޜ@޼8Aʓ|uXx;BTr[ErۘR5qyF'>*nS]K*/f@ UKKG*@o)9L&#< Z^X)h?1$\v9V4:orO;•#|/Хh3r1`}TC>"s ]GN{tN4䢶z=3dϱ~GoXͧ{* *7# 5d5['0la`@2`1,-R@s°\A킖'i4lQ郤o/[Hq_t[sUWYR쳣$QZXwzDG^U52W zH$vɪKZ!:҇ x$Aկ! H^>HGKxExBI[>U ?DAGlYQ. [rԤқЀ%ehNeqve//mb2jٞp0UHHŶx. K~Db=ƧmN˯ƫ|c!Q-#K@XGTw~ghSk`5[_f wW^K}toKR˳DÜL*rU9یd!n㧣Ţ7Gn .c](1IГ:t#@PgmIo^1 lV](@Cĵ~ΩFax '[|]XWw+&&~a1l[@J@ -?^K8Ҝ-~A>wJ~ym̽BF݅(o?zmErHΐ'(+>stream +fYeEajpNHJgRXp( ?Vԕ,|e#_@rUd!Ƴ՜7SFX(q +3*yin@C6GU=|ϻ+c "YjKygKfm~ADhSϻ߬%JEB%MlK`0J_!/IMLRLtcyVK_h$ Kp̕v;Sb7s6eؼ+sӕtvZvP!0Ek !ٍ|A Ibsez)+/(hN[evSM^:nqHQr Rw< * &cJu|Q\:w섀Bg:an ZuH<v:"KqOd .[1;^퓝=DR/9CS p#. +.qZl 8v zJ3jxK YqYTP4|7({Vl%W&S2Mg]iqAـ+YF=>dUXr9cUyYhQu(^HrW[31<2ٲ?ЁN3jo|Nt;rix'AKD>3{vu}8I DwqM) kMdjEwSa D%XFYAk.wA#jE @"KJ[&=>Y1M^С/Z՟-%,idC +E4(ښOZ^ +\`[ŪW%Bו (ydj3qj HqFqWumi~~6 _#Av vd!*VU}˲!ɫoڃK0K'g*q)^$70WmaC*>"6]ϛp0e}|fZTMblr}:S0;{o'-"ilLl `W'~SKl*im؛p*cJ-( 8j/əwL^|RBX +!y=5+S58ڠrD:G?TĥDaI :Hyl5e LImw2:fˊtN++tYўr6C0uڽ!hDX<1 +W?3̐*2{ZJsIqKmIٞ]2ܦX] ͩj|<ҬQ=e/kr<ճ$WU,PxPk1'x^WD7l82# U_#뭔ABx[ +ظs6&%*W݃4BRT:J-#э}vj8+";uT\MW3"I#!%֟X9,93y`E\ ιzI0{_juιJ -Awԭn +k.xU.hiDAQxiJZ˔3IaކR\w9GN7;Otc Dc:w ޱ)Ci:Lsm_o'sPjo)BED:SBȏ)P/rK 8 Z@Q$U\ɛZjA~GonWo1 i[_%cJ'nfLb:t+d1DW4Y!*("|jGܬC-o'MՇ#=vˣFa B Vt.d-*E +tK4 0$+ o7}R`9BD1PJ{Hg@V ԋ+N#;_Bi7FO:ˇ 1@#`ĺxŦ i +~Gx 9E}*2G'jfv0Jkq*;&5!oxK\"ֳؗ E8{_+5U/inq dƉ;s_ޒKUDvΌ=ȼ%X12Eh%;܂!t%Q3&?)# ucT_.52E2GO0ȲrRpDi<*J"R,z/KS ˌG?ARa7Č8#g=-Ѭo3~s;[HOvNJ&H;xץMw Paf~Ko;dU*r tO[ S6A : z'S$(*4&7DN?Nu}uvHud& ÊQ?Ȼf,DP \uָӑdWMe`^mR6)Uy\150Eiԋ9ufxnTy; U\2)m8MqӀT.5@h9PyI +T=_<:e51[ +f68NX[puj[D{mz9Y'vM}-zZ NN'Ԁklb( 3mf[Z!?u ݔ}Xha_tJ:C<8jP;2.@QU[Iй?E7t>^Kt}Tc{!*aWXSe?cD&C?Fv8i\wq#8|-M`5 3] +HhOg5! 8NVy3J28Qƫ9w0ҲծQ~}gK;ݦJC>@Y}۫A -cB kvPx^p@s"S#̘+̙zC?cu tT3 E!\okK 9* dv90ˌ'hԵQH3ԝZ Io LHY +~5ylO% +|W/`~`m?z |`Ǎ9xh#]r?Qwd̊%^ك_|KĖ[t6818}ťӢS|jQN@W94=4fNϢ4 ؜*]oG#yW,%ai~.U.x{2Pq/QvhQٲӜXliZmsKB3R^? ʭQfl̕~pAhX0ݑ3m d8>w3QL'i_X'y!D(U#Bds^c7|CY/ +q RDҔNi + ǰã(!tV:|ZszgiI3TB4Gqؼp@ =eO3ז&8i6TrtD讼6gd0 vv⒝gȥ;+ B @/ +,ږ-;'M]y([&KlAjD䓊`rݬR;Iq<~U9<&T4x|qp^ia)V!b;_!nډwϸrp8$b3D&v^t^R=H֖ ;SosUcTN^9ʆE,Bu* Cq ]s¯1?nK%Rr9*"Ͱ +#Lj CK@}yi$3J{kzYTAst\^#?^P srEzS+L+:;%)0߇mڪ8V9-e} t"EPRUn0]vJn3^H+Cڄヘ2A5Z$"~#bLWC&UO03mV5jBDi{C~OvM2b "3}Uzya5DC>\a/2t~WX~P^cFjzNx}Mi]@'Ѿı*m_ TP] S2iR|6/h7 ]?W6A%MAU.!^ qbj~S͞Wbj"0Tl#;O<wꄪu\ !SCك1V҄@mpr q묘,r[(*SlAqa/z esʥ~* ySR;v;QC1d*[ƭOqyY+<{կ͢kIKԙnQcw7N'UNVOZg[3؊2"q? *>|Axp;P* \2X/@S֟`Xs~ש_IFPh}mIG>ѹ N}!4]z(ml~?'{u%,~&[syq-<=K ,[*(^~W3L?`,Fq))# ZB;|Ug|v ‘MTRC.S@edz [378 ж]1]ĕn(82E8?R1l]ʮ%Rv@U{|FJhΨ ó$csVٰςH~KZKO[5!GcEsbW~Q?&\m)W$.`3PNB`G' D1f9%ƣ ~[m]{}@^_?u)K^V`LVQQ9(XA1} j73-"~'6ȷ$I\彞t,}';ahC玮Z;Z至VL{ d~AΆ7 tVPš+&g Rg5輓)>̄; -;~)zgRP% תּ37r'ޮMZ3봐l&)g3jzq]{_xVՒ9m>sͨv +r>{'me~:ELJ.wky: W]t>?*[q ؁Kg HbZ=F4 4d+=ӹ(|NN\^\7_ uU$ROa(A1|^ϕk+!cپX[ !=\$: +AB˼2eDSXk)/NQӠ!jQ !dp [N߅bb|@JЯ1qPaAS4a +P(3V;G%:h #І[Ksi,݄vcgZp5 xu[RPڰeHEkHe#bwmv*])&KSAe& KI8jxg̞ʰ&I \P=fǡsӚ>L*o^ +1v :tg\ @\O2HI5{DBE 4UۖOhky9W +!p3n]^}-rG\9Խ!,iw-T1J?#b)polkQ#Ls0O_ ]D{sz +ꪊ=:nrWZΩ}r:.W=MkqEs'!"}G G=8F4`_r&3ˢf;SrC-r"#%*j7c^ bgX#y v C{EyT &IY?C3~HbG:_`+#%d&.) v',Iq:C nբ2ɗcS5;;&ب]]6o xO!vlC0\I#S~B1RnϝbhąV\aY=cNO9ؑlw쁯5 `?Z)'i82<0h'EW2sؗvíƉNM +fw,1CNSjH_u&BpzYJQ60`zDZK3x I:݉tBGڬR:,U4ZK;?BХ"*EWbNGɫc?EjB`fԵPyg3AJ "UBe< ^|wfh^GeK^!1:;l<1;Q[itR҇SWG}Gji1;ec?G;b %(k7#O%+p=f9ǐv8%ԛsCK^IZ@xsM_9p)s?Ü,.J:>sΫ8aN-[Fyemh8uP5Dwx]k^Jo0sBt2({`sv8Ћ-rTwDw[|F2y>.+Jg+A}NX\}d*cc(4Z zq= @y{]\*NCvP]{DA"$60vZ%512(j=|1+Y UC@Gb㬂dd)'Jp!nER +[t;s0#Քne!\*$]Qe+bR{K ;59W/+CLvE8 \}2#oHf5d)ydD *Jh3х=:刹KЈ~$_O}3WMK2$F47#CwpK 73Y1t u\"|-˴PODZg Oa۟Z8G &'{9ߌmM-g"?ua6bRJCn؛ֲQpϠD1">%3ٵ GaϞ(>ϝЁ~&۸)vC͉FRJ䦈wªcq!OЎ"xίy0ɽsfeno.uӥ M#Yu@q):vLtb`d}CRzһy]oVq!Vs._s//C2x*]̎sPes58vvqY'pIxDwƁf8Qk;{yL:nEy&Jy65wN8K>.{pP#?a6Q&v.%WFA~ /"L}Đd+. )V@ ۂq-L3eЉT#Ci"l[4>dXϤr +8rLu(u{6]SjV%C =aǡSv70$JoSHbz\[\ރI.|l{b.h-6i+EX>Fu)B;POI02NWf/S{Y!$f&/Ir +>Ҟ#=brϷg/~/ }/vnj$#:9Ĉc-vt_ښxJ3!cjM5y}@(w û@sx<3A};0DP4)牲۳\,!"Pj-rWMYf%DĚZ>0cbcJܴxTGu>i/(w| ќ,(S^C_3!GE'z>udOc^VpAYA&s:eAļH,`M)m{R6#ڽ_Jfw0s=5wċ"2$^FvtWXC%˩ +-9Y[2n)z`iO%F=zL1-oooQf5c&~շI +S{Pi6x7jwA9S`"Ƭn~ZIl|Ai#6=^VpȋsaP^49;6 **!2DϋͲKhaR8_(\yQ#^늗,Q'v"OyV|.j;Ja= +&ِdꅫgE!dzKBж˗\QGތ>rܡܣ/ظ̹vJ~]ƝB-vշ;bNO 1 +6H8LwaYZsZیzlKL-n>J`.挞"ai 7,rsnRnJn T*ڡm'cd52R•mQ=0yo4+AH=9yULjvB[,,N)ageIbhjsX O]ʲ>ӇDW\ KuWHS@~;%s{uWI ٳ;ۃ`lm0bB" rU}UO.{eS^3%gq]GncL(c9̩ogl|p;QFG coe= GFib%ZOKžwi{sI,bvscQ ;Zd߸C!DjynVb˱?HNʼnT,txɬc;A\`"P띒 bϸ+ s2Yb )@瓂QI( +9R؜xZYnQ)tI/sqnVcLSyX.{w@l]ѿSiu Okϯ蚨#ϯ1c9Dg4)yJrw-G޲P #IAZRo3TR~'yB֟?Q;a Vp+f' ?Bԯ!sЮځC=ƘLW<ʲۦNfH<զ$_M\Q )O$ЩBa0ޣ]5! cI5h +3iDpO(|-5QD2{JE0ξI(*j?5y35(W. YU)~O"q꧀ΰU%<VSWLh35MZ?Z9 +hD<}Vduro+YCDSxPK`@n]F jQo@Ky?x<=ip"6)fىr-ˋD?L⿸7"ި0d-gPRvvOĬ[=Q2[C+jvx]N iB{T E'{1 -[K_^7snK&Gs.^U6B8#cPguaz*G]ᚣz+č6٠gA+3I1x]J -jV';iU9 )BpKN܉ GG\5wd-vXMN'+35ph驲%V[uS<|K +W +y¹nkw˂l| b"[=) :blK<'O ~o1_\v:bNgW δLe9y۸5k?]/@˓}2_.`k L%\5ihv$;3SÈܿM"?A5_ESQVsoܫp^!.$,A9 +:H5IG4.)хƅ9p3?}{ /G !U.tK{#R^~U4TPDF!1TRkg7f}0ZkJrV707j+gꂢnWjZn:O8!?yO}vT3;Ӣ-$&'gY+e-NjI|yLߕF5i_a V9B7$ʮ#xnts"F`pHqR +H7\C]=%˜15W=o%]b[E4Dj\p|=oC'bIz`{[p"3ŸG|>kHׯ#A˝Z&3@ɎY"*h=f>@HIR'}j %ы'J !FW[|A/PҶhH&d;q}%$%,ylva^)g#r1-gP5^SNzY4C"C"0kHcFV'/h=ة!_wBv>|36͹_T\!wx>W Sls@"3 +N,d&qO9'_ U 7"Ja/e?uNW^K[V4 6qr$56aU*GeK)ACﳚ(cN/B˝Cn IҐ|}j:vnĶ He =9"&1 "PYaJ( ొ !p:}Z%tN||*SI)(ft$ە4oZYy$zHcw^ۢ%gT#R`iWa>/+_YjcI}b-9ܙd/r1qqH1밥]mo5Q[ Do156?=ő8ja8 +mj(34̿=I*iP\ϭ8W KUJN?m1<`cvj/BjWRVC\>RW6nK;vɼkDټ^I{b_x mpq I* Ʃd*y%/ylew4Ba2 Udf7׏?w48kd\}ڂ#|Tȩ@n=>`$qɐb:"1rPQ[$bOAicaY2 +ߤg^SvAi +m +J,5l[.pA#(c`/T!k1}2iBse^@f8lgMCX*POH(0n jUGR׈d])d[UN 3>W7+)PEM-}Z 7SC?/q8} /ߍC=7ETȬ9W2D7De֕NvpjD4yM'Ѭ8I: +~kzps8PۢUe7mOHNʫ +Js%<2cRRfTSA{XioNw۽G +tu볈@>+1[.;y΃;ŀ=(U5A)`|5 Qηk򶠂=48WSd+hԕmFHsS0XYP73qz)0&y)}-D:+!(H'潭5U wԠP:Ϻ.6uZw*]nLF тGΦ @SZ 8Xmi/ح܋5ൟ߅qz] ;E| %IKpkj2B S楞R#q!9 ЛЈoٯoe}#l;ۤFX7d"ov=_s/XYX$7'U;:5e}9uWQ!Hf,0&V/oCE(̟Ct^V *тeUu S;GǷ}Δ>wם8XB#95"9H)~6jsJqw>ji'~O]$;y.3M: ^gp'ZE\ * 8"> rTwgP)5",Aɍ$N֛ *c˘݉37| +܋b<@>Cai`Uz}(DŽ? w1|@3 n {w'//bs%bc8 ՔHmAx+,݈W)W=և-G9'4 |=Ą!::YT:($U$:Jj+3*i+w D>bgwjѝ;8qMI HuF>s -WP\!lH}zty+=r^3#8 &;Q8)R`yF餵^<OUTּSp?RP;=2ǦG2}UtS K7ٌm{RljXaͭqnFBKL?m`I-T9 Gy$*Wu][hP+~µ83|8-@Viui o Ȝ{HuC?i 2SJ[ ȦVB9䠒y5:$2'RfV#\au6h*Kh@K5#7~^Ʉ,k#qxG;a6^O|> +¡h4ӦIUV@ⓧFwEoN>Ǽ.2Ab`7n +]G dG( !fȸq#!њNRx&K@"@5w2-N,"AsaNœ\@dM%-,Q'HTn{r4d#䢋;OuPX(zcm'R%%qDK +Ac>y-F$++刃QQ;P+?&D f +W}F~AhUn)(FB45S԰HĴz{t{a⺥vEDžcy!,P],0I!NF=[ļCf l-h|yDގWp߄Kg6zdܹ@;,`ck\QNKB8&zYguVߑGUM ݹWWB7( w朾L򛹧ZƜZM*C1UpP˾XUp7Kt @7cl2zW(3Ǔie=^%gPK"XyyJ4Tc/o\ N"M#x|k;e"p}XrڝV)C?Nn"@<ql-jEjAgCqG}5Sіײ=y Ό7RZ-WBZpՙ&JJzcuީ̂ `;?'`3k8(#E߷HOsSImiBZ*ƤU=4t-舝g0 ̙8PKK1dqKHؠx38@Er<˛O5ٯqܮ̒ YnL7c Z +^\it?݈TH(]=KG[qݢw`~Wy3g=ֺ@hbXjXQ2@;6YXd#X͈9`U7 q;0?!U%Pdnz +PG.Ss)* +Q$H{>\)]hDF Ž guyAܱ{7O 쾲J,V%ֈʈ8qĬȹUAwoAۧ>Ɏ)!t Wfݞa;="9/(G~Uj;/jSx_77"3!_֒ȯLiW~PR.`1n#}ɾf\ofƝWǹw _Q7X;7ؚRDZܱ,X+.%Do]@fl^ _.Ao{QTek1tC)]ZBڈ5C&(ذɢ6igR$7|HjZd*Bc+EAk.y\yK;H8kD8' +ŵ0Hu?C8- +q kb*i_kÙ.սb}~JK j (&5gH#~ג @# "v?JxꃂkBOԉfSv1uOlA iʧ¢J3+*&O>WԶ +|P!AoΧ}=5Z2̉2F. +Q W%1awB]4֕(PW-RpύI%UH4'utȴܚ\cyVM48="b1#ǽ%=C4Ϻ it ط@ 5|PEqXkmg!ĸ/hXS?#՟g/Hf&= +[$wΔtC䛸׾FfjHd-+<#D4+u]*Q!#u{ r3;ǯʚr{V /'\5k(,b` U~D]lzFLVJDaXHŅwrnPAFDgz45D0&T C^t"\eE5f35nR.U1+~ +&ssQI0eI_ORfz4M 3N3d,bkEW%CcO&8l!)piڵqUFp*:jP/TzvyI`7N@^ybqO{'Zkdu+Ɖ3BKRtOXݯ߉?\CjCCb!MMJgE׺Kxw\;vo'3j{Ѫ6¼1n aզI6<0Ȅ[Zbtb֪+Zt-Q=f[TZJ].6݄9i鈩U-j +#+=\T"Q)Rz[Y;ɑi@ >FSݗ?-T,H)gP4w!'d)zXj+lm;R5%~Oe ϴZ{DYa/Y"i~yrD^1%Re85Tp?eAp}`o]RdE%voq`do]IOW˭՘jծ(bl9-y+<;C3]R!QPxRLlAРOs7jt68[ m=@hwX +UET ߆.&sE2#)8EfkЁ\c&ih$b쌒%Ğ[^Cփ=X9VWl/M`nK! wwdx{ʙnD8W0\FĕZE ،9s<Z16]XB 2o3V=^ύYER;ӞYQ+Ó#h>;EvnIX[>8O\"D_a0XJUr^qPynIv*}ͥ} +ܹT\{S;[I{ےp ~~/(9A]([#qNW*]WXW܈'w q r17b+Ʌ^j[s=,K:jx%ÔBR +r1jkHyy)x}L`BK1D,Y7[=5%"sSQh^,`"c N}mԐ3rd¨Av!$6 7D+=M=|-1(teB8v a <~0Qwsv&j+CsFDS{:C{Rh q{ӱT@1)fVfl''2U!\PO>IhɆFEzKC0-1( )qbPELZh?I8bB_7IXFݭvz8C҂sFBY90ҌڦheעBF먅WD[Z)}o\AvlolW:7;DJO}G#<=zWo_evON"3Wj\9 ՅcQie>pP +-rޅV.|K SߓsgaE Y© +37|N;gkT3V>KBheyz}^+yr#Ȃ&WT<@Νέ@sIQurZ9+Τ૬ө +9rZ34_E^/3n1B1oOUo$[_?Dm]IJ$7\]_ }ҹZҠWMb4-h :b:U̔玶2gRIB"'!Ra N9_4h^ʵE~uIzm 6$V^JS](!퍽OE&m.lnu0i:ܹ~gsXDGFs=x^doKbjO=0@tNu(iFbP:BB =fGp>T':L!n' +5D]$9Klz+GEi<6e(jGIx;xbDdYjҢQߖA$9";דajs˷&5$9{ ;h wӼץ:6SRp)N;'S̨I]ehndjʹn%E=L#E@w"dmMf ]vUtAYtuj͙3(9 W߼UC븢+k'#BFzx.S¥dy3,pבv=R!CȠt쯼c֐+g嬻MYsn s+FFO~gpq`Ε'5y_"aҡ&}}!m{t+BbrH}q^tF`?w\ 4m8[兹[ +5yĎusQSc;g1,.i_n4e~RH)櫗(!^*!T=.l@G zj] L$ahnE$G C\.Ri\bBtΘ,YRc*A-%dzv}BBly%~fm7w9zr%CH ʜ˨˶oqE6E |䅧"t10G;" ;u09ƞ^ڵt ֌3vhi2x'wxfN_c~c Hh5>WǚHp33>3u!LOu7+ݎTPGY8)-x&Bg2CTgvcmy:R|hʜUu(Gq:vL7ܙ,dK^}P~AXbk?&!gSU6 U;/ට M)]Y}ϺԌ?] ^O11cds=CǿdtS/r7aU25M=tuө)]7[u(SO3p36C_iy3Ϋx>۝G>J֠kx +ːL=.[e56ෘp?%nxn2f=\/ j+-W8+N@滚KZFYA L3ҊmP9FݶiAǟrUكP|s8o=,(Z([8;us>]pGJt6)Wk\c|78f|yi^"߰] %KېRҙ`hxJ2ţd~A[V6&c`6(xCV.!hV#=(F?HMB)"p M^ dGc~&Ig)R.yчm˫\fC'D-mA9]f;d=eߊ9;NApiԥ>冁O9#2W'T"Po{U o7J?FQHukΟIq%O:Mw=!0EN5gM],ޟіuǒv Ԗ~q + U&ˠݧ Fw[p~}m9'\H B9QaN R3N&} +1fU=5[$ ?<˫Gf%Wt=T?PJkv>O O*"fE$KK匮C$s{G- +9ڊnQw\dzk9JiÐdTP@ SMgM)5X_iϴ$f'W#R{tR4߂}D{qyAJ[sr&[{G͂."?ȹnRBYUsHm~{ot78B`bݭk< oJ$-';H&(˗YOr0}(Ƭa^ m0+w'b~s6e'F*z0reczҕgfkΑ>ć]k|VB~RR 7'n^#׊T4̉_CbNDN-x}]j8wھُ([dU6=#uvRv3[S.\H< 3؊K_"$;V~(_PV) Jܗyãu?Jp͜{LowB*q +c{4gXیBڷ|O:9&-q b(IzpU_R>#b' FqApomYMWmrK(xcn&*%QD瀇1ECL>3%=[a\?W>+;;An~G`ڋp7eQ'ҊR}ƁVD̃kȑ5C3m-n1 ǖmfY!okM7u`QOD̖8wOϙ'\uUd={i 96Zp^a.{%O=`(ׇ9g_5nAߙ ~t1v A3)d*gd*%|2zIRPBܜW}W6`8 +c~&3׾:itC|a p!GVZ;XCkUy e{yҁ\Ai٧%+8-'(r4Jȃ0U$$N(DG yb< hD2 {kȑ)$}{E9H)Ag5I`fR`\T 'wEվHGt>; YK+jeosl}~1߃*$8oZାVVokfz$; ލQt-!uW&e*0zbUPLٴX~&푵_Fa}n;j z.Pxk7'x]\g]iAOԾuV.j/'ZzLn'_|)!,L jUYy; PHLToq;AiS,2-Q +-148C'>fΨ-ʙ!2EU?zjVDVo +jVND T|C_hc.Q 8.aWb99[*F2!z&l&|ܶH8S!g HZ1p稟9lU.(+<֧@QN@m:>#$y/VWt}zsȑcBagܲ\яX't) ՒTphugLC3x*W֐xoq ϬCA{{[gh&G RZ5v7=t"w?oDۆGVcPXzaC#!7+QHiQ)oVoڤU-RdC5jhx!@#OQm-5 M<4z ͈{BJ 7w Cz/v j$&5D*CjEӖrKAa=Z\1#%N^h-JA"b ]AzZ8-#FE'4=C57WVm)y*tt3Z8"D):g(j3!Ⱦ +; [*h!&`/krBpFR x:;Pb`1JD%%aVg{h6gJ4bg!Jsѳ/ֹm TN3D''jkVv0d`DVCcI-pƶ!S٫~]G-%ke0ydaCw;QNѪch8BJ[/.عIEԷn!~G:m0mG/)lص|5 2sGrkՋl;Dꓸhɉp]ȥK^,M7X[roZkk͛卾y [-~/CS*lx5W؉>UCϸurp딗=FP : /;+YOqSN /g^hv Ėv<=w_5(6≂jHfVDmۋ4Aڈ$oD5yr̓bpAW U 8) +8feve3=O +*Ac) CҐǰZ f{D ]Q8(+i Iscaq .# {EEQ$SV1$=wѸ#Vxptz7j=4la3m7|eO +CWO? !SD Sj(Wr-mҷo?X~#-ŵe.m˯_kcFʮI+iL]\"^el.ʼ#m`J"KAP#LLWNcLQوCRW RC,ىH'2t:Rt DH#hH]j.4R2 qۮJ:*RfΨ N8LHm+ƽ$|#~W;(woZd"%dv]bbHH®KAu?![z4uĚj_&8 K]_ۛQKܽ`iE苏aqDM]MϒydrR<KGmnK{ղNZ"njH? 5_o +yx+F\jG3ƵIt`TtClzCΛy~9 +9^Wfx9b!I^(5hhk*_I8?(7S ?83"^eJ F-lP 2!bU?Ud +|ǥU_#Vp%z-*́]Ė蜿[GWkqbx赌H [J:#fdHGp +&ыrc'XC}y%DH^E^А~Ip4 emU;ZZ>_шsMNw]=W&IbS7Ϩ^;D۪݌sՐ?,fn]tw7?,(*Lt` ar(cie:`^~]dV0ݝɱIDxZFdsw,S\`輁gWOmSZIp-yۘ,r!}{}¹w# t-w:z"kuv$1㜍TsTf~!N+jhW~CEQ?!Dg4JG9L %gGQ[MGt;@Q[6Vy"fJHUN|ȓu-8ۛaCB}.uaMVvqGu:ῒvQ !-JKEv|>{mJF8ʲ$x= rǟxd]C@j?J{ܱUvKQDG~n;m_$LWҷ&nl)RźDgj4)~& r/ˁlEU'uEN2k[LJj87WSシW1pYW;,!>'a֍3-U?3\'#>±ijTGUJ@ù^Q)Qœjk|Gq˫ŷOW-Nyp̯Nq $ +ɯկ rBH#zhˆ+z0Su%a%SX/+gT%6v:c]x=FRyPvϜsH/y 4lP_s&**S5Pd i=jCi[&9wZv+ S839ͬ1h*}EΣWPOD!/ +lD1a;3 {{*ǟW B SH&ʼ{pQF#D}}Zg'{ƓvPK7䉀i'$P+RNr#Ym:4%Ĺ@_pAew%R5d` ,A8YtT&ԣP'Nm=f u7*U xgPb]z_^%db>L$`l@xӢO8<#XXu0`=evrOE2!l35sDm40V2k %g#oR M[2eMJǺT8/e>lqiY<.W_Zc:VN(P;Ud){->0gW B[i[{!vBH_4IbՌdFD?H e_CH e[v:{/m0 O +3UMr~I+@{=ݯb`Ut6W" vXəg'!ˬwSt1#xD4J)h.%Su[)j'j픳U*oȬ\ J/#tȏ 'N,>S`SE;: ^( HH2ޥ N7V/f$:然A rn!fHg8"Wke92|rdz8OR_hICHm͒BӚJIک/)G#!~&$MGR7!8c@փpGJF0_ lds5U={8ۯ;\"p?,Թ$$YkbtʿqʭN0 @+!:6F EC&l򈾃D8n Bd$8- ay w?iI#3VHuG;C~D}@Vׂ AVYw:(ːVM<㽣@Y IirYeҊ6ĨW=t`3@x fOAdV_EjB_S}"yZ? ŰUoT˾5YJbQ0$h3LCђ g#yfowrsJ+P,lV׏wIjjM:i|<'8GF:S14#4j BvIH&q6R\h"ҢA]S'`ܱ ! .oa{WJ.e #d !F֠ mI"pkRY2}A +6vyY-s\JO`[,3h/蟂k@(1Ψ=\COaJ pV DYoiYd%cTƿW*Z%H@" ԥ^BGD6 ԼHd[X/JgY-;lXX&U7 n3kf>OGHS#BTM@<;Hj"+EtBB\|_MrJ˫pVV3Z׹**EgT5(5!`O߰-Xp}ҡOةsdVKl*)\4X%wm^-Z4q)50 u7d#7iT$fhb"#ȇ}nÏോ9mu}I"  ȓ m.] V'|_ca!Qlg=3$۞HDP<{λ6شFS()A6]6B|M#R4jGfW2*WE_ͤ.2nni"lvBwY %-JEOr~2C~d[Ys77v}!@&ؚ@ +\O U'h8;Wx~5:CŇ8kȣ]fŏ>/ֹC{hbm:/E&^JEA?žHtRM̠$v]&;pnfwzOJQ  EUȻSKaSb]/44C2z' fbszXg,J۳%mX }gnT8tXE8TR|D֣@Ҥ!DwY+R` ͦ#⛾z~E:O9 +u+dY?zԽn[tlu,TMIT3TνZO6rD +v %|;&q:^z4+X..T'T^[2[:1bw[@ּO~D끌jN(nnԌz*$jɂs jB\sSZ] v:8ȉ0ė!`zE*i`VR*z-NvG ɭx4GJḄձs\ܴ#o;Υbhw}Dii%"giYeR>5zMҹR+/N=s~bc2p);3csKX=ybg:|IJj{p(f5:M,ڈ/ +p5;"jJ^Xڝ:7sA;09d>7IQJtln)wҙ=}Yc3 ,@ +[~%J1 _ВUR} M _اQ +ϰeW5P{ dG5)*, v]FKIPwYsj-[){#J⎡S̕D7 N:CGߩrTK4 C)-0z/tYœi.L{_M\mIQ˾dz|T'#oU~.AQ_3 +|Uxљ|G:?ƍ. al:<7v-07$'Q:{spz˝ay$gqoXyLUbxgg8*7R`%xT*Ð^TxD\ߓ1HQ7H @_ +R/~$YNuR`I2uY_nu1~ +nz$>_ M-s%f%&0ʠy9R*D7'"DU˸Թg1ٶw1wD5ZߐuEy䐾ˁ@ @boNPsWR竃e)C⑄:'?x +JUG@"A-j.,yL+z)3)T >QO22Ʋ 9y:(C) vw.ٍe[@GL颷JCï&SskE3c gZ)ɦCRc6DN>+?b蛧<-3V1ۂ4,ϱ*h5x^fB]HR'ׅ6>yߖH:Q+4? + ?j DqVUo-hū2njKT A/?AEx(qf;7>ղ &c;gU7MJEm +Q}I7aDj_{oٯcT6<':GYCysK,A3vw}. R$5 +S,6&7󕞱8 AQUfA |WtkJ/) 1C`ubbtiVn">x;'V  s۹{l G z&2DO/'LxA +XMd_N$C7d}p#nZM (ܕ:V'!tl%rîSb1ӭ mpPd=׷V}k%Oƙ~;./}',ndv42|AF"*OJHE ()9CzweP(G h]64w)]{HP3dSWUuf)H#e<\Zlj~ Rԏ7 2bv,_)%nW36)M2UtvEܵUv/^m>}gߘi PV<N HhW;T>O' +u"CExtq0 =`yޒB +"{(c{ *XFzG#3g@ dPۗҙgRs(?~ ^4bd=veFV)>5E‚nts4]tqhiv- +:w|9SyFĹ`v[²4s@Ɋ+)!EO/"]D8)^ b$iE۴QOCق#(ju>'S F|{]xQ(jEkIɳddv"%` QϘP ԇ>? `G[yryRK>!;JŨJh o7R_A'c)xJ1 qkhdq +~7brTe"c(랋^UV kVw֫(N\TnKг'k֯򻺞U~_4lF׬S9_.{灴^66D܇A=$obs n_c[=I'X';geԄ*o,UG6mX.(һ4={_Dz#6O/s,?]?^P|Յaj= ն +F3b^GJfU$yFZ +ՆuUocZS*VcܣyBZ۷oʉ'rp`x|br}t_yd]=Jءo鑉zC)bsZW<-йJB#^z#)"!,q2͝(z`Js#oVE mZ@~1^U 'jYM򋩦$[Dg ݑz~_4$[mP x&>4iQ\ih?P(XDZ\6%~ ?ꖤs δ2GǏw +nN(r <Vo٣HJW[ʪO "qb>8^U#Ecӌ?PB2o/?Qs7pR`y fuwEcK|po_Ǥ"eݳq ^OZ?Ս߬ޭd.>a@:RȬ 4 h,pn9a38#$w=, C}^z˦ Q2C J SwE,He'XUW8-fVؒkg`̒O}_D""M⿸+;l)`}"ㆵl+|auJNvbqQ[mOGa*Z?{+ZWg#;a`j>eTzEvP~L/XR#' w:x9_6Q؈A3l5_=2oV"k<<k{0_^M1]F18/Ku \8>2If\7jT ҫKgylptGX}67e'!>{C@Yh=T b<%b|b|yExuE uU*_Vs}0ȭZ,XvN!;Fޢ9-' b1K %# {L6((,<oLTNeN<z9WމV}|#PB}Xwb 0F|l4GSr@pQBQU.ތ8C~|h)G9躨)>D)c`ܫ͟㼻|48&; +޽.N.,2/zf@&aoQ٠sͷohR|B?w@Jn(jsWu zarƫ3ٙZB$> sR"JT3ai~3La֣C3`!Z9CsbNI{?Hi9 b[(ƭ;82σs'LMY0+}^˓gƂQJ4 ]@X}!1Z<_N&K٨JJ#n~i싮Nz/ޢ"(\ߗbmKojFg[4@*,ژ[QV_!_QdRž.AdonӪ,ETrX`^J+vPal|&]3W!^QnJ[ylxp Ѫ[GGWNjz* 'VwfFf,fT._\/447>й^nVOrGDc.1U/#-$r<{铖|%ws B ZN`i.5hd#ΎZH0\9.͘2GruN>*nEAbԄv7ICJSMbf)YHq_r1sPB^CZ3n(޿Lp|M7ۑr}Mm] D_|;Z!^F$]fOTW ih⩅Ȫұ-ɟfhy B^_'se-utTxr'>ȊՐ< +Fn +/֫RF>O0A bE1ZzH{$"^tSZMo-Sk_{( +?򯲛TbN- R/~% \-?/73ob;kJkm@eE$]W(u%M1Z +p t} Z&GUM?)Selqƪ} sa 1-h>W턨uאf5Lf4̾D\غ&:3Y7 X>1Z7 +ب;8 ,yPNŻf|5M {5k}XAΝ&%uG6 Lgs?`F/Z5NcLV5///4N +2U2u%wSsC b1C#1CgF[ +:mc!5j ZUzrBhȆdA3si/I7Bo"*sQ8C˝:?Pma[Xãύ9/:_M-K>,JBI?['nqB6o 7,nF!uJ:D!wQUS39K.㎬5Jv;. 0ߵL +n4Ljub25Ss}|?X1 g*DwP.ǜ[[?MwzIj8M)*mXs_cA4^Vuyö/J.\*XL:ňOy + 8[ޒ}jQ.RP" l +'?S̾{qCٵSgYP!{ЛuƐ|g.!?>1Y!޸lp>р>UcrP?9ϗY, +w( Kw<ݯĦFXU":if\z' !BT͟J(y{Ǚw*zA9bȮQ'm$^Ruŗ/_DmRâvW1MQZmS߂>ZXSRu!]P{ yhh]UF+Z|P6.3hZ#2Qmy_OBș)Cp1ubNe^n%Üctx`C+;hTe #2YWSŖsqD<N&\45x:>ϴfSxscþMj!.@kz%v[toy9L*w. k ^"\:BDxT*TڈURQ(1ナmuhP3I=aC:cZ$oBHy^-б6S%j5DtDڜ@KI:gh zxa-y w2!;=@D\-H.N- +Zc_wI9[<\(=:Ue%5S}'/ **~#kB"buo-D&M?wi]`2DrEuywUFUV0;l]_!7 :C45".x>^ DqZܮ6Q$i`zQD](73g`Sc1RA49$(GqĀ洛SDnYpƧZSxViD;Kuc:f^Ǒ'7 # ?5gMm̠:Y^Hawocl֫{Y[%ojOLQBas˺2-aɂ֐\yC3ꚸm5q_k6Rנl~Fbc"]lOs |bX0}F~E d ~~;bK@#6!g:GEG$_LT!m">c^c;^j2*dC1egF'{18'û^tU * ere`V<O},W%iWttbt=%i2X|ed"F#N ]Hz5sIP v FȒKU!nՁksWj +͛[Ff.O[\r3`r.|o4_H9/XC.{«֫ `<fߔW=.ydp7&Lg!hSQ RqUI&>'cy+D ;Hx^ZG\ մuO,K숙j*ܕv\ g_t MJ]w&J@jAҗ;{"Դ)u #LK~c ʮ":Qd +j3bE]+ Ssډ~S&GRZQ_UΥ:F ɈruЭCGYJLAGȏ +pu*Ü![F IQ|[_tWٸ堹ie[~x?H?zKKALW_(chP`g|~~vvÒ~ϥ_iĕV~籊:rɆ%_\!pwqdǫz,(‚Ŭ+WQ%7EG}sP"s\N?+{QwZDґ3= nؿLiG+,f" ^Q7Zʳ`P=c5O$fݪ4ݤz*ffat +1:'BD {)Bh*j)׸G2Z (!5|Zo;R Fo@5'RV-|MLe`@x^^:}`I"6 -g~lӗJ_j ~GB&~vB>1U2f9B׋G|xKsU-~<&_3~I~EXPuW#QW m7/5ܪM][^;2z~qYV-8W~M֊OmG AF${-I {gom8xomK;Ľ3sp'1jHn t(߂OYvc6Q)-#:KY]+XEdk ud!!,?'$ȐIպI_z\sK}˦>7.<71vPG [1}$?-/?ȝ̀[ؼ0f|B󹨩|+υوfLQmw6|ڇ/*) D#jOV3kGo6y9lugEI 0_weVCƻF|ґi2>Ne,9ޘkS=r]ʃ{TwDV=vg@<ՐlTh}>O9=Qj c`Y}A2>}’^I\EQ1 +qĆ}'ْ΍*h˻"!JS0*\!YBw*d|Vh4(w(3oAʽOFUHXz-AjozAWο:VIJMqun7G=d^&M"~/l΃#gcU.+\p +'$/DX^0t' `s% Ga Y̫޳d>j'B7s2]aNAHﲳ;bR !uxxKR) A@EoCk w[C:.g1ΕsSS/~ş}$_Ǖv^9 \?{?~m?Z$B櫠vBb_)0ZL&0 ?s'M:23/. Bz!۶TuGxanբUa V@,qA`=,649< \1OnuE2>ez U"(tSbn->om{+*25IͷRy|\!VOp&j,|Jpg!^˶Kјٖo?߁´.at٢{'y_^Ĥ<Ԗ(d,ߊ Z=M3Bm[ڵOC@Ψ6#R}u*Q!sOl30q.hseGɭRo@@WIE~Ef}G7*2V$5 JV9*#M{r\ΦovG1kl{D  |.qscwGJ%z_ޜU⾦uV<1u12?8&\Љ hݰ~lUԊ(mG2h_v@[2sA$h2AH`#^h6*@{u'jTt$ޚfE^Ziyg?;W˭a +bHsC=mc}Nf3\q$3;jR^2<˖Ka ="%rK &Z)1q؜OjykOnL d8XQ4Y}"e$LMf8AGEb`M;e:k\|0l^# =q-l=K4MnHl*HWA*P*\g't6z-T8bO\w: Fa/Cl0@홐!75Rp9V֌ډR8jSV`F uhP0BH(;)㭫{܁ [ACwZrtb빣$N^[q5^1vQTJř{nuxWuc6!7PٗܦVLe0d\ 6GXɐkb\C*Na$Vcكy` @I+HxE=&H!GPs#(R+LrNXUb3/4YfnVs{c-FD^XжChz(VJ +lBDbWX%|~ HWv! mzh@a^/0X=DQ^=&(Eѻ1gQK-`1O]Qϐ>Qǎ  6YXX3f1E{r̀W@[$+Bcv㡩 qPRʉPR|*qi<8.)B$?n60f9FdT&SOφp75DYb{]Fƛe`XC6s;!\Z e96|)3̏Eb^ lj_x>w awo_C(@S$PN8 T$ #23od9#53(>0 Af!iq`Sk?AQzOD+Ǚ{ǁL#%7Q"Ŋs֢ QmռH{PjN]VwR kZwx~j1>)>LAփ\xȷ{"DZiHiG򹡝EJ;~8]hkC"'s1XrFq/'URІ0Wb%Cx ̄D/#]"WA >xHX7I9"ݞs X_*a בV=eFY~} B+v$2g$2[H:[ ap "|~pBI5,H?>zU=DwH JdKMǴ93)F$`2) + OƸCj)u+thpߘ/1򍱕5 ּ_EZx95/2s%Rt>{x+zg6<#ExrP(]F~h]<>TE#ߝ#EםhLڊWpq˳QF֫tܤ9WZO)UAJO1hUEYwsΪ:O2[{EuFz1dA +ӭʧeJ#@jA4 RoL eA2K|ŵjp˝fGӻ^ߩ=U&Q5q|}Z,5Wm.UJz:tUS~ .F:'6BL") %[G&"#bMDK}#y3^d57ȯ5og+IFP +qn+{= +z/-U7=!wiB?ep +G +*bbiбcY ]Oհ30,VbN5"QtW5@,٠+#iEɚ)n"9 D!rKI,;8! r6sQ=T#nQ P b*it$zk*[Zb'OCGFzhU2{h[ITOqD!/ķI~kHml=b/="<i%O9a K殴LZw\zr!-u4OƁ2YrN:@M3Q .g:rq@ ȶ(IG< '䠵UDal~XFl QΒؤ;8ːz'xfAOi(SQ Xkui {ήl 1TWu3Xo|5NM*O_{=$Zѡ_vEt 1U +C/ow0C )9PA& H봆'50H݋uA"C4YK+%Df{"("lf6:WI:f''o #)͝99jJGs2k(DSG& F>B˞"E~D >l?5h@E8w`殬$ +k 0qq}G8FdHs'KN 25t|7K][T3= +E\grAPA_>5s/tWY[翼1BxJگ@kDxpclg33{I"0O`lጽQyV80094S_n5|u/ -~,Uj& `g:gVJzWCJ&t^"-_nm#:KK\y?!vqHxӵKȽru"ebЅ'qYHߛ-,N#qY|@: ZRM: vKj>!&PᱏQЫe\f]j:! + C-!?%=R+qBdUu4y¹U ^p⑙;#sO s3jYi=ĸ B" m}* +OTY&H4 ew]#1fTyQ:̄= uVht&uݟѓ +=bo])A2-w5W:J^q>6y[OwNԊb٤ x 8JW~YX<(Muu1h5jRuXJMw'67[B'{ܙfqgD=KQe+CNLmᬇ"Z7j*%[^j{{chԅxd<)=+(k5\@vzRjG*/\㭿, "ڞ<8c`6m} tHD g01O4_D#_ +gZNg}۴§.ЮWšʍ[,b3< NG V: *w -湱tCv aͩyEBi~3tO_%_ "_VTXZc-'R#7YZ'c]_8H[IJsLkDV](\Wh3h9Ys6<>BT+df +A0RH-#1S2q.>pTU?:y~uju=Cr12&pan7 +G BlNA{\-DK#UTУ*u#nvN֝%zP."OQy_l-@ Q Q]H]*`ޥ/Zށ +8pD-5wcO*ZBw`>n`Bt=^CrTjqٝ/@i1óPT 4* )kfE2dנܩ 7:.˚-{`t+i>s73~d)kv-UCRrK}Z# BRB1Gl 4 !-m9XHGTpnB5ݙ[:42J'㛘gc7_cV;T1{ "7t֨c,C vҢONQ|UJķC#-aPcǥQM4ӌbMvÐpD9$Gt=bMgBQLlhbAqk jf^sV!gT!׆M&ҿ e{crE/{ +s[J@Ɍ^R49p@ Qp6Y8Xd|1c4;i.pʘb= Hen=y+R١=>Hso?w(3*E~8w'P2~譸w)"!,Rr!#' &J>Ȭ6q4:uINsa+3e-x$ oE/U øfU?j᩵,v2B">CPL5*FA˜lw4dW{F\iu׌)XiZoyS{U+?7'hm/"V@72V³^6ωEh-nQkn!![753",_U#F$3Dbn<~Ů,`k'AY4t &#TrOM}ުagڄ8Z̓ٞF\Ŀ$hG-d쀧 m-ǙDjx<yVĽ cc^PUB NuCCt1S[C59d\8;BPUڢAE;+ԛz p0ԅ af=7_GAxD֭6"(ACM1@Է;P\8wv<.<6un "/{yb@#δa A]J>֗9?R?CJ20;@$E>`4kdҦӣ9'Zi{5?1Tdm א¦l1 G3*U!ʹ̉;&y]!V=҉a׭`D:C۷8&D_$G(! E*='gH,B6@·_T؇+ukƈǍ(I̚Q0SĈ1j^/N|zeJ- qCR ^(gaa=Z[25HfcĜ_zr"bQ(pNg^&:-PI ,誕Q]M5,yX=<]}; f` %r$԰-_Mݚ:jKqfﵗC.vUN`"ͯCnI{Y{D*F.]rCUEo45x|CDܒ)uẂ} 5'őT]G 9^% + l"YݡNxpÄ" jgI$v.j=ugxO.*i[Skz +U֦ Cw(fN.1.gPj:3/)>P5s3wR]ﲩ\aCDD~%S\$Gʍ<%POxOE9oGJ#myQ*GM'ai3Ο77[#0hnv)Ȯf!lSCbB 4t8 +F08ɡCO fNV?x)AVH +:Z/󭿼?m=}Tg~TC/smU*s+C%Zz>2m\#<Ȋ4=s̓* +i^i7MqpAD!g#=""-n^Wgms؏Fv +82;%== fsP -/+WOU,ϜD<ܣ3I>R=gfL-@sܢ\u4^1{7?G:3h}|o)a|29ݣaV;G;w?W%qsX 3QKч['8DhJ:RO xg9Hyj߈c,,SM_SvG%{bsL&GJ'N\u|5 )Wg~Us B+Z"(Ln!@2ulj޳"aEPeQlA* ֿJ} +|]ZuTO=+JU=E_PÄ[io%V#;)uAIݪ8#?O#]kJ{G24vTj|2%V[2'%WQ*oVHM9kW?R12_Fcg=jjF*ךu>7gI%GVOoy:@l#@JʸN٫*=+HTCi#f18SkA%vgZTh뎟?Ւ$ R$~BjI"eb7thR=YH=3$uu0-cwdC_xGzZ[OQ>pfi؞V%n%}"LtN3̨NJ*GA3&[*mB輎Vw׫NSխzDxj h4S -< 7jVb̈́vzDФ4*e@ƨUCX?/;LFZ]d|&fq4LV3729Vt3~Z2Y>FV 3Ϊ+>|B]}!dbz. [G+3ã䟨DL hԭ9wrKsS9ygB^!xL7r,F |zпj9)}O)ȋ)W{F?TxҚSn>u QB$D"FҎz * {Vh2MߠT;VQrݨbϐ=l9$HLcin57Pi; Qa$ *>]2Mi`NK; pTX;y=~"6;2@%m9bIu֣Sl'AןوP t7kWB<*0՛nGe +=+ye:x7`{Mhp%sO5'АAḳmW +|)Ow + +s&|XBrT8}8ͩxQv>cb>0] N<3W"h+%CsKľml˲ua<`Bdu3,DDF~M(~OG $IzdKy~@>31K/qϜׁڢUu{fuvx?G-e~/ѬG)hW hS1Oэkix-D{Ec ;Sd ?3Sޅs7 [M(XD 5b?#lكm Y`^R a kVe·mٸuz_G|z! AI˔\ԮtHpoX;3G3\fijB\|Ů tC|{v#:W)!|% KRbS)su~`xO?]nv HH䷎tJ:!Y-2OīvB+1#Ϋ7t#8)Yv+ n\GzQvґ̺ʓ Xc78MC\GՕCO*^Ƽ㰴qg. 3J>gzk!܃$_ Sg>? $f)ʧ;:; 鉓h,i9ȶu̫#&Se!#'Z:jsB(a6M C$[4Bg;Cfxhpz{֑iυQa b%(2M E +h!f&sy  'Ж0̡\JtP-10h)æ9kK#.9H/a⬜_ΣTB59+=V/vNfxZC$icaX-)ۚ 3U=svNùxؚtK=@@uCkyJ]=0|g|CS2S=`Evk,WTI V0͆,~Dsj^MYs#@<+3Cq!t`ڣj>(U (["j,' ԹeGPfk93}bRoud#@67@vwiww>F9ՉFxngl3mC=ew+ gE*:2}#RТFI Ңicv6E;7|Gh%>mg[)pi%< I;b %RL>}-]/FOD3͟QvJYl5(FNu0!$"ک9i ԝr]!ʥCLRP48 +H2*7OJ(fH +*#&'΢a&͸ 5vE' K?ݵbn +)`Hx$"ű @z;ŜY1eK =2tVl|;FeK+K jQ62fryWNgy`~ 6Q0ӗU A'̥L~?˪tnx)q">Q Ae +C!pƁ$V˕VC ϢkYLȤx"enuJA՗|.E_Z44vgi5(&暻DŽ<96D0W*b}Q1F_2Cq?7'W7'f_1%[b4:g 8zbwRS#c\&qBM|(-HG$qԌV:6~i^PȆ4Pʘ).VG kh w[2kaˢ^_ + M5"AQhh3^ōc?n=@z?{@"*=߰z澦YdP +bŽTrzh.=A[>5% +g\9 JjGY81NRXC~m@RBSll+<ӝ$I{ǂ#d xy.)<Fs~cCzefD u,(΋]!z%fWޠ){oȗy_xf쿒iG{X J#30Ž7Qܓxoԓq3$~487Uo^MI"#͡!ɤzNbZ3z"S pD@e:֛x+HltQ鹁Vl`ho/F۞!@0ωϵmҏt]1dȢ̔ :fi;1Ň :5`/z5Z~+ۤRAҰ,Ż*ghQ=ii^/3f>F_?^BJ2Ll 9ĊBe˚ݸo,Zk\"{;y¯ce\}Gzx +-[YK{7]VuG3Q{Tr0vg.>>M촴>:%r%+xBo#t{ٕ6s8eL^?zڵdW1j&U6g-GK3K+ZW~kAz1l%V;o"J[_QMгVF[y@-r[!F:ݳaԕ]#A*=QJGZe8a +iĴ}J\GWDZ=:zu +:r+PP>U&_ ڌ2Lޜ#J'fˍr4NgSM+j A+AH]F.K8P[LQpce+ƴUtdI}W"V2|_HĘYHvT~Wp]Tܝ$YcY]o ]@pW3Q dQddf8C?wh^s:j[eVjʛ2I]뿬hڭ +AZyB#oy~ ^r endstream endobj 32 0 obj <>stream +0iT7C1U}'e +2(_DG{>5K;[|)9Cٵt;URs Obeiats^t4'0Hʙ #2"ziWr֖ PQ\dWzsl{ InZ>;C36Ĝw1K8RYb[wBj^Nu#FQ[Sn8|N|@a:aV/;o;|w]is|lƗمۧ[ݴ45h<]E +W aa +z iԝAjV^}NM8eE%Qܮ⠗ ~4a:R__0.!iFa | +/[pwF;I(wp U;-K^[BG#LqV [1PkJ <^j[Ajzإ-V4YݠXpRp=~OW`V#ZP[ !,H冋>C~B[|<5J5DIYH#48 g[gWqlwzF!qz 0*F1ɴ[4b9)ܡD }=]'}bߣsrb: y +9 SyQs_bJS{ onsF0";L)@{_C7]"g Yٮ2~G݇S}-HAA+9 lpst\S_D#}ruJy'9-vޅX֓҃ +6I;-Eo pgAd!=#HjI ^=Hp[qJYȷoAbL@"JI\6E)M4W%!@bj7HL"{MT3a\&[wZHM&,ñD@}O R gۿa3F-*nofDveu_[N!9I{֪#O!y2I1V3ʨb_-5 ^i4|HZPkgEcgԫu2VY9\x33xT/lK,0+^# Bnƶ- _i"27 sVҹbCNU +wD[QJ}>N1:ƫ. t_>}_?gi}RzFp 4Mbp {C2:4WNOvhJhs6όJ>q.ſt`Up'"AEH`Eda^ &4RĠ׃++y|1+#/7Gt 2T6 U`DY[pK36#'^XSD4?|Xhf$80$zDKlEԸ:?֣6{S-w f-`%2crXCD42]5ػ[<ȳ-C;|{_*%AGΡD4 +d*=AL+CQaw>OM74KN +i%Q`)k*tVQ#5Ԃ fAj$&΀ɡ%G#vr$C.plHϪEft%i&R+a CCBڕߠl pj,P3$X(`a^!lT7*Tɢ$~9J+sDxRGz UN%RxWMmNJ#Ѱjr1L_9]#|suradqDxD=ѾXNӀu7ccl+Z#[I=Ä@5]a4\p {zRw:\my0OJِBfߗ,םTtzg'#WU, _{`3)tei /Чa?X{~ldX4|Q\ +8q@w5t$s<\.`[˨ *K2IXԉ :{,ֳԘ`G[/m`L=gVQ#7$==a$7>yߘM{n)uJq<ظWٷ(f0r\pf__N(f @"!rˀz7&5e!/JF5qR~( `m솅s$DF|WEч)=s"?3qcFX߈?BCSD ꩧEeh恺A)Lr}g=Ǝ2<~Z :Uwb- G#Sbx,H!?w[(*k;b =?Ӛ6bl$kYQs͍BT|/(- )%h~-Cб<[V7Tu)398>{As9ُ}mTza#XPvǣ2RA0I0hd,xTړ2)+:1!>ϓ=U{F]C};8ۣM~O,hk1jʌK{Sg jL +,,3b&ހ,L-] Fl[zDȎ=ː;Y7̽"K"^*G JzcR;O>q@ ZXOu> ѐztv[pcZ]?!k-XT Z6PNs/(B/W}Lb0j)EUwW 䵅mH/a8FMҋA(ކɯaƕdcuPbokW"1>9X A,\k8{ʚҿе̉'}{y"+]hA 8188!`sZ&9x/햁G\C. kO tjnW4rpRh +s?92EO˙MUk:gܡZ4w{-n'e\&}f>(Le 碛;tk^ &dQ!73z|&4&|C.şi5/JO{^  .s7͐㊖)͕uck &ssP厲:Zt8΀qdȗ/E#'}F uѕV#w(bK @TW1gL4#XA0wbLܟ(bUKbDK?TN> Aܷ8 M\V0y=5H%&PMѐSSQ#8IE: W[8zo{|1࢞\&c@2+ !ҴƦyͽGjn+MW 7t&۴x"/;nO@\EJD=8m]2|4LwDBZo;BNS>Jb݃b8 ]%TqNIR^MQ˅ A>yT4崃3\!W]@ b!"t}v7 ҧl+=$2bK+h 1P,?*:Fz1F݁D~$MNJTN鱭; gڑΨ#kH%`1ҥRGnp)K7<PsC#@ЪV;_Rw*;mX׿,}6(=f\rڈ|ɇàQ^*ՠ(Ynya}y|w=~,5g-hw ԩ|?^tqBv}'>>fu>$I+TIH]uJk%K^LHğ> SZb&\I477 b(ʟ}e1^ߘ}oǘ9F2)*OvȋxZPe],h8?A+'ƏcR2Asa;+ -nTRd6j!0+#C!\v͆Hs?#9+ bE[&q@98Ng{*cskjYf␐X:k;1i[]&'Gg/lw|IL:9u+A] @#VxRG/U1*% +m.QΪ!d@PV]j sJgkB+9 s}=QT%r+bJq­GV+_=u+9RZLnqj@p9~H 6܏AC?"SL0]3h5dgըJ3Ә*,zj >kD @z՞$j{/9 + u1uP>jC$i<"J/ H7Ň!9)p_kטC@uyw{=]!PEԍ$ng=֖oN;ppWUu+o.V=;vO5w\N:Q<P`ddÊJ"Ej,O壐o>sa87GUҾ?掜ūzZgwRTCRP0IR0EKcUo! +3=aψ0sv͌>( +Fțzp,KA[6࣎@XոE\sEqg9rFb;^s;=N\p!͕f0PAuZxfΦF}F!\~clh BgyDy>Cb`"7'ۣy+ežץՃ2.3Do(tq + J| +&9XsϽޫ8ڿ*` ʸ3K|tl YMDذs<UsOif}cW}~*b%Hr=}*޸3ѻYBE{ LY$n +(+BYCCLtx5k*GOZ7^q=1hlWqAsM ]yҸ׫] A))7O\vZ14|< -p=k$ + sQd`9R|[)%nPD=ngX;'k-;ȾL׈.b@L4*Jy^pH STFA:TdRFZԉL-1 U*KՂezxpwN2Mxl8 y̙BQ0=3ӳ:w-Jm5qGAO Ś-\c_yh!P"- UGj!"ޡb@\{⦁T9wEK9 +L,_Vl?נЊ1{ p͏K#e)V!SBQmߢ/mzTjD ! +/ui% ՗U@Uy#5̉0bL+Pj-GVw⓲RιKl.ܣ(:ٚA':W7J04%Ne+H? \Q-WcWRJ?R)-vu1BEaAaQp?juɇjNOƠ~ŏ+# ]yrFh \i w'kNWM-rG!:%Ns"`g "|Ph?}wuÄ^02HWwA #MQx|O +z8%fT-o@**s.㬰Kzwòp }V\Mm'1Ut.+eJ =қ3KD^#"X@'d< I9Τ; U'Dn8ґM;GRr; a(d;,S#(0E:'R}͚ o̾R]|[䎄fP͋J@u˲q*~DNxǪ逈F`RZl^A tޟQA2sɺoϾɬT]7]_{|c*5-~ɽ۩iӏGCn!Z*s{j)$g +}]Y\IT%xP 3Ӷj=B>z^oɸk#L`fɟZbp|jٳiՌ` o/ ]kC&OR naNBK?hvM +?*$ߐQP *<-RN{kkJ^,4 FNMQ!$ob ͈/Ly^AV[ُۀ8D-D +MQ ,(= L|MdUNѥjߙ [M!5䖡݀F]Ie=GGS3Mce 3v\;If(|SRp^!#Y=ϸ2s?Aץ؊~\׺.Uf]K33t+fM +fbRQdz/< whI dpxT/ȍ=vOZztZ&JQf_r[5gG!̎.q6#!!SCts\o߫"Wxޚorn0H0rvD4J]ih@1^YPl+7T=E+@Yf23p'BZ4;|-m ΢wdG0sV~.TlECMvqa87&8s1Vo+:sYv7Iu;bVF9g#zcwuz\2c#3G۸]N{KvQ. +G" 6j{8V2V3xmЯ'e*XݱVZ#$1/z^)˃qԈ`0'gezW9`[U+hW V~UPǥ_G$z7e6]$}bi(e I.ReBԤ@Xkzi\E* ̵Q)ȋQ>_p0"DP +dg<tDzėC|=VCxBϐؘ)W=1g+iϥkAoS\$g.p[PxEs\gh1}݋޸T/4eK_;85(~O(()tZOғoX5й3oAh#455ƯlX]z3G~%o=O'6UfU#t1S<TuY;FP%"pJeLwY0F^L~| +A?g mah@ʋ gXmdwxͰ;jX dL 4m%i*q$U*Dm&~O3F6κ' TM9?p͞7H/!s=fL{Bz?oFI9ve]iSF&.Č 6k)-22=jDbUJiDjk__7&+os,iɼZiqKC]P}`OͦT 4U(;膾:q+tC!̐3~MJ[2+E<`,_:U5WPpprAgn:n{dt>*BkRpk=k\落H+O =C!QkRyM>C +F>I/&`x^rGx~}y +bcT2z0s/$qEńq;𶚭wRn'@v.}((]I&,zS +*M-\ۙc@AS}'TޣzG 7nJǶF?>|qcyf +OuDo|+s +*.xio|R]R#6C}6D~u`f&8)&;1A}V,;QWrڡ{c9Poxg3ܶ(jHa,掔g8Y 9>M2SqZw' g+?vr6 ) b)S_=mޝ5N0tRoP@ɐ3Fmz$wk^ y!%yаݝC\;G;m=|9ɠ R[[h!7;9 0uȑf)_&-BBݚT?+;8֗L"T7-S +ӾԡрxJ'{rg ̉=%fdE;F5MTFŶl51޳5e P76JD^r)](ıtrT;n$|xyJP%G=M Ji_aZQ8w=pbEm s`6JjpJ>aL: d-sJsiw2[gަH@IkRA5w6ag9Z&7|sh ; #A-tw:1wf.l 3( \*3@meZܮ @3CꙌk@8=2IEX\_e-5YE~(pkYGn& CPHo)FtApוN:W| > E-z͓6!;_1EV"(;\VMX1OeniQwlHߘ~oOv]vK1cvM6Vyu7|/V? @^G?3/?Jݩ()l^W~ښ]@yAk&+:&1%G]J|q.Ć"=A1z!Na U)7\ +;Hyg6cĂ +EZsA-啜C?@_A&Bcz :H?3HvSShe!zGlW mӐlS:q`UUP&U*A?p%NcAetG=L%Dߣ<1ܨ!_~;'݄`[M=Ky>w~scuZa$kϼ!Ёۗ$)Й&葺ZU93{]رE_|Hbփ^4$+1a6CMc~{6G*O;(*~ϻ#~@Gi>q| +lBU(A *J54Ԝ!M=xj##zBCc꛲5[%qj8YfmqGxD=k RXap~8Q$Z(.`C'GVIb0U.4Z@#;E??:ܶnF;VZT3ñulॉx=g0ahJѽKCrp4D׃ ;* pW>~{tэ|BV ϲwj,T'5;šKvr\ \0w$\7eTLa/:\d=1n[] 4FNMluXQcz':>Es5Oڼ /r-IdZw$`!TgPIȇ'>~Xyd /Ƽ{hO҆m+Lq) +BsޫK@oK(jz ڞsބkHNrU}5ewBZs`؝a٦0YϪ"d +UnhZWhBІ)KlWS.]1* *O ϗL0d1cRx^?"I$ ^/qP/g]v[MQ~,}_O]~=l +( #sь6bXdJ} )b,7JO{ULr%Ur9j`ow8vf 2Da< d^|#mY|5 O1םq',ְ: +~hel3ځQ ?;w,d%oRŀPxzV R#t~<\'FJs+Ȑ,P>sj`%AJ>c1Đ!ķi 0+q'YUM5XgSf=#;7c3!SCyC/%=%9`鯈ZwO)nSΞ-֛3tlo%*^li8bD-u`ĔK;$ܶHy.ҿ4EqU?FsiPegg[v !, adǝI45:u|JeBj7(`C_xGƧшR/%&E2UMT?#e9d"Ti"+h~874ãՐx־!%95^}[_01g"?:մ;S0#7Ch,sؘ2J ? T\d\9r>Td Tey +^S?-r F \ӟWO\]_q:!9fܨjvD8r=&[W@_΋XIs$i+ +p\skYDQyh}hD'҄ I< .&">n}+$?R T>2Y#Ö3t =a7#ܢ8g:Cianf!)s=̍D )WMn^GXeݑOS8*Ch`N!-XLU_ ] +nwGnΫZ~D[ʗNSՠjEȞ8>$G<=3AqҢtD rO1ItplV"rvx='Ki`0ΤKte([VGa<) Q{ڏy; +ɼŕC<"jfu,pce !Q><=`lN?֡A#&Z١û/GgDZq\,aMXAQz2DVF_$@*)[9% +Nx$ņ؀RP;t\G'+U,As‘a>I +!u/ZmQa& gwQ 7{ E97~SthkG+:Ų͛R +@#T:xQ .*m{>(l)0z(bXuKtl,T7NլS2"K(SbmפG=Z- *)Win-yQ_ :*jvrmdG?udxx"YTCHo ҙS~RFB0(; Zʘl=xρ]%[,DF!;[m8 Ѻ^k(e»$P;[5ƻ4S4i~v씓5fz.rAqG+ ήhQR[h +l{è..M[X d; jG>|v?c@OmגWۨ؃#=v3jw}*Ag\7]i׈7݋SbɐV[{`\3Pv>yU`R~EpZy{?*GG{ ^<(1ї)5[a}Vq*G%<0rpo,@2JF3zs-U>*_s/>1Q|{:IߕxD{I)Z`@ƞN#=Uv]s>RPU'aJ\p3 Dgr'۴4 + KNIϖ4c~b)iUti%_>!Uc3AW7DMFc>zI!ٟV-Z[QW-:%icV+ډPO^Iy +h h-׼*kv:%1SW*y}5l{}#%L) MDoKXvFSZR'q [?labE2&[aCzrZK{8=yBJXwe۲?C4nZ/C>qm1d>8(Gq& eGPQh(c-\A["13sKdesj +v@{#1RxB'UG8b_虴R e'qFDSϩiE}|VO77d;"xDL7Bd(3A"}k=(Ɵ'0"CS_šk1dȓQpMjҲz(]512O"FZ#8ٝ!<'<?Ynb-~.N'nܬ8LA&C#1_gwz*Vq8g&;V@Xܱ *ܾ +f~g޹rmp>\aЍ*"8c2r}*i^uѾƫ?H3G~CIo\[f +L堇yE'0X1fTKɍSv'rĜL rF}^';:)Rh$ +[ 5idf883F*]a>EJA#$jC{R#[Sme?LOGҚ!Oc7!}կ;dQb&"$ӫ4S;z< LU{ȥ豠@ k8VeU {2dgoʌ EDU4$lh޴4W#^5+m* +ZA7s$3N}?5lq~L' {%#MMGt=|Gu~[P:Wt38 +e(["YMgnWv]=N*D(ހ}@ @Pb3vIΟN7LOcDO43KRaP>ՏWI+%?Mo0ܠ$@1aEՒA=FR-2cCR[$(oݹ2x />t0p'.U=WJ +bY2`]Bȹ:/?AU2'#7.NCW@ `xwjlC-0Р8(OPѽS@+9s#qVD&ƮdNAqqQ()1DNAf0?RXN,PA|2Fs I\iyƼ +hL|p5w/L$ 3~Eo~IDDKLe8W3s3 H`g(.51O22*$Q5@ D(w@?sD|PP=֑'~\+C-_ŽU&Pގ +NKŊqޥT$4"W%gfh-ɕXrRK." +G#0F9S%i%o"=E,C-{z;UmG`;yL.*}Qƻ @XevB7=eV5y ̿+l5Ff2+7{h*F@y:ְqB^01aRNI=}r/LqNy~/~9R+a22+\BCFjgdԹz{sFNZI.`>:]4O]/z4c[T`#fTQD ܞR캲n7.[%$تyJH"*vս:?%u0HdU<۹!}bOVAuH}`w.Uj}HO;֭wߪǔsm9D,ѹrNyת3Hݣ(sQ8}9BrŻ0C #Ț' Xjj5KR;b2Jr->לgwf~2~$.ߊjB $p%K. GrWj;[kB}}[舎 ?Qh~̠tԁH~WA #]qgNAZs; +T;'RB#ۣtEKE +)Ar,G;@:IoFA\l(Q1p !8A=7] #;ǼzsVol7_TKhtgDUt/9@^y3$$5W}_q#Sd/r5 (#QZFI?mWd'hwióWb!Mr=}=-ʵEŋNIxt4~$};R?#q^\Җ<<gA gu9G} +}}sdn֕1}qf +;JNyG-S~@PKmI[2E/W^Y0a5j?[`%|Q(gQa=ݺ7A$Aj6+,DQBbH ++[ߦlz9$^*M_'CCa"Pm}>rGc'4#GKICWK%Kw9~툏wؽ[w΂Mo^-9ZZ3I)BƅBuxnS$_Ž:SeH?0wV xyϽT"1U"'jgNe|vpt9*O_TK87Y_9.&P?^0l +% vh1p,#3L+[ f\I +H oyxe.kT"DŽRNF~[G! Pѱ5"l!0t2< k;TkO/V"g#$v 6n\+ E{S JddȺ=P<@8" xK;A6ShJ:P9Ȗo-H.ME[aV ԩ_H_XܽJHcq%MMq0J%ܯ%N}`~Uʳlb jؑ$c hJWPǾ-c"׃x4 +2]Cc#!ېvk R2DPw=7SI`q0zZ=[k%JZDt-MPUq l*]XO^5!DU֞L-g1sLu+\EV= +>AFa 'yoϵHbZ}`b;2E.wx3iиSoh#wf ̏k2oYw=Z | 5Lu!+Qm87Zƣp c Ը~0k@Bf >BL EC!ey@w +RMM+͛!|-6{< }U ~Sf?d f +vD;fAMpF/̪][eqHnev-ӽx 2׈ye#؋<8E0{!V +]p|I"Hmڻ9v&H̯h>{\Jj8J A$Y-^Xni^[c@@.>lZ/>& {];KHnR ڨ)z%.R}%DqP aBzjq%+PtԚr08e}y/TˇTG" ڙѭh73}*-s3`Ŀʮ~FME*)m.oRVeÓ~k6qO P(: d-&5CyA#'w؀U8A$:[Y5lweewrݲ`t' ^Q|@vRЌd!(b??%TUbķ~I-D"ΣY̺yk)G(3S :Tk䡺|F 5wa.lVHĪ"p_q`* [߁6ɳ;xe˔B8.-itN=d`ByBP됸|b0B/fJ"4KG;.XϵcFXkЮwU{$$=mTpkid+<- uѰd-c_e]lsV5hfx*/ +5ݹ{$fAT~Kxmd70+wj13" 璠=I[QfJsKt/}$݃7WEJDdNiz~wK?CZ{{@lEHӘy<^ ~ J.eWxśrdjFjXXͨ|ϬMׯ~aԡOX{àItFx3'bRd^1k-8~̝֛<#^5"} n 0/;X4툻R}Ky+v + c#ǮfV$MKfaq_Ou#&j>K 1Z&+;*qlYH68,؉Y-k̈_鍞E!C3)YmWvfXrJJV?N+:V.K bw@%!|pMsKڎm0@ysCɟ}814,4X DW+5,h$gPvs@yD5zE[};l?NךLrㅤ窐+!>~i|{9F?vKlȌDf>Oj@d7xH7U@+~6M1H#RJSkV{{P+7V'4ra )GW]d`{=w셟/GI~D^qG;ygRvԑ}P$ܖ:)H"Uj݊/V:$wHҚᤨ;Ԍ^}QpW"Qm +ۿ|^;$1wԁW;XC)P&Ϟon1]<\d0 +gFG3gythFt'IUI +IQ ԩ,gU( |fmXŞ:J),ՈyaJ`NWvd `O +j'AhiA쉚6`q}NM1:ȰpyWwcMZ voZ-1WjHou0; 36 F8!ŷo岙Ǿ/iW0mI@qx+CJ p&+CkAYc)7dL>pӷ8eߣ2;Rqt{޸vt#CpP|q5¡Q.En3{ `#aѪХ8pITd!ID5(Xk09/ kJq+sկ j ;Re aR<#`#ݘΝTɔq4猚KQ2XBGf,j՘}=QtzR + &Jg!_Ps/ӯo(9r3E|wqTJh~eهXeEΔOsI A8ļc~1* 7uOHցTMT lV>1#!Get߮2aa#WiL2CkQZC2J^zg'$ 8t,1+NwN% +EDLcv>E͂6#JL=~>x:J+״ 'OAQ936B<:eyF }[);[&F\f +D"b!q/8gVpb0F]&uP.DRdQ ?VH_Pdz~t+" _Uͥq aY!! RpgDGjs`%FMȹC,8 3y"',: UM2P)+[DJ Ǖօ [9*߷DZ3ԑbҪD:3<(A^B #vn׉NKh `p3׺e}"%sbeOT^E6SLSjTiyE]I ~" S=Dc 3o (뺮** )S( LsQoQǬBǼ +\|qlOr0Ab@5[;a׳Vc\E*<י/8]շK޲T(10MD份G [qk:ѯC'9 +rAyWct czy,:ڊ,0Op&*hjB `1LAMM!\IJeg\p!0/C*>g24Seɇ!sAA*K{n)5`:ABC'NWΒi\:CK_;^2\%G>z} `0 l~lJ[8(m!AUzwtdz@T~>ls^!]Y>o,ܷF7D;JɍvG"IPZm*n{@[zOg'77+I.>A jOi1}ZΚ~<** } Rpei2s9QS@twМ&?W"h%y6 ka[K2o[ݓR*n2iU:F6imwPij hfg^L4tN\`y"`(#^,XU`nmu6PCS+;5o]qDΙ] 9)}qXxf 3*9YpCЩR=/؟wV䠤s|D>ٷM!^J)=Et?~ #1/+'9@b5/"-F8߁{d){ϫo -)Or6| .ٯ9йsNtiPD &<أ˷J E_L+P>imѶVHO-`b2=C;r[͟,LRW}}f{?\GUU9|Pjb{}e{ٖIXLzʯ2#QvJ6wq-DbD,Veo,X_V@x';օQWBZvO^fW UսU=mDb#c>0DJb`/"'$ +9b5lOɸ2j]XY(k20{;QVC9L{bqaD٠|cպ3:-dH +˚m@9ߊusÀ*L>CH/Um!TjDO-Ī#IoCre/4o5dwDb3Tؽ@AqZrӎ6ڹ8 ac&C=9UHE[HvԴ +>[ȴxMwEggq'P!Mʽ-0it _^\͟O,d~;W=kjZoD%tBtHi7D*ó#"T?cR4aFY_Zʡ=OrsG٢//!W#ۢ_Mnڠ'㉺Cay,nyh+c`i1Yle=B80hϋ-;"s:EUlM\21{QϞF-۹\_ MY@t9ЦD:*vi0:bb=!No?؋|#ogF5-;Byx4RRwyQr/M9YK1"Ϧ;(n1mdy9M'MW<:I,s+/ɡBCelRpvZ/YW+zvjˮcB7!gz!7)¾0:;_XgRDxD{̮5hWgTGߞ45 3P Zͧ4Ÿ>"`Y +cJjvn?Cc5Fya /!KTӁg784'hY' 9".l;}585&AN3eՏ`!D?guN2akr3zzq . +pTYR'VBA9WI }eӮ;) gA@2f&89Oτ+6[cD\KV223Vpd0| zc B_z;e*5 +:jBV]I|m2\%<3:!9X/̩R*8n3hzV/# v 0+]ppT3@#O^2_n֐ KvS_K5+$nj`&CD" 3Di;SqY_;1? 7;Y[-!m% NFsj s/wӟȩ + <@Bx|9Œ )oea=wYP}o@kU|s`Q%UiE77biYSI=I~޼E-p$c<ڨM6K*\-DIZt7~ǘnb M}8cVzHßȫZ #B l㒊%N)4 hdj/ +J2^1V2:;א2MxOO[)xVsqc^:|DVm5K\ o j_"zM0#<Ő[6!оg@ Ka8n󨸶16hNM*UKq ~)K6GU@$Q`="pƏY}axtf_FDVB-O΄7%BhY~pw`]Pp!i;L1|HwtUN4ݣIմLQwp{F\>m JphNAX(kq/A6-y#}Yto Gp }GȘon4 }1H Ã8ƳwPYeWeƀ[:< +4&*&Dۥ0R!d{!;Գ/iR.G4nôuX2~v۷]鑳2B +`ه=NBJ= |R$k·LK.ޅ8+N=YVN΀gFZ<l b S gslkݐN-fY; Cߩ mj<,VȅK1\ _,9dPu%F YWZ7}mc;W135-re=< +$iGI]h_ EF߭AB!'<4^^_8?31}vn,.m?M4h.A׶ }wԂNՐy;z<͔\)P*ہcZqL1R=0XA!>U٦'\Bi:u^Ӝi@7{ 'LٻՁu#^qzGҌD)] s4Kt`Wb0~*a +q aDefA"R;3vu*6UpHsƈ4"yBDJ !JLxWCVL!SJ9^Rlj_y%:{Df9ҴȐJ9C\Y+NMA q6O%ghgQU'vhaq31*Sq=ڤň%23&Z ̹me +2oM4#'4n@ +4#%]sKioUWPIJ.$Pܼhp6ox$bPMrw2F`4Hcw(te&Hdו:kPeKc麳2fJZ-@?4aV@tq<;oqADD;GEAUd;!k5d9\̵Z 3Z;\H\lIj3*1+iA|۝J|5o4 [t&@jK2<;(/4c@y9g`X`Г:%RLwCF}p+ڒ{ ` -)ɖ%U(2KWyId`D٠I MJ=p}V| +&z˻ wP|b:ʞQ+"1 dD1`AXnۃ?C;6jY؊*W2^d=mf綶MwÀ_ +M;3?Y8/yg+^ "_,њ[gDqbnu)Qڗs cngas)-Q\#7m % QA:BS=51ǸBB%@nH4"'udb&FRxKKr~tE= vc~ZD:~/ۭǪ?Ҍ.axdB-Fs=]Q׌ +4iR Y^EG*U5\>i^PxW!qaZ({ۏ2-/X592u=߅k˷2y;sOgQj`cڎ3xeŐ.`uguy( dO!4 PQa?"i{7>֌J5|O}N~]! +Zf׾[pxN ǻ+[%w-wER7JV(BSAx< +iR!ClAKm}Waynar3exOd )Gt2vD#.@v=sbO" ;F_#Rgh +ã0D{(z 4P +9nabgdW1 C!'-r~^CgDqn΃\Cw_J7s+&֣VDj$9C*w+`M8?!~'[_e%s@&l킖+Iœ]+4&Ek* tC R+Vo!u)[ b1L_A;ߕÈmhe PX\!\iжRS3hU@Rs'.nFm JYvTEHzz,%*Gx;&I0VN nP-SKCB?6#QY=.Azp(^3'^Vl)WFmG{SpһV5MwrN`-Cf Sl!r6d#`1r]l `g 'C{:UHRRY5` hKسKU0kK{FZQjșh ɂBnnwڷW +LԕV# }B^:L'WS\dFirTrA+g1f\:&򏠧/I\C&}ae*g3&7^5L{(IVL4DrolFߢXDfU汪 d{b$dR=Ϸ9UnΔֺ5G)0\.d[Ku&![VWIpg/ hyH>: fBh't}|c>o1nZ"~'B;Уe )#M%X*~G!ǐ]}y$>Z6"FR>*@)YbR~oۢu+57Tev xT2 ԯUȜ5@7'C|"G|Gf +-m-ǵ![H8<wPw^1y8W-*tU"/"fF\J)n^+=*fW Ĕ]/cmF#dtW0BOU PMֳcU졥0hck@!xry7ΣaЗ^4E)~KQ+T,&ΧT] +J픭fH,CZRL T0 U[2x=+q,Fll߉KŃjp˾TSF\؊Af4TP.u3pA?Yf9_" +cZzm}2C&&ULT/<4AYE2e$9?Ta1d|Vg"7%*'WڞQb0z5g6qL7Q%4p\ B+ +] %UsU=?BgU큒@YAp ]W᥊(uhdF +݋ ݹ!YAͩ@r+%'^BZxa!1^ږ?:)+}`̩_,Z-,hFHn=JVA~U=WH= +A5ni)RI3^,M{ -p@f4c(Z\BF cPz]P{%[` + ۢil;əTƈ"Ϭ-̓_YtܚO(0-/_5K_!Xo/7V_lEd#Gp +bjfga;iZ+#~Ƣ4>aitaio+FEx e woGPIFՎx-#Rn:.FU<5NjQӄ3>td0v2ࣝ~OٻAhTȲZ`V v 2+)Z5Ҟ%!xH +/D&rҡl{b5(П +hȌƤ]sX@O +M=<z3"r\0lɷG~< +@d[ !:ZY`_Nr# la+棂unXdJ0U{$H3!/}D(ۦqghkδe1g҈$ضO;7/iD L+dޙMfxxkq;k#owiP7wϤ"vm|v?4cM*DdpG(lu[ r [R'ժ1&Nu3~Ǿj89K!ZmP3dT{[38A䎿1^q&g8ԼYD>ӝ BvH Y ?iΊ/^uf=ץtSƞkOe pܵcįL$ݖ)i{%.4 6Z*rY§kHKQ_=\J }c6W9R|hQjkku7@(\<6Ge@y*4 +Ñbv,ϥB9UPuYh[~1iڀf"ٞVxw1p{8| +hX7]ߤIhW)-+8;1{,@ `PM[y2qO [mKE\rM1-TqR#gبƪnU+p?701U"=/cwCMe\UfW+p4C7BN31\O6g؅P ZH,Dki3\%nY-b/ѣoٹ>MX OddmXUΘL*kDWr1*A\ֈ|kS9Gnꏒk. 3N7@\$Ud'6y$XtZ(DH +l,0$:- v@!'/3wxܲ,4 &yJ_UkI96eǜ󄳊ݧ߹o):7hg "m WDs}t(8t8ޔz!xe˱RE-Wc+ 4E iB[߇t(* !T Ϩ_w~6+ X583hq]Hi03,ȟK/(L9ÿFw6Su31o$յ? }Ti9)$b>R6#VdP@z3-ONf.o9&cw)\O9Dg:anٞUiD1v4+y)x¯ E~5a8 l4ޖFtk(bn8Ƅ apK-}#3'C(^UdjDf[Ki ;aR#9 )k%ι_є';ઈŽL_3M9/1 )xU>6i0 ǻ?Ŀa4h>?!sZxD2FDDSV %s"tDY).2nL(! /D5 B5O1cGbB_`ι=֌&0# X񘕊޲EЅ܍Q̋n o~IE%}E]}ƏlR{=8!!r)cJOG1-s}1%=q m9`yx}H*Q`2ƜJo  &kҤyWFƗk-H[{zAzAYYH-< Cfkwv'FB*Ϊ僃dqAmjA`9ٟ +T OXsDָRhs4kr]ki{cYR٭D&EϧiY$yFjh-Zkΐ-䏤YU9 6_WG,c6ta&?y qjf"G[$QV]^WiVEX*ǽxkl=`]Ko)Z:ezfhA\)Yeq(.m1P.)hTDTS-d +|a5+mȼ- <1yŔޛ%ߞGĹJ|ik?oF\V:9g\n. |[:-ʖ ̏^56wb;wM]ʊBh\[{Y%sTJ`RykP*IJ-lJUb~JcK*|>BSފrk]0^RHX'+'hiAUi#&@hA2#P[b{x 1 RVi#ܶHD1QPoc<ҼMGژ'&$s݅OҔ.svD&%fѴfP>ڡ *)Uycd\f%%RVwOS?G[vm3W|k=pKxO]-%erꃠs@TG#nW0i|e >tμ)Xj0 K}q橡:Fu뛟WA;TFU䱍š?9} |޺|}7Jh("r;ĂcWi SQ}b&75 +b ik̿PdkBieU&{YR.owҝ \H{yB9%:GǷfm`Bg %}K3/ҢwEk>LF"}C RtQ} +s1$ʘIJjpy^~Ձ}+MyP:(k:a׋;' $K!t!R; M9U"s9 +wkt՜ѡ^^0mnU}!Wb]27h=zǒmY~7NΜS'K瀺c ӹtoʠ(mPH>O` !za10XOPsƫhʽ ReTV!L0jxߑЩ>"}v!WbKrsJm59"Jak#lBPyK2k|)Ĵ(&<;L^y,i眚#nD-W_:0>ᇻ9bJwmG b%KxҠ/q薉iU7_?lDmQ[YGIāDˤ]jP9<狉*&܀Du>$Sb 3ك-;bR!\>u5L;7 .5_.fuLuG boZȻ9Mߚ;s 6ݠ |Ĩ1 +z~x쩩%'?1u^`@;tNHί4蝥pt.0R*6~d>*0v6Cۏ(ŋ' +}i Ge7ʣf8Im +2 <%b3>qf<*+0d K1g|V o-ecFN˖d6]H<~~*T 3Z2']t/vqU` r qFD60PHֿ\P3LM7 .#hs9yBݱHܗXC;A=QaJ)3`6O 7ǚih:KIZΈo7Mek쥹- aګ\q^Eun#kr: Uw#l0POY*K~Ȣh頹9]w'Fl5(^ۛG4JoՈԶCu@`S{%,bsa~)4g> is!{cD*XQM\%IPϜk[qE-:TVOq- 4?S+iXx(:Lh:w"k |_a P6`;)!gf~sp[|t`*}Ģ0ѣl J~=Krߕ3ʞDPDs@k~#{>km9=C+@H4Hzҟ˞AI۸"0L\N&C42b1!A*;گ{s&R!sٯwêU +-g}#bzjE>ֵAPC3 {߱lI㿱ͮoܥ-R<7wnt#L >)&^ZU|XϷԵEROm{peAq _R Lx Q̄3[͐Q!},+ £l8h(8֮FIsBX4K,$늊aKPR ͯu< +þuQ#؈ +x30 +\Bj阗bt 9qRdGv*}@>9~2jLS?N +=ڟ>WG`7DBe;B 82cٌJ9;4AG 2_J` E7v^]CpÂ[.wP~2Oqq5) yC~|c] (|Lm.NPP0Z*ѵ|isθy: w,5xQ| +#}6 j '/󀔢i\g 5B-{Ep8"PjS[ؔs{*Zʛ[=*w\5DC.>ف±hkNڽfm9`[r;0"Qᅂ!zڑp`eb 澮[WUTrt7A툯RmөLԨ>з)㌪k 칞EW)5>ޢ2_Ue;S鵫{ʲ4t~  ?ϻBqYosآkKU4K3$R^#vR)1 +l s#n,qΰd])7R53wpjpB=\2"'&OH|ʺDX*1)C!>jD:$X;ٱ + #iHω.U度!JaO.y d~P Xn;Z7=l@-'|qݞTؘbm}Y#Jd}M=Ec>r7&_- +8/=DﲎacY$yLwMw"W%V.6߽#3V˗-2Hjp܈k1tr.>~p+&Kճj"n>3 U18ޕWrvz=-=U|.+ck̇41dL.C[ۛKKQq13AT﵍@DOJƢ B|&UB NԞ܂pv4/=BM؄=ߨ3Utd:$J*)r gA2uIU$oLfE7~sˏsSѰf(0S2ת-lG\XS hu{ aݶ$)$nӻTrp{G.hg:Pk8UMNIʶs!澯6rUmq#HiPȯ\_'JF6r˽ Yn5\ +u+ȓ n<|^iȡO&,jZ.qn\y*= CHvқfFR|$N}}9\{7Ȥh+Js2ν]H׾,n']2#^9QnyS.a>Wz 9EJIb5 5(̸LewjLju,hm BJ:!-&[ԸDMsm +K-LžJp䲷fxDH9DX +xR#k/™*C  4ա TSZDq(ۥf!Ab yژ>Gߍ6W'x& E֞GJ;{,;}-r\9pT3-Ca-ljK5%eҪ@㎥P όŐx 4|e"JՎ.jƚ5Pbjӌ2UQs;Gʘ_!L$$`?T[ (]'ƨ)2Zڈ)KaXJDvū^O,=UȁWm,#*뫮^7ߤWU9,S/'^;#&B1D*1_w*-D4[eW54 ~vTBw#qw:!EZO%NJeI#zd12% &t\==5y# d^kȯRK*LgP/R)"ujРL+Fj)`?+EJ~%bԱ9*k\p(Ra^zb@QqV9(\ض*tBpX霚Vo.Lu]Բ$>^UZ^<r76Q^',I(P:M2B{{byUiqۙUQ+KIz(#X{v򶸪JymD ҽS(yI*o<7m=Cd@]S}bWjufLY/g6 ^/7OfɨMu6({eRXѨ2g'X&7QT>9}oV֠CRRhc6Rvnulw^$VPXH¼-RIsi-r[ 9C+I9`N< pݱ{"$SAu Z0a^'~ʧIxs1tJ4o<'LEp!|q2`;"[/qa]_!UqkFȭK!C',˿A21g-|yL'Kޱ)s4X8#FH 7];#/PJF4V'\()^qǁhrV$+zJ !܄ۻy+5jyz +kcy>=(%~7O0x%N !ynPb_5T=!i,ԟ{ tm @/b؈oթ~Hu&8Ei +'\ pTVkŠsT}%VgBź'ĵ}=քA-vPD2D3XW1q/^B{xHx\j.#^x+ݠgMaUX* +!|ʪ kCъx–կˆ ,ܾa6g^J!1:P") = + +-]vn*!VvOTG.1q1qٙ79bzd'/*ny+W7!jzLD($b^ټF,ՊuL=s')ޣNR#1vwZF8,'"s~EzRQf*aĝnL˰ u Wc]/!LBsQT_HAl"է̅gq$-V%F{)x!=U3mF$aM my o /}Ub_P+Ӊ`dWnÅ~ ٭(q!\d]ψDܻ}7!tjŰ&G̊ŕK%ԋ㞾7S=32\tBv(L[ӫ$yR(E`8߳㦛+)¨4ċ.$A4/C@?@r|r9eB6'R-ܤ}]U$q}We 8 y>پꝭ+XJ@Xa-!BW쓣-'3{gu)I=L ]UZMaHTNht + mq!G^mHpHᕎrlB/0L0!mOl+9S6x~mc\cfhl!~ce+?;Pw@^hOQ܎c7=@ZL~ᵯ3Lꦔ +43:)#ͩ#PoQ'suӣBC} issaz9:rnqom+@|=TT9o(sYw1HSI6D]'6Xo|3P"]~N3? +zv.}F\Y«-ThЦ<ү_y_悍j!+3#p[ ŬX҂Oym`$塚j:GlIlxԐ:nmCHI Xb)]&?s~A)YQM;*x**ɥ22 UDoX[^ +*RX +1Y7%5$lc x^A:2P3V)'d"BJ⊲GȆuqڋ r~js7R+"Qy7VC.Z%%=+ʪBk3OBaP {OmG^ŭ*,H0>1yG}F<ʉBTeLd' --H'wsgWȁQg>ZpnJ'^b=x?-6paGٸxEfJX&r?k"tÝnpKÏj +1|O=w>v`* 1(BNqڻ{tT)9AQ'OWdv#`ړ,̴D".Cd+!(8@{?J0 T=깼r:b-'+оMV~PvWN8I6gJ$|qm#u?ʰ{+}w[~Ϭ+>ìDNa\meޭ9SYU.N{Ig7W+)ZtװzT-QEL;:R$Qr?rEA:[_3!`. +E 2|=@6 *pMXAv+BVPU`l+ZI]fYƆOG8ͱ~7Ѽ1oI}Au)] dU_OwF#i+G`)Cԛ2\/ʿ/]1n}9G 멷>qЦ tWZ)'b ,)mwcPؤ}6بNYѦ2[^آk3&J[%m߫4Dwo|EC* :SD+5B+N4~N|Ql~Y {eC]Dn!hTtgiYlϥ ʢr6]gDu]әP|ʎ*<'̪D{ <8hY%(Kv!r0a7D׆;5ObbC+̻)IcҠN]p:~S2|]쪑l"yx}0#ұB{!,ˏoLp-kov81y#m}M^%#K?N3Wd<]=94A6{GB ?+Q5ק* +(P}EH;{+Q1 +CI /ޞTC6sխ":NeיNd~B9) +]+LjdHŊeqj_>n[V8+-hpcJg II ?O7|WR̺#+_/~jiEBW\xҬэ1-vFNK&cᤏutžiB;jWt +?W, lEvIt#PDx6WEF5i\?u{oꕚ9=WtVͦ$CIYK3wK)tvw}9$u@K@ - e΄lȷUbt#iNԠ-W^y6)g_YgIoux ߰hen`Y}W#Jvj۳(#yBC fjrO >60 uu3?[)f?@DY"W"X)(貹pb?Nfß +a!AT:h?HkPm((c +\b#EF|[VJ<[{i ^JgRO3&KmеVr%XB0Zz4>O@{e d'BF;vzBӂ yROOAEِG9.޾eDE0<F2t?/?,Oo9v'ڵ4E'ߚރɟɻQBX3mP?VnKfٹ|.fF}R{{HƹC.\ r6}Ʀuo&E{ҭ9 +~">v!+~z ލQd&!D$_}-tآvm^3h`Uf(~|)Rڠ_J\,W6cR~.)\=hѕXo%:ࠒ\|z%?xc{=uNH@w1z^Ֆw+MgRV6l^E"o[h[P)Ѹ!3=y%ք#\ط@h\su72ZJ*kڼBviwPn?ץ+n4N9֡xyÆ@ZSm\lŭ%ÏdW{I;& *?0f#Umj%4I^6d^~wBLY؈/YʟBc.,b?1BŅL)43ɝkLz.gdqAGh +abm$h ђ%e"mxKA7$S}Y=o@[a]htr܁0]4-~9LKnjZU6qZv;L9{~LYw~VpQ6 x|zP.J2?ŀ0N#ʹbEf}ڐs.1n+ރcECz)jKqzȷ⬒#HX&WGً\]/tԢ]9wcPVCfPV[NU-G[&ap2tH]i{h`q)=Q-C uA93Uj{,dq, ^u.d"!tn=x,4fj_"/88H5,h7>ՋgyR8A9tK(djY,ţ}3'$d q3 jI)'=$!z\dsڌs-MIc;Y.<#@! ?l7rl8f^L8FΗ=XFS[}E4< {"SHp&>,l0#6y,cRkJҮ[eB2O5ZuO#B~\[R_uf/F}}] + }ZX\¼:&"Kvvny f^Kv{y\vR,eC*3-F)@s]eX_v *wa.t-<_f>yr +Uo;4YTƍG*q"'z=m5/xꟾ[8Xg[zy+6z>9_,e?o}G#ܯ?^c#%L0n@StUC.zOb il)tkШ#JBW77g2i,C+QMΣ|q{(nA-̞ପPb \aF-Hkh;NsVھ8[Lk/)f{nj] +%|t`"[\pFXfˢtm*RИ~jNȽe- AH_͜hC^+ƜO»H[b:s&6CGYT hxpݰLyQUzbJH`l:a&#m%7zSU #&{03mgJ;0_5z2gdeyG~u`lY}WD+Pl[Y8;, QxEEt6#6j-yVγz"BVkaYJ_[p͐Z!rM;i ;| J3 #npz&xWioq^*fݹV{ݨ;(Ϸ`zEaKURAQ< ԂP#.#ҕE3e}GcHJ^@5{8{3"%A;/;w2Onsp.%~{qTpy }zTZ,]}N`a&%q4W+}N(!% 4/LGcHUYe Sm[kV,JaʋE_i&׬^5;a;u JHW2@ +54kbZg;F$h.Ke @kҬ\ I0KN+$z"&*Gi~sREc + 쓧Q`y:`xZ#[]/P%q/l6!/Ss[PJ=dp!Vs!!^ +҃!ad!,Uv9ķͻ1A#Zf ֖H_Uoq ͐~yV{45.Uɇ.Aiev[:|ahY'{xL皗3v®Z$>}#Ց`O^k&<`6p=jǩ=kZ; AJA2<:v9Gܻ Zwi*C[άp 5{Ek7 @[ϐWwe@} YOky?(E˩(xuzyr@=rĴ}z=swYnCf/ {,NguTr %oDA-%*;_AOp6"njܴ( OO>$RuD;|63hל`b +{UΪ}A]oms]/D;!>qr"sƴl#)aeKrp;c~lrO9D"CW +Zbno=Tx56Q"R[#%1/?DQ]ڟeq5u.5BOX0Ѱ)u䫤*]Y4ߺ4`uk0oKgg'r6TMU'riEK3-dtýK^_~Hjt͕3F\$ 4CܵXrZ*EP+ '*vGb}C)~ yK+'t(8\Pw [Iԑۨ1wZ}z΅XGyj)P+f +yG bg 3^C!єb7v􌘡kēﵠ۞&?x]g5M ]#xEߏjp!4켓3 3B]s ^A. \|rgӥ˛q_*G}a {F6ϴ"m.R̠=DcM2BG@5Pf zQ-> +PsA4Π ÝQ-tua^HmEh9WmLC~5\ PĐmU_d4Qp2a57Vx>NPgIwl![o+N +POlk)Wr:>2SsbW/9*,lLWO:N눥(mz<dz|FVxf)dŗ"*'k8󝌊:Wv&(yc__aM{"]5cr= ĝ0ԎGXA[9/0R^X2htBݐ8fti%:@NqK<!y NJc;]Vxǥ"fB~Xsm?kx8XUUN&va K4z^JwfRڂz!LQ>nRQs1 )ܷs+8NzdS-W>^<[w([7Xr:c1 (NʄTf7zin[T +0GAkݝR ;kPc-Q2ʣl H|Wtl3R'$/\9pw +8qgR^ŌlLv촳~Ax 6j)tW&4̃L>?uVwI;>IQΠሓ_~n,=Es.|A;>l Z + YcHgՐݪ---Ōp{@WBbIe^h۴pA-e?MD?TCJ68n >W8/q\ +ycnaR0 8@?@?xcTo 4V#KtTX#ݷJ[铳?|HO-3PFh]1LڲAU)}8A]+B󁮶O`۶3&ii}-'[3e@հk >u3G2:Pא#Ξ(R _wXx"g`G^' ^(j3ml>ho2ŤP4fCɠ3I' n>moءA$Y['kb-"ڀaa}NQE:#/G|@ ?x{k[Sz9PsP܁W* UzWܻc+G߷Um4RAGG0h\S8>+8aj3 +ɭ<x޿#oxiV}Bbv4b f9JqL3꩹uHNr}uw?6MQE2p)h^dR@OhzfBNgJ +o㠞}h]l`Q+bEnP"#H; +4NѶٳ'W`A D|N٬ 6Tbn%2,)ݵ dk&uԭNo">+4!C!^,7{;5\=}~c Dj8JROlz.aD("Wu?KtMr~̰75L+D%n]Jv,H)ASdaͣVeHêbt=sǞv?jH +Or}%.Ūġ&>]FZl wy$G$˴_:.,is.B:&@̛"&& +PBH$2-~vQ~'s˩c:Z7";U_U}u۵(*.Q. RI5ΌBavvnቱɣ\:^̊9u\ICJ9|XFvZ QFQv kR6hL{?VȀX\u[z[oGU UIJ,K]RuDE}i/H7)NS\ + 17iQWsD R"-08șu?UuU{7Wq49Dp_F*iԫXMZLl%giOTuG]Uac{5p J " +;97n%)d AN'ăWIb:<;*.ӹlנM].ȋ#m s#*?3KTC6,I {:Q4F4~:f~?G>\ <59 ΚU*-=lr ԳN- +4 D)p_-v0`[a gܑY%+"6w?R&`S9!p/b{'> 0쓪n*s'jL4JGuV汢Ѐ/}nh= !v:G5Ye’wƙ~^GIJ`TH +_^n!Qu:>pd%9 +`-]w\0"ZM(Fܔc>~6}Od~ P&gw +*zWX`g5TFc"$TCPU> }tD+EZ=U{cʴ& +? +Nlac 6#7]!lQS}%cDV~Wj•ѝûeLQla J55g?/͑&w'r%.|"*@l}/҄d*&/vaǹ]4CTU$8Lц+}TE.Qw*nBykE%ү @f4f29U>55ڟ%F MU=| X P\VU%P9Rz拹L^9*$klT} Y^tZ6t)(<5h~7JsъΠT^+t#Hͫ +X ]rRwC1Qy9^jgX +݀_O܎v^U2 u +-dC> 쉷 Uh8-fKAj)F@ެ3G<O`;Jdv?E}iAA6?XU'IѨnG6a]׳LƐogH@g endstream endobj 33 0 obj <>stream +,Ɛ2݃FЋIJI/XviߓW| !z+ƌ!`=ju8axC<)[-bى$=}-7mf+"Fv`M~KiY u8c'np>Ҹ (w1,٬,u3WDŽ~?F3optx2hIN]hmgk#qɇz$eGyB<#zGJ~=pvU} +򆃥<Ö{!C-/b?dDomHQ<a_7"X\W[)r)BqޘJ^|Eu*Hf"2oi A % zK-W_'ywtjubX&0[$W9 +Gdn呼D͂43py޽E,a s#qȱZ,+|J& a@%gWz-dkb4^ܶ*oOTRK:);ݺIjHos[!6BXnqnUA3`+tD\}L|wG(gىE,iܨ- g$b;Ke^He WTL|_ ~NܱJ73d-VZE8' +˘ tTQ+b5U72W*[4+omʅt+Ҧ +\hFZDYB@*M>PԮH (=kZf"I8+* PQTtM)غ=, zFH;uD/= w :M=*ͧz oFDK.^5au,5GԧԾ3X?"ͅO/(W4 `]4!{ب%Q"QtWPP[8 +/dG#D)ةQCٲ3 2BCxs!bY;G~ Z WIa VȗA*auXC9>Cvt?sF&1jO 8ێ0W||~?P#4@:.Llgy* > +ҟ8BUmDv g)?gn6$|?OAMH ċld#u<,T~FOd#ڿg| Ys޲<-ĝal+ aGj`f;µ mn:]Afܣq_^{I %G%z60<孌2/=cOJB<PѤi0:O + ~"au0+9mv1?$ʐ+^*x`+huuUhfvʬ@ {)3QAs:DHȐ!P#SikPnٖdΛ{GE>o): chH-ۂh_] 1SG6Yjg8r?RI|!7G8 V|;H[hƺ|u6^DTw"A݆d:ڗf9Vd1æAn[_댳rFiU->a>Γ ZS +:a6Q0Ja,@Dr!l*ߝDFQWeK|q3amTA6NHמ[YM!>CZݕ'K^H x|q uv*3&jLg,;q.fW&.t3dnylJXwխBCLzgB{r#x{g SJG v8_ +r2 J g$ܞk=⸓ou#>ǓBI{qOveu'C{VFw\~?:m@G\"/80}tCŪ @sF%/Á +בnxp(cD)YmWt"uКR+j=JAb7|d0D2%`o49W{~բAYjȿ-?UL8>Wa -`Wf'z ()z+>^[O7oNkOd4bMuP5RٕIk w#{u.-p#\w}w{ʡg)'$ӞX ס>/'N)::.R u/.1f_ROSjBЦ\:7ږ3Z8cj^@g[g/-j\/9f%ViٮrSU& 뎖=`y[=c]5-n1^~|~szasCm;kh Hs̶ќ\5sZD7g{#{+ju3bœw{_Ct-L7o~'mw[)Gw%8LKR={(G,>{XHWsO kQ7ʣx&ޥrX@iW%KTe"zz*W$XWPy1AwQ9kŃD׭@ȏv?؞sz/TJ7dHz#7^fyV܀۪j̆4i$V_Rկ߿4xVo{mrxix/FkgF̶&-ґq/PqaqXaPwqrBw}nJ  !W vr57Lrkݟ9a=Uv}uնpyqC(bp;4WW?}Fbx}*ܝ!&y˾KB2-IC35=jFą`-glDVgJcNr1~N y3 [}s.0œi7UU5m'+,,DZ*sW.kx~oN|K}Xpr +##k 0t'Bٷ̏4qmucWcptz=iBQB4*/gy'5.i̹quDK )XMaˢtJ꽗,) +-tR '98P|SUMsvoM+ oIŊGM/LS]|Φ +hs"PdžI<_S"X"+WUWxl^%#FKĔ/^"Yz 7lBE!}W0DU4a#:O}@=mgh)nxdG]fanN6,)%4ktֻ^ٱW#홧UgD屑Juc֐'[||HuQ(~AW%]|a!{4(ǝJ_p}A~7hߗV5 z!x mrXA0wZ^`9Ss{Ӡi=&{5v"C)\{_ :n `tQMf +Fz is +wMȜaW `:\[L7,4CJyK.F"?LNTvxXr1(y^ p +hn[&)_z#d8 ޯ +@b@3f;ohס06LWmgTF9FIՑKh` !Uw2[-"_5:2UD =8S1Q̿:""KX$rzap֏6#O{ re*n cYK@wIq<󲞀kZ b\z 1R2A^%f gF.!M5r#*RlJv3Yơ3J!jA:6}B=¶{V &uh)OvPL i "Yw3/@ +#u=;(&a5ˍB o5#Cy]]]qN9J~ωfזVC0A6) QG"L;V1O +q-VׁtV̕,b1UIUq!{ġWnEParWV[xDi?r`-Ye9-0| #lDF$_<Þj=HoWQy)ܤz% omqڀ7B}$ɤcx)Jً|^9KmK j06"P3c`35Жz ,H8%]bW,$"A9ɱio`$פ#\8xgr'T[㝩W)okp-L4tgk8(O9 !aSE%Q=8 vǓ}ƕ;{5("1zhg6 +ρ~E,\h{iSn{MppFgC5+48.v/dԚu/$R(Ci'HkٲAWP>#Q %ܺFIRS]]W(u*|뱶X#W8@xUtd7sc2hgi2ɤh?_x^ߦËpN-ˬ+Dϼzw/Z"Ϛigou8nyKpMQM E'PY Ua%?EO*}3&&Dy$T4ϕڳ8R|Cm MFln6ݿі!.SoOdnA_tQۻ5࠷Z g1gR42*$ʐ}ԈZ:4lQa!,S dP#+oh+[@a6`3E_'dc0L2(0_lvJ+*|HܙejU +c#h2bZSC mu?,^"ǿ +V|򗔁Ĭz_Pt|g/?_?x񅡏!|6^b?*Sl>IҤ\Ht 45{$jfbq+CrΌcB(L;#[@@yۑ!{37ڡbjr '-4XUzݹb>jPj-o ]~'&⤖OmK(Jtt+xlIHCˮ/̡mGKdYbdE>t'44L`dtm~e x#D {*cFiE>*|32J?㰋#&u4GԒ(2Q#h,4R7*]+ ^o <J+2U!o( +NE|ɯ/>(dQHb# hA5f9 B]<4$br8BwXG̘.o7དU +jΔ,@dI؇׈@NFqs+H[ }GXD1Xwx[y?|R=mu6 ʐ#Ѣ]ɱ!dMvAT39A朕r+^;%:Jq8ْ +,ǻ(* X\K_S9^LO@ -3B=kGIR'eP/q: <?$x=R:iwV=^/p.l̛^ +S;|5jU[ 0w]ij9ڹKk &G I#1-u3I`2M4jQf{9)<q~QĘW BJ_&q?Vc6 Bh$?au)Q1΅91C&#'FݚUyȡ!C(3gfT^h*4LꓫP8ly 27e\+|/9l ݛ7ZQ i3j Is\ Ȗb?׭i;sN%SZ=;|¡l˙$^P'?^MlQUo10N_i=TgJ5RհBgNЯ$wfw"'-Q6tkSgGJb^ȭ GP\E: 9(0/rZVG%[BEIK,r*T8ƌ}>OVUCe~T;nw织qNܒ)T(IZ/ndRL S_ԢMXh*]=}U$[cJE))V"Q@C)m +moW4H4WX€/sřBl,n$t9*AM=u? ap +@[.ϛ~rVA76b%ّf_" ]K +u|VlQrFZwР"fwUv?d1vrjψ+A ^9DeZBx$P}` +`@pS&3WZjr⢇SڕlnU4~x)/^E?eD:#}%9w`8{9Iudªܭ@x*5:dn/q9ٱ jm8e"w{|C|?-I lH=7C]ETK' +7?th\kc]|dz*xs%&2ܱī2eGbD5?iGcMU6e %7gXNBO=;ubҶQ)EoRsZhe֗iŭAӿE}#qI`U>|YΝ*:i똕vƌGv`RS;`/BFvF.6*p6;vM_eIUG9sgB4/Tڲøb|KnʠAwE=ܾKG1O /Q$x @f[u()Hz-z7Ezz$^BHVKآY.RU-E Aܸ">&qk _rq!|"-;'p|',\{[Cf*Y#gQ=Z#}cDx߉DŽg4bv-#WvW#aՓ#>Fb; PB%#V?\$¨~5DXQZT1ɦ,†2gL7X;lut)Xj =F +&%bJb#$+~{$F3$.U1:3u]3BDr]T {8IκQGy7ھ6ߔ?8K};+? hY{ 16^u~R%ݥN  +,.b]u+L)#@1PqhоzRcZ `ԠOS3walP2B iB5o$7OM' Oa`5۲܈t/Xs0 p#FGU[o/ +CWXz{ޱ!Qȩ;jKG,xktdW>{CCFT{#JJgyKM0CZߒ|C(-fwf1VCG 0y5g@ a7_Q*/lx#?B=\β+imY|9c+v|BGfԶ& +DJSDl˛&_ym1 Xw|E#=vBH  gJҕRbAZ]ӪUTH /[ֽGכ2:܂e¦J6?FJ=g3/S}ayMo&|FY[)'|.'ZL*9A)XJ i1wiSJSCVZX!d(#LKy3` sJPip'?Mzz:h#+i+kD8rB"K^?? GطL(;g&㇈y"+[Mo釆,HQoh!224AFږDcˣmet08@| +C.DUpLӺ;?85]UWHA,u}H2{{_I-ӛ6+'Y#WiTWupôL + nY\n)YfȌFIZM9tO^}kHl +(|6~Czط QlD;pǐz-ncQ#фGxRbUGXk4e";QD1=U9c(? /x;Ȫ A#AŦL]x +6#L\@y21 5#}e: YL-~٬ԫUdPQ5#vd+e +&U]%s®idOl5n4WBFI(4 xܶcH|Vtb=܇9!!oQZS]q =< {g%ƿX Jኼ՝P+jC?@8P2/\}ZHP5_/>PQ\Sl_ep TJGzzPƹ^vjr٧˓NƝ"tE<)g1{d0,X^> ((HZ=08cp[UWwʈ6b5;{/oEqFFgBʞH"e9 ?x'6ƩcN\u*;H*qkH5P,/j7чuK3SL;$?s+DYH~C7$VJܑ&$$*si59 G/NOb@3Fx1u ]zPJYB:hBnݪउQj{9KdOK]ca*\oN^Y].t;bz%h@#NQ3'T@9S@{Ĝض@ +R Kw]񆃒)u6hQLB +^[a`҃+wPPGipΖ̟w&1FnGdCw]S$d!I7:O tGWs]']w!l(W7`+ר "AG";wle8}Du xP @@=O]5 Iy/46>T>i=C08Zr:G:ʣ 'f8AuRJ\ VZH*Wђ2Bb`,~$ᡴw57Jzcj2%m3?2ث^A$Ӻ+(>ZCs}I92!I "u +Նn).d憶zGDvH6FEy *B\TDWUUp,xe8^ wOno{=vhe0b ՐBtgW~+gW7\fyJzAzRiGUG欜NC> + ?2L$X90Q3,ոR!V}SZïGv*khUゑQoP:Asρ#eaDՐɳʁj{O>Es% $hE >+D!Q[3i'݄ c[I0}%-M @,n8c!~&T](\by%7T sCeͦPPp$Z?0lҹ2NaawTU +br\:hi`:א쯐1-cA +@)՚\wL҄eJ]ׂSF\M9m1nx,evd0w[Bgy} 3TlIPlqv(=JlEU:d0Uby ߷a?dF0wJ! KŻhU4Hw +7v\%ғo,TkciZiB1Hy3|h)]g"+l+fÇkw*h&,1T}CVC5vU}ᶂbF, pyw9BvpQ-9~'OWx=- U%'` ǡF{& VUbk 7BJI7 Ke]d3},H-mA#]qM!3V$5BWi+s\&Y~Rh`GG+;: 5Qhr_xqٜ af)SEd恜f~S(w yWv7(ڹ(ba?YS>XbEtS +*fq~FP/x/U96#;!(#ovGU/GuA(0rTT]U=-CSq}yQ_a UVD]xa(z ս" w:=&FKe8=1GQ- >As PAnmz a`2)8)v_b֛'w!-QT[/}4n|ǂw}&F6;Ċ2cMC" y4G?jidǢ9#J#*`*ċ.@ꁭvQ/\%ʯӾ`R'AJ0y^2|+勋~aoY$̎홐^E9xs"9$h"w~l' EXi>f}  _#Z͓n?ƙqqkjiQtF5^# <W¬G{?y5Zn%|%Ek[dn`5"^^\VвE-M7t< +Z<;ڒFQVϕ9 ba8^CÉ)Q#xєw ҅ѭ^.sv"Ip4 g tpދ}\ocL,FsJ=:zK="f1%N6VA̿(Q'_Kt5"4mؽ* |ɐY,Zz'⊲K +pR ߱*M-Vps&8c9ԝX, f4jȈ@~y + FJ1p?g8煈ydhWĔg\#T(j&x}\/*$\5!FT{DR|,-㉠_LIۜbQDń.(-c9 U*Q s1kt*<{-63\=cavC%l䱀މZH7=rv qmtCz {d QMJCXܠT(/#ڽ ܩ<@m~_WNs]  ~,8}@0+]j!8XQ;DLh[2kUtMsz F~#^0qwdP%w +?8Z9P +ȸQF +g&T7;TT/@΍}:[`h^K\|^AE禐!fik$i̚ Rl]qHG2Vz('TE:G IfZjca2gN2a@RڿyT C XY .Uvf{D }"$2>Ph1zACD"NIԷˤ9|my{n? 3&齖>EsTS8E۶Lxwh.a$BH$%| BTʯp$8(DL"İu}QC|+#FV +$iR;߹аbgP()-Em-)rn!PG9$DnIG͹ /?y\ϝׁ% kU9c +9 -Je'="Ic^2EQG<~ajJL;9.[׎I +>s#7h#zq(h@̆UOHpc9ĉyG&~!!a$OjԊpZj ΍PU2(}N`B_;Swց:jY|k%5+-y醐hAIuJg[C!+LUF4:5Hs'֞GHbh}JB}Tff^Ī}۱qThz^]Z#ƃvKLiRQVCy~Tt*CaZ%H[Deff֢XPϔ"߰y3jc]fu?-qAj U؍ lfɺI3o8@[EU&Қ~X udX+P +"ӟe齓 ^lHoϺb53/:H@c%GSnKҊ_~D|c//2OijnMB ζW_2۽i|sr}(ޥ-a +YC +':uo'js)ᢄ/`?a_5j3n؂eΕAʯkWG!(/L X9@F-.P3la=Ԧ#hҦ: K^.?㝽EKnf:TÔKMRR-o:0PKc%$7@I*yX:֪ {NeCԓJ+S=oϭ]ś V 6eCpz#Z,r7?*k1Y"L#7ӑ&ˮ1C C L$w#bث9aVx .n{.Vnt:1c۾+x +(@P1z_c[-/ƧAbFCwxu_|TJ {,p|sayBB Sĩ'ehOJq),9Twx9Ex[3}Q0(r#Zgw!2dG(Tk s0ָI13N&mKy&A4%`R*f'?j Zi +_'OYa5 jZjW簹zdT[ȏ!O]"}#{ CD 8V;#蓞A x;؈8R5yD}+fvY4e^eqW9 +(syي$XhHP2p5FL`Sճ`@Hݵ(WλQH}nTFj4cdU2.5R7sOMAXesȃsN͜'tv+pXFu构(7W>I;By]qӹ;-*-o,Br#(;N)zPXޤC* +UbljJ0cUF g>=1L=}8 Q"%r n<*(V'#¯A݊ ~u}8p.lV V*Z3jF~u-r@g:ͬ^bO`i̎ +Ln珲y5}gEd2&{sOv*֬"^{WI>,ŕ?n]_-Q2 DDh Ur&WV'aO-GAs -ٍvNwSi7'uub̝BT%s;"BթO,l"3Qjޥ +|2':)(PNPaHC[|=dD,ŦyZ|3Pr[z?uK2S|^q%Kك |K[?\`FٳVf+M竇6#DV,!UFu +f{x{*?h.J̐X˭M3V>"&rnq' IͭXLܒ`&F#ڙ=$#L&{[F]<|vΪS2%AxaS#@RN.+ڗ1]W]o j:nnDsWЌK/A3%6!6" ֧WXQkAp4rx\ a:ŜFѕL+$^ֳ)Qא#^Ne Kc">G\\q{<#T`F2=Inb9,GWJ!?T ȓr Pq#iIn1UX⼻`, []`'!iԾsʊ&֝4j5ˢ7A"XtP=gՀLC77OEk?-+$\QסWG&VҤ;`V>%3$MzA0fC2u59M vߋҔŇkTXoE 9@ڭ/Ycgi]rCݩC!ȭP}%r.u;?E,Z/Hgf+yt$19|@6ݍ;CT |g`JMB?-5Y&hH!d:-EhP&pr̢ +ozE=0}*hbJ^sG0`tMrmOA7H'mO_Te ViG!c'Ϋk~؛Pkj*S;S4Ydd2cRzzry{:[R +Ά`բgjKO.-ZwL{)2DK(KC( LZ0x2!0xؙS%zNdYKJars5pॴgɪ|g^:t84 f{W"&}RgE@2ގ8u{6wxOYEWf߫|1aq\ax;51(56jMQ:j7d+13{wίol[wFcE!}_P{3{>{36kW w*n{N[+Gd«9l!GĨUjUlQ)1~B +cenlW҂*N䄽U Nk0g*26Нb}(ZOx&~JW,3YnkW=hWX{;7Cv^2#C1roOXV24 cby_Ķ.iŵ(>q if#!+ɧEz|sV*$zpq J$?PiIL 0p U[ ykSݩo`]K2W IDS@뽥^>0P *RWVR&BBs(QTP{i +mBR\\ſ<6v}噜_bCS*/+AwϏq jzWhЈߑEkB'ؚɖ GkWrRɭ^::o cQP) l39m>ja,ih;)u+i&rriúT%{)c뭜y5 J5A>1h=JO1殼~֩`.Ue{R@HŴm)x,(\li~ У *7 cjUX3W @ڳs KB81qB4c3"pjy8I2XiH,Z.O/7qYzTJUzTI[_!NL-XbIZ(_O0D}8w[(!W1];&-9@ܕ]Q %Qȑ6U^?  cUW֎(hYKvT^>2?Mr}cw$gS3Oe8f^n7-FqI +K\'vBCN('aUx`tApBP]"=Sǽ}-+Fl`kNF}VU8xU^ə^qhmbL1' +AOH1/ЛfUӛύtꈉJqbmqʢIT:"~:Ħk%Ȍ+$E껡 m TQ[p 3o'pʛtHQAh4z̪3l$-~GDRg (V 9xAS%eV&6(AKrqwH~Zs4DE$q]gd"yDçXwduYlNB3LotȮKJoM.=Df.ZdZ8u+šUvRp238I +ح5g6ޙugmhJRvJ3ѦƦG?y0V/Jc޽&^cqB1:*{:g ^OعWe7o|8H`d}qڶ2dDx?)\ʣG5w.{W#QRy3"X)LrfרZDocz +tsi`N`=|+ťXk2jQIޙ@6̗M^' ?_q1VT6ܙQ [H$`4j2$a]ș"Mxʱl們\Q_o])$V@ќ#La?'`2DFLȧ}l9X%LNS66ox{ftԮy[9ٿ_ ^xmYBȱT ؏ +;(hoDa̩ (]qQd3ĐfMm0')n$-&1}ӓfJgZ3UU6?5ϔfZ"gæw¹\)H['eү@=֥/܁,wA!C @|s㑚7ܨEv2PWzM2Oj[7x+DO;92Øhcxr^|FGlN0˺k=2Ϛ +v.;&aE6ލ"ԯ wy*%h"O(mb0yt^1ש\)GϳmTnL£*XG +Y+T~-؄Agtd(Oa'V\CT 3jbQ|;̟ݯ;@)-QB8f)@h*M ڟ ܎c jh&tSu&ꇪbQ{٧#v Y8&p&JVYZh䚔;HkOG}v +ƭpKi.[)5< !+_˜?egmc%) n8:oGX`>C[d8I UC5ou:$if=冽^H3 +3$ޟQr`E&ۀ @];{ɑo}c4* +cg960$w}C|U`HH?~ _<ϾXZl̔[&N+̌p\LyJ3)@#,NѾ,?m}8c@;hdgw$x׫#̫92:Vk56W-eАWGG|=ڸ:ʗ6$?ϲ*r35^ĂG<Ҋƣ!slkS /_X.))Wj,T7*8d&/ l +Uxj#Jh(T6,$.X%bİ֛㄄t{{gȤ7C)*YC:J=KA149s~ַ|| +K1QTzm0.6 L NR3fbbS0Po:/29@B](=Da5$Mj.#\'q㌈cpt,F|2AY 0h#)׍ h1H, +&%g~kDGC|BXJ/FrE$ DQb!g}bG6gA@tݿF ~D>YدOSp&X1x'O0%cOdNTv>q_T([F6RE7FK#y>2Uq1yGLO:ڪ̓Ÿ0ZA'R/ ;5+(Ws%֯o̊Om`:Z lWIfӣy?Ne J`AYwT5S7)TE9v>á)֤{VVi!c " sTuT +ݣ9z/1l<~rjP6[3bWTϏ~C:DeIޤN1 ҕ"TxmsHgZ]5,ͷ:洅;M4>3i ~ ԁ sZ'y>5^t,gn~~#'niA!F]YcE1YY +p2͸G\)nawx=sIPO~N(iґQc7RTM}@ ܟ>yƎݸVyQ噪N,LfL|liO?S7X + 5P\zB+nC 3 +Fo[$5bWRuWC6rf +j].kIC'Q)Wi -|~>vݙ7tԠF"/ i쳥]ŻG zg#~bj騑]];d>F޲xmfrjR6A0E}'-C8~ުԴ"dRYicҰ2'VR7f#O{6duܞ qc煜rl-bʅI7L0MJ&')/7-^=bqw~K|>RVp2cXp䤂-3Ev:mU |t30?pҗcxO2FWOb8IP}o?1 bUzGHkG*`4'kiڒ麶(}#Rpe`Gc p43`fNIAZ8ao4kF+xً@ʸaz땍&II_0^[`3La隈bclGV1UP'_ InOBop=A1-m#d}:)ܚ +ܱ:")Lev*`:bS~Cf?v*(":U _<(x7-k茇t&/GHsF9(.8qGb*OP(GQZHJ3WeлX? +ܹyCnhD}D֘;]KǬ.WHʼnf򷈔o!81-^iKŕ\D~WOI1 n~B=#C/ah@m3GJ|v'ZӐ`t3||x @}*JU!K~I 6UĨfH)k߮)RaB|}(RTN'\VbQ + {Ũ[lf ûR|Wtũ=9Y7wQ7 +39MRNEE]|(dMur݁8nD+S9]9[eC5Df]ZqE|X2In!X.kK:gdIMoy;$*!ǵ#AqBNög,_5P' -*;g-:<aH&`!HOC\yDj>WRϯFCdEk3}6zд^?d-gu_f5r/Г]5" mu> !Z@,ؚ!#ERϚGşI"]TG/0;"ebB:t4xa}:x.#[y`R T='}ip%=h޽+謯=FM* !\M !Q߶pŷ66ZKPz !"G~d y˾b{(.2k'%B8їAèWC /fF/Y4K9N3׌5Wyt*ghq?Z?JPeQϸA >XQ|}xc{h,'pz!c~tM˫Fx1>W 8ݮAD;1.|ޏ%]O}xa!EZ\0`&Qf@]|_YVO߯0"O\l͚87NHQ^<:B j!C[\2~G9S_tdlR{͋#j +EH+e:vtc,ה'#4 ףyFxU=z'c.svN[ǚ>U5 z2x#xg/QT/^koEH/ޙٞ.V]pVlX}5&vyL3/&ƿѬM^R35J?w3L'Rs шeiz#nFu(B 7B7|7@oew4BrNbPw:G)I2l3+;V Ej,m7s9o)-eml:Lö?JjO=oEQ~Ѯp$j[OTUZA,eCmX.(zL8v5H 5ē33BwGc)D*7wG%~E0h}YQK6|mЕZC;}{;oU/UFUO*7ͅ[  +S\MDsU̝+#GL>MB\YuwWA(ěbi mUy.GV3fx}ȫB,Эekw'%7.V4CZhО +ak20A.W:A`z:tnDyT@]=j +GB%&wQkπoQ%f1(a=o?+ͥ֓@Zcg)({iݦ(oF`:o2׷D3SLesM}X@4<,OYRVP8# Xt!X&Je< {U?!7 >{ǐ&xC`֝C6-z|OY&\6)ʻ-tŐ'N¡j-ÉVoh;ڮeoW»Nq=ģ<ˇss!@o >? oBvg'^hڛY=c熋[ęd0TD J5Dn8-!~PnKB  #L3'}ڸ]Țk9kݼKRU2s}Yj,iϷ>r9Az  atV3#|݌M]_h؆m+БAo=ZI+nyڠNV[s|vs.vgu⧀?gD?=듬haiȻ61-7ND\`^j F::@p ԾW(WW {]jܒjtS$9ԲC-"e0RdڹM:<\AK|Yrtz.FHiďfHN^$JHQHѤuԫ$*sC?2ƒg/@aE kn p#ǣ@J)8 2oh+/8TC_2?gD  c}O-A ͷp1` @=LG޺YҙZ9y@Pсˤ^0Z}H 2DF5do\k7F>[y[2-wjB/[{[}9!;N Zp!QN놫`N.!⧚A~M봨)cJNaD;BdB.rkQ&*ZdnPt"uTBy v +E5d$_F'^u<8G=I~em8)=ٲ!<{JrQ…NUI I(;xQ50nQߡ\;шqTw}!JѬuv[H\-fL^/ thw2fc8|}l +UAĭd?[rR5&Eyn'ɶ G=R4G Ǭ%/jTP[A x#hrY_K AFrL@:)Re{\q΋V-$룅a&۫Z1C& B;2)sI#~!h&27׍xWy+Otohd~9 Y{R)ՅҙsxV]iF]9,gX^%4m4aQMs٩R>#5٫e)6OCo=5tLvB{\SĀ'X"~)śClS [Et↬@-P#&1xWTdg!HgME9|D`;-f05PXJ U~L?%/3|h(֑)H?ݙTAƄ~tC{ +8US;y+z;b/t I +>{>u!;{[4z"PõJ dh\9[3]{ O?ޕ-g5I0c<1u2g~S>23[hyU$ś'Y!ٛHnՅg`j@<>])Xӻ'}BZ<~~ j&BȚB44FznkK`[5/֩玭V@Υ\{pVOKRwBMO*G/e9zGjmc'V] +S.Jh1QQi15[|S os*f;x5 itzY~D!1͓ qXըsӆAabҳ~ !5u/ҋ~)aRǣϽ aCC\q9܇Ob;Q*BN_~$[f 뛸3`LѼjg0&P/6"vUZlobd& +,TwTlGY߈tfgc=C^A-׼5վ+@ڹ=A3ju>:Gvf];sO2z8S|0{"+ΛGX}om+[_܃|IS衺I)fW0zz-NPdHh\otԮ"5}2pRME V )ɷ_V?|"kg&L 7+?Eׄ 07J6OrsyO݁fnTE2 V[UJ]^YliAE*2hQ 'ŗ=7jN٩Ȁ7ѝ#<2!q/FrV"NQ( !⼩/кe|]w+M dgsGn] ƾE(){.$ǀˆY#ԪXCZ wJYgolVy yFJ9y31՚8?M 㔒`]RR"K{2lsꨔF3%ҦivX)'ܿ f9JgK~/k9h=K}qOqK_|-Nj<` +ʱc Ra cHڢpRҸjL .Y]Q_~Q ^]˞=Wj+rC&*snެ[ [wC%!˜FZR袇xodx3tЋ'׼]ǹ^d_z9 Z/s%,CUo U烸-Âo[)= !<$ڜcd>[E +8@=UvG$.WuG Avu

Ϩ*ʃwH)-O8)_< p%*I7~zJ!5~A/^#^#0k tE\Eݎ@bsF.GaM{gPYPV {c,sk~KY{|2+wuܭ{ֻ)DYk8HfT;c]qǥ@:w]*hsƠ]W[7pGl7gw;}e}eA| % H!)n{ Yls[:#*D cg}VZd ra5v +rnxAQД#1Тx +FrƖRi-C  FAMw $D;YAV1֝1섷CZؙK`-ve e^c.;/?chFh6;k> V 'EVW=WU g[eX&-@HNTlԭE>b+H26)֐BصͳKC^i­2FhE迃Ӈ,gIb:f$)B/ i8ɠG^6۳'hl5|H6~Z $]B tNb4(grC~z-rCR5Ao>e/0 7D)͆inȐxs +3>۬b hD#?6pDATĹ8Mg}7I.VmXK7%EPz}EiⳍuhzCK=bghT _[S"Ѓt@}wjz(QPZT+; + hbs3BQ*\(VPQ9 E2cDZ:AFWĜ=8k̫ZRqGӺ5),L=9wr ~`VkJZY1jk1.nr2RNrO۶_cLzkG{@Dzz ’oet}ӿDA3F:>+y:d1)_bmBXUSOA*+t[Gvwէ3koϱ )%& ;u?S 9GZ׈~߀׼Rq]1Iۗٮiu+AcfOBA0u1ЎyK.gc+Q*<¢8Ẃ+` 9q_: +u;߸X0z~@b??4aUqnDh"SpR}$q +r?#3cH翈]P{2I0:ڤW<'0E8=G:NԁE fv⹦ T0[M8β7BT2dE$n|zpWtcQqx| @yT$#@< ED{67‘u7ʼnpc?;q%-t6бqo-QWcD0lw8nK R[^:wTЪo  ^trUYOkk? jq*f(I, UKEza¾42pStw6ZomOtZ;+|h#2*u8XQ<T[~ޤOBĴ`>A.G&)JAwHH>TSHP^MhLUL"%u9 qjyŇ=qa׵|&va,8zYћq1B`ѣ,TqorS`!t$9ڸ>.8i݋6B}rR:v֕Oe8hd-Ec%fp)K.i0Mj0b]'{)݉aE hCc`(ɐ+V`,Ǜi쌶+DKT.jzQҫkر66Œ^b7^o_i Wr(5^cl-KE+詨/)9i>,$;'u8_`" >*) \nzH:"L BVQm#h[yQ=h3 bRuIgdO,Y쵭[2heboi⣷ ήIN((aM0:Ư,e2>0j&d1H:w_Ǻ~J\"|RHmx]lOnT2,'#b<^)Κۢ"  k#jz2 +rdҬ3?-B cd[cJB/QwBk}}cZll#8l~$sǟdJ. lHCe!]ʻ=JrEn׳No@9"0skT4CoӞ(>(/ iFL'r}p J  +ah +8pP"Mpޛ6iO1AOi毹[BIlhXcR{ۓz"8D=6lc7!抢\r{%v1ө,iXюmfHU,1\P:G5zЬYE/׉]oW oڀ}ϗJXw&lə/ ]Q@[VXk;uD)VާrҐH,y=ESg6Ed<֗r8C?cݰVɱ/CzgDHzK }E53џ7VCǭpί>PNt7 w|+AhQeWǸT+ȔV$V8(+2TGZXד5uzIEiOXׂp7Zc8JA_4PRɼTˢUK Zʍv()Q+ī;`E|tTYE*xTd_ Aۣf*&*XqgcA']aҵBR4t !01kNڷ>,@J75QZ@3͒ |i=6p/IauHK Nעj#*"JLZZ˼10rjC$kԐs o|M 﫳`9 7Cᚪ"_o%&N74_L~GM"5~H믵wctYvE?7MIZib &[j= t9SBLM!ttp Ts\4{5| c(Ԁ-i,Վ46ِsrvPD"'f/&&PX>3Rcuk2iܭAQ;JlTSM5.@=%AՏ~SZo8םz J+HyVq)];a^ɤ7hY t`7QE_ÿ'8R! +wZ* hMmѬ'7)ߕkѹ/ +V\Pyi%GL̃sGߊZmX*ip 0x"hy0Sx:-@y&r:BzB}Xg~|& mHbdj%=6=D]P=zQii*rU,ԠgvVL_7d(qא']YkArʥOQMB0)؇`,ONU, sϚ[vksxiF|O+6,QNSP]ː6ĹLLƈsƪblA Rx1FYQhf4q;;s){aUGa[$ +$ԭTLJz*C?J72k%0F_|SUSJ/] gjtr0<+礧U<錄SSpʑʾy=tۗ N80kG +c@j yr/1T`+z{ǏLMepv,hhaIEdKJѿ?Wth9yR,LtRC81?Xkl +tZ*PR}hʼnySpG 8xz:!9#irPEv('%.tȒy<1I0?}:&?@n[^fCf7N"PGSŲ +8(8WI91Ahּ88뙉mGGBwBZ£lz0xo:(o``3$oH'km%FB_yV^tXi,&\Z,;P޹ sٕ(b[Z1sg̍?^nEdGRC8庾q/}%0jwMԓ~ݣٓCG]A /hU3D6NCS2Eu`B3`)_HP8HB$&V{笄ǂԚS5s}eM@L˳FYԶ"5AVIW}|Ű|y=/=j*|-Y;V$Qc&)!ĨhN5V_kg-j)B$} cmįH5 #MO¦!,ꆏW~oKۣNgg`%*Myi?3Ě0^ @҂GB,A*/bϫe@jk>FE٧>Y6 +`t jJ Ok)ήFډH70yH4;c8pT{ZQ#<7^wzJ_O}axo=?Jcנ?Aic:p;rYr`uxG{b}C܈䓆 ;0S};hq%_+IcLsM^qñuu|K"+tfќ>j4?r~2i'm8eȅ)R[*3pQk*'& u +CH1S^k* Ͻ^C"| 1[_!ž]Y#RuZc~BNļ2ī^:Z^ FN[/eKZ&` dzT]dϐY,Q@jN +x_"YRQCY, PEï4-lXzFuv#Y|`V폷-,acB'W~H-UW10T n]G%v N+B#K& ~CQx vf\GizNzD.7mCظ)idybݣAi* I "Qe5gMS{o,**"|A!2(I-k +IHN$L;AI^I* > Usy;| +0(z%z:5##Aj0i|R+!$7RQC5&y2'4q\5D\B{ƻ* .GW:ɗL"ܝRm]r,>|Jnmꨚ;G +~Сpĺsab<>TZX#[fu< ?3]_'4+A@yM7vv"B -OE^pF}qψ4[~%#Eem>u@LlhiL냨+b@ )l'qӤAIIvy$ɉ$}oXveVKy)V9H[';BwM*4ƌh*icq; +I>(V(IjjxyE#,,p}g }k5\n9#A:7H6iJߴaCѮL:SyME軣FGcϝ:ZQel>d +wO4Z#ďHѸB>&/mhCX~\z{u6"V=|uėJ_QN#}_\6e^o]q트BvW=<J4hhу$v>}[)i%Ot}ܛM]ٱ<q+#ەVBf9!qg:ii֝K 4ЯM"e3M5iȟArn/uFd$Mo`Dx:Z5j\&d~$ +E2(_!dIO@ "]C8_O_2V0 x9@ T +2_GC~пG Ecbx7UֿjΏV4jNLcC+ŌO4gwyǾѠOk>* mBFV}~Œ}2 +1u+Q_p>g@_19ױ- +9yq_*ex'#yA#XvcŶΨŎ3GNA+- D-GO݉#")f"/zW4ջKJϞznbM4cU=ȣ'\uB^!q -lQAl뺮|4u$Nw +'ޟz+ek06<Mjqb'X fF!ш(R>W,0aGzI(K@s6qG9鋭&"Y!kdV ZPU1׺ ,mE‘91R7A#JU +~7\f[+Z˙~Aרy?~'`7j:i"F08+Ǧud!U5̿KTUb{X\g'2io)ު/'EUn[Z{_t|dd E&~%W},7@<.&'̟y|~G5Q o0@ fx'V6Hprq8AZ kRx3N3"J}8g$ d)pr'!7%EJs~9A{<0%mg QvZd +YLFCz4D=G:I:NL5< +/%$Zi|\ +AwRDTP7{J4Dt&u#x13!y +9kHT:feJb`C{̎#>yW +(-'b4 로#mJJ~9zl0}hI3qNeȃG=F'w%aBZU.,ѡ3c?Ievxld)G14ynq[_e3Dܧ5/N`걪K@ՠ%yzRE97fmhb [_hu7!+ŊE`{ ή>Z iq#Ǥ1z8+cԠ3K4 Pmjry7W S!v?`1-kIȊv֠y܅/ +Wu-\p(9QS]#2?Oײko[G3uWԀ{0~zGt =BO%u'!:qAy,QJiՏcĦH^}J5^$ TV[X9FɆͱ9F*" Z?IkI$`HwBvT![K8"lAOJ_u[g#kaeE(:F>O=A ~~&|'5DRӫ8|% ~`-'sh n_bx1tE QH@%|'r<#x_4VO U'r>xKH6~y>^?cZ)CS8!DѲB tbdk1 a匈B2;#а:)G{} 3^' +rcd7iF>ܩJ{jxb%Mo$3$|i]:lhB!}ZV#y<ek<.MŋQIsWR zqE=L&{P*Vw^t,ŽX3)aE. +g)y.I6VxiQ)w*VO1!=WSpBXȣ쾋2ޘ!٤RhNmab%Np9&V Tٵ‚}#bkzmF%?PdODySKSwFN5C^~SHդ`|N2Ǽ=Bg)rΜa@N=BDA_}~`S=] o}s'E5ofV?=CV +G G$YW9]I[HZ:(Tw'orkC| $?}{0/O9_ovzA׻9ֈ%9Ssdb_^3ҁkR(0Vg\36[e@-Hb_1 +w2I^~n| [<6ɪ7Q]:`%kuQ*LNI3]]_p3қ#,z,T>YGivcԉpG16,SObʎ  ۻX0v]Ś )O<#Q jpjqDBf`ot<#1N#إG35 "` / XvxG-o 6smUC \Aoi{2%ۘbD6Ã92xWlZg|9!{30#o tp$[{ *cۜPT!Q焪KTN$s%۰4׫!fj/}e3 +W`/˵c}4<6WʍSu­-IMP"`ܡE Q|2㞖V pҳe»c E};el3U#7ܟ9]D^#]"7#Vw"IJf{c[5vcS.R-f uEoc ]Fࡧ%'QJWnB;KME~8u:7GļiF +2J"@{`ė| +<#a:"B7z(06VҁY†DL|KCc%g:&N?gnjx8)q1\FGo~1֬¸@ _: bcmg7#I<0<+N~P_1 6Jej5D(w_!Vq!?3irQ.$6IMM< CΐF$uy^dU',W_c&EUdnpâ#Uت"*mПs:NwtvvFH,ZK|N.TgMZ +𤷳8^7/s.pI1ҰezmQ$5HTY8 =ɑf.Gn bsE6cVp:IEx"1zQS?=jH9y OjTv8NBL+@8~stR{/7+QG3$KH^eEWD}?kơ߅hB2I(N*FI x>G y~m'ȜG`G]$Y CUٲp!gPgZ!yG&{tfT,Y 9сc 6&7g`#w6*LUd(b I*5'e \Ms=+[kxSr +F2"2OгF6AplM1i7ȚۏC:ڿb%ÙDUM>3-'\#?PS$fYf&}#~0QZdw!`Q cG٫OFNĹa(T 6&P  tL{-x_l6jL3nJ`9㊚ n]+*(7ѩ܃e[+#%O!>;ձ`y2 Y~L +go1pc-~1x z]6T3CpÿEG2vsM8S)$7( wYE}ɀ$k .RWR}3!bVF ~':Y8xd7@@dV[9Au(LDGJArƜaY|ÇM+_ 0uQ`٫Oj%Ƈ冥!˪^' + +{VaKNqL݀ϯWEOz@t0<8s·`ޟyF)d +syB ,8&}D  zGLZ1P}:% H=z6, &t^LJΨ:zƔ e4bGdޘ=,i+wqU05O:3B%A(,J:Z4C"JMLrDLJ+m2#U~z68i7 ^?O56x:Ot&+M]oC&w\:{9$)+w4'/h@/20Ҵ)U!@$9qmEri3U}hD"aMbL1pV^0;LȹP^d<:uaE FUK~; m]#Rv{@>̀,\C a-W$NIjQw@0~ir\ B+4wQ$w4ݵKdG{Œ-ȕb!'աW>*;3JK<==Ԗ#t2Xq]kw/,m(7WU_=A?M{fz2@&yG +JMI <@L+p۲8Bf VC:RuCxו*Jj](6cB]_K} %>Pn<0n%vג@a BׅdԒS0+9TwzϹ쾑J!N b]7Z{c5v?HQ@RR9Q-{ pm yBl}uK\ +teGb$ J)Jn. PD{F_aô')c5GR0}JY2I10CɮmL_ak!ca`{Ro"I}*>Aq#9g0-bė܉Yld䶘9/[Gr5%S(@IH9'W@tU&aW'd-*ݰW)0cGFo>7:=')sn -aQ_:2^nr: 9sϕxHab)Cͨ]* :GAT̰q0R\"Zxu~ύ y˭%8X6Pwha&9F٩]b85"G#7Lخ)=B8: @fɐUJ/+|I__]˹idnh?jokPeڣ Ccl]QX^P yj"4J#Ea af] #zP(kTEkj!l(+~3"o`G8dV$D8s'% +'3ghOX"ED޸C>ayb#O0NAcG%̑Wte8_c0z%+>%Gh6ICJ|qЇnk{E9ݟ FlQL,% Qo^0,{L̫񑭲 ܓI-P {"EH -[Z4 %aӕC=!pn>{vK]&lbuCc665,L2<+2{3`wh]##IBJa;z0# 8(koT$4?̾?5.F<)5ˮLvG6GqST Cy~W20hZ19n 3sJ3[i˃4!8yUrX*?e(mBJ4k4ANt pƫyZ"7N'z*( +p!2Pa^v?Վ_AP욬!di\b.AS]=/1HS$YW > +E@ 5:uE,?g @iFw|NKD6~/CU.e*!89uK[Cu#Az']:J@Ƙ]b] KꈜڮN66EͿ+&G ~:Kv &>e0PڇJEE|DIڮk$ +}c&ӎ@v4~&h1C9@=s[] *H;(3YssŭL^߹cT si떏~%UHJiZ b^1PX;g~zZ4rNURwpTTy}ܑYH^;(d PJX/?ݓ#"/=`v:W . rŝ9^sŸnTBBZД8( `zu٘6qZ,ƽz0pH4,vtgrVA;K*;JrҖpkZXObdOFt  w&MUL%2`-' *hLyip5HϤbV>ȎѮ@+4MspBGf,eRa%@DEAi&h<7cܮc'dcC IGb讯q>K-x!7UҢbIM/;3n˂w +(==N`1pF :jtZ%lOl2HZVSl=ȱb7*>ɷF}"*ap%-M=Z$rgwխ$DK"=o…+/Kljf] Y;_rD}~+2ηLFL7w՘w.m?s'$쨧TIYH;#,k k 8vA]9h{_+Mx_3v7k+ws|#%F'l _m~&5[Ԑx%0|]}K*U)\YRќJ`/D"!v?E ML]#YAz ;\M Q*%#4>6=P +#wfیT yx $o+A-ߡyhpw@~tnЫ}xo]N +4ÐzJHvhgE=ecIhB|q+^#ѪdeXCkP4I5E)C5L[ ̵ueK Oewyhg]2o!Gs\۪{Ъ$d99?:/;AgQ8iX֫HW*k̶(VZ&3Ї=ze Cʹ/!I~/2ҹO龜Šjs%wMD hY!vbOh[-VFUFd@5ؤא@J팽"mvErV՚tV3)S74 dW|%\t”Itb8d+3zw3Pk疌Ǝ +bJď#ae݆G2r.iu6$R+wP} +mz/`=$+f'[ `0T]j ,;mp8f3;EGY@g.5ǜu;U~,!wYbm _ʹaι8r(rq3bkROqd1zJ[+F.0 !sZΝ!DµZM1S?yˁȂZfbĦ %JW4,H0%(Qrivj1ӕ6d7'nKD| N]PM*~; +TYѧ:!zH.3 uǕ?~?$BS}}M=#2?g_)zmςE7#'CBE&* HkP +NM^0o{L Bʼn4E {ŅW_䍐t俒7"#lKW"7+u ZĽs="$9e%WI%+ƀ^NkʃDSdzR-.Of (gfIruORگ_A}D< .MFZkN;=Jɜpu!YYZվ?55'rMFPQBO6$Ƙ ?m9;(;,G p Lګx6LbGsjMљճR7]cźbB,Y%9dҷyNw +lTiI0יyDw66䆡j-m%2\t ^Ӳ= Aʞ-ms#=~QY{CC{ +q]TNBx$|k'жx҄ z{5Õ⩶ajwI #EeIen- hFȵ>}*a} [}n-^9 +fߝA:D98|fhIgҀɼ2pɠ|Gg/pPEGa.Ԣ<9ۉ ng>Yt/ 5FTAg' oLfRwVDc/FK 7=oW`oz㒡QN MSiLuPC@ +2 PzY{‡oJh3Eoz"6:9ʃXO#C: +o*Z0{^c"KaUgc*=f +M2I2 CoVṠnM8Щ8%V{vTENH@r5Tߙ%yNq^ +.U[<rϳ*B41[Ѥ+UJ2y#Dzs +}b‶p<FB)}C w*T*)T-ΣsO;. 9l%WaꚖ08dkoɹp!8 4NP@l&fIƼRNQe%"{8G+& =#-$__r귔t^_ @"Mi!; +'$ݨ'ؒ^(r[ +ΉFF)> +}}rP:zK ~~wOcE\X6[S(! +Bjk->7::ڋOU 8$~C>?E%rufD #0G"YFw +[!mx7]sMA!wix;Xu߁֥L>F[ b),~D}aZ{䈊hqHyE? ݧףcd7(=+S˲gff=Pb<_VYT{0bMF|X3X3{#PmOeKSU1Hr% 7ȕGgyyobrRc +qo!TT?Gn?~ϡ[bZ*+dEm->F6NEfPk*'0umZ( dˍ- G3?Ao}xNJޭ]Pɍo5@~E} wTvH&9ҁnrbQI}-Q'@Fdơե(QUtG,3฀1D]dl?R5Iө*(IZ iLF{^4>%b\NǸP]Zx)mxeܝ0I)pޗq5QY["B쫖hte@'N֘ (#6!Cb׹* z1Ntߐ_yn))ԍ\(?]?vck6F.# +] UlO/W(O@>zUǓz!+WMd&6t`s9v:)k$HsNbę" i +~i{خ#<}g +6JYlzX +,~ L{I@GePɲ_7s"=ґv{i̦Z䊳0f1X.oX!J.oFSLuˡ㈤T˦8u28݁jXhA%sC3=8PЂA'>eoK[9c*DW_yd9_Olkͯ^w(!_s|QWkV +KVw<{PgJ`| sJn5(ux%)w m_ĤٜH7@K1te- j͡erLG$/O7 JHMҩPowX/.cE ɽI2WR `LAЎW͕ q{U 5CZoٺ $[9__Ӂ>oAM+=_N +"!6AպKoLOdCy 4V25Xibi]B^QX4vMV\s!V6;W1G<^c"U(;Xjhޛ 0w^yLKja}_؜ǖ$bJDZ>`,š>jlPp5z*'}u:~31L A$f. 0j6:1$϶ȼK*pu-֫w[tp:Ps2PYfSr8QK9%*v$U +M;ìھc?=2Њc-7'= aGG}>sq{iipxx|mgfya<0-6{ h_ ijyZIAv>BXGî)xABT&@|gV20wI=g46@%-r)oy7J*z.m{_טrN2QUAfK+-~QhD@v=\U&F9>O +8䱲iq!qщ #{@S#9=!D_p'U 5}So"j yM[h#JsfNy7,OL/RZg6\jNEn9f\ #PgJ(ZWK+W~# my(,'zmukI4'DGW8U-SKmԧU"47H(m} `fO8 p.[PQ{s#/J*02Ա%st[SkAqw@s:˛0iZ-M &n[dNԚ9 j +0Dk5rofK\zނ/-7< H0J{nšsC!)OZ[1 /۵E/b^4rfss;;t` i>yZ#q僵e_%E>س7]564!]|ELBd#͵)ZA.D&2Rƌ K26IB-(!v~H.é\I qvhwg^5dF x25'>'#̹7 -%R<\,uQ;mJ0*?%fxtSUED0Z&r0_*M^|#9B,f98do"]{:C ? +Aےf/pD|Ƙ7z N7:R/X]O:j,Uiɥ_h#s֒5䉊IYbΏ30 +ʀͬaCCjDf:(סACP 2'?l]Kߖi uAh$,[Rzcce7nx]|!=hG8ί زx*3[S})6GVv+Fr>殪57r%z3%\!!0]Ę\GR?1#hAPE*q;6TJhۂВc^+!Ѫ"Z{7b>O+xί~ΌST +Gd4ڊS8#!BӘ4*7Ѣ=: Y1<˱¯'vݨ%!unVa:=˄+n*M ^,p^NU%VCi+DSwYViXR #0bB3JW! +8eKaj2q|~ nI!x")b.B7 'Wd銴NHP&AS@'/Jc*ӻj4O3)̝C'H HΆ!x=2$+G6@FmA|qV.3mOu${ B}&8(Z)L("d C:۽k +Y~H)k^ Ě{]xp7x̂x` k(wo%;wt4 ppǠ}\SnNyg1oXek}JA OՐz9LǿIbyQxsu- +)WML7Cx_E5FJ@GJǛ VeP9+0ێL N$muAkީMR C4:\ +{.po"1I +2̙='NpͰUZw+8 +齥''s-`Kl8 +J4Ͼ4-85]%83n +N N endstream endobj 34 0 obj <>stream +^L:SaDea85JVLq:#ç<#ꌁ#4Xr(1p.\*51vXo>Hݮs%Sd ?yJ|"8ToƏUBZPt}w +qx!=[Ġ |X-ic^1y:ʞ_pGLi2 +\D%ς ̃n?#E^nulè#b}Iiο2QF]QU[&ͩxaujmQQ3ةOs+iekD툃@9y&Syc5#OYs5E#ywAm}i{5B=x;{0K}]ꎤJ~f@HJpH_\Xk/<T/bǐ!K.*^"lQ[]A1=UMnz d7eiHdXtBKf7B(dF( pӅd=o+"|Nνr-m:~?u 5J>,z-ŚSG苖Ҿ~'43$fm!3}X/: AOJ +;2>$*H 3m5d$},Gܦ5YC X~oi͹BgG/!-^gmn->Gc1 ?Oh%=ݣ=" Va..z1r)'WB_qU<2uUgmg" +_y"P{jBDzOм5y~GVOuh€a0]jOlqهGSdYQW9,bOQvRnB !Ww~g "h 7aگEHrYZN`O +htQe9 €$UD8l|b" vPc?Dv@n3!xyy*G 9`+^2Q;bwՐF9 m-W*zn2A VUY叜Xؖe9@46QtA_ z|6# ZjMD }KJ2u-N@v>#-\ : grȳ<Ȯ}PDa._@o>@ +4?=.7֙dwT$"q _"LGY} +˯6&:^%EġyO?C3$jJq=‰#02šdokHtGrf\#9.Fa;躼r@dLҫj} HOn\g! Tw&he6[> [9O(M,*{5y5^:&qTӫ?rʅuhF"}_`"rեoR:eGrh*D|'mʀ@ւgP%`5VfpZq}`6GXLGՂ-Up(: TD_9CmE# E .IqfW#33'2%# +zP *v|YAtDD?-‘=V̕w#n}zJvFКH?R3 .lmYS>Jy1U>݃geb!C]]&L â; 2"ld :EscU]yT5y?2b֬ rIQH3[p9HPwiwyXΐ2E\-X:DvQcgs2fR<M>.W=)h݌8dg!䯼xWHM\'ӘoK6d򞫗pzr?gAO೯fq!{Q}@lgNB@DkN%p=RԭXW}4fĢX5tVgGT#}QFd3ᵴ uHxվ1W^1n,ƈCvPG Xrɑ`d_xi?xɖ + Yeդ3ՕJ+7iW*b]lDq0에Հ1Ճ0F]͊t{ P_Vw\=ÈЯ+W EGg7Y9Jã`K[q\4-ks>vk8s dZM)Ɂֹ\Wt"TMz̏ɹY84)R#ȅĸ ǐԝޞ{[(З3MjgI8=T2 +@@UŁ"HޓPe{,3~w/:Xx&X%2)UZ˒gqˉdH=7z0}m6tE]25Hhk#/zLF`@ТLpuYINJͰE_+ۉI>Hd.ԥGJuC +Pq a'lؖY|!`"-M404"þWg<;efiG< I.$$WÏl`{ܿ7{1̸)TGݯvĐ{ZIWW$Fϕd!*HcL)Йwe2;9H[n+ʘ-޻)fL9 ex {.8sg8@O"lf=xSZ)lB؜OZJ&zwYz(CxkS#v31K[KEGPvlEK`X[xmV}92і6$̸Ƣ4+i?pt +sVVAsN@̗}(}} +H] ^=m;W^=#G3TN=})#*$jw#f* YGi}|O”-ٞ5MA 81؎zaXD䷔v"XFچBiݱ`ұx6F浬CԾ) F=Go:~%8߰oKhX?q8􅢷ϭt< *BEKG+u2j<a#w w|lfzxgF^xy& >[ zejqlw@Ik9$[Eh&u\Di34qb +lF+6w;"+e~ֹ}M^4B=RQ#Ty +(R&"0fWlX#%&r־"mi_yH205Dk&2 4# ,Ѣ=j̬W"^xrպclߨ^!|w +{lPj#G(RY;^y˩_!h)j$E|gXX!yJchnTOL!]J9A֧l[AJk,=6՜A`p^)ay(7)&dq\,'wdِ#Mn/Q31C{~gN1fu/Uk:ނ;"t xjO?8W|z@n93؈0`QFL/I(2P[tDOhi#[rt°\LT\"^O4d'3gIjJ̃>@e+FuPdnCPS ⩒ 9s~[^ပ v3 ƴR~^7Ž&j`z; #r#sVvʸ=":T̗vSL0nvarth{Qi\LjRkuө"2g%9v.{CtKvN+"N?bQrI;CCdCOdI%A>-J7d uN#ݥO3s$Mq+f3J{r@6ydA}D.]9?)aR,b)IXnۯiD$ͩjzۺ՘i/;w+Iemm}\%0%X!3Bx=^rO̒;T/5EYﻰMH*Hk3£(RAs@Y)Oڣ[ϚEpJ8Y)a5.^ l@}U`) zRrMOf8 T<G$Qsxw+pr܊g/EC4SɃt/u8IV!Dzp@^ 5y:N[ b }_z]'ΐ+9浤W6yiۖ dw݂>lYn P̓ lU V%9nH;BDC1RI91k<`_'i:lѯ&Q8f@t9G Q){4zboeDBX~or,@ϥ +"CGY ݼ#~ z`S"Nj#tRj΃+vKq"c%v4=WsOkϦgr@ye~\(x|5;3 *.CN|}z& 顲Րt؛KQcʝn ޙKm01~'EMmF%RRc_hB0 Dz>۾zxhjs+т@Q:]T޺Ey]x;j?oUۖ!1EN?7;C"P Y %U +ѠHUr iGF ΣU.‘ +{0҇ +;BͮxO/`Ѫ+n:1s5 Z23[w$ or(Z[s㧐fp Z:w6@Eʦr$'fY=I_lJ,据Q[9ZOmJzfR,Uvw&j^qywʾ!RQۢ3FO$ +\Ntv)Dg% tq[w펎hR '%/:AU_*&_SBb!gS&f$Iz>4Irw(*lA5懮!8H)d{UPQLE/-kے HJr*u)kKOqǓ$?yF% 牚-IL> +=N~랻_۰~"۶PyMɣ]p.> Swb&R3=I:#c )a.M@STH6Kd ~L]܍[(cǕ"f't?>}(7cꆯ7S'ԝ'$_kuZ41.Hg2$#jbn9E Xae^=t1cgE +$# +s:ksw.5Xw @S3$FZ#r<1J;oo&%ԍ>n&BբjȯᄃkUg:I[2O/;&[|Ali}1"9k70}m1`!,b nNqhI7ThvI5 +хyVi(f +)ږZ}QVE S{]HL% +%YI+'v@$ZT^]}fTh驈b LaJ>:ܟp%~t~e ۠W-Ҙ\jB>ww(T.顕S L'(G=zmAM-Qa]os $Xv +(ݤ +f޷5ag-R-]jGиfzy]d|"O>uTp(4mѧK +un(P%b?Zf0w`gK bP>C%7x}_L`m-LгRQ҆t/rJi&k.!'$#qHđ\KRR'Dpǫg~57ԋqWP5Ɔ,Ϫ:_}VHҁ,"kHOy:ٶ5DBxǷၰ'-M'K!)/k)m$\(i'ͷ HĚe%Z" +dήV(U47u8 +4f̈́ڶ Vێ+.I]6IФVAƥ%}D 8QJF`&ѫǼy85+ZaΣ`}~DYU͘۱kiu͙!q0D,63" W]ʭ/aX HSB\s?b>\6Z=2I:Hg>g0 |LOhǵ5BH{D>9{ rCgVyXvR| zCVEO`;~Pr{Vd@R7HO_9Ϻu/Sr [l΢>=?ӲZOQI؊hn=mgnJ;gkTo?i<S]x7n:* Ww@:ˉ61"bv*Wgkzg1<8TLL:qlͦ{>2j,YXf\-4Rۿd|R#1e׳I!X+yHa7U`mЍ>ru9BoכwQP%yL[Ȭ6$}]Yn *x3u'*hiXKwQB3D82ܼJd\bIiOq~K68d;==u"GB. qGRU s}ng;?j +fͧX]:qG-wBi$.E%ckpxM(=ښc°Z=~R[|ɺ|tƻ`n /1<+-j*ӫybTp.RubƤUbߚ{f ),u[8z5n@H +>?x{﮲34 1A:{$7GtҀaGP0>z96 b--D}:~zT*/;v0 +@2E<2.'x.Vޯ|V;;̎( +I䈺1gO ${,!WvҨlTU;p !YRFֶ6mMP~ RT.g}E9FVu8%^@QiǨ~Jxjsrv"3pml{| G1n2;AV"wRb5L +>j1m34a`v闷P_E͠]oTwBPr^j>aB"ϐS+j> +F%5\Pmu%/? ai5 +<Žpopǝ B),. +|/-/bCza ;=-Sێ,Ȳ̏mPP8848 &{}m[Y, 'ygjA趇FiA# 8*|hx0֣{L wҍ׷d\<0'VE9&1&{;'O XJD3 x#nJ])6)ӏWX\f| .oqe8hFgLbgJ$*DTT뫮BD) (Q%qTAe+ڮ$)iBb`e3C^Tf\I< H i$Ec݀[=]#(!*n{ +e:(բ.+b5#Q&o}~p|W~uwEhm;ߴD?KA ѕTY쑊:kp1JعѮ^**[r A"z8gBtzc bkOKJ08f!ܼ؍cMg.,rc>gGy!=p&A6:u͒yk/ 'vZ;SD+od 3Ie*nmf#u$sІfTXe*8x8pE2!ˆhIk*Q 9CP+Zd0%<ųa('b)衾کs#d"fV>gKWF +M@XsV.2\C8g4kra.|~bKNR 7!96jCh {*_!_ =*wm US9ǐs +>d58V~5l^(5)̋+W\`n"+񁵢 =yzd=nc/9ppS<g'\sg_dsa1F8n)D&IC HIJXV09:G[%yʹ[\6"F273,i~Pv,4mqI. {V'K(UkDc7FAP(QY3")ؔ1W64ڨ]lh4ADwN9 $v1TC@pxΠ4 +8 +Cꕁ1w,WbK~REyhv\ltXN-ƒD̫7ĹXձ7/DkL;yKFETvk9g A5=~8mSU^ &8b+9qRf/ sSF`7vۍtJH˓\kӥ-$7$< l| L՝C?V;qyPYt .eHtP[ ms^ =׫!DTMvA`MGW$"36[\[-5 gKRާwpwR}PaX Q1Y;獓g KuدVԛ$W{)nH29MrPBL-0ZOO4¯O,OQY0E*3H]fx;=ٳ@RWKQ=ju%xSFЈ10!:iO^%Ou+9C{`r.< + =kG{F[s&9KnmLMO(_@nPO9{ua+xmO |q?_Y |..EȥR K 9%͈!çI( +a{:O +,\"1C +e<Jp)4PZŒ״0UB18u`VVGRp yK,fב(v+W V韈WNqP|z*gQV#G Րr3ݎgM2]ePC %;* sTύpuhl?K#2ab.͂ALEoؼAbLxXpwp`8%'JY{3펂LjǙ$F(^)bG~[Ȇ":cǜD{݅%1Gwn|Xc7RUxHiPyG HR͵cqjDFʐA>f L4k,ebTN6]J)ݷRwnQwPl00GŲ ڈfQX@j x-m`*k;c`7iǥ5!R'jK[5$"wjweKt>cqeO1QJTo{%qR 4- !L#z.|NhUA2oDOO;tj+UTV"y{!_7rI~+_!L*ϙ ]udPkwã!w.˜ŀqCΠ\t۴-=J EةI$=85dnw&*ȶa1sݧ +x?JO !5z({d(d8≠AՐDx@q&33Nn+^XP6q">vTwE¿gysMX'M))* Cş XQX5}Sy)2dc·v܁Rwb*:(\f7{=P {ADD%(G^V ­:> = +*Q0K5,!8MwBQOd̐z;;5[b;"+@[WΆ`vMe/i$_'ԭxF*ڏ7?>&r8'tqckBho"Ϝ~T_".$4F]G2QG#ƞq3E@urNr^H<;^7I*XD!@7ψrܶ7 +_H 8Rlu +! 0;EPbfJIҪ2p8v'#yHSpcKr.bB^E*AITFx~Xڣ&1~vh{1v +#=ֺ͡*N4-=[WlzK O7[gDr΋DzFnn'9@KgcVQ`_<^*_[,3dnSq~Y[ +(F&|TkmZ5yQ׋'7q5Y=k\ + ,Z>*9Bl`HBuOJg`J[32@ EcA*7/Hv*AB +nK*lK;Zr3A&+!8c܁ +R ms|vd|~IJ#&jcN: ۟Ou4h.ȶSr#ڴ,n8*5DxkQ If}#+r+k{1aZ=\4+x4_@rѸ̤TTvϾZ+:̡+[5{anګc +$F l[&jAQVzJ +1*p ,2ICgvRTKXOUSjF{AbK/¯K/gRU#g|DAaJ=)̩ }buTrͮ+SaD&mӤK eYS;JL oswlI z@*BF pfW"%UIa2ïvhN7aN]qr'{ڑ{kJ1mš߃>dO8TKp(Dt=k#ڬ'Px:gew4rLa}upBԐ_7pX? lCҿ23rT} ~XFqEe~h] +=ƢfRP̾J&@NCs9(S#_>^)ߡÊP[$đ$MZC:RoEK] yڰN*92WB8YBrʈfTglYTJ}͇I+Ӝ.`-#fM:tm kpR .~_=L1s63j#:h4n< KъY +qaD9Jvk.H٫A"0~*5$eSYHm͇@[CgCaQȒq[;mG)%CҜ9"( +.12$%,SvVƤrq_G /}bTx{͝'+ ]K«Juwr)h;gՐQ,1S~MVگ_s= d -^G(֑7 |1|Gəi3II2p10e0D1>E g_IוZDB&P_ZADVO}GdKkϵ\w Ad|_{p]R'+0G쁢AdgNy] v:HO93.Rlo.2jo;^5xѤRC)Ã46x tK+=T2s;Ma,Yi$]YF}?7_9#D{.ǖHcG:2 +HϚFPp*6(i31 9Z*XjoDDlW?#t6 7ؑ"$]'ἾbS$ Cb*]%i[tH0>ˇ,JXe+ Oaм.jvBw P7y 0c}Ġ y(RK~>0%wx'F@SN[V^|@j:ZìWiH#ks+Ng!c|brֿ>)]Y&ͷr+f>-F=  wx2z+i[HH3!@ϖN' . b燩6qAܖ IN#K]IO<>i9xǃ;x@/@HFQ;}nP>zy]rmo]gg4(s 4mc@*vWW➰ +s]J\A(N +S0 k "Cg3J! :Fp>{zd@xw"NDD3TD}95tYu +q./jJ0hzKxuT'UI?L;TSDXoW1x6G)n!( +s)J!`XjhDTשaȁu\)_\h/z?`ykPPL7%eݹ P I{&ϴ68Q{/O +gӦq׺ ]`MY;ӫQ|'s] ua|mvR,J,WqEiCVZ[ +/0ZlT7VThו&)@X12g,jmQ%$n2mY=fE[f<rF0)fEcʍ,1 Oz>}<5!]Zَ' 1YuLKPj*6jC`PaMEj\֐v 5$GaWl֐Kar>v]?q/P'u<#$>zGʏ8|S%ڕqU;n/O~kwZ/$$TR+[3bj˗ukpWA\O7eCl +D➢B{dR˴(gU!eJUj 0N Pu]9sՎ;U8lx,:-7bb yZi䩬DGT  +tGQ}f#bd'`miZ&{}!CPԼyjoHvΎϗE37`/%|6I׳J 9yݎ@eDsnC.u3Nj" qc:CpXP@Fte1C\=olLIIL;;K@lUjiʯnPGmMadIk4U_U5[L[; +O\#C&yUY eB +!Pg 2dgN t}ޖts ?C[y舺!Bx4 $gZR'I̒a؜{GNiX⊕u'~-X۫ىH$T̿ivЙc*-7C9@ٗ>shwz셸D~]HOُKwdQƳ?n(NYY쥒)BkA$bI5=|U7Mq (0#Hf+:> + |/Y3 pto*L-whIG2sqiv"QĚ2CLkf5r}+|saEkH"ѨٯAt/B+HǓzD+)ZG +yCuTQhRrpfyW6QӰ n^-PMȑ!oFlmoYxR+&O%g,@=d=Rs +8F)$o36N̵.% n=ޗmUj|ml8+oɮVPvzW y ƥ=,oE9d3xrƉ<ٳDn,󐓁~yzRR0$dwp~ŀF3g{I:$5,ar7]A̅.ԒnYt=/N=Gt7V>)x ؼ Q"O,'7@~iXh]-%5AoІ4e 逞#9,I +`u ѽ_)Fڧf+ѣT "2SٖFJh%mL>no<&;ڟ<ۺb M"o +-o}u>= Uj&Mbgڦ_*rW3ٮ,bW\|UQc Yڧ7J|+ۏ\Xێdt5kH 3a׌ +wsoh$8boޘcD@~͸h㞈v~ؚDEl*hG٣`Dϛ8ȖrSx2#`O?e}qLx{@a\v)2gzA$TGta!OjT79# 6nCr-Bw=D(*-M1u)ZHEQSyZSh0f+ $_AuQ +)FϜV:kt[~]`:e0+{W/R7s%)5ki9\J{ DSEfre0$HQk Em3:wdJwԥbH-t:U= Fz3(RƐG axCQC^e<s)ݙˎ9kfi%u'*)ʂ< DPnNӵ`hR?m1bI[][db f3H/f1k̥.Fà5 (;JC)vkFtM"PyX{>\B~Eć`%/eʘftH}=#J[~+@B7+l%W:(bφ\dOֆY;/?PIE{FI&P89jRu)REu+C4iK ttf)nLdAۆ +ͺ-MA*\+Zj_,Hm{ yp +kzQqA4 r3 !- Ve2m|Z:5`(C*$f n},js"UQ"+:W%ڝڭQRGd_8HtNGܖœvxI!LZZ755EkGzcȫys.r&եA8h,%Kx(BWܜTDbԉqK^(fzGWa wmwn)Foml0 +Рwo/MDݣr#e@ :~}՞Bl/fJM52-[B`S_VZbRgo뺺9]_}BBmHפ@Tz0FN@P;Yc.vё4I +n58gc^t阮ջFiR8+>ӂv֯L袌(6=UB=Q-nČLt/ԃ #( J+ z82&S:z*jSbp/sO!1-x(T*׹~BRo| +4-_q,ۻ^ '5F|LG*4TlF,ɃnZ~D[g#:UH4 t4h@v: 5K2b,:{mWTןπgBO8 e +\0437N(em jœVG>:# S8KxSfI%N2jd$k("VQr,gx-Eb5{*Bu\ ]+;6HMTBoW;Bk _H.[,ļp%3nQP\F[Z :@{K_qd77NBk硆%q 8tb۞SI6MCkEܘLCq׼&v;)%2]tt`?GmE!R=H7>yJȓ[~q}s5νNP +V&0/:V}iDE/yK0!Z/Raqdl:UGIF +'Gl<ܿ'(]?;To=v kN5 +5̳P&Z,LU6Cq{ P]  SBtԽ(1t*+j[# +)Uvkb:V)x> {*g +DWk#%t_mZȏuFD:l=>agb{)T~(́ hvX#%kڄ 1]Scc-FP)sGBto:qU0 A!zEt-yfHu=h =g9@8G3k$]C=Mτ^H{ +e[vgz}R!apvEMH;ڤFeG gGCpC *aǛm[ >(Jbc8Aؓcd-L%3${3B(%ue=R"fij;Y-G:'c"##LFחWV$Sd=$`2R~'w򵭎9{ȩI +ľ4`xi#+ï|R-萵dU>z f1u) +Es3n.fhWu8R۫%`#1D#3>%:\^Xwph/8Ӭk=J("ߊ>4CԸ`w&Vj5kk-ҥH5'>@51']V5]stwG88X/wֆ'gLD+k$SBIϔ$k/:~>Uן*5X};/ƗO414*d-;#Jh!0's܁!GX[GI3-)m?`#;Zs|rWu1Aȫf@ӏgg36+z{u ]Ը )̕XFuSI{M#tf`qfum>NόOCR邓A?Ԓ3kA?y%_ YZ싏hA܎oH,N* 9%סh^u:L>vP]xW ?kIwqB{Qw\pB {W[MB.7_[ja+˒d5|l]Ip%v1\eՀRGџiV 5RX{{>fk1bD51n 4`qzIWh{x׷"^Bx֒XKP!jrį!ΎlH uk}"۳ ³3ԋyҵ) 𘺮΁KkE +ӻT >/ bTn0jPrళdFSc(H}_㰗!mR'=f^{ ZKjFb%sDY?Da7K +1v׈5FഠƐ-%ɫ)@tf z}'FGh+7XWn{0'%noC'֥͊o;kQ3R٧'B,0_&wGm,nʥe׿QwK ʦ[E bct#kzan䈈SϚs#`0çڮ- 'N 9>oH֙{`@d?'$._2DIiGW8̥V/X^q8ա9x0)kr#"aCTћV#WMjoeq@f&Q*0Rl}`Y=(Ő]";$k7%z^Ǧg2-E/f +tT\iUƣ7?r 1r[̺yERc[َ3nm83~VDnbXQ6{m39cÂ)iOx|#GCR€6*4 +C|-t;_5"%* A~U!B?ޒC1h%%URf8KLh+2ŋb?^08zTdzS!l%JYYT1)ָhdpA_AnWG,cghx k )[WVj!/DγV1?V0*<ң}wR:¢_ج(w1C3[$~W2z:v"W-nɴ[n5/^->1܋l;xfMGzAk"\K FTh~;#ΰL +RqPڵ,"{wAx t[OMWJ]㫁,eڑɡ{>ȟLݩtϊiEfh"^UC Z q+ +W +{V~l&a´ 3zh +m$w}tX|T7n.tAD *Gp9"L :-Hs9Y27JЉxEsk;?N9kDsd9c?h]9$T :U}ęz?)Mt{U4/ ˍ~Ԥ%]=Q4J6#Ku{FQdzQW*i2$}V$*lr܏XR03 + +<D{relg1R;0JI'\"]JŚBlAYCt&S"Ng2^{ P\j)jEw=tMV`R 7Eځhz!=~Z]ߖϓVhzA{J(^ aR1~RMXUjx 7+f)ӉO~2h-\R3L\K=:'\9l9kfv9(P0K97TQ˫TO~p?zjWNP>ՠZ<鬩NQ[DFTw\^02UKzBVaҰkW0gnuv#$=Lɡ5#aOߥ1Fv9<@eUYGLocUw:#^u-dS7Sq17LNK'QBrL-ݫ!tD m#6{oUmzN339[Tz2Qv5pD1ϔh|+βGwţ2N#Ď3Rk"8"X) a'1XfޟF*US>Od!p1 +mg\aa蛜ۘ +/[ i}h|}l[67 $ +5Z %,XϿ&`b֥K2a:R[kV3 _FPx2U^P|:秃JCcV"`dA2əS@4m~2{C;l|meov*r^7E"ر{)/A)##B2n -=JFh_E&R0̅%ݙBqp?߯t'*~|j?'=ίqVf>x\&H@%jʪy s9Qx͙)kS/6MͷKg#ؼ#ʑ_ms40"̝N1DYa@Lrw$՞ 9@Y H%]IdWMzZ9˥&/QK7=\n3%Ź㴫"!!f//?:~m;2CNuX֭3D,C0#NS[s_3Wc5WlL[:tgSlnKo%3**|k"'(#Vҙ9{Ҥ3f՝:a=m zrHqV8ݱ]Qo=[z(\j6;m~ S3\8e{(XL.ެ>ɱ1M?ϼ?yL'h1CYdK}3Y,Yh27 kV ~:ޕt)䊂-7%w|FO*J9 ٝL;2O(txљvk_ /ZbQfp)z;V|q$#zow㭙@~`yKZ@m+ƴ_(%3BSS+uSyW~qtePyاLSME135~I1NMk<[lE_(H?<_,A_̱⑦J⌺),W)9" ^H*o~?g[ե@;2(Wx^)%w>o>ҧG'H.wi/D{}>» I"id``Vˬ{+cLa _2cb:><9T0q] LRd?"EwђjۤX[vp(a曪jtQ4#عggkPMj}o}?$| ȹXr-`rb/L /hL{g˳9kd6|Dl],kݑ#DS5N? [s#ͻjqWـw͏/f2fr+ +:Ņ 1}3(LfEԩfƪ<H)i8͘HUYsBɕ7gכ7,m1y ׳53fTAQkR\=\-}1$b#S >،BSCY * Tn'IDT7ݴ sz SUw_ʄfH9/Ԛ*u,-hzgY@ 3mH\drzoz51N69 +6(l\JrVDj1p;Tg5֖%3q[1RyU2Wl90?dr]DEnf鄜+ԾVqN #\Nmh{ +2OSqr!l@!s4"RgP{ow\0*p  oMQ}qL@!%;9WtT^BN5v-] 3F|Y,×#y0; _{wI?O_ + n+Ns뽜E!m YyH%vrX_IWYv1(M 멷8z^et+"V6ZiKB;h3ˣh q? +[")4Fo'e5LR[41~Bf\p|v~'gFH` $9 +[W+tr@z~\y{eZQ\9P_+s"cu7BH\<on;38"wXL3@LihsM+z=z*QƈP5"v3jqr,OD YjE(\^LĻ9 HVQTokbū1`7%P)lm=^?q*H) +x4j{^VImȽޱΣZn(޽bGZVuאjHT {9خ9{ +k^b+OWTxó..hjzj9\NYh?E[oc?XwdpYlzOs) pA 1Qgc'[ƒ^ +イ#B{ F)(EJsXYOpT8f/x *;ޛNemnhIZ65B(ywn@vC$LNznd3NBm!>Ȫ5 1׷54$@yF讄eDF}x'm#a!\hZ5{4ZAF*)B? ;уIDm_H$tHIp1EhT$Lޞ|Wؿ1G`3sph6d,߾J@JL A:cڈWʯWI0A#xI7 Wp7W ^GB&z7:Joub`!J|UH$DQR(PN UCOY#g@5*-×ځH[M613LWح`{(H^7@f^ΊJ!_6v][njdNq~; WQLz>8RM4 +h8z.N!yφHH*7 ݧa+:*᭏ҼA֐59^\ +o`U,#"v-lO I^!TCllӭ5I;[N -FABYhҀ>~iQ\tÃw=@#z+2$ y=,+/B\ +ZZV +LAw ̀;=dS8`:B^f#X5/tJB]V Ld[WD4r\J$?c CkS? h܈Ϯ֧^q"(D:2Y=MGb赪,j!)0gA, R/Fj ׎`!zvY:g7l:Rxv܈/Z?~>*oϼ?sh䞦mWy=@$;Lge)?MuHSdJwi$=zpŁ{[WjE:-Fbܕ+K뉨e.5.6 +M؈'oW1cFz':!uPO' +}Y) R#[ (:[tm:v1 +SjY}AbB_5}/3-,2#y/3t~?c6ox<+PGYِK1 E\c`+zkm ŕ@IJNp!x#҈~>WvL7u& %S#`FU>s[' -"C;"'zo$8k^=UH`mjQ%y[Y[> DJ}ܱ[ +!;7Qv8C}<=~l8+n(?̉*I=RUS3W:L*1Ӥ}}}4n}2Cr;}gEڱ?X;vW#4V)r0nh *%}^'Q 9Sn%4u~߉<­u՛]q/Нl(|m|sl1z޹(kqydw8"!bQ_QC&byUQ1;</;!I!MDɤx1N鏫!t)t!ۓ&Ixpf߹*kDT nVxGK/ttb:; +;{|x{ [d]i.`ey?9BC?#w#_ѝ<jce\ + dlYS ='Rk@:hFrM +!"VWsn6cEmaM]`ݰE}dAx7MEIP뙠\_hd+p$Ndm`~A0@+QgqKT%9b4\)SCYE Ry}Us"D7j_ Pxe)Zխ|yZm׺N-22-.]6*%0 W`-](J'++T/`5 hC_?_Σ!b]ϥ*1C2czmH{=1fԹ"j~:du^ʻW{+'x8 'AxV jKTk*.k@8Fؐ>EגF;0N2Gt"e}E8+jx{lc~Ar&iݫDH[+ {CUwQ=E0D,6xeˡ$tA_1k9Q3#zxYW6x#4 GlCWN|] Lvm%mXHw&dl24pI.O޸xx]KE`5CWl9*kFGT4d冿#&JX i^jU9 Uf2Ux,l'a\!q: +#wE8©\4޲,O8s]Rv@U]S 8>ADR'7B%Po3D)U(MCh?BQyg{{m :Rf + vėmGBQ  }!y/nۏ nW=mI Ho= K8Z(Eu>Etv478ckwќXwG}ÓQgx~d* hI>raG}e2sV3$Q7Ѻ!mF"<}Ԯq@,dF[Rvheևxi`t5DTI`2'QQ#4U Z`~W촦RB>p|!sZC?bS‰T|!!냲jhLT.ƈHܗ֊~*~MRQ^sD1es`hkZOTsPf#^Q,YY&pg IsDqe^)7܉rFty&7`Y >Ne*g:^Կ'ǎS32gc~~ޱU>gCʚ 7CYhu3sݳ^T)R45,iQ@|>~jӉ ZO%t7-&䒄z[ t(v>}qAĊN}ڎQogyd μmWf?'hČZ6%^?bzE*>yS3_G'$̐W%8cV~gT;CX7S!m5EwZt!;t/T3MS5> |ћxnKinay%(]:-jXWTqsT9uF%`WWVv@Hkdu'k〇^J5ŖiXWDhԐ*:!joEQ8Lk8}7C򅸑!,+\Gk53R7onV}KKJ`ͯ*.jGH0"C&0iT1!U흒cQ:WH +X5dmGxߘ>uzn> `ztDJT_^BuIY}"'h"(ERS50 ؍HxsO٭w8:<2".?I)l䰋DQ:ujHc~` y<ڪH+iFn{)݄ ˜u7!@6 .h3=~1#NWiNͽe㇘n +3pϘ?~}[՜rCb![yO;~ +AMqsIH5|^%q6Ea A #oܠK ag}_`̝t݄$I M9dI= 0ܸKB'Nd!QUgz{DjeӀknmUOzeVd5o+&N'{n&jlH۬iX#D5s%{K^l/]{'׳fAC#Y"bl +KU1C?#5hvM hvnvݔ~P9(#_5n, zo)N!=g#SBNCEKKS>Rep*GjРC$jHIB c!bp4d_WxL4^8'Q#np+-ީƭ̃NF";͙"oMLsJ柶eM׾T(AdzMů:b B.Υ ?ߣՋ+p_,D<WB~~D*@6.,]J +n,ҵFcz}7.򖘧 b2+f_+c6S%8Ϭ{i(\y}8>-m}?@ud-7Z($ z\" TW +\q咠gZHsβ{8(r)& ^т]}Bl@I~y>5;R`G"1on<"!2'TҶ{kPmf=2@$ү~T3"M=ۿ&>pG%9`v2ݗ: +ݮ.;J c#׀FxE#+w{㾤FeK1Lס5$&P1PG ë]+,^?:\~vaX_1|E ) ElfBK4spEP(Ǯ|6]ja'YT!U xO5#uN$SW6rhq^s*9|`6q+;6FL~s"nxYf.2&5BQj .wWhmw_~֏bdJǩVQ9!hQYZw01_9uu+1ڇi'g|6nMU^Ula9dd5HV3[8ʩύM[vOܢ{\]ROqۢeB88it7wjPgۀ~BG)e#iV:OM5/#3amo헜Ci"_ڠL@oCZ11Ž[ H'`Hӎgoi;9(ʔ5|$gmI 4KQRӞБ^;!p'Ʉ1c#0(⧘۫4Iqg~'Bsv$$؃vnW8;~Վ;?v?<\Y#$v0/ +`L_"K"qSK &Dѽ̕}x5 hdy&.yi{3m룰 ON()'_(g0 ~G&1BgPoBRW2^`[,T5ۻc C"9Ʒ6=76s)KMN?6_ \ڿz7'"om}P}7AÃXiYK:™gj? ˜>U#DcFR,=DJ08|hS>DRj%gk;m_m@[1Y.IS،E|eo6a+E}Uv޿* 2 :x3H,M>x$Ek2笹i-Tͻ(A%С7.!qx3^:]C[U+2]˱xwDTk20Iz6}S&Kvܾj9س3M0笟@¿K]ȭ&o"3j ۶#o.2)/)G!_ĉϔ rxÂ@ 4ܸ7Z2u3 Y'n]UI_[kh5t]Gi:]ڽ.Apk<)Eh,GO%jxB3(P#rTZ[rT~dr1?31ow#YV(qP1o_쉔vmȕOxo1{t#% u_z2эϺSCD1kMJw#WŞ RkC +TRtMԑ^peL+iqwt6w-Ȣb%#@lĽfM"!Ot^y +s˽/e{?o\}ҢڙFW`9i{DGOyk k]dRG #IZ-<ȷ)'J|FG1H`6\qn#g姎,Z}1Wұu";h'@Qz3ku By32%%}X@v wVԞtLl?{*-T_GP̴ ;;1,z{oED SɄvPpHaJP{'&> +3S(!>)z}xEA[ψ\z19˗)A>Zi;(tf#jmiWy^q'z;D,@iKL"$ דA 0JT*8W:Ah57'R/|w93rBْ'ջ;uHX5ȴ'Hq!&~8&cXWm+1W/իOLIQ=.oА"GZR.:8'X'6͒͠ 뿢-tטA#/]%G,@"գ@4gEwy#Ei_f< Z7z<(jjM-GD$(5#N_!xz9 + +@\_(E9_q[vs s2$ FGwFc?y_' >Eb'=U4@R +>g7ɂw XewPEՄ|DfXz!WRL!}6rV N +L #X'Q(t$(Q ˖ w0u{_hY[1/ө*]tߒ_k[fԐS.lR K7A +|Q_+qǬ}tE|!$j> o9Flw +0Dܙ/ ]־)ԺTD'"hrBL^Jr'\B'w|G!S%zDBWJJMjMeRȷ/͑E]}X#;[x`a~j"[3Rűi|xMG5734#ff<$o~Dd%O g촐m(4d덷 HAU% n7֐o˼I,U$3 =8ҎR 8bҒkNX&mZgaT3#h%?pYYx10,oW++츳TVHou8xyv^={nDq3:O$d"Vq'[aIb&0WFG޲ jO*-C] #L#*AZʮ1[HC 3~m8WB-H}b[)7=J4(KOM!D#._'iDIg+ƪ$(mVTs@*@? +O1oSQ^;M5cB&S `lyw3Ѐ%Xv͌ Kku)򅑹<7쌑*gEF DkHhg՟FZqG?v +-5$a +J1h-] 6R% +DxzPd8?W\c;a5$8 \GzgQl;?w(ℝW= 2ƑxT7hUmddG/n,'xo1;޲᝙c樶 Y?r9 dVL;K7M;$HBp6hv_ Qb`P!y4yfH'$6#wejTU3'k_>Yʄ(4ІUK-< +hc|{X+^SI?/|fv$B ؛,!(e0)J{u0}gXק}kA'n3d-ѐfrT5S;@٪ЗUgs tAAaIW0#~Y5i +1,?ǯ{!{j,Ln~ZdwUUN`>23zvmn >X^%wr$Jh^iw*Z@ |{E`7"5U`kӿbW8?;證qDe;(( EKg=p r[LIe!4aj%>%< +r0䳸&!hXbNm73G_vM w2"Y001iOJXc`ɡ12Olɱ3Qs1R@YD7moaNHr-=R_@ Ӯ}\qKF{Ԑ[Al8՜%{d}SbMoiSpCf_^*CJX5:)@[9L;H#M#Uzm'0d1E_OD#0fqj84HJ15$ȿK.L>_/oZ@v'YdGo!K`o&oml^gj!Ƥ]#TxDI:>S+3ruoR0'ڕFs_)Lo:"Z3"bE;lۿsDQR!۾ԤC{X=_4١WZW\O]jCD3kdLq] 0b'q7ߪ5~>&\1# ڛ(qs.%#*Gc9PH'!a]DjԐqWӼW,TnޯYon{3c8E1܆T/pfpکxƜ^WS|ܙr쮯'G^:oNw1Bۄ\pc*1sE=θK~ET gK >:$YI?|I0ZBX89ʜr,Ӻ7;wT +Fد y߲JTΒc Kictmh"J+#iZN캷12@_RFJϢ: 3q25,qߟ]dƟP$3p9tfb,r0xIilBj.-^.wIл+JS^0ccfne bu_8<J1p3zmcjΞJ?4c V:ĻIcºd!=H,(|R8'JsE~,`Q+. {޼,/UR\ +&Z zcN4; bE_[51SNstx8hRB4XShqX鶿k}}7jS(l I`uj +-nw O'-it̠B!GF,OdbcO] Oʙ<]P-pQt;̊:c{r?32K 5&LAmPd͔ȴR= 1{`b?;=9$^҅Lf#ty4ս@O.ß"\Sr6A Rg.SskVOQoRBJɪR?a!rA01MӼ[5-T>"_iyNQf*=cÈNHnkϝ3γeLBQѪ[6ԣn:gl`/^Jy@Wyx٣^5SIs7?B-^^,<V.&CgN}1X-*!E~JrbkSCٟאȚFs N-߇0L[C=FQpQɏ^>^+]/i fgK|wC +MiM%-"OK*-{n k+Ik^>]F`E"jb`(6A>a:;hڭȿٖ>3PbHD@nV;#B&ԑMv&}"QUty ю]b8&D)u(⬣mN 9ލV,^zSX0ЦxT ޹Qsr`ȓ@m hx71ͷ FLDd +ss\?̈=5YD9X٬2`B^֚ +#LԺNB*-^"r"VfR [wj=v(ez唰H`+/̥Kmǽ9G O̼XUpǛİ4fl+ɾV44g8(8o*OfEbI5Eό8cR2w <hxyFI|؜?EjqjMqm8_b6!)n> Kjl雁{@Ry$83-7d ݵ̊t#}@nj2'^ؖgކQPol0JaMjcQ_XQBP_q/jywU}z@\x7^CFy_"}؟CJZt7wDbwtX~"ݧ6|هsX&@Gdd7h vi$5^T1Jֶ^z؆GÙy+scrIW=󆏽Z/VmrIkޑϦr?9fhNc裮9Ա  K)yrgm@&2ISp-#oOFxVRs)`yr0!Y9b6_6^~|5ϏmA=G 6NW\Jwn'w;nC>`ZE:ҹ.Nd]§Iw(:^1[4똺e/0jGfJ:&3 G 5~1xZE/ߧsZd%h#H$SiczS=e,08ww?P%{&MOȩyCZ7od Z*^!D^lR[Ur96c #;ݱr ?(FNHdS8eۚ{Tg|DC2.k}Dj Qy3ᖣV?;M"7m dsk~i FHcC~Vh/;?Ⱥ\T59#\<{ AُG Emm=]w"gd$ݿ?G;kΝ;X4#7_^ N͹gٷ+B +.EI i BjR5cM}Fyq0{<gsX6  &~k: HHN;=tT!&}w +3׈J ޺$蛡39R\_`npCSMҤ_]_v-wp V.RР"|mʆU@/ڒDH068_7C*%bv{OɊKq%9 +GAE_eo;v+*ǛzeT΅HXCyoʣhtf4 q8NɈB +} ȑ1,p[STc&G&F"U[CVDgN +o2N"O<`vH%O[羿~WVƚHꮗ ൢXLJ5p$d,ɼfˢ_g߈l IBQg.Y} kG{@Q#H((g}47`HˇnTWKrE T(dy"EED5n̏@r]wW*׎V.$_E+9b[n|<8sgoZSG{j:8.+2z7q`SEĻaUnBJ!)|~yZp5_:a5:S|#=T-oN?kP6[nv vi9$:,7':;9O/z,>|D!X;,}PV"׹hIɝSAjN2u\ĊV? QNU84u84D ]CfD:NJUM 1,ƱCɋccVurbc4FB(Cb_Nj=@DvP=s\|k! xGZrP%={ő=AWҎ>qC[8"8ԭDt^Z06( +Z_v1p=WPZ7DHme;jh|!͊S0,즁 +ʊwo +#{P'lwZ<+I_/$ x# +O$i1}+[\?x;i>SELf-)ϯ\3(*SBo]yCqOz2 7oRcH8zi|{Ф];|<S8kz:Hf;]Z.0'$ +zKJTSQpZYT̥B@q~el$KRXQ33riO{N$7.q̷נ; +uG]S\{bENvAP {{#KxӗM6q!x1 7gQ6ʉjtI\Jw 7 (["5]6%g54UA289G$AZSa>[o,ZGgBVٟR#ehSS$܊!^-K\:%;SU`wL^t +TY'V;\ ?X(KZ'"KdBVE-Hii/BJ#T>b\i3bxĊ'szYyr!N2ƲQ?w%hdec;ߕ=3yaLB9e `iܡH9v˹g}l H +6hNowC)`wip*"N;nOYr=59QMSđcKyRkbڢeZr(G9?ṗz3rJMjhk? yL_U9֌$GakfӲ +yӚzZF.% +=[n@ s;fj,¹F?:;g>CɈr}'`aɴb+?NjjQO4_rYA(3:ZiJZW}?wFż䡓5gផT8hLvB?iyy_)ޑP|GQ|#آ?"PrCR7E +pqple#F`RZ،%! LkoO#?mKvlNET7`;_R֚J3"Xo־g/XSr8}H(M gxMbO' `>InE;oiq8kcRo4\V7J琚p6e^vĒ#̈́[ަt׏Vu$:@ޚnW~`4•yr od EJ|7(#_Osh~Ыh $röNlAŧTZBWY9_*p}:@ᐢp,z[{8D҃'jhwz+zmy,=ƽ=9ncBD;R j+PPYXz@4@u&+~nV%p}`~KKhgLR|f9-M_FEeeSfaO@5ūbx"yn1- -aS@4U kbNeoҵ{@YZR]$?uUfu6yQFDMjvg&i1Ʌk3'xBi gS玅R* UPv ݇=E$Hyϭ|Z3siX{bN(' +' `&'V +AGiP朣|E,|&3p v?Ppax7{K>aY+:ws QC>Cػ,%h9US-QCE3nm~+KW?+Wzz}WT?4Jۻ*P`8Z'"kle?u A"YdFZtGvxjuTөJq{igݎ+t2TG*~I#DC{lHV?uǁVs F@'FߩʎR'[ǯS|#[eg 1]b:GE%k!p_\A\L\|HFZwx UdgFU,riAZQfWנu(*HRq$̘_,VWd4vK4_Q]-Q?nO )5Jv|}_GVlF~G.łV1i +ՊRƩ5#ņO&)Uݔv%I{F(ԪG]C"GMN[x2r*64k/tAI.{|dz&$v\GXЪou[$~3)CJB=_=#LG,3H%MxG|G??3DH.^[ [cARzY{cCce_Nqٕm@qç,8BetzƟ;:.wE9e<yͯ~?\:09ff^\Q(  c]]mrZ +w\pj"<)6]5w]עIGd uw6Ե̲2kQf &˳~~WCul "FQH֥vaYPi~0hЁ4; +4v&(WWO>z#5vyaޑ#` n) +&>ZQ\${# `kMMpx1G+9qE;B(k,DDwr2?e=Th +ߠz<ŧZ3]gŪUZcƅ >imI0KWU#ȡ +]1զ >L% av}T:jq~!݊/u6bZY=n +sU]C.2>& +tQøЬLUZI~OO R +R)ݣ A/ )6%ZO5((j3;ʒ"`Amm6u90 Hu< :~ERK*'U Aݯ衅~n'Ç:Γ#RL]Ns%8!zGY9:J  ieF̚w5KK.Pqqj^ӭ]8{BX@*%) [WeRM?QAĦR#Dΐ-};$O,\؟^Y̷Or fr];C4 {mQtw4?t,z45GJ$R܉t@ HU>Qlr/7ңUͲ 3\ +V޾u~c[0$^$~kZgg>$˳5apiGU++^aps<v#$¢CS!GI~pȱPAPIn)=*)%/E(kVtZ i<`3H%T#J\g /GPI}W d +8J:#B*X{ iy1_?QB~Lt.DS⍮A=+Έ<#@);?Kn]yw᭔aC&Jr**߰W쑆Բ{DubVvN580 +wsP pSi͐'0" l~RJ[J3c;S)@M[+2 b&ͥFF޾-ML)O1Ky%Nݿf|'t\R1mPyykb gOnI"x8Wr3@-cFQV'4iIn|\J6L3@KE"aأ7h?o4҈ +M=9ץxFy@D\R(kOѰwwt[~0Rѕrw`- &?⠮Dqf5dOA*{ |@l>tw~"bߙ2hj`O31aPlsعȊɲ1v(]A 80qEpl.ʥ7h)%D9w~fH<0x}KۯEWf{JwO 2$V3LhCj9̐(Şʖ!*H߈3ey(I60[les?U+BRݧ)C<'c8P߃!xJ-Ri`5>+2z-Hc3(&)Q#)5K2 +GL۾&Lf:]64:)@%jPSES xcqyߵ16/Isb :~0y !atoQŦ!#k$ V T/.#38_WwILD#nNq +2)H*P.->;d#_lŏc]<ƨt, U䣖+ġ !'U8S3:EXO,0oS5ȶ8d!q5#Qރq{ޠG2Zpr!G [f~(~u()}*b*Y}ڏ& +s8c!?kGx%4P`UŁOW tf&Pk_8:0S.aL> hr)^(=Fޛ^ks)Ki-9 .Au1"{k>ǃ;sHwC3Py*H(ZuNemRazV/m~CQmJBsxkjWН*N&"Gqe8E+:37|tA䡱9B(JFZTVkN: ̶hUی`M/;39^#]y5rFrW>NӐ?K3 u6!6ms:}#/N'JkW'hy$Xc&=6氨f04ťxd:-<2~rGwl?k&yhd|_EZ0|3_Oj[KvÖ Mt>LސR;֝ iBPAg??@/_9=vOuLhe`q +>vxLEP0sLP9b7w׃cSlIزTuy:'KhݖLy(ķ'6YK=A0k↺dYI .uBXvGEbQkfڀ*Ho !י S_D4'و(sʹzBHW*d<_|*UH9#`}B!!_Lm¿@bGtkrܖs|"~`tT׮}Gh% +x+SuUjʋMb &t]E8h{ +iѢixZ(Ǧm~HzނO!ܣtpvjX(&g\qTLUtFO"KpE +!w_6R-c~`sP;bF_U}]3^Y'G N}jL1 `˕@Ycݿ ׍Fpe-TKʻ/AS =lwP]UpNw, +h#I7bX<1hY+L BA '($r>:0X)=%I̻RW4DPV.YKi{1x" ;gh8VʑaA% LFO;UxC.vKѭr1[V$5wdQQ޲: 6tbI@^l5/M3.EΛ@*A+rp_)q+XJ(ilRK.J ~O<͟H&a\>7#61!6R#wX"]Q(,ޘvԕ֞ DgJ:1R(:xV#7#>If9(N4`D~?A3;g,kXqw>r֥`4:_36VϤJ+N U2_ݷ6':'l@Ǽ0[}KةH6 QmYrZW%=g|zʜ>`EK}Gc[SV綏0!C{T?eN\T{9 Z MOk\Q͙253*kVh3 Wa|Cs7P ?[Y)_)ԎH};BU8 {+cv]ڭy3J65{@G+n[?χ;Rp6JQ&%!-2HކTcIvYJC.9UI P]C&hH)RaSaOg},U"|96D4Yj dZs@vcLTc.m_@'+5vT _3>?SӺ!T'?WLGDKWTrV/jk7P!S2':7z_ BNr>uzL*XTu#[W5b'ɪMؽyx>k 6K eew5s6 Pz;ٚFTUMv;Vf;!=K_ؗxtn R GT(&?k+Lwbh[mLDJ'F=GR:ܱ'+o +0> "͵ƨ- H4;eN^ĘCD,-u獐v\*)C' X=1b,`P]XID'BVk;YF9iHx]Q\sv[{ ic?Fv\?V(3ug ̚B0ZVE1(s9㲷Q#11RJe 8:v!HP[_,{NW oZ|CƾE`*ߒH q԰r `hȜ]˚U>d#! v"E+.+QN zo mƋ~wu'E0+]s|O"z!$R3Rt"A~{I2ɥPdZl J@[^UQCdx!}+BNCa$$rh++bZC?)%\z3O=62ӣXV~d{ 1\~~i揗jQ=wYﱿQ^{c_jMjz"ە`I3,sЯei7L^jxz QŹ7|GL <9?kAp^M +`+Sy ]=6y3OcOuRY"L:Lue}Z"!`i*tY"v2<ێ=2EY(4=ix! Fs{}!y5a.L22} +i  mԏi)N&uوkZV~06@# Wh&b)^[zddh{Ɣ*L鑿L0DH϶E35N—-.';P]`\ӺG45;ӣl=k6Dlz55e] L<=XADn*s07Ԭgg av ˽4Ng{82>>aLn=kUgI^m8lXt ]+{ Kg}p,ڰx\tslPt#:6TjDS,B (|6/.?D.< A9x'X-9z)FxD{o.c M!,nFgIj)̿N RTbf2A2k +2m}Fds4tRB3GUT>Xcey.|8nk UCSY1k^HK-/u DFQ,-кdiimǷL߿~~Zi]aؙ"+~$꽋GݱyCbG~%nK:v4gS$<_ nYm4v~(tg|eU~0'Cs _S~w}N/M]kG,_AqNL轣];>­8]Y2zy;poKFS 5["Y҂L+*BqEVe@iӏ+r5]\K[$~ 04lݢdJGěS ժRhA (Ti5D/ [9\2mV- +j +~tӏ*lRTKc8]WFz*$6fhԗI2G{mNW=Z Jϱ͸_G耹RGF#S;3sؐI:Zm,oxf-tԞA4e \8j;?11H麮AOwsG sNZx,o}`ǸK+^$BMCJ چ F:>~\K(re")qa2dz%_N!DԎE{)4ps~ס_30m4 P&Iʒ.3p튟aUN68*:,AP|z: Q_bS(3R H|vL[8HKF}=,C.馷">!gnT;~㩺bːexŧ1aĠ3''-¯3׫-=pȗVҪrr8ˊ+qn,tJpCb v}(ijH?<FʾK-ggbGTٙ+T˃6ӝ-7Έ2<䛷G ;^+'95VRHubUHh:IJnW6'(mv}\~u]S_HS5}'J7i$iT៌}-c͒^m/x7H.Pч]<ʤQH{"?*i`o3s&qi=>5)ҶtaQtn399nazQ셜TZ}XL.@uL#)c.pKM$9P9Ih+1oIR…s| a9pTvo+^ ۏDs!5>41ӈe|~}93sr3LE JsFq}ƹ~ZZJA9]*۬xR:[m2рVMtȀU +&tee]d__^-Vx8MbV4P.tvDAElLGdeyV0N '"!IB!zN©~eCC>ȹf!ۃT:ckg\y;H^i :3զ( Cɝ/üeS/S0diIM;4GOw|Kwp Ʉ`;Žz@㶷D]n +/rgGC]KFHwb䜒E+ & ()ytW3=\NHț눃i#U! ܸ^zmN[Mq4-h^Ly_\oh@DϡVD,/CPgʐa6ςJ K>Y)'; q9O,h-YATTkywV͓1!P̚Op,!6皗&՜"~[M}VhtpjIТ+EL :s~v;+ ٦jH;ofCa1C!\e}80ľqՈ`̽4[;m +O)`q8J5t.!h3D7,s YgՉvAK[5JFq +×O!|*bG ynH9I;`B89fU@N`L,pJAry_>D'f_*OdugE~ZTWj]4LX$LԘ M[@&L}I-B9H!Lk~7uw|kn endstream endobj 35 0 obj <>stream +КTßp(AGڜޑ8N̽՝a1E@sS y?A g+fSՑtq`, +/ 7 dmr*/AG4ht8#aV⩸|k\|D)Z!7  ʑpE_e?kW; 3=SxXZI,`ypjiøU)s&1-rl;TsT4<-'UӖBZ_?X[.c-@@Ul̏y+e$pI&o$v24uiIN~r6ĥڐl?NBao^'4.!*qM:羛2qW]+uD1ʌ8 +4)8s=j ֈxލ>ʆ~2:}<[g[%3h4]8a*{pS{C60t ,*l>Cl&xp VQT)⦅meཊoz_E1%fD߻,Xg#veڭ8i1b[o jF!j{#<:]i ZƤNsHpm+^5ul#:|1,C&gr]ʵR\2jT)13a (^ zR%ӱkYwnjuղuB3o%QKqi7v5-6nr?K#% r-sS?,/px'si _WRId[xVBE-pIPX+G#@K~JB_X=w4lzѫzlkA-(ЫLk12zѸ>-AF9u5Dg"^B(,uwho_q7w\3 Gفz}--U#6k +n+~ਠFM1+2Ez*tHF8?g@26">+@l8[$ gW&fdU5,5Fk}/nrA_=\Ȟ(p +-Gl;Iu*^PD4^z+I2I]*z\t6$;uW7&Sx?U@ pm~zYIyG'"~Cd0wX))bbSCNRBSlF~gG3OJ:F11 y׺ ֽ lʨKtVݢ c\*N&gݱйiQh!*-#DŷS,N9] BDכ J;Wv< H;x0r+(, 񔎏t +[HGb;=KLaw_oۨPp aq^QqdQ!(JKg(!/'#82\ +L@Xq + +,Qq4cH@dgl}CD +7?6%sS-d̀%\|[- +hK/"`L%?'߻H48AԎH w>YC9ȟ^,d{ Ϭ-z#F!prL`&c# +,5Lj )%0tn&Qv{] +~zg.3};Edf3؃_~n/97jmt%o^vәVfZХ3˾7*%Z O^1E+ktJ<`kZ39\oy""~so&p*j끪-5ɨRG$YέZ,&>V(D Z+| ϙD=]F X9=$S[C!&`FG)N^.fLv0iGM*PC3OC)} ۱Z2o𶶵hC8. O@Vq6\p9Ƈru4s%fݞt!Jā<>J8([zAd()SW.> d4 j7x74b_.OR9xݻX!ڌ!t*^{"ޝy%}_IzA+K죺u^xEC+E/T>8gaXMNJ(pm JttpE=T3 dz𵩑)/YSx Δ,L(}:Nj)hǞ`yr{\1:kQu}kF~ ;S!2-l +ʘ@4U(|D qA1%f+tgtO!g$V|pOE꽐|k<ӕl;N>cҍG8$cm?8  BT3\3Jz|OdLyC*> @:4.R})fkd\˅ /4pʯ/1Y-w l{"=J@,"ļt[ՙiߝBxY_m3Rb!m(N)_)JB+ꏙDD?:P讕R;^p)o>H:ҟ}u:Y:"sc)k1r,x|@ 茺& tcRlkS$+Lʑ߹K)hS~ɈW:#רj|r!A _c|d@!~b?_Yێv~E!̒zW\qNJeKՆTGK~*V~g +%`Eɑz8u;yTi^1nIt +}*R e$ZDx$9{'lNWJ<>; wq \I4ŏ3CVďV5)_MxDE=R$Z\+vq'#}NJ: UAeCOaR |9- a{ vWl/ @T'b#D Cx9C!#M> aq8٪ĚE3~^͡R\^]ʬڎ|ꁞt7/MSEb>glfZ-zMVcF%Qu;sW^jmnr#q}ħzjLiRr)g++> NEmoZ ȘYx0DXj,lmtH-_9\_s~e;Z?v7)G+{E`ɟWln G8&|+L*AB9cdv~#Xnf@bxrD{R|UCZ5y^R*Pr._%8tBGbz*j +Mt 9S' #'G^ $R.H*pnaWz=/;:Dz[ w,^#q +8| WycO۾~aQ g9Y]jf7)]fxF?8HLt[pة܎hL|73yBy$?CJ[~>tN̼?pޣzKw i[N;BҖ&)Sڼ +ԏ2 3`EWiQhS +h(lV؝0HϺL T5"%,d7s}Fu/1k ]u Gr`-\,k*G6/ţ ]]$/.XJ<'f ]CU1])eaGM1f.SUxm5g+q7UĒ:o~#Fv>g0Yã9*OB_ ͯ8'>e={Ԑcn['@>A(:åݺP\\xlhYWb̄g7.&MoW."O_uDzDQ{NP/z:?(r(ee$EkΦ0[2{W31'ro>hn$Zlq pbI3B2.pan P.:=R^!Q|IXMhOΈTQ d2z Ia1*eS(v8wV_Y<M(ZGHympPõNnr,u0wsx++z 锚'x(u*)n7i~ݶW2׌D| qVAmH[|(8#{WYNb+=^ LብvZuu'Ig"t|D-"ˤIf^ +/u |CSf$3rDB}-2? 7*?O(>| [kDvȘfOLV9f# -ߐz营\̽#yK-(z<8k#`S&3Ě㭓 aFӯ+=GI:0*E;2o6 Tb>}n˼;\Q'%&\O./OPwZFJvHv騅Ucמ`0+RkR\oGI51{o%aX=~pcDHTwbFMk/ܑ[6Ç,$`Y~UU9?+DYs0YkkjkI+dOK?kh ˢ2wɻ.q[ܥqA+qA=x d6~F?D-1N̑"ϑR)󅉼B{G8`غcibIh6}6!ir3l2g#Aؽ㶤,H֠s{Mj'9VKQA͸!_js)JZIpF`x8BAG1]#H5~-F ;nϽ^zş ʬE[UTEQF[[v͡?>=k*uRT`wքK!&gi u>uB7Mr!5B.R9:ȦZ¸?[Xf";EBQo>}NJ *NwdD'&Xy#hf$AtaSOp(MDRDK1N㛉qAH^5?Fr>\|mwdhnY `ebFId-H/bJQDDo +DmK[fJwȥ)W,Mk,)SrYI(zɓKzlqr3j j$l.|H +piUmRȊ%AeS3j˂ fAJ(3qr?&fӠ09@5$>(,x +l +Sϭ|d +!{)~!xsolPȲ:q]U4HϮ\#.ՖC,rSuUA8jgsgވ)Kq_w-*#x%v_|OIHvgHOOrg)$P3sxƀqInW0z ̰Tfv!׽B̠6BĘ];fC%X1Ϲ21&$k:ƒiw@.@뢯cB<7ĖL Y% M[oZ/+p[(oe`M=6Jx@h%wWF'E!!M d|ysnp/?Mko.}<)-~Q Eg{_x:jF2}d}6 ˢFl~c%Zqr0 +Y,;Rh*GP܉$N +6+D7餒ˉGY\fmI+XƁDWir䱂%s$ ڃe A@=VKy&(^. \i^"\Lt,T{z9{-OuQ +AfU[%{5Lj 0RRPDCCu cnը! `(CҌ'J*f#xֿS~#{яTjّAA~%vԒˉ޸P&I\. ExA8 ̔DWX9 N%z.41;wkcsKOqMYt+܋=)f>yg2 8 8q?!Kvg4ϣsO7Rfro&f1_ɐQڙL(AgH0u,"D1}Tm=ukɀ&5"mwTN, ԈKy1]:3ヹbƴGՎ/}8mFVQc4? e0N^[VzfѪC6ʥJ^CcAiaI`E0Dږ0i֗Z0="Yl&FGarvRuK5$5q,ڢFD>T~>;Gq&RgR`[k)o _S.NxGg8Gp|M,7TS>/$BJPYGQ$9!o(=֫{DsGNiO|#-+PTpd%Sn\V' H $@T#kgRϾLΝҢQL0ͭ0Vvл5AWObkȈ,QJSc؂h֢t2lcN?ЭިKjN;+<=' Q.uoYEq잢k jjqml_֜ѦesRLjz6"`˜N66sA0sH`y9s#khjTq9o2tlu`Q9R|Jg ==/BڜjZ[FzӮGAR0nRحkvpq⵾6 +9.ZGhEtT6{9@yZܡ ͯ E˭8`&"8k"xQ>́;cuO=zMzz?-Y1ق(OrWdu~Z0jXerՒe+`IY|8y \1E3i^e#ZȻv(lNS&DQY῅P ^7_qAz$L/9Xc=!sa.2`t?"+,a/p*],a殆|؇~ˈM +5\3>|(ciqR-oG;nOutPiK-r{S++n^MGQY:՞!͠G&//_C1533HOmƸΒPqH(=1V9|^Rx~yse?ZoCm^hDR>w]g$p#1"O1»**ʏ w[ʧFIsP@4o7>R%~RWnO1''RIN[ $/\KJ{7M&D3N >cQ$C_#IQ ez|N*ptt5 JRZ?N['A@r,$pY`P ]CkEr6ë9w#{=Q=~dVyV(nmBte?>0Uc%̃ze 780a2;iU>|S"Sc?qgO2ީuhq-#a>~^XAw +T,HՀ\df~n!!`w\?ǗFojĆx檐Ii?]|tt wϐS(ܔ2+ׯ'ZB}J!̕;)v0z-34UiR9!3$<.m | 'ACeUpO y±agV][#@uPIZp\0p%gg$B6QB)e^{Tz+U5 fȥJ%F%¥6}67>)BA=&)|&ntppZ~j( \G`5tk=c3rwn;k\ď;js= Y +7~LBfC>boV6jHc e0 +ݺ>`TCch|ʆeJ IR;MRbۢc zF G.='W'-o觩@V0Ote5ܺ1D', qN^~Hzf:2iW OTfJ6nd{D8bkb/p"7a#}mΰ2>PA"ψQQ! E +M#OiJW״ߛxiqH6 Q%} "oL w_W&6i6(=,P'(cʨ8 +#& +0G:vFFInJ<ψYHO]CS-/Xw5,j9r+Gi}e.3<2jH1{6ng~Y^Vc1rD&Sե~x{KÔ"ѝW_FgB+ko ({/:iKmtA@ūCpIɒA5Q >}i'8⼜q lZ\IG52N4(^Нbvpܮ|Hh !]q|U~vCTG[ 938:)Wf,4+izR>:6 ܍FܶI׉FFe}F!ԁwpe;RsGwϥ֓x#ՎMZ#Lxq)ž@[}&ΑcĦ V~tCMT硑_XՀBSʷTIĞ<%e A>w0T+降k0G\,;݊<;rΩNk]&"\l *9JhhjS3]BM~|hBqvl$QtB[Sr(>tޫʚ1r ѕ=ϯ0S PcsNّ<}bv>']=-;JN9$ lӆo@{HVTTF_'dv)RaXCa#qC(+zWK2gxjSIyƨTJLFQ]ǗJ=ѽ[ +YbKQ!s&O 9bKp 39wdiP!Fff޲ 3"7uh谎 Q~;rL_@Ҫ9ShlJΕ'&BEjJs 8Ő5J1h^$O[&4\y6 "$;d1zӞB}vD ^0H*)lJ(yO?ɩ:Uʘ/JA֕P~ՒTvSb'kʫV֩ kt RT5 #FMT#.('Ͽf裲cذخ$g%I3<9^KѠ@bQ$˸z* NF#j~s8مV8Eev wj[dܢ +/>TKT4-TstKg/έbZzЧ\Y%twzިBoS^L5K$MIOl3s0*B\::Wnv .$B`I'#_G]a +̊}a h 8_XcSMQ[TFZ~$YVeqѺ]?_ 0z3Rt˹9:;]2)瑈SA#V#SQgdjuP00S`&x+ BCN}%IЖਭ +SMJABģgSB_}ꌋk Dx@C{^+|NjDh+,J3ނG3O*Rd5 BJC(i/".xC˩PWJpQ>k8X {LwDWvHT,]7i.ZȄ"Oߍy{%/ZdKTark8m  ^mNmaoz=Ag P۾A! `+rsQ`oǻE'66aNE?0/ :-.9WY-c{zGAXTC3[.#*@DGqE +wWa_ 7+FژLV+s +dϖL"]4 +tFH֮%7amyj\8@+ZP]#k +|\bJգ142'wW3;Scki?1Ͼq婥kdcϵW:}V Njmg xzk |qoḴEtZ`+9H?#7S@7ŷRj +I:`t-IgziTxAj6P/VXxh*r#.|I; gE'寴zl[e^c?j oZ! kTt)Q*hu̚+Tj4qvT\fjgǻ u&tPWl:fή`<N&J+baYOsGΡٞP52.Jbs;]+ObCoeS+r.RFId]&ӱVtHgFrKBb05F~%= uԸ˼AAw偣wHf Q=Faߥv_3:ƕG+ ֈ}C\!?SukRVXe@=@vp>FgA.l8pZNFťaURS6JnLĆ)JE*SK?>&8#r >Oa6kH"+_BrTBC.3F ¡gD['j;'tX bU@K_ 7$3uFX%8rJ _DBK=6hb ?sՑBϴы@ a&S1^C6k'Uk SɃظfdQ$I .N`gG+1ђ%髹s1%야P4"^FG+&q\ǓDa63)n#*3Frj[;f'8ГwA´㛄WzWsi%!k. i9C`jCXIwۓO ^4ɕ wh͐PD:9WOpTYH{o'.8HKYyuPj?KB_s7H$,cugQCd麹!Qk ԹϜ4)?7jf|Ƀ5Qo&096豤FuQ-T#`O5ӯ]Q3\kaO+Gwax}G!9p!RqjZw?x. fF7k_z6 t"אT=6'!qr|O&:^%'fC9yj&3]1d1nb{z;f\CIHiSmR5$6{pm2' +wYǤ|´m1 +x{Te_FLQZw +VNs6b ]. Y=9FB޵|fT(+!$wAq6gȺ+U=xB]ToU#!mFMixuЋ #Dm{8ӞG1!-td1]_XS `p[5B V[,s=i +efH3רGq&`9j׉E$ۮ񉽥5o-h^a4~r+1.l_4NLۏ즿,{׎.+{+#[Px֝Cmn@}A#v>K6 +%Gb+ Zv.*靈7 A <ϵ`Dyez<2NhnW_y,q6dgD26h%m570Ȃ;H ^CF3$RQgM[*L^>zlZ̎_ьsmY_]|̙kh-Yxc3Js/sǡD]^ު}V[zJDBATͬϐ'`l\6Ty|1_I.E']!bFbv([=oUh\ v~5(ǁ"AT QAì/` t}Bt +#mL ɇ8&$I/?+g|B?U$FXƵ#G8=GcX"Qk%AK[iE3>طR ? OGr/uK{2p + + %V#I՞bY-h(R:*6qS/e? eHJ$8$`/G7<|L9&'9w2q26-c=GO??2ʙ:VSs66aN׻z[u{юxKmj%’̺;t_74|ψoo*Uj9o:p&zAﱶf:h <ĒI^+*܈WW"'EXɀ2#vG_Z~Ć#xٖNѦ9VP蕘 +9myɖgסfpN( 屰G(2F*| :vAo{HBۣ*"iP^9ڽ @u cioj d o@ھi!PDqA#~{~hFUٸ,ȳ>ޣ+TDjΪ]'ejj&$A=ΨrH~=$Zs'ob}zK+O,JdKga +5tN@R#K}[Eer ;tE'Lk+CyB=8Mg7g6GQArG^X&Wp}O^g)fAO^n]#7&O*6Bzz卆9=#ruͷ3F<+ I@fZV +ןDFKZA؆7&K`pNS~VVסۄNLULfBh,$vL)=`(̐5•/8_dt_j#LAh6$u~bCuPM + jSN8EGUp>(W{m^6=%7;/5D\44C⛦c Ӌ]&AL#\HzZQZzm$bA7uߓd=CEn,.&3RJjzo\|vc\si߃bJG*;Б SHMUKvJ˪>I8*xV0xEU_j&oߖk1m%[p}|3*8&#_qIdiقh$H`V #k뼾[{;A=ڊ t="RS hZ7dcDޥND^(Mq⼂9J"w|Cr]?[j}*F,'؞4~B?fJQX9܁9 /`1^:bUfNpm'6AEOʳDY:`IKQU9wTf-4kGU?:qUKJt&@hj8ou`_fIO +^w_!Jn\R (DItz>$Ib.Z̾9l{;K:!B2-k&B爕U~l\ }AtǑGܰct yT7>}GGl|WrR 49g#j[?6̯K$}oc*7 W]zd 8{ 2 }}\Lkn-zrks ‰FO|Nm +E͐@\Kt] qԲU%;vmsME.%KSlCl;ߝ }Tq $ $L:F:Ŷ&܉x1dR{wK[w_4'ܮ'$ +2./l0tFkBm KqBd*ij6)B=jY_ؔzۡ9wsY90@fцG>0G Ĉ6yGpt7ZBvrf xKISMMVt)نOcBR>9ܿ aِ OH ag ,})mlQ98 +MdԶ p[Z;ֆH1wJɰ_<"^DFb1U4pC1Ht F mX)wtS Z\KAÆ1~;k&s D 7gONVJSk&H@6(:$D1Q~k|!`q3e}Eɇi{ +aTA, +oւ!U Uxr78az6d2=iRI>E2o)ɨ}҅\.Վ'z(*EΆԊ9 pB? O0~CQm16J0xbC&xOdǞ;d +͙:C1 ^5tGOI|s=ƖZ9~&*_c/*T2wa6Rc糀>S68[Х'"ua*{ H_oV?&% dɉZT/0/|{+&8bϭp*[2r9{X, L{Q4dlK(X(̌N] \u\tSZ&#`OeaWbB9OZfQc6&ʚ!ҳD6iz"g"&*xPu LG +"ryT5-̉Pɞx?S+-6}"3B(Lc:iY^d<{Q2$/սz![|L[epyL<DjR<[vxq@R"00Ff:R8NU>*.^a+fʀZ39:Lrll5 RWQhEu[FǮ5݂\d^ =,Z =(8N;X㸊y@p@!5aA+ E+70?S ;"Z,'ZV?{l|3OT&g4.Gؘw&;/M,^RA>"6Sr|'{`v4.>,qoVEaXj|QJU3ב;S3iM&Vzt845f姊muO#n=Z:]'V#$hOh|;m_fDdrAi G@,]z稻"y+aѲ ZT䃥 9^v'-"rWW-T\J/U Q=-my4Ӏڣ RyO.W/q欄 줌{٫.V UbK +xG +?5b]MǑ@v77 +Ys ~Vl:s[ j xDgmV63T>"sL>`2(ZfgIi+q5$T+<p@,F&`HHSy!3TT.hN2D>ֽ?F1)_ؖH(i/Zڙқ +cW酯_ղh4#Ldrfb1j([-O{@zv^3韠 c˾U4WVh"zDK~WD+M Jp(PKbNtÆ&/>",o:Ux1_*8J[TVexVFБ\RhUYpgl!x71Xtw4Q-&zcDX QդTb2=F eA1fB-}(H;qh}Gx_y&>U()`ͧiΗż'Y>m9)&l+icnhŐYbe^ԨR2h|a"UhT( +S*(̸ꀦt S膶` +ݕK) )м]j8P8V'!ԢSAo!)B;]18xzF/ u tՂ|:&s)v$S 'sOlֶQ3s(,ɦ #@;`۫n q:Amϫr>T;==(vi6A= b+&_Rt`3Sq#Nܫr9xȉLt1u!^|sOYF[ CaD;G<'%\ZƧz^vMq=L;M +(Zeۘg0˯(X/wT ]0{Ug4`d]G m%X$b3jѕ-@H>cI`1gj Z#ՠه ,nBi$TQ6#f`vTֈvhey7bOax6pui-3CooUw;14L;}8GlJR*j_B꼣$w y ++sI(\p6rݾl>6ψb s{"w~eZ1GD!E`~R2``,-,K>QCQ17Ɣ;⭻~FUNR!4ѳTBK`^ ;c5eDX'unͦLWuP6ɚXpc#C""SnK.ZsƯΦ떏rt_Z_S`~g?شϕ"evl P2+Y->9jPyn!ug֐dy +De| d]+QIj MN%k[''ĝf R5eQCZy%;DkLr5*oɩw+RvI|Fw/B<:16.a 6!_5wŸwMwrBxMDscKVn接ܶ( : +xIYDs||7O鍍 u=Z( ?lFgT'3E%`Q_D!$,ڶ)%~tSHvʟsPRdW]7I/!lAq*ωDH;adlGICEB]-y'C7WVNHs}H]fcg&]\i0Y S~5L&v<QCzDyrH|Fm$gdsHb0\j EXk,YW®}1^$gjy$[`7C<)G078T4Xl8^~z.x8Av =V>hw#9\фپlr}udy#(4pS,ʅ\)`1&1@Z )9m)6q@̼<)pLmd!bTxMwļ@Wvҳ_}B`岹dcL0+);'EH'V]DhrW.>?53s7k?k@Q 3s؆>#=|Vw3[9Phw hW;K.ZxGH8$|Ui3y\B//|5/:G4[,x)Q9՟*i4ξ6"jC7{֚ f ^j\կP%0.rN/LoP!n)y̆cʳV9Qj(lXfLjrHؽlF7a҄Vdnl[&Mty.;"{˞/kgw2s$~ΨөCDHNQOWlr#ֿ8>C\ f(XɂP%Q cׄw B\O"ҧ|7#ɭUf[tmL]` +p$)(W]V`Lϥ6c>gӦinw2HE-c9t1ط$pemy=&=8"B3Be+tOf4 +5hW"_))=L;1ʃj<)2H# x7}BOjjo8Gkn}?5g\8HqH#ŊN˵C +.h.2{יM%v[o+ IOD T`~EmD+~iYϙ:w3R*aDrMljDawͱBڵ.%ELiDOG+Ss##7DڬFf잖4QaX#fіOafl7?%$z,NoW$xYQy?9yH>73C*1̫w m;a0k +z8yu8}6 2F Zz c!Jxg5,o458/gX)RaOl[tZhﰊg*~@5{:b>?-[6@8i}dv=בiDeQM6‡hv&_)1p8$;穛/H9ՏV|baTWcE4 x.nZ:]I^Zα?[ɩ c&G,P.yE |w znQ񚄻PVH` #P;Hз !uP|v%b>t/ϲ[+xQyWbv(^,ZYg/tg1w gLUDO`II.qDZ'ZA~XV7 IL0Зgj05d#Oe +MdU&on}R8<8vmZC-񯴢//\A=Bl&}KxtS/xVi\F_iz'Q%k䡥ՑFj_^#<'+f :d7+)QJ +my(_ADDb_^eab*4ט?֟[=FD@iUg'p\/tD_; +8eKrM Jwrm|! A?XzBa+8w LfrtK]^5JkAYB^@!TI c〲?HQC; +>ݞ`9ͬ!ܴhB[_K#aaKC/KH&hNhx'B8=uX\i_c}OVXyFǴee#eߡ0/̚(֖=etiiŨc!#Ą+ODRR>B0lGd;Y~)8we=jBJDq&+ߚULDpR X0k! +@;;釠zgMqLB~ `(B +R ؿ##97kdlB<]Q?.$BP8 61b ectPRݑT|CH@;+g9dT!!Jd1ZH@o}l"Ve;eG/u-k%5\zq֠(^gr`Q,(y@ЂQ idY[ +bVFд#1e.űs@R=jqa0儢H7A)`h#GϤh]Z'1oBB`qBs2L0 5PHmm酥x k=W*sgӮB%b[ eLW^/^~j,+Ź\u0絧keMېJYPOl43w &=?k ,stSkGl*n/<tU]WӺGQ@L̗OmeP(; WRSRm͑Z qfs@UZ j9_x;WP=dS2oZs)m;%֣,&dwQcc wyCgN*^)xv)̷+QPQ҃USR08|+vlx =8#5#X?bU-xcy[NBS V;P=%,(@e}ý'aT>b+2ǽV|~dA9ͳGsW<#SxnY#F7!ڹRbUi5TZVs ^mƌ=Kp] +&aLPg#3_paCwUI! ]+ +?X ZE;n$n! "[ ʈq[%a{g v#m"朓ZMe,TOx9oEK!k@S}y10[GaV윬IBrIQd/̚Aa*D掵@ +YϭQnD8̭Lu= '_W}߆PO09WU@Z1ĵ1q~%>mjҟ-9В|zu"L6&#k;"|f[PK+7稕݈\'@\DA!WA~`U>9#ԤѤ+HNҨ%.Ǯ5t +BWC*V{OغйW-#QP-us? +U2+yju!ҷg}Gz3,{/0*0 tWQݖbc/ۉܭtd|8ݪmt tsNJ%ɾ T"I衏 lC|m&'TCphU-L47gP;w#ks4mMPؗt v¦NFFzZŪ +\;#LW=;ŸvvFwc,CcY`vOVƒDc++N"fIsÏiAA$RƘí h aerS)$wȋc<7˒fPg0Xdt}y>E3oW nfNu:j?O)H"(Ui[-U:dTzF@O fc[RH'Rhk6*X5Z43XV4CW %ێ+: ,#zn^B *ɳdPf:2=Xv5#n])R+5?*xPҾ{clԝx$=#k G + &ć=R3;փĕ bТG+<8*/zG~GQ͗'< lU]gLא +׵K]i'ݲUºki + $&{ !%N+=VՐ~@p + ­I.5UkjL5HkXV-ɞ&Un2Z#0_R$?Wļ*'sV>[%}(oRƺRgjxG\R:=hcvPY]5?4|%-?F_Asw[[:Š$[¤' cH1. &L`fDž3eF +1[|J"xv| "g|ZF *z|md~Ѭ:* #bޞ kT%TUdl d=VC-WފDuMJEDs)!QQ_?'2([[y7$Z"WIv_U@"ڜ@;;^{ox c^W}RŐ] ` 6*{ ȯ :2#c/i,Vr搑œf>3g[''(}DR횱r#u@ձ-CAa&zD +=eA+VWMؗR0~g>NT&9N@6˖U_$&l'+e?q'(۶˝zzG`n{Y;|}uU 0֧UNuWMlW=OoA@k0FwdWFCd>8cC` d)[)e9Iekg҃eSZrmtʹDwX/C!0/m\Gl[nqʫ"WrI3+v +JI]oz{yYeOq )GQQD"'T =Tؒ%&ϥU8õc%GFI@OfkD;۽JB+YڞNybUAC*R-tBh#PV/D-vTS7h+ ݉rQ \u QV?vHQZNaQ5`?c\$BOEvQ$(D[yt%gɫggֈ[[kŵ܉V;`"QpO-^KU3,ڹ-g[rza~W.QʲÏO<^(35ԦשVW#$Ux 5_-tR?q@4/#R1璘>+6ݜfˋbCB8r/)~n(@O\UQ5ӂMk -fvW@,mUc^Z87ƶ#n4l˶oc[ K{ڰ[x/Gvj " 4U A捲CPo $sE}@^%-f[f5LᬌZ'3bJ-6sGK0(j:_Mjb Y|u^]NfZh3t;B o\TC\ȿoQ$$ +)W2rm[cRY=z74C0Ozt&eAѳCW +F{ew"ֶ'ZdM?bvzV*z?B_c &Nz?I~?ǔ3jCSZo;A tQ|!2;Z/n,yl!@ssD-b`مDgtD1WIl{^Q r)9"JP (d!w 0_ A]3+6JB+5=!F".&>h֯_ V(yKPW8Jߞ{x\g=10G#ac6/ȴFƯ:PL21YwFX ~،#ppy li̭j w=HVf3ح{IJo(y^C6 nV{Ze T؋ExҲ9 +sJs{/+;\_ YKsNp04na sHYT8Iޫ,ì:r1FAYF׫*e$N1&pr}J,4-[l[a/'L-r`ʈCSYgcu^viz E5Tp[aY9ROZ;`qvAʄoGY\ ڋLzU}D(=e/,2BUHU({Y5@=;ly ? =VOIJxY.2ۜ(G Jbp> hg@mٮN=ڮxO^M?_C@_;Mgp@;i}a٤)|U=I&=j٬4( +3{L|8+io~:*CfW +8g+ܬKި#)c!=qWqJ +uW]ꄋFﻗت1ZP2#nF0׈uSǺ5'kL\>`?/@[@3eZȘOfw1xE&wL$!|c5;ѥX^ֿC!:;} +\9/m?+~3dS~x_y0,t +m$C;o,ǟmQΥ%pEo61pPȟQߔ a_EYB$P%ӇuHK4VYvJ;%Zj.-yT9b-n˓uY\ +Ƚ.5Mj肠P㬧AF"z-"IQsnlɉ*ߐXl)k1=B'xsIToީ!ߤ:=}0s:z/s2 I<>^HV{-&) #n)OH !QC͛r V1heףE]{E&QwG7c[?s5KHv-| i4#V-ǾQr/GI^~-|nɒ٢jP(癚zB< +G6'2%={' A4݆o D'FAG͏y+*g~Jw'[GWǺ 3JnԐ-ƞm~x<I:36ɹ 4NܻQY=ΝW`ΌF؃/Q r=GڹC;Sz 1 ?6sX\ qIڳO(x.IXvvF%QEïO6Gi^3#yӤke?۩3/Qc0"{ ~ ܗ.ȵ}9ĞRr3)ʬaX$ܯMһ=80(_xj馝hnX!=:pngj8X7ƉrHv˨o@$LZ\v%tAzelI]9瑔܃϶槐KݛyC~3e39m8 뼼^r)!1,4e$Cמ!x`2oIry0#bPq@hέ1X#DA@dz'C͜E^Ӂb/r|׺eYi<\3etanQ"]h Ye/54jcҨGh%#JQSFНnONwaGBl"6wp~JJ^5?sS^ ]>I>iW=%!Clgu|l@2OǾ}gbA";\W(z*ߝ3jhsj(+*?}AK$iQ5Vcc㶟9jmƒ>G6G4Q #hޅT^+W'o.UQ%vHvȝ^g +sQS?Z170,X.f[ +>s۸vH3u-U%US,s!g+;Pwl]I4J,5+ -̧#NGHQ?*=.s +KId*N:+N/1vjag|uմFx놷@!vNwP/mmaV{?N=:|3$VVS"2t0:F淃CɌ=Irjݮ5lG-q83bO489nU9pCd"z^r[|WV +2fւ+ʑdn; Wcی2KϡAg'{9a])6CK A h)XVn9HnKt24XО>OОΈ8>q"SGGgÁBCg Lo/(V!b&;Sz  :#{/-0-0ha!xJ3&]uӣVp&K6H]a {(v̊3r`]ZAi֌ORֹ:Aa$=e87hY秚~̉UF)X~nO[[`Pk{/V u"zp@9I3GXC>@F^T%1W'qL '೹ Ӷ\[/O" `_@> RS[[d4jS !OEJyLhchI6-wʌO9bƩeXեEv{DoC~f-~ʘH}MDXgJ+v%aj޲ Ua!csBI 9f) u%;4v~*)՘RApc==*jZ4j[l_X?HTR"1 :To]5ʬT%YʢؒRE]$QdX &֫,&ϷKIuK^XU]z zPEm~3d@S6ևQg ,pSquM;LZ*}颤=C2N ΎO2Hnඐl*"O"3_@[,EiXۍg(5Aa|O/ŦL8 e8:z8mw +ܞ9ۯ=| +Q@ +VI%CUhN-x{_յF EZVFhQ +Z:1c)*tjaAW&3%&;7PoGO4K rKp Tt3g#CJ(GOGGjf2:W:v]]5E:W xʼn2%+s)rn:\TK^ʉ#62 #x۪WM[!VY, =+ W礲|gHU|)*s1:p\D IwMUjR_s~mtR9;ֈtDJN'p)C+BWx@TijuE#Z@cbqɤ4!<H ެ+yd5N"#=+|#oBQ=G6T +o9LQI9A܄$>ÿ6f~މi#WA*\Q WIM*v.m+!Xrhe%kA^f<%P|ǪCݫg=!54Bw^ϚHЫP8qrƎL;zP]?ZMe|PrBi24"rEZl(l/o^[ٝl&6BX-^Ýfe+Q"+:<0tTM"(7N1Dպ%d[~wc{^YH6Vcb0/7ⱗk}q`(c .bGN(g=lc>s1=R$_ZQE|EDž._i*Zczk7g(V$٣Ӷ7![#D5L( 5$V%uUf(Q禎̨4cu?SLEʘ|t{r,XC^uTGw54cW94h)la4{(k=~EfGV*SZE|˨W\ qWq\a!Ht7A#"S,?W~?"qҌ?rVʆPa")  +.X͈-Y@D)"lM=r3@C=7}aj/ɮAOÉfxh:Fru`2 m`:2 *sCJԀW ֠C+מ<PwL0q[iܫ.yw뚔]/LQS flUP6le srZӍ)4<8wRmGX`s~^Wp&2ЯRKyo:緲GxLric@bfHp=oke#]jXEAz1_z7LRm>Wq޲E ǐD|J `& / +3 += ͛ +db=1Q9nm&6ѵvtJު+|+FZ+]7@FlGQR)#rOT=ÏŚҠIh\^r JU3V-?]Eۃ3&^[KB&6`.#t2'G)goxш406en +RdF,'C@=ؚkHCh};OLΣP&Ji#XL%e>G'h} !,ymtZ7Ulu6x8jѮR _qL޴/++VRS ǾKv)-Fc)_N}4k[FR>+l0-0)"Tܾ&j(97J|Ct| #R)GuAKy\  .MB}Mq|}R";/O)$4/STK=X=)@o3lI8CƏ']wl/lX[..R\^gMx3+~–%?K3$?NbJ*PѯC[ӓiaoTL +:{{+Ih,-pɰ0@f0ҋ_e;'))Cq +kگA,l5++\nqћy'.ݒ1n[/֘H+s;r@9oqî(%z߮:e-Ti0ĎTtVQztEP*u3doJbPjJsl\ \BZK+O\T%eKy_~E|ƭ(g:.)xry:$6?`%XH}4,+|/k.`V3nFQV+$V ꉚ#rBR,{'A*¼.ZWR5S=|:QuR $Kafs؎ML5ks1sKQfii:Xl@J+ :yJi^k}+߰+5y5cކל*Z:-ɍd~MGOY}pEh!@U! o'=>[V}V&8} }kT%PHD+P ![Px3[4b-M/MR'_~~?CgC9K|Ah>XZ rh{ZZ^oԸU _gqzΖuK'b=l=ܝbE*fQeEJ8:RU#.ًQ?Ibhcwϗ5s9 o]MI}7.>X +T5w[ԭOWЍJ+ 'HOJt8]MN/pΦ[]DKZX~|! |9e}Wޖ-v;rң{nۅOP@;C&M#A "⡀\ PA[Yzx'DcUkb)j(jpl/ݬ1W=gT|,°@Uސ5\2ۡ i]Q#1a<&NrׂZлlekڎd/'*~,s0L0I^kSf'sk%m.v\{LgH `p/bHVv gWd=V~ v.uǼ1d8tо z7 pն植K;_9#{ou^ &KBeDjAD-$ 'pBԔE4]RE^IJzo~C-][ޫV% S@ж3GX + [i,sP_%J_z{; >W R7Vr0(([W>ucBYu>%̃ +uXBryhR;**iu<|k@Nj +4FA]2P r6[4mYZWVYF~mԑ檭{Nf># _͈Ψ9EUhv=V-%@L/d2u'|;R?߯=%8C&o;2v =%N[UR:l/){k_"OB8Gڿ]Kܡ݂ Cg{עpV \ѮQi%W +d!G-~ٵp +z@ -6 .m]TiC萵y\6(ڷ}& !mU;|Gq)o>6mVt}xD Rsaq; }($ׅk;I1|Nv"s Ogce2 <+ :,􃯈$i| gh-HDEGQ5_q5̘P+Yx(vp|v2( ϴnxW6so`XJ_ba6wL2_Exk9!`Z7/ޗiuL>}Zro'`Fж@8ȓթĎ(` \pݴ\R>xDUXw}:(Vť\MIcZG4.hL!=sybyy/8V/Mt@|m)a'кfC7Nk}_Fš$[T +7'n::V@=I t?+[ ?éc1bƧZ>>XFt?rh6r}d +>T1M'],}g_yα%`hrMM4Ƽ=CcfZВH!h#eBzж \}G|)/܊IиsRry76Y-^>lߝiD,jk fIR3 8ts!ݒ4?$+VxkzؐݠyD[l-D xx1*8qG.\ Ra ! +Ny:ֲ/*#I=)\,ӷ*4CiG]rĂRDI -{05m8VK0BR /F󜠆cɿOYBY뗳|J6T)1w-A"Zf:71@ 3o n0AJ) +h49{Ajjd^YؒcM"JlQ)"QUzɌ#5S\WI3\Z"GU>k+:GҀEߪV`+Pv0_G jT ]h>ʖ9s0D$?AJ?qW^ 0CUOPu3]Q(-lG5ӎUPS3un%v-@u & [_4j6zr;{Rpd.I:y*m|~@A(Cޞ%$q=Vm_jBtF6Y]aC]PXh$ a]"$Nȧk(Zjz**Es{d/gFꢪhC9#B|_{yo[Z5f,(\%!X5C`P .> ~ӺV.5F|o 6B `c|;3":x"n":!Q?B.s3KϑJw. ֳ_Peɏ%}A.P*ExL ;&q`d NT Y`pg')~,lO_x9pR%iD"]nՂߊ܉j,HϦ/0'-`qY1k#@TTh>>+jxOط[D"ѕ:[sU3;c9Ɩo[G,r^^-nODAү;TXYVaKWRXc*H`أc0xLD+17ȷE~!GyMqVN DZ#7/ҞxPB#_D^oW%W +@kK9Q-]W8ב}18nǗMIJ}Zq@QytCPkqC#$ +X>k%qɉfLڹ{Z&(]ֲ߽VoqbXtGhJyEP7 AYsVd񓳧͘Ϩrt 8?S~ޔnoAGa&yWG}Rn.G  4%o=[M3]{C +#QMZ\3p EO7f#zU:1+ao6,W'Djn+!C'DHøKIiŐΐGfD׊҄o,N# +7TwJl$TWAb1>0'c,wzE.HٞjLe!ᾴ+<:ڛC#i\oh<7S)-Ijfн#O8NP8W<[9F߳8,r+;(Վy&Id +f{9Sѧ1Cto,vOKZ0wm |FNܤEamlPCZUf`O]~1Qȩ]|┹HD=\X ׵ *XH$6E۵HO .:X-ń$ ;#A꽏<^ eDI8a1)IhߎHRS.ѳ/[n.)HOA.oAAcyUN8npaZG=zB7{Wu:*HweX5Q3ciX.[  +Gb;~RP,a=eH^m:P 9N չW^c?K6Ѝkgu@f-xY'QwP%,0';ko=4ZՕqUٸ_(7ɧI} +>bDĞD0BT[w/FK7cˑ.^H-d*Ԍ0ӗjWw=&OUJ|h0?Zu"Xgq!@W˩tg㾂OMaA]/>9I钚IS:N![unyXp$XUɩؗ[x?4ux=2%I*q01 eiˆJwc*)AOdB2 ,I2At\ʜ:PuX{֠3f–mӒg DuDK tAޜDodSQ!KXT! LpٷDz% Q)6۱|0T):z4>Ksf,% pUYlbD= |@|_JCi~\ܢG[ jȨy$'Wf +a_P]eM9 Om5Ha5s#dQϐ~ǥ.S +aaASz4T:.FoɁJpa.=m sr{#l<[!$`)lI?Eο~n|] +fKvzyX8%F3 +OrTz2A3[/a}Z.9Sr 7R\ +DIT2y+w(48š̈́olK0kOY7۳sIz JNo+%~CtwtW0Y,Vlq"z_ +3%_ϕV~"u@X(nGD8h Krd#zJ^=̷i9(;bm* #>O{K7WJxӔHej1 ?fqylu#7sglK\5Mւ<Ӟki'yQcMpr5I +i#{_g~Ι,hQ@[{jU<^fS! +o!i]`¼X~eAʉ j-mUDPg& !(X맔4kztX8%ɠPs_='|V{۫LZ~4EI!޿s|԰ym{EZ`-w^-A# ~Qob;ą?U qjsdn_VayN`,;^"TfH{S⹢*v}/Z{J2(1j ?qarthw$e?cSexf?qd4'm_sF10 1v:KkP#~*Go!! +e(N>-2UEh=.093E߯{pE[CXeR?tc}R(>JM%K '–rEwϷ_ѢBgm[7z5 + 0kG{mDķ_Я_Y]!kT6+QxbD_[7vZ!{@#:a%p_bH`^;*#;ڍyLg=ڱ@20ޢwl燩߅Ϊsp0}n[IKE`;8Tr^;Hx[^&G]j8*ep]W^WG5)tJrfkv/jPoİ&!X1'; +ʣ.t7 eSP(VwxK{ AԏÏ\dH7 +wx $\aB.I¤DcfD*Zn]Q0~i'SHL$u9rNzl83 ޏ/W u7=6^?XJ[mF3seGctDўkUFʙ{4eЛ]IG KeHU;0fq CO﹋l-IҼ_rZ.LiKsGdՎAajK5n  +m}Qƺ)W{WđR@7 [x Tj.}CZ`0o mv]23 +[v0+c0KBTFsyBq,( 54{-qp@a"zVi_ׅcyRBN|c..|mw%pTqUЂ=qE:>#~(N^Q~Vtev8v~8N.fM=hſ0R]jw +[գp] i2 qXA5'_3s\3dٟ_ L1śN#I7`3{.3!:FJ/$? Z龎W<7jx{uh0gr,ga:R$3QJ*U<}_Y)V WD׉Mˎ~fGhfL9G. G[&,ݾS:rQ#7Jf XK"x +Ej><({38*&ϧ=8=yTZYuO$ؚ)0l$zwiacњpM~6زɪ"g;ݫ 2| +w^CXLL0tZJ(" +ԧ5cP:p.qh A@*uWlgl\7][dwTf.8.`Y4Ν%+bA+E.jq`^R#6[s~T4pGp) $Ѷ[*UlqZK ? JI nϘ3Cc.nqʍvof.ь PjF!\{Qi`ID8tJv:g-a8;Ӭ Ҋ.$)dfiPS W8zvq;@yJdwRsUID^z;% +x&[p^W'(ׂ̏~Wpn1Gb)lGVPrxS3©g[/, +jz]+.'[sw'Oo$38]tg}"[JG!%iXp'o;P8:3$O$&W/../HUv"J=uY<RaV<۳,: k &E5ۣNm'׮pY%]D}F)1O2 +3_YE᳎-ZtĀ4sV +buJ3$^„öCt4`g7>zE?3=zPB(&{VwS{28Nk# ;U4dBcNwtDՍ)q&1dD$Վ\y#gA[<(su4S Q1讫 ɣ/Ȼ8tƙuZVNf!-۩nHlr/ЎHUIqdžW}@XD8Xv Y\n` dWxB\&gc fądm-7_GKi6*.N#zp{^]DO0Y%#Nb*|gFsx#{<#6'84}KD T]DRAźm˧Ġ&E9ǟʙ:'۱jL+v aEOys!ghOl:_$M>V"jя>u1#R/;R]ߊݦ豅P_Wxa::LGU;h66UtV}ˇ+d|bI\*[ҎJssk+mv^8}A +e[wc($uR=ܭ-YTvǐ9K+htSG (T)0Έڈȍ[0)Z/b9Yyī ff88&xGΕIKje@)^2T2̅2@sp: +GkX23ZFLa:Icn9B\!3eh#2k)`cPOqMC?pFw{~܀e2iHt hߴ + H~TtDbA:MJ +3V& _~ +h![bϏ#R5tg̜̎]AMDAN[Jp#"`P60s{3Z {7Jlz+>/͗s}xjc* l/ ^h>j6W ^u. +3ct,Oۉ2JYO~unϢnЬkP`vUC#11/77;SvBXx +-2UrOߛAݿR$5c;L5 +h&|Ƨ6k+dGuPz2E]H}Ӷ Q|υ@8$R©,HGs^ҋn[_p~E͌P3?ۋr߂NTr .d3ԑtd}It+M\!+7+-"@M x< @[wQ(kŔzs$˟;Chp(%鄷[]xG_ɋV|O MЯNp'pyBbuTG_%XC0@QmqAș[K37:!t+=wW '6;cã0i@T[s xέFLۑk\4w޸a/ 'B$(9Rp +L#?9C9rʎKi97XQ@i ԕ,?AuqxgBX`dXM)^=q8Ul|>p9 i!;xS;]h7֐yP):~:aGJ]Ty}J2c@<[?`R9'm}ss]:LQfW^ ^v kz?ZJ;V1vr F̽b!s7DYbsyl`"'[@xQI sxmIld=-]iʜR7:vB8VnHze"q\zt'둚rDy_UTNeGY{@0뵯:ݗ%1 VȔԪǕvl*WZ0? K+aL{$e_`5Q=Gqxky21z]պJn`޳=bF)֋% T7#lM2NuwY3q[D^񱋀M1t%`52DNWjj3l;E0q;kYU\I1{aZ7qط4`EP rhx5&{1fy}-@*Q +Pw.oLNדb'Į,zg_1L>H%Vۑe,)}JPnAN.m^},ҩi\9y13Mա?.ΐx:R4=4\EARn!=*ԥyTJY2Vs G&Qgz٧|B? : ui+`p3)9h<@/RHQm~7\+&i6Tyr?~iHÁG@EߓmNCWσcBs=aa1Mȋ?JǸSҕsy#)qM}?|Y%XpZڴx(H@R#u}cN,hq4sn4ZPl +Hva9Rz+мSɯc2HW2f3+ʏyP;h 8rBLA 0lKk_-((gbb 'K(R 1s +p5e9ttj5槰AD8051!TFcQXPy \7Cprgzu}b8 svr燭5s#DzD('2o2+93j#B)M˴;1?~+';9W~-Ƈ8mQFaʊ#;Эr}"5ԑ1Q)UNvX\' 4xԀveOxDf)<\%~߇!ћ, >26cacp?N=DUaeV/9BDϽ.05᠇!ScTW&}CzlSVYƚ۞ +g8C7>$qW8guܯ9'8V%v4aeQsLӆa:bgcb"ŽWIE|[s@Wzzo+\pgct4#Κ!@yOpayV|ss +AqA.y H EZU)^ȳCPsrr bC,iZJg}׷jȏ°{bFڿ>몧r0uSt)?~kLYǤt?_`~M[a [qŋ5QNdv>24RD#tH4@ 7?+Wv,\Yv[UIgq!PY +$ôu0=%ND!goɤC$T1O}Q㲊NO񿐊ڑ]vܾNhQhmyeJ':|ޓmuv4rjER la.&ɡr|?go_VP +Vڋ87X¾r?1nvJզ:_X +b:C-X:I)ǩ T";q\϶'ּZM[t4}ުɜ}S\sC-W(3(l>$>(#ZaH]`{|Cܕtc^/(Q4a$v6*N 56 ]-n?ۍJ?̩7eM6 3|9}w5@|'+}#FQx;ܕxǎI%ḎHu"H#ð !:i "4jQe}pIT|E^2F%qv'ڣ̡N AJ%D ZiߛE$ycc봩1)X֌/_wX'4~SqEY9\81F{uIL=N;H꺭JJC]j=KV":5+(Ea*CYx/xi&[AUG:aJp''|d~WD*_B3$p~ѭZ\+޶sq3ʅEgm;7C) h'H#p^jCk:mYVzKs*Ag<jN,-ZR|(T^h{yx^GWq쉝luoqWZzx0wԕ.5s7Se~ő{jV^"oڦm]Eʯvb{Z[0Ic+l{筁4뫴6 1E Gel(m_Jk5`W_:_&->(( r|KP^(Q%NX67;DZ8Ll"Q?PUJ<Ӱt͌y[Pd@A0OGOń߫ӯo~{ m@ Nc@A},pJuXF|N9Y=(؄ %r;~@jΪ +XCKFգZϪ~5σ^*=sͨ~V|(me8Gjs^jYIDSx ׀O\ljgՙ8iyB۪}\?^+SfZfTW12>iM͌T6Lman,Pwn ը!VHPɾUXv}Cbcu4n!c[`hEJF%Is?zhciDsg9_:G_S +pTCs>p~{tQ $(etwQEm4Yz2(%?J GbQ-?6 +Ko|H![RPMM?*|= +R{)c+:k4E'<($F OuODQ19lDQjc?Hw˜Ѵ(xQ1anEDCeˎַJoiC5%uW<jgZqCTt|X!,3h+^~{v5n[r!0ko8qa&)5{2*DRЙ]vR; r1ø0K&'ߜz; P0 .}i^ߥqdW˙fQ" XFq+CNs6Uj(1H79%44 p+s_$LHݯp-!v@r*G-OgnW Q^D,бW7y-@kӸj:aє'M"W`?/}\4wqUO'fѓ:gvtl0亐r%Y VeäHb׸K",tw԰3:T>I)nq1'{ NܱG)W9+C4$}h(8΃1$NHu5g]=۝ Jd" >)3'-eH +(? faaLewF[ÙXmʙ'ɠ{$RշGhA=Oa="r U!kh4r?b^w@>=jZɥ#4-0`:VQ+y an]P^ X +wFzCVg+O n67Èu-3\SU  ?2V0}4<< C,^[e&3DsqږlZLnz88R_1K_Ba;y}lo͠SȤ۟ZڰROcx܄#4zE~;vwOО=#8J)BCSI wǙF=eB8PU үKM8ܩ=]ġ`qgRːAfȰG"-鶴 kq#P%:Gr":Z ~~(8H>܁d&xGĴi\_C!vo.ǂ9S "lA\nsF/`Udɑ԰H[5Mx?̟:)z\0(^)24pkjoX{Şg u,|U"JgSvaiwjҍoF"䀻+:,r@7d"2c@- ߾NСH~R}*3)v˿ ePl*q_jP"+nBOb b Ǣ>c$1륂3/+Aщ> [^j%'wK/⾋82V-{^w=sOd=A h@d&-鳋2 ˎV;ؚ!ͼ'W?:^=Z@J w5v;qARɸoDU,}Y.##nkPvjjĜX7}Ca'SCC#҄}D bOizQױ.\=0{!['5Emgs9X϶¶9;xJ;xR˹%/__wzDTzRۮ[."2$zX* vǜ`v3Z6P=jV%@eO&W[8/z:9Ԏ%\'shSCh[JG*B@lV4u(0QJ3C#L2y kP(ogi (G+{גEʝK CM +ᕌQ/1 Otk-Ex&S͉CDVnP =U7Zv9[J$||^qu3?5s_]GB'g>U^Ń2 +.{˗ SKerUaaeoTZ + d?U>us3ݪ-Ԧ` m[ۿ$[>UjIش{E}rZ_&"WzQA#>sLgv:>l"Q; ¹=)FyTo}dh)SթPW:t-t|/I`XATE pp$ \T V-Kz4e B ('b+znWmԻ"=*Z8K6Ȇrqm wF<17;k0>aʾK/˲,H. T0φdG?JzLUkS87ޜ$ \[-ס㹚&RbZsjsmܡ7x6XQq!{".)4$_&ŗw,ޛ=+JV}_L?<_agɱ s!8rܕkq^39|E:Q+?e*i;sia?BRVsηrpכ|fA3I7f.mYPV5zݍԞR D8:GAQō=O.c"s>SfN c3ħe endstream endobj 36 0 obj <>stream + Z%b]-^zÐ:WX:-4ır>ĚyC)l#&"ntS쑄ATGN%#Fp.A5y`SPsw*BoCL_YU.cjNh8mbZ g׻6`I0CM=]U=R"pľ yK눴+J1T>jskmҊ{hn*4XcsFaTIϔa#1P&5KJ ۖ(U9̑1(Amh +CtRȀm9pK퐽+#{_;*<+jy6xp"@wja8V,olO;{hns%O=R+{Ix|{ +XӺ5Mr=#Zz@d+;ΩWRGnBJ|h-HW5uGV0 D(WS@# =)34[ޛ/qa'u2:ss>9w[$QCYiI>9Zm`n=AcXGjObmМd5'o'KMYh)Zw֖j$%o}qrES@\/."dɜU^z J"g1Vsi]=4k@uPŘf Xf/kuFk Rq{ Q4-cQe3 #|V\=7TaB'{nBK(HS U28[%t"Ei7ؿ }Irn4xPT&(1!ŏPӠ4%AyBΊvMAHEVAsahBȷ(n]<_N徭kv:{0E`[ wPX|uVE0NIRAStǤ4W${(EߩlB]j[s?JSm|҈uּª$zp4UGpGb IJ^Fp";5Y?'1!TRbRy0$ N6};"]Q'zl^Rֺ)ni7l*ēs s7$8\}cׂD5qQ:fA"~jjlA `D7ܿ񸅅!\sXeRy$ -݋^Rꧼ|5s`PT jStt՚Nj1phclO6^%zjK'RӞY%A@C`bjL:%@S+,'^?Q, bT+2D==`v,i6:u; 5K|K&6bs>":]-̨!e6kH:hqs,43h)P쟓#_cl1ltc}\.3+|](QOC=@̮4EW厎T Om0W`-TnM'l[4at%#1M'ڷ8C\FPPDI+4A*l3w䀷wAĕAOͦebXnnݹq=f@׍Ѱ! +F3!Fq~*, MTG]*cƥ a[**oy= +^cj" "mT116޷wq`}"{_,˰+ؾ/-J%ZaTc!?b+o<W-J_޳*%?Q[[>( +X.sC2LFd|`G<΃AeSX.?E\s!:ttϻN84SF!\+vzB=& [:]W/ia圲 |?ܳ:ئĈI|Rrdpٍ]B:JZdHlEn?|6 +6<)s7j^ #x,':?Bxi~Dy̝USt;1OhOmBFfY#&:W QDӯS9Lv=:DVLw=MhrnTY~0h LJ](VewE"+ sݚ[%uFRzyx:Q9R0Ufz4/V6/צXaebSlg=o-mDQnjri'OU-T-#z ĝB~rŕ!Iu&8xsmA:sʱ=ⴾrT&r6|Z}y_et#k*[߹⩗b528J'v_A&y}䃴!*2# ?.Ҝ]NXfj":N2ÇphH9*yn{ep8%nǹr_xQ'XeT#&?8^}*{Hoed{k'UGDiAo!MG*F(?[1 9R3'ޝTh\)ǧ(y#V]X&]BjӝW6$=} aMxoQ^zHayUL!§dW +&UFYFT([>]4y-6|L$SӴ};&o@@;iXFn4lkČe"8o*=-tXI Iznˣ2n]ɜ-,b2D('rc44Q{E) D^i* kIf92;蜄uDBy<ʔ#;^ߘ}ib+MXq0jBbi8 #֗?@bd/Ϸbr)l5))w5"6! 2[sR9}D5sK<tn+ҥW"J>IfSGϝs50FkΪe舮~\֫o^ 3znƷDvf悧HZL;\r+xۙ)ҕۑCN0ȘyKLUpD.扶vn}+\11=W2r]ΊVDږ!t .Ȯ9`BTWլ#2hkghu =BS#ޅFD<[oa١HD!"#@8Gt|a!h6zj +6:iluگrfq-!XTX=jV/?'ߺoݤ%)8J;TtB [C.CDB3mxNt/ +0= +|Asݯxֽ0,?j{[/m,@Mp'jest +.eŅj]pH [y,95Ceb}RBځ{}`c+pqMJ=5yosB +qɽ3sW<& (~nuU_2q 6yR]<| +*A^nX3w~rEhb!z~ÏDE̎ޙ +>=8W"%Ү.4)FI]Đb ;o!Lc1sk0/WV{IFކj!s|s°XHe9~-g!=qA06LZH KS|-Ձ!~v,v4G&9[tK =m]̀X[KZ'ہҒmǢ/i[E/K@'}Ű( OvG\Li5iK7kU|Rɿ *GiqL[r4G1#^`q}2PiN!Juֽ)yZ}Nt.<{ +LXV@s!]׳7;6]tI84+Y^ap?6VH`w<z,ش`L>X:eObsOgBC +xhkmzeh'=s^WY J}I5;3F a&t +l>.+?8(UFPخAN\iȭ-+\!DDKxRR"k= w`vb‘[QO]ꎈ0/R`1[uq1&AC_,\t#CjI kuR\aIdz1y_[ \ +#2=ZC2̸#@S^{ 'ؑ.Ef2[OTe: RchL"=u\=+g=ABZ`2,1s e]7H}<ٚw;E]ΑAI+/hq +WPI{4juA4YQ숗h8ER +aIMgo~! ![HsgHzG[WNG< 7j¥>u)Ґ,IfRCf7f?|} ҴԼ,ئQe;i#w#Go+Ɠ K~5$e/X+ +dJngu-)gs`yljX<㓪>!>Q{r%%M :Vh}C[^^pVAZWjhsj=َzd8ǽI`/ŅY2|Vb~EAﶓpnuM .eg~=ό_(-c:%d+]lkg>}qNҦ!7ut0cDGH.%9#^!GPⰊ M0!;U}왽:=bUӗ`Rr+gR)]4XL'ɤ`8h}|gzb?wU?Հ"3zROG@\^g]=X$ ϧg@EMu.h:ͷch9S@ 7Ep獜/*&1#Et'<畀VCLOw.qqL(6GҐUp`hk+0:HC+Ar ,gTǂ,&1(x9>m~2m^ ]?ک猙Jlߩ9wIv*43֋ҺL_wjD33ui~գk-ÓꪎT}1%VaRKލ/1Cnf, [uO7 +yJOJuWE.|ݛrmVI^-wE0j@"3k79xt?TTP=C,Oa1+x:l2ޗ:$,cv\AkN{] +]k +Hp]J/Ω9<ʕQ +pӑ@vP/ԅ!pSjg.Rt|,cƼ4kU~k;>dUȜ!~;<$Cx<;"{Rv>Kz(&iM<%f܄ +`;>~V4뙾O&} b;T6![_NZ_@~pBQNGBHg/^мOI͌CHBO-jP+]rԋQ{+Gޚ>w0#g5ȃ+xwP>Cw֎'9ATѠ @芌ّ9A\5 + il:+w +{]5c+.0G }9I0j`:&wz*S3'Pϣߣ*Dr5>^~l LbOū(PHG ;G#Xq.qVغe0ޱR$h=-Ocy@q*Kv ,aD,W%޺AkmZq XAtwD &HRV{GjI>O͢!<9{% +!,RD뒂*0HD_TVh4ۚM?0xO@jWbo? +!Zs&Ѥ" qiRdS]C'J3|a-"gq&ʔPzNHvn A _>3g2u 1Ʒ$SĚ!K)= B.vՓ.xt:9׶ '|5+mC؏t>SG֠TmS|SJ{r#$7Ar;^RN|ENG}騦b%0tULb~I_4bjyř" IՄߨe g?݁9.N ]y +QUڤeMVb 5o/ `lu/bօX۽BXd/C&^^0FiB84O܎!=> _` 9zگsI>~㏡\Umg'l;zE8g.uzޖ:{P=-.") ʽer{#(ԯo6ȮkЩ?"|dqad0$gtяLڴsKݍ[e+'l#&yx_tƽ;dRGKL~ <5&{m"h;Լ:ː(FoK)4Xf3y#فGuJj;2W4#7-9E Z7W"RV(kHY`n܃_q?Y}.-gi9+}u`@?O.6;G:/+&|[&e߳6_0kAaxi=TK\ֽk -iU-"ճSLm9_= p]kmEiWuZ۞xp^S:$TZB#VKqSC] 7vss@V8M@^{WK1kmCq Sb+KZ)KzqF CrF`pYk<6T(fR+XJ-G/\oǂz0H 0Z4Ł@ɷ\1B(Jtho;  .qDv/~Gm7SwE~.nQsE}IU}<_(_ `\RymٙV8Ű﷙tN"͋+jxZ̈́ϥdGckg:`LX6@W+W;XXnTo +8[OOw\7#M:GO\$O\# +Mf>~c{) \T=r'(9'¸b+I< w:(پk{+2kQ:y7[#m^!Xn;5 +OGhgۃƍAC>apnMɫٲ>&,wŦ4VVz]Ja9 +TpVq;ndU3Qz}i yp]:'^n=PKf`"~-bq| L6BƄSx-Ԡ* +?#Rwb`2V\g \/TuEaNprkm˹*p}D1 yTvH=+ޏDZŃ 73NI_vl[E X><?-2R̕!szqČv7gzc'+շscT! +r|({3W#*E:|c~u!0OnHK8AkDv5ׇͭJW#0j#*Y.>OK> +st[@*3i^5dnMX GK!::8nyGmdX3AwM 5@C +VT:;j@Q*LzBS;c(҂ +jQ0E:I@BY#j6d3dOt:!G+D 8:\6pa$j6߇+zjn.uF-uT26sC(?;\WJn(ZWN$ш56 GeH\[6V[Ƿd6bjFDcqrVP5S0]~G]sRگٜʅV GôoLi\=ƗG;Vʴɍ sM D/[/81hg1KGmϊ;wN˃ڟRou8ևbJ.JWR轠};l@- |f@82U*yT9%WHf`1~UG\19 9&:V5Bj-=!\xvr}T{XQ\fn􉃁H +H6Sy⫏c{eŘm?_.?kXiF$EUK ۋMEÿxB5r)>҂C4\)L:iBYKW(Kz/ 4ާOSט=H}# +ر-FM32ۊ!BCCHV|z03E&-$5ʹ˕f'$CKEFނ(#p(E>7ɔ23G鷅tUX'Z$Sry](p.#]+kͼ,A\ԗQ~b|jJ8p['zZ4@&㥔z#HH hƒ@fnv9'?YNUk2g?٤ +.ń ds+NgX%&[Q44oBN^RnZ9|Dة7eNA +%|S̎ z_JϙeLe_?U@ (4C$U|g+@YHW9/υ8N:KG2SXt;ͣ=Z=ȻIzRc, }3J{b}}?v‡>E.EY=RryO.)Ҟ^I{~7IW||625Z =n?zHIȤ;Sҏ8[y>bUDN!AEƌ:N@QI{'E{*ȘެVDeiS=-]63Ù]917)s_/@5ifpB*f_Hr%4˴zJ纋Ԍ8}X6乖G֌ꋧOx7ݒrvc!m9Zَ,d ܌V}V'Om򊇼d$ocrܬ)t%AŘa~/waAZ~gB!6.Sџ#g_Ύݽ,qČ-5pxƋ& HgږW˝{GֳU- +@M:Y-"[[;tTYF+'qI3$,¸7E=zP/|üպ5B0JylHYQ҆.罹 Җ;Ӧ(9GVr"zr`h|7UUފi\ef-|S{!*0[y3|:.'-{nE!=^>eBD"L;ˡi+[ +ޝ+}ytԑ'V? ל?C(85@($8$ݰ!&ϯWv7Gy-=+q3QQR2g*}^{clWr +\S+N"{41B0PXxOkڛ\ +C pwe#DiS# C:őx^ pٖ ^CWr;\5yWwz(i;d#/~O!<ByĂ-4?[1/V~[>}lCAd./=o<Իnuj5T~W"ɷbF; i&TI[*K7UoBN=kEyx])dN@6"E+uy +U #ωM'Hw>fLKʂZxgH 7,c؝875S42HaNulN!oOyF4^mt%M{YFXɋsz/(tQKzM_g/KxaT +h wdSF"cYr@(SWGB$sD'V@YWoQM(?B ^AGTi>/]5{>^u)}GitO3[!:MtҢ1΀GQ?u"C֪T6CT"UdHFU3&}OC!{bSZ0A׼}~AGĻB˻:@gnK]Iylq~@DbG]ם5rmLri_&MRe7U]?xq[psK뉊hDdӾ|fr-Ds("Ǒ`=5Er>\o>1>*!fܥ8#`$)ͥ @SU*OyL"pb~. eϸC +5&ZeZpS5roa{VRuۯsҟR-oDP1ehg{x^)DKv5k2/?N ?a}Wɳ J#ѻ}ƥ/ϨeG!"te]A wg!Ao6VˁK+ . E8#b!@2uƗc\+!s|w^c6;#~#Wʓюvl/BRZyuBgxU9I_/4)ZDc;Oͦ)x**Zc(la%ҙ)r>PY&Lv͟V-ۦ+}34 VnMYl)>3z $.H*s.:T $\B.iN('\۾,`[/ф]D5PΛS=Q\_Q (NdT8r(C#DbZ| Al!xDOӨOu¼>aXAV7.sq|.p]!X<7/EWEύRaYK]"ksʝX3}Ѡ9hGE݆|?p ;o +W}гA@b{5#7;{U pajO6V}omw+),*d gN<gX% JT jAr&yXY>ӈxapLe YS#g=**+T`hWdew? 1Іfe(U1@[; ^[PqԼH{U2ˠV։kcE^%$ؑ<3 1Տ<7w UW|s2֖Sxwy?HlC"{O ,b>hԎ| Yp^*˜jlbX#g*=8D#C?bb)lmnHL);5cw8<IAldl-ei`:\e`RX&bq拻Hڛ:SQS`T8,^s~̺/B9 :+rg> -BU/;Rmf|'A )/+| 9.g΀9Mo84{G?( +-m jl W$3Hۜ[=,HB.B:=g*+h7torNY7 ͧUVM-| 3[Rݲ#[s1m )" E\zWڽZw$cg0EhQ#20֨.I'IЬ)f82zyax4_.EN'ڨ,<I3k m7C:#s6Os:qԋ'tɜwJv⻑$-ITl<|:9˕HaJ[+A%M몓:tƒ=ly~R/G?[)KB4TD'VGʖ$ I\þ${.C#(J,DG9s($qk+"R6V: +,ReMH6/ ~շI{U qrҹ9*E/C)ΊniCX/A`8_|sx$[GڮL^Y +Lh5lW[ZEi~VuEnԠ3 +\"oIU#xl |n1Ν%2ܛbW^qg b=+>Cd DŬ3M!+A|D(] S%o&'ofnxZB}='NLgud +7T3 +mG˷a6NMQଓ<Gj)To+V**R \ԝWY ]xI/ibWG+:R׵NJ +Y]u^48L70jgxWc$ڡ%2{8.j2; A-E1Af•8z_|S-'IqT bRG; 줝ZE[ p0<'塡h;(`#Һ^Ρ~Wk1&V 8*J?BTԤ:Z\Q +%G*> mN~{sSdbׁ{-RcWypAw~Mp.obt3f(G,Ɣ#r%.:WHs&LHC1uq)*z.e5-Ǘ4+>+n]Z/`hBz@ݡײ9"Fo&`ŭ%0$W5cy + ˀu)97]m<(*<ҲېGNkIݶ0:xy+nG<`=ܪpጵ}[#`ޭuE*(.i=9G9'ɢ_+mUܦ73wta&-94@if& +?ЀZu8)PxM攜!3=$f`+r{ؽ㢍@>U;Mwd*ḒhF|uoT{-w[# 2yE0՞{=k +&*^ʴ#(sHzuʹR.oR&pc#*{% +S +uXAw:w[3࿷ _d5WH;:;p;wq8ۡr)NHٽHT|fH]N$Ď^0m1M] apYzu$jI\6ZG)qyWtQP3HqXޟ "4#S%+=Resv{QJ1t*ǚ~#Ł#\([;eA-u/R%xġbnEn_^Kꉆؒ.3Uv eKNZ2:})T謩P6fCYSJxS:Tr`QS2YUH`U3ž0?c{ҁw֙T)ղ_~6#T\ <Ũw~ < r-iRKA*sCb3bo)!ReQwJ\KW`+U Y$FDY%5#`O!HDZy?2]esąנ9QT܏PI)mϽt#=7Y7S0 mXQ`]ؓrVC+ ylͫsDNO/u36sl={G {VQ,*(՗i7\ ?KK\,lA$&}1VGMx_W܁긪_'0:vMh\ {Os+ӧI:CcP4z>k[!Dkb_{;_X-,s#4rʣ;1_D$zBcep7D^:kgNS9nתi#Rv8@DscL9;d#W ;`my|;<<1>kj>2Xto\N"]Zɀ!z-@ D{"1X?+@">̣*LV&DΞ)ض0Bb(#"WDzSs!+1a]XpA!jsƬ1UHO̬+HS(XގQ2JzNZWwQ17G⒫ǼKY w%ֈUͪ@݄QE;y\Sq <Br6 Lkp7vDBK*ѿ<TSt0[ Գݣ9 +8zfJiu*[X78hȊ +&~%X.uEB +Z JvJr CZ,ٻ_/ÆL5lj&]k#;:]Z+zAƤū=kq! Bb%l=jZ`|M [g_ 7$,{(/039~(@:2|_DwV+!Qqv@w*W;e 07&- s^*n[?!xTU풄3~vHIu.)o]nHKQgHfblQ l+N6݂hmTpL0 Xj+u;ge1}t$·籖d,mBG$Yu:LS!5=(ER̍{M[,0}JSIqix@=D +~~&%:W_CDs$=nJ+L#ES*3\![2{di8j9O~o# "XgQQGTgORBsƳ)kґ*_e2$fR0^M 3ՓSz|iOy,$WT7I/~..{3\0`[aH'A˾+zE ˼L0e)pSŶ pZ8ڈ9GGwӋׯڽm4I{͸+xa9ǎw,1STyt"'FVY.ݙ&7u!Zy#6I(i|ƚpR:tvԥ[bȹq{yjgn[T7+~hEщL[>ۉTx%7ttMWOռ㱞)<[DEC[H:t*P@qF3|dhj ,Q~ p@[zMmmfSU_H1(IRlWPA~*ka&P^m-=jEy/|c. BơtMy(a(_o%07F_sx0ZQ6]FU"{%ΘNVY&Cg:$aROfPSlg[Ez&V0~|YCVUti?^} 93ZĪ@ndQ,{\#{Ie=ˡF9bd|dilHeJ%RPcPZ$oEQ- &47 k+ NC>Cg.pxv⫼R-re)QM3յLL!^'p-8Ir6$DyKv~Cfq8@(?(F'? Fyja4Fڽ-)= u jttԙ N,Z{{+=ݙ[ӕlPkz# ^jՠ ["޲k '\ؽ-6*KJ`;CRוvP3eX< AG?#C,frob`#_( >2{|񽗸臮 +8 tpXąu/_>ֳg{<X!i/^$/=7è솤2dn"ljTqZ2T&=LVn?2KWS{tQj-ua%yCx@4; bkn!W#YCܵVđW3ajvvէ+J!hw("$/_//>}9;N;ҝg9 ) &j&ɜ$e}JsZ[C>壝dm*^Nڸ(z|+'sᢷSyv$aAeD4xW9ZWbww85z?e$c>'[Bp% [_~B%&Wqk>pSR;CZJiڣ5<}B`F;lLR Is ̆Rw<8\nzn߭d#n33Pq{w) 7 xK>{$Ds A3Q6|Ģ]=(ϯt@Gg' +)yg+֞F7m<NR^C0+|?z\dMYoFBb~h%6_Z=z(T\ ڣmcDcg>z >30da1+j=>"@&ųGǢ> /?td Q#gs%lȞ1r d'ONב'Bh4k="Sn3Heݮ4Mi8jUPjpP*2%/.\JSF@]E'-bi`p7͋8DE 7A?ǓMMT||Ԑ.U`0~Bé8d +ZGW͘](iyn ei/mw_UEF Û Qvc*os v +$IF ': +.Þx,] AO0pgYg9`_9qJ е5̎-\9z'IỔ+n5UQ0rffO):32h M!b"7nPq-)G]S#;|5x7*{lM7׺J(n!ybF/Q"/&E ,<^73C28^_ϭAG\5udJ@{ߒd2lvڢQ!'ǀG'oll`KN]^ǛV4yWoCh"f'+P$y:.l[Kd>9^5 ,‚ 0a!sv"*2H=2sbDuAY {9X3ËN.^9?0 2:{7N~#5v9#'Qp7G E﷟\?^Oh:{!xnh^E[GKKe=RɌHG5 }%&ʦeB] 40;q$$kqJjeOѲ>]&;x+:fOYonɺ +d#Ge G: +4;0 *#[&ޓƱ&xone?"F97.z;dE37C=KAMyμN&ɧʹ; =rT4s;OD|ܿ⹮y_yثN~_{>vQ:ȯ5KfǑ<=>>[5M?%Wŏ1t fv]18;54:͏ Qԯ'+[3BQNȜ+!;19J]n9fp/Ai'K(Y7Rz[A,FiFTE'<Sk L y! 9Ϋ^߂w=BǞNoȷ9V=.鸏pWH|bp6Gl}=;{7fLJ) 3co{E!m)y_ܓ!P̐&mrGld*G{Ӣ)`htH^rRObh$؝Ui|1e``Sp4TM!ΌC*w~CP49aD_-)wY{"f5 +lFݱ8%h2AQD̵A[Z7s*l@OZ [?8-+9n1p*_ixzfڑ-9P_"Vʳ41 +~W:Edh:fTSUۮ5\<#Xd=ލO3 ,zP +%A|(:fM%9ߦw!Z6M1@>+kTObnFP8*gm-TF#!pG3BAfT1O:ގmCkX 9ߜqvB{OTjS،xTo-T闇8o¬P2"/fĻz!)l g/{lh* N'.rk~ 85B]Eߥ\HPP|_,DZ;` +)淥eIf+g l5 k*B\TNң -Wi_>G MԐ,Ix\Be-Տ vË`ۮ iP1z>yw<x*+{EQqo͙{*_S8:=XS1! q^P""pּ,΀X׻Cwk@Gn1i Pҳ!?K`8帥uJ+wT?1TʹmfBG+; 1+HQ>*0U.ŃbhV5W !<y_k̽ s~3"nx}3R[TmNHGLݖ$xb8ғT~{DG[~Vgv &7;ؚEJ3;rF{#tkGùׅ[3k@ c̅;&iEbԐy5Զj ÿyWoI"Wgy1A;aOA~=F?CQJ%Enם@D5$ɜΫKC{ɀե O`OsHf>|k=TA}I?a fsvZ=cR^}s2`FeC-ꉼlӍ.X_3Oc-ԥbxTNQ|۫NRp6JG݊RUZ\9U4 +a6s%y8L$*- +Ύ΃ZKXw5aK2119!gCgzc|9,>; +Үxh+@W ]dEnXA`nV#ӉJ<rfA};3xؼ$B6,@dVZi2^U{4tA6g ;i_WCċ;uySU6+ -GI#Cno-doŭG2RVKx&@wcn$PE,`?'Bsg&) jc~F+ x'vsf5wG +-:I^Z{?̟c򡆸3+w5-}%5K9 +j#6`=jrĢpײԂ$<Lݣ*"_g[:" "{=!&G +jQJq)7Nd&Sz/[J<H((1֩yeOUl[k12W Ng@0GZYiH%_ODX*Q!FܸY(MlmK\˚|fNRi tlב h:zombeI%i3x>;LުFV#ް+%!cz`$><1Lje-e;̳f,!+a_ v] +"Zjh)\$|]FĐ56vhE^Q!F)/;;z H>AA5*A]=L QINi`0_(eNgn#A$i ՃS! ?/;ng< +TZ)>Ǧ~1AN2hziRY&ѷ>׾ ǺwK eu7{Ү qƛ9փ#ȓ2Ex?AyyUfʭ_hxcQ!P g#fhr2پ1*9ІAɐ^crfLU.B!BV>э~/H$[GĈZձA[۳fP-ksFic/$g/{/|d+n`£][f WWD8^*9ɶQgEL$,) u fHOH$BIR}&Lw?uDY +W+!&mzڧp@tAͷ"e*$} S3v+LʖG\hB8Ohs5d>j|Р_PU |#d&E׾Ewb:c.p~-f9MO+<ܭ17)7.{f&6NvOƇ4(J#䅨(GDJRҰ dGvN9>_Tz傖gDtcO;R8l0r= R6$fP*:ѕuWz{NLYj6ޟ[eH@k)n[:mW&"# r0?FV'N3@1r 5xe pE6aͨ <>VmnjmjBiĀ pxg!;ƌX3W@b~JHkbs(8bSL= +;Y.yB/UrGYM 1耑 ):MQڏ@-zOx9̗ m3 +vdȁ`ta:3TM:p;ۈf1³@0#M OS<#BkQ=Ţ:-&eJV\Qd^=9 J`U{xDj{{٠:VxQ uF@F +GEXz5p{[ kuDR-@(+cTI(oֻ`JQ\NBsNU^VfV$t~܋ W|4zNnu {v{a +>74joKdvd6ёM0&GȒ>LO&\l}<VΨĔ)ӹ&=uF]~]6@c#oA)YӉ~$KN?֣aѼesݦCDJy9`k!"JQDГCNA` 1ִuM;@ywo-噖R}>ο_~z]XQat{"W!tQCq85A,Řs'7Id7;p?]d<,̉}qD!ָ_棝1*ߡ*x}gAVZdƐ̖r&P4|B/a=zdhW^AH?`& 2YDvO/+ag!#HGmXt?I@!&֋c,X؆Qx:Hb^- +[Q}(U;FHG"&g: ݭQ {qKSWR#<2P\%SLZĚ4'/Ϗc\s l+j'pIXX izꁯ~ :N(O=J%N҃} f]ĹLy]Uh{ E`6WFD׊%qV>De0WF{%v6ÓK|'Ǟ(^Gd,1*w}/bW8[ſ#|0TqʇEGMK^=_td f4nGg:5I xnqs$ˁ+y%7E!NYXJ^#LOױ+͟3FVE[aGK!o2=8#0hSЊq2 h_<[4l`\e^IF1cCt f,a14X4xCdl Aر$"4+mאomDRU*:DX\g6ɿ_ Vz]ԥ8F9)ъf4f⸣Ǝ~n&N+ /q#TW\ Ij +dt2lH\2 ܨG QVBpSLK-чiGPU5/bOZD0}<k5B`Ңi+ |?ԩrQC'64/۝  %I'f&1#S;%*rsݨnh2Xݾv]#g3ukƇ0?fyU ?gn4{ riJ+;,@kz{Xߙ6GFOO^ +Q +b+*o:i @;U傸yeHΌ&c[)(٢(ѱzL9-iw;War땰&f>P;{(|%JOx\?SWeq8SC"LٵSiv|E$s3[{ֽ۫RXdUo J>㕧>Hy*XA`jZ∧vlH`Ԇ7gBn\.__Ͼk$#꨽#Zk\9"dRߠ9_?t/yMԃ|o)v2$Fbh:4q4{C֥wʐx +}0|o ߊNAs^UOD.]oG\srhXss4's)d]Rjء4;&Uf[ZL'0}GG-]"{LNbZ >?ǺX35Jg=l cg39 ؞EO<тmrpv=xD01M ).>Dr͕0(KL+'F^Y<_Y9(C*.8Ӟ]fs1Mƣ;5#?*'wgu6먞͉C:0x92}NCR\lƕ \xb +ww,7tiњK+J"q"ݳcޤB) f|FJpsŭg^@#Xz7\`DL&aK]cRFnyh ӎ%rCEg~`.K7PKw[X 1D@滿@>QK+azL\2U+ hY~)A 5+Wd!vx@Rл̳Hږ*QyU 0-@w%$ϟ=XwBuKrĜpo |@@tB_r闤M\J!.j0*傚b3ފ*OIݶ%&dMogX+EPԦZ0gl:J槄2QO &KqK][l 3HdO#@AyNj jXIH .Xw;ܙ 8{ +GݲA:EH%FnEZo1:2"p~cɢ \?fI^dmiݴ+2T>s|0+F +{?5ELTUb&7 QIl|)º +QˀZO :"xǸ%®i` JBSۄ%~E.?*S};4g +^*w# +DNq|\ s[CEb+u% ګ_$ѡ9CЫ-Q ra{ZLr09HH.Zwq>=YOI'np.]=MIYn{T=`ڵ48 w~?S쎟.\2bEP Ag@kaPop{"fvf{!3+Fz "I'YTO5I2ZK'a{q_|!A69I_!'E{K ,[WzUy*9<o}w]o`ɕVQ..=EV"c{dO@UH9#}>d/ a +Fhk?k+Iv[]=}^-֒:`3Ń#t*;=!Pk=WehJx^=÷X0>@vAmwlB$ȌCH<߁'\?vԌuyYBGC~jD̈ҽkPX>6D6m캚O J'丯`0K~$CG:j<[P~u3 לm{7"̀Iy#T?.b Z_~\lfoPp6ʕZzgOXT-mCq +mC\Q7((^ nd<7k1CwΜ;[$`p,q3X*\dn{??@=OMV^M*s}?֐P&H>L簱gUykzK|!ӽy D_kñ+\HCrmXR{˷d)I,.ƱY{ڽ(+[;Kj([ fcowK =K~7!$lik<Յx`kEK!%jE&Ʈce2xeSVH)eY#bm 8䩾驌UoіAEIJ9bW6UqU=g4+ vXB?%֓$0;;=`";']D_h`bb9&;wL+QyG| OզjMk X=I;3,\\Smi>= f|PNamĄ fA}E3ٟLMvܖC& +Qk.z߳<`j<-0pk,%(ߢ$], ڹzi!RݳxmEU[$(uA^2F `϶ՐۣÚ+Eh66z*fj:Pi[QxU -IE`X{5\,sLΔ@/#I[)]SY$IpMWCHMaOen<;PJ<ܰ9c6Ȃ6.LX <=.i#lf\+}dzh oPXITXԐb#& +N ٍ>>y[-9/uw\*iZ=X{rٵRj֐ DRC黈DPʘ{&Sր!=r(+%>K"Ԣ87B)-1@"N{`=sIOie=^SY֞63CRy#s DTO#qw;I{F~g1Mc ( Cnyϼcfm/p2G+ĂTgkD=tJh<.znb'>&M7"gV*Ck5X +kWR +>$fYx/2/!Ş@%9dpN Rx ,[f8K_|;4i7 -688PǁA6 XIh3U aFYt]FD_FHI8r3hb@my'+Au&5So+o +bksiq-g=? ^E-a8U9t W.2\9lކT{ekd[]TW)")mb=FjjjrGH $ %ӄzhQت(l賌ۘYѿH?z(8$Zt~`dTִ{x4|\nj0盏&y8ZߵBfSEܘ?4Nײ,w%@%gOP;^-[y<؈B]&b2cyI vN6[22&2\ Jб7Dyj-P:9e_I]t\^{ɶ/f u!\kgs1RetB^!W{^am)?,τ1v !ɛ=5籼*cڤճXMQy Z"-BL3 EY<}K: ྖj̳ǠjJM n@=TcB?pΪu/FloM5&vcAֲuRBk9#T܎D!FK=1}x^|1oQd4-XiQ_P^CEnPhk(F[5g~g""i FDꢾ͈t= ~q`]&#Pԙ_@ lIi*ZIgJ{ Ri$hOiRg;%:!Ӟ :mN#N t~g?Swt;BgE@ݞpR?;XWpGqVSTcPK*w5h6f9 +WB,:Hv@cmK5O?]\ulcd*vQ'6u:gJ'K̖ !a|Y _Y4z +d:Pk@1Ӛg +{1ݩڧhSB_wBcPK3( Gʵ +ZszWrrOدH !ey%?Wt+i&߶/Ƙ +D@G-CP^UK\!i,ڍJ?"Vtn.BFC^z%6$(u7=L{b+KȻfFO8J+-v5 -:B{-{+AnD0BN#W]߿nt?FYf)N e&6@kZsplLݷ+i#wPC F 6_ۨc6]Efi!Jݕ"B{dCp"AFA%' A>syޡ +뎘<_V)rsyvǂݟ !klH 8YLR'UHx'VYlՐ+L6} XĹ@`A +jXp+ +#Uy1)ceN?C]̏|Cd2LOQ 4m({CF"窾ܢooO}M +pZ0J[+bѱ9K2f"w+}z! u;"`o' 0;H|排FItNF^rd?E(Qfeî5ڏ;"`!5}򁰀BXYVA +c}E$A(!42VxprS8-']N"ν!4QI.Ek!G zl$|FS \8]z_ѣ:_CBv<]}T'v{<,%Mx+G  rj2=#t!yq`09⼖NbG:cѓlol%X, Oy,YY6|it#&j fѣd I,']p ȸ'tE ^r %?42FqfzħJ]sxP97 _QDY|L߯7zynKaK~֣󐽸:]㕺`3+\W`]5_}w¶2H8!ksiIt1dai 5N|I-CvC|+:?v)X\wgҎB#E] r#Q%hGαzTu^ATsRur/@[Ί}}DXbnDs\=JN a5={`uW:܃憵ʩrp=w, +#OȢwZ1: *PBT2tvw/c׮e!?Yl>%6C|?I7Z-Ҷ pHAxÊ^~8z)_Hu7L0Ȏ|#\k3HTv%+skOuͩ[TumІ]F+djgQwwi셜Y%Qpؐs6 6d9$yEj "s00D :CO% _.`]iqqĔᤣ$:Ѭ=ʖ'(1-:g^0\šQ\ 9eвiCwQ˿OҜkJ7gɼ+}֥ㄡzqF+!b@ceua?;f0QtCc&TP:z ='Ɯ_Ad9vs9w]{^!zȡx;o {Z6dNϞ(ʹCpfxE`+ YH=ͽ=Cp)e2+ܿ[lZz-HkdN9-3PǜWr)d(My=9mҖ]v^읺6y +Bx2ڗ!ToGXeⰇRۊyuvQ{VT੎V4=+ћG?4/)]%IF+ +.k?r' uCs)t_' g;{5]GvW虝R4 +_&;A20|BZF6~fFNm垉02bO>CrxׄzJSҸ惡 E6z-ZgM(稇" QޯP=lBy_MN Ŗz'2 nk5֮h9ӞÂ"بi}b0Pz*vgh +8hg& ryau+*λ:*vEfRw9c9ulQJxR)FxD:H̥=,#fخ-Ay/SIujqJ0^TT?n-|[UuSh#()#,x@5/gPgch&[خ]{C4Xၓxƿ}d:1äUoJey%|U=v(E|-^VU7FStd%R{&7*k\+Go}~;KaZ\i CՓ8F%YS#6(@`S4eo'B3 .X@2;wX} e!@M}!=Dg -}匓m7;lH=J- K>4 +S9<!bG<,Y| 8Uc(h+GO!i~$ݎ]}9ѹ̺)&kv n2i52~Hڕb*`^A$ [$绦6YE#NLo2^ ؅ B)U!륱EC";Uk쯙#K붻)7 +gvLk)te9n= !c칗vݽ'/.ŀ^6QC=]M5D(E5|߯@\{<NWdFyN<`"8q;Vﱯ@UD{FBhfY8('ywsˇFRL:|̾US/ޚV|).y\@f!tF y%ReL{Pmp ˜#<Վx|mNys^'fwOz -/{QuL;Ñ6#>M;B9LdIx}eoT}{֑Y;߿@duW7g)gZj +N:Hp G٨r7E ~ Vi]stTf7h؝>ݕgw=TLkes)yp:"Q-mHhRDy5NJbwb‰xTh%lcFԋ[Tė"c/N`iiZ[(m[E -fXz><+^Ks<,F i̐})8" g{|##'r3+jgT~PWuFzAul'O(Ź;4X?QYqD+upN9.x Qaϱ[Fp+}tc+tmp3iՖcJYx';w%6¨Ƕx/k#^@s ZFaa`hDcrg3kJX{ik@֪) {WX]1|;{rZmeېِFTR9x_rUǾ[3^x>r$^?Ri5r9` c=8L)F~wgxc rw#TÍe~{~EVO'6dGcͯ ZvD 9qj:JW(#}D'z1Le.L|؜1-4m^Tpy9` 9[s:#{'Z';ԈPcQdrxݎ I+ K5e({hʚv`JQg ͪ"9 +ժ\puMc#=C{5rd7#Ԋ9_o̽&@ҮҖ ~SMx5$l'%pe +1'501i[ S&Ы"yg۝sI7āJJn ]K p2 \ 6 ]N|W *\Pxx}V4۫S裧BaΡA5rd(ZG,z4&YF+LG'pݯ!fQj-xW}cgNjW>c=X\*,8h$߃H˨JCNYb>5`Im/cf_B#{YJ +3nWA4/>su+)w!NEFOljE>S!悴nUꪫ*|/C5|@e# oy8#5sۈ6|;#`Q"PsAjhёm&ϝ"nj'R%vG^4($G|f#b^gm$QmpKfGUv2Ny;^)L8Q>x+}Aw<viL=),ǻM->`2hnA]`KMt՝ ڳQh[Kv>ӨulU&/g:JGֶkү vvK|^>׺8ú %+XiDP::Zz+(YB}tl(a\f{YOT,` Y*yh+z b7jU 5s!D' j9tWqsfeQ]F1AZ=/'zZM&괅b ~.fjʃ^X1D5kRT\:/wж}q]nI!s)Z[4hR3k?M~@" R:`<@1b#O Y@+"[nF%N>@5({w׈G踏u5 ? SI5cUX; t̀e=܍@8ps'#j6Kx},0_#f)8f/1MX&١g">B dk=jHrr%a-.-\͋GBٷo WtmjIq9/J>徃ۢ* ZQ֟z%qЊ+T8pbBbkWGJ۾1f$cQڗCΜ,/ԠB =^z_H^[ ;unowFj{|?Fe8t{] 'ifB˕v~]{]'8U]T#*f[Z,~X3BAc'j,Py{UHx{cچ%V>Գ`݉U\iX\"ƒ~NY<Ȇ[8QyywGq ~RZzd߼q8Nv>8Mп4 + wSIo{k}eoxې*QMYْM]sDKY8C?=SnN./S/婃//pKcey)3f\w??)ۣ:JOW^ZCSa7o ,Pya Z?ElijEApd+ 341TXyKzs s;" 9a µ'-Q8R o㍏|ޮv(hu]_Р}u?[ߘH~q7a-( YJv@Qn\"i$?xSv;4&ē#4?1XC#Q@ApOMs%Qڳc[C(S̏bGK愃 nHua~\kѡk~1Yϵ=!Ğ "[D8FڐmwH&"nW{:GZ& I_eˆ;F>|"ܝC?ex._^ ?Ar{ +fOU1hh2| +ӶWdž&tgu];:ȒFA{cդkifO>xVJIcabY@:72 +f;37K,S o&j+?pwk?Va3u@3WۛpfNRar]v d{DQkAJ5S:W h{qjųLzAҢ@fD2:iComMmH[HP>V* |*~V밂dw7F(hI-gC,{]<[P!{+rH9(^<ȗJmK+ H,?P~q08D% +hk>T*k(gmMxA ?(/ Vv53g/ϳiM;a%vb`"jHCC~Frya#pY.2lZi|.nJ4E {ieAsG쑸bM3Ajy#/ 1֫mJ_Af R]F Tubgrb9sXU*X^rߎc#?>ogwPsw52)S̓Zڋ}E%쩚`L4[b-A :c{G6NjgMe驮,G&Υ 8'+($g :CޠCu'P2OJЮ/H|AZ俈4&5 +LzŇ&qGb"TQGlhmIGG]NyY#7\sQ~"n>n ѓjHQƐ͊HP/B4Qqh"t +Z|,/{6?܁*X0m k/)d[<%' +^B=JAXsUB.SKg+Kg䨏b,ICw{|$xVB硔U~`[3t3I7íW1[6`L_񄾮ո +kν b&3f9nI̧MHTzDa7Pǫ):Q[;.{igpoM1sciϩx&2Ì4@-0-G3p@lYybS3hs}O>!|M4dj%6͆_̼<#t8g}u_((4Z'P:d{QHYKpKeYt =RܣKc_AO^6/[gS=MPI}|;+&ak_g2ͯR eU+ޭN^M +72fgިᘓXWjuaՙIe-omcyxH#$ơ6c>|BՔT5^]E1 +$Jj5H#U4J2$|/6,$*h(gH;|jq6Kusy",xQ8Ql2$9 ,H͟9HTʞ:˕Do|HG;q/SCx֡c.&H;K)}+ӯ9R+P"~z]*<-@32JzJ+CZ'M`j_ܜw_^-`W1wNa>3_xJ{DGP%>3vڪVHjjv5>W,.]#O#ٶ2e-Zj^'q1IMx{ EE) ѥ<"Aa/z?A#b;d:W'lcJG{ru[[o[R{"=.^o/5N>5MXF|ejZ(=E& @Ĝpxzj!Kx]]uݵ"SNNI/mPLEwX1/һ +d2Н&SH-CzB)x} 3wf3S;-1Sװ ɾ*yTn]~Èy]ɓ-_ٽYtWLGg[QMEDžù%bY+2fKdwV_%/u'JR>{>,Eox5x2wIZF _-=FJHHH_S8Yv!KU1vJC#@1ǐ]3st`YϼuBV[3CW^[-J+TB.&qGk5  3[4b2[B(~G.:Sίww# )B7 N-F}Kv{}ufWUQق- ɮm$/=VM"OWUZDS +#m\uފmj_8 _3[!g̣wxh5:^{e @-FӄSjDf#ȫzndHl B>ԔLmR 0 +>jCnnk*]0"g`͌X8Rg ؑ!BEFI;53V[Du}DxD)2Vq TWKWP.@x..OmNbkX@gP sm[C|`Buo ϰʫw  +cmjKv斕Gsl6νfCqMӵvr :{Wd m 5n+j6;'+#ܢRR0[Zr˭`z4;ޭKw)zW>w7iOEaQ*{H;viPM +Gc/|VtN:޶EGMx#CQ6 ʳ{# +BK r.uFPYaT'H;վP/ +!ĝ>Fa?FB,duy~rnR7\::E +q_[~k'Ϧ0?xvUU~("U7w ]ҭ}lg]#6a{=E [ tvn)މJ`r"{m57lu%Tk }1ybrעq'b qD{^Ȟ.`|%Cp;0坮!dW5B'@!}4?2^IL t&V&Le~z` ; p(Ril~MO/D2t{g͎@x#\{!ۊ +Mk6A`{Qӹd8VFS xx<b9o@Iߺ.^EQۓ!ĎwO9b mPG3Fy+8~ю`|OW%|OUH<‹D]Xk[/7?Y&5}! +)UíHI*rhF9?/~^}1f+4qA, J̯cEmSt* rG|]ТU:Swx7<p`xxX%)8-Q _dEGH33)0)!#uN' &-k'B"gʖn@iBSN3Q"jmLE a{/.PyP? {D<] r}^ceaGI sEBdJ>'b5 +SΞ2@2]vXgsӪGjwlN$C90Y6ޒMk;%a&U : :7(3vz$\?{d[T䎧r~Yl" 7jzs̏AY@wQjUQA66$Γ sTBOϪ٣D En۱11~XO$'5B45Jo)^tKlFī zQ>\#HC\ɢXn{_#Lf|̐ ?{PtV#=wG~6j+3'`‘]E*|$JUCKl<3%҅UU*3/c_V~+DEyqDq~T(geVȕfVy]!a5klz-$~U5W#HunĿ| +h"oqT?4c +efp1G2Ծ)1;Z]#2|ʔ0sK]FvĂN& Qg3VOt{ֽapuwYa fA j#}&wɦy ]Q +>щ#{7Wv]@gqW1 &gpULK9m)KsnA~ˆ~O2#wkJF]@/x˓O[`CpġPHiѾxjgy.{[#V}!M|"&8'8W]Y&tKɁ- ӥax1l i[Ӷ |a vyAX-##G`=E'4|"N9f~膏Ngj+]A.˦;D[T/BQ56"3RoW]Y)&4֢i9c6t?WtV;2$3F%o +/k{emXw9I48iaηlܾi ))LC:q-ÁV~W4;OZ,S2d4D9嫕+ڝVJiT(Uh 9ӷXcN@ٰSW[t4 Fwq}ж& $xj5^}GCeM q<+RDeV A<!Y6 +lT.PI~lo=*g5𺃐Ho߯lTҕX|Bh0c:/M4U>AcɠVX豅=] +V@s?5x˅YjRA(dKUgWKl] +% ma/b.w {tB?*U.\J{~3с M|@}LpFրOU@&jRzlgBmEPT47gK,egR0:,.oD E YZάKA,V߱QAҺT1$j2[3}v98iy'UL^ 9N pTF >zS4uxl\D;QKfUJfcw7jO~GҊY (L ܷPըw$t(V4ۿMƁ +zR2_sO˄@)'Y+-E oܯ0FYr0S1V~:Rio~'S&rl6{﹘xWs_*{S.$o=og_[bW1wuS *);]2uUJ㸧@E&f:LҐԲ%e +ᬄ`tlO] 抔HVWf!{`0K#J&{d# :C6 &P=Qx6h]/e75Sf<bQpQ?ZM q:_=$;:Z: NJ,!W"VC]I#)SC 5~egЊޞ)!MQKxx!r/#gŽkx2ӈ#Xjv˟14RwNںc`+b-^slsjo!K磦H&iTUQĮ^6]Xc2U%V*8iWM%b_o)"p7ь(5nC:I8czRUNI ]q3-ڙZ o3Q:H T%_s!X)' sP޳F2 +72(#Z*!Bw 4x#Rԣ5{^}-d8G`ћ R|YpO2J_z-sLMu0AJOQU\Np Ea*&ES_4J8Mb(Јpg]j99bG6cQƙKvȌVBq{yw.&hwAYl/#oȩ"I^ωwE0JEDz#mRaŞ?'D8 9wU[I׊iumֺ{Z5y[8 s>j:IBKh7<⻐SR(!L18%G1#yEeߙF~>7u{?[(Нs4E*@ +/ƟERj?m,tX-t( +}dWz]4Xs>41j`Զ`#Q* lܞq$ +">LN6)0/87 +8pɔkN$pRs}(Vc#\_swujž(9|/{Cͧ:'KY<'\ۀuKT8uߡ"5D= Nk|MTy;4Ah'en~4le5u\Bm~(#* K 6 ٓy%$whUp{o;Ch۠x NV0_,|@SƂCO"I6$78\gfƎ@<\gL+gRq42U#R18QS%E9ZF/ -i;~#=Av +T2̂Ñ!Lf:74%e^G AZ]TrcNlDZ@@s /9^W>n7U_eGV*渇]ET{ ]S8Yſ8d1$ZP~lj1kՀ5NWd=>irwR3}H2G^]%3D5 ;-^ 2j]PNw3A:'tj@M3!H%7ޓ<3byxCA?0a/M!axԆ"*z-MG{A[Bb𽛰 +l2+>guh=;\OvL$ęX%a N$eʴI{Idm-7^g^DwɗA1c.[Fk^3pN;l`+d:(Wi{307RYI=x\Wk?zP. +sr);$r78 +3c^ad2yj~B朊(c&;dorZ3|z&iNYY6Z=ˡ$nj%/ ֗e 9L +(k5B"V rZ2HbC< urlT6Fkn_9CTde#n|YW̽m^>!JspIXH\~֥h !Te8.P;2@9s,O׶Z/Qg ̵3gTC{gTSV|(N7^b|INЪ8w u +8֬D,V:.ZMdSk]6Ø:ܩ R!snLΕ+hK tv +|rz؜NHYaA"]!DxR_)+Nd/+$@g@w7M"&yVS+%w @f&GD\d&J ͐0F:oP'Gvv֮s;2{jpXwh@޴74\ F +W!2l8@+!A1cf7r$}EG-õK®F 1*0qNvsT(:>Zܠìx8 1zb,|bD1K*6oU'A+16 +|N#:Ch;Ȳږc9j#|vE,O/oEXcLw~jALSC&;$맼bgo؀^_ 4Y}kWh]u+ǵ1 GE#Йxr<>.-0}G 6^mAlݭ;"**czRrRxJT|4TirX; Gk]/d~#Rc2`=Ax;#}=:%r\.dڴyVz+9=Bd63nǎ;,sbW-T_XawXoc[+=Fng*ḱwb~LlPUc7,3S]ClCngȝ.$R޽Xߓn>iO `KLW$i)gVvQ[!eQSk>K 2;μ5$bO @YP.C`׎R.#fѱN>ȤW$N7<ڽq]<1kC&CBt:Y77D>k21_!|NL`k NCm^v >`=!u4ۭt?$GM;ɀGGI6D2/gHȴ$ҴuŹ+B +7Do=-7gވb#%=-|C =7?h1Cbq)jwb|kF+%kެ"ɺ3$fװ_K6v٣D'O0_b@I[,r2Z:|HC9eH9M4Al&B[o}V|\"+.scZ@Z +F !Aא^évU~Mbl|=  ~JlCxԕ0DٟB ?yta4(pfєT|걕iEd8GJ %W +ۥdFmQ + ` ^AUx{]P{K`%Ac#:G0$Y hf_kɪ;@6,#iGd@~Yg9("NW][ +CR{P zP$`|}tC|7@6>{LØTFaΈBQWrN0׻{jȚqŮB:uH>ބb̴X P =Ũ˔e>f.늏Z% &vPΠ=Tok 3Fo)c>q3?}Nm]oUܣ bZ#TE)ikiG?]>Qv}GF=_Sv).uz@5 moHr6`?~ݻlm>5 +Le!i9TznUY[wkZ~5*atF&mgnzBIPSk[8T\#i}+߿B|l??˟9hƟ1 RAҁ]Cԭ9#GTw%ov7}@~^3:2sB\O5t]g4ίHNvF+ƩvuL޺E;t켏uzPA焴#G]&݊l5F$o4wb^E7F_*Qd?\Ѓܾ8"T__έ1$8x07U'_Q=GW>}N~bYS>b~z&.6 =s;^UEI _i4 +-P;2o9tȬ,ۏLE +bi+v/ +0nkWDX)oe/o^I-I@ ;J#qf[0)m,űwߙ\1y}g=!o+ 4{@-HuXbb()*5`5a"\ʝL\\C޾>[Y4nب]YSj'1$G#>z&dG,=LKL8 SRWEvFϨnN߯pD ^XK$QOIΒ XW v=,xA'`t/M&R{E=#OX#w KWbDkV֠"[z>,kPuB[z : A޿7.j Vy?YGL{%p]GTDT\vV!@{c#pm`kNkHes!CۻGh7`{ +w0374V\I[g6ѵc{h7}]K?H$ZPg/0oC1J7̔q߃h樛|/Ϸ1p=˔ %rVńuʯD(U=εIWBWOޚ BȼxG [RM0 +q!zgeUdyT!%{)S~fBKh<ēL ̊XxzhfZ|4i\ 9[$FO :D;h|D M{"x>a$\@GD{`'u;D pG GlR RƋ!svZ2=ٔ:`/T>f7U]Rzf Ά504y7ZwwClOI$Dh]=J 8A&Q혟Y}f6`&c,+ +E"Ҋy|`\HJNzqOHIBP + ;khwL"^1c0D(A tӮ +rphnnI@ endstream endobj 37 0 obj <>stream +%AI12_CompressedDataxr%Ǖ&w~ݺ#4mcBjITUҠKL ;XO?w{,q0eOnd?}o_w?ͻ7'/_ _L(t,㛷wY%o}~}#wo7.DW7k̙ug&oC}۷g^}}q73ůuhMl)ƺa 2>x?ь]?x7Ϗo^޿oov97u|ﻋ7x~(c/x~sn^b<__|P矄g׷/W7vqn?1ۗ/_'kgҩ?Eo1';5wˁCIǯoe`.׹7_ݼ+ňۡ]__F2C=%,eIqG6Z͟gQͻ/txw7G>u$p_H27o>Òl|#o\0RI.0Pw;4W~kaᄐ'oR*{3bl?qehmJcc~,:h{Sܬo0i?S;w/er|lK%eDgXŐlvżt ?=&?ۼ'h`؋ǟ(bC?".V_++.$q\&j/ּw_wx߿;E]/1}o6=;/_ޜnw<;Ђ٧Xw-r#<}㿟ey(ovgG}x8zjE۩̝Tߝk{-{({?צעhw~*믏o^s[s೿oƫyQz#8{~[oޝ8؝i߽8~uv~8˛tӣ8^_޽ =ޝz_?r7/:ۻ#uu9~;;7W7/W wm3)'Wt$p޾f߾y~<;8ϋ-s8{&_?1RiC딿n@AM}FgͽTvnKξEp޿_n(oD=,~?וqwСD\L>BjO~%%O3lNīoqlJ!tKξy͛^޼}׳7x 9/]=`bn|gԩ˗64Ey/}}|rWUkgzm576dj۝aV"߼+w.hgR +ԃw>?:3 w7/_~Jo_vߑ4a<]gp3c:y=bή/Zǝ= .|ŷrٙy\3,-|_w"J|=~O~AvL O^of._?X={M]i~~vI%h[)iߎ.o@@2x7/_NuoOYI|R}z}i ԟk|ߚ2O7ǹ +u\Ft}whOs~?/v7+ETRpw_"G ,w8Ѷz_@>޾}5Og<<~-8Wvu +dpzoǗKR=a,^ݼ:{ s,x|/Mog +y5?/y}^_L5'o~Qen;~pvsvxHxv]c."EW|.$]W9뮿lYErW) E;%-ҰH#yX)鯫zC'+?nHlZqBSlϥV_&gq=w 5bn5LT3,F7v2 +hLrlz9`/1 8&b80F6 +sqCe|1qX:=9qxSz-qzS*Z2L< R,WJrz;oY(9;r~}~Y0\/H.c9K )r'P/gE6!^=,QL|tE9srܕ'e4A &3abΗ.l%ϦUZldO(@)xJ\zp\[,YB+L~aQN.nSgJw5g.Y +(mfj +孑4Md BÄ oP(ΒKe;K#GxcHڍ{3^LoIKQ&R\\䋴_ʏ2+uͿ,DԦ[[ v+b"PT'.$JLv#n%m%tra1_vY+"i<&[ iOZlR7ZKI(>1m Fla> +˹hU.W9)Ueϲ\ zYQW?nҘӼIgЬ5¹=3yM2,Ti؎eC^u bG^L YoImϡڡÔ(mَ;Yi՝n{k/z!˧AVG +/2fN$ b#Dn1K{v~'CaWe H@D +A*9@" t)( DIRЅAABF6ǵHW ,DiȪ4$U.DR(B""2]E(X9D# +GA#/‘ JBK!#QJJ*BDdD5sqJs!4Ql*E''56A6e$uȹwK¿Ew1g*~5QKrb(uu mV9hR% +P'4v6sŹHdQO"kХcdYZԴTS-jq ERViv U*/UjadLu&WIWMjTX<+gVo&&MD'ӤV$H:*Vxbޭ4n$>9u'>>D?(nb0(͔S~9ehUІy۔(a '_]01)]l(t "M~-Pw>΂\4yƬJ&,݃4eE?%![ysӁhP/;WMYɺ:1L<9x.F _\QAVj!B[Hl!JV3E&R:B:g9ʙFδqI.hoq-ۚaT[Xmp>-=Z4|)*S=D5%OX?^2/K3< +2N&̇dkə. +# Vd7A/&/=rQxs"dO0d?"W_Ej+Vp \m~j+u:=qQqozfuQ'uɎ8i>d_ˠ^{MEOt-Z'>zCߓrfJarpDUᇂJAP)P)%K,^kXu.qW ֔ԻrXOjTw +7 A(f!QTS:":sTlU]Ux2_)NdAd"^$+j{S˲pWg]YbX]ihk Bh56d)؎ܨ76 XF!<ẓns\,,VYNZc\`W3$D=Pa@:a`T&$#p?*r 5* +2qVN h>ZcnRd- +JI6~0G#yp}zHo> d~78ޫGIEf&Ľ苦^T%^O^\-A܀gA(ڼޮ&zHĸ_j-~ܯ|'Wo_DKZ )K`Z%2q +s ra[K-pG圣EҴ,~vvyp'P$)U)FŐWx}+N”ӐӘS>'oM1nJaJO8)]̩felmp$c%?JPq#wI'iuۮYWݒ,n?DZJKKka㇢4h9[+eHtY㶚- _5")A+.ňۋ:@b^ރZ]NW ]q{#9l?̟-GMםXmՇ]svo\gK6h70/D!&ҫcvn@0w>,~~~N6}_ڣii\?ҁir]RypJC [ u>Zx-Y蔻K|4 +OqG:햴x$ .Aճk.E)ND. 73)!s<:z!LtU,(,Y^֓` z[ӕ$enC^kz-RB(MR5ngẈv +BB>Lg +ʇqJÔk>Ô,]Hf)/d9-eYn!^EΫ3tBNie4AkwNru!w8^"Y* _M*ϥ\):&6YŊ]oj)OܬCd_HPPUpm&,B֏1t9*EX PT粒QiU T4י/1+Y{z.kXĮDѥjưX!jNb09LA-WY.}yֹeK̒DRD)*CO1^\)jyf@O.ɯui OEm]!!G8VV +E"Xp9Ɂ!{/o<&}F#}htwwbu~3N5OA4 E5L` +.[B+ױ*& +ak천OK;-ē.]Lnj85<7\ q\s.:AQ~! ocJ=Ř^$t51%$ }1'=aQ|Ov{PХ)@dD'}43%',Zu6<Ӂv:t:prݹtrekմZ|۔ƾR3֞b*syCbZ8НO*,o[8飫f)k-z3 [̙8U.`*N^dP8XQEލ\ KcTE˃j= z5TFa>*ғmwA96yL(pуNȋކa$WG>$0hL^0+h+ڏ`P?9!bX\'\&n}!Zq}6M~+%fm^|S7^@^R]׻OW!.^ĩб0DF {̅11ߤ|٩b:st .j:0W9\mvP7#qOL52ɊD/Niд\NE.MWr}΃+_oﶧ_Wk@Yo rTs,% 0Sq %\좱?Luo|XNz&~W[ ~ hrhWN)c1XaT{=1N\9S0e<VM6șHk|ʫ$JUEUYdN\ʁu&a"uM|~7.Z~LÇ{k-q5GJL^B=YH/Zh0C*G۽\l6١zD5٥vyĢ +X\[.UCxDvmc\ zn=ߓLsXEeߝʋىDUB%h*o@kǮq ː⎾pL+/W{nnQNbHVqX,uyHqڷM]C'GiV;!.xoى 4gx1'^at;w/xѣˉ(Xtwly-]o5_ZA-[1 ks}(zv!RhPbsU*]M!̈VIbƖaΦzxq}JR,g'ў%-ί]8 1xRM;R[d<})=`dvn\eOA+}t-zf%|ްiQM` Gu{<&K;4I4zP?3_P(sɶuF.B28ͷ:Y&stI?GJ@7)6TOEw,-z섿XAݣ`f7S}?P4qWv!%kC>bhڗdmX^:?,D/_#A?T:=veQ.f5dﭰWr(LթS%7/^n;?1W[1Wr:fOy? .L1L` u<x?*wM|p|#Gls5ȇ< +| |kQ-`8;̂3/R-O,fQ{LThpԜ4[ $Lr0 #~bEs].:,fq[_2w\jaZ-- *W`g:ݦ,TS DG׈ fr֕)|CJNh%# &Q?-fЉEzfZ,q +u%!T}ȪlUdb{o@VG+1*|PNd`[2,uFf1̲Xf4_He!d,m VJdR(Ƅ]J~ ;t1$$y0l$х4{!64IP6aO+. ia?%:0Tzt88GT;{jj(nqɂԸO{s~үz?pig>~{ Ö0|7Vw~=bzy56KB[2bVT݊YVP̜ӭ;;Gge^yW򌋋CחR۝r:XpdAێ}N0sso,p\[ks.+zs,T)rR,YXw*6GcE#fG%㗈_">ǭ]h7.<`5t>i?bq.2:~oě/+׌ësG}AojnZ-SkM64[}͵8HX]e^{2;lv0ir௶giғno7!Yr` .!iÌ\->rjL-cwxy؂?uFN8| +FjqnNWeQN>/gpRA Oi) ĵr75S5j\e>Qt {;|Wy Y}hx5p|HQ “[ ^׫;pX*9"1l,n~wU`^ TQ.Yp +,KUag<Œ5}/KᗥRe)% ? 7wnor2k8ݻ;/}|e71:O+?`X8,ϝ5qϘ)~_X˷?ÿcLv_ }sS>]a +cR_Կl;wvww7oV'g/1x|vxqͳ`?~oxȯTw%O>h!ȒgUY;`B78&сP}h ]Ma/7$9c=E +akFH]iwgMcI]HV*x{ @~م7sV6=(UB/} mp{սM;?!*74BwAolm Oh&iBmKX{hM{C<!ph\DczFB`$vj0GVL4{ւe:l` CWoA]C$`uC98#8= +ẎA @vǢyÅ/=dX8el  UОM{ogyLZ1W#- ΒaQ. c0D&%+D9 +DiqXpݰҦd2`UaA`dX# (Yc+ ragR =˘A$ aJH zEaˑDD*4WuQy,ƀa3(&w![[hz- mXZv\=81=;EBz 2uԛbN!beHo( ,]67P\4=qVI(tk*Ǿ*tj{-qFl ffU9XR h^IVwԅuM`@u0֎6$$b-_ :4r/ |_˫L&qc`eh{ .xm&!yhBsh 'T#6ʋ F,V2qJ,,~o Tԛ] +ڈ&coHuu&H2s=SИ3L*dH|8<s>r0lHoYȳ)!_WM`k=t~`HЖ\Rgzpli[Si' t7X, 63C"ސȇ!' #{1"b׍q*ʩvx7dM dijLdsjR?ѶSS'iE;+x$'aٱ_0` +$GEKwP"ʓ~$1α=)=wIkqG,.%7#+ y#3}< NDEN N-~fuNGy;C\!Ǔ?G4*0ع%iVwb+4 # zW[yE5f9d8t{[ Fh8Cy4N40,z-Qgieu&m ++c۲Uݙߪ?}e{V_<DD< {x9ys#0|t A kn~ )xL(NՙiO V5gn039uv6jBb*qF Vk #0*f IȦ5lNtSrӖyR% 81]C'hw`y{*} ;gOQ,IS^Ny dzbb#kK9-1iyae#WHUI1u!b ;IS*nO@xKYYW\q$A&K]\ȿ֛G􊡩K3 +|65KT-Wgn>tg~Sö%Ԕ'$q+;d:cٌ¯2I8z,M86xb}'SVv+CpBH]xY]&d?ѹW#TN9`d)3AMx_}puB^C?1*!j!RЉ}]OV=68nq-uO/*k0]* Rz.Ou R=6M=,myt>>ġaxpvMoBo#ޡu+d5qNx_HA;ИmGCb)t[CPmpR(NkH~-Q4 QMr!D|HLYƿ+%tzkxKӦ{"1Qj޷~0Za*lgN9)Spp)j6fL%yɵ. .baB=۾V2Iɔq!G9pEs&1$+$ʆcIhjT4B!:⽶tܴX`[NKN*=ONZD2a!N#=XŹ`oB+gs-ܺ[6%6B7=7Ҕ0ÑT8˼j ` (~lԔ%ݨݦ)I7S(<̛4yb;:`GLY26ON߫ TrE bǦko]R-yԵ6.[({lvp&{;F'y +OqRɦy-E=rO5QnS1!RXgHSGW-`h YO! deыbՕb$MH~uKm U1ógz)T$|א|G^4< DTՐk}k}$s/xV :>:;fQJUo S=`eL[(+K2.s # _<=z*&A,@sWMhKT]/ե0rǺ-!iTx Hr=GqΊ 9t9 D^freW/C6|ڱh= sȌrRk[gvz +\ }WR>}j1 ${Sb[BPB xJOFSKN]amf-1wԘn#j0QC}JK.|oDdlϷ>mUW6}Ezqo['{: +豚n74Yxj$jT*9|#$\>OSCdT9[DŢ܁ m$TqP2,6ʯSUQ|Qu++% nhӛDZ J[M3MS1Ȉd( BtT9n鳝Ɇ=b0ARG8;u733 ruL#WGqxTD~u;PkBӅSDW WSYxwsF#0b%d,BȮT/[q1HOCeDF{ +5l,D $NDOSAQ`; ޻B%5&Sa[Keп6SK\>I\#yiFLaҲBJAL"o? GI`=+!Gz֘^mʦ:ZubH4jer4t9(@YНrX%XJ(闚Rt4{ڤڶX%Z TէDF44۴y+`KGQ ?>V]j37*;*Q@TrS$¾D`z[XJ+D]·b'DFc%a8x6zAģrzAKhՠ( pbVVH?%6drUY)mjҨB Yk:V4 ++%TuRT9=rF=+yBu}YM41HRɩ'P2j9'5 +S4Iޤ@ٳ1#_n!+P Oˠ1MP,Q}ϵFC:(+ %1J9]W@1݂UhS,wcz1WRGԾD/H\2c^38FW5TLdA'k.1Z=S2 )b:Z+ǂSe帒Q%ՌДĘF,Ad2( !nΕ U~ m 8g={^yQ^@7Д;Ru)zj OGlOVpQ]BU!:H6 xtF>FgDrԣTf&S|€# QfF8 + gA:IB&u +N\`py +AהPQZk 8jTiir%FS4Y] +ReBőh]j:Mba%qD[9QziD-22bڶ 1mK> s 50@ 2הPI| 2VSÁ4j\(Q̘TXW4M)\Ί345^tcv* +\Ω{A3T`% v, +\:VY.7Tr KGF 0DSMmEc[Eu˻ 5iR#4f ]6X)p‰ꮆm3Q v V(\ +2kҖ:/M 4}jI[Zfd<:C*~~Mx@D4w DD`5 (^oD40y HD׀D4y  ^@5 Sok!qhPphhm ok!$A[D4~ HDAk!&H-H ۯF(  D( Cl +&Cl +8`Q7ʡ6 ~¡l  6p(؂ zC2ؠ7h 5`P6:p(U'4~ B +XmS*- BݥMfd6iFnʣd%W~*L(X@%tCY8Un|)Qjж 0^7L +7R2f1tI(<ؔR TqO$%O @԰P7%,WX=jNFUjR1gҔ4ץ@o?jڒ10KXVflz.1_3jvM~Սӣ*b /h VZV*$%:S)kwC( m!B;Ӷ5|=8!#¸zch'B.?4[ڶOD1zM;Uw)Wn7-6_s{yZ#C>/\+X1W"2.9"C{ zQW1vH7ZS=`y{ _2WLU7JOU*AHM|k D 'xAJRgc:\(|&6m杦C97ǐloZsT^j3Ko$ck998/ +Dvݔ˘ -@nb!AynVVqB8M%dݡzwN CoELl/Un֥x`;(VяQU8;S!Q2$ܔ(G2X7p[hoAmҔTTR:O7ҠyU[,%7+CۧD⪱iiƷicss՚!=T֛R4J U uOW-uxں)C/t<'q>;{Ll߫ Reh1a~5D]{Ӂ~[O3M[FD#[2X)Y_2m1 XAAU$b}N=@_.Fƍ U=DdNۇz\G&4%{U^I⎃^7Դ%B0!eW @3e/5g<@5`Pb2iJnd"!%FS(&_2A/Fm*nQTVh?83|/ 'V;*y h3\Uq^xiJT])Vu)AцA}.mA Sؒ7Txm=6m=yX&>~0"÷ˈX 5`<@DҌB%Kbw-Yrdb@!Iq8ySHCFY5"S:&F/޺D :kÂ@m"m#V@ar-PXdXs $K#`T` >t Cס ]*rd&ѵq6@clq(KvrQ:B5gV0[XIeś6L+Wsf5ښ[5~k;'Qϟ>fnCp1nQ5!m kl$8nk -ngpj,*}Z+ LɥJ}.F"| ,ӷ0W6UYJd3~j--RݨqxsۨTw+3H>_aP-)\š +: $~W{4I '57P pF+߂qA7;1XPCpȅOD +J] T^miά610LqN]Hi?3gl@͙0 +Rij ܣ*s3'G 0ʊ)4gF4DtR {2Ҟh @dl&|7ʍGrr:єY ɡPۂ9 Vȣw 4gVB3hjhj)3B]ש)ǫxo͙n tPy<Ǎ轝w (9BSͭT5BScWNM5*i<#۴I^- 9s3}&LmZ L(ea:5<[^~'Q6B[0FE#bo)#( + ,0ɶ8+xGE)c b`ʬ +Sե@*D B;xճώo=o^;FisGmS|ߟ}~{ރE;ٸ/oq _2|/wߜ\ǯ=L\{Ğ\޿|X_޿=]s=C矸g]]~ݯo_wh._u8SwA =xj *4V$צҲ_ _wi#~7<;>^h#-33>ؚJ56k{vqw_2|yqN!1xY +ѽ/-*YG ă TR`'P1l^H=y:S`ːHFfҋDn-gGfբ +"ϧ+D: t q? +j.G%zX+!jiL<uFzH#$/@j|eJUzP^m4,2i*?22DI+ҙƸ~&g{96zpYEFA +]pv0PA}Ɇzo<@-TXuAx8q$ŨⰌcsUI@SfPK!Q MQž%Qc}'ΠX|ݦru5y}O2€zF)|8iި\pՆ$g4H꣕R?2#N7#A d(5cXZ &MbXTpaɧ@щA1'PuX&g}`RRIM%h8W1H0T4鈨 +*PDc)!FpĊҲ/C=nnQ#jvrЄD r %#XRLהJ)ZSX4qζD'_5JC8k쓈L#UQKX7KX!DAe ZV +?D'H*1 cc?Eenz +/)& cE2/%,U&+* D\b><d3>UCY;PF/tA/q†*A oH83eY̦LARd Ч8@HxŗzHId%)!D754Qq2̸| *JGˠ=rиh"H?hVC-CTeG^/ I08 0bϐG O,drKJ"@l~UG+^?-Y:D0z0;zfj<Бs@jT"eWj K+P v++}?MWm੨btnd2={aX;xnty0A]sCU& K;]qqY^PbPC(IT4O䦁/'7g㘤@1PJÉ 33II1_A.+[&joˢeT=یu bl|u f| (jvq%q=a'HA2xsyA4RF%ںVvfcLd 4+H~y%p[Ҵ&+apܟF ~N ^& )1aHr)OHc\|6sZyf#[(A ):%tի\1҈CxK+]Yr(ъ,$~8げEY#HGNE/k݆wr53 2S֟oSx$.$:HKڒd01Ӊ`Phh=5dI%y=XAKUlHbl#3[$3 60 w%`qc[/|սVY +L< _ ,2 P"n,SаyxWO,1#Ugzh3irN8|2u$Z흘Kh%OϳrƑnŞ +V%B +Az?;ʑh22h3ĈZ!9BkCh" $Υ#*u6$ @(93QGwQLŔ: +!L#9O'cҷFĮ6_C[nCeWQ CuG0| "bU aP*·۝sMdHqy9s72iӧ-lhe̴2U$.`G1DoVs &p-H+?3dۑB G#ɐ=z_Q`| |BSb2C zA 3C\J% f$aɎ!#>=VPS+q) ADmliz#`7RR+ˬ?1h[Da=L-GG> I@zAg +KU4<.X ?BdY"lFSRTEOX'y23IhPHc\BHd(zS0U'<ziGa\ƌA! yόZfVbʌ8Qo j$a.Ԭk`qx;`TGP-=qU nQ=+KIJDܱ*wJ Qb"(^w8RLbJ$[mhڝC*ĉaeL.>dnMoi^ϒ+23̞{NeC yO%\À<$1ü0S'3642N3JA=PJKX8^F=N(Ab38y:"a"w"qLSɇN)|&4wTc\Emlaʹ2SVg *p-#dE N=9!<mB"Q]6Pl2P x`zTXt}V':%ǺBL+YImgE#NNɠ_\ 3i3`UP2N<]r47X T=c)Xd +Tq`8 \(e=5dBސdQjq+_Nuy +.;Or/;#)ZF{Quqadŏ&}cyrM*1ۇ6+H6gtQ'B/SP`Z\"rTL Qy# 5Hp#~GRHT]HZ2mR!&-BKRA"gbxFmJɌ$PW*FK)%30 +aH٥228H%xuME|2Y +<QU|9+bG={E$I(Lzq +q +`q嗲B"/bsRY ivGi)PfUT@PnoJQ2֨BMȀϰ{.Vzi tg1#ɛSŮfY{i|^z@:]+LpG+wO}Эug¥FMF />i)̠B ER(#+7-?NޒAx2$ƻ4#$lOɋD&W'5!kNy2KePP'*`UVBs ǽMt[ ?4 #.ϋ~G f) + Ye0{BI;tPH؂ˆ)WUM9nlL[ q1c :OhAEA%A@xA32 -s%c:E!B4}d?Q,a9 1A^uzh#O!J-Ai3XEYJdޅVKX#YR%b,7=Jϰ+QY$+ZFJ2OgD$aq|nR ֒|% 4J _\Nb%O'5v*x7(䫓0հZ4)r3N9P^z+r4F P:OZ$Icי쮀pLo23aK #%P +YYUvZ 8oETVU~wHjsMJׅq|4u*7]Vbk3[8enSf0sm@wV[ß\瘀&RΝE~bHB1|$TǬ9г\uPDTA AaQ՛ x2 c~+ze&[$8n6N@n[ &qVu[Zriq_olop# +p fV+a0X e jV};)px;t$3]~̮;c]TQKx{\-h 1b3jz{5]qչWD"eUpS{8;&zT!ט(8Jc6uK7alC#S W6)=c)zh?E3 [J1;†+2 ץP>e:܆9$6(TkE|ƛb)[dOq;yR}[1-M3kZ g94u[מHmUOQs~KjU}/46c4SW-'1(ϣ eڐ݈Ź9:沃$։^ KEbߐi+vh8谬ğ%64mlX!m$@8M.VC\WU_Sh%oE 8֘s]K#dN.&VR۩(D-XseM-vƅId嶤F㜳 )Gf@C s, B=`jٞ$ ' tr6@#0}A|hxI-ri"H2G`jkΕ|+,ZC*ZNE5-u"r<שGp]kyjTs'FD93lS/s_,0`nfcӉ~ߨAP(v% "[L6"*j.m榌2ts|kv TԊ&^\͕9g#sEjwAꪽ>L +Nʠ-_w91pT}( JCƽzxCl%ϐw],TWY&!AP_l?j>A⺳7vFti#8$3 0nG} =}W\Pd4T]xhdX> +4zt0jм4h@c[(F4NeN i~9~q οb +u~eeH*͜Ymyh&4?G *`Z)²e۳tXFF3n1jd8J< + +DXB&z1;KzF!r̯rZmC<=?ฎmHHݘFdIԔ_RMx]Flj/snpw=x1[Qm5nxxdfqОVH\U|)'-˼)!=#bbv2MrA~`͒ 9?ppW6+F!S.dc0\+*ApA` Xl_gSԏH fM v#-nԹi$cRnw]$ 2b%Od/jK8̈́n(flLki$${5rABq]cQJdBIJ[dBu!ɛԄJ/5w?|"+|"V`pjIp^:񎀆i:R Mc3vDY:R5b{3F1JGup!!\t烶H@7ET8ȇs5 J"#r&m }ccTbDpSdhx@}Nv&seK +"i~Eȫ3{!N ڿs"l#xoc=0 frv'^˫-]1z'nR{wuesFP)_/:Zty4 s٣@!iLOiQ Dm:4 +W[r^QBpUM9闲eD?xcL[/Nb.uiBZzHBx2}7ѿ Dܛw:n'rdHg)ݶQl)Rk@xq|*9"o$\"!JF@-XʪS]48܉kk@{99l\O6J e^r\1)fv} J̙e&Bw֤A42'Cʙ뱉 ʞPr|Ly3Pa淼"݀k0g۵jsa1cG>: +142a48"VD{+ +qvD¥JD^%4i2_+?PZ3|HlHJqKT+K +ڣH5cb¿^>gY?QnOf-R:ؑ1V7N+;G&XcpfvW&׹QRR2 j=_,769 X<p\fcOhF]5LQ"DH+^v9Ϩ`CS6x聜-*9ookQPrl +0'bx RJPޞkw 7B򰉕pAw!X,jfcf%I4xi`6z_ aM֢SWsw$5e$^ӴЎaIp%l25Ǡ~"Uw1_ _yf ʲ !RGԳyYX_eh7x0ᥤ +f|t WiEέ1p b%aI qSyГ ".a}|°#41RL4F&|iT'՗DTR4LJ=nV꩓# f6k e3b5 +'npUT]# D~}~N仢o1jO!r.B+F̋3 wFq[XƮlSˀX59J\i $k %0%K.n]o繙\RO\lܪytљ ݥŸCϜK1ywP!5@=nP[.kyElA?bC!-jxW2VתYdhޥCP'pRZID̗>uKl$5;>rFmd|&` +c]1c~\܇5:qMw \@CT$u&x} ;D?IbB1Gt:*G%T46#QPIBա"/fԽGFr*˿nosW}܏xj6EV,Y*hsѼػk#k&Z^cĂ2uEnT2TKBGhk(׈-vWQ{^Ϟkd]KEPt(I/a@\toL_d1|@LU~!޻W髌)6jYY[3N_,iWi'zSo$)oǾn(EE6iB~nAقo<خU&'x.,#XAD0|}X!;X۬NoyĒ-GEbTl-t;;6NāƈPKo#r<244+则rM0#&)Y&5zC%E؁ў1£7>a3T3-) G3΃TW~6FCI]:x7lU_3K|PlLԋcl/sH_<ͧ&ƿO$;~fjjvF*bQ- +,WfvRuR]I-xG;ֵx6,P^ 8WMb^DTukePg]z_1@`F!W(\wCqEҫ3KZ,IKʦ##rawmT B,xQ񅬬n+ikXK[T">Jp9{>p” +enܺX(6Iǂy+L^G9N2G|$G#Ոץ 6P& PM3k)̷2TOŢ^3UaU}5~ZbSK8'm6-%fuľ!h B&e^UE4VH4*Ԏwq%l5T0 +XֈZLpOZ|kn +% C@Ȏ>դHXv]>KNRX$em(݉O wF; hgBՑ%.*j!!Er--mIRbӪ_19C no+⊊Dj_롆@1"i`zN>(o$G==ZL4u1X/)QU 6hh9!^6A68f)+(qNmr +=fvՐk]#Ps}(ݰ!6Q6xj+:d†˂Ԧ =XA`Hƪ>b"FU3/a`ںZT_pϳsQtKUtㅅc'%׵[2ectĀL h35$i&{aW4#$)gNB>#,kUhj2 +XJJtS+fΈR8xc=̾%!ͯH8 +Q-]566 Y n=ӻ< -&f-Tf0׵~W+t/V0u4_lihr6)b *S&9’TgӪsSet"ˋ۹zx#ȖO2j&[CED'nTK$@'hGN5si SwȽ{o,XVq=PkKŮQh j "͹4pJ i[WRie}u)$c5tbѮE*D.jf2*ow/(|d~$R^ERk}IwP ?Lz7Ok<-FԮm*6Ny%\1?ed3lq^M ǀ 9Ü |OuB8iTW6ӬRs]e)bpF|e_~9"E q|pȣ|*5ˮpǗZ$Lb!gQ[φrVh`fh6+k>Y:b,Lvj;8|?ŝ"YfHy=Q!*ttrTT5hl ?;b}m}7<>JcGc;Bm 8 ᗡ)onlKNtҿlbdqDv%v=ɣ3~{َ}zQJքcSY=3ea$:h'=܏!P]ԑj?͚A]>O(鿅G8ǨEx}  P0u' 8trP, no<ϝ.dZ$F| 3E%tV}&LO}-u8sTPl (gpf1/o43,o_OsX2$N<#Vd;c Ѐ-_>sݙs u:s3)vY.; m]C1s.;#vKgNZqLȝ$s<w-Y:]wvKeJb`漸Ya$Hyk^[<zH3 \a5'Ң3}L6 =*~/W 80+36 +@Ȣvq>2>s(>yrC6V#_/K#v]f6QCaSr5 Ë/L‹]+}؈>_bŘznpA~h/Xa="]$X{MkJy 90&k+:ʞV' G(M[?whF!|uΙS#,Q?GPvlg+6b=Z.w \:4qcpzW8zGSFE; hB\[w٠bKr"xtvW_z@~;0̻ۜx~Ɠ'2ε)8no  g}Q3֮HpV j3ﺎS=L!5sS[a2vB1BV,1^cu:Np.d@e8z9B3q}- S:z8xgk4_jx Stox@6j߁\~'ubsIu|* u|jo +jlJ,v:{wU6u܀Ӡh8աl*W8c߃U"0Sa3I!Ե^g>?CP;dX6U)e3xӱ,z q`3%m04tѵ3IbwL+@S\z0 8ܾ( I{@C9%Z'l9<E.ު#tu}kɺ"p˧.]e-Z_[hz]& TCwkU68)#iʻ7pO.fZ]:C F0ocpE%L4vZsEjKpt{O>W$;f/ANܰ WTIhXh4 t t" 8vjB@ Λ* jfI:U5+`AWKxC]GbX\{WuWua)/e zwc-L΃Oti%/ۜTuX.% Zb"TG _X|i $(^2UUd*ijTd!BSN+{i|Zt_ fBlY1G2ᜅ)3VM+yizN"RכnJ hp]fOrXagD9W 7Ӎ>Zu N\z(d +cT1,tunX3@zMO㪿'&cozХ oJd7oqNst&~C >P +g|C'&#A^<4OxuLxrOMd$yD7y׃,o{8]?C+m;vh7ݗ3='}P.b>)'}m?o:&HG,vl 7♍^O8ueKl:TYn:#Nq'Ai +LweT@mߘPy3]m Jr ni#}ZtXQV1> aAOޝzLݤBT|cp#1$6"'WXU#~c!1klw0!UF ]un7|", ]٧2TCqZwe$dcFKcJQb# XBpD6/R{y +xa[q oDTzƍa>fX>U't8:#E~UoasOӃl 8O,5^o5# FM3W p6{ 9ݪ 'hPښYN6Aӓ+2oqTV28iO4(٠GSFjC%VfQѰClfp~2PtPnJ B}gl +=Km<7'9`ņ:Hl3oaNJEIqŲwJ3| ge}I4y.Kubo2zOIoߨiWhMw2 AUftLz72 1S_aIfbnc) cM ̘y"ʮB@FTrJXcJEaĵܔcO}эۧvX'xWV}"mQýH~mCr7{xfOgI%7b6J'Zo0jXݤ7So,aN"wJPl|_;*Uj l7cf09; +Y:uV_FQO/&ʭ4Y_b Oo@cҋ{,*ǗN%ȇ j/['flѼ`[)oD^~*M S+a[]SAFٺ of=I EYz GU܋{eSr1n8.9`78[?&".{Lby|סU}2q3mD,*m#nez`*k ?9k Oۘ}d ZK0͕O?RiI8X76Q4^7޵v66%uH.+AxToc@7BkT4:-|Iϧ=Y4Z2v@* bIГ7>(}g/=}Al`+/T~]"0~H%U^$y%Tp҃G.V")$e[ :L} hyA |Z'ɠW"?h=[BPŢBP$7ַ(Z$rG~Ov֛җAXEK*lZ/-A^}N[;?Y(u{O,ZE4'V'>>˸|Z/Pjg$-_/-UAoDP=n ?h+ӿȍo-=T "KKFc4Ř"цhm@P)J@Kt3Z~& +NUpAz:PV EazPmրeoՠ 4XYr9olH:o =3ˇ\KI%xZA5" TS| P-ß,ًxY, T?jŞ7&MÞQM62g +,>FY#U`dgg<{sdzo7"'Km+b ߵ?Ŧr#bB\%:ݚcF.;# qev&!N]SzO[4WYj s5GmI=Bj!PL s 읟4n;h$Q Hi^ _o4WD-MtTWΒշMTWNŅsTQ,bCK(=T2R%eڨ걩LMuAg(AXWeTS-XW\u;ް+q`Ne]qaGu]%"i[.FMS^5MX,Ыr9e6i^qb<"z1kׯJ&×O+QC07Ku7QzD9»R$C1is^R|>#iJ^w0lk^ɢ4Gyɵl:|,Vf#1~c@JC. m=…' Z标Bf_A Å~e! F75l.̇(7u~Z:ϛKavT-n{"`: 1n, !X_E$37 +xpzYQj}|F o,X%R,%ҩ_0بj^Mد'}P *jN? \:>H7,UGeT??Êtn#`)R~B:Vý`&'' lf8T?`dfv ) +=2'V~ 8yr\s:VJG\7 +,H93rj!+酒˳h~MfldU[%uJ-tLWAwg7kjp٩?_7/x+x/ķװ7̳hw2bx"h䫍DgFQZp{_i +|c*;Ǎ|X"8ok4R4_R6աmΰ:i#W%)ZcWAlev;#^6נ#okgF"ŅoOQAm]]WL4n]ډ^-9ڍR=rѫ(A!\~iAUOWGI@P-wEN?K:;✍G= Vsv0ԓy&7<|>᧼hbKȺQ.?p:b 6U7䙊$ѳn|)^ߠt]醖72*}JDZD8 LJ>摚C]ȦCcxj&ۡ# ď㼩hMK7l=T-.QQI7GO +vs,+7lߴP4IZ$7E y#A{K6 :oOHf|:p'.6.> ٗe; CNdLJ;%lHN>WH6S:wS_BEsIͳi5EeGx4/hBʰ.~iQ21 G@4Rz01/ǯIpDݨFajhIcl Pk0Lᘯ]/Lca ` +6!ߎETם5Mo#Œ&SॖCpuſs2i.wtba/]xذzrzIC8$ r-pr,pr4T+3*R KAkҵ.!ֺL{i*AT`0w%4@?CE PTM4S2] + +8r ^R.];p/;s*`{ _M$ AxF4¾(izq(L\Unfdpȱ!x5*}z_iq'oCW#1OmaX 2k>MJw!x%7*O&r])6S{Vg'Oܐ{fb&٨n/;>g7sy ĴDCOUYMbzg 3NReI<:ŕn&G$AK]%3z/kAR47Ҙn_u +ӨV%&ls_Tj9YK?JU˱͉sti֦D5ݠK#5K_tiX_֋oIpZBRa, b Iͮ(?FCFLjZOHc+R"y#xvC9̢7v:9F^-$`"AO OBg&;J+JOnjs${M6=R|jH^cXZ3ߪzhHŬhn P 3-5 +*^&sw%O;C/. +~(VR&z\zKumuhl~I'euKZ/%#oLA}9[ڟ:x]T1ߡF߸>ߞR/<}RJ>&5K|7J;|usē'%0:b +| \m%x5*Վj>(}cFϹ?+!;K \ :Y +qۛ + +h i Q<0KMT^}L@m!QRܽ4WY*+Y +8=5+X$@۽ј;&s8`a-E/ +kl}gA=e=P6:F턖,eX<7HP! ](@pF hP3#,@ u&:ڟV)HƊV봛B5ܧ*o@DS ً;RHyS]}7;H ҏ HDUc(0 mZ t"6f>2VJ,2_wofbn󐵒y>B=u!AiSKp=Z”iY3^-jjyg+EB&;"uX0b͉ЋUbWy̛zwv2q,VPh +TG,:iVzrO(CXPޠ*r{\*^"T}shMO ¶~߼S,xPPaSX}ڌ)bԴm;1$rojRk&9#p)* /FKpta|8g zpE[>'rӞ.yCDv"ƬN뵽@_7,lSЄ ^gd&ͬ/k*d?QLM`kv,m;xM:Il_P%RWYJcY>JԗI$]Qu=W-\7'i(|QKɀpÐf !s!G|u]Θ]^# xt.s92d{oD$7AV7HK;ׅ ]j7<TtG@ѩ%T&@5 U pQK͚In`\7mHH6dp~c a\q)z" +yvgЩqr]{W (? rDɳ!?10'̞'>ܟsk@4an:tj*7Lq!`<.CX>\j/Ad?{ĉӣ/%|DO,Ϡ4FI|_?wٍǢ|vaZuS— q5DߗR~O8M'&M$E_qh_"АToΈL`'=Ĺk0iC;u&W"oMe=P ds5s'Mg ?"D V\#9j'_ s+XsoU9,,J8@(i a"\7t{r2ƚX3 +(tZ6ʒt9\vvptBPR-Ya.c.}Ez6#z(kqΙvzA),YLW/\tҶL:p5+8@R j+zP9{|}NC6{ifzϭ$M1MصIUWZjDbك=Ӑ;GiNRtu̬Re MF$!a#cԎuV)2ɲ,x a{n]b{ QbnuyAk|@gGJ݈zڥEƢ%yC974芰sjsԷ.)EGP&fIa`){IB1hV{6V2S 4Ѻ *YV:{ ^E%8yl(6b7y,ܟ#]6cm/rҌk/zw#Тyz$O$Êlm"^ZZDP2kЃZzT4=TgϰF\߳a* Ϧ+H~9Qz"Ƃf\(Ba o+Wd\ !n@Čۃ9n#mP=Rk4;]DU`q p#јRpWL:ٸinX4kO\ %sz rfj.K8eqǵ3NO = +y3+Tb!,.y^Q,qͲ@Ǻհف {XyASO,O)x Ԣx2qm+Jͽ +LAFo'StPj}R K=Civ_W yeuerk6Rہt[Ӑ^GM@gK/{AE>/G$ O#8pE5C%Α@S<WRJCp:.qs)-Yjb9zZz9d51~ʂ+I\SQaV-i9zF i8PBRV wUk3=tXbK+m﯁Ko]f9粯-2ƙ[Ddp=SnMIiڐ+ +SQ 'cjza,rgSbff}΍No:*l5?D܃I/,ߗ_Ruea$O4eWyҺ:>̛I-rzDZz(P+=\P19O/lƣӎuOңʱ:ߙA\}l~&|_=wU ˝m |~S͑;O:{_zr|pT/Cf C튂VYsՋPaĹe?srp1nM,h",Ғ#:zO}swX.Q=;e/n_|F~N7 #>6k!F-Wz; Paz'T#l.gW3WuN^`0Wf{QOacTuz?8!6Jfce>"V5da8E*X>s`8j% dyǶ$@"AACȄ|.|t6…D,e([/u. Qm'/ S}6\RgCܗ1$h8|Ɵ *`j~*%܄ W w<+)DvHVRW}xuVs̏yzY@$ഇtكJ\{t7Tv ,}+guzs5kR9*H535Ż +q)JR2ݒPN皲 f>,:6t=Ui&ԨL_p +i " |16󋝢*8/-I9jDŌqu_MK$Is&"VfsI6F(1sFWf^5dZ0Б 0WqGf#Dvg"I)W v-`7̶a(Բ%]أVe1"鏁΢i ׾Kn>lD+CwIJ +!RRdoò?xu\.TTVgVp"=$${9(޸?0|I |@۔ya?]usX`[sp>nbPݟ-ܦx #^R8A]"!9A}#Wmx5 ^ygι0^r`̜6!ydפ2]݁ˌ\R# wcÍ<髅1p1j$AؤۆKf=Lޱ=xUPv'i"]W͵X5M4:)FЎͿܓUmr7<0ŴfAƬN~ґWalT]t"TȯҥYcr=8X+JjO\Q#M:$dcGΫ;e"]>^ӊb56q1Nn1xU-seG`6pYaacI~X=C hv>7}You&Kj=z^^|kC_)>`.Dv*oǂ _ss/5wK$i5N:sg>[:Rj) fXfB$U#;ʾO' yґqPxr /IuA@*a8Xay-m +f>(_s}p^o+f$ +SlفߏTsnbJT}ZC3 +ra B=H6uA!`XYcNf-1FMe@JVeL **iݷˣ!!Fɏ=؁r$ +G͑SZ âSjivƒ^'G(-H c| B#ztbd^B +PPI 5(NZʦ,Q霳pw-Ҍ5RZ W\(%f"pXYYMCVWt-!;eOn:K55oC%TXhW= 3K +2Se~Sjk*8|gq'uAD峆F则4FC1"I̞k8::M2G<„hӈruX{1gGUZq+DGg6:wwm>\ 0 cCHMeVى).:.-JGؖq~ͷAdR\q-?$K(c][zqwssu%kE(X s.d(3pcUT [59Hɯs!PxC3_Xz()ETP,$y]r]%R/ÿl.A#O':`' ľ~dlB;7\r};T^B@\NJ)`:%UT%ȤT!8n\=Nռj]<=#,t't+Y zFn֩= qܓ\b)oqlG#֟fT*RTrD[`p$cR1W֕ qyIςh-V#fvv ;ԵS_$ыfEKU/b~!==_!~@.enNzsDƱ0#ന)X15pJd|k!Ʈ?CY@yVUb)J2cβQj_E2o6s?luK,<̅NVee,=Ϋe0Oؼ7y^͵1nL|OY 7% OyWc2Gl$H\qV:hl$N4Gͬm#z䰈hA_J #o{\w$IJec?qӵ b|(Y%{TF]UYFH!qhyZ/8ʖ;FIL<,Io5XmKT^mTܸ$RT@ +1R|i}Ws:.Um9hG:*QXsJ(? c1tBk*4RݲvD)RZmlT5F{Hʮlm6/i؆phօ}oiCtE$6;C7:H{,fP?0Zwv2[arYҰYI(jA|J֜[DۣGur1'BR籷m֒f|sؘ̬3zta e9zMYXؙ洊L1S yp++JX<6U%X tEFWX(蘀"jm[ +UiҐA.To6Bz[ +E )ΎpNkVuyد4RWrĭ V<-Wb;;űu +F*eg tÞ\>_}S[JOJ|в@;[(=iug8E\z!ҲL:9piXHGm@DįJ!)w$jwPBN\LZm3yox&4=-V/FkkCnq[@\br1qفI= [EO`U1="^PbXԋwg(uTY'~uҦP -+~7o 5b#dv,VE89{]WBKpP!J<5ZsdgVsϾn^^af?C57yT I}@z]&F.2QԊlj5ŋڠ-J.6SnQc37%-6@)6@8=(Gg ZV=L{@Xҏutׇ1U}8zRKu +0'KnPbs*2u}T=E>#h w  P kD8e"C[^:F!IY!O7Kh6fתBV *l.cN!֟H3,~R+ƹJŃWa4jU!5GLfJ(0Jƹf3`.JI4.2Dԩʰw8V5/͎y|?-z)o%gjP\'~U8&8|QeuW'zYiJy2>?#>Y{3K`╗AqD:%YB5&FMY2x`i }˴$.7< 6㝴)O = QYܢPzR~<-Qw{0/UeMA|3zoyJ`(x ayL.@D= ӷ&/`1}wa+`z:7"\ $$46I{yFQxK! +?њ$; FCEfW:GL(o98X . :RjʭM"( #yW ̻5`F p,OB5|ܶC/S?^+n@^8zPUf0b%>j]K'K'y)uXwHqZÍɻwl.n2,G+,y.(؋k)Ɗ/kmx  ǹ ZXVFd{jh̽0QTQP Ȝ! + ۊQ Lsq]`:M5TX]xGҡ#)c ɔr|A@z.,z%+jXyIſ$2/%`3[B:DTZOsc3P})N@֍UgQ7uDĽ i!0 ZƉ@ln lW)=Q@/V YEvE &|ٍKu9t;I4El2V,|חމ@HjZƁBzFO] +c8+ݷ1ā|9'Cxk  gED6X!wݮpmgS;JE'~f:f-ޗL2EFTVr ctEOT ݉J)9ԾQ/DC9۪qԟj E@|tҾI=tXd9|"iKA6׉Gj",w-~:nn0#e(k o نG5g[&~JlB|ZV8WԘk:Y9;}i8X=ǹ,Ǖy LA5 EVZQ#c4IYJYW#h^wX:%5Pi*([Mc.$PO[m%s^Z_V^`jN}{r-*I"pr XV@@@vHejJ1DZ:諂cMaUu)_K0<)QVw,pH*% py>)~3;kK4 Psco-l-Ŭ7fdFhuVau e|9eb + +T!V]\ uչ0[o5ioYmMoToLB,ڡcԢWj`&g2mI*VNJSTdɔ- +_GY{#F!&$& +yJ +<>cƹ(J%|LT-J#fRw9%QO|t"XXTw“KVs?k +b @uXΌ nD +S珲# k{z3]hI_C[cj--Z͚u#Z!Kj.%T SgXu_$AHqOUTuN5M.egȹ+ ț5Z %ϗ~1M3/m[;7;̦r::o+RsAlլCr=bMTA*#؈sB$EvV &sAAOPMθzp!F̸ՙE//·R^q1{vHB3j.Z[![.0H" 4lt/ 5A|Mj7Vhg;)?F'7|0]dr`L()?:?nޚYGdUl~N~%Y +(ֈ_HB1J $<4ԍ$h.3w}],A|Μ/lø?'&,05iD?"RUh("V .C2Co|>S'aJޟp)p1jt+ĜBj y1S[h.7f,8 $J!)s7zIOP,G#z#"Df?K)8!C5@@C\/;!L,ўfjMA)TPHd+H;5Ɣ-t2A +6OzAb};Z `E|4!!%Z`xP%7镞)/jq +h0A`ɛYJtgKwp(izG6fõyx+޻]Dd/TUFrg +k(W7 +K(0ai dv5Nޏ[4sL@t +@dh4e|j7K* kl\cKqoL)h) W24JV* f)dq'V5O%-דTz!(vX9)T7NY< K @le e5[wlo0(_!h{lioOp" 4a،Qr>u9~B h [ qR0g""]?&~Y乄bqn&F'鍺QC-IQq5.umd'鷲 jtVx2kOe&kh'#f䎬U;sM9qʟr.T{UYjI,_ DujLSa:$U3GbɕU` yXcOEe4cFKb@ZmoQpg@9vP{H+7Bg{Yd݀VR'ZJ^QϘꇘ2EZ^*BE\iQkr葓:zReƔK"?,狢 +lKUQ"K^,L%A{Ogs,0ZPFZDOSh.\t)9kbefD\M_*Q/18uB֒^.$sdaxY:<2 +PszJe"kXMk[oZ&doróXYNH7Ոe/{Ojk~NN cvYueVWڠ~ׯ|(T aoS.U$ +82F4-j9?٣yY#JA`&a/P odhՉv6X#W2x{ + dF:B[tGE{ohņg +"(Q< %rJ1A i)d\S&9f" +$zfр3!x00gs]^ dS5lz&'z51s )S^ 3٧%$Gi$< b>nj( N.͆X_v|@ zؓʘY)M^:ĵyB]<$#F2vÒ1YcQ0:9ṺXJYm&ۈw:iY;iجZ}B/S%EܭhЕ<-4͞Kk̯xse.I] vAb,%:x&]W08k$͊^&ÛGɉ/-N&N& 0!0:8+aPI Yk Z`iBv҈ѡmQ%bY_F0fN q@|GCG]Wy+߈X6+=p +G q_2 +PNqClpIƒV|м)c$@aB^T %3y%ıV=\eppW$g"2-p =j$CԲbϘ,&<Ԉ^7kYe6f׌CK՜W\e̍񎼺X%u4-gj-sX,V-Ї/[%X4Z6\:Kk_1&+.8@"+H]XSMX +}%Z@E o ѥGPW؊84~}{u`h A˪~R9HȄChKi4i~'24GJ?P%!_ +ص{z'`UnDy>{΅{꯫H Km>'(pkP}Yi%7bd/(#!,']}+a%p=ĸYٰxD%D)yPGLQ$7gM&Og`bj?,\xzuY"uo;!Z_i`Aݣ=aJ1#Kjݒ# PlkBY#2+DLє8qd;٦F'jHS@fBo79l`oFM,jCw2NrRݤ6sr쀢Ŵ3or(U$0tcaPc=5JھewĆFƝݷۇ%?IErwS{&ELV$p)BT +np 9;!_KeȔ d?%ZyhƉl&2_-hz_ؗ#9\V͉HZO<.֧tb4xX (S(ľid*&f3/ټj5̆>N.A;$Es dN$ +){ÿ?S|M>FQ|@{Vh"O %D AY(t +Y-QL݈?}"$aQ "sn=Eyly t[_!!q[ ET"iYM~`TXNqN!,j'gWeJs&*Aa߁֡{߃`_{z=!='ɶ+U{ԳkހkPO>5 jJ0YA,Y tK0vymO~'@vd!)x%=)Hh yTnOO=aXleb͌,$H+MYK=U|[3LA73G!׾7  ħVm6<ݏ́?D6r^ٽ&zAe/$cMB)Yۯ*w1EPI7" H*@TxOQŮ^w]V`cx`]EC@X扟Fe0 +s`(zv푑%]/b@mqX5~Y <8j!8F9Czj?PLb@Y< -ˑCuBzk3n*QoqG؛LEQƲ|ci--ӅF?${ؾ3*6Ka %!NW`y0xXsT%]VޘFSWU~!+a.TsXaՇJ79+A.Rzyf4?!R)S:GznL؏Bv3>6~6ؔbMސjcl@29I}~:pã>Pړp|wX)$aoP"UlwiBz-ԀN!dU/80 +D/%2MVm\<23F:Fb[0>To0T +ˁ& ^5{J|_i֕8Oi&X4YBчhfuD'HSS|NQ\*/#{vz0|:qƒIS(nWD lRX6ۚ-A>;#(4#̀a>)>qY6G"K3$Y- E ab|Y'HGAm)@*J9˽Mb4DjGE*G՝>Kz-4!q #;+>,PC^3ruŲ!HM,SZKZ^c )wpi"AfK~2 Ңn[\EidžȨ; 皉@'J)axB"3Xf A SG'w321{H-R@G +b~? B`H&{bmaπL^@U<9;j5`!MWU"ÓE>\l +_Ϩ0S0|'ytin)(;}V1;#U+~3l4$d%K&b؜^Cř ..?J&(~BdxBaBv,QY%VhʪӼmY5@IUx\jkH +ĆCZ&,;@N^e*& +cȱ0~jKrH`Lۈ)weccpN<%A3F1ӫjs +slIS8kWT%rQM񜡨@}Ev3C&Ap'u4=;e`Y9 ڴA%MlYkࢇK@_ÈJhZ!jބs l V-,w8E#"%gُaa +~Edߑoҍ{za, + {HSP2)pXzp=eY5A}= beU󋬗F.ZGVVvzڤ><ոCp>xdJ٧"49y9Q-*^`E/g<^  ;%mwi=GK{xOʊ|)HqHݒե}e3V/8 B0c!xqzR'X-zJ5&f1$8Ϝ'_?_o~7??~W|_w?_\^RzCt0/gE+BcH[1`ʀ1~BW00D.P:V.r +_ꂨ)SB鿒6) +q޻#tYCۉx + endstream endobj 38 0 obj <>stream +i5h;}u@*ڣ QE| .?FX*BRcG@~Uվא+ԓ]C=zw qڼDE @ݗ#B_`FElGኵf<0O2~nx3 lGBq:8ݩ\|磻W*a)YS|E !$dUioDzeIˍYUBH<nJJ./C cds'~= +V sXƴIi"$q8zWqaȅ;(CF[(V$ +1 Q +}~4mvOKBz!1_ȟe_HzȵOI +B>958lcc6WJ#+tog0kza/t@Kp {F읿Q lqڙ^/~"+aaQ/2$,Sܟia'Ҷ=P!U@e#<`y_ܠC}RN\fE/Y㽫>"[_H?|iQo')|Z eY=vJ}w +\PZ$,F\ `2y͸ +ڜ1"'ұY+uPrZutyHDPCUyaH9@4^-:`H;+,'L2r*m)w?%GN.1' +:[Lֹ*BCW_l@ ! ǿ`RQcUߥKfԷoĎ@wv$s3`tʀxaǀcO}:4Ôm/˹_Hz%6'$RA4BD] +;#(-|9 36bZ=a^8Ƚ7 É7=cZiI.`8*=rڢr;/>cP"Ur׻Ey meP͹wGh}j{I&U?C\=R0PR>Ҕ{rw86.\r? #-pzbƵЪG""Twd#%=톭͂`Ouƺ`\Q{V + +4!s?h6O C@Eŧ,f\C34uXjٽ\^2뭈2/2h{ >9l?ͬ7UK +`+dZQ'T^I_JGI5ۗ]zv)p0Qfh쓃 +R4 }M!L@ny + uuzO$6h:P; QM+j:W0ηE:h;?Z2T΍)tnu;ƞ*'<Ǚ"vj3+)Ȍ"֘e|a"F $̼gu֬%Q rG5hĺhQ館.5d[6N1ʏ|̉bc {]DXcQc;x^XZ[I19d[ s+ KpGhjiR_Lxd!Dv?ֵk3̯s9'љ2LˆX +j(*@Qyڵ)h J{a9#gw h:@b SB+qC#n;9g`!V(M' dĠ +Z[M(^V1>iOb0z(MtMNǺO*W6u'\q L^,nS={zz.0z²n? d/GT+m+P\ڷMze{mþN qITq ~mCZPФ:#OI߄5^ [HJz]w HY]u),ۛWK5;I -iu)&rw|YAk[3eMVK@"{mt?G!aQaH7'R &)WJt&Őle^T!n#& 9 c3qvbN (Ȑؙ-#ܱ|ߒqbͣR`av-,yXOTGF:a;}01ϭْpkz#ʽ>yW4g6ZI˼,4l}弎2WK\ `#}pDJIн^J5O^ͅ6S++W@J,iIV H[~GWӞd/+#0Ilf6&#aOm\ݑ<ܰ[JvqK; g??`q('}w~GzI=A[6`rW^ כLUa)a!rA>TU HŖ"xl'_糌17{FG+-RZ-֏jV֩~V  D[K;kW^" =@oVҘ#U*aCP{Ս%Sw RkU,RiK}s Y]+nxG#̕i؆:Rs.jT% + qqds88uK8Y]N +܀Nl^H%lJ_^0z6k(H' 0 +58)baғֹ{1}"i=3jNVFaZ !ZCnIqd15|5L2 #׷2*:jU4*َjkP L/ƾ tMwbIk2Ti:lw!)wŇhRb׌׌yH!wGFM_EJGVSg"Tt0d>APTOč Z<{LW+A"GGE" 7*3QȷkL2s/ -J dI5~r  %22_xPS G!x=uPr3*9Њ,SyN@ +B0r!Q+ɢ͊~4Z|n=Zi~蹡|s8;CTlU4h奍=xv5>Z~SS#6d 3gz3`RO;lg_0C^G9 Ʌnk=ڻI.BTѣɶu4jW &gA5Og-.oʐsDESdGwQ^C@Ϛ$RqĖ9@G,[ deebNJd$ A=^vO 3q+`Y֏'cCՆ7RcZAom1!nI!l)=JjD8$48$$\FIzF\b7tD 5lQ7Cg>ŖS3 + 8?tfȊ֠3>!Zsm(It,nYm d7Z%v|w*&d#s/{`:g0a>vϽ=NRvõs{&Nuc 8kKcd%'؍S + E"C؎1Bޘ8wN|1WbNlxU%IZ) 'f쁏$1gSΒ +DB:GV эF5 rd8m#Q*^EJ|J zK2RtVsГrp[њvXV1Jp+Ju3g\Y qܞSbOUPampʹb&r_LUl} jG) +Ԣ:@+b؞27D>y+|$fyODC |18K~3x,=W5eN-u*AsjCԦ51еumo]DPS>*ɿNtkjJ a.}N1C'9_o:V\N>9+qUHJ=m+c1Cv K֒hF=C2u<8\x\j%Q7Qi ߃ jʧixzWč Kd,k:S% [k\/?jQ ҥ>4 њgZEN P(3= gKS@|VחRiF(!vy;Ca%XKIPr-3ݺSOؓVj|gnF_~2 +xzO뛎LY>C {7yJ3P/R%zPΧ mi3aʂ_bgEl)\ ;1X g$ўG#aטqXvsPNӥYVն#%1`>Tptzwʝ+-P<p}҇mψ鹿%d9H-\gV5\]=Yj!7_3e֜1V?aVkNlTJ-nk^DfDW#?\"=dϧznǣDR!S{wjZ䟪<={ˌ[v%K +z'KޯDQ30 +|qΉϬ_xU;($sUip㿆 +=37]]ˈyON{έ&mwRd)diz0qFY4<4楑vg@ hE򟕘)!iiáWbhj_ĮEL0ٖ"JN#8'>n*B*74 W cFJy͊:1Ud-d<e-  ;dLf_-:`( + . RZ]S. ooބ9)eõ_iE\((D<Tδ.gU]"YK +:Lcϕ1j?!ftqPJ9]aYU%'2 Zo7"KUS'xkf$GUڱ]8+ѫBn_t\ү[))P3tP$);5'hXBk6@899rJV#%,oTN1x ϹW Id|?lTa=7FAfD~h H wN-uӱT$1V欽.|\:t`έd]];]oqBhOu)Ž4׌Nj+蛵ͯ{\u-i€گ__d]rEY*@/B(Ь~>CN,0 K@fZIHJ ,,d&D8wF#1C)++\YoƿKxī+ J4Lij>״BX}te2'DUp}vѾ%KG''0hiեq$IZNV?e-HgQ=[@23QD7J=dm{&rU~v+H OB'z5FG_[HvS숂”~^02ҒX!m19}b:ңgtV>[#Q4)o]LH]#zFWng76B`~w pkߛesrAoÉKH7[vKO$е 9TJt_P{$IerQo\;+dH/kI׶]ҟDcF;sN,ZsG; -3syHa!56{;"\/ҵɏHm3>a!i0fwLʝ$HԚjk#VƑ;ؙK&&@G大pXb̈4ͧFJ(c{ NM{00n7L+=7{pUvkrz3ݑurPni~:#J-W7 D>I]bgrU٘gfpO + xQ4o})Xihw3KT0o V`]l԰*d:=1\҈[ Z4az~ф1ktkSiזtǴ`kƟc PuַBbwPq}fDTQN{r4F\/-E-r=F̾{ enf\78gw@|*1Y)@)[]{u^gN'?֫fVi<5]Rq#tAMu- 0+:{ɎˢXqxY%Yp:~=%hY{7#gB@7*O{BoűuFV./f>>Yp K0_\ddLkdC*į:?^nRABt[~>rsK^Uyng yjM4|Ki͂=xI߹$*pNCH_v2~Xi˪-G9f8ϯ1ŗ'p_FDg(B>Uj%2 StM! H{{+{ +Ny#A$ʾEzPV^W y Ys9՘W/ ܗ*)W|EPl+*Ĵ T\{XlϜ9tWC:sq8chN!7Q#8N@ h{`.= gn +]|ixG {}~ZePZNǕ +Prrg{7,byt1"|*~r+y0cĚ@q:p>֜ـ| D\tՂKo?3(%GWPmu ';d$y} 6q:x/1MPrG:Z&6 + +>^ӻK rmg+՗\' +^y|Z7l~ _fH(m87٧TˈL3mqg}K$Ǥ.GF+?I+ItscFC05ȥ6G!v{S&<1=#xVl<)V:oI)i4^#o~W/Yը#i,/E-_9'3̈OdƃH(>uNRGjrc]iAp(izVAI8|^HDcf_t[s.Mcמy%IB%UU72k**YC4}_|!)w&Sk)0$ O"Z-:1 [CHGItJ_p}5_)-CרY\{W =bM8]CX'=?WyNcK jf_ g$22`oM> u l\Y7|q;*hwv[M%#ru#zR2dm`6w?]\;^֌SնE[is;*rPƲo {Ǟ}D$| rR@G-Cv Qk-hPJƩ&<賠 +D 6<[6/lVx12",T(q$I8," +$EH {# O+|N+::(1rQ|1Uʡ/==wOЗ%~ 2ٯQ :J;ވ_PwrK~+~b߯oPwb3JH!qQ6͊jȑ#oo˰~FEEmWRf+jXYRCZ6zR.2DgoFB&b 1P+ʐ1ZmH,nLSymB ,u48XL i: +Tݧ䟠/ϚAoVY}:y60IL$wcWQR!Au N3gȔ)F;$qnF-[oQ~V0b8 ϥ@?nZ_ްzjYQ {B^C[Aq{W{!qǸf^lA=C=S4|M pVX#Ɇ@҃]ihҵ}SO=QL(]WǥsOrN5lX&aM]u8!MaT\Ǜ 71^n*VŦ`Pg-]do̖\LRv7FB~`OeFiΔ/G1Id_[sGc}&%_ ܩ_?8v?=ysGXu- "ݼND5bK !5Yc_)^mͰ'h*'\<oN]=ݩ# [ +:~C8$ji(g6̵&P}CQ!}r/"+Ls_9im^- 5<~>0RQṠ1=k1GD9vZ?8o mu=w]v™l.e.t5) |Tv}8E`/I|%3#߹=(p ]GH+ΞfWFĽ*2hjy0 +ޡT1G,޽Vnw +Lwi;'CCyg9؁zg''m48C& HgzoD!F\)qXQ#}W/>2ENB~tġoMRۥ-i5 cJAkh ڌBq&<#BDC Uu|U>Ry(<{>!}xP +%tw'Zm0^??I^*vg (_P1(Yj +eϜ/L["Sv3$/n+kDkG1,`/9ʮ@')rK̴M!AVSX;}l~(lLx̒i33ݐg|t7=BzPg+RF$')-F&{iMXh- 8|Ո60f_y:DU`0h[GQɢ夣nKZ0`Gqo_| 7[oߵNJ !̴fģ:`\IcBR_& Yy33tN.ZYl\WAO8xدNZ??AQbIۺ2"RaX g) rV% \Ah(#f#݃3SH +'%s-@qD0-!?2[|ZH?Rm3`dM؜_ݬy0 V*tY^=4Tom[BDp;j,H 1j:RQWo%[ }o$(pt{A3Gxm^!/$ 9N{:V|Z kM"`2@}SP*{D?nL l ^hʂG)P1/yr9a# P芒)P#7Ml)\֕:EAn^ ;` +Weg a*W|`ބrgWOA=JENӞ PA8:Fy;.)k{H=|=8iR)㕶O׈WMo6;6ɼb,7a-K8fj w'ק1V~ [87U/svwKsT|%]Ȭ8@$RA@&xKcI&%], n+y==cRPXa%w&IF#?Q-ѫ|^aʎI@"&j e|E||?a==f( S-@VN|2d6 nѧ[oT)ZG7z7Q IwcK^M֐RT +44&> +}j>=K(Bh5(g/BGRk3J]]^^ͣdȈ~vlja@2 +ÿR[9t --:ZRzkҠf.iv -›L +YrGښBRuMrw7/VM~ok30=ܵ}*iKJ|->jH'tZ/k-^}>fz|J18\K8@%~Y}]AQ#bxF9¾"zNPg{f3@E0.eoѵ; K0H#̿.-4~jH &[7 B|` \=n/TT5}l ET]Hܓ%-x) +SY 'i{r8UԆ2I##x<`Cg_dka8^S5HI/wN{dmIeƈ}rgS8iȴiQ6[7 2.sZJe5{@3=!F'"b$uZ>ϐy5"cgtċ3* ka8>9;EtoMI$Z@ ;+S!nHu+owAMBs~NX޵[dqqWj/XPyDҚ c#$sK4[c!-B+ь Ɔ: :39ҰW<2!qs 衣Lp\BҼgHڻHXgeGqo@7(Jk&a=k>M+JVwՠۀ3rx єNq3IV09_fj;^c])($ W +=gʉD*5zcg +zy#fNmg2'u;y2]S8J^z}@ `n sqyN?}{dSY{ +.F@^ ;HaI{!k~_Gu]ݿ(~@RB;:;}bAZ[%U X:d(ƒ#ŝlu%~kg[&kpb~2v;ȵDI8wN.nV2,j{gH+]g˩ޮt=薥"@56 90%D4oxqq  Xh*80RI^ldcIKDBK+q5E4b.2D`.|3*nڂ1{u +zĀĻg  +r^;=Xz2v R+ K+n;l[߁'+j|Rn]'Zw.6]P>~T̗9vc1,)jjF< +fKdĊWݠ2uni"?f(VOD9% 7N!eP-s<%ZWZwjjϝ&&\ItVOea.PsPԄ^/E>bLQ_Vsڨ`7qd ++WiuTtL<n5;.is^JvD:G<|ݚڙEżDkb/񱳺*-l{q"[M&K1W¥9P`~<;tjSEqW.GCՊmds8}_)?D+ܠĆh!|$jȊbT#gB;s=ҙjz;U LlOxw4CT5i3~\ pgxYpܝC!)}}=&RoDZ5Eµc[F•BZ0Wַ}-Fͤ] ۿdJ?jqTo?ӊȉ:q>hc|ϫ,A?z8a26wcz;\.ԣxѝHkz*,LW40J|.T]k|,|D{$tu)<*zbJ" Q[Ohwtk+W~x0RF=wao H֐OjxI{ubNcBn^PK_驍qi@]~VekPf({Aq4Uh'1*os4f@n^k7I\ΓmsQYS8)pskH?2f^9*0$F`6W;ZYYGS4&,k=q_[8L~ n_)`o b~C_fdOf-x*XyD!\k ]oK>w|U{K!ޝ`ڙ'G!KѫWCv#ʕ31!'=u[`bDohD{Pn?|wTv 3lӚ`W?̸*٢` Wi>u!hsu^Շ +QUO#‹e^XYSԞs*c{ s~횀>(ʁktbe&Ě扽%ˮ |3R Zڎ7z)p6{jɃu£[|BF\D䬉%uE"mр +=/1G%pl]xes)礔ֈv1?+!D| +ZTJ(3;GOo ~loL6?zWER9jwhNer9sվ>|]%İ K9A.f< +X)oDtDž X%ed.z<ƬuM:I3F҄gPh%v<82xhaUC_%wV&/?=4ƈq`bi5?.t +|z9Eb\_>+O%H} dF/px Szko+%E 0 bk@9]v@r)ťĞ‹DAVn,1'&"$TA\( ++CP}nHT:ߴ>~ATl.b'4C]ܬ;P97yXϵwɋ ea*o8NA [&wwXJunbmSn- +p\KsGb^N6DYr=ªR5)._~A( ; u%GсOsZJvH`Blsf[ڐDGC?JHf`lyӋ|*0SC|F'9kw2E]yk%#M6iY=;Q/E󼵍dfw]IEI_iyXߎ9j2!-&_Gj5#NuS)A$h),3 mS]VmOy MQ¤{>z2$:t8[Dq"nHUh)ͅW@BNw9TSLCheyI1ؑXURZX1-\}i!@F/lURJΏEApGꊧ2I#{lV% +aZ;MI650]~r&(zhEGώuG?ڷȏ۰taT3p̴Kj.JI\x[s*`ȺHmow)uZA4y7' jcfM.:'`fQPGgHی&DΥ^żhB9`▞<+0R乱 Q, Ͽ؇Oh<{ y#D s.fWSH)e1]X~fCZ'bFHe Q7mjΘBYRovr ah"mg)i4"F'i5ۜrR;Ĕ&:Kt@s'|{@XBN9=;hYaH]w~1 gAQ+{~xd܅$QO) =%¸C"I/ E$ +0F<4=7S7!RYK|09ZAw\0nThG*Zƺ fFV QݍC3P9QǬJV.S׻R +AaJUke| *?wP_ g琙 tN`| 7C{ѯV50 h݌SP1+9_G\S嬔 +눅S\ +ׅ|8ku`Vq%_%8JɽO?/Dژc*KNؙ3#ڪpE5?#2p + 6"!"tC+`_̥L§^w}FnB6 ؼI{WC2ʶ"M HDU(=_qxen +UJpvtpEոP>bTụ kP03ޯ\"mH~,])Z8M6-BGobǂIP7aEyģÐz6YvևzЇ<}E*k;Gdl4bq#m*X g1HEX{J#'-z%Tpst$Hl"BC*D2j*p]eH"{$FL'mvL.wY9p4ZuXA&$j+,};>S%BbZsi]4VweBiEq$uhgy0 iۥs-Yl&E!a:^א{isWxq]+M{U^r8fɗ4B{1>c"5hD36qx٨]jW(r9if="Fds-6g . ~#mLe +"mZ:Foh! xѥp}ɩj>s3m#ɣ{c5h Mg^QxwC @yxԠL&k1t"GDɓL`+NxvGN N5xFV!SK8{jr’~[48L'Jo7)#>iY^ߐy?W43J1!sOX}{YoP˷Nn`jQ[|}~`#[~03qpEֺ\Coq>wM(RXDj^ښׇVWZW?%JOF䀍ei[Z.X;N\ʲB-;ҠoꃷFHBD[ A ;wcMgRO^XؕٗiccB֦YEL3'Gw)ɖ#*zq5)`W·|0߉ QUƼ5u|3Z/TJHFw\zΞ JdXʬX,_oME>B t~E xЊSWIsuQfǤ/ҫE s> ;8)n᪽Ɲp1{ŊؕhL?ɉ?7x2dtڬy"OР\].d}SOބ +QNKEtMj6y؄h2 +hc}O& O(nV+VY/{* HA{+ˑR;cr(hK`:Ѹg*τnCXH=1qZ-5 I]+V9t!$¦73jqjnb Q/Ӌ׺YnoF"<@!_8N_wň\ղZNEG9_,Wb2π͐OTP@^{W;{^3 _97uzz3h?!sz ?MG#Cɥz5-`qP (91~k|>ɤr<[BeUe cޣ̈V;[5L_$Is +b7! 1]4j\žzJJI{Jx~vhns]FuCBQu)WRek n;8VWLϙ^C;߮\5 (bץ{Cǽ`^4u89w5AG$Ϯ -ҐY15<?ߤJ,%QDBdr [;ATTj'"]\h8J0dh4z$9!t(Pq- +{M|B2K&nc!NԞn+G [0F_ ?[AD^ "q#<42W*X/`z߉5[ ѐ@"ut-GNGV ]G ѥPs|c^{$iBؙ *]5`\a~)IE3nf_` +[Xa;@"~{DP*sY4 |:]J&'4$L obSQ{@_$V:ޛ_T,@k+'Պǟ +Ϯ#֓ .>p_+E>5=6D/*iY pȞJW.24S +ݖ}Y !p lerW9MteG)/xOCޢv[~rFC +Ջ,XN=#S"(C #S2}.'3]p &g_> +w2aX<qG !X]˜n- +K-gxX{euC]>K@~Q-Odjq?-:$GyFJ*ZoJ1Sbh, /ч߅VH{.ub [,FQ.z+q)҈S&#ؠF \\ j7[g?J3 +ApS_Ctwz6Cʗ H!|\'zX$}tسvȐn~3)ԽhIm0wNuִnT!ZqtU:SV0Gb.6\6cnJO heV+0D̐Hn'[XamTfMk; +N{_m&{|>KsI?4{R%ssEx^z-}p¶K|DX&> גRAi/Kgn>x7RxdhFlޥ#B0/X$3a2P. 2z)*?\mH"' +&)o~Px5^kgfr  tQ1(*l՛)@C0`5OqwY__! &BnѪ0Ε2DNk +W;z-.RQт8m^C\z0߫͐*vm1qEkJ6Ɯ0 ctdՄTAirŇzwu!݈1 `rCTyg++Y7*gt:#{VLZnPYF{]t0/>ǫwZJ 9xl 1c@ +| !LVRv,& k G>BߑQY3>Hc5Lrbm\eĨ\k2QSY>fL2P?@ y.dcs~j ^;`>~np + KOgԢg#QZI [VPXu:ߺrO`qSGFF>Vwe=A^rY ԇ[aKҵ u!Pk1cc"m1DtKznbM=Hf6&ji+^$tI$뙾# R)үJ3)%Ya9f5?~WCl|/9뼢'm9"˙H,Q`CdրxBgrX[;3̲ &0.̼dƅrl}̉ mVD:$GV)o&XϼCo>'X]i@q/=w 3y{@5 m^ _.5UKhx?y!@IijM EץoX +mU? +r!^n&+͌9> +_]C(b .!vd 擂Cwz{هP98(!Q|rfG  +ngEa]w:2+=K8i@"Wa2܋{/yj\)[p)bu8y.{ainuncaNSS4q>K)'&WFW!Pkr丨]Z(؁IK"~޸=WCm2T~9}G@޹gza_D̐)ߪ3@.4}ߴ<]s2&eKfg9eW@k~[M[6r_yO[EU+6ǿ~h-]`2o']EvFH%wHoA(FebiڿAKAI,.1C׊i"J)Oa^Ytun!e Kdk7wESiP[ľwnxH+]?T˟#< 5g~ŷIܹ1]dBͅ3⧵ZmꃩP=9龺)DdhpL_jhVQbAGa:j +JLuQ1/Pzs(zI@:aoHcB)B6ksiFLI/Iv^ +L~Jw=6)͘",Eܑ1a;T8z`3G?l'X1u b {w(Cΰ.,Z: +1JV/<PS? }0oՈh2WuŤNElAĦ"\5 + eY`Fh7Ÿ,8n^=U;B:ں~}*/3˄NLE}#`$/ʖuE+"TVܑIv>WvWN \#b|E9*.3'8O'uKVFxE9#{*kBV]8i<d6-v@pp>ՙĹ?o"iIRn +ڡcy |LiSK~>W4g$8JԾf~sD؉Q8}<͵m. qxѤ4HG=6$ۓGBǯA~~FՒ~:@mx{2R7k ZȦ`tdޕhum?%(GondodH&9Plڸ֥npKw!EGAodZUQ8 `Z rW7%aT^r[ʅ%Nn*AU­srJnTL#bUz=v(T(HBMFx(4WZG$C10G40&+gvJ~x9Hf4إ3su|)0¬6H-_-#"L +CxPvp D5|fE5Ѕ q17e9Sf ujW s=:L@&mȎ!o2VqT23JeO%U([.XO"JGU\<.ވpBⶮjgUF bNi~[]YQ`e +GԞ-\Tu?:"yδji<} +X"gר\h@+=G(|M +@.õ6֜"k1ۭxS30g>kE {mVZ6Wo-9lG{ׯۣ*e::pEۨ!,"άSsG Յ ̳3:^hۋm7j5 zV"8PjT4B=i>5~2de#ԯGt*^9(_5uA=2?:6hgQT ?RLyJyOJGj B*۱{B pxՐ_H>k{l1=_czy91Vm-1=;)J|Ij>]QS Ch6J@{?[KuP+5 ەd_pxhkJgakKy߉3F̱ L8ԘK/t+z%S~.$,;S]9gp÷rkl/`|c_c;E|MD[|ι!QC;Zk Ei`??ZlW)H25*9D&be'xR%{+ahK#"S-SG9VZTqXLpXtDGG/~Z~дG;2wf ^zT?j( kΝ=]HC+$1\u`V* Hm5XL Qj)q6Hs ٬Pr)u?3r='bK˸\wפ!HvI:p̞d6U t{zNXd?r(Bl?-pV@ yq~i;e-7}#\k{ޟyЛؖѴAqK?=-n#W<@ҭ1g%8w',ϴH"iT_ξ/?_Q"AjkPϙtVw)h*rm3,լЪ#Ʉ- s4Lf|"#eGg2E٫S rfQָ=|5Zlbdܽ `b?k:ײ d?p%9[8ظ+ +S4:;OaK/_mHrX>JpW(}mu!Dmk3PкjyG`Iz'ӫWi⼨sPyDBX E" +3%<4q hɹ|k P6I\L VAF*gcNx:p!%_1/H ΟE6cH, *3#zo h59hiX#+N_\`<1D(W; r e]=ye5쐥GPmIGQ^ňLx8TMQTO$Z]2pA-DUԹkS@!s7y/Ҫ "k"x;:G3g x1DG1۹k8?Oz֐*^c\H1S4<-ɫ_0mOkVDA`vk e.T=hɀfB]/0sz*ufvIr'TSJeyե3x +͚|?E!ƨw>=lA+IpƩ PVb3!P)C*=Gie#1DCЦba:9YEx3v㫏L8X<чl=9$>{8@y8VU|"P{!ZB}R#ѳtrHx&Sɸ@&}|cq >4P:g8j rsFY3jg^_O2!/.m+8ANXI+<\%YRn*)W* &CD5.uGy/#woϵ Ş5DY{.h+^4/{k2U"^AwxTϵPP˜+"NAZjw XcPr\qMofaلᾖR aaG2횚Ja^ A8p-#h;:V+5bF鵞kCwx.e͡:ڶB=+@OrZS'L Gug$|=mN>2ܕw> +G_#K)-л>b^A[<| ^D're0 *-y&"?4DBJ\H5M6YH&QGmQIȃ? 1~byآ0rh ?uu4@ܢu(j:J^Ift:onHO7M^[ KnfL6&`^Q;>/\}y|rI>Uj T,VbDvjګV@>KzBds&n#Z.5 dGgr 3YAm `1)'5&Toϵs6cG5CQpq +*ń_! GQ j1hzkt^1d|+sSN`d]RpwFz\WX˾$yA.Y*NVdn|_70UYϾ'uDju>ꜤBbi}hqhZM 6oP=ߧx;D\6;:Y'dIVJzEjUKrV_ R5Yed9$j8 c"3 &/-Y3B|P >j| r13ݠ~41w#!E(qǢ2f=g)U9Dhj2,hv:R#PSpT֔43a8Z/ *xJc!5xYpr[;ڭ,X?ЯKNB´ca'+*)#;iD/#xjp5$Q\is|(ͤBcY,H+s)PZN~Ń/3:ZN[<3_cMF&DD~Xv,FR!sg$6>ȯdlQ o`/Kx¤A=YR͝}nG"# 92f,~ǔgkj!]Ks (;vk$Qedܓ D0zK,Ύ@3!@j 9jˊ-}˜K$EzvQÆ[a|秺Bhq{3~:b.M$c8`MwG"`39x [s=ҬɝTO@_NoZCZZKSFY<%"~="s)Z`flt_#L73kQLXS,Ă&]|! wC$3e6G>~'PCR '1K䍈ZOO$(#Tsν[?x!Ez}=Lড়m[o=gdD/0fgny/ x f+GˏBn 5gGk95kPh!OFnTHUL0{v=83i̍ 7-Y(".#TSJ@7B ,U)*3Nl*DY-X}kl0 d T_K|sSnD+rTw!E7T]&A|-S-a+% ԌSX+qE%R&I3e H!]G(1'JvE^t1d;¡e$dqI{dfYsRGԑKx /U[ kUVAxMɵמFzfCrdTd+F `Qz}eGU̖09j &ϒܣ~[On/`3R*s^S]񨸢 ?L{$b=zsfaf:w r(/劢9OR֍(E}.WGɥ~x?jŻl;#k[؃wzOI|xϢaOJ3!vSO/pzetVu [I'G,S+ce눧2| <|%Xx^_ 3 Դ2k=IP M] +}-;㝲kP4Z|~ߋJ fi,K6a~Ȏب*AOftٵ< q=yꄢz6y/9^3NC[w_Ts"}iNh0׶G@hn-p+m`Z%v=R<ؑ2ɵg^`l+Z91+&EaeWLC܈q_D˿-P"wĽ\V{l(aIi>`خ0^ɷ!r2;{(i~/,<5vM= 5Z/"/^9uuC^D?1Vuώg `aRWT`@ošH7uS_LZ~?Q΁g^0_ll_l7[&A' +킾ptFT A(duLHp.T"WGwd:+u=RA_#d)I+~(G_oa;4w>wrS^:d 3.}bs)BB4"K%K(߉kcPX5"n4 JV#FMs*[/һn]v\=#|3UCXOEvEERR>;ѷCX%4̥bU"UK]p2o1wYr`-u1 |s X)=.ڑ63.´ڈe5-eQ=yUJT +G, xotB*(Pb6mfg qBuHy]^QT1ˏmE˽?5I|琛=f~Rmj([z4' ~`gǵI?gM뿈@`Metr +3Mg$|u:z 32ܒ~`;7,h?wە{||ζҾkYrmVmz#cg50"xѢ2g:)'J ݫeVe DuHCrs{}ngd?QEj(uarYv=2 N)L _{p;FY:K|$V94=슑q=v `׉;يU')8F ymyF+lc|QݫCN *:)u|udp2Ըc=x~-P_7WD)yeMFEx^w-n@ޟK3gpo!-v&>wVԥ^~(&Wܨjn*ii3秫Fۉjޚ`!RP-G@*Kό- ]I=BG?їי䊀tc[f>L^Dc$Ίw̦87-%L9I>G}/ޗҀvh*IfE}h1Qq`dh\B"Qws +}&OgabT.]"_Rh {vHvkуtZR +鲤Ѻc.4J@Qpr3dR +A&Κ{đAϝ'#<:Tྪٗ҈!{B*Q*TGKK% nW~ʍ47P݃+*Wl 9תReba[,yl_~P ~G9pӏTzj bxK\Ni+L%(NJWbQc܃:;IS_lh3uQBa2L.4T ]WN])v  -eo*c;/[NJ;TE׆KSޖ-c9B gNBO rIG?N<F.57,UC..E8#viHթ)"9cMZY(z%Crne6^ze/Ba5-ݱPL/'ſ_^`O 6=ʽX| @opA!O~5c_!TFױm#c[‰%6oy~ UQEjWɂL5g5|Ş7-;(?×=D zlu)A>g9/!isSI͗ +ްέ{~B0( PB8$C6ǮjyN5h"E"Q:UY=f<.؄wBs#BYU>[YLܙ=UbXw-ŦL\^:Vxf~,6ѥ"9#'!QxC3pg?ސJ0 +i t%~1<.|g +'*lH4(S6̫(5+2hB?>S{/ߝZ|~ +sLWɃm "yQۏhبt"FqmCxYon9';gUhRMIJP "!/B} Bv둛Чe˧"w=WV D$]N„#jȪIVȵ:+cYSo޶(L%;Tۊ=V;f?kg)(DMP"fe!_W"ҥJ4BW"ZO=HoHokϡCФLu}'p7aE#,fZu Tr"dkĖ^1N(5ϠWePt f \~.zgFTvctO `N; +fg5 +擄zҒ%^0jubxhw)A,  緞3}K@(w%EYSPRwǏpF +1U8> gi!]h}%B<8ʘ `Ey944_DDn2JbiDURkTQΜR|P2\hJ+jiC_ TO/k>cϧI>$ġz0mH9zNvZSV8pp@JL #k3#SDFF@u lFd$r6!|ӆQq;`V)e4l"~TɕV(HGXL3)yڥ6QaK߷}5{=Ǣ({$Z4 5l﹇P~2щly@xXh59蜲-+BvW'CԔz&Ԗ4Kfر/笂'ܟw|M4i`̊3@+r*i ʹ]YcsAFLUjE+谿=ci&tQжawFZOԻ(][9< +5J)W%]NE3Q؁k-:סڕiF y?t[Y Fʽr}n(Avx ;HLWz^tҼ ^ׯ(pLԹOscTyx-ƒsjB 琈mi?cGgHb|3(NY"1l@)gwrkCv28jcPjqbbmX`^(ycdX]agI!FiR.h>3.][۝ ChOt=[iRTAw4p: &yg<9}ũ  yqQ>%j X2(.>vGEjxn8D{sNke3_zO++^!֟tNdsbK֮(X<{\@85bnm`ጣ>#;SmPb5O$R[5qrO:Bgw| 䯍-<!,\f8jhUSMy~ۏMI[.i =y%<ԏ( W HtU= e:YPQAsiadgiKA0sV:N9_]f]4pcGQd-U=5x̥p$gTiq#Fe 3,CikJ<a)12~ s,יl$-:vf'1+@a:ɥplTyX"X0;Ǖ]m}:F ĝlMtPwQXݢennɭk}kGFLj[C|bfwPG@-J"@m7kjWDX+*nKud"vܨ+kni522Gb`r@m`PB3Ai;G l}(י218}sAM2GLv=-wo \#9 ]f: ]uh橪"Ey5QMg܉wsƪgNRC"k#[33t/YxhMi#K}13 K)ӀDvv jYњsaE ѓ֐-zٲ.Z7^pH!S ĭD efd+b5PpQM *wVDoC' _*MnWqppX&M34jsw9&ݯ/8ao<1i6?b^货ZsTwZ NRJD@TX`D>&EOS`0QvZd e;5bF;+& ^5 gLKJW>HGtn݌*vU:)``Wqg`9K.뺰y}y)  6)L|^Z>+svĀ<9t֥X[A~ +}u33\N+Er} Z㍂B4ʱ ۗިL1d b9Mis>F'(hxQq[wx*)??7V|{F5}"g7<;'L 1 +#|4x᝝F!cL\2{8˹x@}CNy5`M!juX 2B%!+}OwSbh!kΉ YJMyoҗ%j]MǗQ+#H,P*T[ t $kriyl%eH T + ab@QFpԑ됉IL'.ґx&t։u97s婑uhI 붅0^$ʓ}vA(H4k)@2" + UCd0<3:q|=鱱tF!tQg2~CiIQ%jKbxHzRCN>nj':D{+?" +0UeәF +%3+.xK~GƢa-vbԷJI;RM`u3e?3^zr^BT,.p<ތD[6䤿po!63 +~MQ;8J'g!ND ́, iI@tJ AhI*[i5%=Z! +WOPojoGlOMJjLݯr2Mbʣ|+LUP`Z~X{:!O\tȕY!lv1Ӡ\zTu^zwbt_GTJ糚neLG3vEm- 20joQj h __FPAvb LMm.5n=]HhP;kF+3لL 0r ~,a@!*)ҫ6|Jz{+{Em;'yR.9##ɑW݂NEVyEplQDqj)\DySh]vR6tBÒxY1FvC-`j0jN&E3pX(I7fΪ w +^lJ`wOWĉUJ{laJM8^-wJ\ΰ@m,g.b5;]:iO6*DžsEA H2.3W9G-,'LQ{8OG}͗q#"{e +%yfwQLeD6#l{g_?l#.66VE}ABpAvIwíXNsV!W*lF]*- %eEݐ}kGyG\" +@^6=:5q`yocL LJ}UB@PSͱ"U?(/q=u˟#y=#C$YV 6SV|/p.fA:l3 +]YBڗs'yzH!1 +e!9JD}|S;&վ=vX_ݫF5gV"ajG0# kSW|sv QE~R'^Pkf dАW躴]J4ƻJhF:䭬g+s\׺TUk3fFlZ#dQA3_LYh1έK.x,My#U?C8g=62䊿x(RS=)DOޟR5m=M${]L/3F@B^, c>{׽ŤN) S2®D6!CƸG0P  XiIpƮ`R ~~[;3ڑaF$JE*=")ZsCJk +} !I,BCGZHb >|yAQ"Q'X+S>3(/7l-')*]9ʯCM8m練|epK{{=jiOd[Z+Z4u/4&w*1ZWw߈i \ 3=wŽeѣs~VGoy|qϺ(}Z'5{] HM/rYgKH`F +,*+'|ƑbU\z%^@s>uqIxL9k;Ӄ<ޮ! ,=`ig{R@ (K:(8H[k'R%ud#J`*_N9egr25ld!1h*%?`2=Eg8I,@cd!U$M B TeR4VRRUɋ"!@SEV1p4TTcc7_HrU5u*rS(U{f pM TzzP˱MP E7eE)Ed%Ļ +"")Ƽa8gd Y JØRwzNprpgS&clqƴ$JWnP$F.ǑYw3<$6~:<6DkXLMރNLOڙ +m8ԑH0WROa' P +r,NBUhD$zԀ6իPwU=+!(QR +1.*/STet@)JJt"f3ۮ(TD3{߽?1|Lq9`q;aUJVOMDVH +¦PA &=aϷqk3J0ȆDe_C=|O~J[do*JBj8wױC+@tB8Xz 4VOnaHŽ'FzR##=g +aK`źthMS_k8 njASfK;j1O@#p ,|Gd5 +F‚Wh\EdLۇ7ÝNٯ_}|-ƹOnZƞ}~f$]L +߱GI6@ \ MþqFLh]fQ;XwЏ +@wF)f!!\޼wZٸPg[<.NS84Cv^[kTasF|:YZ)E2#^3Quw%e/҅,a4u\UK$УBF̖-zT9_wXb}|+P0v '<XG[/JJ mjsxHdpM#XL;O,uG: oK>`X|qǺK c졲H7j9gLvb/~3 $-bkDxms?@h}qH +ߪ7'L-W7ro㻫hUP{5ОciOI^V0*6:\Gɍ OnyË=^=w@I~Utc#ϼ@u5#w5nl$:fv^f/Hw>KFs&ӣrp Vq̢Kh;v 6?=2CbyFLH9hȿkQ9fZ@*lk)rS \L??>ۧ9ZGAKj"LFBa ]s@ 1 2Ϫm (Ѹ +R,9'T4zxLuDhD3W+X 7{0=lI{ܮ 9HaKA TgIDp:bhTVEk/#T;g (^rR뿘B9EU MmOd +eA +^]ܦrNϧ+LygwtC_]]Fbq߬jÃvD5(PrI[ӫm-Bᄤ-,|G:`J*hã։,aW#0A+V༸9nCïה dr*6ҋ vIgiM9[>4AVwk}N"5b;ߘ/naZ4];E˫U$Vh(ءŴ\7`l!u |cNp7Nh 4Nsݔ.9+('I5dKdϴ0܈4fR2UUh1nfn;h٪I?v&t8W]eL5 R|.9W]UƨFjC~ľb4/ZЌK0?+Nॼ3=BP4NNA$@ҍ\D۝2bp!6{9o[o{ULdUR`sDS–Dg8I< QN "6#=WD\5i;:+`4 +lnڜ/ +@"uMPK\ɯ0y?p/l>\XZ n-?Vrs87Ix=WWX 0N0!RvT,H T8y^̫5_/ZRLX@%4Z.OdQoOb}?Ig-T0kœ0W-AJIAD @ݙ&VأiV(g kWrs-S3VHBeuYz!XQҍ:A2Q +Nsդ%,wJѽ@1~E$[0hX{0*#ڂ VU's_S%ۻG*~pOZp\|Vp ȘXC1ͫOB^A&>6 +#/-qGU#46N 9L"E=~;V+ڣB0.4gaEb)M#%Z-:HDZesy ` +6OaIP;ߪDռ.5i= }pE(=1m/&5&0k~9(Ȝ*22XQۜC?Z 3;`۬ BL_O|Ѩtb7>Dsȳ%HJ{X%.o! Ehqӗ/V9MV+yl *g$7>M@oJ$0:;RڣrL;̍,m7r[kU凞3e5ȅ\DI YFK*'Gڄ " .,'؁s4i\9o~e[G$=?K/Ϸ"c-ۢg2wɖ$ٵ`Gsx3%Fڿ[n `k wO=  kL!i):ӫHM hTQEPCW!al^Qém\OvS^mکqd<m-&B;0l"XYϿ+S3bG7:gzpZ(x}LٟH1ֻ%wLfj=ZνݴѹYBWQu6[Jذx0 ݃୳l.61,k .a2w`C??S09/Dc7h+ }}QǷ^ͣ&@, J8 +BGu.g9(TUH?*_KhDkyiePB/y[;eEev8s}mVp@ON| wMU=Bhg);m"5#h* Lb,<@\YU8 <*Љ|kɐ%X\3ٜ۲wk*]ia"LyK"RL60:{fyN.L!NxE-@9J˱Rю,@3l+$75Ѕ}Ai 8vv}q#_> +eueBk =9":|] Y>q.K=ד#(Y_-:wKrn@鸳)Yr嚣 =zõYN5XD7>%'7}uR: HhԱBf7\N#N9S71v(#Ay} +??9JWbv*2"e {nzJv\ztz^-+||vN>ਵ~ ^|3U}fh{ؘӉR~'>wFFEǰ$#:,mM,!#d`ǔH^/+$Om=3f)F$F1Q9@ (U` 3{ +i}Y:VM`Y)fpOh2 ln̹Vo|;5Hv35 ^t.RxX-ؒ6'}cWA^#B Fr֣K2`skObZըL]jEt ŠrhB7ܼdde_0Hr]Mw75rm ѳ{E$#g7(J SCyT ?c aǐmVUoFC,UV$fw6 iNxJ +#[=Gss%uπtBؘfd'by}Y0.v/A⏎C8#Zr $֩uԆϽ)BH ʦ&dT6_~j8OmZ(.hFde27vky_&}rr#آX3Ifaq J6RNrۦ#63r_qY2bHTc/X&pmcJ'CwYaH8O] pU­5(h9h90_!J (b?/͟$ +O%rO6+ +J͞;O}WK?S5@W[1vf{O#;0wU.γI].<~Y N +n׋V._֢O@jXzh*wBSPySfjuc֘AJgSM=)7R~Rb>3Td4pwW)[A#,( ϧt_P< ^#oE +v-u ,g-,YjF-?TylF'؃'vLIpu:YY l¸ig?RISvLT`V#p59=uZJւFn=~i+ +cs/DE8 g"ow[C*e]ֈ7dZTMd⽰׵P_˧s`oZH'v^^d֧]._Z>|a ,fD *=Ɖ*mz?J'*iMIPwsCP3~Q(R u rOJcy1ySd$ = ~=eJ_COh嘺Z=VZ#k\7yї\RJ gI &Ήr$ +~"ʏ1᯷c>4j ϴ$ sH/Woo4&>2$8|J?hwFNye\0үhwlLI劌jNCLnP]vt+׳5qIA,X]L;ح١I:ٯ4.пLO +Bz5">ji~rCDBBx!o$:o iYj=+V2e3<6ҩ&-I_ϚrAk0?R4դl!3~.M5UDw0jIG"l]}$=a-(@5{2ӂ +!FDv"CQcWX;#@YHc\ c¬ƢHDB [UFlĿy/W74~ +!b:R`+ W=,?brQL3>*p0{N+v/LbSw)#P+cF=o$kѷ|䭎ojCNL'RW'}D7^%U+H)t^L̕7~m:[fyk+BV:ipu(i)@Ao DZVoM=K]I nX!+P3\'2y{g)i5碖ɦg Dg<էPFGᜯb}lx$ oy2k`%]s#lܒ/C<"x[ +mF)ld@I䣕Qw*SbDAJpng\~N֯ྜqLP->[NLb 0b*|v_ N_C,Coy tgB(kN@HR󷢘;&ƄpD7F]D4"ڌG Y?3y7#We]3Ϛ”@a^4wkd9"9#)3n.-'IK8DaMɤ|(6ֱ@D$93;PކtlDӚk&e\hDkW2-n4-(6Ԇu%,!P5hPr`a߸1KјQ=ۆ35*)j9Iݐ{kap30!NdFs@?i%wƵϰ!GKn?;ջ%G66d +]5 >tG>EN]rpG$PzMWpɾ#7YRi*9a sdډ;!W)g hm3u+RkEC֕̀ !O0+z h:Rbjǖ{rl%ۖ!d\+roXvjڱ~7Zo?X%@~WF~~^1k{xOLk3-D~4Z^%h92' ]RS]& +[>u=5v|7oNU=8}Hu$@%L3A{cESbVЋ}'na: ?Y5@P79, qOɉ+Gg4';wkM^[0# +)pK:+ +F[!_!}ݷkJ/4Kn(,Zۍ!g>دn߂?ګ6e-Hb?ng"zHwcxE_$޹4#r`o'yaC4]֚FH8}!EVqXG?q|RT|>4rUZXѬ]!+=ׂkJR8}A.[soW,ڗ`#g*mKl[lmSNp!X_zw 5Mp0'=췪KC5 +lDZՒyP  %2AF5?ׄ55 fcN|(J> f7K`/LYhz[EFf4* mp^n *֌aǀ5yZ_6*CB}6*2g2;-g3PXaR!B&`.t³E[8~ɕE3$ Z7-Ll8E#`9#"r V-ehI==wIۜgeRԮد:jP(@9bRpM'HbBұq (NJł+˂elnű<{}m u.T[|kNƮpg +X lhjS|1:O }G'q86/nI 81zo~I`{cp|L<}-Ur>c?z1!W-mt%n'9><+.r)Z.<׶zL1:z}'Rj,/g㈻E]/N)!f +\GJ>i{WN ]}|L።߀/xϵeUA^2BeKP39@GS(VmGonai +lq{O#o43zRy׭шo)LB?\? aK^IJ']Qj ZQVkkc1~* (S^l(6g^2ŠyQ"$c/;sh%cihd^UiMkF#J6ջoe' +;xODduw޴˲[0f7HRQ^… O)R\gO?1A y$ J_|L vD +&e$xz7 TswPUOoͤ +yoXjBCNĮ6~R:Dx|haH_>3(lr#TyY8M hG|mv<+QtMFb#u5ehM:2oZ2l1^鍖SP6Ms{9ϧmcp 4uf|n&L77JVM&AfК00yqᙧ2< 1q8, %vD*}(,EKx~}I}'~4DU#(~glf]z3^5h>XeCS%Jp[Y Yʆ,)ʙ1.!uiB5a+ߊDm`A^.K)7I ([Is<eOL00W,~r| #`Lht;xh(}W{bJHծs2qyE)~C1(]C݈ %V +W 6w!7:<~D2X{,2`0'C] u-Fp &* 2Ts3/iv{"Vb/׳c:Ս;7G_veXoI2HkiL  rA*h t-?*@D"v. Dv0UOKϕ DX{^@"RYs1nUhKb>BfgQEɐ7iD Ctyuj'fU/L cĔ+ zl$5vF0>nzȚiۆ1 +|P#X^)4?o +1s]?{r # ʣ8J%k=GeI3p |RzI"hRЫ{ej;̆8΂ MD`Wzp7fg v,l\lD@~9lqOԖo Z%~[9H%ONGoX`Sk|qTCE_ͲBp'768r^mTFQ4\H7A QlUn'u^>!zH &!:3W‹wn#R;SʫᨫFAz(<:Rw^'5Q .Pg9 ߸xsܽjg5{y6,Q +uzE`Ti?H%í4J}0GaN)82!뎩*tx~}c~,MR7}+7Z4.hdr{s/? 1CJP(;w7|jV_%raӲB +;<3L?@m9Tr^󹎣kbV]q4Iƒ43/ptޒID+ 2YM {4݋) 25B@!ׁp?srpҬ,G'܊+Zxb~<|Ofݦ-Ť5]wr}G 'oG+Cq<@o5pɶ=br0kn@$g5mūgX (&,lmfJ~?X<9Jȵ=]uyl;ƓLVVHw}+d)X(IbDLm,*z Q=\;_9H:w\NV__Z{-F%a$rGT,{?AdN(9 9vLcQtYOP6Hz畎dp 8PdW0JVݖ|tE#[2If_0Ћ,Z֪}&^ +[x";4uZwL'51':F)A(r[Tta߰{5ߩsS:\øT + W6+ZOL7^vF}+n_GxskEoAAV#DD5"P+qm +mqUG8K6Ʃ +ͣ|oWL,a|뙒cb *1n +((p-jI.tVf btRQ=g.h?cv@>i?q]!zB.uv8<2,#]op'ȶk! 9Upq1L"*-< e+R|{gwR{: +py" FU,uMXqMY.;j6.$XT~\}7zu3Τ*zOp 7Hhk% +Z) +ʹm̉ 6JL}Gܛ( V,[>b?8YWf&mPJjR#T}{ U|O'\uyVbiw :Fzљ$W.w<׭R⃓>97FSi HIΐX>xv!H3Jr;&WV=HMC,߿Yܗ48CC"RZOwl!QWO@%{R]%%Z%j`Fh⤗#ʞY˃9 &93(kY +kb zfחA:sNA[vd3:,$FϹ ;ch >ǴwR }pt5|V '`@J'q JoH\CNVC~3?`Bw]J=Tz(QY{"U:O ۄG[;0b vqeBޒeiAuc9.AV 7-%950" v\ZoR|4Bt̜f[u?՛?.YVUGar9LɊݣ0q#pmY3LE klfl'6X 2/FN [-E'҆wA`V-Umk:֚[&pg'a|G Z|GKꅗ>ʇcE멈; f:1;J"*L`o1k%Y[^PJ/;tamHOQ:{n4([oyr-̔ed2QJg _ +Ȳ_C7έ ɓ-Ja!c(׈Hysw&_Q6$Cی9:Ÿ"3踂o>+w,ojou}+Z +L{ľ?T,wɱ14T w}R.tu\ԩ(à#nNː )xi%^lACB񾢴p芖[1,+#r J_f #{k[BG<&<ޗ(ec3ޕD+q,,ȳ>%nFeTkQ zj8ٴB+}˴#pF>JwV)MhƄ\rg?"wUgBywGJOt&4%]w!TMq@Yi&)JXe%îR Wx%x6۾3~i5oRlH}&C*"<s6\mbqm_ j=g3ÑKd$`MQ#hR Ks7'Zh 0shF{ XT7斟bk1%}\\9 .zikߩ_ϣU +h׆d9&UaE7CRV#bmvoRr$ٻ "Sr"Aێ+S(=2eeF0fPV ر ]u~a̙Z_ÕF[  j:JZlT5yiؼ@nz-ҿE cm ۳{qOȏ +ľz.c*jʛn@EI 3Bxr;%45, .ǵG()[e=J:z7}!"̓Cb>KUWh?uuMPv ;;JUG;F(l"Z+"jpGȂhArVA#Ȅ;Ͼ4IWFXaO+oH3'۩q,XBv͖>?Ao +PQϒPC1xW FKӂC+r9E˓#WĶgܭw endstream endobj 39 0 obj <>stream + e7c We&f"J!'+,U7~6ڗ!t`5v/|r[OSvd?+?e[ay젹pLɫP3'8c=v~9Ӊ|gPS!n 1giDVE+~jkY +h6@dR৿|[QMM"޺bkeqI5v-"{vrBcBpNHi<2nJ\IdTDbX o%,y nyMwf1n;]x tB_GnArD(+q,\EeN}CKv'pT!F,)2V598k3bORsC6M\ےND +וJb"o`h֜ŌfB^Z MigTQݷXÕ](QC +@G !,OV[J[6yK8tr12=Ҩͼ19d pH*]bCAUj}$jcRc'U=U#žz+I?"ڣnU ]&{@TxPPT`i1P UB+X3XW( UAM +k?a9΢q{D96Wzb!clVIYâp8K%kM%鵕BNk!:;E, M=Ny2Wm፵GFx,%dj0Sq%Ċ'Fi!W ]XFQ1eXdNH!%u!qƬ ~ƌ%e +)RH BSJ,I#wKDB8M>|~\CLk}7`0gԏFJ*Fo>4wqX7ȿlTxyϵ37_UN43W>88mvWeژoAb.N0+֊™ mwmY2G-If9tp9^$ԏIơ6s#Ys:;uiA?Zk!4@@"Ip[U,0-\}i֚ZSSѝG< +R|AS9+9uKԦc=$03$־6\OxJpm! %~"FiO=xV^Fly4H zO'ؗ1#" iQ>@OЈa'mmFPCNտ(Į}PƮ어&N`Y&UVmEW * DLi*IIxʮkULS#oU&?o3X߈RS<( + t@k9T3i*؈P&b +{2'ywyq o׷|:,BEL8=-vq"N93==nӧ1 &|U +&SѽӞ5 ɱ߁4](A\}Gˆ]Ŕƥ^ܾTyFUb) ~BI$ q蓍3r,t"L w`1cQG*TdVny^ I8{-ZFVmzYF)EAzhUfʚ"l5<+]f7NY/9SkrZדz!P~'uxuk;ǴI|}a|,I7nOM\dbsE)]`oSeŊoIcKc:qLǒ֍*F +`^k7_ +~˘-Q?/zsd ^YĴ^@HXuVE|^A>gܟu067+gv? . &99~v#R^v(1aDj0PW"?`!FսZ)+Md3W%13qlG9baޓ!+bP{Sp$H8@._/ {s4qFZ4KbYz{f&@݌(6pr*5+c!_~NCc%feȫ4xګrġެwC5Є 0Eȕ#u8|VyYݖop{-sƂRZ Uy ~^[yϨ41AoX؀FO݌<_o +swe"cO(zE;{[ !Rܓ)|:x RJz ڨC{q7MV(C(aRo)gjho͗c| +ڢxKD3z9"|Z4 Ă9T֣2-VY'ynDОߚR|I@$|E/E22A*pfN#Not5S'or2 H@&ȉ (Rlt6Y. Ҝ1 +8*EF`"ǶIiM넢 (- RmHRIK"@}qqΕSVQ.[b$A ]_QYxϤqzd>~Зuw' 0!&} gĈo[vPFhDo'L:D,YJ~r*+Sp]gJ}*si¨DOD`=d@0_M/"A(7ɘsoDxƙV/ *? gFS/b8D=˿b _I!g}<˵天!EXOV57V^% >P՞"i(l>U2$=V :ʣ=Rhlij7zv=x?kBYʥbL!D|D?{Psaw,z\}>(Խx (8x-=$BYJJ/*7kNJאho=4A8_WT9\<_Y^ +4I 9ujMȈ eGdM(@PWtw +*o1"I a PU׭TtP#Ә!e5"g}Pxz3"wfYb6)y:85Q{;,+|o, A`I_x{ϳp(^7- +AS\ +ν툜h8^DHk!\>Bⷋb{&Zwy{$zae6r5ANyIկػr-*?y7O4APp[;$(fNxHFou~]LdrUzŭ\:_ Olr'b:g;NH+*-4|sզinl +Ú_~uĒ6Y;nUtZ8"GS5= i'\)z(:7d] A"ř}щF \s{gكuZ("mr?|s9xqcB?b6pKųM[uqzx)]&ڡٙDŽt^fEqFDm)C &Iy>I[ 5 W, Gl#6( ?JRT+)AjmCAB/YgA*Ӳ`߲ꙢWDmot53WqղXo`C͆|۝\,](Mɷ;Lv +pqn +CGg\SSLfkAp@'z˴"S ƋB7?NkzA* p"N~'X2GZ 5` \@.i\_1K~pMzN {ФrEFV Zx׺1;2GP^gq5Ohz( r 0>P2ccGZ Uآyrb}8k>q-$x+<)p[_,!jH@p_z9AKkcL`נDGmgtT2g3d=f#jv@GY0uA3_YŞOIz#3"}0J+/Yq ŢmJ Y10X "kA"Y:fՠf4gHण }w=`Pq'Wr_aw, ;㫝n5;38D!3n#G_ _H%cоN7a+uPЫ4aYy/gϧU ~VC ܯ3{U39;h ePO3R7pL|K_jws';͇/; Z6)ƲV7zbq`5;y|R;Kzc^c˩S]/A~rԒuS:9bԏ 0pkfTّU%woIgsoU=۴n[u(bx@AmBbv] 璿 $E@'+q%yJAN(U+)49ۧ~΀ckzE:%|@Ӽ vX`Nxn޹F1삢LH g屳:Q4KH)\VgdAp5tx_{~i"|F׈d=<4w8jvez,C0*~F3ͳu[4WE&bmEv((M/+p4*5kJOKH82x(O8e}fȸ"~CBwʡO$}P ;d*,.'6$]/)) by?/Oji=?Ϯ0^63(pG%aE*ݲQ#WgV>A?m8Pqȵ}3=GW*"=?1ݿ@C7Rz YI.8t_qrlF|gI˦`Q#.Mzm +,.*{&o69~Q oX}Wੴe#ImcDgmPq5~EʤQkC[ P$R@ 38׌+-#Vݒ>FNu^L0f>kH1!:#;tLRF' +H)1?װI({wܧl3Ak?AJ9+cgb#p.IHg<>V.Rb5 8Ğc:à=A7ec{:$xcO|1 kE }# +k횤+ Aی^4/$cD$'Z'eA@Ы ¡OE# +Swv`;#MaK ;^k7%/'^ ژl~#|:2F.nNS.JZIͻlد~x,[W34S\,+J,g=MRP0E17XNQK0Z~X7˿HU'_JU ДS =J#% ZZdXC%| m$%󵵣 e[JL9(D)Į!=ݠ'n +S)Znp(eE٧~&.|4쏃f-G/w5%%dAώE)10f#mQE̸>޿u=lWiҢd<>`3hQхQV_5Vm+kO)m-=Jjs7h*Z}bLRvt\iHwdiw<͓c +W֫ίuh\{T;]9/~`X.bS{4vխmpWнUxOg G*)!tԙH 7W]i{ a/f^?硻J&+Cj#Evm'fd#v^_ P)򚃙zVwKqR[8~nٚ^88"}r{ϼq:z"?3;n{J 1B’ܡcz9\1Sx,N:@;('ƭrl$y"uK萝zU8 +Rm|;d&;#pq&:d% lS34"EoӲlH?j49>™jR2ˆڬgڸj*CqHE-:[G_s*KTuҁ7 [!]RdgABdnX.гb[{/-RN(d6857U0J`һ;k6(8K7* +u@EW|kޥeHcZˠ[Do%7kFSڝAK98猛i'ث9sO*,(fjqz>E処W ZP[BJFP:.{YN +Zn9gbf EsRemnm?mm@~_%J +d AF[ʈҸxh:~q;"1P{B2s<;cК=9tD$Z%#BfНm +z 3ղ/Խ#*Q'מ$r1yw0"ݫ>'kg(p>ꞈ8B8@wa~&BjYGtT噌?c}@h =g\6J>vUm+^].MzԌh@'L>xP'R#葦6P_[Ob:+"}Q%{:+;hf<) EZB?xFIG]$STwEV  c[Տ M +Y~-#["σ/Πb/ +Z + kJ+.:6~hŮZ_GDK C APⓀU_!J#yWm)grr CaO1ofh{Lmxɞy=Ea268)n&@Ɉr (4P\ =l\I(=C?8Et>a#36w O08BܺOnG\@;ZdSFmw8'tP50 npg?I=zt"]`[#sy>~Zmwd ? \.{a Jml~UX>p9',#<-gі*6>ݾXK{aթWͮ(E`Z2OVMBf;(`JJcjuQ YbWYT 'F:kb 9s^ЇM;dd OS%g\uhumXnu˞NK4Uᓔ>s%}[fdCB.*$w=8^(QjwnI|Gb; +J/UB3d&U59ֵA]Pz^E XQVFuj +7F0 elDr07}8 # 5blWR_ 9GesWʌBSĪKMĜ'Q7 H^x(OvI8^v?">GJ'MVt2_g!^iigFZ^R=ƁNlYD7;l{quy"3u|Aa ,w|VY6*&=¹c=(^+T̖> zcQ'*\ďM_4>~~3zyJ[i-o}HV_X63OA_;jpٻݔkli>?W Ð#՝ +BQ!m EgDMA,ē"! .9<ŷ#*STAET֒,ru7o8̱/SfHfCxD"*].=.v%[{ٺtHw 5; +Pd&Vf&|]ɷmRx={kW :RT77{fHs Hj_;Po7Ҁ9ަ*(\u%{pIo^b_m%Y3ChD?vl&N; $)P~ Ӗq'4iw]Pب] /`N݌5 X8ؗtќV&E!>RK=oE5GI_ӭؗ{]."g;#ob|<AIv.FMp.'B5$rB0jA*5!FZF\1pў>aK 0 A@xxquSNFdP-5#AaPdT\ʘmX1^w9wN%|lњ!ݐKM qA$:Tv L%3:0ϚZUÓFƾ`V:^^7gtUW:32Qgلu!*sM녝ɀCES@763ї[B^z9cr{HAk~ (ҙ"b8e mSGlmLy Sͣ;g=!/7LRK~ky1GMV-ޮ7ΙUw){ ,=0~t8V Œ72A%̆H?1}~{b:dSi 5v9̙5]c6Rފn.S2c餡BZ7̅i/w1(ZOL"xkMYޭG"5~LעqO:fbs#}9Z1X<IlW |‡K3@]ɭaw zfk4Ǜ~n@I!ba+ QCZ0 N]X/Q31 ;\z&2k;ёۦBd~ `跡IqЮnQ}UDH=UԱ1gM-Z'F١^[?cR}7#=[4}y9dz>_Ê?@#'7*\)Bc÷y{c-g C2PjCi]+0VD~BHdК+8b*1Hҵb +#n"pVGA[}';66<]2YqUShԟJH +xNoi+ +3j'_'65pM{Sy5bXnZmX!]uˊӜkbc +cN+ εeN* kF of l`_w㠩#V)Mai,1@w}#t\Be~^zlk҇z6E:}ڑDsBI 0w/4'Be`Z5ge{4֘Z?ʳ:a9C_8$1wbO69c#*jS5>fU0h!:#9#Hď%,BTNi죶`Bx2!2W;BeNG]#͖9S8WvY5#L-aGdjz&֙ێ!W 'dK:q1F1%g[iߍ?VLȃQnefP(|ˈ b:{Y @yO_?\EnkVd:eO`LĎI/a9񕀁:y9A-ܸ[ xi- ,΄ZJajU׌RMRªY:SجYUH{ zS3fg$Y!X"N% 3+Y jtXMGښ={*1YQAILr[D_C Qϒ/wFh"c wzɾ\Vk'喥:ZGnzG3@^Ce%z<Um?gU7|4 8~{r=̐!ivݺX+?r_Rx*!q3vI}&<{K~Ph\5ToJb3w'ْX`Gs _$@d; x7t>>T~Ip-Njp;aaK=B:2HRM^aZ'E٦Z+u⟧&{o=NߒyMyI%>L?H|28.n;EO"iI߲`(S![]&93 + ܏#v] +2=#PJ[57.Q=Ƨ0{Phqi@=sX[`&vf:5= x)W. AШВfpb+@=] +.&\-ʯ{_2MD>)DP)>_%oR?jP|qdgDUh2շ/dVVY1Nj3'oi}*x:ű5A_$׼Ր5bSyV'RfC>e9ќ$ik%:g9bR|eano=h!PGzY_IC>u =Pg µڔг6_d? UaIXYal9H_S6l]E3۶g~)-1GT-qT +K`$;^t[FKQݐ&:ntg?(XGiX l"geW +=ןFW6/FsFn[*6c!` +[c^Ӯޙ:wwF$;wlFWҰ2gMY`!QSH2, 9B!}A%&$fj~r.߉6Gи\ݱs` 2ڄ*_bptCmpY"zQr7(o +fv?iS)(r 5xŶ]~} Q[ @AG/ט|JK4Xyiܙ::;t%Tv޾2 ~v~$[By3\l+dC:?1WՈ UEnīx?T[07=@%sɷ)=t|eh%~^I9u .6?k3{ΩJl+mڂ ̳t5PvGy婩v+VDw +RxN+iک(L$:TFB@ c؆wWh}DHG,HmdtB{t/gi>W#ڼ^ms}qyOyLUs H Z $y^?L';dkV^CqK ;T>XxoS?fdI n*-"<eRCWx ?j| RNm-CG\7TIqH!W*kc0YZ{MF͋Cs^n)7b#b$6By:oh\4j}C$bK2 +[Xa +Gк4<9o1AaZK*f +}D+0G{d*=@\r?ooaTM^4+~:ŭ_KdPO)d(H1¼{txRD?~.H/!XG1xҮi?>KbGvIMޮF%.-*.[m*׿dvE[g/޾A?NfCIEB΁`w}C + C!Cy9RxJ4b o*Bh]-uOrUAw?@{I؀+Gd7u5^{<>u\sT-Zb !ztAʡ·/ERTJI Ōdh[sڑF7 c)(Hi9O%"(Q#"hեD5ZkgKSŪY\:ΠhM,D$2 f~re/֫q iYų kz,GQ1D1Okm 43b5[E ޙbaÁq;]Em6׼Nz 3>R69By(d\DZח]F~i~wRAq9adAh`?k8 P$Qؕfyk5+%KQ‹_A^4py,?8!6+RTGxF]|< q/ u3HNhRzZB<=Qh9YklCJF="{P+k'&P2/oR;rzҸlg<λx!pR!/DЩ8rR'2(>e񨺞5hg_qEB:sE_S?"AxRWUQ[λDG$ W/^QmUFp8. B'h#Or wl!$Гi`QD@Mޚ,U.6֫ a6:oGl+A(Tʴf FjrL̝7uZƙG F"K0CBeL>vJY쏾Үaik„FL㨤MC޸𓩏dPi_g@n <S&Jz;2)e^R]oyx:~~}0uVb$P61ն n2`ԹXUy2B@DoP$: ̴+NhM}oUn.`? JnK`nO$_ q~NYv≰5w5#haBZ^ dGz*Ez*J_kNNa&F_y7|;cD@BYlCuTihKbR+qʌeF+jTAgL/|Vޏ~"{r%Ui4EQ0(הdl̎3!T 0Q<hTU6tqm!XX2t)ht +FOU`^s<ܫ9w@ơ>]˸A-L4XSgGbЭ;p>@j×mh}N_>δZKOp5-D@!3Z"juYo^ɏ 85O]=e, (mh+ӷ;ߟ9tn$R/j6Fz1 r++qȼs6$pS|~5w).P?_IgE;c&!Nۯ=?wS.qp * TĎB:3{5zG"1;9OWRNq}%[r0#[, + ؉S1m"yhMb7!ӿ[E`A3K* 1gI`!!껿Sz+M`#8Bhnג |:qaH{f= o 8ߺN]-xD҆Z`-T܁b+ +V32*2[Ҡ;ҰvB9n^c'n0YPw|wAx}w8ID5EҝSJ'ۋr6u-a Zi 9xA7u`ꩻ4^fx!*3@CN: +뷇}J{`!mόyoPfEUmh"bGUt(>ٯGK&"yU˾G*d7SKI7 YuL1c +ѣ^=NX9Z1;`^YVU4CNIQo 5=Acj9ZfPrj%wSRjGy1| .w!I!x7YN@QL$5G!w{n4w̵@84iYqToq=. rض_ahN7x"pDv-a2و%߼=~q595_UUM>NE } );'<.QaS'd̩ 3ǐf^G%xר[, +@{Eq<ˀcM)'u Oּi-HsnO5{`t#C"aӆ8o"nړS IP3/ +6]D~hs}^ (撤Q){ !Pz(U<7W_:Jʠ\?h Qҫ!8;3G &:'n8,}ox=Kg^Z1ڸ,_Of`K>.ዣgJ5OB^ĤkQV=3G/2ڇ &?|w&1P> Ɠ+- W]Nj?C +y=H56LbIllMʷq!kv:jwϳA0<fZʋ!=klC8C7q05kKz.bVgΧ*%.O FO1eߪ|=G>X*WY}zƜ KPoN+j*ИWA=] +6&f l}~2oWIƞAP*ďG1#2C=*!;ֱg>Kv?sq7:ub3wQXhih[lȑ%zb{ǂNAs‡|'72trf>?<N[ +z7IU1=lS_Sw]8aWLOZG+fQ7'vܥ XQ7QqyتӯLöf5+;Τ=ZCs3g`isFXzb3|| P+,-[29'v/fPNgB~O% P<3Ij(c6 k=G=7/p! -dhfStba>̍q}WŴc%~']2h4?v6F +=g:Oqpm1|+Km3h'gNYws1-&iȖb]킓MG_l αPۮ$0QNRc /4H7]pǴs˾/'2[ .͛I/KWza"lC}UuwCD1Вծ?v@P\Q, 6 A$賃H4 ]k1VhDEN~|tc[k/g؀WM[A%?bթ٥/ݰCSp>S`vj.#p+ +"&IK1+^" +L,ߟ/{_(x۲&M[`]:-#v,)|u,AN3o?̄UG.ɫo; c]6q>/!֊!#u+gswx'Nq~)}b/! +tztM$G10#B`Sb. "G +ːKlùeN"a Уs;zX,%zK^rAe6tf c>C`!ǞJw &Ȍ0/!oFx#R}D  _VtIP@*Ji:q&"8JǦm钒:_g$>"1|3_# Wz q8lO\ ]J1pQ:R轫{* 3݈ ;H?=уxBR񧥩1aU}>wɍU8Z[rjlWJq\ tz|)*ev4WEٞ+5[QE?#-i@ZTjJ|3sA29{.tHg#͹{:0;1`+[q#{G|1ĔS6 S<1)^jz7t:M l(k\rN3qsBXeFk!-Mܹ9qL$>\y򹹏5y9<(1}u3Qjs#Qݸs~G]|^O u +SFb&5,VpRj97G.zي>nqkd2`[^f;<#HHM7WhI|HJ z{04rR1mwhܙD0w1Vcmϻ6x.' +1=L}ōoRAhV#H51=Ud }v__Y|H-%>jkz>ܢqbûמc9#,(j6l={U(5-2bu0Z3(F3j҃l7G5Dxfcp@He@DE@ug:̝h+b * +Qc}5瑮KeU;^7kڝ +XͲU^(Kg@r3I޿4!߫v'iQ̒9j<~U՗!=kX~]dk9'LkgO}.l m39H8 ~{f₾B+|Ŗv#bToː֋wx/|KD6Z[sc'?h{J=@e0ǼSHD1ޠ +uqS)n׮Ref^."Y *ErCMH9{DM/ة:j\ۯ(S_pd:o-xRE!5^vЈi{랱%)9mAr0G?ioRiCb#7_NC-&{ھ=c4g/Z: +A!8>I]=sʥͮ%y΂Vw>BIq_G*O^(#QɐSJ#9Eȧ)Uai9SKYNoܪ|֜E'3fӅA2S-p\[=1̠/e$F!avrWA뒙;2VWP&RC p߉?7^%3dphciDgb.ZgAr}*'WRWE΁F7V-\j|O> +Fez 8wI lY||~~ ['SJ+>TmI[Ȝ'Ѱy?T)}02;+M +^NR]sFY Nvg엄tG.4w{cq[u6 B}^c|@NagHwm<($vUtfR$s{4$뫨LoaF[G(jXeg?9U[< i+tyi:uM~-x}ޚGtuZ2r8gȭb^)fR8Uy_5"αؐ׸͔u#B_BJ~~( !E;,#rϠgF`A童!A>udhQ*/<y-.ϐ P<2dW,yK &US#n u1ؾ/UݞΦ_"1\V+,* ~X[PXω=l#f}Hhv/(w 6=xr%4CN-Ë9ssC1( k +NߎahIڣ d.ű&RcK[^APW-8#%|_<˴ v E(/xl)a k@AX(Mn^ˋa6{ˉ!M6Ԯ~8[NyA3]kqTpB6DWCQ.|p% CѷFѥ`4$2I݌Z-=OQ9uψ6@Cb׈{:9s~n -O@-tTPK!:ѐhq9Tg*gHWl% djnt IX~Av6*t0ޣUh%h#gٱ^QuGoK̠;:W/*iSFAB_ϙ^Cĉ4g$cR\;׹cSj+bVU$bA΃6e=h˾M@HqkyG`D匼.i.pMUj#t͹KIF<h3h )MD/G`WFE!Qka[eJd),oZ*Z1]6!WT>qh2 2[nM*fxAYJogp7ʗisV0x/Q^:[U9'SR$QA}uKlh`l=Lh~Σ8LL!yQqR%v&ݟ7:]h.}N!=!b|rRsTtuK2Ӎ4])&!Z$*$9DO0U|xefu;ZD$({ev#M?[okUP49'x ^~moRyߝ1*N]ۻ$9t>( 8̱!Ky5{+F\WOFq/D7#-g|;=\"=J8ylD%XJB_!hF|i8'U \>2 + "9v_!qQ" 'z3G @v!PF)rїiSt{5Ȏc480l郲݄,;ScJNo7xܸtUE-R^;wCYdOG\:Ln} 1;y!vB(+Μ&7%{kkxj'EH>[Bfw#Ƶb|ڇ[MP_ `㸯y((:>wDaP/Nx%kT}jD"_^ޱNgw1^I88(܃w&RYݞ;xpN+ mGhk%MW8s3ZSmG1汼1s8Ajϔ'T?I?Z*\z&]#҆`O톼x[D]- {ȫިk+*3k_dW^!z ,-eKzq.2zN!)1)blMZ$_jvM媹~5Uvߵ`XZd[4My~ԡ)d6+UFh?7K- ? $ad?OgV*x=J>>Ң54θxB_gY_AR5NjW4- z8ɿ# _0cA`XOp'̈5I9$w_-hh2;{X)9$3]+3 -|[@!WXg)[ dWV'\qCK'zouroqΕ$|!^Q&`#k7Do#V|<42JQACKs:@˩g=[DdHwb8P@sSH ~~)hfLy|W~9Ց L|w_񴎎| 9)[@׹ED79 q~gi͟:NVF0HYi@ߢ PDx"eHbg!qM<NK-sKK2NJ ʑub֤pRݔoAG"!Sw]r'?_naIO]L[,tQGA +_qkfm(VP[+2- t1`q^bGlprlrmbJ@3oc cZPuF:O(yW0 'duQA%95 /S+"13GvPrTZ[Mc!X2}sVVqX7 G +<~0EHe˜v ?ߴ2{W"jW2])kPYލ5, }DjJ.9#g`#?bD?B~F8wi <7~gLr|v|^F!t0՚^qѸe1Ɲ"0Uh?w@DX6'NIz,UZ4RORpuk &Z:kB}MS==oNp6hIHfO[M5r0kS  [D4oj3frl<]ӣ|B9MԊ(B}g>A< 4z +* <x!%b<([&'2k"r/q`c)tCZw׉_p8".ښÁXh{ϳz*+jMh:&=; Lo|}xTU\!KsM!#+lΐm6 t\߶WHM gl=&paL _h5$wgdZ(ޠ3q\ x&]z(agDzϞUHZOĽ\r53]ӫp +[ҺHb%0=1vqܿ\AgI{5fL~5rA-Ȇ'np~ ςiqq9"]xcJyUF WU?-wڧJۼyb6{PՈR-hq"CSU?$2"6ļ=0 B7t|l4`^ -j5VȵgQh]%,7$u= u$vIG-97~4aw'Foy߅R<CC:V\1^`!Ӗfxyi6$9 cî3a&rMXcDݰN8kH mL- yĄYBנRօ@0զ xТpdڝަ+~twq2ԭتeNf1OtI^M/^5_r(B35#h`%3AԻc +$Jn|\p%{ݵbkcXqbnȰ]g"9==*!SеӍj Hn*nr|n\g^ kjNq#x>T_)~{խۘҢ3olEEQÀFS/v/_xח.\j,НBQҟUJUĝrzԙC&waܟܪ UȠf9D!WSS~q.&mh䷏Oz059lcUIfƟт}A$^HdsrAYt幆F͕?b< XH\Ȟ'DM'8C~40Skr4'dO( gw ػL6G}&leɭe?W>pUχ +A55BY洂UZfo?ٻ{b+lh}Z̴5)dGZI2sS/ ]~"P֖P8&X9i+_<gc8 ;==xE-Cj.*|~{TN!$Ɍ8/ϜQ"IWPdgr42;HjpFPydg1UZ@FKFVpы_C{otHRo3C#|zָ(/KTT5([\;|\iO +>,,Glc(~>1H +I sB +2hٟHj = MɎlK~Aߊ ^lAxH=I%\j qPc\\U,wrw@Km,SE4*ՔFjhxXɒ]^Zlvrc`ȩ!Q%TCn8 }ST><>!IEY?s[15 \2\ X'BhVMVct :?#AZc+ $cu my |Q+O<ǏL#I.Q{Nv-fADŽx6f!dg4fhHn{od +'q`-K2U hTaϣF)r)%`=X0&4erNYRnJ~ȥ[?Rr)C]\ +Z'ء˪ch +3n 6Zl+j$u,|`t_C%!x!S8YCΈVtFweNEz0>S?byx)cLE%/Q F_QtEʱ mzd "4q O~.fdA}bĉk y[#, +-I^eusǃlOf"c2Gֆ(c=Gtg֯3J~~0٩)C(z^,oטQQxTo#TvF]" +Ze>mKüj@Wxe +KRfP#asA L+J;Kj +1rPc*a_tnbq]KFRZ7h,~ +l#[߹Mf!Y%14jsˌMuRsĬ1I:EB z|*?_@M5(SR8bR"}H8˖$uQ\c`^j3 %*3*D2Ju>يS&D{r>papi55@el%`=zWCr8t"Fw#rI0/ɏ$&Pi iQtΕJ)A(he[{GJ1g>7o3Sr3;JeJaw\E[[6ƲDRqs z{i\%7*nE줛3z{lԠ<I95+fvsu3G@.7fdݑT>Em䫆[R*~>f2Au&7^u3!_jtDB!v:EG +9|WtEr9bmT +A%=fOȁHӲ!F9xB>]B(kCq=bw1#p#פX9~{<|5{uօbSq,jkȜs@Ĵ_pm5Sfz`cʙ,ZFa C@`S\դR>ɣNUߍj"m=&7ȖR(9@l€wrƧ?1xKrM)63 ==n%H*%ùĎ,EE6 WaO,?ENA4 0FJJ$M__P#?s-C2dd:V;T҄@HR>';݂N:):l @0nK*$>K (t-;񇝅1AB#`R]LoR 딱-@>nŜqqi$)CįCF +pRR_E6{[!;fpF|6 Pj_ZGW[pJ5 r/q0i3^%NvG--Uo +9Rɥ=*i!9׌7Gu⼄m*À&+jeis&)&ONCY9Kd_H4qF!D1Mh[L%h"4i)J8RxWva^㝥 +zO&K4̚QOJ9-g'㟛6b8jrEش6i^VB˨c.D2l1 `l Cv~C%WC.8r*k=5D{zCC;4yw{q,r$T.OR(IZǩVR#hzGlOHǿcͶ_~F*4wjd[(ѣ>^8Q[9Dya(JqǧtH;D#d]OApT#`sBQdH[& ا1bJeX5{[C$4N{3 @sNgd&+D2gDFO| fMݪ[Z!ޚ䮞4_̧t.ު=㣿LUX:mqNAAmTRZs "`~A~FQ } sK/Ak$a:Hi1&T燿бzOX!#g٩60XʝQQI]<Μ@sRY^[iчRnΩw#4#?@z?Kx.D"\Wj7U8;hYx~7v Fq3: 21Wޒ H4FK{!E6d4p u ԰u$㩜#h3VKWإABY`Hr`g/AҀ! 2WĠq +w7#GQ]-Ez]l>ChTfX<Ѕqh(G-fnmS`Ad?w!<9qCzT uЪ(SHDԬsqO鳰 U3yZG`׷ؚ9F\"gt_p!noP>[KITM"5gxخϜ*PIIZ(-!XyE@f8QG:Bdy3M,FQRQh}Lɑ<):ڣg91/H-:}(=aɾ@J%ώX#S,- gpgƲhD1n{^37Ay )~;O(},+E0GGKl458KS#D9| abϦ0\>{EC]ɛ]C]邉UkĜϑgKq ;$#-PU^zWNQ߃yZ~P*Vfh1VNQxxw!#XUPb;ouآAi +"?m3t  Xʅ~!ҷABX"2y) D) N&huSGfB:*c;*\ K|z/%o_2zNG=K!@+XHĆZ jHw;m !y|߲^ꡐ8'Yf>]T߇**5E 4F[1)& +];8 +ǏCC)/iуlJ;SGoj-\ __~nVJأ#;AR]J\ :Wܴ+lIX|$,y5$*ZcǙT,:ߛ Ëՠy^T[D;t87%3PGn4)V9`XX#9t(4;oo_(/":}Y즣 *in,nKM|?&Hxv6bMftPWgS4W h]ih*2_Y6Q ]0Cbx'M6~sķ!\!5f!hGH҄4##5$+$O(%%IY~+Ư.ԣ:qY Ww{"J)C:\0$۾d`KV􍂣"7ƏĚ4\ OWvCapt7HWDon_Qi(YJwvy +0~H9$n-$RlH<AxI2'"7]~p; If8iBif]aTÇnIi[*EB;TNlf!f7 9{K75Zbͮ Kc+I0چiDhzj5AHRZmCekJqߠƉU~T}E[cQ~C#*^d`-Kwӊ?E Yæ~p=橨 +1yfp>TKjlƧSsd[$!QJ/s/¼2s6IlrgʻHrW麩1 1lek60KBTkEUu%uRnj%N4Ilp%u6@|I!8QX8?tH" 9H"8wp;T)kck_%ADtV9޿W׳yPmt lps<<= hI@c(|CY]QoQ܀ sGCZ9y2OQ_&.WG<ˎ5سRʾ~?C3) 뮖.Zۈ!'>KZCfcVo`KM9Ʊ!씈z+NaśJZR2!5=Ϩ=#ǽCCgz9y68Cs;}~ƎTvqT;T hL/fW}=W& `Gܲ"ķOm/E犵zFOcXW;>vk+R ^C >i +ɨ1oDŽ5#?*pU/ȧ!qTb~EjW~&f-*XEC 3=v!A<7wV+D kC$cn]rQp,\PiZ\zKP̨{ f_Aya:0 EL߾9Przڶ:θ%/y ٨.~}UˎjJIGogwTF}~ O Rn+;7hW'gLn` +3|Wpϟ2|}{y%20 @u2|U6pw{5e1 uU8ّY}~Z=89n}}̵_E$[0-,6,G]F 8Qy7妼Nܡz!:f´=(/*>-=ٝ⇟R/Ge)شhĝ=CF4K q8|?˕(xJ!\2T:ЍHp6.pOlA Y<̥FBۤ1I ⽷{a`JSD3#.%ڵ/ygGbjNKo)Ӊ,^KOw +w +՚[hb0pP1y21|0hKwv#iF?ty0zƽ{Wl{s)t3RoedBR?I~b8m!eơc[fl^mYq:н‡--PӀb9D!hZۓOM'}tS4D:]` z0$('l#l_gn E.˹[YS␪YIѴra4=oG{I*xS?{d?bo|H +`4L\w[%O=!?Qbyn}hl&BH[I_卧]:=iݓ j~m3H?~Mkr&'37TWHFLb&v ϙ6C"4: DvSbu;paPq$|T +R]|5C", <|K"U3WPqh1vsooiSXڤvV՝HJ5XĖ"q(zL))o}F,dѢU욥b HOq}/2xqCޫ^eD kI:y[LoF Cv z~n!x9=]hBfn6d龲vs)h%'I<浾BL!irx%8S^c-T,g:T~ hG|sbFTm䗖Yjy_4%o'/F"%t+'zvS$hmw +x(('sN˓Fˌ + x^8!5kDP\Ut1eO3nv3,̦:ų}ՏɆJp۔IA'kPjcӈV-C?lF0r]N})q8)8:u=".ѵmz(Em3{^Om 1rF d SLu5u7SvOFAZ*=m; C[CC >qgRסPٹ'|X-EۑXc*ip?y.Z-1/K6&y +s~8r ڔi˵-M=kDUbSpW{p_ဒ#.ًS&(ؒ(Cha<ܝWc٢@? ֍kzuJmF8ͪA2:4Y͋ MCK{6LY rĝ)tq ˜~\vP %XrU+’-"ixp)TX( CÉG}6WJqL ?՛Iȕ&L9 FS:3J^,Z3y!ܢ 2#%η `+ ~`@yԽAeKe3^!faW#|=7⣠ՏڴRg\\#Yvux-X҆Bq4IKtШ>@Lu9ר'J%FA-'60FL >L_94]_[ 0l{VCd \97nvƁ9\L$N@bmQeTG}9I]W(τa$. _bpE6oVO뢬B \pON{9N8ލx BY׶;Rec~f߈xl WVh)"9h>Xhc#F!p+7~P>uysZ1]!vSb >ҟmi·~"SjnjobBS53ǫ +JnTf6VoTː_?9GH jnfdjg`㺕KEIB_L:tˋ*Gy#<[8wu@ "_˩ J z_CA /$7ɫ +QAL䌐3 +h0 >q+LZ?mAUKglBT]CFb/ ]Ap.j9⬽~^51^b,xD\Z)q@`<`ō  灈C-/heO{WKw[\Ca";3A,Er6TnqIu=?)gm!sR@!tK4kJ >FqF'2q%DoId\( +1U0v͑-CwǞUrGYCc  )gEJw,>+2\zTg4EhςU3A`[7 ,_(ڪ:}+6zemm~ҧ)uՌf]d~a[?IC]l.$tSʗ 6eOjD>)x'>Lxg[d:ʉ9d?Z*u%YCG~f⳦Ε둠kFx>;ֽe#+_rYH[Etqn4 `E;uڮ7t<TWPj4-Q]²%3(4Dˆt?~7ývL1bVqKxk~XGeyv۵j )_%@TcO]ܥkw3E6y#7ѽtY rUS g>oсLQg}h#t)נK 6us;|y&5R Gm!ߢq>!GQΉ+jk!#T< 4~xxPFoMSq!+as~Ƣ|*4b_Q #~ϙ:C;=MLPAi@׫٨ ++`!J`[qu=c?io3(x|55kI[弘6 .v&ۋN}dđ =E o`b+Rٗ:buWy>{ɧDUtXUw5?果t?QagǮPZ톚[4^s%C&'³XĞjb:'k^s\"!*殺.RWѴ)|ۇY+hG3.0}":kFken 8&yƚdB!{D?fB ?Rxd&]Q$R!o__%Ij +M/%NbrHfWbd{9Ōo4 ۖ^6_MLo{h},?gYȂ$hUSIϟIDӨ!'#E4Q1@b _$ +Aw| ԢE5 ttYx0~xȈ;DXem!V3^.]V:G] Ga Y0NF]uvn#\2OaI:ѣ~O-yi5hvJ%QɟiQ1v@|@ef0GҪ3Б|'NBI 7.st4Ek$ձE(C$Ɏ1΢cS+ð!X7>}/Wv5xuFʨ_ͬfB◽lTypϧh4졶Z~sjfb+P Yt'*g')D 0\'8<&sw S)d=~3e=L;|#RHNFRRW*̟g:Ԑi6alFKM 5cmpicīWit18 ѺZN8/ +-F ;#_qk!6Ҳ /KJE$Q_&2{dAO /nFѕa F7BSiα4乤ne0g=э43簎R#,971ux +YlJSuM'28HϚ>匸șJnCECQHr VڏrpW f,@P~ߏVnjW7|WAt~gY t˾$}"|A;G j}E(kg=[Ԑy+Z8&K3:n~͈y!wz~qTG^ϓ$'*g+ݥ΍U59Ȅ: g|֥vޫGaG "iμe"QeTJknv.[!sԷ'Yn3sJGD +7kF>td׃g8ᶈa߃U Q$ư^Mۋd ,F\Ѥ"3-@UVe?yGm]oU^'؍w(Y9wфXlɜN1.MEÃ)^Q9{qRt.Y nR i39GD3Y {1re4LRv% D3κ<^o?xw@hߖzyz=VF>GtʧD}9lQ{_ y^<zAX@Ƞ#jAo\ uٶ ; %)7ky[N{ +zI ϥ[61O@z|h[LrM,BiQr IujdYi>|B&8{yv\bLh}&JE\Gjv:F=R]@N=JwP H+?Jj}x n!U?!H)=p{c\x>*}Al}>6.buy:{E1z0Bv3Y/ Þm0YqyaL32TG_cj;BItzFVȩ߂== +t3ǝ`n ^Lh a3(D^ޕIT%E~&=i6㊙C'_hS:GAXq +!e+x+TaJqLr5:asU089~a(4s];_:tP/UI,Ś0π{l^k,vC'_'u]<#W֏uP8g;K G/eDF 0a)#yx-X\T>F*AtA$l=S +QuYWZrw{3 c4ܝlj8vvDiu% B=E9ȾLFsƳ/o?❾Kjh <8Wў PBwfX 4!*s:3<jI'DH" (YsifȞx +=wpUgvO!-f`k _) +sa7`:45JH8Q|/tqW .xW +p:G *'a= +`fhu r|0LjNNVJ/6ۋqw|V7@(6CKShF7!+;4o'UF+:ީ Rj|s+d"Cft#@sr*?^%¨j{-hd9s)ۛiLjJ⪕! .͸G|t;4]GXr4bN5ϔdI㹐e]_r4ٞ#~x y_j=bYC_>`sL;$FUAY\.}^ +bPvE l|?*OU- #܉Ѥ7ӧ +1(C7R(>e.xw豪aH!:zg3BȓuXyNx2OgVIzp#Ƕ7["pLKV̈Kѡz>F ru+G|y:ؐ{^̢ԾhrWYNgQ!x5,d"30~5ܡT9,I&ATLEk=n}Ӕ^qhMѷ̊b3ƜI"(7%U#df|Q9 {/LJ~OZ%Fh 4U ІC7#GuSrd +;Oz;_f&* +Tgh6(  m A~xmP#G< ,kObuRYFwx7xdq-[ !~1 {sEBq֔]DܤW ] +X`$_t}rSxFe3U,/i@jpm#Lz(.B-Lf#! ?mrEUr>5U&59BHf[Ksc\^cx6ߘ֎1kX#b%gs+9 !=k̳ *:0ץ(ϑ9 +1¾+^FQf^I~|[_C=ZXB@+n. +F*[  Yx"n{(\0kwm)@h>Y|<>iΠaS-Ljv Ž/5xGšyt +Eu5ʕM?R"]~h)6< )kHCT, ,⓶2~^?vquFZ-;1Ty:}'X{U5 n??}ۧ"ނ1mBD]=HŁZFdS5e})"66Y7躝L owa_էKY?f~ ]hR3|:8SRϣlku]u%X#.4S!u;NxCK1,3?QS}B%KEkʜbҕ"ň㈟7wd2Dq]ǽ +,XϷDNwzF~`KݡJacb˽ھbl\Ы`Ƿϩ XJ5y~#g^T ۛU(PG8iB0"{TkibgPg.% է:W}N"QX1?a̳H|g[qr0 +kEU H.;W+eAӖT%N\ayo9_amhRTm]h ĸ<͕̜`1eX*LeFxCm"Cs +;?>CAvtPx@Nĺmx+@Ν D9 q"5Zb"E,}a܊D%]3#L:TNcUJH*V4Z [a(yb5'@_|%CUex.><頜-w?~E"()7f bR襎> ($Rjh(]GA|/?Tyc=mHRi?1 't\) }ш,PERY>w Hd"B-J&g43Bq'_>< ׫Bz+BџV E;U}T=?v}_}3+=:_dVqٜGݎړx~GGV: 3s}mlqًB1k?O=^rlR׋% ¹Qµx&jVꍠbJmT7͏^e.K~mSyAng~,t,X<{˅b<_xl#Je_tF?O,3({I(٩x&} #asGf*VݏXE ?H.K=,/D2wHr!C`q{&vF]Z>1K *-|l4CRn|R%K5U!Qk36bu/i,'|OsMh~Hu(Gk^gBC.\3o +'m9QkHf~鍝^C9-(,>]=(dGr\-aCnШ^)F>z|TwN4sR5n#R J& _C uQ怅MP ˭TǚuV.uGtP^ڛçk +;eQJ@uwu3 ٓ{M&Ͻ5Ayr.s]l<ŻUawضxIDpsܜ\'+pym{/O0S]2^s~DDXڃZE΅GsPKH:׵.e9kנUog1|?V|l uGL$YIP2)5ծGS.Ǥr'O"~W_c+2R13ռ'ʊ3 kq!W> ~N+]/I jZ]!FWD;CD*G>p;nN^M1m + gҎ4Vn$>e+`OƑ&7Ic;EoE4u-OΒ&В"ڋQ`ϭ܃V 3 ,ŏ%gu:ѷiNX;Jho +2 +Q*W6muWJac%ŀH\ǿn= +U Xy9\͎(1?jeaꩦ|@[p8Uqkc-~D5ՎW<9WR8ܶQ47gGW/٧@Fa-T8ؒ]c+!3dw=l/-h6 9X E\ zƋ"2Z-̟X *Wꖮru|P('}3Ms’K~ v;D@W$<dTE4.*܅iQB{rWKZ(qD#g*5z{-`bitVh}0QOˠt̠sEHo"Pz}n5 -VPm[a]7 m +!9J#͉A,¯MKz `HE' / <|&+>ݍ%iS!-&)ogX,Z7})_#AMwփIPS–Q?u$8=H#k3Uz/9?ʎe:C{ƙ S8R /] SMGNn VgBbY:A,J@=@&B\n)Z'2OUEoj/"OxQ;}F唬>ҞOJ*l7"u/3kd[S>Eܞ xQlikwzxv7%c9}468BVs}?|1 +ćsE.&0hBb F%E@=d(# W8<!W` EǦ|ȥ`+j+tGh`E!(= (λ=!1gRkI-T-!ݛ9BE=2$G*#XWK罞|FOuʣ39JhB/:oOMWsN[s#9LS0~Od*ֺ!cOE&É6RE/z sE*;RTc JBl 9;p&DvI{U7v rEH V*77g +3~U{_ $ on6F -2xGZ܄ׂo2aՂz0k!`R+4̸l|=0_3גh\ L.jP%caT m:aR8aUip]@h^Gr-HmD8'א sץ). >HHtVsKn(z$W<l`$m9hArU-+㖧ʼ(hאsq;:Q7uJ}LFa/lrwWLy(~2h?#uv/ջ@W9,^bs/k($B T\kۗ +>Gw-3p{pt$NeBͿ/ջ.n ۊ>Ewk!S4*]ҹFaP\@b?!&t'kroU-桖{nC{8HM!$9 ݺqk*(9|F|Πs{WWY%K˄(\1] t]gT?; -ga ks E'WJ=miQU"cZ vCAgLwqW3sH dsXޥtgzE&3ǣ:CTY?p'_zJ-rTJ3ˀi"bʾSe= 2Cǃ^U]cA3Ĉ<ɋRr:VcmHvVeBu_ԮfHT,21jsDU +3`4+8?UEsDX6JR*Ҭ;{G ߈`8V^6*XH҄Qf?tu%Pɶ衾Ⅼ'_}֜% J,(m3C-pk01 x/d%ƵgdA.*o%}+rlUla&P]&X +t/eTÈ(*ۻvj4S#(|O bmng7$ƪpS i=%+W q-T'Z+*ghrs$XWH -:ʍwT^11zmS6: +gN*XwL.{h2դܧbѪa?*QlO]2jqIRO;}M&27Vl&H+^¡# sCxtHkz筓y(ͭV.H`q\ІS;Tf5Tu1* +Io@oe6D: TBrgiC>ϟ/W;o-8dj=0齡q4m[W\Y=qRWh!_+(|k0 h\䖓}}uQ+g|=tmQnnwhcT;f}Ư|]ꌱV`Kgu5+jsxp?Ca)q9#Rz7_.Ք샆N-|-JNM!ʽv&?Z$fnjOearۚW7w?'8}jGԇA{ZB¾GfC*0[Eyˋayk*nrwjDhin(i) #9%@:Q8׽'ML4N]RBE5_QAQ&)FT(pľ ؇ Tj]ȼD0ފ-cMc)~G J dmLxOizoջ_6U%=ƚ^^r/(h2ۿSx^i 5|X)~9-H#;92>U,-WOtU-;y_5m6N^;M$kVĮ$T`.Μ; ɇ>z83#|Mx̊U_8Dp)IfR'=!Rh_rR>ls!kxN^!)i;u&o7EeV3CAroba3},E5\uhz#cK+1 $ zڬC^?[PR}%+>: cd"!uw@ +\J_N=9yf(qFK05QXFZ zK>~g>ģ=c$be gSclm@rwA+|KMo@cJW* uVG@XZmKz&L endstream endobj 40 0 obj <>stream +/R!8+oUKoʝϻe *wDhpƞj.e-J.#w??Mc6`3 ^˶_yR80wvg1go~Mc>(0Xq:HxF{f,+?C{M=>()$5*% O[LU>^;P]ңLuPpAs s;luyңؑr]NEEקQQ0ȡ}wE V(p]ގ}|9VNʸZFOzwVK=ݪ[60,FUDlN 8"?܎Z6K^ص7;1:0nSzW?ŕIq񞫕)酌VS*/tjDk$CH%Y7Ofe#ªM7~E@Dz}4 |xPzΒX|߰xaSȼwU1󃰪!*0j1!@~#=3me8k<사9TmW B $FҔ(?g/'H( r3=*U҅8zsm)NJ#Z8EkDÒ>[r{FeO+AT$8[IS#x;c$紌 Z8o>T˭VQϣ֖ScɁpVvAѕQJ ~bnqfDxOԖb5+˧@jmRӽ;bDѝԛ NB憥tRRdS"uFDz h!yЂ{IS j~=E|(ƻGS|.b޷E$D%vDF}3щAY:׷'j&Hm &XbU+oVm{w^d|eŪ1'SRXđ٫sGl"O`x~QRI1Hv'B|Id?SK9ΐ睩!8K3꣪켋H#,ЅNH*Xe^Ϗ-BdZٞ^H)]u7s +zݯ9IE/nwd47\L6wNQADtZm)OO#Ό✖rX%]Q n2t=fus6]3*J_^<~-{]q]ShoHS#&0svJYNoΊx^hI Q0hTg_1ׁч1߉/!U(/6]~*n>ۓc1JVo+bۓ:̚P9߿Opӱ"g|[y[clJ+nWk<Ա=_wf:=:yvxUf{cTw50*ᶸI0Z6pwj݈G̺ "TPЫ7쉎xB8~M->(:l-yl {1btIֱĝS~K%LA%,)aPKW>G V|HF.PX"'FZy\+׼}4Ƿ/rn܄}*%Cvo+Q\8 w[H|R" h ފj"Ѐ'e}m∋3"*d1"-zHia+:o,H*[Ve갲2b$ z: А粋Y>qngw`gFt&O-[(jG4B2ƺc*Ūoba^~x,o D"vsG P|KN%.&80⁙ie:*:uJ=B>4E!w7|Rj[i*WZyvvR5ɸP珲/0;E]+fW #1R\ у}XHt/Hd! A3I1vD?wIC%y!SC`.ohAZ̀){+xLiyfIg +Kg1Ə#NEo)*F" (VK o]{#(/:>֘$Sz|VYE"t㖰/R~ʽ2É,rnzdXRTOAN$dZ|Q^r)'g).X|qh% v ]R\Aޥ\QG ~.NciW$nR%2ЮzGǻšR;u+Gێ{!%q!O:5|FfNQXG[:e5B3-Gš2i?W+}VAe +a$|Ncװ)o 1j\?3&S"^1t` /!#,>B+A;-wpvP8reup΀rhobWOͲC<\`,TΫ? JnN d`'"EX2`AQ;\nd2vF7>CwASbC#X?Pt!7F Ak#Ź/) apQ"cEuXrϳ<#TYyغA 2ҥ80vH+<)?f{`ZV)nC?4Cg#;kg`skBk@Us*⫎e" }B"9N)'0o{ qb6q*Х~_B6a̦x-#E#H'yִ tTi#.$Ǣc֝y2$>Ңy]7yp}TKi 26C}q:pаA-sv1`6ԼMc27# lz8.vj;ك*TzGFcؗ'hri.-ӎ^ L!+8 +~Zf掎z: m:`bBҕa2#7WҼtz=QQp%fg&o)C>7L˛n@?T3yZRPQHv_!uRŦVW|$GD傏c,řz5L̾NmQ 1⎚6 +7-C,^!D9SgRY\XmV^%E =rgoZP"Xι;p9NPdĜȰI(Oe^W 2vx䟰3̋]F$oEs6LKL-JZJ'B"C'MP-}`P/ۜ#)~Ŝ-Nj(5iXzH[2̀vϵoT}T])a!BƸ|G=NyK5EhqWɹ(+M E[[ +ӻDVا1g-P8rE"]؞1BjBϵEm6H:2n,=XW:!cϧog5 Jn+0#}dAFtk!-f_.R8ns2F/ Fv㪇 +eLeͤ$p:Se^MsvfT5=}Wfn 7;S)>LZbM\ԋ EW$͖&h  .,< 7Z#!HM[c|;%<2гr 5Owyv +ueZj٩mù=>m6gC9]-%K2.`7C%-*Do V~RHKB<{GPØ~BlKk-->6vwO&֙;~Ջ ˞/P(bbSyX,aF{@ Dh7z4^ܜtKq)6[i>4aKEd9D4jX]. _g綟XnR +J(^ v$?%-p@[PXx0J"6q*X&O>%ŬdG$DE}JNM\ 8$Ħˊ>v8[ٗ wӼSHVVAG[GkWvVYʈ@#iG*l=*5D ɟodv?. i1qh wq #쎷sOk6{<ńHMh0[qb+?d\OCF ! +3I+׈9KFEE#Nr}KV;{Tkx^!t$߼x9X! D8 fz`kCسzCk X+&_ RƩ4fvȳ(ɫ +51uq|@|̋ |f?װb}0Z UsC!m]t Z5ĸ֚ oBg|CsUܯ!;ͷYKkqp&1w&ښ;9ܠ}^O=.i{-=jP}UY/u)nVXgܪu޾T)?Q(Jۨ2Q<ծkn8b}3f9q3\P9DҚ"r1'g=l q1C»]ioWh Υv܇נy +੢Trdtp-%]u_,HO`iKxc=#eS+{X Ӂq4sDY8n +Gz$"[z؃OtO9Pp's3(P7>y}y6dF}+3z@A;&&>OmJJ*w Q<˞WMKEzڷߏ Qut䈆UL26ۭZnH3nˢŔW-_yk>@ G{(zŤ,4Ht8s W&on󣿦s";[z:C0՚jU K8%?G$KsuhՃ9lIz:,yUAgBD_'WfIX +Y|󳒼mIB0>s熎dᅞl!G[)V}i6z!>z}$~;ǔ-n '00ApiE!BϤ:VCboeet'B=a~q#O4۶~Zx%G1z8Zj܍l֥O;CZ!i8QmZ S).V!̈[k{9`; +&N{KqQOh}}Xܪ#3bJU&+EK&)"Pt/-wlCG _X+ GkGX]ҍu@-]d +#X5*&o_J!'\jdrQK;];†cd/JE*'݌'U@,X01޼W=nce)n %OVqΈ4̗ö#X9mwAaBN8ERlxL[v;N/X +5iءHA1M-+|_&py$kjIJt y]hX +a#."i|P㽚4Wtڑ8"brDFتobxfwUގzjDnOT.^z+4ݢoJlUHvgOھ +sW(̓+T8,iNq֡#&?3Ӛ[oy8˜- +KdZPQ ݗs*!BB)B cnIsZi !py5n\k1`:I狕A~2x_57wl&,%=WN\,aOTg> <'lQq)ERaTcFHكz`q#"o:sQзyr<).ERF:g#9=lR syKu;Y|t0}C̤n~|{pZN!{|Mdm1?Z3{$GA/wagAb-?V-1{jq2O&0SV>o +>$D4@ħ#i/`->,I +0"lh5YPFrϞ9Dʯr@30 Xs=~ɑu$S +Qd(=zh1=G $CJg9=MB KQ%SP3zpI +!q'=Am5B +9\l{-GbSWV-nʼ#̇_)yTڪ:1YvgX6YÓ0è{.ɢqWLA:]X=Xg]JsVb֔,0%q #S+=t]ji0 Ds-v\8XDbhR 0sFb<+u0P2cQ$UM{Cԯ1Tt ԋK+] +tXز}tAܮȊWգof@`QȜk[xX\JpQ}lt)\vRG/t':}A:=t蓻`?QBYA2Mϧ=^[ޅ~fE-_N.R7E2{ziWL>  ww+`LZL64@4(+A5 H| ZaW qYoL͘t(L!;zzh u`ɳ"˜X<Vz,jdU?ۄ~-e }8Ɵ F,L'2ea:3͐3v90S8y_ď *,"!dtMƱ j)½FcI8݃udFq#YB7Irǎhk%$\⚎?6_igfS[7`%u0s`3*[.x_Yگ9(_<%*V}Fh*UEao7HfTDezZCZ2G$Oae[s 1}¹|i|&G)hHfOm;F"5$懒R'Ysœ<0^X\΍I/~L*;sc vr%=f, xψ17Q|Xai y\L;bt^3xXL:^yiy} #hw˛摑ŤCvbhY,[kmSv)Z*PÆcFG ')95۠$B_}Ǜ{0z iLc[R['cqA+CcRY*BW9L?Gzz:{J"CvPȧSE +g>n?>$ˮ|4knSI wQ|Ǻ}z%\D%%%CK1|b3KP`}ȴѵ%_[砨CM;::9T +vF#sI9,\5HU*G-=&w0oV!8McRkJb<G|2o,{|9F1@iAƌ`FpMĂd[j~J61 +eisdJ8}?&U4,|]Oy +XC:ÓP՞Y9 ܥNW#O,CkSԆZOCµaRUV+ȄR&M:.J2w[JdQB)m떑wV7gyö.;~nBy^cJ0s]$Q2mLGUUf>}V4u;U:.> +HW<{Ox `-43w_.m覤^*ye) N9CԫW0Rc5v`ׄb}$< 'cug>=jV=P8+NW J3@=ӽ~%j7\o*.D0 +6S2Kf{aBWIzTٞC7Q3L"'^U:]%<ٙVflipZ32o +UiGdc9kOˣuJ$3䄬"HqX:%g*G}[pC +nH^ju/9/j4hnY)rMĖ.(5`P8Wt (b}1 ګ^} + ;I9=4@ s81El:ouT 쇮vEJܽ$K[A'0 ]ӾPrg߿!eHmIʬtX80kV]߇l0ƭҘSb~)օ{!2Xwh^R-6u9LbԧNzSlyl W7(Q`PCBgkܱ \@i(E61=kQRkPe%LI%iS_;Ith+>T.*J-ɏ_tm5 F`A`?XZSJ5+=!o=H*Y +*]CU{p~o7ah$&<Ϟ?if/q2~PJ >hMH;xk]FC:3Up'2Հqǒg:ƙ6Dl( 0;o$z0T0Ia#З?aù̉bavVQjv}58K7I(yqTe J n:*Qi;b$,j` iyp' +XvA3~<G1m= +;~!;-l{>e~.ND'<bh ]os.ET~pnYL !FR)BB +`יb"kcҹ0ͽъf"ԃԃv$e' 8\[DO~alZJ: ?gd6/PR0Í3^߆ߴ^v m5zg`J$|!§x#sм I4OA|sR*?ZYL#]`vQȠBZ:,B~{[1eJoXY ,u$1y5lVsG1Dzb2Io@!hot]^;ߑA;XPq%TX qdPW +u2&Kg.,V ā?_b|Ͽa 9ss:/{CЧW34iY^xK#m}?FwubgjT7/zmB)s +݅ F0By1bDA M.۔0  ai6MԼ-IlZ|[MT6g +nULl?!B4)J+Ⱦې*~XylwqU*l) b汓;Yr ,7M^C `."P cx=YmyELVE0bݎVOc bo5*-uJRHCGO!˺j*s]>U޺a!tp~ϻ!v[\=xKm3O3DNٮ4/U[:$zc?CN^#ޞ=):@XF@NS4>{ȀhɐO֝Wm:`q,<-zC&d@|Sg[B9OK_=aj-MuYx\g$8euBWb5s e!> +0 \኿ntGqq"ChJW6̼+Nn4c0FF~z[C H$9[a_N5(]:?hc(??ߺSCrPaOYj]u'J9A*QZd׶g^9RWd]@ȴJ7^o`$:2[`3YŹ&G}KQpŠT?lGDtHx`? sӛRԛ4!*ߢ(Y:2/#WEk;%~f"HI0ʀ,O7e7Q*2$bLb[P CRQ^7.'upS'|Bq{ ~jG&W/dG=lntFz$OdyPf~,mSgS]r d:NȌ2TlAZw+FF63+N'q; +[TJ v;7mn}z*!N^}[ |iA`]\AX zbT,EpӦG ,aO&<W*l CT G| Zb)O~IrJ"qh?.#A=MXcl|b[@?9t@UVate: NaGNW1'!--s7N_Id%mR5P! }BN_>q97궯GXKYcuMN,QXm G{i<ő*bNeReoҏy%tE&}[ +1Cy2E-J? +qz>AS`G1xNI(~Ж}w1 GvOA^t7Z坫m~Dk!js'Z + T~%A{ 8wT1j0N[iSa/gL$ >'!3U$wϔTGeྪ)qⶣ~#9jH7:AHƝ ـyTظ^%u>p5WӉ̵ZFKRI>JII rHKD:4C%k{爼ٖXIgE Ql?_XX\r5Ǯ@C7[t~%v3`k_*6<(NZWNd4 + N. 3W\ >dVV t !AxAlW|>T=v"fi90"Eغz +<_|KRo'49΅gP?\M[8|+A5QH-];f&"^n@oG(e +m UN$A +u.h?(J[AJq7 i GjmU~=QHo-bS6T}~uz%fVodS#CwV1x-;JNTA$jܳ&_;v%>%b +Z3 s$6xIyk{H[SMTpN186F3^֩%G@QeGƀZj Pڎ3AJBhO֩ +pgnk( 8oe? +eKbF):xkŰj/ol"&޼e%ǹA (h_Yjh>)0ruh2EF6J\Zr߭pKۄ@ĽA19EUqdۃCwMϹ:^(1y Zq&zso7mWCo<3+VUfr">] ͉ed]@*g أv#U`aj2YGc P= L2CsDi-&\d|w'\oA=PbQ .u6ZGUA'TV՚Ƨ{$8GEۺhTpiY[d围}Wտq3jzb_ >S+tiPn/اъ@·ջqߐ  VhO|]a}; +Pܧ[|5hr ,0fIHw_R +Ngy-vU\K.|Nq 9עۨ4 ]Z ,L۲=ezP^D7Ǭ=YW}JNW⣞#WA2^t\īŹsm{eI=JV#r2b31Xx=l?;M7oe|k᠜t҄iw=3D3'.Q>QOc'霃z/O0io q/|ociݍ.Z+Il[L1wp\ףlꛩN5}UXqr~lQ)wC]tVk_ +vac\}{yȴ8TT1x,Gh=j8'P`;TvTИ}F r #[A^tй mmIqt剤#ݜdS=E0o¯γg71̟iKA}C:&)6gT>c딓 11y[ u8`.MIudIǺ'in{O|g ԡnM:zJ%roz3#^X 0b L-બ"/_lOLs8mlӭ_D5 J 딜 oۢO[mA ̈Kq$WfԺ?%bY:XM]#7_)_"wVn,t4RHgʰR[ @ phU93(xkT`㮕ͽZ# 7}G$mZ18nuCOzwNBt=]ωǼ o3<Ymxһ +L1[cSn)Sp@;kt-2#{O M(I^B߶:sݣ!}#0P#P9 Ҫŷ +PG +fS2 +拗V Fal4/<o P>GF Y!ִ3IR(C'0%F(R\p[9[C)C 6ZAE1^Gf{a(mHF0tB +{yl]DɓZpOrG&2?y9"\EF)jb> e>Fs>ykFƍJ'x򱿟*!J.&PUU{N9suJȣ o_ӯrAش u#_npǒl[9U Фe@ҕ5PC=H@lVW+wZӼ<-mx@y_@- Its@;nu1!q؏Z!6o'.dضPZ-[B՚CO=#X I$7N~v".롉+G 82CHBOWoqhult +۟J7=(LwzJ\-;P7mTRZS_vtDCrl}y c5+]t!Nq~ ӕ?W6Qic> ke$è* Fp CU1hs~iz̙ ᫨>;<Ϡb@-Bcx340Z'Cu]=$6z^`1K'|%vE_=OQlL9ߢ~dv0#VU sf$c99jF6/s6KX3u})b$-boeFhSWHHcn=A|p8(̃I( ; +CF[Gc_<03l5fB 08A70yԥcq3V,R Aw$NLsWiàCdK9臖T /V.GK n¢ r"#0 )wVӠGF!f8"O4x`q> +K酎% WLr)n<\][񁦉IqGFhɠYhs!jzjPAp4GTHOl(,y玾B:^Qԅ +HESu?0O3k!b *4n+qZ"$CaXH˜R('Gym z  +!,Ԟc) &Ԡ=]BV5}~韟|qwKQ UC"MjHw)qJ)yy WQ"Nt#tsUAw\(pz "o`,03_[9T64CJdDڨUH @hR戚G?-A02CӨ(jq|>; Fk8Dž},޸_߿ES>oU|e&72ϿTl2d+=3D/8(umѸݴX̹;v bدe$XOIİjur=9H3d_ʆg,YixJ'3-QW&fY|~DzZksv|2b$Z˫q3B oT)7$)|\+t~K]4Rj`zlo~Šr5\ me*Nln)<] \7)>I28EtczHsh6ݡE̠7ыn u)殫`HBX%|H 0>Il(z_DXjLIK B6!= n-Txr.=+ZRQ?E֡9)$7IϜ{ @UmBNmkn4%c-/x)UKǥgƚ ([򟰮Mt>3{J!{ +VΚpnnѳ_E"w Nct/렖 Hl"茊7wݩ + c #ޣ仝o# TG$GZXBϵ`lpܸ@"==Cpϳp +[gPCn 숫e!ži)m[Rͣ£Aƭ0sr$n醞@GAvJQ(r]޵LzR(kÕ~-,K[B(9725#1Vfh!;_Y8%i_L8JOZ5G-KL?IH6;>YyR뻜`U.@R4+HI pՐbgϐm;֧ e@joR8ˆ@UY4}@to9SkuUեh}R Z%nj3p̯i֏WRTl1Ψ]9΀@ \\X#JT,ub"|9 ]C k*4e%*Nu`X͹reiUde)%= A6ÃY_;-}-rè1C(tPXCzT~CnR*nN)M+~ _4@&Nbhݡ()xajDv;l'Yμbh@}m~ys1撒՛mDzQ\8]!TOʝO-S7>R,1U3)Ij&ɣeS-h|g ]# ȃ \nX86^%Ձ!Α,ZD}^s)grq#{wsYϙaю"0Ѽ[2$=ȥ:c(mR xAb8ߔf vGL,G1>+yUr}utyU_p܋t6+ρF ~#i.1xxXs_7@Ų6v5ۜ6^.awAwd}w@Fh%R7G̹8E֐ЂDHlzbK);IZsqđ2 B[0pgaes܏3ݳC>3s.?;&p +b촶x\q*)@_MduHx̄nbYoa&c.EϝHW魘;/ҍ=n6{'=Th侺E_3 mp LH(dF b+;/5Z*_}L''E^'@u^p^3nK>@f(ku=u +/9ڝP5J[DBe0]Y%doyvGLz/Krߏ'|сwG>iQŵ5YVAn%eN׫{H?GL؜X +$ADCy?LVg䶯!`t+/),9U'6%mv 1}>̢#"Um_]4{»G"[_A6 .ӡ'bÄz^%7Bx7IH`f;v%3Lz>RK* IfRIBL-K „7?[<2ﹽ%~* pZ%F1 gpVOD}a&5anZOgD 9_^1XKtp> +f_<^UG Q8ԶUVH'd5y\)Ít޴ 7 +e׊6ܹ}.0tX8[W#rH;nD>߬ B1)v/|# +άǦ +38ۯo-RYtaG(SgxBQ)&3Hh/%G·g N^`3)n'9S¬dF+FXV4v-u$Q\?=-ɿB`-wu2,T" }Ud/B[YیTsRoi^|>O=tLjʽ8@+,V!m_yjc{A[n0Oק:$*Ѥ|l]<؎@(vc/B6 ?*S6A-{Z 6- lH5BT(? +Lضh2TV#} <*Fh ¡$S+JiΖR%| H*UbQ֐AqKfPSZ*WUZ8j[T|m:}At4!,?mI3>AI|\{v8bP $]VC`u,HUzyJ@/t +7KJHk>{:pD9QF)|[ăw^<ж/h +^!>у?Δt |4}:x׬[f z#4eչFO xy#W!T Щ>9"_gъ(s?}I9I֏>o0M z$X#GFR +7w?aiZ%͹HЅ@~ | PAiOPRfn5&d4,eV4%k;z~[ K#࡟H#`==mmW (ڱMCOoG9JG155{1#|B=$@DtPz8rhC`A`}Iʼni o,ʆMz'l8VW9mAH0d$?&ElE?XMgM-sExha/A|f(0L_=XO35sHz3suTH׵<.׃Ujd8ENdfJqb@} U9K3o'fr~Ѧ`,3dǴ` /aunA0#tr6J$T2 o%//Cuif)/Kpuӝwޟ6[f@xR Wcg(^Qw +a:DȂ:/g  A׭G=)(^(OΣe(6OhwP=U&Tx 3hFyI qÎvM饠 +9dPzHRUxpz?NEqrE2 .Vhj`t\ g뀻?<.=wkߏcnE;\9Cpb\`;Y`(:8EywlG]QA,v~ԐZROo{)VAa;9x !rOZpߊ MHGa0K"yc:K$ UʸG4{Ik3?ؤSAJ3 M{GB{Gut<AG- 0z%:@z]d,|@3W37hdf$Z_& P{ G6G W& +Ps5ӥE=Z px3&B\ΧɄʶ;4vuZa[{LPy\۸U{W;D?٘\3iWI_^? +=`LLYMsNwUK|LM^[Pܽ-h焆ת 7"FBԔ?=IN##W0z‡Swzn15_ +Ea(JW^!?qʩW$n v_jD!XAR?s#&߷Lp|oGߌFa=R;W%O- 4B3N|-l$eyX\%KGo0!B4elI } A鬈oN{q醠0WxM+e{/?Hzx(wD{qF' _H$]y=WuNG@p_A[0)C=J\UCk3t#x*%XO>%bd;=1 udIr5=(nZK;V؈o45π {!M㎌+| dJ4i\D)yaJWL2iL>;XvM]&*-]񓥻ms$1=rajSFB'|E{b!kP^^ѡ;7ba%ѯhZeJu^j>%qeF ٓ WOk*xLs9`?z j4d#U)}sw#jy4=|PENGH-}u"8V9q{jӟ>p"8?C4yLGQC^0ϧ?kudC$M]p)AmEg#r3EsCރG5BϚ'v;J&:#d_yHʮ!!%T/>+g 5DWY:+=8o*Q?} 1V:dF1m)gOaD(~}CG;Q)1 ku%? Ey!UL)޽kI1`uʀfCRerH&_dУn?#&u_?7 +IGA/DӐhJSV& [8 i4?:Wx " 9]C6hw7Dd~>_TRo-yA +B=z**E$󸲛^bڵu^)Aͫz] 0B(k W'. 14,~g{i*ݵ~p֒+LHprW?q* +3Mb^=«d.npأU`"sTxz;¨Wܰs-tMGuR +߷< zOé-N*#xk$6 bWVjCzFo_8)OHNe񮙳`rT9ݠPdwxIzBxzÄH}Ḑt){GLĤ$3p+ޣb́5(\[w8Bf?\r!1g;SM #":A{ۃz9~t~o3zda MAm1^ȩy>9E1!)L9mey\_4(N&lTxIG9g)rɒgG+D8/4kl(g+_DQԄ垜.m]/0 L͂OI59ΨF)HGNkvyVE,?e՗8;>*$R' fLH:hݽ\q`O +5_4sY1$,8{-Đ\P,r x:J#qGMYeL;+;;kQe\;:BSS{]ȍs_ۀ$+ʳ)iLNȍ_8p}-"..u߃ɐatCvUq@KY$U;'` sɑ9$D>ړ Zhs_vq.MYOVK)@)MG٦K""[?\6zs5Cs$m +AW:'9ǰY*V>j&j?BA`8OFb BYqQ+ƛ&_S%Z? ˌ|<řuF'EwRx̠LhNr1&dZ@yn*]Nmn2;"JQE+yĤ̗j (M9$#/cNɺYY +ZMo>*XkȎEwlPdR +#'n9z}{/+ + +_Ī]Q2Ne\Fb yt1N$~_PWtU/yRa9l0*Y&<5i>?y +{cM0LFj$Quup+.w@0"|H[g7K<\j@O8M_LITa+Y Jg(:3;Γ0o w%0 ܟnГXrЧŁ4+fѳyC'=c$mF;XɈM>[`(at/1P̡rV])8/t@5[y>)mź_)ZlydĘߞxfO@z$RZ1yt,~i[62g5$!7{Շ] G򨭃 %Uߜ7KOќil\jg8wcSN|[wblv wW\j-Wo[as>Oqϯm!vQ< Fxf怏r.fwucC{LaMsғgý:Lw9 򡵶ȧP5UPfQZ4jKl*gTBt+R)IiB֓LNZEigs8tg?^>sdn:rfOx u9{uB!Mc P}+-ah(#9V=Y;~v p8uJ]'܇[APйE桤?3ք΢>h +4}?v@w̌}UrK x h-NVjýjOA֏RAܢ'HT#>'a5ԣ׳sBH'Vv6=Aicٳ,h:Ś!2o@*!%1"ò;"˨"T7Fz-!yߌƚ݁SW S{}NK8z̛$D5dIVԏ/ͯU㩲pL~lbt _]Zsn,"4_O3,I$j<`˘3IAaU4H^#kFS·`Gy˹d]wa z*)>+c3ǙoG`LBHʝЖ`/<)"f-!Þ ^*CxbQG3Y2%j˛ΣLY-r'%sa-|j*Bcvp?:||G]8GG4X^Y'LN BYUY'{ "Du^9}viGDyQKത Ff֩/ +b]dz {>'حe!dB-yu1Lգb49 +ZMW8~g pϐpV"~⡙O/8/⼹X?!%ʻկ> +OĂ^.F9l +eB[br)n@!v[31ĭQYdL3ݦ;|_)}%2d}o" iα{i@1Ny}('OA֭UU7u'%74fjO}D\@+~.M<NozdOC$+N0I]1JˣhnE8ʙ Dl&"3 z}N(2WC6޳>xDգA"d[8]uAEM1g+/j-=M+h^sQzΘ 0 rג,㣿DdI"|=xgw"ړ^&ܗHҏ^ڽb} I x3tT89 +3#U,iW3ӊ"*->/ǡ"|.ûwBi!m=Poʵ{._~|._nF{^_ә<b=yٍ\>,Ὤ4 }D%+:Oab9"sH8\q#Jd=j˘j_N\ߣ +֗6NބWi].N-^)>%#"  +Y J~-4bD~3S_a~SYMF,¢[xo:s>xOKEaQxmTZڢgUzqǹ+2HoVrF$&l + +XD)Bi9UUr~ ٘谩A\)Wa&=UwGkDeZ]h+iB7B*Ǔ.*Mм5Q<ОhVnŅ{_r I_rPt(r9yliZ0$[n{5GaRCMx۾jl&Es¾Ly &T:`b.^˪>U(LdOIىQ$ xw[@WE\=!/lCO&f/ce܉K `qw1Ck*8aiù#*0!%[G<39\fZq%̏r@SYŻZ~ 3vT1U@H3L*X܍ee#G`n%NN- v<'qsY&vHxĐ}/eđbZ2Eս@C><тxz=IN b+ij4Xj9t*b:n)_)MX_# Ћb"a|#75VѾe5?VbF_GƁtڶ53#?˷D__秀2JX/YuyBp'Dmߦ+ XC-4/]=ޟsn;8#z1[&x\|R sy'K 7H 'za*,/_%'#!8yY=8zɺO70&^6 x'FaGy/TMZZG{-HQ6aC8ik*zEGV%ـ}RefVnK9,<JZY +tSsL;4~@nF2w 9HwP5CE̦qFD#2emo3wFhO̿vI#2XI^G~=ϙ; gESq' njG<C )"y\Gj]w^$8sॢ:/u^]&BLMPU_]ߘ*HB^CC\}Q4uw!<}(HX+*P'ޯUQ9SV DI5#/pE0HNJp(0ɴ+Ȯ)Wm +piv?)Z PW?@# y^_ f :pԾһAc"x}G$#&-M|bw'Ӿ޳řN9>?>~1ĘAJ'!5%' {<`U7h3N Kc79-1Y@otoKIй' T .sh-!&>FWF0DqTY˺m^̚"Z 9poܕ1Йֲ9;/ϔ^ZCƂPEa[Trnͨ;>/8f^op:oK^ۜ4 06\TDi`0}̏j8e{]M*٭FHG\D v[̌e6 r^NcVA9ta{ /.? |jf{o6@> ++t݌1[* 'y=Ȁ奚08m><"VCp:F( i?@GIk*~/OxɈ +rW h9E0OcBes+]HWx$Ѯ<b#yUhB9=jOj]:h]_Y'aKo`"?GE9^ +sh1&67-U҂sj0 qE7B2~ 74+kKR2dLaɝf8A5Q*کV4" ֹ@ bj`{ 4)!i7/fD&eRP]Q9m[E7r;b;מ@$ aĖ[Ýj5YyEĐ(7$U8QJ0EJ{0FFh7`,˂EHȑ̸~E^a`W9WGDiWTo^?*DY=~8A p_'Ў՞T:zب3"3jH/;3Zg +5N#{Yqv.=  '5uRGY/J|#'Iȍ(ҫ$Լ*rnbJ Y7:-V\xHU{[Mj:tS? |o¼66y}> t{m+Tl:6gT4kóq޶(~?}uN%DcurdU*xay|蝾u>48-P+O,_s1+@.W496B>eR "~wͫ蓃$)%Ó4r9tߛsF}0u_/~Y8^Cέ:%ظA˲7&S U¤,'Y!x[D[usm]-`1y%  p o]lQ 5dwed{p}(Gr @lSo²Pր2j@IEg=7U#n#6"4%F +tWYDM+ULk$wFS$'H> +<Ϟe }FMn9nU/9Y/t.b+B&fVFǬu{sҘMrӳnPf(krROHN2DS"$@ /&!" FkȌ8pk>r%~ +bt=OEG#ߡ[ u=֎'Rp `}8PNhdЅ? +`jś[vYQc +%3^OւqeEhs, 0@d#fJፉ-ű!WѱmrN|/1m\GT:`S +4qlTP衴ҋZcj _}MMRbg\{(OMfvRWE)PCsJsHL4tUqS^ wND +ĴdptW 0y+;ʊ3UfC #w-a>Bn -,.)>0P)8QrGACDk\p]*g(3im\|C G|e"a!z0s {Y|vd]b|$kh<0l_^V8Cr_7&̤HQP4 B 9UbD%_M6iyG'<1e \5}-] X+8^u>0u) >7D;D>v۳nu`vI0O}}k097̑ŷڃlL e !4nJjX>@ظ晧ڿ(O+rDI )0WzM䖚tdUFLPނX_ "'D(D:[l0bdX`0S-Sw3'-xW'^HGĵ#gxTxBj4Γ;V"M{㦆0HĂ==L(^{ ^XybUZ*45r{UȅcĘt\zP`JBXv=9#r[P>V{P׹Ɨ[ΔXJF*.zLuJYws S=t7/7z=Qoi'J^~pjc@%f B8r+^%w*坙yua|xJP~㠎!y@ڳ{H)"s~;3Z\is#ld7]R+hxOJz42Hj' y{)=+EC +!u)ՀEDW?E Ix"O)ۖb]P5\oC.JJ2HDQY/DlKLwcXkϳiR;2BNZ {h|i^:;Q +a8(ؒo窋U%ALvfPCXbœ[ pb_o{|5(5j$j0ku#9ro˒TEAZ sA^a1 uVe=ױU $aW^H@W{3411FQ +U)^=첅Za~X) _K'}MBɼ]Q1MIe3$ B)G_A *v3Ax YZ)(Q] vE=@"az޹dYzHRnjˌ"u-b^2=eyeGoQ8dˏB–"L/|@ڥ0V?JoaiAGP|RVa֎]΄ofJPd:yڮӿ%vgrx +;esI,}5K +o; IJې m(uC+ŋ)2Q(l{b5H1lqݵ2Q=({D)ZR + 7;<0]})by]fւbƌ+jgSLmEc9ݲ5!©tfzz*";F'JH$G̾WKjUf|b+<~%FO!$Έ2]CtU&8@n6OvOsEj.&E zPJzG2{p{3^,V݈$_Ԋt"f|DpRP +tUk681IșL40gP':v:*K:9n/#6,="r0XoU&_PclU@n3xE_/#9KNF2,2飧*R|9V;9;`%EJt6Bk>~edNLY +WSpTw{Ui%}Oyp-YsH$Kc=gcin{/>0 `I9Ls3g]O + /yõ"6p+ͦ:mrF;V< o_%Q_V?ΦJeݣvMsrZxy"_L=-732 錼>G"8t'$7ϞUf-4Xc&EJoX9R٬jQQvk:/.빎Fe_YCjb +CtKXPUJvৎLx; PaW +% +_2\s  Ra_r گ4Ṡvu`~gIPyi,m/PiaVs%_{іDRo'a=!Cnr_sRLX#^gPWe甚Z#YMJ*<ΟhLk!s7^## +Gޟ YwȲ1=<, \#C-~V^If +3Dd֖uPPϤr-?Et9Z_%-Eނ%}v`x!(,pA- +p <;-!DVN!Tdq#l+$Rzak4/o0pr̃}LN\o:ibQ*;lIx C']+&"N?1bq>g*u{L (Dl9Gz(o||c-#(ے?R[YS_̧7?񓞨|BIQL9j!SgYxv۽I!l8G6[dyLJXuP]u;͌` `C1dĬv9w F oF'9SJ K0Qnu#bzC$wm_Zp0jqsPˉPW^䎹_J~=}N1o^͞xodCv{40Qrǝq|ȋ\jQ.%7|=UXD"ROt0ExBϠMYt&+_eőj.b +=1e*lW쏆RBžM I6?QCILO)lp`7(c& cq|rjH=l!FI1>~Lusz=:4b)Uf8aYb[YwDz{^ɣ$@{yTp)EY+ :8?[dʋ3~O!|Dk +ϜϰOG-UDx*:2S񗳉x/(#H:tTʯ.6Y^hYp3Hsi5gU_]gӣ"G?KD;qPX5Dc2Sh3Y1hgTBG5VFbb^?t_O,S{Κ `%LFq%NKwhFB'bÒh +3<{V*p Uu:̣̱b \ٙ2^\d┽{:\}d).on9 AR6v,'#n7ၪ1Γi;o #6b qZ6p 9b+m%)wči҄7r0ُ;#҇L@ Jl3.5[m=y)wMv-:;{TZ"l&?N,э"T0pF7VSy|)u?5BgրkG{ÚVd<n-{ -9#ens'c<5b(&59-5®xŕណhx2bU0`/$z}gܸs3 ~lă ?VJ= +Z:C';ڟiASui?ٚ^Tu17m›̉ +]3eCi)\&&;k'|ҝʌ]%ePV!A#"u׎tU+ 3٣|gȦNy r U?FMV b aC +nlV>焓;!ܢqKpn\ݭT_9 lm6V]lO}+JQ +FV<*HEGeWg_~lzhI)}Aʢ]IS..m +Ō|o۵ʢ_[P]*^#NC.bKGs(C\y +Ԙ~޼W8`"d&ؓ2@[OӄZ[lٴuH)AM$y)k@ Ie@sa'> ?e~[_R  l*?M|FpC+@l`+6HD/b#ׁ7LK6 -Icx7IUھ?[*+ +eöDAҨ9 Ch$x Df<'pE*NV4~]}= {M ^H۝ԩ# +>?/ڥYY%an nd#w$'9wէ Fo~_\NecD1o=r'8{v8yQƜg/CP vM0W\Π| U 5E!bW>j֌8\:‚7 etnԏ^i-HE|8vGI Y["jJz6~FfudH禢0p qz#G$H[$XoțEkLfJtNL`GFg6?Co_{ҦL#9O#.HOly,*"G`?K jmpg]]\w:i?Vi|A^b//ZA<fw=V*XW40dZ.R'Q/9{%̗s}aۚR3-ʢ= S78w8 Ϙ4n5wgAc@}ҫ7^w$Loxk,~fYm, P8#g'0uH"j:T{$.z|¶h`:Ex'Nr!{~<G|t50DDfr\jK1ÒT'A lZLs! tw>ޘ}B[YR4u|S( PJg':pJUUבVess>q)ӵfB)7pq.Z sD%rgڲhx@Y{YC\I#O"")o0W4èCqtnjU{5+ FS;NF}ݕn+sҘ/e[U?dyךƁnqd#jCF׏ Iwȫ֚tU~Jj3{=o>{QS5$šڼ' /.ڮHXe/Rܓ(u' L)D.pbWo )Vm6Δ5ˍ-3 hDǟ!EߏO7Y-S01C5C]ќFOvkބ\eKX yTnr-RJYWFkuQ1ڶ[ F01Xz Na %LVO9VyV Л%j rMԽkY\gf@%l#^wi]Y'HDIfY{&Pu2O~Ϳ8f.qlcT/ľGgXx!i& qfFk5BIf^YϿ1w1qn Eo\Um pcʌxA<7_dPLF_1T R"e9E "dO垃Lb#}-:8}/~[3{ AEwe +mQ[D^>Jp3e87ذ#&Wk.'hl.ٟxU]eV 1Awdmԟ5rKZS^(TĽqCO @R-@ V7fI,½x*EMy/I5ͩvB?h_>xP_㑶Sah`cYc&8)H8ȇ~l'gk`uR3v\LkjZl[vFy'+q3l +fmNw ­neToCezI$ZϺtw`Js(Fz^~c[6]\Qﯓ77s5[:G֚\ĵ5<--D +`?^eͤ_EG?t/4QoDM2oLbZ<:2itѥsmK;c|Dl&`$*љȳ!~ԑ=Y=%m/x8CZ EC׈! 99d3MJfcͬH"[:'Mg!*N5rRάs@ka3O)I)W\r| IҬh*z_ɖ$ۢ+H)c;{zG*t0/ޘ5V ycO9"WS̓8shY Hv͓ngy/-P9f)IaV)sybaCڃҼ#SӛQq}=?/spn#JC +.̟nG UCjcfO$[k*1x^<(ypEP]gUnu*\Xg BrC_!jAcD'~бנƒ[XЦ:*B {.5Ӣ૚i{} L)u*nrs'V3k! +{_ Vz| 5uayJ-1描q55 +]hȒY=1 +Yj^5@σOaxH39A3vJڝ_.RmIORn&5'nirI)"n} t/KOY/&<ի̀z?Fr |>oRJԓ+iL,u eϤ6__uU|GOl+FNO4&s n׊#{q?GO]z ;sDrۗ-qNAQ ~z~Bߌ_ƥ#G5kEߜOϝy|B1T`[7x(Z>=4ƜsD487yp #f~¡k)v҄@Qç#-L4F\;ܯ3tyJCr+~Ips\a 9/SW 3<-l eum7LbrL-p;Go"\!5?):~ (:?GߒT!C9Ox31)qsvt"ae`;F5GXqirGoq>MQ{ +A$\\welܢn(GϢN4guicewJ9ZGEY.F[*qY:&[}= 9 lV2Nq[XmTC CFB& qB!xeϘj*bgi /~[lnbcB󬛏,tljy-.g4ɭnM(}uS[ظ,|#zJ6C5Bb{-ipA4Iia.8qi-,VEzG##d> JJ; gS|*V(9h>-'#^ Q?0p"n!mBsgKCf +:dg5N3e_LOfGzin[3p&lwȮCh0y{٪ h}$Tu$\ +k_f N{ gu 5EsbR`0R(d {:Ѥ>jFLׄ1=82NV/bF?HQ{ˊ=;HmOE3LeK#ˉu\:|Ox QU(4eCO`)iciV v+jZE2|lT) _EtCà \Дp \ O Ռ8cbIo[(W ˜2O, ᮒN#^cwN6zw'`gDׇێvxP5hCeFhdLCs ✀\ hpW<[< ZQ #{zҚ=nI  w~=~(=0ed#K*SEO1Y _~SNyvR^J 6-"<]XQWxz지m 9y5qf]UN6H#X*Jy=O%zPG`kC@RbU٨La&ni1CxmhOJ/ Y~'xS\HtX q^ty +3:Z486:5" W,CKYKƁ W7UTO9vgѝ{qKG,ޣ"_flj`Uya`z&F}*IFKL_,3u`D(D_Eo\w + oR3bs&>OTz6:aXL![qp +-RRO+l /7<Y{EV %% C0 +5Qد| 9l57?cD}gGH{]a̓*WLKV! QlQ 9 ע+CZ +kJx~{4>k +ǫNNuFOd<6ǂsyQq;}{+5+'-ԞIycC!T{86Tсh&ˌ<ݏ`AxR{jAH2 +|H܁"ǩ9jUx[Zi>< Lw.s&َ'S5d\ߨ%H^HXG,J"wM@ix%o+}&bH ^Vc/=oD߶N=0ѰcL[I(<|60v(dcOETZZ +wޞӌJpRs? +a ah'>%5p Vfnhrwk)`fVQ$9o&AnmqqRQE[YJ.Tc鬑H's.BIX4DWh)cბXሒ4Uʥ `&T[X>)tCƉH5R-3`bd~>D.cNoW{Xvm>IY>A)ubm?STb혿˾!jCLM%c[CaҼM.BkC H:Sq䣄% !"=x3f},= [RQ= @]Xt`k:t#SYE%Wq__(9ԩKKF` 9SPs=qm=u[9fV:<u[ 7WT́0, +3gߪ>(k/xs[jF=q9f7 ]RŀZ@AfNn5g)N9R'=P>H|P({O$(?G;Wa7rI|QSc6YWB/QI +tB=R.^s +-PB|󅪪Mlaq s_o'!^r RК +^}ցEYSDnDl`b%n=K`d_;EpB8̣VB2{cp~n`|o ONW"4/x0UrSV71}1Qr*ECNK ZJ|&%9 ~ܥkujQAb^~U8UhLVﻪ}!+:q YOU-bcᰡyuvLmRlsڪ7'><`35tk.dDanl}fC@[J۝/!(1V*'Øac$'~~\3a}F }wd8G79& j苈pgj? +]GD1D|-a/|cYJ)̷bFw^mm +t\_y b v.$h;DjXʤ~/`d ƜM X5h54ʞP`SwQ0ծY-GvN1\rc#10H9Vg5?:0)*Eڼb=?1ACҁhEEX2}r^j+$D=g(րf5ih #6R&4vfP#Q[}~7FQ=lW m|dI4%R(_}N(~OAgѸya yqd1ϝr4ߑH4)K)ϒ zEs>8x.<#A2=EӖ +(tƵʟ>)V_\9vRɅ}t%Kdmy"F-Bgo`_Os<%m[ui ~թpFl!>QTX)]QotKT™peiOI'x| 9_dGom2Yw8{wVp(~#-G7 [sKĶ5ZxB8_ $: ݗ3R1~ԲBg +z +4c5Sx^El<@;{6W+ +*V/O֊L[W"d/fzŝژt5tRTrCH_(ԑlÒpw "ً%o2.لL1|Orx}V)R*.̪H\?UM*j%! LǩT@}фt=zzǫ)ow&%ܳUU2̭:ԂK ߲rV*H^Jж<,ŵ;Cy4ް#nX7&K, v(QY||8}/_':O&~pv"؎ @pw@m߃:I0˛.B&|+yP*.Z#Ax6l&|ĴD)zGJJa g6]6B^T˸r3fY٫6ٌbLJ.sPh;45=3/srjE>4^.³~OB< ݈~ſ8I6]6NQ1kCb[Xx;b'` Ay,Ɏ_> S] +"{c@R?ĕ0O)jyyKENGR8VDZ۪f2mMyw5^9;p$u9jW: +w 6 \e [j:<O4b1}')aӀ%-sn׃<\*ze!m 3)W@gZq¯#G(zBD SEZCp] +2)HMԫtz} +w|^9y +nz6!Dp#A>*)J16,JP<{Q(-G8\%+%5AN:P:1ߊJE ,yCQЭ@LϺL )ȶx-MU&$۶CNkZĤTn @UN-•XȦw3YWI6="{.BK(ANe+xcz9C@:J t†|Q*]C)j&D#`bxuGmV&2b׈9Tozдie/`)EH3Ȫ%=E6ƥ~CZ/y_-"E:X"}lT"t)^Oh5 |xf6gjA?ۈ-'u7)KF({)[8 9)xaV?j"3ڣZCsq1Ewrb@&{SN_ $ :˥``{gQ@\?7TcIAǎmiߐzI wq'۠+=l8-d|8q*+gI2&|/<ҧZܽ~ TMw-۞Ҭ!Ù +qr`2=nES(*i8ӡ:/5(y4"v%цE7^D+o(?SwvL=x%x|ILdu i_jĊr7q_*'H%$ 8"B6#2qru)UD ܧW0yܢϹaYc+`{v:RtC`[`ܣP):Ț[Rz=,I%~1N>2PQ>s _WjdR_1tEHz##%iy9^29 `(wth="ZDed +5IQR!=WAoX[swU:P2{UJ,Ei]E{Q O I9 +qm]]J޵_(_ +(+G <$Nٛ*VsoP Nmj|KZQ6Aj2{R}mЩ_CnZ;B9Xߣ^uF ߣIsW~DQUys5.0h GBŖ3 +Cط}~O:'0:3Zh!A7[x4:.FK{Ap DFoc씰5 z4 Mt=zKsCQ18GaX Ŭ#@EEԘSs9Rb}T _|Sؼl&WX_PCFE3v)L ~c*bvʗ%TުO E50;S[fi˯2Swң +PLEi SBZ 8>*лh()gkwvبRJmgy`۫M)L4(ZWwfvCVȱz9g(]$ +(u׵>rDW ^FQ6̭v[Ѹ^J99hPe_5d).6.=Mvh%E{p0Hzw:"N׿̷?rJkaTF`CZ*LI{T&)p|$,țc !"X?7%[O? iq]y^!5}>&KIT!i!H0 gS#aki!G +I;տ >>F܊ 4@fZ:N6GXAq;F +3we3I^_L?; lQ'0i$潎N(p8<\d"mt[[3|ocpc'RMg{ts$-͵ 0=Z#2{왞(J4C'3%;,!5䎤יy$8gH=vf|f)L`!-^~z 'l!9ߝ-wwݼo1]%3T~.$\<_xf T(6xD ?I4gr=^Ov IzFEp=E<踮"E bdz.sjh Os|{7h Xiv<vdRH8_4D_Z7;)*  +7mxbk vJkF-pǾҊek0{tqtIV_dVc mq|]D1aޕ"qS׻ɐ;!^ԂH;3]/sqTՐ HWb}OtWIfr_5Zg8IR{FAE)oTi&+HfhÂ3͋7~mDsS:y )P {;v8OLJiLRUs'`ImjV>VrJ~9"^@'HcG`\|bUM`73F"&\ExD-T5'wGUC%$ttq;ӺFEF{W0C6zHw%^s*dSz} $xu+"h4oGM+234 6;u+luŴod4C"B '( +%us }U~ `_qN;)Tz{QC6$JF3~zJ8Ugjs57:=qjdf)"38&5SIljk:[7gXHK)h4񞡱i~N]/aɧ17 yy? ^<SBO!l +Cg+fÓHKBCV2`0T, +\ +u~! ,4g]ZDG t9}>A?S,? g{ ]8^ڏM@MZ4~gd +ejՐ;8ܹÄzi%=n;]'' Թhxil#ʋ(iBٟuVc-x_jPA$J~K-pE'r iCz+;U ((9"섃,hB<8{+[HT88 +@LӊnjgYZŤ_)h^w:mO8wQ/ǡ??{l\p dhAo3l–2k! 6sc{{O-Aף痾-KȆ7ބVD9}{E)+|RQ0Rȶƾ-caIuN}sXm:b\9$س|n(O2}/_=hwDsvJ(݄lo|ΡvGrEnхOL3;͞'NeX " <!f'xQ5H1&A~^g%8ɝSyh 1ih}*RKXgLn熥<2.:_ Txd@لF9C :pzv ]8Q:zQVZ"5P|%+A~+w p1'(_%EGj]~ +Ym㥯y)1[4?bRKv +\t1v1 kGP)U 9nZˡ))7s^u#xb3Hv8䐉䙢P|w%&{kk9h~D-ҵNev0 Ov>stream +T?, \jCd~M8X;; +!OLYV?8)נhGLE 9 z.I* A.azV!>$ӲN¤|mvi/I3|hʁ_%M4y5sS 2VOE>WqaN^"ȦܦM<NU/zrtχ&B=Aw'ڇZ\}׈;I3F\X6pvy(ڜҍ?vm+'Ύ-(v_'nAg7li]j :gikK^Ge0TVJ_jmW\.3%hԞ[lIU oV>~i wq%rk.s>]9D@-4/ GAQ!*Da!OcntC%}賺.Qˆ-\IR]cƋsѹސ *ny =&<>skI>r- oX LbT{anuS*[zd# x,@8܉`G˟q|0Yo|5bEV"`4Q=UI8$~l_i;/&/ĄNY;J2YKZ/F8/)4ow T#lD8s)Sju,^v QbϴR"N1m\{&aa_F6*,4UG + QHǬ['W#}\vةÉwuPҋGxH#bbȁ>5O#nTN6/>⣂ް qud)e%!L3GD'tz t2m6I1R3 +WvCND՚W;GX,r>{KET^q}|~TF +:lΓdزͬ>'v0{6_6DL[^rźؐIp.tN{s^GјS,=1TL 89P"T)L,[V]\:#>9lÙ?ݺ8\ʎŊٯ;`nH:ZqD_07Tp̠FɍG@BvpHMC^ݳ*4Ţ]qfhF{|c G恇A~l$a|{ exTc$sH<fzdϻ&L7HfY(R,Z]Hڕ?cm\8Ǽf9ũrO*G +YtuNnH[nȤ IItO^p!H)Z + \jZʄҫ0Ic0t PC;#=c 1t G&0rA3x&~M[>yh +=N-Nʥ"|nlޫA">½ 0~Ĺ&KwNjP}8p +ԏ3V=qwjMMo Eo B dNe"5Ӷ$͖ >ƌ-Iϳf?bMiZwBs_ƼO>g3,{89PDdA"Gpk%tz?Dt &rcrE(֝yQT-Ct:hz3sFoLK.λ :46 s~v܁s>`~y8(7%^S9A(Pl2)(<_<x/ڋAST'hq4%bgbA#2:e1˴T[&ZD-bQ?o%)P&= gpGFpX/ną66Omh/Ҏ+[Զv3 wG^k31.Mp3dS!U9M0sxGssOjvm xx&-1)wZbG5"}znU{L1Yg {Tw>b0K [ n3 :FHUcYg_IgeuN}ܯ[FiOf" [V7{;N唊M'ÙηlE1vΫ/fߪ9S;+7 "=xu`G]!/_~S$upe<ׂЍg5drDr! ˏΥ19 *l#q}ƨOkҟQjk5X:٠!2g+7kErȍ:V5'PlQCr+ RGv]O.&F@H)G Z$X0q}7HQ&U `31ߢϚ's:udv z#m#'ĀyN NVO7ª 9sbM*`RBEk>[Sl8}6ڞ[e? `Fq1\0>s!B7rp2aejuF%$?Rs(@=ۆ~:qȝ4N>ב8/0hIxOIO`eE4WC"~-a<#i(ZG(Z%]8P۫992DX%x +C:1ܽ$[cp&PaAd[]"/a{f{O5U)MY'&zZZ.J%G;+Y,}h=cTI0OӖpVSY@KD땞 ķVj<3*e{ql{AK!!2dmنHZwbpwbBO~12u7u:"Lp DF%gCL]o4,\L5ipbQe~sd\zN`+(A앯uىiipjNY=z5r/ +mG *[ 5g+H)nai(6ԦY=yLn=|:*r&m ^ڽ +l@ uEϲ Mwg=Q=*#GL2-B!CɌ^„tMjKZb֮lCtqRCgOe쐃t.%Lj$LF1젷EUd8@]9E2ҵ.S`#$$Czd3iEE)'اy0 \;qV"[(s~z_d8?2Q չq.~bfY6=+s3~|3>;p$* u6g*c{ tчڽJ'=SIhy_'DNoXMɶsT. +GV%;"KKp!KK]aXNgN2_d//,8[r$n=h^m}5l ڔ{󜊍oh{ qo3oyDNĈibR +Tkzjww@fؕ;qHdsk_AcҸvũ~.]"\+Io8ң|hGs>͔lLnjѶ+W !umUftOiִNٶ;Nr@R]Rͣ^nC?<~v-5~Q.w _YJ>C|WtkhO Ď5>A?/F!jO+(+2E!I/b-:5tmSs[ݛxZl!IIegY.JrIJb<[6oftCTS#H]`kpvu{Lu&7.w*(S 4W~*mOUݬ\F +%Xw=όጽ^UcBsL_ +K_/2d仆Ph<f`s\TReOkz[ 'Fd\sޖa;iƯ'հ6KK7bmN84;/wJF4B(d`aaD؊A<,3!^x{dq#a os LM GNuF)͓!Ġfk̯!&*(P#@ip;4yP[hZ j=CL +ҕSEj.A |z+Ԇ &)/Rk YeOs^^_vPb.fV셐`Ku>5FAmS)oiz.*x(D~@^3/kN`;pw{})6kJzn+9jqAUNvt│i/OVIg~w=um}IȷhL*o.MU~",x;u eK1zg[}ƇaҡN|y( &PɆH].wvDsﻨL JGn2pJm\k8;: -'Bk[eE5sVW5Ih[90=y/XeZv愞; ,N R*Ia;,Y#Տ;kNƄQ}2ϣ.+"$Gf+O{7=le)0jT‚zKQ/Պ͛ҀUsJы]#NhJ䙬(Kmsdq +v<̴7 HhGm}fDL:¿;?v'bʚ)'iQ(nID`qdfI0oM~8U@J?.)wJԀF!ங>b9*(gSq#\<i b|gkrެd0R;szRv3P“.41C +Ҿ +u3Fd )"O?[P; rZ %Ol7UTA}Nn${ɹ|{CVwέObNs+kC0 Ð߿?b^={oQ5æt'`CcNGȵ`kꆱH4YpoEW9O1l 玦.+|?2X:W%(5nCaH#ڒm Grƺ ZD:'4'ȃ=@E F\*xxV@*Cl r)Uk}w}-PG|#rjGy R~wAO{5 \*TIeN3^y+efȧ_eM$gK5Uv +Zb!2}e9 ,1EQ<$m[$ęY c Ik!>8$yC;"8 :]Co{PNN1f +,=jrl2:U;<4kY0Iz`tTMWĺKij ^Ǩ!6@&hAZ}N6Pw#FmIm?6B*HLd-? "a*k'^-_)'ѧ vu'jO@KVګ LfΠ*o;A!w$!o(+grѹ# .DJyDB2Dw?נKk~ard/HM*3QA[s#yаzU&vD_o|CWЋ,}k7^/b֌z x/xgjmX3AO0@f X?0<+ ;;w ̓gՊuI-O8zAGXŽD< +D:6I8Se٢Y.C[|O7U Q +K(#ǛQҮ![{\J뻓ص7}79͏z{sIvxa4kNI8.OS1V;/DW Cu/wW@GA`pz&E| +067+^2^lf}S5p6aYMrrC`\}jE{Mt}W@AJ 9KܟUҖ'{UF`ƣm[~ݕ_/u֤-ѧU"49y+$mѧg3[{v"y itdْoWЊu'ɽz՜O2 >&wd A]"?mOwTI+%11-yYͰ|) H]W̍vOuZbzQ0c(\r^ !%BtV%aZ9$G=DZγx;5Du"tz٠1"laazf7x'yޏ&X׬ő5#1Bxp .zWOA{(˝ʳp9 +e˵4cדZ G0Ta<w #P:'nk* UG9X]c~=7|A9# OpkPTQF('iRmeF +pҕ$ay$| +xW*Xw9Vf{I|wQuBe2J]ѷ"EIVx[9綳k<grB2Xov<_;Upnjx{( K0>5]riP4(>N(6¤ؙ̛?ZI+P zo2aGfPiݥȜ;}U0X;\T{ug +=A@+Jz@OݲKP{y88cåg,!W5 [b{bV#nNıFgkAcM,[@3~;JXw~㈒Q˶&N"k&DNJv n aめ4}~Hnx +ޟs2LQj9v{?{yS= heҌ+-zdbQ@++Fwj؜ +|$Xx{RK#gzZ+P[ﰻ# Ɵ;h\ulUջHWa] +O,rۭOH5dgO6G(GAh+ i{?_EN^_𭧬cgBˎĐg@ZjDzw!ZH6)ٞ*#[U~z22 GF}N#ATXf2F-L #止}թ4븒TdNp퐏*̛57"Yr͸2|L9aUy跆~ʘ5%%o5vRm?Hgu%imZvH`~d8^NO24>Ոwcr(9 +G{>brs?6'19Yq̎C4}XAcK ^XJZ3vRJ)x7%zpuHoP3YwI=59_omPsBIZ>ۏ r.t+S5啛|C ּ5d-š|Ϧ!4GK"?ɒQf1 `Gѯ{#Br_"o#t{xQe;KoKSy/]Z}_}F{ znJ+ŁR4,9ۑよ, td넶0l%m3gM\  + 䓙"Kq+Yկy(=JF\0-nT$*J%"`ǃsԭz:x*WT o#nb)߯HrU}T,M0=oq8AV㈨ZwgdžМzg i' +ڃx\yY~17!]mK 6RYtTk#ܵ1qvV@h;eNwLzwVzR5U9۴zD]ϽT@+$lQg'=K~I%d/`0j q!DQϏ6Zl*c֠2 7ڼ^ 0׾|+kw{J* +xz-Fb)ajgsK *R닞_QFщo,0RÃ+)hHGBYHt$s|"/_ YeJϼHlJ^p"D2C(6(M[K`[@ +%ǞSd^[Dzn!]٘]s\-5CSޔКH; W/l$Hgko;i;]_Dv22@ći~2s[l٧ZSO!#-%d#Ȕwk>}Cݱi5Na=בu(wC7bX +郿)Qo25>#ԀC`yd;62MFu':(ϭJXwgZ[?!,%o5DT7 +:}! '^窟L)f~ubD/楴 DU)SmYLK{UQ$x&zͻ9R0XJ~dJ a:֐׳*J[K#zGvm!k#]s-ds&~YDꚟ{wZZl|3InufV't"h䗶)!Z~#Cai?b~nǰ6 Sȉw){ҰѵHм ,?A֋[#ETDwt H#8/^@j @:(g5CLQw$1-IL5_n j +8v/9aKUíIW0:;hV+-jBV+#ةwԧ>u9~pWh [ R0״R+ـ_fx>Dte׫1qXׇ\D9X8FM>Hér'b஺ 4'"S# c)~}?s= +J}B/;H~ycBӏY}\GTNu]>M")PmʁYW zGYan͊uU刀[Ac3ީ_Udu7ʔyn@jne6"a1%O`}\3 +;6V$loEC4,Ɨ4CsyʝE׉%]'Tv|uxkҹ^qngT_M +A_}*=٩OU./zÃ5hs'?4Ůx fU%RYkG" &C>dG3|T[wcoܖ<7IRYH_bj=23G5cGӖz{fN$xVKi3%&)Eiܢ͕;Ny',ǣ/:`I\&$1Vt-wѢhgy|DK+;Mc^n>,*AQ] LfqEfUtIZ] >R}JZAgw*!={cVg"j/y4gDP&F Q:~y=w]wGn /#QP؈vH1߳*53MUBtg&Ģ'E3,f#BjU>Y9vj0VKHβ8|D36Dɟ,ErLpG _Fܶz^'> " +K.֐|M _!ӡ4i X&Ei[Y<7uĸ%&DFPA +%Yq6摢$"J?g(hš7tnsdϘ#HU]!2P{T54hK$ NP+Cv>CDFNOn(_QWlWlsAYwDc]Yb},gj;N0z ].  s+ڀlΒ1~}L +\&"^gjV]RmUCvFԻNS8nm"Hz#q|e>E$])hu'I((YɧLR#Un/}<7,*ot[d %JUvǬ]Cs0Bh6uR˻Z* 슭dJ^4:WUA\?B3tyy5)#;>KOXžrnprA {plbTt^ +ohKqVS nx|Z{13zO93okgߚ%kb&]έu&̺B Ա,)Ÿ5D)iܨjY5Y]{G~Yy4KsYU.J1ZzHPSQ{ϝHY)gK4/.z;q64΢G鬪z#ӎE>zu7*ieg9&6Z 1 _K$אKdnɐPnE<*viČk[TX>A@AQ)j)]˳ʙ>!bZ3MQYaW|'>V?#/pJ\ԭEh{*ʝ8~IT1R9݄{Ku̎GHfoN4[ }P!<䁃*·Z:`4Ďmnlys#V"jZH tUC*a2>ZgkD|sw7#v= 3NS|K7~fD_Ub#oNHuT j؎؄\GJwt:{xI2w +b?)qh<?5ͩv] =3` +4z³@l"A^+خLS8}Rؤ K{k lb=OBHD6&K +h >,QȥQcƫ[$9 >>29g@yDI?AoT wjg6AX\SBwtAޔAΨ*yՎo Ţ7ϋpj4TVPq(x+3GO]X6sJoR֍A:9koxw ť&1 +4 c7c"~H1Rkt`sP\ Wr-w-$d%G){9R HgU؃#u;PВNU՟qd:f'>HI0 |HU|D:_|ui1j[˽Wu$əWrsQǡ+ H{c~ϹBgA:ǾKµF;g{]fΝ\Pf)F>Qquioy˰\u65ZiǝoIA W++u97wRrpq/:us(O䂑0Q eH.ZMоT(\[=u货!}>(-iy*X0DgȆ!]47 ֡BlU>LήԤž\[G8V-) xk=IS̚^íǚBmw0{7;^xY3cr+1U>Rވa&քSb +Imui{刻Uԩ[:}v \f- 1-LA-__R2ym~wW +^SJy(=+C tؼٳҚk'Ѡ{0gO;D%ҭ%W=Ki 5d$p;fxLTJ8`V꿡'7VMPGU pH8D0-0znMV_f{?#uUS> +8 ?8ړ^S8.ZNƋ%9?^ _x.kgH"+Em5GG!pk*ܼJXyHb:H;c}ԤpOQ|߻s~̳dq^Dw}<\RG|^s XBcc R)D.,q ytR`B'<5v_s"tKYl=LE&f E1;Ie@5$W+O"nJ7–f羕N9 0}O !xqlJ9yj:gZ;rdtA܌gO6)FɯxĮp^'襕k$s gt G kGA_b 8CI_!:}@=GSǮcKE'ŀkJxa5Ά>3ԝ%EP"!B^liaθ\aw`&U3HLL=B!&ΡN X&msvq i6O 0 k}/#*nWL N?%||aŇ,Ѣ0w$SW`fp&Z<`L8|Ou?&/D{y6Ab )D?"đ>SAp>`4pRVCQM]48 Ӥ9PiUS[7+E$̃拱Î+#xLn_ʱBI]EwAAˏؖRFY-RAs2"-Ԑ;u_ϧ;0_GYHA,Ps]tBP +^Uá36*׽gL%?"Lr~A481R[`&: +T,XSdqN 4J;'n3{yW7=Lwם9Ϡ~f9VdjTNdZǖc rbB&V,cۄy9Tܼ- %ַ ċhB]-p|3wYdT+V;8 +*5^wA&qTlAb[mkQ ߉f21I]e*X;k ul?Y=GѿomZgJ[,`uxy-dOࢰViS b@E*gkRr^۲g7c揺9-ɲ6 JU_7@Y~#& i檜 ^~`Nz W(I>*?U#q|VU!#O $C4( TnK4?a%'?S1ژs^yM[1ZO2JW:3 J)UF!<?r+dǶQY:{rk0` wƧ$(R=l/JXs;#8KFDF!W~ ~K>ݩ)t2-w+I/fQ2+R +w{ʡS| zT+n=], J¯A3dC_4hD[ぁ($UzS$]|P|z*=gISx:}Âa=:U SYP@'?ZTSűU; >Erm`2ٮ{$0e6Txt %請9!i[06&MewY+MTRx=WLnV%S2kqEÔA{J+G @lr,(R J֡1'BVA~ +Π}tP< +7:\Q  t N1b? Mau= `VYsT20ѥJݿ։30 gTS&^lM2h8= :<5>Rv}DQڝSjh/4#/cV:#3-"Z=F +^M A并܌l)-G'u +ЀzOJ=5I'RԗZ[5!]fc"8|3[ЮgXF qʐޓ0%k@y +y [|0wu>ZG+ezG~w~kRipy[т9DϓGRt.3ӈay+`'eG񗠃'+q,cH+g_l7jlɾL!2&@>v녌' q^CRRgCu6 KZRAL v D-bq{Z)Ht4PY44&%TY VB$6wf>>ȹ:~Kb/r%m鿱j? 0cU]`ß^J U j8Ed]~J+%'`]3 H4ËwKP(@,^{ݹB< >_P9BAΠP4jJLi`!HFSy : c:w+r8u*vO_q>^VH{^Jfɇ18^AfEbLp[˜Jt2kjG1\*H,IIߓ(IC;kqTAϸ% FaS¬">A +K/fqԡ^!cqRSP?GL+O}:4#-M!0NOAb-~,fZqcJR"Pk%̦q֪#aLh I<:+h %KEd~E̶7;.u{ +Ր8q2$5۸-T)JkrW͠;ÃJ½s#oSC{Ǎ(Agg:@d5TK2$"`D+hu%0йR >ѢN$wE0 ʑ| n(uHNJƟFcySJw}sm3ѯrC*T3 ܁ ݌ zL/3rU 2G8Ԏn zRCQUYV2TXUwB +3=ڄ'n?K׽8tk:rxx*hq\+IO]%Z#0*&c׏6 JƬb,JLVPځXD?A4=GVQQӅ)xGYBFQ`I~Q:_2)#CæVZ33YB5mB:.^>&X^Eyxi#ۂ%V "89 2!$Kxc [nɳ7/CfTo@4- +w24ܙ%>"ku>mk#H>zX|ϭ+#.5(2$Ug !HT'z$/ /ڮb=k=IeGyq )[IE1x(;ʬNk?x?7PxNьj~6nZbfj]tb`%:u]>>{irnccњM385rdx@U\z􏒖mAghӂZ_ӣP~!Q|URQ/u )hqq$29TiMWRT 6Ĭ먺r숅7Gt"3e;A+z46 {ĵ'kO1K$*cr>v܊ G"lkǖ'VXT(}'eѐwyW\ᮘϴkOwq2lw n̋AIVuGd# +ڙYnQR JerҿA3BѴ+l~}c~a8'%{uDG6.5n%Xo\^o%%tfb)j +Tuڝ,M:֛v4+CIy))wLK*!{Xsh'd&Mg׾W|7vB>T 1(L倘T[-KI.3k()qW-bO=j{^PKW? 鎗f-L:Y<7ԥ4nVm"(x >㧎w~2TM]UF6^9/>}q jJ]-pjӥwXeK9#FpP ߺJ-'t+m ʸ 7[ث#"5npFSsvYS!K;HkQVg,MK[d~R5۷3X7%Ms֘T|U3~̀2jX[ypy)֯Qfc1d Tj fMFr0^ׁ3tw7؝?b##ᬬJ'K=?ۃVC߃4z5׆ƌs v C+(GrR4|M4:GExTXM4p(dZ7y * xwonCuDIeDB/cu1zram Uzgf[(ć:<2UHKm+z[\W\FEztp0:/|L_'&vSVMAʀ`u%FTn¡%wfq @W`R]qE܋+َIPuԇ_^Wה"OicwΜr^bDjD{?I܍JSk FgZM }NQpR2W3v#=ˁ3r0m!8kyyb+5:Lc:~O4$^~]+ 5{{“7!FZs"Yb1/tF +9N'Ae/t٧@&AyL=[ƹb'gSM*;RYَpz(5 +Oz7dg u z?dѭbn}lF>aLԗ&0`HJdV^&d#3Jnsr_>kb, /uZu_4C`.fhA  l]O!e|L:KܞEhto+otkSNgXvR>`zQR|238 '1B &.i/i7A.Ow2}J$z#e`(^8l~Ԑ9`OR)CNn  vK jHr<ħ"LXI[)Svا 5%wθ?k*ww6Ur>qΰ@?0X|6kQljzIR|!h5I7͎o|Op T>&{W֡q j@(<>nC,;,Lt1fA1b8䎏YC0(l\/9 +A"XƐ3Jqf\Mڀ9lI?g%m31s$M9 +_ʁ~7%+ ,,B4'* Bn:(s &^\i" 6[/\?-ƮN3hAL(Qx$ѱ}ɻd[-Aq4K{-5}BeRby|A+hZD];֓Lqw}F3"cF8G r4CFU%aƯ +|47۵#+1 o t ']'wG;Gxr[ǁlZW#{虺(Hg7Cl)p}wI|Ah/젂Uq=E;niR @;th]ǁge\ ymOexᏽ S*'F T7]yޞmQJ!tֈ XXFi@:Kn YfLˡ-6ғ9qŐWlAkgzŨkmwiB`ŠA(Db6;~r8BH=E :_lNkcM +Ba4}*; ҥyJ +/!Me;J_t_ӨVh%dߕҵ]{gklxkّ7~A]=F;EbkM[/A..Nn9Hxi_1NƋKteix(&IN򖆜I7FNU s+,8)}Β:}cݍm<ʭtq%$s?/boTXŭg➷^qJ.Ӳk\SVQbVVEPwzMyoQ+K(3e!Q'>*_1<7 yFJɣƠ)O,0{*IW5BIf SVfp=_0CfZ2Z fPQ+9XFr3Uod~lwfcV`6[Z%6,R<ݧ^z7{jWt6 qޢL#o[hZF7xOs?@oJqda'Yit7KGtګsQYd;!W3DQz]Fν0j Qm ^jy;wv{n ԙ?" +,{AVd!L փ +sуԐ3V{GfZCf$L_bÛDPĢDR/H#C hU;,QPQx¾0iLzmJ]`@UW}-<<j)_/rBt/L_vqkRlZ@7У"usIBmUut\@gW5˞ 4[cMX|!j뤏T@"t55[Cbhx=S R} FI!>/_7Fcщ*WsFbebw_rLCީYtݡ,+nyLT+i#p2c(DY D<25׍3 4h)qq`_A]/Xľ@WWM{lc\Z`2 :4 v06$J:صUooп;W!Zd74L_' HLrNR/C~.pn(#+~}'i]PYK\C$|5UΝ1Mj@n!x0(hV'9c>}^{xRpP(J[Q9!E-1,AoŸm-"RV^,k& m*@+o?vDϢ"5mW\CПG8ȽYgUR9~ք# >D`нu;3RS?\Ȯҏ"1 zXJ 'e-D;׿R Эׇej:0lFT H#UxI}:/s)~,OqLB0,۳'?̧vE,##GD)UM]ńQ|8f|/EF, ْ?Mߦ5;,N_c $F5Y4O|ǢKEGǹB ]LGV(DM$KeeMUݴU[\@׎{Lv PG:kh 3 ,Fs+ [ sw}8xȡlZddN !'h༐s~lRgǮ8 mԉR) L B2!1{]~f8Qcsn3t@Rѕa˛3Ys 0"N,Y(]15Ĝ!dt݈8ARW<)ȁ3 W +FAUvO}7ZQD(6^^՞ks^[d +UdLb`n#h1ߧӖG;a} ħ޺g.+UOOfKMy]M kC1gK!IU<&NjqH&H+()'Y (~ePgo4[DH 纗9ZNxl')-6 C5sJ SزjJ‡I3B&L(>CD_Z ^﬏khhEω)(rn) $KJVkKLkv[~O Ij6`r=CFtQT]9bĬ"(Y/<dVW|LP[ xPۏb%~O0a:iMp h7!hZ k"CP'×gR2[[/ h%+͡;" kY%3S+e*S}ML_x!C#>c`/@c§J|w n +w կ蘫 O& MkTK;Jܝ|-::jҠkJ{%f:}[-&Yo$Oh*]#fz|{5E灾J&GΫA h~rםtQuGcG^*Q[oIN"T `оԎbM<@pzO~-$hܑUZ7aYg@G?dfF1 3p$G5$s/% łjc_ %).uk-I~Z9CLV^ϵh/|:iGCePBsI*Jӭ4*"!%YN?RajHBMT\%H BrBÈj}= 4@3o$_:t6m(ĉg 7; 8lu'|Pm}T4f0[,qb}DTVo4 {:us^ϨYO`"05t EC< +s<vǓ4SDzV}&Rfb옮epeN(&Nf豳eUC'Ğ?EۉpPKw医LjMQ=zOlgj+B9 .E. ygc+蠚&f]2NA:< ) 3˱70j1= YTO3^p$6*Iр0ﰤCz7ܠm3osei[~*ׁr0砹{ݻ.蛂=lg?bP$l=YTc "b +rEuo'eSAk|0cCZF&+=Жz**@d5X_$hˋsfϤC*ڣ 9-ӌNQ6cdAW"k_ď R+Z{ 1}k"2RsDGIL!*ч(w\-p96Tb,tHoi쩍5 G=unrأ,D{>#@Dt{&w+0GO*\w+]fèVb&#γ3PJIaCDŋJj{9m3+zrfk"G7K$jDJyeRÁ0]&"ݨФN)8ie%Ǥv)JQLG"{W~*z[`FDPJ NkpE/ͮ$GsPdg2RgD>aWWdi?_#^\O> >zc$>"=zq@&2 +>o"XCdysʬ֚\٤$V^Uv=R1\=s|$背W &ݙZ\-aabrNoQ<[qU閿1O9d83=ڂPA|WI\ +&Dnk8};bp荤{iiGKp1|j_|K;:] +DnbIvO^­]{ WRʯc(&xXr}]޻<@Ȳ-~!}.Y'$)ƒ 9Fx`t )I5H-|]QPaX綾c6F!::$8-A/epS +րCy:T Ν/Fqq[)Ғ V8UV˥;y +_{O])4Dr +nMBQ^~4ѹSƁz,wTrP&Isg:"]{_ћtKw| +]QML<8xS %1k3L#:sagLGM +"PChAx}'r׷jvʢ +x3",;6*|#i! :-H7;/9O59+\ YXטk$"]$t;v J̉AGO 13#5 q4|rӡ6ggʁI-/];]z%ՀhJ\4C{ 9-ܿ֒/x+?q`_GK@0*[sK_XenS⑘!VA`P/l"ȯ Ӎ\u}k`&~To D)w}c~`#TL5v?+~J,c?doִs1..dZl)LC1+cޒkױkіA;H$S.ESpJ,rcp1vc>ޟz#KfG`}Db)x8^rc3uО! єT!TT_HgjP+ +!!: .4DgwJjx4@*š<<:ȹ itk|~[$_ksGc3?VC2-w{gR@h\c?р6B#Ѽa3 dI=U+oᯑL*&ˑA:6q##OqW6:/-Z3>R8VϜ9wr LޏՏu^CmE +:J $ z_vY$DZUYiU부%{8<ERgx"Nz9~ikLKqwX +G*wzVwz5o]K|OI㯜JǙ, xZ +a.||' +xIm?`r^Aъ{"_IuY"Ae߰Nay@o +8 +u#<|ˏZö̱+oee2w [^a}[V-?h~$GZoE%RJ7XHwd+՞xM5]n(Q?2-RwzFDo楕\dFcbj ?t&e;lB³)iu\2 E>G:$%lOG9% "O])J/=On_# :SRpD‰SS3exP>3T8GsgMw Nh!7*bpdM+۟rEYqjj)^;l7wG 5@Wao?Tċ?x0&JA5}E{DDZw1sF:m% +eux DoWGn3-3,9o*_NJn%eCD0_*z'-"`%Dzru 5o^j|FLIl⹞=O蚒߯j?Uv'CHH>!@IW`)x(/j\l% `ozh8%gRoџlÁq[Bt{]% bf`#ek0m%"-7iKB #"@xbq%.w)Ԇ;ҴEپ>5m9v<K +l!ΫԼ SӹoJ3SÉ JZpg¸&kG +H"3&*H +U|M?χQX]mN<re#;mG@OJ`6fDZoQZwvNu_]VAɂvz75ue>˳J<'j>l64Hvt%U#JhYsCT5JRB7ݹǁ*)hG^QDTF4//6[ҫLE7nk-q}`= i*t( +4|IԆhF*S*lW+B-`XOvϚ&@> +]26Fw/y̼'(7jF.& +&L(x^]yE?X&|C;8]Puw=9+<=iI5"uI,/ے@byS}咜4JIW0NYܵՐDq >'jvPt^W(ϸoz%UGz$_з!f xjM@Q +pq;laFSٚ0A&G< ES^''Sz}9> q5z +Z2SĮ^9I2 + }]<ϚrQ$MKC*ʞVFk^jK6_0/1Db'+GUS"udGQ;r]R䏳4H 'x><9(u"Mzn=9-6/dK A; $Ӑ+h[xeh1.wThndzN%m%B{ͪ\t;umj-{ aa< Q*ytG*6nS.;FRObrÝ?wdzRgz_,ѪVx0o^qF st?V!w04*1ĞU}j߈?ORH7DCe[hj_L2)K7gb~ԂB빂 +K ԟ/&/z_Zy(\ޠ5IalGTa_KB^^JNE_9W*q01#5 +ΙE?l'b\*p-}J7`P77rc2bDb1faTf-_9;'xqHCISB(1Y_CRW])A-ҳ=ɾ>G8ǖN:yŐc7&߫","\U t`toO>T}Q~apşч|'P0[[tX'0jL[FRC+&0Mp̥'0}wwp{߶№׫-{2&m$d@Cqv]H%̣*r12$78r&= x_(]4$usCHGӑff~= oF6 DKM3u$4vLd + +0w~`(@EPa* r&sͭYk&L ++;ю޵R폖XaRv !k-\2( lD=B.D<\=H2.ݡel+c"GWVans{`vTV+KX$%TVKm +3SG=`}UX{4*SzŒ^圱BHb6/2S´)~s]G,B{pG$t竡o /#`'XMB91<s +!ł\xcBrOO!${5 ]-ųN} 71Y(穙qĨf6 + (5oU"~f՞1m4Qj׋EA*i=SW<s]Hh{_4זj"Fg'kǢbh}ScH&xz )ѹV7CCqt!|^:gCod.@d'mf^ę5  +ؽk#DFN:F9 +i[`yw_J::V +žb?:!;;Pɰ^_lS5xO Th .{*q%& sk/ τ:9GMdZCuwb$}kbR!XpGn%oDJ29dW爮V[RH9lU|PPr` +u{ 4 +RrGRZ#ѧ!4Q&߻b=;nkh1'ӰFv*6%@Z)KG[ ǣ҄YwBrYO{@jwM&TZvfU)Uh?#N4[x mCV5;L![ +8,ʮWZ=^v$l}-Vf*N>1r<; H3Yџ_ @71n`U /O53ZRObA{BysFHsxI}SaMҢB>u@ra2^$@gTOC4VH/]b>yg-`C؂Rޒ??S9$@NEt$$ Rr(\䨢G]\l%*9&~XQ2ޅmSJ݉$0rb%=$3hܷLrOƟlCYJrPGubv+n'7|;jH}sɢ]xhpd2pz졾>)^ 7v[O{{t\=1?d_byZAryWŸ;GQu]Prmo3]Rohb xcjQB Ti7@#5%'N +NAM  2-pSXה_E;-$kE; QzNUÏhNl%%߾L(Xo/킱X݁-l W4Zb1h[j<h!۶V'ޮvV'UGxϤaȭUS$Tu6PףOS .J[eqrF h8;dR!L;囒Ӟam@#y2;TvM! `gCmY/)&;"_l7a`!3j|g܅S!{#O +P+GԔ\EeYm4B3AL1eeKs{,LOW(NU(b&ީY_|K2X|ebn?OG8,ʉfB)b΋nZaHO|]fjpEWBf,E}1ߧK9[1@TMխ=tѣ&x 1͹,5#ƈY!X mh}?xbƂnOR, \ڀw#!lqf=+gTwxH["2s7OjO=Brzb?Scs`$Siv=ҵYtPu+ K>G \q8F&FF~ׯ%hHv={ wRU6g }m(gdE^weJ oF!ʹv,OϷ.In[w)/yJ}IkX9ăE<,焭[7{CBQ\U왺r?mhSa9߶ ԙ|(^kB:#t)ms 8a #3:;;KO0g`zEENB8 m3Koi%h@l㮰3xrLJrnH|X&i̭ŶJI}GH^JXW  @W3A&i ӻSo)!4c\wo^)Ě`!w:9+6#ۂ;Բfӽ2! hFY7z(9xRͭzIpJOwGn;Q#!o*Ҭ:T³얿MzM S}^G Mp"]k˦{q@`-x [0bVApD1jTLymKEOҫ .W%O?)"k_G. @q-zށU [G_bUH_OH;V/U"=Pv%-ב:~D;0+CT>ɐ%~F: mcA"j~(~DVT>YW.{V ST.Uf=+̈́3ؙ ̭p'rɯVH߮x ԐǫM0ONp}ܢxU?@ZYU7x~p~StN^? +r+RiK.":_UtァEAʕ_ғopGZ}ߺA[.CëE@rv.')\[$uX3[}>P42,:t#Xw60o4gj\pX <%NS('@\p}'_tv1@b:TL1"ieƬ V kۤdaFbuwx9s +[Y^}5\pB1d%Tr'{j=cGs◹<7gE4jE[Iv˟xf^gOBUwtg`F5/T[!.ǥq7rm{}qьՕynNXANY>ZA^=`IƲ~D̛IÝ9AF|\t"-&n=Ga s{ss^XӞ.sg)0bR|Lk1yX%;gUBzyp+2d43Zl$I#ޓ~qd]O,aV\> +5 \CF$B/=fUsqýP%}wQ,[!!2;f'fȖlJN띕f//7%Ե3b*X^~ j`NgŞa~jVi{|0P5";k\G#rҎ͗$ +(E*:ᓥ;C엱_5nĒ+ <'q=նg%,Z3?=*4Ӎ6L0j|!Ƙ 5NPw"Dg); 21)VaRNsENy +@+~+r/SIWGHRFĈ !Hz]!1;̙1 +)嗎}zyzia~#-8Td9~s^L>a-rZXZew@ 9xGf+ya5Bi3A"(^6.u#Q@h iULF"b"HuE?OzKd9+vH ?{ʙ" &H6i=Cu?B sj#^醨5KήxlqtЁQI !O2$~Z9H='mPՐd:i߸B џC|$Kǣ֛R>M |$9ffɰmRTz\k[3s a4V'CN \چwkJR9'`U*)b6hSДQz9zd/kwJ'r`(-%3vEraPOuDo͐`L/oxG{-3#\ `[!!ZGҐDTRgl)pQx㨉%  !:tUɴMAsԈ&ё^ ?}#5t4nכ3?_1EaJ >mƚW-S#g 2bmƭ0s};n5HFr.W1x7((_P+$iqLBգGFI}f1 ݓ ? _\!(CVĜgNCb;ҷK%Tё/o#"m*Qzpwi>k1<3GGI|/3uZ?ǶD `m^gq5x0{+"X$;ayRd*яygd}(kve)HmkRPV>5Zq穯=h큫oL$6U״RNi[G +uSۖχ)qWG8r^5 g{LI*3;i bY2y(iؕ #:W-| cuAP6qdq1£Nt(l{l *GZb*dM{BBq hW:dK3u?#}$[K4A`vhtDkQNsHQ*HqMƅnfœ^C.CP_gܦw{ `Ѿ1h&**BJkr!$$9Vp[˜z 51v [ЪD<[E_Lu8zFDEeSӗzQ1S! n97P?yF~kX|$=ؠ0(3~[*ԫsP%x[=&'&ڠ]DUHon{qd" D{{+8678J] +;m4!黔i/)wXپ՘Ϸ4OGdv Hyy/l:9ZY4yn!M#NF ՌSjO [ +pբH_@Bg*_eDH:8G=&ʹ5~@RgnH'KG`=VinPZ8 ]ڲ܉ՔH:~)'⎵k6> {d,l{̠[)wCe>P$mWpZ<&6tzU/>=3"ҤQ@/ĠOms_F7b7Y^nQ~s05 +N'+D6⡞=ůW~YSe?eR+7sEY6 NzzGX?%CPM"oȓ)^;Zcɀ.5HPuxe,~M(X!xMdu&*iodUB }=:E~4{D:VH5Dj3$q]I4tX}[:㟑3h'pbKZ` GLp/&ABU(Aзͱ_yX2S?bS(exb5ĮpnK3BfR ~PNƀ@'\ +%QfyK+@4!lnH;A's@5dP'cg/Um:}[7"[ |S"ޣ_Vtw<࢞R \MG2TiF +#}̝q.k,IK'?R'4HVgKU%|SU:chb2~=%?aSxvob.;S^vg>wDC3(;he AORhua±&AV +b]hoxRD'DFa/ vJО=mTC`H`VГ퐯AuL&͜~7DĆy;џm{ nCi +rg3':.aNЯ8k(Qf#W-U׌4QdT87˥E_4Len\ׄtCV=E/0Cto<[/J̠9?WN*K+>mL1{=29o9J/֒)Wo}_3H,W:cw)WliPK!E#9^;g:bP-;p["shѧ)*Udr8a%$fxKuO|-Tt~3@DO }y?ʧgw~P{!twhnrY88c9KbJ~YvM>Lp5i+3~]ڒ kJFN|<柱xbT#>iX7Z*0%w +@,%sXO1 N(-͇tphF߶~~q֝N|m~mG!ɸQqn*Bp9ĀXUjr5Ȁ*R޶+( ^ >9r\&;9$wAq=4! ʃ&F(4;s=P y;Sa{&Pp3Z"[7T. /2WQe*eC m[z;r 7Vl7oB_ǘۊs3O֬w/_nb2teTՓX38zͲC&}wl !v-CBFaRδx~D֑&ƭf><4 +:M157.AEl> =w37d >\#N1nkYe#rqof_z͍80$\+E{;gIؖ?3{:_P!I '|s3ٶ[͍عgRpSA|b 9 tH+FRL^o}TLE un/R@< ebtR oyi19XN=\dW[CRz:zO}z{-x  +J#,o0QyjY-BPͿTCWɐ2N#ՠ2\1;EsK "P: 5[RևlZ g@`Iv ITbNf+/ c'7Չ}ZG0a潋=A=fYjD 9}, OΤP[RX՛J̦nCv])g|!VݭS Jr##dF xmXy9[Ʈ!wG&qFV7VMdj6g uq~kz9F df ]>O]"ڂc~Sup.g>K&GQl-ds$W+Z +59.Xf݌+;<`Xt꽴Q@zR5=^ouRN,5KdH!康]1|d,\} :[<ӴT evR)KN'=i9SU4 VԷ%%(!t,mA!Sk?+29-$ȇA_Gu&z+<`u(rqa&%[Z='\%98ȼhPjbKqw^C vu57WOc +wA)timgQ1PΨKB-/BJ*㽒AHEs"iCǢN%J)@^4Ƹw^mpV*]OWXwcZJX!C 0L2ZI}P"QA kȾ_xul`u{eP')˕+Ր+2$|u\AiaKNqz>JWTJ$_;XCqOۣDD9PjϘpsC0r'9W͡oC01oQ{cV$SDBɶS#Nci:Χq/8Q~r7D%4WJP%h͐ !܊haFAI/~KE+3 *UpyW2>J`WciJgDL2orz!`J{]wT\e ,9Z9HymAzfzp]oY:YOxeo'0ϺE#c-ۍ)5l3Om +lG7Ym!*{xc{Ɯ#^*̺z%J*"WzW$JM +Xr uM o!X%X恪~][*R<@g}+6 ++-z1!|,c݄bά6j +Fy츫 >#]qIwV5#l|U/.(vfI +<xTɘheR<-PdZ7 MDA=j>3^`$pH 1# Do*ُ.kpl'2[G8@շ|煉&5DVR +Z'hXumXn!UE^UhQ>7Qe Cy LcHHF16v#Dn kϖQoGܟbYe3E%GYLcD >3aNGT6'*]& +[g0sP[볩&eȣ˞h0gD_4.s[$#nEP޲Q9eN)c=@tM1U,j";VH&wbw{a?,xJ\sV[Ww#ΞQq~{cUjRu `YR^>+GD6@ *㳖^z{XSE|sGQQ驛RU4Ζ%'wZ\NQCaj?SEg$IC"j@آ2L6be,>{:c< +᝜ߵ,`bVg-(kn,CxrhCJ Y0ނ0%4E+SeqϊwB^ T@$d (p?5$fiB!1={ A SN"b@e}ܖoUȿ\) +;DHz=V3}"&pw=p(<ߊ5 @~pPiW gS!pNVH %j541za%Q'<"V/3k24=l[ :d:($=jOmx֡y؏PqAx;A/*EbJs HQwng%E馄,N[ pl"}jTR5S93,js_E]&ڑUrw&3rL$jKn[øжӬ`5N9҂y}Dz)/-|VJ!r/K%߅{sDH))9 2=%6)y4Z_*5WTɜ,Hi{60pG4#:`3+ߝKUCrr=jg ] ᾜ@\;M'8{0$'F*֔tSi ;4oH&-}Y;XD]#vsGɳ-rCuy<ReB=FROJװjY.BxYΦx,'mjA@ի`J*1K[`"' XsVjK7W{ϕjyµ/qwm{l~_R/BFslhzzX\J ;Xl OL`Rw2E& m珞h3!kk'^1y7H1Sk3|pMN=9or}Tojt"2=#wUg;_k;}u+īdSSUVWCPxs98KK5w êFo!Mw_P5!xhG԰ +Sߩ5kKƒ6>w9CF͑ေ3b uwшyٜn-u2d[G<Ⱦ1p:HxŖt[DŽCpC$+O~^ަ4F +;s$ڋ]=91/QEI,nk##7pGI! +$Wt/p̒|1% ۓoqn6!.-/TleD+Kws'RtH"ؖJ ,?b`C$ %nĪ8Ն{ SΤlri +Rxe,7u2;tE}<"TB\Iz˞'NKGǂ^ e} Ñɑhi'9^WzO+6&*= +zi6Ee zQ_i#=@ߑGq@w +(&DwkفK!8 +q 80(-(YjljA$XLEcr"bdy[Ry.HFNz/A췅~r.#J u+EK(́G1?0DAw])':NpiLO-⸃uԾ8OU$bkX#KUq>0$F^+g][ ms̈^pcs=m?zeq+7-qZz'>'bb(KwGK=y9:M\,Uƞ(BqeʹQڄ.,ǫ ywk=- &קtnsJ *1|2 G,rpTi?*MjKz+;ʳo֑ =*fš1I EިhQȈփm,V 7-[|7Ҝ&IbUNM [ܚ^%; +zcйL}LXEN)IYe% ϛiiy1m/EdDJgXv/3BHl%{8AlhT'18)eV?[`X@SlFۋ ?@Je;VG[^eL8sƞ N|k@t[o8>[|X "TILɑꋊ^Uf噻m/@J 씔tUR +[.[D,mgE`G?? +&?@]jGvh5-HCڡ0WWi L+S6Pn--Vq1NOV}ҏE$ZU sDd""@k08 t0mF)tLE()I(τXB2psJ33oY扵)e鮌&B؎aܖ9Qs4 Gq?┡)a:r{L@dgB#Q2|ŵBvgO֣j=PH +=~i e~?wq׾eX?خW74Wʮ;IFI;zHD kQN"i A%Ŧ&ݭ|DWeG|RJN1/MvG: Y^COkudi-U`35 MkMj= RiDnCʶhAS5npӣI%Ui31 nj%RǎA\Rd[+i:T2`JS47RX;vc~(ߠx@f]X- rAhh7OWMc +*Ru󤜥P1tϐh]]!²Y{{*BVW?+k-x) +gw n״N{jq #f GQu0YKYX[*%9V`6PU Pvy,L:kƚ`,ۮ]2_ ubǒ3 E^xн"kP$ ?0l $v*`W==3H&]V$o:0m^g-Q΃H^9Ձ RˠE 1sʙƈVD(9a"\-w + Jfe {-K4tt|5c_lFtU]2̓PͅM3gP*rn*3GHc&\-}X3[TywQR wVh;ؤ#:WZNVm{A{twjaKЊBڞ3@x#!l^yQJl<ӆ؀^940aoU5;݉=D> .N=c;g[QGP{5l4wԽHI Q+^V@A\2Cv9?)V"p_x LfLJ܍&hӅܪe{ :_֎!= IODW"+ڗ -WIl=Y nۧ1˻p4M0gNywal5}MQ邥Dw&kdz #oO8YV+#\ E:* +ݕ#r5s;Ku[ܕykV}ߨ_ڍrKdtǑAAw(d!ECnz!"i" .J؜ڨNTp pVcBQѡ5ng>`Uʽ2©~?`51> ^^%,K@x-iB!85jyiE=O e(Wi|g1Gb2`7N}fC0SNNtT"T}` 5]?aYPiTD#DO&$'o@I&mojьQ= +K"x {AR3Z~gHka ?8ip=*TVfzjא/'UW<@yz/sbWfL_X٣|$^--%0==/d_Y1^hC>A` +#EYNRGlN *UwḴ E."V׉N=t;#b#`|Du$znL,:0 aGA$j %=˰|"trC?j,O"ܒ~|ꏨi$4=b;7S%p]cu)/nBO~.|vtclumi3MčR=AG4$I</W{*d>w<'m%}{M`43:'px= +Js|K n*+c**$ +o>\=4i<0N3Bm;?vps:hQa68nrB_[^) ]CG\G\|0VLz0p3O~rȼqlqVႦQtπ>U^ȹRpš{LeKEE8u4K驟~kR>(^~\ٓRR@`~()=.ZeY +X `"r:uG T; JKؓvTqh;8ϐ- { sHc@#X[*q*5ʹg&Q޸GCJSЦx \zU N֠$DholۊXi5nw(Ic䮂ŖU~ewW➩ARoWraǥP25%P4'bXLnw.xS%8yVc [YNS? ey$e1 N{^t8qF\ 5ƳCy=uGZcdb?zy&ww^Rz iW[#Q妒T0> F6>jMcLLoRZB& PxZlw|Jٷ6UXO̜̐;vN}9!'wooŇ 5"&v%Q2!l3!zС( $X@z!'J _r8eGz!rc:R6=iqkpY%sȜsb)^}zDo` 3MG!3nt+K}xgRnĎ_V0V$1(&O6)`G\g7I7&_)A +>`CsR6ڢ~z^|WX#3? ;i~L \qD&t' +Ć:ĝBVm7OQ IVAFT-_LaE5N1"ߘ:d=Y>ܦuonizu)40Xr@OA" Na&>tWc\ʠ:w:R3$2q.;xa!hQ#=`p/gLR kM# 7UGATM_e^+isgb\ZP9wpmY>Q40av0LO5>S  X}1)YtBNsd{v8:b!^ا +o^\L-3Uq.쑵\gt\oƚoT]v#3G-BML6ʫì#V3m-I;ђx*(;׍F QY(H}R c>6-C[Yprѐzխ Fk؁r4}ފJYz +Ja5>_5"H(D$\QkNTqzȠB"2vKatQfӗ3R# «0jsSMu/ +x^֘ ?a )KՙPہ(z _c"eXR~Ԁ8aX#.nO@5 헊0W%Fz5 ."^|m+_F*?,?$U.JC )F3"14LQ':F)dco|ᶕ 7 \ĮoN]Q d/#8^mM7CH(D$;hg\#aD%q4' x{飝X̰+H z$@:MQ#-L|1'#zF7 [dXpjOݠ aA% mpxڶtHms_ +VÛ =2+*֐ +/O8w1ytr7eJF>Y;J ix^ȴ+ ^[)_:lN1ץ21Zss;8Iv.C0j[2f?<:@55ּeDOm8"E8.O7'ص3mG%;{a:ȂNyM"r&QxooT_%W;].Ht^h{aB ڣjDF1 & V9R\AdGlʜbcQTvo=V 9uG + +֏skSe^w a߹pwI}Z /–t$#({7,'I>E+%6FLc2rKPd9ӂ;Q0b!G4fnoΡ*D^څՐcUx*2DGn[(_"!+"B^[.=(9%=G63*{X)ŵy+;nReHeQOXvn"r\R`ځnQ9l&(D9bs:r.+cJvU},:jz Pe yaM%^Ow)*ElԠR{#"UFiBF!2bd~:9-<3&ORO ATmX6х! }:d)ɚ "-&rE_s^85W%kTP\? +\iY~{zݗ#]G(Ω\~虵^QR_*RJa3CMe1H)vEqgF9|7+p(OS[S=Mq4ś9)[Fh)Ȅ yZQ?<̑Ė=a@y>pSڣz(t,Y: Z|,'uȏ5f*viqަl3H ,nϕ_PN@?}mٰ):xdF5#;W@K=zg"'ˎkp e$˙+;+ƜXT^2#g<2|輹iT +pRO<6o?>k91S<~楮ELxu6`C]oϭ< +:DㅽqC +0Ao\*:Gm6 ±dRjA*h]P2tXMrtJ*ӫW +2mPw{=ˏrXAq㡼7g3!z7dRu욅X##fℬ:-ȰA5Sr5hIJh;%jnBe̴u>Y~ 72,҅Eǀe7bsE`;L1w3wܟc IdWP(>;.ׄLiđKL4h)̫oIa~8 9Ec4~.Oyt֩-)Պ.Z>Ž\VхJ"U#e0Y\Eu:n4^> Gt{RdFtsؤj[Ju)m&u2=-1fi"{=E=9KM飘.ԓm .Y>pz$މbʡ2^@4%FTԸ $S֚>z Ѱx0pmʈ`ZX5DݷVbv V}S3DVpT-ۑ]IӞ= +URN8w\p)r{k7#-8o7=Fe+`㞆q(`{DDȣ38jGcuoܺF O \+xv? +sL82H6Wm"0ىv35nquzڴX#aEI ^f[Z[ ȄJ3PC+\(e\L-FRk&xRw󙷠ShB6+ +gLDg ݙ@,RH(x'opr'1p*,f^;PYZ G5w@cA@cKplXE߹!eYxHp}@~GyG{$Km󢽉KM *P ˄Bt5M[o `ٵ`K?y}zOn1=o5z|KRQJSR $qќJ]Z_/c6 qΖ n;3_GXw:, 6I*r^l9nrܽtD0EBETC4CFL9(}`4FTzeʥCPٶy4*tA{r`!UM7.. =@WP,u@*nPM"]k`X*[2݆=HnydEW'_wwz4!dc>Dg@']s9[/=KncƝt`R s=8u'?gBmwdHMjUgg47Qp^=LƶS%X[q\hw DSll$c|[ki)@ƚe~O_r ~7c>rnD޴/Z bo>W'7ǁvSR?CR(#=q&Q fr]V%!^b:M}n 4> 5״٪2=Y/t̛I&HLM_Kgz"0uF *;/aUC4Ȝ˖܁wcMط"˗FZ~WXDlm}zHݴ]+eV홳j:Z +%4#(Xw3%rz[K;nT>z&"([L &- kRq^ԝ +iJLm"[_W7d uxl17{-~4^re93F?7JMea)h`oP>Z@pW-]35Ξr lp7sEW+΂ʩvr ֕x;Yzr4ǯ()b5VJEAZ]|G EIR`67-0΢@bfSEa$#+dgoE xe Kv߭A + +{<ϒ=pabO&}Q8]*Fv?TJ+2c;M+{ endstream endobj 42 0 obj <>stream +?MsrB-phA=/Eegv]=5D1e{ff1!zIx#]?NtagAkG蘦^N.5a> g}Ng)ZwYeYY|A P=>ݴ`$aV=fx9 x 1/Jd˗BwXO|/XKM2^%Z!0 p+>j3]heӟ=r4 =! *;KL5C`c}tc" Z*{4[K~h~U˫ր뎇ϭ"^v^C谺WW*1lo6R\"rx228?h2h5DpQRq0Jo[J(-o٨~Y:_`kcZ>/CKw"kHkk^{ ew<d/Gfi0n +}pPP[ދ m,-":w\NO=sU7F:.?RJAf1!=p 2 b)K)߭E(Ae|Ǵqnf!i)g蚊mYry9Y4y`]P5jI!Hej52 ZcȥF&a z? ט-4}৵2㝵Qz XP7Li#ųS8=\p0.؋S|T9)euAxΊ4 :3#kdݩl#X!\ͬq (&}G/u4HGTO+;'G_wُT [6ޡNy>zI#SxsU ӏ`wXLelIv:6} Ŧ>MmRzr4mO_q 3 Ũ"@c!Tҵ[ + d!pK|0Y"%ZNE@.JhCۗ$ +TW0%Ůs]Axb$ĞO1,Pbx[sCZ8N N۲MԶ![~[2J +_%?O)"Y=:0>5PU%bPw*(^B[Cr}# p_{a4*:1>_C0wG0L]ַNF|oFS`֋9Н s.OB% \i-6GMG p6tH%h(bsپ "] K>5:^)XqH荗 + Hȟ2"u΀(_ \7&^[|o;~4 +wZ|\/Jcf̙V'Jڲ-Рhb>)[6uCi9ܗĻS9HXKB3qFj7rVF^wɣ`:t{eO/r6^'ǜM̺UZ[W%9nj {ZSZI݁HmgLɮ-B8"-Z*ɧ&,N}O'R tfk Y9lf` ..k̗Iƃz +þ辜Ld`$А"U +%qcik½qi `n `1-Y"@dHL8QQQ +ohJ 1WJƸ#^TO7i`$pa_gYTu;_3wQcRO[L-.UBn=*J)P<ǩvFZf і6UZ %.\E(J7AaGÆWhD5U%s*<ŋۈSV1UH6nV3rFݭ L9}ZK +A*[Z/*K*o݄B|u5N- ӄAgPyPt̾b2BiOcÊM9!a.%Fl=g@dWR|/>|Br``19e1@߶R/,Uf 9>3|$M:jAnL ӓu84pI]!gwhJ_wxTvd~,L[!|%JtZ +U]ς)Ȅ`?F2/ q +"JAnZ iq8=)l5kGaA[D&[l#'Y%'q@wApQ;8t\GV#PmՅ> 7Ks38f*h>".[7|U 㳾o0#:%_ E)4Z;櫔NW͘X8W9x58c(GwnN}@oVQ5-/aOTctsJU(B;Am[ՀhsQY<3h?OKa%iuoBCuVM"*Wx#zJݐw[h5;rVFlϝDDrF@5}(CaNЛ+PGMp9|N~ﱏ宰Y/%Vm-7J:Wld@G|ˣ$ d(- bNQ"'xYW7,o + %'+$]Q[-4]pV3VOCJ8VױuY92ꊭkUKP x9>=(!Z<̕^!%U0"ܲLEꎌ5r#1+>4^<_-cg rR,# Z+m*tQk^[A[5_܅D7e*#[teLb3!P=iQ'ʕ$0(ŏB!ւ,4(f~ca-P Y/C6_Aij٩vا-Ք iMwAOqt4kf.rqb+* 7Yl#*Dp}/T[>Kfc&p6wWrq%gckGH)A#diXU|ۑ4')י_RXf946mu-h V{ӿ;BxP K?~ FeJ2-TTqBFnV+ ;" 8S3E*ɐD, _a7yjm4%A@9 1q@ XvB>.M6%8 @08 +{ E)L|ptǣ( ז!ΌuOk I\|~}Xx;֥vE~ceY/<1.&VUӘ9xĂhGϹDCҒ,#x)G ALfH߶>edC '$"7]vdqQ[׆,oBg-d?jMKUnh 9cI w{ %i55uGxѺMRPŎtR>cW2˜< +85B@YߓYW5eUHÌe;Ր +w5!QK~8>4؇0 =ΤBA +zTl+ˆhfsBO5Ek8netnq4;Dǥ &"I#kɢǍi옃Xj^{qsblC1ƑK%V"ͦhHYH5+ (4=^"ƴOB "PZ@JH*NI lkg>yDEs?FI lg63kd'|MǏwwtq9))O{uV$ +[]7Gbc.G0*iCFoό:;YԢ2>w,L› 8 bTq}=;lƉ"?Mqχ.Azɱ_[Jq_͠;:&9HxkEhG%%{0g)ismHP\ 2#E3 m`\J{K %kVq{leTV1WZ【]sOl7/Y$>ELtO5J=8Ij)%b)zDb+#]`'&I2ͫ Yx{m¶hc2d'C/]Ziia ܩ\{ڮ2E۳qoâkR BxTuh rJ"f*Mqlڂ +DG-]W)WCX?5nCsryTlV:p|rk{~mD^ܔ 6F߯d7fܢPVkFrO=„c&a5y.%!y~K'ܲx?n3܏`[x;Ә# RKvokզ+^4mrX҇ x2ui/z͗_@ YFP#N֘s;76>Bzq{&.#*؍x AsN=.gSDszK-Jе/HMe D0W|Vr%9YW? +%B -G`8 y@v*AK8 ^/bc۱?G.eo#:߽sWrf?ᩌ/H"NT5B=*Khԫ?"T2-&ח>jgDmWC0m^psts'soOӏ&!+Ц ._hinM b*/yLDAJw$Pq!>\&J̩ਆ-E+IwŖV&Hg" <g{:#NOTw]jѵ/b,A[,yW}U)RڳIw2>!do#;rǠ%B Foh[}RۗqiadA^! 6]Ύɖs~KQ'hQʞMŧ,Hq%TlKKVd +?gr1Mnyg^W;#;SԋNͮJ|eWbVFo)A8bn [~,6+$}@ÎҎ4sG!\mrJ'ŵg4YGݱAJ>`8302(acUTm}&`?& E82ѝL9i9;$c?s>j)vu0Ǡ(n1gVw`-~oDO+X&@UlZ]GqO97Fr_=OߙsHGNdX'{ K8"8N!^GnR{,Ybxl.t<j]GEuZbjoa,!~~9Oȩ00iwŘ*8^R^ZWKY@t$ Bڅ]rj$//ҋWKJD]D2q.^圃_,},9 Pto"0=൘ETh1^C?> k}LTYCyLE?Ѻ=jReKXMC}WyHXs؂ +ƸOժ#iC7TWCߙljo#$?bZ@[K IAxPˇU&wՒ+~:& טk.jʷdgBQ{\D8L~ny%P|mU +o'v$Z{$_APi8LbҤVu7^cj,{RR$Iw)nߐZ!~E"XJRH][na{޶I/_b=ZG]wPrw6I }C4Blktꑺ7VL/dHҭ|8mNb +/#3Ysz]5ؤ _G'c?5i5fR'21ARъ2b^:b)jZjyF'IƷG~⽝/q\?V F=Cr"ѨuME _B'7j +"%>/^ܸ((3 ,8nJ {(sIϞK!X%&|R=47$fRW8O@(h2RH].oj=|Ä׹Tsv3A >1UQsi1)ID2Cv~;md0M*0QMjWj^?`;`<,a^#)i5gD[Gmr$(ȣ! L&kӈwW1Hr-.p2I2#pvxK tJoUdCVF4:ؙ}9y/&/!S(`%.7:e[5k9¸V"S ǡa'?LS YOGmv=⸽aswNAi\*' +i{{AjQ8Wۯcw~i}^w֛yNRmO,IZR :á@{fF:+H]hlk^r p{(G66-cB-+?s/U?o`HWvFp@;ĻjtNN7"[⃞:)fYK2DҡM}e`Y3jO@R RD2&rA q՗B_"[cWT vQ +S[`܏PKbIx!BrG_)w$ֺ +Xoߢ嘉dVqhډN{SNk#ze8M̯t8\/m%qR}5_ ~3:gJ(Q iA}'|zX[RիAfws +|5EP;Nh/ +@xec+#4"Y}2BPR ^6FnBJwmsKI'1j +yp%գCWY+iM28@-RtqJք 5HyBEE 2D0co٥Xcv' %?5Jm)<Ϧ"kďW"㈉|{*x$d$!d4PëI_``bYHm>AVhV-GSkFF@}pz۪ {eӜ!)f,c϶F)1 b!yXNLF̱r5DMs]vuŇv/ؑBQ<>FH/~{;MF8Ft ->'J9CƘ j\g +bXr&,Ll9v%v0HI;ZeqX,0Y:n&ܬ'%iС^&7 ٜ.^ ~![) hJ/4ͰE* 7%UXV>_6/R[/R?27:&CqD]*!V@sk_2r<;riL4`_$[xMoa=Jԋz]P90ׂbt_:1w7rWe31KZ%DdΓB?)Ɨq>SGZyL/\QIPRp<ӛ:9{=۲xx-pOx_@Cm jkø;jpk]ޔXݨD"c-]=ѱz +燚Iew/Ik]/_L~K;x~Km _YX:m&-)i󕕦A <=4g +V%21˫$aN;9Nm`'{ |TWYmxui94z&.%KMJMJ&c!TnÝz;KjE׷'[w;0, + +1!6})M +ߏe:BS3d%6IѠ9B=dw.@vGBK>+s~ +4ػl%b" ǔG%j*܌֑AptӝXL,= +Ķe{,AЮ>88 I/Z,g)GAĵ(KbjKJlT(L(U>?X2zJY +{ ȹbPHrUi NRU7!/v8f"7wFBE⋩El)?>ᅰk +i {-b% T37ƖoWJ];ZB8TDd4]D#x/{rLp[KJ5_bLZޔK(T;e G#X۝ȄZ$uOB_t >ǰ?V fu2'D}a;HX".\z^RH@􎷝O.BMn6X[- Դ欨>NϮaHKrO燚a&Y8i~ MRd 9r`i+)ldBS_>+z(a,}29 §i6 #qsR 1w,kCoydEK>KA_zš=AJBo'ҍjH#p1U-"1wRXo܋h9oqGo= 7^.ZFGp[i/oJG\AG#/>Y< +(E]?jðc9t5HEs:5@>UMǹ>#dpmSWW˳7dw/) P-!,fYh/'q=7ݓw]o8U| ,]r ;+8LOwP5IɜQQŝMJĴmmwd~332(HeO險f\&=" ؙlt vo^2smnePڂ ,fϪ;qZS?鏞TɯLV7<֧Dž2hO_t^론y;K(vPudb {0 >vQzp>l Π|Mbf|tQXGOJxyd&*81@@G`-Y6e5ZVb?N:, I#>FGl#Aue6#,=E 6sGN/G;D k)ToL".=〨$$uOLKxwQq6m˗Mh >^)+VoU4un)vMmUciuI.Ng0֟!0oG NJY2̨B (@{GтGXCpf`er,ƹsF2M ay#p dJ>Cl2>HH8̣<4Ҥ%ijئt4o8{<lS$7qLs:thRe*E.S`B(78&ܗij%N{sE|p :)]bFc5$ю>#sdFe+@3B`3Vk:$bNsp]B+6֪l 7Σo随#C]c{w ~:?պ.K+a0uTS#& ܃`̇Z~ǛvV޴9KgKEǼE)TT(yi٤s-GC8x,=hFG;'@ 3>~P?pKUn +hQ _Quݣl9ᶨv{ e3Ě `M^SQvSC90T=4c3ggw{!P )|6T<ڮޣ~JEI#czơGڥ˦)a7]RZ"@?5nxhM_̽ܔDEu$Q7C\\2#7}7+㉨x4-CT S|SUq Kerrz^i#w9T zEAPt$ːүrj WEǒ9!|Pt&A8\S+Mq.ZNZ'j -'16 8u0.E a1ޝ=U+}Wf >I,s5\{of8l/-5FL![A.0={_F;G1__AK.̙M˷Ӑ5@ϙ iӕKݢ mA˦ž" 2at"j87AruDw#&kH5viBE*"PG8#YCrmȾe|xt@;wlJ4WM2"<{8ćWZ8v+:kF2[ w@YJ:7HFh+]^JnFS?%^qPO~DsuK$.6-oK6G.R!BZJ-,\^h@:p?ɒ]? 2VI#(oaɉOCe,|M'Ӓ 9HCDc-6(@&7I-l p1 o:3T?5f,7J { ꏄ{5N;h5g0$\Q'(b.?<‡1t|_In)|MSOCꙴnVs$ּ=G|I^i+OJ B/:>< gϬaݸX|yEMM@Ϟx=+|{ !p$' ^y| +X$ݨ>d|!T״J5?ؖX(TCZ馐yE4v^a!w: @R9# ӵc?F0&o HG!^_А{R +ZݒAV{FLt"TE] CFܲ~>ߵ#Gc +Qyg Y9@0Y`k%#AlC᫳0[ȴ&|F[ s/h +s!/gj.]uUl;:V[]4,~4ԩ=+?ۦLIz\o!4})ߪ~s\Fڠͼs1\\  q\f'}Pn8Xc34g\G ^$$%4#j^8J"$>A1Yj^kzF<V4glho I]BA2vPT "nבy~o'zwZyaA=kup)zXr~K`7{8Vג!Zm/8n@Vbi}۵ 1Dp g]> +7\0ռ(o42$ +^LOy<\,|ےOl5lb#*(M}M8\V~)xeϠq㻷~䊈X=3UwX pv\${cAA)^`|F rڧbFr _ !V8֙>bASTZ՝c!o5$C쨩 , G#J9) Q/i_mSUZivl+f7Ao׈AIbi%cBxFFxKRܩ֭`L| adc=fGy|)z{>,_ٗ!jȼ,PwغQ&5Gӏ>-SH99u KnLc~ .E_g",OT5YU271I/Ds/+.Ts<02d|8eCP gKJEʕ~&O`" `&=DMë_n#';3[wv:9q^ALy%+]f-0YËnRПˬ#lgUL$2AٕZeߏe݅,ҏz5AdcEk&ƍ]*K ! OR) $U}+]y[w󒟫 +w6b.ۯPqM$ro(e>-@])g|1\ly[ܹ[6EzGEe)ÒH4h `mRtНu5ed[BhY55K5huK%B*IATR&ce*u78 n7 +)<%l.Z~y@aIpHۚ'#y-#\08z$k|.iP{Dز1^jݸ1yRg3h9#q ^ٞG7eeXц 70P F+lj!~e24#+%;+M*y!QI2' +v:6O2N{ʱ«(#bQWZttD;zIr"iFA>! %9aheKEt7u%W=JƔSw +Ck='XCf/Xi(oKNO)黉yZ<6m jYV#٣v8sy+Py^zi)FG(_- W YLL!dhk6eӯs+?:!byPqXK5EMM+FDAgگa҂PiRĦt*\iKw {?񜼪ldֺ-D.5*Y)Sb](XxjsWܰ8I+Wګl`͗TG\ ++}/p!=_?%- +)LQH;i:[ Y5XYqr 3?q2"$Wa+h4JvΑp/mHsv'RTZ޿FɧV a )Z]eDa%^GoxC0<֦-mf.6B0Wǔ Zg4SwS;3B8R&OgFeqUQͅetwOAv8{˘r<ꙉ5Pg45-h 3bO+W_x ф[O?Ͻ +72$:r+{GC^TU"'=f6 +y|܄̴WB3ce9UU- 6١PO﮽W蔜k[-k0QW4BO#s,=oZxM0;)W zD}+) LmpAdtbQ],$,L~l"W)H<¹$=W%+&[^[F7 +3k;5wBF7!#NuR6q#KeCgt<")VO=UKӆG5> 8H*nվ]4??j[u@nsoơ')b@ J(Q- h?F{' җ7D o?r8dTo +0)VA߭PR|qPFOs4Y>P6wDWaBWH0qL`JNd q^Nzz{1Vg+մ<;#\{i#GPx+ A5_>)KNkmk& #b\xZs7G-xEoTȫdݍ6 orZd*%Y茞|sbU5ZPh5y2+&X1BLƳ@>90PX~-Doc6 +'N2 t)W@@ەj~J7tj9祜7Ꮟn—6FBr\|.ldnC󠊇[e"!׮7>գk@a - +E;@PU'֣1$Y.nPRoN)-5Ma~l@ؐŦbE^ŕVg1o-E<_]LZ8ȣ.JD#$|^ޤt}9k /qRQ3??RjwF9plse>Z<(mU 848bf+,yoTsi`G3bM5h5-ݫ(VG`ƩJ]wjhɃ35!`֒)LPECS`|ŵN8w"#XQQܠ0P!J2VsXzwK0$7 6[twSU *ί,=zJ[(4Ë[%fv;wI<"|+~z9b'E%Dꐷsd9QeD\?.F0S!,N + Mm•2oBGh%Yj~d&àTw&ܙKxC8[FCɾ@w 6$٪MeʨD%Z08bzc?{'}ኚ8qx,aqFS:X-_幾>WcIvXv%AOiM:/o}1N?v?vo`Kny=u yn+.G u8)~h<{ve)(,eU1Fls1O}ŕ^V?_)}3682'r,Dcd/R2w%ZvHmMJѺ"b̧%ml'}E>1Nð?2&# >7|,V-pVlv*Zi댁})6O\"s;jǮz(`a i܆Α!6g7ڂ)$(R,KN*Sibnn/8v.C|z[wtFK6#~I%+iK1_jCV=LVgSg(֒7b'< +>qˌ };KK( +wet); :f?37ϸbC?{ |vp?(|!yq;}{ޫᓺߏ FTI^DQARv4pr7t#G ˡ9h<^i\Ѓz~F"T{""% +!UIո1R'G6{'kP7pC kO/7WuAފT1 u[h3$<$g9HamYcj ^+U=#E>fR"NsF0-ͮ>?=(O(W%9bf(4vaDO2[Fظ!3gðCߜS._lZˀnm-v4z2{F8 VRo,ګLwFS {1ɵ`c~iv |nB[9? ڳc}DuO~iG};[d jsz*(\TmGe;X؜V v=>4LA;G~=Vչ#87<9mJ4t[ңL g3(?)'~5Wϭpģ5dҩaqtYBZi0P. 6>5mX6Ͻ=`u[W +T_*02"z*M{ژYG+ uTY8{z'ĘIL=!zƣCӛ,gxl>*eH!{ՐRVsE>WBAl|2=Rm\aisv4_FQqMSmU(>:MgD*/rMR/&| 4ٹ:Ty88C"})wF]o؆d7/[31{β(ψ- +kn +>Y(ތyPxJZp@'˓^cˎP5\VsV9 *ioGXMGݐqq~_W0_߇e#%n1{z\A7 +_%nD}U?W&_"cpCJ}xm _c OΊPV:zG+XⰉg|.ZzL3F;Ԅ)x5~gW;Q7R&* z;! vO[z !zĮVןhHaː#[mr5O<2).`c(B 1ǫw,nrR*UWQé,Hsz b^x[MhXԲū픓,vrFﭓNK6ɒ qOpb(@>YdS rhΦEu /bG</RfkՏ$Nawdp.:&#ӗy1+eI[,b/_*h>DxgKpÄ9K³oxy9 ~|tzp,<* |U +dBR[4s*ڍ]*Go# hDK/ї+#L3|8-:C֪T_1$`g5C_h!b7UUF| S7yy?I!jԈrzdL(55Z()|-V2[L*%{d#Rs[fLj8WU_@'+ƙ '>Hz)er%G4AI|]8O ݷ|pkW ( !d8?X2vtyR0}}U-ƽ$ a/i62D/:U'!vx/{kMPLQlϻf? +m;!y0˨Z4`C~RUjvJ@:u)ιv@TϳøV) +x"*!s؜eH#L׃=&jHo> +Yc+*Cjp DSU't#{M_PS0 p&7C-RG_+*${ZbɆH_AhG +&,?ͯwTʒZx$[޿4҅~լ"0dl ZSB +ɢ_Hct8Ci_pelu[xnC fޒ&&`fv;MT[j9 +~\iu{r.:ݣf$S# z\Цz^tF'}USdǎuW܈GU++t7 :̍'XV̇G+7iYX|vXJhg"F9|T{S"E_e+=Tz ڝ!C"W6T'|= ufşp[5#w79㉁uwk1W(-d`"G}VwD@,]\vwo;Ƅ犳 q]Xc zrޱ7l];U(*Y`&;Љ # ki# 7p--u߲H>%!7"Kr‡ɼAS]տp~t +l@R͘<xſ>ۗa PWWoK`;(y_U|fYעd> +TEW[>UEp [4N'a'xHLɷ!b]ah^1w%'ϻHBjAE>̻aQՉOd~ g=6vvNؖX1JA*>J$%芖6嗿^Z_2yBۆ .gk`o]F=%[TcG+* /=H \'_vR׏'\{'AGyˍjf@nڒN5-T@i}-I} CR?,h ȇ1-ipP-W%GtWͭlKj϶؁/!ơ2[{}pyuMu=S=ޙ-Rߣ@ R2D`T&n%K;~M0~F@[Ҳ4"69m*.=bH}!j$X-TM0írhNT +'%{WucYsJDa՟s $(Z~{d7fjpK1#dW%c.4$,[=VA&P+T>" + + +R,3iv= y t CꈠGz7i$ɐpz, +_;1AgE^x/Cȑ9?U?K5T9,+h ^:m5Fm aa)m90 F3I:XP3Ү\Kʹ5aRh=#PAf|!a}{c4v~T3U@dQ7|@x;b98~mꟕ(qI^׷Zw09ءfJ|*_Q˥>AO{3HhK sҋx}YwS&(\J8Eo'PPbe3ϱWɂJH"_F[^!f003~1F5W(vfsVlFt`FYt*L4 +hdTO51xYȸ_iz0ޫ.}"n?Թn_rg?yC"؟^{&d2[.c4Π$ԺwʼnB3}MCfSL\1^_fk£Y:ޮ_^r&۹^eV3dzz^kTg-"on,N@`p]%pI"tf*SVi'ܑu;Y6|O Žm5dJX3h1Z3H0|Z0DGv.jA%~̧㋵I!r< + s['"|-Xu1Hj\UZ%&pHҟ [*=׹9IV,|1MTIXl+Tل9sr}蝿t"KIO !TVwZ>Uw8dTł +{0HΩܸZj}jms}W/jZڹ/BCdH| Aqy\8~xR7@h"+=[ihQr?9F?a)9"a+ +3}{IcG-vW-Rum6m=Exҝ2_([WMĠ#-ҤW 垲w+~϶ZA._Ħ:c'VJ'"VV⾹)&D^/c0^n5&0 Τl(%o]b<*NU3$V ;3VГs]T@vDԥwz/Gl|c:i>^3%|qRfo8?^4O1iQ'HurQ)Ml߯;LtA,W[xPctrIZZ૵j5tgɅn3c/K̾V+>?E^h,w +ݥs5~UAʄ# +;GHjƹ|.`>ّ!&62,<Զ+ʏǢӉZ ^-uo܆OFv-wN`q?֮m}?q=m{Fa5WBx5Q8]6S6{[[K f?h%?㲻UQ2!kLOj!)Wuo2!Gy[4FERMؔS+3hn 2ư ‹Gcv֭d 4[3[fy#צSV fe%9d;67"-̭ }P<۲,‰9 $B`?:2 +b'\^ Qth3(+{1?6 ˥nb, 2+#9o??=?mGل!vM]ͮ59^qS9^<=?CbSepg 9_L28`op P/-oY5.89䢁1Q}UG0Wzo:Ö-՘wB{¼v]%D2@>q怖syLwwKulaM{ŎΥtFy}#|E|/8xD ٿḩ^j)3|DL:#K(jl|3ƹGdOtP%eZL"ыvci!'h}@v Z!_;Z")!+T/Lrh]}A}b ؝b1(qPQdKp/Xh`;i_m#f$Ot!m!i3r-'Klx\b CPDޟ$Wrs635I_\`EUYf‡U/kz?f+)h#K_ B/j ~_2YUENj{> Aޞ^-~ x DgTk概!R9^vːy~hYK8o-3yY̅i!oR@7VYk?xYigS/hy{ft/.Thۈ+wꀀ)^`6 @ GJ%?L-W *s+ݮ|\EQ"쇾E_%9yְMߙK9{=Q!\CкGT<5cL$:$Ļ\:3^QL籿J otNYG}'^z:!/;\([oh!v6~5sMj7RPr+=Cfa&ElT-Aj@1:#jjQQTrvY_'Ux֯`&]L㐚b `rξPsF[=v.eSxNlZ'"3b4hҶ%oIyA&r-?/ eAQ'<s3QRRpkJ@` +Z?2WEHctD|OXz{lΒWR({TsLM;6 Gd c֥B/ c񲴙AlXKe|'KSjY' t5T^BD9yベ9.g+CX2{PdToZbln\Se)oʑJ6b//;/)zH sh ?mB^ŸyfݵL?&SOޮ=ER8ވSWZFr00SjT5?ajͫ1ՃT2h5HRZeCcvwsE({B)'=sPdNcmw-ݳQk,=~E\(@.}7onE|MQ'vfnYZ#(Č\P[<4?s,QUțS Ys>{I2b L/3{÷i)hN\!{VtaT:a_݂K ӟ/rV\t겜hLI^PH3.,ї0J +go2Bh:aodDD'*A aՊvߡޮ4Έ+YS +hdX{vPd3 +ĥj\U0sUkan>AhNOdN牞/4|0$ X M)aUզdD lO2&~->Q"S,SLI#E̜(Zy#q|˕WV^逮0;Dfț!mF{\AX` }.JIY#\qrgKu!sn8nL8GjmgR@[oԲv^=uC>MMO%7!I}|yG^e\gL}85-v̺=t}JΤ"?wSi 'L=VXX s-džԫJt[ bXO RI۲_`&R:WM&KVU0(u' +Bdғn:aq:Nj,nBĻSL"8$/uCxzVhOi-!oL7> Gs [xRuGZ5^oOׁt?#8PZ%=.mgbsGFd۷.з'm`7:: G@]ghɡ/3sN)s[Pb</[͙p~v"vZt}A-<{GC磍< 6(m?T'e:Ac +9_CFDZc n,ȅQT$0c++S(kg( k>U';ߙKχO}hjKW˙#-y)n&-൳2HE#*7| h{`Sn}UFbyM :٪5-Ty{x-b#)>O\uf E:V~2%y/8A`ec]]OIDǏ < +g>/ /7gOԓ>O=9m('g)nڝNM0@u1rk}N?/04g}?uT'8=a}N'|φ9Z\ĈS{fpe9]l#:W=.$Wb(MR@z}y?49D.$.Jd=sSjªV*+/-. j8G|7߃:+LbV9FN<İݮG0@h.P1 G~Ϡ=~gQ<ܘ[\ͦG>hjաʚ woodğj3Ig xibCC'Wmλ$:s-} }cGW\fʵKa:zJhk +ݽ3mMێ~` azH=&9X9Tg *IO|hwVrbURF7HI.WJLv0c:Ekv7'ñ!m?)U㴀h'b䓓2@T +~Ykg3^|zFsWJ/%ub(soihRm=ƏsHʠ'҄Bk:p]FŊkv!MAn]&ٕz .碨+ዑ(a"e2ʕm 5DxpD4Ny5#a +RR'~6 ,ߐF2 H1"=t>אyk,|߇ IA[ +I![ᘰ]Y1!LlIo:*Ci5lŏ#B ~LU `@In ![{d0om􌶣XmO C'\H*QJ&zTlsBEnLd8#':G_HQ: +4)\ާ@fFqZ(V?κXLK l_7sq 8-XǘxJCE3xoeG:8>/_>k^ BAQw0LP.;!TKw+1>8_+hvg-*\H;爠pfnSRq3120wX;S}}Po9F$|;wѱPfm`48㎡N|֟_[RoN` '=h@^2ODQN͙)=/'NYC2x'ũ~X2Cl`wfm8!|=ʷGw)zԈ Wʐ`;:\H}"+>BS%=Z `d 7Y!+}Gwɒ Z|Kl#@S.kě!*W1nyO[IyCSKŮא;U\F# v ^_b ؐx;4l >k` +q]^&'C8c / ;Ǚ<]:;N4 f(6 [dL:WӚ=go~peAٕVL?Pc>e3 e0Bi 6fhμ&h?{/iefhE zs5 <S. "[CJYMWwwA-h-ޥ!}ۯC Cdln ͞e/-b@.JecPUV! +ŠVZGy=LZC!R?R;fީr;gAxE_+`|y ۗjxfT5!MԮiy[JNZ-7(hے8pP+gmmJ#bBvU^*DU'$HȳD{ ?mv3e-H'믮ۗ1REDsG8JIM^(0Yj#ΥsjA23F=΂'S3k"8YU}xJ+A"Yğ3޵@^<JtH{]bY"kʶX_//F-RlX文UGCGci}AӂN%'{0qٺ3!/*%l,_RM>$ Hĥ)G6+cAAl0@rnGgt Zڝt㪳B f}5le&spޤ7E_!ܐg0}CC:,*9wx/;:p5Qs03\~$6;Wp=R R#tM΃C`.7 +o?M̚flMQZu(״`9L;4mCvxep~t +ho5&P t͐dw99`ҀY3*lF_TG,3R(qdSbU~ؚ6b +lknKVgicœ$o+CKyjxL`V{t$Fqy׶;`6?+xjsY^/ ot+0 sus}^,ʐJ9^ +]j]3눋7Aʀ=`J0ǖC̓v|8Z 隒ɿ qݸz;0P6jEϵm +ވ~E5ٲJ#k6E*Rɂ BFB|-oȺQD#>Z"\\R*Z aLFg ^U(wGDu?1(W )PźNRz,Ix\G;|yAG}sŝ 6rPOǠԐ b͆_ \ +~{(}pƽ{5u|ʗӖCHinWjG(9aȓKpx."s iQ& 5uhq/`<2I&s⇷-Êx. HSLgQ7XV(U>Q2r7PQœץ\{9eFd1rvFS^g/Nf[9ϙE/%jf!M̝ 2sokH/6}αzG}ZhQiq\GFy'!~ԉEVŎY*ų!DBjz^L"\q!Xx8a:lHr:"G{V7m\=d?x%N;ܦ~͙}l|yVEW$-L #֗=\f;!E&:v!b=RETRgi"6@_ӌ;ݵaRf{KMxwJC$VUg¬kͷ^IMʴEوQ{ aWRĸV4Y¨OCg5FUM|+ӫ Ç5߮B-{&DE6;. MɅZ03kCل w9h`Xb̥x?թj#猪_Ӏ%蝏 :w O4ǟcu/3am:͞b~F KeX)S$xl(Jp#ؕm1eo>56+&@wm9'!:.O-g)^1zG"8*OK3UAC2:o1b5ky CxN- t8ĒZ0y'ʧ3p35>ëV*8 ++NiQH  FJVWMۿ|pX W+x'85n5X:r1n8ʖsdg&0S>f4ķ pYkҝ!+"[#HXtOp96ne, 5D;2}L'=+NMF ^ +oT;[vyZBrVdz+zM-שA8dH/f|RE4H%'%ɔ r)˥t H+3ѵ`1{-CCmj ث$#nt<ꑀA^ u^ptxutS#qQC<+ws,M F/oQx,m|4Ro +#s4=S(il2 Q^&c<@8;-PĐ{2O! ɝk*ȡ1Lsh,{P0WѝΒ|S&{E8{P!]՗VNMw`mq# 5J_ +|z1yҥIx/dSֶ͝ /O8i^FF\rZ#%V8׭;]wRR9 CG[[Gtee w_ +t? H,^[f%{&q>XmJiF|/P=xm=X|: He͂W%ꊙM=Muf_qmS2{IǮ,i)5uN FD7LSW)b&Y9ks UxNʍI+C-.er9YY`^7ΆC_&:AI\~ClsNcwDыf>o"^n2q@ eV- +ҥΕzW/Vq\LOL5t%*I0mEޕ>re*nlz,Q%K < iat*mE$*Tkd9Q R$d7iULM-v7UR?HU3/:AԯklR%ӊ)5T +$M&[ +;(3\i+%"r%:d.gfB~G{};q7R}*hzdS6A>m掶MMK!k^K}>T&/A}@e 0ڶS{Hql +h¾g)eSpz=恗}kq@ e9ױ6 2wOe`Щh껢e"TfHD4zBfiB'Tzyu!C*t~q{-0(^]uH ]:aK 'x'!A毘yi$D ;5c{ +ZOS{>@-z(e0ZS?Yj>C؃"VC=cM2dVf-zϝd%&ޕ i&"}uJȼ\FMӄhsI4~{LWr&KX/UȔ5<㾗]O^ >p`w_3fz[)mW 3>QfO"!g"4Ѣlts[o@k|cn{>il.'1L ~Ib}& ΄Tw: a[jR|S! J=\v@r؟[_dN"_iwfG;xܾfkwM_ulڟz(F-$sL/\^APp(xoRZp) wsAy0"j4VSx92w^a#v4(,AHX$}/oʄ6WPY;5Yjx)6A^!cP`2**IO Q"~6pʚ^KsFH!~=Rn7D@&R=~^#&\PC"v>Lns$܋'8­m)JHD'X֨*XBx"$|qi`&A &U}:%t-<}<C +zImiBoh_dR:&j\ܶ6}Gud槂 +%(]hQDIVm8XI0qqOz;CC>H(WŦ(~[1KT?g>t랧FxNCD5G}Ae5rIGS iwΐۜ@`>e9BFv-'ɯV/1%Ϝ-t c#=(qdmu0aJq\P謝r#N)e OivUKԈ[QwnnufC1G$ýu̩yTph,o38wyh~wwHz .Q$}+ gD rH+!:?BsJ7haqXӅP8MAeԣ 8ЂAk;&կ83GMaZ&sj}Yy-7Eal5 qVj{ +]u@*߿P 6Ȟ0U/JN&-"1^r(T]gÙqa#LW0SSz\RdgR6!HR%T8>{ QP#=qziK޵#سcL3uQ$G+gG+yP:Ch[;\x$+Á C +ҜPOl.~L;Tn!!$tӇz!NJϸeWa0U1{yCT=W}c8B,HWrJ]B{lT2:b9_,#wܣlfξ `EX8zM>c6J#ؾ0*8D^ߨ'z]}0'罶\Bђ&˳ŋzqR;+®TxsgQJ]ipQjwGlWK?jKYiT_Pbu).V"KP4y'yFS*JIJa+PIv5TzQۮAn]FEZ`,s2¢7W\]D+cDsL9N9 1-d9MCtT"ʚEu0PgʴuvUi'fS~{Rso܋4ai[qh)N^F|P۶>ڏR|jF*1 9jVCOeԙ\fS0 jfV$PHqC^Oڡ~KvXIH? ȿZS(B1u_N=PƳb MŞYלE/k?B⎇B[q2ߌh5~ȟΚ;^+]b` K3dT)r4_Iz ,#IwU + hҘK :/";f͐mO\2鏘SK]wxRuQណ-iƆ&A2%ZcW4Wg#gS-=l39 a;yG G;BSW{鴍/~e_~)H"@ P7y+T,;MH0P@3ygM0.6jMzCl8✉Wzټc+cb#|JL;bI_LC0"@ +]7`W$ m() }ͻP%ᝐx֥H +_XY[+@)lɊIQ $e;b/Zt^o~ r8RgmWv4_LH/3} E"Bup; +Oi!ɇ,{T|`ŏVHX>ƜhYzj},GxkyAGg6F %-t̩er/Q />W#\Hu%bzjx CRE9+8c+ƫyƳ>w ~9 (E@~N8|N2|>:B떢/&Ff­Jy +!GJwH=65HGx +hc]3Gl=ֽY V&<9PVjFU + Nj$%ԏ{"*^!KZ3W%J!tc#/Hn#EѭpX`4b4 T9% +D;0^;U泉[xS8+Lb\/fP|GyT'9ThnTxJ+>1!7by]aMU j e/dns#*¡K)78[D;Uji(x hH_㸿:3"{j*\#FKtGx, > Rfi(+ECXIg@E'"5*IqFSJ~+1TƣuÒ=Z朸0QD, u:+Z}P]I)nk]>(reBUo$Mp4* tl0*X^g.eŘ1~R7甩6+epAĞũV.Oڽm(e:)3O.EYzv 2EU^$@MKq;,*OVCȞ;WY[Pc+U:єf^q0B#E*IJ\o-εGKKBa[6ʍ]$d;VCfH. U*k7'EF\c7_&iWBc=!R|~2 +dxb-r/VG94IC5*QE B7Nh5$ySXVGlD2z~^/g7k'Z:,N N{ I`ˈ|̉Օ6;> Yr!8a[j}]Ea&ve<?7󋺢lH<փ}:qY2gY>UHRfOЬnZ3:Wi- CT#*] ڝ^2E]Up礀t'ÇKUEATMGftTijg2+vԸY%;xtpVQU(s}sg|mgDV5]p.y~kEoJG'$¨qjysD"4bЏKP̃Z0~ Bv$O9&P^HJxx=HD~܏n-d{R qWg<_9iJ[@P] i~+Koo>O?GO^#t/و%ej(<.9g y]莪QkGkK`H#Ed^J5QSe%h?F$v>G#-3|Ng׼s30ȶ%A*\׉|qauP{Z 8"1sN"a nVS00\/_30sy +-U2 @S%#JSZcsɼRvix>~ ?D\@T ُș!nѢ'n~E ~{s@XL^"LU.V~pߧ- KTKy.֔n.3*G9BeW{tQ ᄃ 0C'@~!eC?#2'bQC >ADZ4O Cr')Wk/~E/x,UAvhmg7}HTk;g##! )jԒ}&ơnC:{wݷW6Bբp3:_Fe"d߸bT +P}VZsGc-.,s򘸃ңQ  W:zDص#;C@؛/;B<zujZ<׏8u˹9PGQ7++E + D+g[seR1S?L90.D[ᖜAJ bAPhXL[{(aƢ':(ne>^CKgqb:r#h1{ja3CL?GyXL#  xhwsX HGvφѩ$TzGfQXmO;3AzM/Jw} zWZXA)]op %@B5%tT(h]x"ɛ_!'o +O:C]qkMmTm!tե7Ja"=2 UO^FuW@ŪJ"y6i`Um߮s2!+kvUq`#E.pأ*ӆq}иMgϲV:u;;T}:VO69"}BEU]%t2$CKkA&=>A ˱| 8{dIðQ՟gqjjik;Yɔno?ˡ %6YE8S +OG%1i (<y4}W)7 چH/bzlKkHCA!S4CB!g2f_QӈrS9Bե:Oh{>1MBɈs=냹Z 4kF* 쓿XGLl Rޢ5)^jQ2!ș]EmSݺ8D/*[JHD#L!-go1AiqgH*ʦe*p:㭗{3 kŦ[g@3Rk"Ē8fDE'=f3Y;eCӠJC%RWE͎&iF;=ϟ/9F )˥z}xS؃:kXQh""+Qk-$m+fcGUdeTŴLtnYe{`F;xͿ &Yr?$ i*T$k} +st^Q}0O&ś/jQ5-Z"s`(I-X-^j?2R٘@ + AFkQ-Xi+kxF8zmD~OZI<,f VԿ)gQ1Az<ӇD<rvK'kyb|%/ΏdCOANDƂ~{oΆqTK ļKջL\!![_|{UǾ*AG&c`Wys"Z$|@ _'y3ܙ}yJVhԚq[qicn"f9S8cXEw|&ۘ.i :^,mmtG/}}=lL@au jY+pQʦ{d~j2/&=t8x$@nQavEA4 Ǩ(%NVaSÝ1H 5JAjY>fK%JdrN^ͮrϭP8]6b. OX80_V6 -w- t"O:  l]M #l3bF2ٙWV.:vtm|(j5@ ?ku%}*5h.LՓEjH"AZ:vrh* alh0X:}%py;%Qr@l8V䖖z&[|a NJ0Bcd#,+'H 4BpLl%o7{O03FMQ5-d-=G\3 +{;)) +3Uu;$LI !c{cL$o8i_QDNzz{ %| (O{+4}uVU +v鈶&*׿lK }`S*RfգU?6N~4Wܗc9vX^g}Q_9؞{B!$6k'{™٫F"ۼzVvw4,]+ƒV{L&$h78 MFoɦ2#fhC| x:g9bQ:'#K5DY=z#bP7xem\y8_V M՞8p(yݭ:|9d3{oٸ(9=vr 9ft#GΨ\ #q3Ml>Sg(o! GEF_w /Vn^VޥN_LfHѣ;sR+tr^ y͇GJՅg 6ёqn/yڟ#oIax@VHtȉ#_ Z/e7žKoR"+p18~D +Iu@|xy{!3/zOgP#CdK!u~ĞC7|ޓ5l7Qɴ_ {#G7NazDG;zt#(Z _VO}Pk{4`юR# +.wTډ$x\[N[?N%Z AF;~-ORs7M98 7Z$nCZJηsW?:ZN]hn9TQRƲKdW47A ySR"cCw:Q9&+Xq˞֏Fb@9.cUU ܙܥKHZ PD; 1TG3磿,H=e;HV[RyFY౒"dʆ>.`y{}cj8#n+e̳"aE}a>̠\I{~SaPSy(7-ݰׅu,9|7L롃XZbQЖ1*y3\:ThQ+#㣿$XSaYxTEkC@e旼9.EFa"!̥\|d /;rd<+USG9!`1lCvE !FB(1CTU84-t5>BP[AVU Dʙž~s3yi.h u|HB |Yd1i& b dRH'\.h@Y}}o3%fa*wxUM'x +̦+4;ݼy L}'WM3Buɚ0iH`q(wPt)7؜W=E9'Y6UͧZEӕ{2.euE<'ȡ=c!/J%S*.M^n-jF!y9ΜE62cdFyu.NKgu + ""/5) +Aj؈FM`oɰylS~_(^]$ +=#9DhEzw"(Ub",q=3o5NjpIx؛uM~1SKwz[ &/)ݴi~kls + $|}tj`9V-ڬn3~Zl.ӵȮc |9g@$n4b4Ⓝ'Ojk@c,Rrk +/i![w5:wZ)|+-@zccsZko-4#%dݺg+Ψ*&*4<]k oՖv5p +ĠNT?Ra0΢`hU͙#3Q3mUhAcfS.犁yb=ΈJ%O< z19kR]G{R$ALDbJ\`rēKWzKֵLGHuÝi/~2oT/aYRăSҧJxaSQRȹRWFR05ElXG`@qEՙv@X<k~fxBdQ@$.kVyLD#y!q_F;6HơDS3Qq}i@9KxD2ʷRizfA6>ḧ/1?}$- +3(iFh(/OV`{"Ž +) U Pb”̄k!>/l1#y( -0T@^ VG$tP PfѳRRJ'5\^X V}`)Uc{ (HkH~sFu0MbX(4K BH\/!<RM`SxN + +۟jEhѶυޜ0>CT0z G×q>3ljщcyb*<S")7̩q@~T]4DfaQ(Mww}ni;ɖ\Dz;L" ٍvN֊b}.D>5L"9TX)o'a `f?<_B$VwtPˣqƛ)5ڣۦD!=&B==] +7iT=Xՠ Gﲒʙ})UA"lގ|[آe:C!=9' \qljHJͧ `v_q8r{ikRH]?íL5[Ōdli.3:^ތuy/6ZvBx1U! ֍=$dcc;έՐnW]w +P9z&N k({gTA_OjU X?ι̕}~pz-*e+ߨ.G%>mp"k;GoyV;>La['X:gk)q-3'>6g˓J +U:k& `'CiX4t*h$ggPw;#F3ZHE<6ܩ^jkٔ% ,]O/[73Z%ؐu%)pvT¤+akxP՜a;9|чRxn+3;*`6^zޚ&P +2hFzhP`(F=s"Nͯn8i^\A~^.4w(E +\#RG̰fYsdi'a{ס$69 8]μxy!/ +^~0qC}&%x1lR{ŎS)!C9c\]g*4̈ qgUC2|tR'5#sW03~{'u9 =yLd¸eBuGPHT u3=32~mW/޽ tw>)mCxjйO>`C\5Ϛw~ɴSh{|z)3ߛkF-8{hZ%æIgHD+j#AR 4k1pstt8Isy 5 {Ѧ>5M$fJx7 ;lIEO'S5;QlݠRdWM " !Ql h$Xڈ@*2-=b9?sXO/ytQ5} f5"ULJY/*w.1ΥޑBC'~xi-ŶYRrhGx~n!ލ%յ%žv7 lЍHP FH/+|8Li -~C+YPꎌ )t/jJ\^^j$)dq(>ۇw< 7z}r|ϹдFBU r> "`Ф8km#6bmdbAdo:Kl`zR.LAl4CH%,n9 +9HQ1HEKk [ t+74~y=uhNu*:E6B4ZDut^=fC]: -d0 DD̬xk goqhhXpWow'xK(4'"k 7G!ę0eهwZaŷs~V[]Z T&~T h91NW,B`X`}08hG_wl|9=[򍜈;Jя|g_"Ixʝy99vCԙ:/S\q"lpP̔Ƞ[yi!8HA搻:D!mff*DKZ(p;qйFU/ݘ>SV]K"==:}=҂ZP󵷞Hr%XQ)Ly}V2YNib/|8(mO-ėܲXKV0l5'ޏ?RWq.7tG*^UZ yCƚ4) ZRbj`FE~󱿗dx{oT5mN`RH郩DYHHsjhIUZԖFI`%JiO=ەU*vAkX%:}]9]ֲEӋ G` +ѣbpLjyg,zau o϶~tZ7) acz}vͿspɘJ00WW"ŧ!`\v֕[VEtPCݾ- -qǀr쬀aޭ| efQ$#QL 'nd}ryyAqϬF;k^xi=FH)7Rs{@HTk(%WyrA)IoM bG`O}PdN8[oa%ʭh}T6,nDn9?;/ :tp /m%3j +ॷe;ctc(T5`J D`l_2Zgm+^z-_lPz?AF-G5İ@j9_#5noch\A{K2Ϯ8x#+gTj<]DkCPg~n1$6va"bβ㮓n:z!imDn4md.ScpI~у7 dfZt>(&/t<$wR"Kӥo8aAxtKum[F+J ~FM +nu +j$A1$9?7l +oG'rPpwͮ6_rSӇѺ.?5| nS#pե0)AM@Sԝd0I FBA"a](~kIB( +EXK +>{™]5h4*y|fG'Z59d^{)m:c0Zd/䌒 jLfJw}8Pi_1k#,G-?zB#G\T\!WY\O Attй`z}-6j%3on'iupQ7/$K߅fw]Cv%Ici>`7%Cs 6W zK)k E;]yVF;!0{oji$\u70#eѷ׽ +ɷ+fz>˳; =pFJlf-.jg *y۸ؼ{B弢Ej>n参-ty7ElVZK5EjaQj i)p=@rW*!)_̃št͊Ml,{랟Be M)5՞!’ ɥҊuȼjG~j m4"$#gaDELFT.1Rw[c nҎl*3j>sjZsG + 6О {=$Y̪=;h7yA;|GTW\Rw>kB"* P:hpߥm{aɤo;/uvTܹQCwD+9g/Y*˖. +q J4)C&3񿹳0Fn pXswb6ͣI2>m#0 Qo^>.10 mэUD +kxAAK8nhO<^+MQD'v~L1S"VK5ё+鸚y8_#ၩVבRN/׈p}gpDvۥC̯XϭAn<{.8[EpAmn{: cǻʫjc4b;H1`ǘ|0޺O$twXƩ=H]W !u >"E}UGm;s&U)e<$B;! +vYM"={jr9.խj|m|!`o:KWA*:fpX_0Dݏ4vnBv*e>}K0l V4C6,d*@&j<$+;@bXsnVv 5gFM++P{6]&ټZ +4R^Z%K't$aڵvD*:bN_p=*aWOZaybҰvQq~U_ xsV |X='B9"l'걓jq@~;)BV֧ +wuu=*l%0r!ZNT(r*ֶ2爘O0OGhܥL>Hl7'FaQ,Wv\h5TH#b,K6*Y=ϙ!bO.j-}pC(k4o[X0ԽdҀueOrM}XĽDK<$O$6<()gQ O8I +8KgGV +Wػ㣓#*Lՠ;"t'%4!μz4XZ }/'8ċ٘u\\'t<ڝ'BgxTU*U:A=2h#';PK> KWMkVO)X`:CŅD +B~s͜ +ELiGI#OεP'HAuW2cͅY>kfbOV3gN͕a[{kߓϪ8%VD <•t CPzvilW21O˞ krq *SC\;Uw| GjZPP=EC5O1F5K i.;ZywJb-nUqo+=&&t8l`Vfz~;YJ +яhM r#U.JaYgjJ_ +D):ܪ=ؔ?c$dVnڏV(aPxg\:/F:#3sAFZ@j};[K6O}7[ĹϪd6!Y +Ί4!h9'Gc*\ E~.+%xs?l0 zhΓz}0Ze +=Z15x +$J3OQW` +ﵻ//EuaT# T&FKFo6fs&JPDsV?ߜsxܤCGhCNY[Ǿ2fg׳ PU%*D$[J.6]A^?4pK:nbI*t 8Bq0wa!.H׹t6kA ]7v}͆ 1l1JjoJ +=]Lͨ?يPG_O Ǘb+|66W}%.:86Mki$k=$0{ۥ?œKtmVKJ?]ZWм[(/|ՅjvA,!q>SiCa=ڸ:hAѵF2)V~5N8V=KJَSyVE֮'v~o{d}m{w:~w6;9U%RFljAIȲ?#okuwaͬ\X)WL]s#%q7Mo:sekUSDc}fp+B=;f ዑ1Px׌۹9{o'?q5&U@?-3ˁ[={DE0~˽VQ[Q=3vΫ7ԗhj3QwFU~'w{1%]ȁYtP 8p$x^Ot"(:w?W^\Z܀6)O[DMKw~W9t@n ѽFe˪^@e~%0+E9C|uJU2V=˨/*䊭RH?OZy-HA<ZyF^;BQ׉5m_〼] $xLjQ'}*QNDpc>XRc`gD3Njr ;w{ Yf@?@)cfST?aZYH+ :Q(2%a,u +va7A&UU LfN4C߻I*2ذ|uRaqCTc+R>)$L +gazS'{L])d!79M]>L et;)%8Eӳ8"9GAˈ5Qٿ%\!m!S؊GtW4؂ds/’Yamh~v^Y"6;}hJ XwFb2N EUB*5W!qcx~o|cwLØh!fqGi[D +\5sR dS$2j:\&zL,=~'U|qs +]/R ![kB Y3&hP-ΑQ5YMN'lRM]rjO̶7-( @3]r (Le endstream endobj 43 0 obj <>stream +mQXNZ%jÄonl42B别q4-&8la=xB^M +pוp0!@[Y& EP >! r'@&_nJgkgbݝ4%tLY=tZ̓4Kx/<(,T^T傆iPg c8 ][:jBS"moqYYdOݤj_Klfd7Zqn5b  "vMWf'gE"b[ChZ5ڔ]cxkk"3֓y!/xNӉJrK~.$#&夕!k^Yc:@'D=4=L)wRCt^HI^sb +ZAg 8vgC)m/O'M#8ZD1|)%#*ԜW\ZR +RlZO (+n8 }1 + +),;E!;}k\]cZ%P-(L[c:dxF|G#_b;l!^7 3qT5Ŧu?׶ |PhM3*'}H^<Gs>W"-^ڠL?8ܗQI4͆p]\7cw=cN 5F߯W̃VӚXѯpN^6vRrRIp@PN_Z0Y 7Ƿ!Zy"}QCmnAcIk[i@+@ʆxjq'6زr17='[ؑd5ۙZ7nz̜*:݉r6lͳBv`YRQT%+`c=wJEb`z 9rbo@LQ(]ˏ ?r 8R^ֆsSp;⼕eT[鋟y" Դ@Vl :Ji:@ܱ6_ UR{ٝ/_bng,N7]cFQ .MY3ifgxڐ%n +!6{y&Z4CHƒy ]s\G:$kI6tW9w!-{OHhq N˵8dxƎArOpKbM^@?=?<'W;чՃčN܆Y/깱j# I_8h%EO>0(ۈ6$٦@79/7#^)~? l1$@;ֻ1y}Â>#óa$Έҕ>Zf?{1?B,_xBی@+mw *V b@ + HckL1nMp5lqG:>lwGRU v,*S+]]TNYrOIYTEn=;wBU|7xhjWDh>c4'$wWK(}*G=Ȍf/T[8i|9!.E ~R%X~Х~W1]hx[̨pCԏ2]hrs~ºEBD쬴9"eUեg6(a)i!7iL qh˱(~Fʦ-.Π\C"qq/j|&"gEУ֜׳_ m{ΪrA O"(m(;fW$ *H:zS`6gz+čâYB%)L#IljY{<xmʿU԰BWN6 -$bʩsѼEw2dOaxj6][@*Yi1sUZZhG +$pմ9lR9۽t npJ4P/)|jOuv&3HT H6!gQ٢.Aa^f7#xW6 +0ΑnPr۹4xoϷNΊ/n蔹mGm-K#k m0|W7 5J!1O({N1 o2+XS9K,fPR yrW&9 Yil[DUK: /+dMߑ\CNCO {d:\hdYerv<"O3Q6j' +{+5g{1>I(gQf,a?~&JQs)KȆT< +g BO͊4 % +!g2$] Zҡ3sShOvL$'犪ǦȆU2"Yڕ\J"o;=JWMCcЕTL67YUMbWܮ=6q^¡V=ODW9?pY|q+JP26Qf",q3T(\ +fvޡSkTtZ#X.P@Az3j/rABrdk/\q/#dg}y7gN{{{G=}] +sМٌI2P(x%.K1P-1<khE&(A3xoGRHv_k;CL*ϼW +6P3V|'2)N#3&&!8UHy"8}NTD,G5+Ȭ_ns3|:iy#hi<= APVֈ.`JO-sSJ(4kk!l2{j18ircR{ ڵU×?!G|^>(! ^>.wyty\~tIG"roc`6gǝm!Y #7ReH[D4nhAZt"Dcw1Q}O}oPx -+ՙ0 vΨo!q`G t!/m\xL| бn*}3ق0bY,p} 3iNױc(mLIͳ鴴sZQA;\L&`يN=փ (:̐]5}#^'Fa.plJW|vg`ؘ ‡aY2)LyPMejJOcPX@߱YǛWt_֐[xzGCnwu퍢Җ8 143`M=&5QzN:}g/Wu/ HOsg靫dGBQyl#^ vV2Ec9R"vhvTmlڢ/asM$MJ>pċ͎rBLwcPC~>YVo-3͙N-)~ܰ zNzldŽFϙMњjC[vSyۖiR '.vfTCt3+i<54SGGԣ'Pš$)5NOCW#z7Xd`B{s_R (_*Kf!,& +^r630ݲȕ2Kf~rH%r]y7nd ^#hKtfm ~o 3(r؈) :NNʏ "Q{|S;h7hEDPlN0*ڽ4(ת2g2$z^]륳;$ʻhշhig +@vItpd[@@{Ť*/7{&ETBgrS#ml#]{PxEY:<}D37h00c|U4f>E= +jl4 9;ZCNŽ@ b27oS`ݭP I pbaU!;n؊8{d͛ĉV¶\ء;ׯT(ocKf0NHt2*Qw ,`h3to[b^@m *Yo@T3U<*^]u!Zc`HSIqҥ00[b}9O.NϣtF<=lTzQ؁pg|ҥS=F\8`\WpZ(!l״(<Ԙ-{Z7(/[H;q''ʧM\Z,.8ijX@4%Й%v}0O%y ⅳ){B%ڬK28{$/bHR@˔--0D9:99as;S7 +!/ ]l/a2ץ.Ezx7Z&<)m<4>Po49>P="q3`.Cc/X`.1Ѕ{;qGwm82Aʨƛw 7ε+P#8rE- q-f¹LvlF +hAN/ƲU9Uss ^pLuqWf['ۮ'9AU o> ώ^9[s7$%T&u) Ml%| Db[V@'a\^[<ĝ{[8X.n:`C5"Sfj2V+|+W M,nfŚ jGRUtMZ$xA4mbY9 uR +\WTخmM>&}ѩBo+ +K43LNŠ0L9uѸ<]h.%멁Q k-4qDGQ ͇qTVy$6n "?Iwq+|c 4x6'o|A'? +֪-3 c@M;I`4a2 qF4V;&m7q"7C`(>geʸ{Zmɗ>ema^Q'2t?.vV9B;Xn~zIHK*bo8[gJB +,{a@]X?)W@Ωj1k9B B\:>=DנOKc֋юe>?u?KTB_^!Ldy +'4sn+2G4s+(:M7ji"/|MÇWM2\{vatFO)I"ݑ_5i]2{bN ]]swS,7 CS)W]]Pb:{duz8 ٽM:RAH{nf)m*⎃ihmMׁLfTЁgğ`h-ҧs".sJOGafK@2eP57iαx?)W{A6(g~՘6ܖA&gk1`z7Sj/5eAS07ͦzt~ԛ`I9]R#Wm%cbfg'eڂZ1ع%j/IOf|/ 1$K2&@;'&y5{W,̆"__PQ$1&sN?u۠;=86]J>Pthmanߣ:̇y*BX5v_| 㵎4y}-Rn6͹ϙ(sSjnjHT2[b ʨzS2o+X`i{76gє9_|w y!g]zs]~@boL: ?L?a{h7BAIcb[ 9ƨSOLb>8_dDn;ȳyb`d}s4 S= k9s#niQx w#Wk>_1E9cۦ-K|Lz G}$quK5n'@S'y=@RpKoJ {w#v&ۅrG7mg,,7 Dȳ܃  +7ZkځjI3z!A!xf AhlBu%'cLڷL_ץtXL{A'@AKPC/ac}`|u<2RK"mw:WyH9RӞu~kw5sbAlMANsgea#l*n&9 FKhɝ, IC,Quq21>Оby!-T@oe5;9K3bR{#Au)p$x̺^,xaIۜɜ\s&H!z yvX,_KR?֌@v{ɍ;i,TQK-^>2_N3~i>T"(wٮ>N'3:D( +Z$Rf"CF%8 :OckGV[ 4}xe/5Aa 9h7uy$a[t^ՠ#Ki{wUt DҐYd-0V'bOq ^4Rdb8w<Đ /Q(Vu˂btuIs鲨[y拟 зBwu?N疔^}-\ g7,kui +|jj^'̾U9'٧,"{0mӴ=[ܧ k;= +A%Ղ}B؈jaŹju'swv?d},>asR +o-c¤6_!byT~i2R̞e[)b<S^jdT*Aމ`$-+ )xc>|\,K׫ҏs9W1$G[%F#;G9iKMKVRӋ%z&IYy)E ۿԘs~WQN4CHWdrX2W +\۱ BCSQ(seCv^;B=ϨTqN ~0^LwgDB{↍5VFDT[vT^>k ?*&t7̣*Xk\ ُ3bmO;DZd L8jɄcDY9Q /8 H~5(س\6u y?8ڧ _2 -T lg [oa:Ψ\\|̽(~lTdiZԊdVWM@R-y$(!3Ѓ(<֞}]Yb)2!7B2g0>$x ` siy=efBRb3@%p~&pQ$Ͽt|n0/8BG4z/o2[Ri36".z5DqR85@JKN)5PP ~j/,>g_[]M#ڸG ̓ŮI[ NR\m2"R|QI(S!歭ꡞiCjo "60j)#dptF%x%c(8hxA21aR˨auYTWD~bCMvՐYmooPpOWL |7rhUGldd)U9m&g5դh6_Ni"եPR4O|s8᩷`m3|T W7q-M(f{ԤRIU\G`=F%kÉk 8[^k}fwGOhG +{4j]RTCq  q2'Թrי^@_}Az#żKJ qE+Y-޻n./hJī+1(ePu} jy7IBikBhnܫF{B Pp|Ͻtez9'E?ۋwsm\'3C6g(w0%?U{ieԢv0; +̷'UvfD=ڴ] 1 =:`#znQDz0R~gȷU=0}mt/Ñes12k2Sp$v xO. m} 3L DDo}>"-R Rݨ܉cg.Zy ϟs ӝ[As!2d|zO7@1{z$%d\Nb =n*̆|szը +JR_u0!qe'JF::كLu *+xJAr˰hx֐;ŽQR> ZtX|<׹N;K*Z~Wk%9A@<mMK}))URkHT$ȫ.GI4(<_&_ Qz^ H#/=:$_$uY3W _YU@Eq'z5£#<YjyD9w\57u%<'Y? ]_s])UnzGqׯ</K^1`NSu182iiXkPF( 1 HHCvL5䴦 +RRD6V'@n9rX$u:rIxLޓn A̿:e)m|G<)3O^ӑDh:E#RdqB"~ +(gh+ .>3 2d|r*+^1hwa1XDXp0?}u WJw\_ɐKm紐3tlO ; Y|q4[te\Ie m<=]?GU3*:xܫzIey REgN즘DH"9(|H(mZj69x?KB1M{AEp5[Jv!3u|CsI_y2_Kɳ[P :85wzf!/>x|tDc׀yEgA2/y+$?dCk60gy& Q= (Ck3}--QF$lhא;ա$然>C܅Czko!W<&RH8u-rE!}oe;`kPWc6-u552{6H0U !radCO +oL1JKF +ZTF;eA,DQV_3s=rb7^Xk6Wc$<Ë-ʦGryN :yJFʔU_%t2X]Af&7os +88{:loiژk/X"(eF=_!(L'>XOo2tU)( +_6+59%w#l, =?˥T6WU>X叶Rߕ,DG`p7BTdu[TnmssFܺUoA(:xҎBQDf5 +;.զ0B3?b;JQtDe=1 .b +ΕgNx c'v0cttV}H+V%8l=3Y|\g~ 0ٷF*\2] hk+WJ\(XUO)v(gyU1QBAW!L!Odaü85cc9p< ȱ,/*%YQood0出KbxE`F!Y0+{5Ա(nVs<(Q將 -}ʑE˂Xl䯸ʐ#_4rʳ)D%"#q-fv + +|)~BidҴP3Fu)~u,M7|$- +|7EJp#3݈{ ^4.U?.3;ke +HfZ=1>zDXⰴbR({Uo+{_ɐMу?E@q]˸ //eYgYtт?|!xcuIwX^cB=ajB&~!$7ʐ9G'l am)l{r)!0JH|yψa^t{apڜw #my^u$ .E`cgl.p͸wudg۲ s*w9q7ׄ)Rd ~QW"d0E?};RqM.G[,p EUU#>DPgx6Iz:mB`JF3#f m D-ҊFmjs3JKDMu! gxkxBf8bW,gʐ6l"[~#mK+YSp֥T 29.0Q(`XKJ>wn~w?8g(5/_E7;ᥥwjpG.;V"WQ^q:pO]j/*s+*`t!T|ђ=ۥbuv&\W$N!` A߮e "J9q(WUp|Y~vT0DtLų~E{B%[ydSo=m'P3?[W?t;͏ !r@@0ޅKc;JԷH`&L*V [3!a.mxԝ& 9\*tm$Kr)5'=CNޅ+!pt>KFsJk`u7>&[6-F)2#}d<֯̍t- جy_stH7P%鳃Ս?3~ j᳾ݰGdSV]bdh T5O+ܾݿV2DN]m +agwΦ29tD'jQcYvDz\/K!v?hj=!K'[DK' + * + +M^LN=Y|6,L]us|As*v`_O}n=A!17[:Р߷dNv#`k=dA녘Ї]Ȯ +taTt#}W^:O JT$ ®WxM.po,U_{םwb1@2xCŽ.v1%"K";^uxk+BDFDopOpmrSPgs|Gн8uOp,WQZ/Fdͮ[8 "=H9E4_|w^9suiۻzP=2>:41`LtGpVn<83=c.@!mk3{xg?rn{3X#A$Q.*ka~&.H2/-GNIa3sZg5`=϶m~5址1gjHLH dO*71 Da'T^-U8'pH,)y)AJ=*Mdk;0*)1A%UNQd;nVEU^eBIFD5j¼b # $ʍ6}K]VzE[6uim; (`?:O aX@8 V-:-RJɥ6Ro_bdu3uyĘ;6QE=b<< #N?C7FC!uZ"Yt@s={< RLz΃qlsd=]z5Hɶծ dW1[#C~nO2YU?yHɇ'am"zHjFЙ{Y||vnA_Vm5ip&y7d68uYKTx+^{ +Ufӳ͈/zg}3نxqXπG{,d.l=eӤ"Jl[LR6&>jPcyrLDSJUMqhx^1Pj!yoQ'Px +򨉫2{y$ֻyo<~^p*Qyi]σZFTѨnTD(A#az'^%Q=%`yeTe9J_ل&Ǡ^يcA RV 'ś?5yl:J}UDm3¸hŮ! @W3K_EYBM)b3T8bpU/74S[N[3jVzk9Zë}-^JۅU6W7 `e;{Vy\#7 @88?~԰5:qt8Ü3\|w@{oni@_j>)(W_C6#΃cn{ٺz!6^mdSˊw 4-g]Eqd b2g~KGdVxlOR + ^Ϥ]N8W\6cߥ:\*ϹDSbbG/xN `}0TNo|~U.Կ[E\W_`pvm:a($s3Yd|ԵTj gj: VHDyۑ:D[S2mwMu(E2uU[Yoilϖ~zjNwL)[GI("_$1̐{ A2s(ժ38Sgj3잘c 0!춧~Tˣ0&~秴oD4t۹ @5ZɳCO3Z{7}3Z3ՇsϜxhB؛!2:(?:ejV%wܯh%Xq9Z& }g98}_?n(LKWa8:' \#*/Sp +95H `9'Qv<Ɉ[xqu t_!̉Vdi4K~Ǝ)[P9تlTA=iVFfiTqzDA(n4EV.ܮx[dxLMk?l#t@fMpТQt2;*]S'MwdʼR3աՓ*R6[Mda;H/Q#b_i)tsF^?+83~-K+L91A9Ze7.Pn~3YX`%˿x)0hߪ l-滃qOȩn{RC̠FDA\| ( )TxG(^692ƿݖ xUʊ*ҢImݞw̅fR49pC?+2ha"& T( +cGDZh ŀ4H!qavs+G7o\Z\Ěg]'f$@<8Qįe6z! 4{2KXFÆ#t,`‘lF*U! + D^ @wnPҟ]b.خנ. z'ˀ=m ;ZU5 +昗4.FO~hHY<*lk\Q\U^v }94w^u~RF `^u{]~9qria!Uo/Bgt}bRM Kt|'ue6o,H̐C6hҟۇ6h6zS >?xm3[f0MZ@%TT0kPJ`p{nec+_J2I($u R-o/kMpa+ Nw{J]2}}63CxƧ_ <"W5 +i^ȭ(UQcQ_yKi)[0%Klܝ+ksP3e U;)ͶG]nΞm}BnsE㍇zx[aHM9bɓJ./EX4B01}/T<_nwi6|%LDzTu}B.^w q [X0|XѨ>3fˀd~[L?P% _I7zEZlW +_f/2ڏ^4#JD{Λs'B\%o 6G`3q[t2+l<`l80"j Gd{ \'P3I~=W 84iϣS6VᲇObk^1KV4Y=j0ɇ0=1gx060iJn +Ոt+M9=2 V#Z-62<~`aH\R[N,Ksge,XjpE2^2%jVx^?ݸyo=:"P^~zY'BE1'0ԁ"5Cs|cZ_(5GUy=?G1DLl>kfLUFmߩl(J s $ҟzͯ!qd{_ d8w(d#;]~c-"g oSczDy`Al 9106K[ :`^>4WKCk5l'wd#N@aun;xUGE&r#q^0{(R״4c/+yc +\8Ȟ)49T{T.NEy#7p<_x/*O\7ѭZ\&Pe>Q~&6+:r >Y4wKjIEQZd`E2(Z=R|N$ \@[,I ArZW +OqI!mSykM ($_BIg_M7! ^ԍCΙ?+&K0ѣl#"y{t\ aGM7Bω EAaB296u@ 'G\/Ū1BG{SW/[Jv! m!KEԑ➼* +\ &#kbnӔhawf_HHx[8;ç/W:;߃( J/N}ځDH4GЎ0w$+Ӱ}r#vHf!Qf|b_B n4 +!3eG_ +U_[2Ɋ"v@< ^SS [E}.];.@IP)Fʆ^,+BtZ .As, Bhˌ\'b"ѱP-39Yl)Po]: in/F˓'_/{,KhH;v׏@z)~I& ~% :]?~|GwC)LBed, rz E>G ̉S,x=60:3P)5ō\Pi_kxsy=B>aҼj!QJG$-#bJ9^#. Qr*s 0!: lU1&Uǟp~?-gyb~VC ]H?#0᜝ݲSQ϶Ey1 x5\ZJ~4Xܥ d](1*g?GF-Kȹ46>F34DZ}Y%(t<%Y[mgN4Ήk櫴PS;l1kgFܹ~l9҈g&!~QȨcf%X3E=5Yxݮ¼6kf3|rqqR#GKVe6ޑ-^@U:@+ٮȭ',k-DOVd8OV=%Aĵ=Ի,KlA{aYt^82GI~ڻ[g掱NjƐq"gb \aPbzcJ]<Pl{0Ԁnzg(\@ςo?ԚԅLS_ <4{l ZdzşբQ|J T1D4D'l ;IY<"jێiyRlfkHQ;:2GMwE'8W;w@UCItKk ^7̏sE'C8ۄFg>ae0W;uV7dr@^  +}0uL(:֒'ڊ)tUL%}[B~%!rxxXN@<+XMQw=Tr +])NmJS߾iP*l:O2*I‚!oUxOŔ}uFj|bS{̽>w={\<zu4nSPҿQ5՜ջ;9sb.r98n7Y :7NN<62爷*ϥ/Z9"cqVsSݚ7[/=3E7?zP[\P,cy]xk\ԷS}oߣX3*E3,®A^9"M|1Ǭ柀*7VX\"Id'ɐ5?Gƌ?bmqt0, t_M^ǻ(SL[Ԝ^+:\fL!wqbP!Y3>52&jʂMn5CFMn%z.RւkO!r~ag \vl[r61: TP +P,g\%٢1QAI[*zSی(-梛܉ (v/LYoנ&j:n=su$H ^>V'^Y2O:~_0+" r?EX7$S뽨h:NIe%Ǟ6ףyka{{cg=/VS;W O!W:vXVQ[ Ky0u!E+Ar}^UUC@вaǝll&r "j>zN;(0}^Z;?.1~͒Hce/ssZ5y_RdWJԇm"#b t/ig2R_HگW͊y^aѕge"'le1ME׭.\3]sqBE> +U룳!>cNَs;Oxi*de)j+tPҿ=g/'R ;tpݳi<}QIH!3I(T4ت@v' im0}Kuo|x !}>v7;]ރĴX)*YN>GL(8Oa@sD`A]8^<$G{} 䗨٫Ȉ9`N种kz,=ɒA6c* ֵ*]3L2M_::j8gNltW"'S 7bH*#)ի7b%,KK^<! ;s +tgDa?l {,}Γ*^ \K/rBgSC)4W1TŁ8[%Ed)g?W&a*,{"yVO5&SXHn5K՘UӅؽ2 ?~RlB=H%bSȑ>poOb"lsG3}C+C t_ԳRWyV7KIsQbMk*]{^\o ~Pw;5{wZ8¨׽ng O<ad+Q:Q/,XZxDR ޏ gLa<<ԅB&p|3v%TGUoNf ^S6]:S <%ظۧ#ר?2g uC&UF0 +*+/q.Zc lPĤ@&HS n#oN%g.sE.gP@!8-)wN5}rD$T#Rck@nsھVֹ[GHxw&ώ}AF1/}H'N{}ςx ;eHJ-,뢼 ۠ +iǢ5?%}/OUF*u H#?!$tϪ,QDiY8BKWE>Y(Oh:V*]wyht?%,;[X"[3F?EhQsRп}zX3"k滫 />Zm/#p+'!%rm8U~d ̿9U;Uם1nBE +kC ɼR?΂nx'rG!~1f]G.>84胟|e%lAAz124u#P0Q$:vUA̫@G5t-ӸV[(m|o|iߵh g?l6/7c}JxςLwȴVf7intݸ'"yS^5$jDw1^Fkys p+XQNQ tZMJ7_Ps>O3]$K7b-RQ" :ԫi|DPOE&׾nson2Ć +c*ѠgJuqviRc36}Ouŋ(w.Y _٥\Y] 5;q2WǨ[bI ѻz1#en)T\/(`Lߗbt4Xoo^X<WGf^-5rn:"j'BU ܃H)HUGz}:! +eHϩgish9& rO' d E)ii'?zu%R#ET(-_gzLZK pٲO*"UUaSĦ9[G9B#8^y}=g: =*ul!mk!PGP񠁄€顜L qQCdNzgXʁ1=&4Ff1jKs1hΈK/_]f̴YqaWUr֒[I~-, O1S1L#ͲtmoG"l-?sVZt 72p㍐jPv:UjrcnU1djr)=afPC5og uP^1=s'I"-n8Pܩ %4g8޽F m+CyRO o/jm_<S>.L + ڱK_gDzKwN* H-/1rY%K B_NJlB`b)B魋e^C +-^UO-D({J/9w"lҥlE]¾_(GY5¬wQ On^|g?&!c8AvZ#g6y; j=RwBfJVH7<\#;TʫQQ@Fi ao((ڷ:GY V~p8kDGN&kL'Q)U<\c.`B#CF[ ̯\ +p*_oרsC~=<{t šA&)i;k+MInN>Jяe0<$;?ymZC>%MPDׄ箢Y窵ڂt#}܄^z,MȞ}6_K*=3! f]dy!&GBt˾2~˻% FwS !Q$,@$ Ab̈́^2z D!p&tVk+V'8lnGž!?z3MܘU' wGijc.WX+9I$IzEDL (CzWᐋ^óZ;ހ/iHI8ɥI[yu+lJQ|̰Y3)0|oXfo\Ĺ+9AP[t)!}w'Ƕvr_i\/O2o& U9@YϵF{@(j;<+0 +lnF pr}+uGYtvü<Yc=/*9/-9XU57rũ-S-a%L 1n@ʲƽ1MW@{;Oge P8+F/*̜2b Q|;ң*R7&kzl^0o +dj. +*әX=a* +Ad#[*SR@Mu]A 2Q2@ƭ\G1N R;{MpQx]pnm +N Cy` SI$sLlOo)  %ݧbl~J{Vvx{2h4 x1pGSv6 dTNӜODǠ Y_nC\0 jNd?r,_@v0(+S+>EKgb5n[WVdŜØ-ZLZ;~G +Ï]m艚 ѰG,2 C[)cpf?9/='F%{GgCo?W:2y/BU*CG2oZܬO"=t!|( <{s%FCO=X +NŸG2iʖe.XmVw *>.&3ʜPFb0uZZ(#3S+ԯ#%T.x8˴U!.5w_Ի(]!)<'ZR!)їzdȺ |C\ r7,`RpG!VG­p{O|u-S@~mW4!.@4ԢFQzbǣ\`fb"i[I{_;8/1Ϟ9|3UՈr(d&<2|^rO! :)~,5舞N39IAaȝ~Gơ͏[c{xWlh`GJi"k#s|YjaVU(#V+M1urY:F`s$CFW,H=P,ج'잫7m5,g%਍o9i2 ;}k.T yj (g^my@RD)(fԅU̹t>)b֭1-ĦW"3yD/->_>iT\ޠZ,,c®Yl)?ykx1T\3\yiO_ +>ZJTOgw +Mc] Ϸn, tnP$oZyBbm7fQZ,;稝, مq;cm rd_lr;jO␛\X젡 C1.geb7"<^JA`DX&0]xY ŚH*1؏z;0rS2p e2rޜVxE~:Di\0=NxֆR0`7R +f>3hΝtgB"0?#{Nvx '%:/A=4پ;ᖋƊ>S:#[u7/=2!T%3[/]jB踔 +=;dN*Z Vwh'B9C[K=)0=hRcr9,jPAKzS5D&㇥?eX1dG}gH +Sp Rl7 -WE\>?7} O1Q A*O{kky??D{W_[:,}P[QG;WL wYn4?h +}rEI IBNCs?sx cYge!x>s}cjw "'-x޵ˇ&[\_YJ"[vL#0E,A i?\e؁G빟dQ3qX3шQ. +-E͜OYb1Z.DXldٕ>~nHF5h? +.{k틈΃;=S^ωccxδAЁ~SİBY̪*.LUzq|+JeBqV[h W|v%n{I^2ím{JL7K'k!\Pm$4 Pn4g:Mgl}~c>a׌X%(Sɖc4OM/qO93ڱSX%sL.=ҹqh@2Å*(Q?l~RϝӅ$CR:3W tsK|SlL惲WE;t.6]us&OU(QP)#Tv0_0#ܙ<JtWK-ɢ ">V{FqƐjثw5dF WOmQʭlQ$ʘ4u>uc4Yl>)M;` y .Bis٣bu r0 ̝ш2Xha^-%8 ;21Ty5u/.]Pf^u@F=N_nsĪz .0/,ȀRXDb1e@G但l.6b_Z,ƪ{D{{PFmLoftH{.}Fu<0&ӔC:7,3隬4O#a3#H7CL2L9avg,3cCYrm=1v+ЊUgD:JB̄uDv.Na>Fe}{z:䨑tMmH͉4ܱLviM-K0@(;B>;{/n<"+1(,4#C`kϖ)&Vbnbdu{D`SIGxM>RW_pF?_qLx 3|Q,O&l1\/kyN-@ KWbEdLKN`D9,;: :# vXQn4>r/k2rcmD-7LiITCJaՆ(ٱPl-'v:X[[ ]3:%Ix^yGz]@_r2'.'yR}#чff57H+rU2rW?#pDP6ۡe?g09mW`r#~ L. 5pUFIyq5Q6cH^[Kv*H f NO)tp>GJ4 Đ \sfV~$hc~ sٱ^ +bKyGW`\OYu\sш8oRErm {ɉNZKW7B,|LXPxq)ok<:-jH X s%ݏ ~3acn K|QǺј>5*(2]?fjۇZ,f@,  +"%`(p=8ap2@vO>&g9VLq,Ƨ0M */3HOt(-̌Nl!:p=i:}qދ+Ni]UFe4iZpXVdSUh+̭Yr@1vY0q{,x&{ȃY;oM +BL{yK< $̍@ + hœ,Va+$8ZW8(@{QUT~Br<սiv$L$8$SB7wRgZ<3EM#Z,x=c*:lqAEA,N%͡)P4@qc9R*^),$m+ɉ][A3BQ( IoRx3Q;E0[12Ev{&CFx2$!k[lHEd#`l߀ P1oAwW.-k{y: + -0_S{a!׉+XhRȆ\,8:A^ g{wD8(9蒉>nbR!O/o "֎r5 ~ Z/Pf!*o8eGfzq^u(Q[Hbܸ;mA"1y0|UR-j_gIb|cc)20I==}ik+t{[%pܑ猀-SGnLu7%Q^@){ˁu"GXe|p 1mzaZ1^jy.oM*CFxaQ =fÚR2Sdv5Lr<ު% z,s>zˬSzЭ#}^0[.x+RU–7n7]7(~' Q<|E@;|Q鎥*v;D { C|}*bTkx`Zq /vfD;WZ3؃OiNNsۧ2&,a,T(1;or+-]X kk&b:__wβ۰!Zڵ 4\z-M|lli&MMg B9]7蛗EU^`Mg#sF$ǻ6%%gxAC-(6eGl1K[Rk^" ( so3z"#,mD2Yx.= '-/jIdc~.AΆh T.vj*P6ٹm^6ѝ8 ߢFѾ E$ +e[ Qvm?ȋ8'|pce> 9;r/*\fRCܲLMCq)Pbyo!]F*/:L%}XXa _\ +R;Q.!M˲ggL4#mZoh}Ҟv`M3d]G rDuA Rn]Ua qaKt9~Mtz-LXڰP 0GNk޵O,?ޘ ||S,sؔo5Z<>!`8wtW ~M 0fGi&$2WtQA'n%1ٹ^L'ߣkU(A3Q$E.&0f*1(:9K{{Oi4M˖! ]Fj; f*Dep'*BZrQdÍdՁ2E~ +{ +XLJrzy,R&҅MxG17Kh.@v*|3{59|$dF0qW<+0(`<,4fO[JnQ͐vDηRͣ + $kzh8%K'yE֐ evE} +L s_-jzW&dTB)aNaSTJQ)\\QZ.z35uޯ]};H4R`jM>}+Ii/5B c\tR?{Z}ps|$:XYAeAZܫSC6cwv6s1!Ro +%#3R" ۣ@>:NGRnt\>z*5f:c\[_x5T%wf.DG!r[c С/q@L˅#&Jo>y'H\Sچ3E~ݷ˂p\qQJ(kṉ ÈymF <@ +S§ E$8''zh5#,x3q'`+D#t[gJv|h7^C}[L)|+=sESѥy]t9 @>C[㤭W+Hc%>t\[s%Q+ ZDJ:ywo>^xRKJ + +Q):w]5Iy?e7Du~1MC! =1S@ic&)(  +pDb +3Jڈv;e|AቶE^m2o]gE<~%k#\WޱVJB˫j|=AՒ$$~W<<u昀Lfscmj +0iCvD8%Bc,?YS#3S?}O_~,=:8:9yVfh =2 "]5|J ]v@uDi 92}mn;sCFz_k7̍vxRoC P7;.{jByٳ?,M+myr4:E²\#~4 L纓fu{(ЬPXQ?DW$Εpq1NXi8V +>SKaapGܕ_$.MD-NmE>{8e7P<sz(8e9/ӡ)«~؇l*'F/5+1Ta$,^5w3)X A7)mJ +?ǺRb4"{dvl@0d&TNVG+? =sF.{^[,Gc;z|@ W& q{ ; +SyXsN|̓7п!~7ISWlF +8y +{BPL u7Du#7/vd +=}J@WV>pMF `2m5P=7DֱN91̭e͹xf %} ' r=93v!u1`t: \Dݪ( "ܱCn<jȆlReVҳ,7_tIi*4x HѪLTE£k_& RGNԑԂS9bQ7r./[HrTsn 壕@YEnx*T1G=hd_M&2B +:qj?o6{42(qI6ٛju +:sZQwdL@nH +Gʏv$f"nU|oiE W,ѠD^K+] Y`adإG>}~-hV2a;"~Fp6kԾb3 8ˉf.[mT2! h|)_,\ 1f+j)mWyZWN,ięH4eeax/ EpݹB|AgjN O3L+"g$N+WI"40PA*,?zzIfp`LѭzI;? Q*OwqŠò8e u !یChF 8S9542*{n;˭C82xi1G]52M?3a;Bo^;{3 gF,m2" $ɚq 웞эz4wWcWه-( ʪs 3ַ+Do-1H5E'?1Ż>3ʀ&F? 0#-~xrA *+BM;u")=Fc=tɖ,'!^հ=rW"’Z`!2)@I0"B[dLzQp-4V4 EsmI ).L8ݴuXGtTɳW!v-KfKP$OQ7ON. T^ֆQ +ShdxȘtujB%ڀN46=-SSv<#-Y) +śUf('ҎWW;S\BRs; UrjPM8eOp`MܗZؖN>sb9H$ю'2B$JQW!]A(_$gu3VLY_O*1#?D&Nx.?5dןgEw +1t  U _4Fj| 8aI^zqrENA(*cwbv:-;C"\=Dg1> q$E5Ƞb x TB=n˷^UeWE2;S@+׬[4}PNJO!g?ofPXgЁ֐+xeǕ EY#Ksdܼ|_3H8T@QN mQ:1ЬT\\ Xb-nA:A~kv,` ߴk T<5J2mtЎiWFQOb_y+dD2A$Dj!BTwO +Sؼ4{|n}thꃃGFu(g$5o*l#L\+~U@8O˄/ޜvvWB8qNS*,ThIg/k,4"料uAM0ZYSV\:VkFPL+ dqAl|jQϛ_K?#dq=EJ [7qv_7L#e^B|yEUV`=$%Gs!a3[L'@Dm)_|_xG-@ʌ0 LsȌ lC?k됆\-VkutG\ ^ϐ, +6# ;D#k}1%K`֥ +we"DC #JEy=ϖ'Q密PA7 +'"PnuEgkbI#7L$h#Y=)8)$fwsm9GSe8#8{:H`"S/s g0Z BzXX +DRa~jY,RBO_᛺n}sb@l!FFJH%ƨ鷇5œxg)aagh)>ь8|鋩 CJ+1уH(.!̗~'l bs*$e +$KԷ׀ G)p G)ی<, Xi[Z +5D¥IQlOvéD6="OY'5fXۃ ݣ9s`o[XVtS5U;^C_o/ŃM"p]_\lwK T&)( YwTE1׆(GJ opD +z>DJKԷ #U΂.[́g6!ĕB\{\հ˕O&s&8Um&yTx1d]$=X[ Q鶘*(;JَYur]ςՔ0&6ص~ 0`r,D*^'m8|O1?:#o!fM,/?Ωyޮ@,*!F۴7@;!]u!X&㢝Ro !Bq܊1dd6g%Ub$5 +s2(Lt>;-"'$V'(?'%CF]r>!m? aezw8jsy+HΝq"boCwɐ%&Rj_Qzi˪ ;ϸsXlT,r4",r8F5K#Y2Tj уMWf6?{?Md^#,#3[R= +6TuyN۶ P@0F::qʮ |>bp+"#)%@[x6 s1}oP'N~5\gj@㫞QA%ݴ_7;a:&CVNq%|UL 0b[t[V +@pDGQ>*=`&D +/I =>ϺI\5)^7`kKfXo-}d"g 2k鵻48 .@GSx!dE-Dܰg.sO9xkQY(P[/8qC9spu'6R!Q p0cBF3=ɰYGޯ`)L]2gP=>OXPM^q iw \,;BcF{T9x(!ϗ|>.E<sb {9p+>n{a`J?z6EjSߔ~`5Y#TS_=`|-lbϾ)!sH1u@+^|j; xQt3G6VoH0EZ#\wB7CzpqLݮ=>RH>K(7b"w|x :s/R0ik)/Ɉx}&\W'دr1Yf)wLIH9Hҡft\ ҀݶRZD=8ϯȗ?3t1Z)@.CWڂj_x(e1 \JǓ%$kab%" ,mjk.H9bږXpd innKƶwP8y#;qDPBZ<Եe %ד W5s3kKBqRa +^ +EO0Uz3*{8br=!_G>Uc{*6RZdM?@9uY֨~a:z(}?_r] }m54XEaD^D\. +_ 20y%gea"ԎI:Ҍ$$be!f^n=(VJ4ԃ5]R+CM4^'>NSVGLlM7b!Kw"&G:YFqG*S&-ޣt=O;MrN5Z +x\I{<e}BA?c]:#b}W<&S8~ɶjٷ9h4NtXkDZÇo1Ebhـ΅QHGsuW#H҈B,=1h~n<2؛)5,e%b.W-c/QHF3=>20(*7f"6TV$E[s&yAJ(IYv[mEf߾t7 b䈭"fxk\c="3נ=1(Qh +cdu~} (wສEvy P]O۱(;g\J-Z^O צrZF> N7p7qB¾Kv>M f T&!!h{ ϧ1'|^ؾ^ z6b`!uotm~9cRGomdO0|Hd2@iH$?G'RsD2&s2M+ĆEZd̅um랢}>ᥳeh6 +v^70g$sc!eAu_>xPB.Y +*Qw^XG3S}{ )K +;,WK@f:˅K԰O?L{#R$W{v˝*TTb'W6*~@^D4xY#ߊn޳2c>h;QFヌ5?жks-q3X|\U慢:2U]6Tͮrrvʅš;X+oeZP줭w Q2™7+ޟ3DԿf}RV@{g_Wh{dFIfE|UҺft'hX/*V R_x6&<9[JJ~ң/乐5XX'cN%6W5UlpN#aȣ|{B/u\傇JJO==ɛ#C 5hcI"x-Z&܀ΒKp(GAy&_gh;ho, ϚNp$*7{z0s'(m\2OT+'^ ӵ\yV%H-$pF+Ч+ɴڂa\f=/ΧۂLGXj3B(KnC'*OP$7Rxɞܛ\M#Pq)v T)Ӏ^/ge!6Ŧ0)WtVT/O[dKDz|ߚ`bu-PB\A: +cM<1j 2/^(NWBUh=Tum[ Pٻ[^R]oџV9t +0܊Y*r$_ Jh0J%[|:Ͷ& +`E$#RUJ¬:y]ߨ1Vv}F2z:(>:pIbec΃j>3{ZpjP a\E%^yUQc*G+׹נ@ؔVA  Jzsj毿 6hsMm)þ՝Qj_T4E +p3x7$EB8.z3/|8G!@<=Rf'q[4 ;ENC!ݿ)w87.l>G*\5 ךB=EEuQ1rmL^c>wzOU{E+s-@H |k9 gv=W`\^)S +]VFʼn}@,H:#z&NI'.)CҲKѢV ǻrZ; AI:Tjm%z+<"6C*Z(r6Ok +dDҊȉܜ\Z V"L=ʪ +WsK-\_D8.i=?K1w?ߣI I;8HOG^Pv^ S388?9{+c!%;w{jזA#6h?[vQ# Iľ-8 0$fv*gklLZ0n9@YX -?$>݉Ѯ?[`şo_E+EW=j#MS>&2vHuA,r,!RvILG$bL15zo6h){-2B(f68k(=dv0yQߠ~'_%~e#1xG!i439֐r"M! |Qؖ~]̋߄{7C,d[dGoGg5s!C||@X#D=6 =jƳn+Kq3$a1l?eGE5eEEC` +8K Mhߙ+zboj W?L+VRƘ !ɠ`Kl1 ʼnS&ԌF)*["ٸ/]/Rh$C1e,$ޖcS5V\ښj> *nm4EX? 4b<(ǫ)CwFW?iewwo<-38x^ܩKϥ5;@SG%V򐳸WacCej3.pŊȭ\oF7|*_}Eޭnt:~jSw=Rl 5dZ9MV?/r=k˿N4Hn{I$#YsFf5|uzWv;WNrfcBmV{LdE"y^_UnX|m_>юVEB"+āK{x -pë>Wa|p~'.y ^426IKpjv +Ǎ뼜n^ľ!`wZJ{Hż; @yeҧ1ꐋbc~+؏3kwf2!HA "^uıi_ƭF)_}v.͵P@tiVi )U龲F(|KOˍ]qS + x's*ȹnl'Ƃ';Q+ĈQ?~YA7$ÍG9G<{$֮v5M,"K1= */q&NV"vwێǻ[tW tr)DGVQ~4-^B'zIhj|[!5{䍬{ B;VM] ɍWnnD <`{jmuM?|TM'ͺ;k|*T+0`pI=%;{_s{&9aBޡbrsVcvf=V*~ +"]&A{[bZ~x+/i42zlVj#ZQ +W@{\:z%l`x,ρY4}ԐTg[iE{^4XEV+֎Wΐh SaE[iVWiL +u&ޙdJF[H]nyeF6#S%w*G{lvDbH6G / +<*tfҿƂIrJz7Pv!NMC9%h +`Ne#W[{@2/sHPǜM\qL5h3um"v}dnqȉy\{$ ;uAhMXԕ7DŽv +t9Cռ|DC!q#0W >eW1O jyŽӱ-=>pfwf.^Ħ9+\0u^YԤ65b:s&Mzn8k}r'icjf|O=7h0pN:kIwsV^|]PYTNώgK2G$GZ/%wUj1?hQ3K*8}lo {,8BJ A<{݇q|J+AV,[IِTvf'\G$,n #LlXV <)f!GzCc1^7.G/ xR<9ͷ=$LKYv-%P2WfXLg$`3Ub0 W #<}b݊ VdO+t2MKsTx(w8UD3C2wv{m&a{(a8w%OrK0~J sBl7АcA풱Fܭpq'Z3 wCu{ċ8봄w4UI>{ڥx`3|+U}9eBxI@V^J]p`Ïr/Q}n/Y-f6H-)5Τ5sWQIGE˙II`d^687 +YTh(͟i&pV5.6mQk~s TOG +< G\ePc44o=̋σ`ƛdz \ܑ(up݃`5ة +s%&~FTX M>h,jݮ6*UhOs>;4Vmn=;>MXbZ@KITg~߷%F ق<\{hr=^, "dUt ->#Kw`C֞s$^f^90GS?IJopQ&X%*z[ce#/YTpa֝.[Qέ4ߢr<#sƣUPkjGR U +EӢvD6HK o]SasM~DuWZ(`NEԤ?8jÉ +x0h1Q|AZP`T\!3+dqw + ZzQТN~1;on1!ֿ"d.*gjZ>k:`B#葮HrCO]ZO{č(yƻecđ/*5]4wL6IjrB<` ua=d?R}"Hd@JwB<7OVWՕ^bY qI68N.t;!tDz9R$5 }C n! +,Ẻ^" .d.yVZ= d[ ճ>ýj_Έ:XwQTGZp/_4_{}3OPQhfsWivQPW}/6_o*}SLaQMɪ4-!;mO ) Ψ#QXrВG[Enb㙺ċ˻㝂]`h+6[tܨ5b\4cp1BXg2d"XljTY>ч[a-o كb Nw*8 hE_<ҍmV/oj?UT'sNݟӟBJ jOLY; ,(X_]$~:߬lIke O?>YZFmQH&ƚ)Ƹ䕞w;in,J\BϽőK'--[gp'>[ֳ߫;){t&ӈ~~xjѷW@h\0nRN0`ƑG^vR>ȌEl;M>7;~$m|u<9񉴮7ϝ!z_u5 g*9Chlh9Q΁' c]ynhpVN)U!,\Psze_7 s[jUѮ_OsD{!/VqWC B Y{ +] +GR5Oyd*)Y1V ={ImN,1M+ eɳ1W<2u.c[Q"D5q0NKb6aPN2_Iɐ\ӗD}x% >XTo#bʕmq!nfW(KB2-JK~jepc5ze +TkI-uּt`okWc6gBEA҇$ +*hS3'Q㇌Cr#֯ygu- {lOX5(HmֳشwzT>j DZO|y(o -Ĭ<,^ߵ~z8gH;/Yꁖbi z`hBER&`~KdS5!]{c,Tf3g 9%jk + M%^^sǹhe +$TH-1I՜ÃǦέ9(C9\&x#&+|F;ԍ[5v1BQjP(|E*Drb 3~5b>cipT`OHRPNHP6h'';ZFciԺF;?Sث_rCmQ0!bq+)( >*6Fڌ O$ór@ qԭ &Kwə)n^.m)`+E6! vMBYAJ3HН_FNgOe`I +u)JZoJV Ik&+%̗8*@-*x'/DKAdުK|l:@Ɖ^=8 ]in;0ytVn>{n $IFpo+x"/rzf <7=iNJľshؖC)>"ލǎͷ#sSy8٨d)JY?s͖2⾑Հ5dW2 kmHC}o͐(^CJ?6F$񵣌yVxIvqx͌R̓G\_̿"LH7mHܳTOo/ȷόa3*v<*DŽm?yh* -N+XՐČ,Hjp.jUJ4ѰGU8PP_tuz-@@ꌒ_LkWQ sPYyҟbڅ3-W@ +Pg9~-LYbA4`3`ЋQcg}3] * 7Ya#A+(CnS֕dW=a;/S9琩)ӃƵFTWTj =čY'r_wȜfVE[T/J/Y^ɣR"y*M辴!! m@kTiȕjyt9"j\OZv)4iAs/X4)^\M-k?k%`9wdJᜳvgj_PG1w~XyZ}BhLqSɋC"rm&ڦQ 8:{ | ­XUKJ}/f_G%Mj + i n璏1מ9_R% +zg?ԶQghin,^V9wעDVeƻ.|UxQz9giˉM4*D]AU@VcFҰA". +u*j{adiAeSwMHƒ)&3^^NJ]7T1;ZTy],bU!A@nŷ~J/'}v:)rdK|(Rvu\OB]DVb6ާz26H}-5gDG\@RעC:IfpnLبD瘿:b+S z[]>[=^G" 8ܲ1ky3FP[L/(5gf#ܖ/=˺d8֏7 & EIPZ^VO{o=;Ū<6?C\e2Sk}Z҄ o1ip?'jX_ht镏8/:aLc*OXtfq[k%L51JUYb~#Yz G#喎ߓ~{f KRT[R4pnCBcYτǧ^ \ˎ*/hAB7i 9Ѷ*8_Z^o\4CZ35;, +ߥ=K=(:  jJJIK~:ӝL /h_EƟ +xGf| +0ٗ"2٩f 7,翳OM)<βȤD[ig5 ,2JNlH<9 O(0dIud=y!SeHb~'?Aџ!Rj,: +(9 +#O?02EUۀI/3d+;4.uB3`Vhx]N-(YJU}[c[ϒэVY Xipٗ!ðOB)"u w$0n_|W`#оoK3l%e#s#U{.*(,zޢˠjͣJUPBSIya*TtaVjVq`h3(ĮLGL{z "Uq߂;X^iӊWأr/bVdƌNS~ʙ'FR=UvB֠UT"o]z,+sL#D4 +T7U!XHY|QeQA_\VY༞AVj>ɮq?R=xom=bBNܞ׽'WB-Jϝz^[=1rr7B5"eVsm2%9^rdqlKUع]Ac߶\Dd0{j郆t< dܵy)hm+" +?G0XlLIRE~}\>}qL4B=bưjtl&hl襣j(A/0=*h:" ިh쎸axոn8 l;]܅F,A:}!Ȉ*[XW#[)-)9;u+B5j:cm~@(JS--X%nnD 2gʹl6L=@Q7n_̽U ?EsU]MA fV:'ghGV\4:<6XC%PЭ URXHj+g\f,z&3tWG{L u8mr#t|dT@^cbGrᡜ~j#mk[-Qi~`^q6SG>N Wh캱w-.;iƺoCP.a~NQ|;-7HJKk+f$F3WґDE\87c2wܩnd?P:8T <ԑUZc}55ZgL4'׹O+Bwfa wecAgͨǠG Fk=2 wE75„; 3?9)oO$Mι]aׂUwޟ2 VѰnuF&#DZs| g\'0E~}0+^l5f|#vxD4 xٔ_|՟u_?8́w?i4uF9¼DC!_T >z_~EI5ڳx[_#V9jv̹laojfZQ4smnz "_R /sUhrFBkfjyH`=`ߌuwAhQkC͝5T^΁3(2f{ˣH=#LEDeMy['xQes϶[qOt=!EI@8NJC\6?En!=Ua,|}sVŅ֓^|]YuS[ARNj\ BȐxU>:hՐQXs &;gHK(u^qБS"aq #RXyWr쑱A5zǂߏ8ÔGyb[Rf=)[D9ꁺH8pX*(U_K"R:0 {V{G L*:Et7+'vDЅ|٨r 2m6)lR4AI}|oNRKuPON?L?Q͡zҪy@" S[a&\PUխ<gu[bxd?cuʨ +_FtD <# A̸so1Ds'X أ*?#t*&uXH줶Mw'R!do2(E9EΐPFt$ \zg6/D* +.N }Q&Wb ka\b;ӯ9H|AZXWHhxNBm }|8r筠-oHi=0gpA3ڄTp*jVԚy0:U<}Hg֭J0ڒ{.CX (e&tk;yH;[949AO h>C8)Ȑrj%q#:"d,Cn-G-JqQY$L}ȯEӑcW̕, |n(})Oٮ!{"AmѢD,U{xJWN8r=B!Q +@`i#Xa;'|rl seCHgH{[n+9cyź"vG)+Ks˥>w=FtήH <-4еLj2ے/ErQMu}0pw%GC{v>jOx6QZsw5b~%]8mɵ)fϬW-!Ly'xQS1}'.kܮTpg$+3Nߕ!/ޗQO>N ^r8rH1 +kv)a`iQk,xP}h֌ȝ +!EjoXaQXs-/;YFǤWVRZ#hHբA^^vEVx?4OguxrJ]vR,159?7CK]LX[[utHu`Sp[fZf'pNlʁS.f+$s_,ړ y#·l/wU3Y²DT˶9eGԍ[ +.d`cxp1RfEP_&ca0y{9jRD^[ӅH{yȤEl5)f™Q%~<2ꗑᜃ-~;Q_'[pF ] OU},scul?%(^=fuLE趗  m/kGO% m7CGM|s +}(I9$LH9xݙÿAQ>$lQDQժ&i8#SC݆*^uΈZL9pUS@3?yWo`fm{D +>:Cߺ5 kw 7B|JDb@xQzI{i_(l޴:`-j })x\Zd6ﴅ4$_,ߵE79s>1f갩ėXf/-s[-=ɛ U]Xވ@N9KF)zӦ (=gʥ@UENAƞIyZ\j͐p8W幗Rr9ē endstream endobj 44 0 obj <>stream +y*uȿ=% =fzGf>V1V Lҕ +ѵD1NRExuR좺m}=QD\Q}raE_ss\s&̭As$ŽuG![Bd"mĶ^ q\DZJT8[`{?/rdqաt$G_P% vR*s .OsSn4uboڙXa w15WF\fÖV: R I?DI:ʙG(Ъ@4RCؐ#eTlq?XNo~.uIg=ڢDGG*^~Шj>M-e$>vU7k{ދe3#Q_8 9K)a!Af!xO <6QaPXc( b &r$ +oFlb;!уEBc5#Ȏ"E #JN7vU, 9y+בbV%m/+[4wB2 AU!$;v?Ŀ Bx73*q-ndJ hjZK,}u:ϖiAEa%n߭ԜAhEV<&ܦ^BҢ2PUh^xk3B +a(ߊ2؊YKDkj\j[DdpGMda&Q'LGvp@]R.îoqvPU g٩3]Ez;G i^ 4!d"FD"!BhO|>CT;RVE;R/h2{z%}j*^cLm>&L&)܌M⌾mYnĒOsMK0P#KD +ƈ;;KrV Lhl~3,(vT0L0vgZ$LNm\sGBZKGz9U1j~T c|:2| gtK&׭Ms?9wKS_j+\]/t.bTa$L[g R4#b{R1"(0yI M'1]btŷw1U'?)4z(-GgK`XfH8`hd=\}ˇkIA,*<^\Xt +2R푸gUhVrIqInh}+ZGr\ )S~쉀 }Uw4px@l)1〗Pb9CXCp{O-ָHUO{^sJqbПbmEm<$vylqAD5àE-hz$lzt<:!+!_NY^9ٖ8P}802UdžvπA/SR?b+ +ZD7TS_/Bci܉b\myo)Wr s=U:H uJmg19j\ I2G 0ɻ0:pOt:+%ӷ)F6DDҷ{aIy7ᦺ,b'G{QfI`ROq>1'JkqwAu H!Eq%T]%_% +ٲ!uX㋖n|MKɼ3 cĆ$.PJWҢqψ +3Za ZF 1enoe$(h>b^A9L_8 ʧOI*)_mm^u- +Eni-鿞ak-!i'W krg\ 1]i )D%Zh#1=rcP8ʖ^pFPX{xc iM0L/ꎰS3"TF EpHFtΡ?mGE=j•A+WG{dfA"d3\ !\O=hK4L#tPuСeP~{5ꊢqcܷxՇCZQ^.Su܊d_ +VfҾ^2S6xqz5瑜Z7 ŸTEp&eG +F1 쒌[,丬"☮0S2>U ~|}0ϗ"m#5ڤIe98 RO=d3ƈ>IJUqvd5L~5:wT"?yG;ƠMRxX;P8g*Zx&v>";/D$Ԩ򍅭Ɗb;^ 3XPSĂ|vHXMMB!IWr~5VU4T-wﲆ((߇b +,ʯ\'X H\x>@F00:aTa!`<G2*Hq:՜sBJ+ +?)tHdnU-;*FmB`W8 !j{;p>Z(E:&+ZR@]q Ȏi4~Cl1q ښDwX +`"Cw-|kfIf.bZx-o|)3Tfҟϲr% ~8ڈJ@X:zmfpΰC wO薴 "x|jؾVe+!Bw@1J}Q,MC>!/#@:Wo|R)/j!N=,rDqx;?ת88WΘ)zۑ]Pjy'7wh"MCb2_ [耮mCԕ;YD\牍=ٱ'ϭZ9!FosrїYgcU=N^o9nvx[5$f{_IR#EJ'į=4R?ߛ +WšWý@ϧDӯ|f#PhGi*P,yfTsæ;fKzx[Uσ}oNc~>]ͬ"'w +8qX-|y"06@Yݹ~ѳdx|}=S ?}P팰oF!L0B'пsn}dbm=BXG5\nبΘ+uN zNf {$49a$֎cFjIQwPRVyBJR! J9alC=GD6C-YmAYV:c*me/ <sKU˼m_J4ԷH*&oHZtr#Cpz#S}P.[ 잿?"vhDSB|qt͡b!AْQ"e#P˜.Ah0[tcs6 ͂t+kWx{Ё:[mlgF|Tͨ^bg"c **Z|{g>=M;0][OF)x`vmjx}k șX1};C{_nc5-! {(sу#8r"fj8 6[(}} ~mdBq ZHy݀y_i7t-U; F!Ƞ8n 1CsLa 1riNU7Gu bđVNOB9%c޿2$:oGfh{?k<}]Ra(~[0O_nQ@dfe#-s'@=xo;kGyeS?77pWǑRN€D.!f lI6 N!}z> wq@.ªDua7=#:;:"oOoEm͉@=DCTPp3|\=R½triވbOA@C}Y%NnK+ak(Q9ϗhkYqm{jyI| "tNxBotn$siNū(fzyOs{;5DcqiGG~N%9V:ާN/nզ8N2衄S.%>1B0W<ٝ)?uzd;:m& !cZ=вyg")*0 +);Vz&)CrOf󄚳?%ʙdm=x^ +&Jƣaex_aCkt4q5(}oMOq~yPgVW)ȒQyF ۂ]{[ϡ, 3@i$t0eR2d8}SIe[bxq~W6vWXvёʭFw1ϓ+ 7 kM-tfe"{ynOW|wuj'][ )w'B;Oѐ-)USS;t5Qg%lTqE/_8I)Ny|a()e{>Ko+|$`iӦuݠ_F=6q1!~1f˙7InnQ!wݭʮnk/.kmb޽AK Ib/l9%ñYp`(ܪp +. +RE7Ax"Upn=J.`j&G +NIn/:kJ#emK +NLuNbMB䬷G]S7fҽ8>1GZ{u͍V*l+M/F[9~yLCF@i{9E5yl@ OdiX4*D6c뵤PvÆusS#@x&#aeR`xLxF[DzY^>qɫ3P4ScOe gQSapgM`G xtUK,urGvdqjϐx.1lDk {[\ ^37kBU +ۡ_vTyBl"qT0o<$870Mހr\E.ڜxdkt?ksUڊ D/h +w|?KsfӃ3B]i]WH?T4a1="5UEq} +*KI$ m!t:Ow +<"! |U3(%,gf\G9jn6 ۣ%'y[8L3A2s;`ȭ 8 n5}o4t}Gy[Pm0Ӛ4dpƉ<[AKWxU귒lz4^o3UŪH[$=П_ɟ49͇ȥú˫ +v{P豀yuSAqlfo)M[7;T|E3jT]3:jH2>Ɉ!ؐFSFF1tI|*M3_ܤ2ᝃv`Vim}Z:Mo~](^}46(cfPDRf"G::eF*T ) HxRgzFYs=W"Ih$):);+ON#6.E!?IIf'.b]we@ +Wݹbo.E'=3Ev'V/ acb9 b&g+I}i o@9yjd +oA\m E68C60njn{19 zTnV~\\4FWc~Usl}YBޔsd6yI +o:蹣zŞlzL՞3jV JyHE*Z@0VII(-S>o^)/s|jK9@LUH\ Q G Ոz{W.1{EsVEbN͡NŬwօTrza eUDC)ǮX@.1s + +xVhTb.yFtA$L<ԃ(S tWcc̠X"b@v bB1| 8lp@-hW>q!t9 R,^I뱴Cj֭[gԮ R̞}A- nD줍g%Z7ڛW+q4sSC;}/&Vדn~!'>l C{HDT~Hb\/ X:ZvCxCNyd"MTA5驉z1Dkv:8V_?uRYZAJ +YAYG)H +YJ}QB:XƟdLg4G3k{25 sâAڿ 'y+YMi&2m{ [7[dg~2ƹj/zkJjNha[ZJ+-^0Os=x XR1u\>yvGUqQMW +}$Č~)/3c %6ygrk%rmLG#:"han,<;`^AjibPE9 )cnuL+qH=f 5АA-V‘]s(9Ȼn딾K/;2+Y8wLvHZgnl;Cq{"i/,GxʹծfD8 , ݶc/z>xfG:"6cѫ>'>KVqpXyCWb1H yHUԖS>LIJmVɍ䴎.ScSFqsfߣ ="Fp9 F-Ȃ$&|]q\ -THb~$)ZZ"}MC0ixcůeZy3PCII5zSs//PPCER: 33Q1⮛;R|YrkQ ZRRg eo/kUޓbYwPf +{w0Ө 2 +i;Pr(Nsib3(Z{ŊuJ 1=]= 5$ZmFKTB@nAZ:)0l +㸴je=\/ 3m'O44`<<{^@ DdH*Ɂ[.ң0nN?(#\')O_r:#ʬfBR\%+)ަԉm+ܙzר*|ZXc@Ci +T"KaQK^es?Q2g-cHfrO/K3$>uF6:Wn:"Z2-R(DX&:MpX_Q쯩+#B-Ҡ-zĦܔkUv2SK! +Bnr23sWNzR'x-z;HǯM: +=g +^CeMx^ f6ӔIVi˝gpD~nPnIW `G[m +[}S4mho=ǴS`tA?j'&k7TgQg>"J6*-vB -bT=c~Q*o{T_͋RA29J[:yǓQ@pn\jREDO/A+ӺE*( +c{WW{eR8bJXwx-d {֞0U#Ě9 zl. o{^eڥTNܼ LDf֗US0Źy9+GeTUg$ORl\NAf6C/FEǑxI6lrP$b\sPey,G }|Ӻ~ڼ;Ulgj% M#|C3#gnZ1~2wtt޹# JBU ˃s8K.8K0i 5IOOc!:|}!H =_酲IxVf qb]wچ:" I,W(4HR/BM {w72gz9Lw|sw5PWۿo2daCB|;bP2A\"/9N'_Iqi69'N+2 @YFwQg`wb n+N4rP49GaF&'b~埇rjЃ#2~ȸjjc4EZu#KGYln`u DWp"!~-9jt(j8OHk^n4LiG9=ޜ@BM!)L6SNCzyTuPA'A"@MC7.`9g$~R#RMVk2"f5'\2tClVa cd&zļDX*z@SMoG}Ig0BEAuF_/YϜVa$@>˩v9*/KTcߏ~AǓrI3+;G!A lU"R)+^ZΛ-yuzDpyϜZZJzjcbqU~ZBC2 %Ϗ[2 -}/RE{p_v +|$HWy?bO⋹ ĥ>n誃+ϐhe$hԤ5$1`5DL1艒 Q4h0uTz>iCr֙!ߴŲ3 W_ :_orrƴ"sgK` ++2d(,&4d}>Ndps#9ls5~D$]0`2R7H n~:uO{™r(uaWͯ9eF;Chr~==ۋ*= Үd#-<1ĬȎd%}VQ5HAXiWoIן%<d_pH5܀H3FfEm{s N!Ǽxӫ1EzD> `34鉑ŠłO9UWn%4D\Nԝv@Vo(Y>R3ݐ9W[hxםCόG#"J:TYLSnΏ2w:TQ +hNUr)eP,*nG5vnW]JHHQ'=3\ه n 3w*;g#0a*ݙ5mO)Co/ט*cvƔP#i ѝfԨ!X5jaBVuϢv+۳$dB'lEڻ[mǡ_X+*sm?}QEhgVuP)mwGl(AnBR>.=)p_dͻUio +x.hB1QQ u5]wFUW ~6?ap*jn)_YC PGM:g; |V)N42-csnu"E:{`g埻Qlܩ@8uܽ$KcقA $lWk)Rg>=w3Z pM\%|]ʺI FRRYb}F~3eRP +m7EDJ#(K3t@|\Ѡ1 +A/mv9Fz|F-Qj#{6GmJ?x2}CJaVXxǟ++~< go[DmFQ[\K+hN3vNBD= (ګl.^QPc%g3h:Cd;q`%;Y#AgmxPN,>ct:jV#R_Oo&R_e"_7DP- ɯ_A 2;i@d\_ #Ph.k^0k̯_=jpϼaNgQ3ԶkT]\r?'2/=ƥm'{g.;52hGŷsn#ao"qJj:W!B}86'>xU+57pVkvs(:VN=%AhD?DG#p BpG[t=keλU\CcQ~\E,\[^OȀxanە^B\(᱅QwHj=m$'U*_x_s=!GH3,iT((9v +adz\~1^@YwPа `qp ׾Dn#:Y x9!{> +zWt[<kMl7} Wco ZOu%IH',EO`緄C#Z3"14ĂZg$-㕽dU `G݀-fZEvk4< |gt9eA{1 PxD,sc֗-qiZ!V?5D9 YxmyG=4}`Q/j鍻AuBMQ$Aq/s3GҼ(ͱG`Puo1&T)3z%2I8ms(ۑH\j\18n VV+4OQ"; ;*ƕdGItn(n< cr>$gާnGMnHۍY9w|qO!SCo5bT織" +aFEc\Б``٭9GjLᏖ_w It+#U ʡlTO[0!|cTüFRT8 ^!?5 IjA9q [fyL ΁#YH!-5| e<Vg(iјoH&CP<ʂxȡifUΊ)E1ڜs`d1;X!PtB)IWjÆE9%GҵM*@a/0'>0W7g.E%X\&R'kӃ9rL\ l,r7?ڍy*m5Há=}iu蔽kGI!8mV_tVJK@ _ +Ly`Ķp%tq 33[DHrߧT=}djAz= +Q |:ߓ)SKD)%ϱHsURv,u<~=ZD2ڞrThLi'*ha +ickCOҵLE}J!A{L3{T2m%|㘧'~*8r>ro e(ID(CK_f Hz/G6oXvPMtmA1$cd$QJ7Wv{YCt)tqJJtta `'ylW#Ba}h}P1NL4 \>Xsts% (f:߯AZgj֫`ʽ,Z6;&^f.!_D^WX=CCIX0 8Q-Quk߰sg &-!ݴ=M^ܦ){FMߙ +Ϝ~Ô[Ɯsp00q|J1kO' ^ {'U-xǣvѾg+u]:i ܊̶ gh*5${ Uj=S7y:ɭ` ʛ~6s p0j[@x d,TaW0'.#]7 >C2gA3'ϰ@]q:DžYjW8}a]AGyYC*wIR` w=Xν3wӂ=1e\0e|ד{`,r$7n1SQWR +-"߉",/70$rZ 2 )X0 GdT@^k1*d]}+U|6}j3C=[i&?5B"]υ⡍Z̺a ّzԁ*ſcĪ5LFWɪ[3PM NPB;\ףe9+*=|t&4mltՈ] MtM̔zj,imo?Yc=z #"W4-~ gԸ/qۊ {WOD#t"?xU|tbhY'{?YQAGr:Z4Ljm##dLi-#-0rtKG8[߳35S7E]a+'Boδ?T г] @&T="opsЧ2x>b~|rW|\. eWqJZdiʜ6nj=fkL ׳BʶZ-ڡSBV艞2UO=T>UwU*r?F$n+붬In^َ̔($t<^k:qJU.%IUV mz!o|@7y˪PWTS8:˞r{1E\S-!}>3OlX.9$;[}eXe%շT4`//`D侯!7%Jt(P1FJ=T 'ߓ R3y>"/Kh1 iJvA֙9-6.Nq //75hw]W*GUtΐ<޸hnyկҖuAlJ+33З%m_ʾ79ϊ-%w3-:nƝ4 [FY uIBAgu~eHw!$]L +erj$uσŦ k.Ȃ\]D9gFbEܘ么u/&oa6B=Si9Bww rսK6-= &aǴ Y/v/\/aϖ#b*u]g5;G"Ν~՞4!/-סt :6k eaW8ʥ[ة|-&bvg 9z~@ @=uS}*xtUmc1rQDyV9/MR L 79c+bKUgr.U8`m$ȝ'}=fH+=z{1BLJAG6UkDM9ݥ$R +$yHy'$6"'9r)Rio2I}K5-U * ̲{lV3YYikcª[(3 +ٱ5dzβRJxnT9F n֯rGzS'|tȻ"%4bV%}kԖT'+#ILPQPݖZ}9750;8 +E[js~Է[*̊~ +]ehB>I5:8lxHjZbNH8~;ߨwpnWLva|{7 qቚt:g<8 6FO5;T\~EM%e환( + D,i5Ո*]sQ+8!c)t*5|j|v{L20 ̣ !s᫵? EHۜs\wi3^߱*b;eHw %"R!D>xezxҳb'IO`xpg>w/yc\6/ԘHld\/\5u9!E3۔s{GJbwjS})S=qS?4'6wS4֒X8>P+MzfaSEw[NCX7ȴEiHXaSb6N(5CTd@gHa*Eܰ [8VI ֐?Sfn5_Y]b?6̈́x3G~0%b׶Ao2eP' ZJqv9ZRkƣd 73Pi7*2e 1X I1,ܫpQZyKwl~ YVލAj!EX&+~ޭ0 +Q9'+:"vܸomnoaP?21Y_`D31%>4JZ;b/\K[E/Pq(c J >4\M/ύ31{#s~c p~/C-?U[JPq%>A$Ίj:j ~wqpM5!vPHhN|-}.m*rg\BW㊘5W|0E{ԥB(oZyQ ~!4xpDA|0Pz^=_Ͼ-" Rp} +k\]E$?JX8}I2kƟ_Y:G:|H +5MGG]Q qF5za=Zj!6{Qz57TiZa08IUբwq>0]C`./Cf~Ts5w҈8 m|E:dO[W1UPh#]g̊ao B͋uܜrOA)dV6dK)tlR;E'7sCk1:)˞53A|=Ib]Rf(c_Ll|B{$9cW0 AL("6.d^nE4A|W8'/=w.b!Gt3"h%.YK>~>|b%)2˩BS= BUJp]Q9ef1*ZU( M?z64fhEX4qpWN_xnq<!⿿&PL˅ju*wuٔ{os<<"9'B\*U⃕Kmbyw5x82Z:qt ++yiU11z^B/Mwl^fAζ)-T{6˜K#$#m$ Z(|m' Dž`cIzfI49ðOC0MGgKF.ߴ~ڣ^=9_A'- 7pz]qߧ1_A*_w"5CN#n a1G +Z3,deN_"M8l@JcI]'+@šzd]?|o4 Y)t'h;ZsK h_ +D/ѥhYsKrT,=-a.@Χ~ E?%Qu൘/mןm~7=Dz~_hlasR $ ζ %Lyq y*-ݔOힽ Cbj(iov.81 4,K*N(t]c.16zn/5uZUUިŲBGU_'!z1b?nR'fD`pP-N*/=ž̊B=q\* +G|!q|O' H[[4ؿ8շ;2z;[(~8:K%WkH,*e$WNDm-O+ FYzWk_E9nT4)85qWi=#Rh+ӽ9-X[u R`->?=:08;:qNJQoɺc%JՌ0A43·p ؍P+v[īљ+ K995Lc&z:tVw G Sf˓ɤ<@~B3eRH`wA>Xi2t.E/NՐGy~ n %b[h_i qUh4bÞhəkqQ<@Y=<-CizHZ^@g\2+V s!*{1냭_ =S +}yd5wՍ>xF-v"h~G~]Xw;h4O)RaQf$NgWi^\`-NՄE,ϡuR;`KWм(Ќg3L ]L9`|1bj!Ļ6 3VQt?i믯v>r]aBrc!vH?f3@åҍOrZ=`^ ՟j%Ջz +D&Wi%!U?Dl3R#grt(>roP8]1:ϴ Kߣ^BsBah9XJ#B .2)NȖ́Gk *fуmsi:pa&x5980hX5)f]0M ^n[lTMan=v!; QqFt),Y<>֦wX#di_c3mN.ȃRcJiV{VT}Jp p*9Ex^%98z>n{#d)`Xi~鈯 V7%W:Vߌ־$Doȏh&P&$xK\UxF.]oǶ׺ژS@emQ~SQ_V"O3 ]N^%S(yʠ@ڃ5O; M⳶֘Ex@| F!{u +'oد@=Dy +w0ѷTJ׆j}5Bآ(lt]~tS=Rסr [S*Z3n1qra@cLI7ޯ$]/,l> 0O\vid21#D|#nq#xL1N07ei5U7}||Yd;n{:M</8iGԂVLڥ8NnR:ɻnR9ܴB'Zm O;d@F~#y39墖sOIs*(vRkxUTYi^ljV$0YGxmoosGr'Fn+QF*oXį A ߖ"l1eD-)W }ӿ${Dm o7\QN"!/l7F^3ӭ %Q4cy+.gR~ƒQ$;U\x&5%hM=N{E w,~d+<^?32A Ucйei +bƫ'}ƒ[~<ӇX*S5Udvy֨TŸKMr㈁h1)dINlG3 +q>˪-0GmSJk jXWx]>e¼`/N-uaiod햫 +>S#I!6~ڈql[O3X(/Έn!"-!izL_CZwmDn{"TZ~eǻK<*g'gŊ+m4Ɯ^^)+3S98y04n+??dw)P#CK(J=6j׺*C4WjVe_־,+3IuYp1Av)&5dcrAH~R~KgĴ@8*a {NTr9=jԣ紲g>3%B[ |> dkFl()(Qta 1G:_CNbX +Un؏ssBZE޷ιisW7Y=S~J}9g2ηp]E?KRM%yGIj_)5:R#X|FOJN*D5Iްkj&[Š'A)A(:!2h=^KKLx+})ߑk|MRv2(Z "#&O\\7REY3b\ ` +̦f<8SPȋK;j KN&}6D#ZgTVUԿ(G*_B'3E'76bqv"p}¶lXGo0dh~IJ+%Qb +9S=wՒMS0!]C`=K 3h|ӛ^쌪KPskJ_(GY>P1I,ED3VP@yF#o# [ D2Qk>" +5ޗK2f҆lG8Q>Z7u"YImRO,]o~2[vGroxtu;(j*ރ9ێP=lK|+h[8 }c[_r0z>\|{x MLW{VmIo('Nn^Cz` _uuA~unowI:,gku '!92#'!nǕsK ?T$jGa^Щ.gzz*RL۩\:raF2VfXvv_/IJ~{d4jpZTD|QvXp﫿߀UQ(8V0un&VcǏo[ ' }E0\) W47T MTd_={JDEwzAH/^P0U)wU E]<ʻaxRkJd6;pug]2'}3, gٹ=,p8I0`N6º$Jd̐ 6߹?WMpZʯf9/5Sc/_my%W v.E8\WfGLs/\wM'hDNy ]\HskZ5cq1-plBp@wJ=dߺsf\ym5+Q0>'EBSeX&ݸADJŽlAXVUEh)-۲Uæ$]BMdX +jlI[aedEW)Uا|zXUOҜ&ETbq RVUqS;C`WSu^:B$ ,H|-m@#lKmvM?SݐnO 6Z,e|Ire9Gpw@ƞ~y"ĥѢѦb|krr]1}vE=x~,緋 y|Xf(hd3D^~{Vmr2.]Bqfd8^wF`R4y'qZ_pshD0}j洇==Dx4( ΘJ_X[w"a'GS$h?vT-v2R a[ٔ/_]$8!jħg<}A!~|M^>5-6+(\Tk!yhm ]mM;HdV.l~.ԾL*̇؊O]8y7.uJ\r&C*wU%#(mHz=]m|U{#^eucXyQm&D" Pwخ bgAEԻϬ?~-:ޕ0W'm-{/|,<9rT|)%҈UWFeaD;)vuUa- AjehF.1gvfxtuEUVsWYlS!R:A|ƈYv( t rM:2p?z/A_87 7[ +or֐fZ Ȑԣ*LD,YŹEG:y_",>WL&9 ;٣O TSkawl.bmX!`) 'Ξ?$$^ꏌn(4Юr{c`wG(BgKن ^O;-m^}@/LF-'.&Nj`b-b/-i0f'ɴ{TJ\/PN}/[`7Gį>:к_s|<ʇ^f\ -U㬆!?׏X|Qz,‘0W4oqvi6 9ngݱq"{V{QȒDP0jv%ZfGJϰUYOU<"bϣvD4j!&zl)0IȀ߽|>b='sA5uG9̃."rl/KdRŴ{j\vΫLM3tV #̏hP+5haUJn;^ a#bXԺl˝W P.qGHdj/dbU0SUC0ԣ$iinQs~'Ա{sg- my(T8)6fsXz爖bS -$:$s T̷=aIq';qGLl JՑP 7WLv Q`.WO V@=G>,,ۓ*'#r^{a:Z aM}.- K$z$#6;{! +yO8O6`D_-$5qNJ>,}4MιEeM+O+FttȠb ,kQl<0A΅ZjT!rN'q9CQJdPU+ˆtW[(D+mHhBPt2g7*#t(o]3Sv}0TӌB\b)d`ր8Y_6_ֿYo@Q3Hz3,NK@0yr }PAm BŪ3i=p˞QwQ׍#JuCn>z%R8Ts) +coQ)xDf3%(zɱѹ,۸۫g~J~f})oh-UxP3nRI9 aTITM=JWRy9 %gHv?w b~sۍYITi eS9>TGS^̬ZYYPAc`U(9vHPgZ0dk0^@&ɖ3/=/=>{1Q.-d޼bĨd.#_b'2`Zbv璉uU8a*6ͷ TO#CgQUij_Ϊ9–9$,ZD.rJ&zQ{pc՘n[QwU6[A:KIt<)Y:)c+n +;lUTWw O> %uQo姻Xgvw:Ypn zakqX-Q 2e `H[Oc,9 UzF1*w35rϤaowe +QC5Yt,pδ5jZ#&a=X&\#*㟿3N֭b2LiDW``!5^U*"w|6WeO=6NEA~i~Mli@sT~OubŬW"@Kf$+gdNO#6 +3kE cF;$PgMȾ#!ʤ:bFeBٛ^@ПqC_ ݡRJ-X/iIuH쟺TbZ=dJȨiCdCN)4I򁲘S s̆is#~*NXw[WNP!/:mQCH|f*QnBRg Z%U- W[C \$5kobҗljC oa*.#*mOݎaq ->GEgi49QI_N+TˊnʳUc_>35J!Z4#A ږQw[NՠVYy\ GO"̫k m5c[ZPZR&f/Io K+{уrAAdM#T< _!a3W3&I[Xk8gSZ>'x&9s+ٍ .r5`Vu_cF)*UшѐÀC 1/+7b<27*|д/0c9,ID :bpq] 9J ߹C8\)a*ޅ +HV2 S +qNs0ſJ~"`K)]Azp{$ydvG zɼ% 'qWːcn)IpJ Rl^l5{r&XbTW+Eq|~?ds\OvSasŒ"m5/}X&֖ x %^? 6UC(-l46")Y4YRQ=k)UD-n^X![(R$$5&=mQR-襖 +.GI.Y2~5~V&1/TH)4>~Z{ Z +Uʲa٣j,SƨSK<5?MUrr_IH/OR&ZƲr=^E5Υ:z?;e|y4@Qn' ߤleW':<"aW遅 +tWE|eE (Br[e|S/' & +- ^uH+ f@*5Wƚ^.:`oxv/oq$U/{Tq!/,RIzWHVW4UKͤW&}Zז:LB +C: +-ijJvg@2NiSZu&3PmɗA¶$,2V'3["~ +rʋ% $@ҽaF^Xֿ>o!7]N|U;$5Ȣ3RN0yw:ʽg'khmejyhLk~{8 ֜k(7B+ĈlMCѣA<"m_8+xHʔcբv<ɪlS58TF_:֜"R!R/M;Y#"Vf]SD;}{̕^ڱ/ Eut'ӔXܽdRKgUdd!T>ȔaP2x_.fN ]k6'a~7"Č %9/`'Sj_̊5{\c//"KE2sK 鐐/̿A>a8DgI).0 +qe[-6 +ϣ8#B0ž5b URfyfƈZ^Kbc;Kr0CD.xtzu)TV=\pB`?NJ8HVPB&j.?B'.%et4,IsI2'] +(W_PSC)x҄'n +bO%S{K" EUHؾb ;yqh~loZt%+0fF%>l%EHDInv=ߍb ~? +7"N :|ڼaR;J<?I4^H >!ɻvp$J7H@ox*o!cxөԲXYn˳qپͺ!D`Ԟ0>sq"i=5BbZGB8XQcg g) V̎!wʦu3E$[tN_bD8r73gKx:#WQɒ)oޟZ\6g#Iޞm=Bc\Х~ +CF1';Ev#Nڊ}1v +fW3U8`uiZG( J:I0AbG [޺b7Ņ]x|WV(Sk7 B1'ϟ]yHy S?N\62P?e0+:mQD% Bg:[-)ӣr?0_cu'bӝ?[=ѺcZfo~:ϻϨNbDTeΏ*+ WOVYģ&nfyasi`pTo;au'd䮚OQ}0ϸ~xZnh0z]dYtg,YHG̽St+2g3b\jgt=x^#@U +nCJZ۹--`8 +n!~;OA=|€)(E*rU{nR/sFC&( 8!#\nhzXC*~5dOhe17U 6DАn 6 mm} %(]-Po*?:2H@`-Y7vJ4 !.{\*l< @ m;JWBr}~S?EqWO8nNЍ-\FN|*

4l:>Q^{OGY^3Td8ᦸn&=S6ݐPiH}Ibg^o \ GHmOl?$\Z9ͮx&Jh繯Au̪}Z8!K;"!kÌ/[On}`gCn<D̔!;3wD.J@=9,][3;XVWt[pq;GdžݘL /V~/p~^jrd,h-ZR#; -8CN`Ж7^!U"d Ũq?=7B.B7XMٱ?|?-+3T=H^k6lznWdvx PhP| +h/yPχùi_ChuEX@WW@ZM84U9YKsG-+|Da-jHǻ9CYHgN&K7D~OϬ->%vT[)0~ wApgby[rdJ'&] M}R%(ivV7Q} UpKp8ޗ0oL˳.Da hUY +d9̗uהH+B}meU?⪥ngMc'G+uժu1߫BOR䕕6gz'&qU'N /._52}+|͞] = al^ZzmmAJ;qS EݬTdy _XE\gGAc?g#x|x#h>XL^ i~GwK׳dwj:PyHwx`@'TRк Ggg­u5~Qձwޑ=zHh=ɺ"lR:ɽGiEV𘶸 2oO@`s$>ϝ+I*g`HC^qh5oڲ{5%`u2ސdZ +sF+rŕ +DMP( 3-!eygGOA2W1°] ٫ALMg ~63׏Z")/WP$7 JX'C_w1 \ыLVӤȂҕ?A|3^5h<E.]2GIَ@Y+{;xbO*~m?Loy}+Sc"=]~{XkX<\Pqؽ=q0Y!#Z%'||6kUoG#1CgnCVk9kLK!w+ͩ'XQVo^[TX[}qc[{ +F^ +nWO>K-J&9Ԑ;u %"#i=8GV x<6#sֈܶ-5-M_W \8 m`U|ϴy}z 6Ik0Jf(;64fzsZ); AI0(WTNC R oz=x5wEzg$oKk ^e~H F7jVOy$`1pgkxۭv[R~ω9PK4ϝrJ !cpآ<- CU) RrBn̯g|U"q/{3j*ܛbjZe=Dž$/o 0 bUr5Шi|}0)^OB~Uٹ"PE',DK;T9T{HRc$}$yN^(:*0X^"k*Yn 1;Tbb*L_OQu +M;w05^k{5L}e+7($`2C:y9 ;#6vK)V@zţ ęDjۅm;تƾ,ۇs7GI"bO^ I'zF+]l@}*-NO-XO8ϓ4F͡"V0 +UL,5?g4~vѶtfCacSPU9xӅۢe-`1VWz 'a dl{nܡ6¸ԳT |̎h~ptj@ F +pK#7G9Ȳ84cePpX>{ + 'Ѻ7 rl8olA+O&AzyYq3ldS+4}_?a/=ymi[3i9Vx$sװV@pBGPPSQXLo_Z$0Mf1JJ1|njJjOpuG 1&j-Iԍ]<Jw{>Sɰxxx,V&J?DtTyUϕo1bF3t *_-y~^z_[>xSkF+c( a'vhc>-WJ? ~_TGijۇ#`%v_qNVU&I[O4Dz6K{Q]hotyT&TPHa͕_2d-q2ț'K: +t3No5wn-rgF@dUUWWwW +H 6qb- ++%}y<` k\wxڊ;͐ e)b9C Q!nBg+iAs=gX#@Q~X9EYË_>B|6܊ E @uu;}VE@寤;~R%Wd11}czAPԀ9GdFx+jKyPX)ޒ7aFdu¾26y`$cHC$f2_-^šK"+xFږoiH=aAǚiPˑ%{ jgl87s9)25 O:/[l.wevbʔp@ Aѓ(sA'Y|C-4!`w xBԌqa%XBԌz\ewF&t3튡ₒrQ1oA./lRN++ɭT>T/m8pPg -qݯVUKО)MM1]!린$J%;21֝@Ϧ!ϳk|+Vc'Wr Sq5=b@D>/UMaiaN̙ +!,3&-e%0 0Z9$ $t2pajgI_0/eZ#4ZEU[ h-8P &?$ Ha-~s*{Ţ +o6(v?dm".h +Gfhį]:]UԾ5>"+"ur٤$ VL=HގU1|17ILNU \Xp*N"ntMkyPeeL+EtaP@NmUc1 ¨kvш$^p͛|%k4Wݏy^|3QȵōN{F FNk_wM'OGRRL]^_E[BE-POב&fu8/2mBN-uSqjXӹTٍs&wbEnb9Y)4bdX(,q#[- \iJœ٩:(nDH>Ix ׹,Zap b9& @a`F +Rrhq.}+m +4b/~Yq8*9]vH aHzC؏,R-rX2Z9x|H#YxOξ[izcMolD’,Lb"'_\$]1@\fێt' +KնpFνm=,+E\t!Vi*@A*Y $l"-w FeCEio1TUAHfJN#H2)a|9w›oBEO . B ^_L̾9yt)OTXv Ni%06JDՋ=SWy|XV/ִK<ݻO9WR6HtQ}{o[%`)鹭NcAYl#%jzMZɃD_Ҋd+M(z %I7QaXuUoAg}9 ,@`σy|>S'N.iF7)+YꙀswE1R>}֗)M>K2wPa!?z#e)1\[jƣh‥jtWZqT=/BӻªX5y2m $% F;qυ,z1c=kh;ظ#$?p$JZ[ +E*@Nmw`M?+WMba85q" "e<4( dsC*E.@2vYdANdTRNc-gZX?nl}"em9tt)֞dľz^< zft)CY߰Mv4{$}`: ]9.bQH[PV D+2ޠlQf;StSB0a -!{ŝ.ٳyQ:k !ܴU5hpE$jƗW~lrJA +m4Dxj̱h>gsrMYƣ]nKrs'IJ,˃A͖#U^A83w#+] aSyTRDB=hmyZ+sXT]!9sN!rypǓ#Q]b4d)b*t}b. x}h'V0@smR@46m{W&+k:6 x:0 c3KP2P[#^Ve֙k<}yH-l+jO^SPr5>"}*BP"*2 f0ѡxX1~z+2t6,.[CۺWFVpGR&*xD9IIS_|x Gn^Fܢ>Nb5W 7aUFDPqꅤV8TghK=BRgZUM6D'bXIcxZy]g8SsL6$KL{컈[/Mx&e5ȗɎ:{e>q9(.I$5aX9  IPֵ͠`vdv3]jƹPb)5,Ċ&v7W!ӳWt#0 ׭.t}{݋o}o^]yur|O{ӗ/.wd\2OzO^O<˛_}ssoNww^?7oƯ9+'O>W endstream endobj 45 0 obj <>stream +='dHs-K* $ް,ĐC5&῵ ABb-Nv@-H%ْ'XpiaA!V9 NwHH" y=]ڛCtF 4b54R΃x T[ޅ_,_ E`݄4k!Xiޔɯ렌dżV}ꃥr V3;{*vQ"q_UQl"f=3dј}: 9`+ބ;w|/1:I2;8@ARD"Vu(ǛT!eju( +8`0 fYH,*U%"$`3j?^TWqu鑲YA[ oo…^rqQB`?FGF$ H3d-=Ǚ|4Kߧ`;}!ַ윥%RVMdrv])r#_IC ~DS[Ezsx#U1tuEg,:ԁ{Eb; 0rX.]|`7/caⲔ$x®BNrZ`g%Vo v]s z ^~3$ӂ9y^MӖMboMh +v9ٜ\ڒ)U?GJ.RƩA}V2:bNǑQ}\CeFq5ו,A}mi_TFsL:b<= R`Qܬ8[J׋*BR~}#zV"0P¼KUOWBMn?-GQX'xCuaxQj0% [%l&f;G6lI{~hb &;m՞"`{q c:>|*PK!tʧa!2O&tUwa7Cߣ n &QU/ +3w$[߯Xlg{ 捴՝o jQs84;PJضē[Cx{Hm\sڗR݁d]7p u׻=wC/@A&nJ3ВX!lj[V$$$>eI}2 Rp*7h4C:\2nD/M@HI$p( +;G2#J{sy|.tUY-b[9h̠\j] +Tu /2tXChsѰ9G}be''ep3?UᏩez[(!Qёeȴj&$ڣbI=8" {,qm"ؠ(xvVdٓyt"^xvȔ/\-,R_әSЯKy)YX> Gn|} XZJp*5 |: +ҷYHS_QfLs5V +lq,8e|,Fgqwv(=ǔm;ACn%n&܏A@Ra8;6qSu Bo6 _ʤp5}9D2I>iN C`֪ikN@열/MR;4;==?fJüqHp#Ҿ|]m؆-CۋPU]RjQrB&c 69n >A"ۇHۄa/$+=.ҋrmS9Wٳ«|yDL^)Rw\vጿ{.e>?] Cd<Wdg(?ՇSfՄ*y~jho5ה!=$k2ih{+%~t=v)G 5uuk _X-[M!C%d!?C O/d[f323[-%}[]nK/S!:d5UEgXقrvN$k;KfrkTGH#mhr*%|1Z{Ox(4Q3 +,%+OY;njGDGfa"Òjw(~L2b\1HMj^`UH`-O@c,{5OZJ6PףI" N_tL9d;HJIKMÇbL% ^rngRgYj48= \Z!oYK/#ч4^@7Wܱgasd@ae{PFOAl|pEX)46ڀM.ڳp(+=إ^÷a9` EV0-hAjR#Yڽ:9% iRرhVhiF%|/b2jۅQ=ip!Ѓ2ɻdINvL"#WA sjAD$82Ml)&a6µ ?*cEgx ~<8`p$FB{năuYiȈ +?'* v~XL WC %W"P!9\+4 +̱))< ph}E'&OZLә0Iԕ$* e1iY^ :uHʪ*SsvTYXCafbrw +h+?@MX3e s}YhLҞS5*,ѫhU #b,ˣf'$ϰ$'=?xt!5`v# +'crហCaDߑm;Dz)h=*LŪT_OضXjAGB6M FܡXHR4AƼ7<ԋx^5\Lt~@HiCH&0dD~BJpNwrSFZV =<gH XK!&<CWʄ9j;V*2DFH #S,#%C;n/IV:RmkzVQֺMR5ϥG#c+G8BNJTKXl{,0~/<Z({L^˽$NqV JRC}%@[v2)S0ovEIXHvZ$x&yobvJ=gaI,n,'X,3z|ohxLr1'qҦ[h 6(ű °'[[HiI%ޯeEP(-/AI<\ٰ +k^/<.PQ丷AByxA2ˆ/9#m7G BnDgV '&( >U20vj(ˠr.zڦ sQӾOwādŒ~_$(ۈ,DIk3;Y1硦I1S@v`BbRn%Z@0'эHCr@|c1E(~z(j~27 121X$3 O*zQBHrPI,T!3B76cPrmEsAzm4/z}IUW(aZ{Ҁ(RNg'?a!MP w(9,Y !qkCu*B84DFͬCB#AavizLӣ˲mA<0y' +,C;wt}LYl0uȄg`irEߩZ i'Vp(= }((&ؙf-3X5rn;9w産b5-4@/Dq&]R{9n%:xZOŮ|ZSeJ%XA0M)oڽ/7<ƞ:P8(G(5NJ9u@?~i{6pzww]V50C$,(>p –AZ6ނ3hMI{\$movxh: +B|QkwpdvSd' `:/LceV!ýzdم45N賥΁~pTyh6\ns@Bf!|h'A)b W`֠pA1Kt=54k=%]bP]ԅ]4DE1>JlcɬXէE|d9  [~>`lPuItCfi;w Yx G[3 ݡ3z^(7SZ풰G n@;3(c@ gvuYZJ˖ CvxT@w"7(I ;g~X][j4HQ{ W]_ R=!:NJ׈!oG?lh٧z+&BH]Xdm .L ߟ2XPOuA'(=s6l% ` G.1d;&] Vyj = kgT^G b{|Ll +/ek]*#ļ5+A$#)3el OA+Amm$!F +OZ#0՛{tJTs 5zrN{#d1,B2Bq\3mϝ5}P;!)Ջ<}^%;d]>b+$M:O`Oi [^H곀v~4zRe$<T&RE+B s VIPלk _P ӆZ;blA=2Jg9U|)J& d@}C_&BK`c_лN|e 3g캦\ƌYznLa8<^}1IF|VXHVmWl] 0fTKHFD/{ /X+HyH,ȂK82F@-nltr +B 5@P +8Yp@ '@paVk7|{tbxp|ϖ #?1Cn#6 /|̹y(3oi;k>> +F 9u$~"H#먰p:5KDoK<0HEFQQ}IJG_ Oc +\猀>0YIRI[ۣڋzOW!W`aS{ +qĞ;*kFd3D#) .X==P4)$2d(PdO|ǝ>Z#'X^}NW濰wۗbjr`hG*lBwٗr^-6w1) g 䎄҉ܫD9M ؽ(I)3XKuZ{"6ڧfF$N\lL}KLHI]Z[Î;8=:9Dmc_%%c&=;`]߻dxڊRi/换r A癈`*dRMa#}EY썘w VF wѦ5.:Iv #!o{2{: ePO}?HR1caYBJQj;&\Sz$S3*U*A{a|qnZ;2AmZ<,*avE' 0t!O5'E}ht'NK2#6&4r3őR D%PY},:5bu@ZsM + +欇\z-.^CuyTI yF*#i:B<δ̨"@^݋W/M\F̆p$ryAn;5+ + M&_|9$2g :p$>-Ha=W Z8J;3i\`\#+!Az> %*rx'tD,{L(퀕p`]a6}39WyM/5*>gؒ<ļ tœ}W͜%YH?){1hf|Vc]N8?R38 V)C܈~VJCns9f\nz 0gfr%a*hFOI1E9d*a V{Ii2]bhGJH+Ah`MF›5tSe7I +U9]bx-{I)˰~K<ʨq*6X4BV4dA 4=B/f 4=9ٰZt@ H-y%Ż"yO=97"nI)3 gĜ~ӄ͝Ūl +XDvE܈ƴ"HR Tj{nBlrDx/px?TX5Asm>(mE!jB4bl?ȧPk='ݴDֳB(ͼ x<,ev1,P(Eۀ69ʷPȰCݺ5l`-> :w">=H2f~to#Wj&KxƷHi&4om-: y y9r(>{xصGRؤ֥>_*[@G \}5^~6 d鬓ՎF츢K=9 ?v#LF%{;aA Qtb '+^z)>јvK^m'2tlO_0|WVHu߳H7PB8,V KzR[ W/屆Җ7/},)=$mH9W~ĻLLM6=%el^/ytGRw) |xW%^^pUi!ʥM&x+N޾Hя*~F;3[)y1s=tωE;ԣP^RsE32}{}tyHAYBKt,&] P{{@]>َyeC yĚ +t TG?3C6W8)6rxqY?GV}vt 1' ˂6L'٨(}\=i;]F*{@AQ忒&u^S :$1D d +f@YO3 ViȒ%wzW|[Ifd>tBQb;rvhYЬ-U1e +@.BWq]m+{:q;ń⬪d{Gs2 2ZJi~:ODxk;2;XLqZaD=N\CLreK28S8F\@[23TQ1 ^IP; 鼥fXgAc΋`B!+zzx;g9/ +)a&YvD<+i2SX(E \_*"ibȗk^5dvt{ "*>?S5%0 Ob^ -$R)lkIIwѐ\)QAfHI(E_+09=3sn>b!Krl`+/2뾔'`c gO]jytbLQNJrSlVY@%8ϸ`D&ZaW&ã(wgvaI( W[Z\_|12fiJ34.b?K͔Ks]o;Pj\w:ud;X(^r 6:aQuF-İc)m Pq-ēY.d2zXok/E-]ۇOg#0e91*<`ڒÄO^ǡ@/S6;6xO2kFʽ/?AkͲ1t7v3t ֥Vy^J&{gղ%d5-{9PW9p0b>~|XY]y29"Zw"LED mF~Y'IRZ!K1VlX!第;XAXh$=e:;d7u-Npw m.TIM˺kY|=bG#2|:t}ԉ%PUuL%(]Z^Ic{om~٧zXn?T&/Z6&c_U,I@GV3}1G88bêT8b[8ڎMF;> +ET^ Wюs]g'P~˜H6DX(8)![TP (aU }Q.' Nd%DG4{"fXepz| 2cJEyH|䊺"?e ~3Tl PMER<5Rl\D-)c㍨ bσz91 +8#{,)e+!aT#y2} kVP`%RPE% cQ"%<"@ ZZF2FI,cmڡA!E-AٚC&tڍޣo"~+gfxx{d LvhwhuQn BO ?(>8֝%@}q9ibKtH{sa v Kx( I308YkCfIcuS.ۗRK Ucku5bA @{RrZrqYSiO0>Mi?_£tBJ KHi-Hc4{fMM38N{]ص]iGVc.¨]VF-:a)7 +D46) @rK2 kD0$(TRd}hRlE!Onɳ<}] }țS+І xZ!TXWIgR`48 )i7¶:`dqs?sfغXxeRmqG͟p"?ʼn~<Wwͯ~wo'{߽3~rjN~w?+_/7o_]?ܵ__o89_~~'?|?;wN}y~=~?_귿ߝ~1=~K7u;㷿m_ ɸ?K]%?_߼Wz5w%H/(!6~?);'{߾;ԅ\~Bjר(JtM"&1ySC(A4jxak7va1P3yhDW }7'dfظ||~suܸ+'\L͍O<UuChd#Nuchz:HJ$lGc!J(7h"UryJX%H )8,*eZ~.'` ^ |WSdP}@\h~4sz姧Ү[1mqǁgSFo }g#9Q ׋~?ӈN4!ӈ-st:[xT#| +g #gb:ׯτ"8:ţwps iXΧW{~P|b&[ٍNn|_nՎ{ioz5raOċqZ,B[G8w?iNŪ|@4$LM@h.-7"&Fc.,@=Exh)fCqa4Lh>O>ob7X8y +ǁ\FE[#*M&7"Np皟4EI^7ؑط|}jw`t:W?8ws>㷧9)o_=8ק;mFVϖX?pM(;7wYM7~N -8J:A_KR<Y@>o/ ir4xyL4/ tȧTL)ŵZ_E"<'RYKxݿ#O*h;O9x?5^i&f:vc5TnÏE)ss3xs7cjkQLj;?Qʯ%Jd{zfLsiqΐH\g}U\D˪^{*'>;mBBŒW z}d?[219|l9畣ys 0r@IP=h%!/rWV:i j8ʼnT84NM=W٥!_58[9[r߁ٵHp,ڂϼQZJ/^F 4@Ӷyx?wt#iN:Zx|Jl(3j9+Uw6Yҩ|vCwK@2+ τdi9occp9>^Ld8ㆽ$jjl=SDXE^n| 'zX}wc_''@";ѷ|3'VDu2 elz=͔Xd}80I{DL]N$9]YNsaH7z8 z"yk8@c:\Sc:kC1=QFZh~͢g3FJ1Ս}hp;vFq# |_ζ#`gr?KFmy{Q~WNH>)pz39c'R}4u->fjpYG?4W$l}.{s~%xgg8+?Tg`SEt\M4B>jNN蛬+^XkAO wՊ k:Y;xΜ߿*I:G9EL9u?R'i_nU-.Fpﴬ$m4ޝ<=A_gdhƖl 0}uyV?bŅ!z gÃ; y2թj,X%˖\@:a}'ExN_DDp7~ /PYS<su$/"$z}Jx"'LZ'2lVJ$5{ֿNǙݜ DuN]Kq <(Smć~/鹜v}FqҔ:NZoxW9k^7g-$v#gA~9>Rt7q}{>WՐw:{q&5.~$w9}_HkIjfOMUGEKxޕ"}wwcN4Qg?I5&m/Uy}F7xV圀I=|ћgtTDFJMfncU=>TZ=1e#rav>O찛sםDn@0k[+_ghp Q×&(|HwW?zm-IXj H)xAJ+hsh:' r҅zF9e2ʿ,o f5ٞtQ~Qf8V+υ=w|}zƖƻD5jwsO*nN7=5NcE$@M9 +yhu__}ƽMJuXN(|:FvUP|qO)Ht8:qcQOc|0Ώ|ᴳ+7Qۣ^\7QT=ۻV4֛3x'hwmwW*ݜRm 1oy 4=̓Lo-s'lNpOwmǒW,brUsv:PϭdFu$fgR8A=t8ox2M,z54BЊs;<W4]Z *3(>g3*4"AU;dF=NJRi| }+<IW ֿ uri'z~PX]}JO7 n툪,4P +[գo=ތG4(]d׃og9S,F$)x4y4y缯/~gwT<.s20@jsf ȁ3H^ٲ>Ǟz<[\'B)"Nُ0Q{gF{^2 8>Œ%=\z]W''.H1W$}*b^:Fsu6K9SkkI`CNս-:ӺL d}uCelgzDEmmri ' +W#>vu*''}btg)ܬn>ᇑ'upIf{yvCz?ZP~uuVj]C4t[#S܀%h^;"B8ٻuOo=\>u*{]m5{|diIٞ&*CM| 0z͟pnA5j"ڮ{d1.ܠ("K$EV@"\#^4 +*`/4M 5Ь!Pb]6Z ڞ<=h8F@yI7Zi{R3Z;_שЪ 7/yvu +HQb% +󕮴WJAb$J4]t06ebC]8Cj$M#G[;Y1nQ:0ՑmI{ RY {e+R3Q5\&7CWSTqs+,jZ 8_KlĄ#Od6F %#FN5Nd kY&5!{smhVq_CnG3-{u:Z=+YZYmTQ_:Z; Q,F*.H~ZrhTJU)@j"#CȚPBke ^ŋt`l$Tmi$`,5)Ko"$dB;%^IUF654*=2Wd[ 1"]ԭbސ$Ыe3 +;9X|xe#5߷F{(5meWHp.+Qz;4RW"j%UncɶґljҫԁCR+pF#J^iW fAqf;hek]x-0 w92D2몉FvAa*A^ 7JIz25XT`Ŧ#@FRwACx2Yc[9MVV܎@dAl 'N}8":B]A$RddlF lWT*u K F1J +-151Qy5xsS딲PҐ(1)s;Tm(!RƁ() +Uw@OVVjy3SvXH}o>ڲG[>6Ej(oҀ.ߟhmIEJt@$αV`uZ Ӳ h4 JviBTՖ6(e7lWjjm%./,5,y4bەc.*ճ:G8Z\x:,p|% [KW%NN0(.nԑ#^,Yj9Q#F"s05$NC0>C^ŸIpAWD^Zu5d͡& ++ +k2T)Z5R2-C⨉Ԩ%4vO7HK[Z@H4{t`[ۡ׮!OUjɚր"R܈F#z,5ZeFJg )C4\aH{_F;E+{5eQIhJB#ˍJl)r#lRYQdu #F{;ŐJQT Ĉ)"U;4.$<&D\LDwT!QOTJ^F+#d"5h) +]nNЫede?jk,tjU1d+ +#4]A٘*2IqDew\CRjQĀM[,CQx,EzRV̠NJLtNr'Vk {RN"yG4!TA+4L+I$(J#wjLFʳY&7uD(6D!O+hS2Z5J="Cv u"W|Vaz Ɩp{&j$큷P*~!AKʍĬ!)͠iH:=!Ζ6lõTɾ9>%ʻ[~!DnGZ&IJ#3IZLB+ 1+]u}7/-$D#O%RQfZ9ԯAɪX6 Jndg34*vQKAA='DHUAqH*t`Y8b.mõh]Zj:[), 4+DREgHfHsڇ6>X˦]-zٗfNLTÆf}tuoo#lȃizW:K4Oi:Hq Z=!ģLqIҁZWh i%,sDo!}3SCKJͶjH*roKEry +ү2D)S%@2AEa5ClTuĩ-_(8 K#)a)aUBЬ[+(km2DN"td+IrstBl˰Z=Vz@c f\EVd FVkPj2e͐ד NE:H䭀F qO?bD@DJ%X{rM\JQjh!M<{[ uJ]T/Pj$Ven#ubperŕӎpG ^oTmQʷh$IlZ[CA7Rwɴ뺤,(d4Jh߈|]H&h╳:@Fm+5u|KWٴ\Qڒ#o;)KRD#Urfd]Y +$[Jʅ:Q]F֠([5v2{f3fhY޲_/#lERuNTYm,UoyK3Ы=y/>;KM RNG#mi YvtC'[h(l;i;ܨV:q (&B}fMhT$Opܠ=y/@O#';EXtO$vCP*femḞHR@ÿw`)aUKUe8-fpJZ=Uzrɞ-*m;P:A: %$\k00 +u +.'5x l\]f"- &;T:PB-_E\Ķ|bHBh%Td5j[Kq72.ZR!׉68K +>lcSےk J@%gTXd-⦔Y&V,Jś$g ڕ-Ud5]mt)D_Ԑ4R +Ju)-E1`G5r2e|>Y?-Y:ŠQ+Gl4J JҁZY(5ZvH8Q2Y:K!zdl7fXD' Ub523t)Ét`S:Wjdzb6ʦOC ]jWI!pREfw)e+ڒT*Ut(-ʓ=ZϗE+REŠ6`%m$umOfU\k}ۥ{=&D=YlZV"%/G'ClIsiݗekI;y4(#\kCK*k/W+-x 7x^I(o ٰ WVH8^²p7{[I#[i:2n$S쫗:͔4_Sm `pȲ'O^\Q7*Z9]QeoFHF|v +F#!Lz*Sx`vZKNBԖWwMN}}$O6@q;?NoM\aB +H6 Oٍm)'i*Ъl.r_L9ߊNsXMY.7*Ԝ G-¥j}u㯪^`9M {'j"QnOJE!Qv>+b_=n$ Rrᯋ#X*˹JJۮYCc-7rh jJ&Ք:V2H:^ N!è&':QrNyC! Rig'<#Rg#2Uk9҉TG$ކ?\KuICoI؛|e!vPji@*l1QJmi ZRp{mI#`Jt؟AH!/Ku[Ej97֐z .1,vrz9꼘)ϡTBP?m5JKzrCR/תN!NXrܟz-U[xh) pi-H $(sZ[r?TIj= yzt`y8PR3`۵0=9OF$i0?[:ZLj(ĖwDs]/ڴAb0h0.${ן D{DrVw3Rn&~rM#7:'ԋ z2W[9Xݯ;\4[5 Ey=CzRhl5}AFWO+[7ne7fuX/f z~Blh!g41qD7Ӎ^ړO=sd1| AxgCsuСB^2,A{%qvwv& `+Fqqcw|xP<&%cw!^BP`>0q度;źY9VdQP98yvstvQPQº.hM 2^|ZQz[ݍ}UhL9]Vv3$}|2WFtUFowg%+\T.pӪKsT˝8G fC2iLgd]x0\H}km#6@1T*-/;S g +Y)Bd(~]/uȦ2O>[C6b ?J"@xǡg@.aX3 K®G҆I!ox>~|P.n@z0 O_>.R0~4 |Lh.d4<7*3 2yD : +xa\-YZYE02HT˗UF}$jUpOiWDoFwFڊE$eBrýfdˑQn=Y|D(. =s`/ m?MG{D₲!jE*gd܂zy+`ADC:t#ӗG2vMŭAٛq|B8!fX>oD!x_3Μy} +̛S5VM |0A@:B8Y1&!kTEbx0 1=A:l' sGrr%#Q6>Akb62YLA_Q6 +U6 kIH81{:[vž.ʆO](x~&@L\r&(i.,YEgئ {D{9aefץ6=b4z-~_l_Seyw7c]} A{Gvaݜin ($kHveZQ}8>ҋ& + ,oփwHof ?`cF1GxÄ eQ&L=鵙={e#U!=YKat\oh(ɇf<;d܂zRGwXO.` A_ +~ + {td&֌dsz_^1 +4먨|D߀`Ř1Bq%bh!,g8` Q#A XXCqc<Ĕ&ka߰^a]rn4׿'$׿ cGW96M2wLj3l8"157)jw*v Y[&I'p.Y[&HomSX E'8u [>>]9=.0y 5@0ٰa7q[H@o\z}/Ct]4HHE^7 |@1j^mf"94-<10 F dbbJGrhiﳁ9@ҾȾ{r0eYЛܲh|hľ.nݍ=AW}'Ƴ3 +[9#ea̕==up:SvVCן3]5u^: G^4>)8W3Dd"F0 kK 4x#Q}MDkjS|ROZAFcAvk0'D< p_;^@Hvs Y`JGnva ka,l'+#thLbsz5KoyOE-utS`ׇ`^>v\ڦ$kιWu\!8#F_ҡuc˚\0׃ƏE6A$z Z(d|Ёh>8Pnvgz!l:bA'|td9{F 9 Es1t?C}Mg`le(x ihMkSSn=k;Ыq3vgD<#{|⸩helL7x3@15_i{ĸ \6t};XG={8B7 ]->idž 3 >. ?.(~ṀKt5"R3 `Ma6HhMb8–Q#^DxOTe#E6 ٷ#l>`5g}TzBʹ>z߉to{c150五Lx0Gkd3Cۺx! ~KНBH0FށlѰJiz-?aˏkcΈ8.]=rf+ο/.19/ˊMoj7LH`Ejto0nyLj-̉f1_-!<.m0H@-:Xe<ÄĆwmS1M 4L >C!p ZB\X6O5];gs?dY̨}!]qFCm?j}4׸=[|Iܚ`k)&|Tht:{5[3!ӇOdM\0P-wxK.4k0BLEp <4j خ$Ս^TGjK up1>F>GlљLYF2@./5J|)wOs"{Tx?paCuB`.]SYi%ԮW7- (,p=^HO`|b<){4OwĐ!a|Bzq _ +so\ E6ct >W'1B|ډ9`ПGQL>[&'~~.}D`#  +U&<}%6w46e"OlѡLJ5`A/lG_0WLJ`LaSƺZ6c{LX0ټPs7X:̡n|F58O(ÕɔK^.`{-pfx.-W_;p;X*t$^hnk X GJ|=,g1" @xtt\΁\x(37k] >06BX(˸2X9$H߂̈8<+/ĄĬ2_+Dh{yClrCM(CU?\cڞ/bZ1z&f=Z8h-1!6% 9²q_SZ þ䆉<(exo7(d>qi7ǣ!ތ} @?1D)vd:u||zvMiDU֚/ҁ_wĭ`1D6]]wJO!^l6 dSz"]:Q:o57 0#ZHo5 ٮLI-0 sFUҘ6@l|ޏ8*` zI@|=m(y9qM8IH;ȾG~猶0_A\\ h+ ܮbcc +|5)!; $c +#a><uOBn&$W1_/|2u!:a,ꄚ.>2|\ RjALKĺj c9a:>[&.bI5Mgt.[c7dB\݃z`|1Ez8x4Z}ځ]Ĕ走bBDcl(7 q\ޏA2-Ruc>Wg|)k^7nyVLc}9Z L ؆/>`T1Mg3u?| +:'la{ĉfM֠ N06tշj,9;> }Oa +&[S >j*$oy~ 7b >hp-~6? tt;EσGl(4Qh΅z6ɚO{G<"wT3ҽ3SR9E\ +3@`g`=m`";d ɰ8N7'COfl?]_h1f)Ň Ј&?A kRН`# ^nFF7zKTc  σ^󶈌a\F2l?"F-sU +s{01}~}57f^W1?.]SSkS%ˆ8PnU=k Z X>^b0Z þlb^6 >,=7G"w3߂0jBO+|]bf1c %h iY"@R g`[ }T`}[:l=7L{@ngH>!=6p}1S3|)+!ݱ̀2`${14i0́X:-=±˄ q 7Hā0!y"pG:;ƿi;>r3W| [[Lmz2)4O~F=ʬ 9<1p =\N?r(o+GՊe*ρa~TP ЋN՗hO~jrFVâjF1HF Wd3_y[þ@Guf&OB SzzoqhMi(S9,vPьk7ЬZa>.[B-TwlsD(?5VzA: Oya=EWϰ^ NٲvL -L6'H7U_a}\GM8*a-Ѡ!bD<~Õ/w\M MWtjDX'l)}k/ KWVVLbYLCp!srך +?t Lx Etx_+w!&<]{SE rO=9gth!}ׇLgK_O>0n{Z yCaqK/༈ґ\/[zψ>b@ ɥoDװƛ3è! ΂բ9/rR98 +n>jD<4b$\(dkza>Qxr@Fi^,BEL6{*ˑX=xƇ'̘Vd?+G ɕ~e'd ߚ ZO )Ռ! +pWDo9Dү^:*o4[&wtC>Uak.~6\8]5 +xXLpU_2{;:9GtTh:d)8o \Vpbܺ9!9 $kZxJׁn\(iN4uC!_n@<=gү$%֏cw1|aʿvN|sdNyO0Y?0 r:$L<5>}9Cњc{4>}8]6|tL@@>=ΦqFħ>a㒷XSL~gwO +~ Mm@\]Eh|]3o4`ɀsڜSƫ 7q ++CM-v8ћ// +|k.yx"msۦ];dK2{߇.h8[1\\8 ͘El޶LIL2Z#k\:rGhOqȖ7]!'e@>Yd(&aǃLJjS>-:4)wNˤ)9˘`kxQV8 6> +URq^986g'T)!q k@o`>quD_W+&WLrM^cfՍזpRևqc9*XpiX'Cz,)= w%f<^O)>8OY/Sҽ3MTAGgLGU6|_sZ?B=7ҝ #jNhLUm$?2 cOŜqNC"]s_.k㲬Ɉ3-p@kQ S=>8H?q 1?+}c/mo1Z>TH@ 춶;$gW/+/Im\95.nxlRx㰵1dA_Iߋ|Y;?|GtĦq%d@>ƒ|ށ0X=1!~ B?I/1S{q,|X=3؈̡XFX3h!d?tsG2^5#jt-8ɟX7pc.hiCl6s.pϹֻ9ia%# n |ҧ)=[ޮlop [c6 8i{Mm/I4Mh yV15\2p'l_ qn+65_jd{@c.kΗy8t)5l )JS5w.kT>q7L."&8P\)7c\X2 ~?㿯IQI(G3J9zo5;Mkz & y2)9iGW_Z0@XŐ bFc!/->n+AX!)LⲎҭ א'>楀>%-S܃3SZYE'#/% IM%Dru*ctt9TO#v8㝿q2 BL3NogT˥5hp* cY2 +|YOcJS?St)S~2U4uf!}ƴfC'{il;\ CcSgO1_3pﭠ7?jC33ZfiACc5-#-=4 @ߟnH5\< CԆ'sϾ`J/h`A?B+Szƞ4a3O0oXN5^a_pyA&k2ީ^퓄! ȶ9ɠ  qclILi*t_QLC1t։m?}Ixeۯ 7W䛕W,姥S_/`w=uvx +9X`Z-bk~5i??%p*3:o7I) 1oox|PL)?&)[&NreNtv}X٣,OA쩗~0vS+7o^xG^Wm?ћ{2p-n}ɴtGSWL/MNnnQ|Ӄ|љR&qEce sM<+q `3$o8GfCf+'=pc=\o{HQmR?5>Йav0u!M}:nϭ]uc6>\hli9S %BrA6Wܠ;pL덅/@k 1 ӆGMu|zM_/vYN~|{3~ܛ?d% wY8Թ=tO>q_tg=xLq +ƺ}C֊{-˙زjخ |D#rW Y Vn;6=ҿӪA utˁg܁faC^lO[n܆%|۳gKܯ>bF{?+igu^rNo|h1<__7sf;~krx#W7 WOM7~ :d^I_,xh}vo.r{rt4ݯ+|s'{7^_ydsA¾fS/ ?=q1|aj>c +͛w]pq |p xpÍ?~W<~߸L1G_O}c/,U|?yЧ_y11_2g~NӃ7W_8O̥⃋9K׏=ύtM>741z(;}wXRW@G/vc]OmsܱԎ_Y|`e6Q߼}/ܾNc5s^(#2;η7zRw~cn?f{Ami1]lhLeĺRr.>y<ӗ=:.\eL~[j<3c:vic Ko?.63k>}6O#|sO0Vb49vjMu7tƃw4mD +t'eeb U .ex?YE$eGףnW;蛏x2ɞ\ӆ_`/s/zs v\p3ӟ?wxjxZ۵3≛ɻǞwOV +o#y/~!H8u5Ykؕi}Dn;\72 WFUY$zbxJw乻sfNp8?tGxbc ^O7?X?򰻍7 n46_K͸Y^w. wJZngWI|-F|َ+ }+.Vϭ̿]qzCiWׯcwwÅcw|ؽ4Ӊs7ǷQO;wnj߹Y||=> #ot}μu\~B O5|p?lsUb=e=Y\xl}p9w>v׭~xЎ cVf\ϫ]T^x5|夊7Oތ,x7SWbJ/܈,z="Q.Ė_breŜ;j\_}[̿ +ӭr9֙\ݿ0^+-o_[̾h0EG!^Qf燹WJ^\`=s\Lo;g:Sr9vζM|]%8{꼞W^S|=jﵸ7JO݉,ndi䭨7J]-?U/%W5_Nʸ_c"o9 \{ _=]% vp.3wZ_;a)dOJq3=JN_c_K\o[~YyswSB6,҅'^+~]ف莪ƆI57S5o%Xykͯ.zv遚Φyr'(k{VLx];/y>;X.vJmƭ\ϱbo]KhXVR;fiϽ߯f]ɫp.ٽgS*2.w{>^μz~|^ >ԧ]/l{:vIFM8z&biO}y kڣ?$T|. W/|>gKWc:;6ΪMwjvDSqNLeQGF3`<]aK~Ŋw EP.Q?JkQ٨?W~:f-=2tAL[xBꗇ K7Ȫ]Ze٩ܪړ9UNU|_CݶZקWʼEbN3ϧTmErz-<ҍWN vnd%F|OȊ![&z}dܹjkȜhՔUTcUcUR zG5j|)*3UƫUӦViUs򛷟.3>PܙP~&ԙ3˾Sz)3j7\-nh:Q iJE{U}QJDDQ 0(&r DI3%GA ̎a1bΎifbf9=>\\mMw۵kk +}{zK*m~{OR7=|ϡ6w>W/3wos̷OߧYއ1`4 +MƏAfpF ŷa92E#k4!- pJ=)$I҃ޟڤxPMQ/6ީlm\}~ץzl_,n}\)N"w+b^u֊*D]3YLW&OFl{*u^3Qk5&FÑ! -I~p4R&~FZJ? 1SЬ9 +.Ww/L])?]QrBY}Ӆ -5\,nvS\ȫ;v6p?v6We˨_Oy|)S6yDKV"[ [<6+u +=|oC^ g Q3H[?FMG3#;fo|rP{ZlWE /n\ذjA1d T|{V_^ʩ;p5ZqC /*>ސxc띗k6>ͭUuk<7z?d?a(MxwҚ|jN<-ANp#L}Vp- vUسuQSﵴol>{DzxLB\ZxlQ㙋ZNӫYuﮕϋ{%pwBg!(DF_F932/B3s|4R}:[1Nοp08߇78P& Ks7d(Vx(xP?|ʾ+uU64<p£F ıWC_{)E_=-==Mדq/5=}J' +<즳l<~1qFߏj2a`Bgh}?'ۣqhS +lW[]Axw]ǩ}N+h|! r;N^o9r1bq} T5`^t>M>s;kO~.1RFhXajfLM>~,2њiN@6Hg:i慦.C+i9_fro/ล yW}8]dk=1 'nl ۰mx-Ժ=8L{Zr"a_l%<_<5V d>t"i82uD& df<BCf"c~ם̜ф9!h[`+~%DE>W{g[5fO7lƾž~}5բmv^{9Oogmi0Aee4acnmX4B Lt쐩4rgc?\4ۢ6R_Tƿ9rfC_^=rb^˭Koiz1ҥW.`{zjN# _ԛ,"s6OAfFvx-DƋbdjmm0mDgƢ)>e> .ׄA ztQ q?jxџs/txr%j\ K&N_"ό-ΐ2sTc,~n,2}8 Lؠq 3x|:1)B# hK6(*GS64@N/k)l*T[Reu{m;z=qײ_g7b ܦmuEF|{Tkmǣ)~{lF:ӛ=4[Ǝh4ii&桱ґZ4=JЬ ˞s:.LV/嬾|]WG׷9Y!gxe㶖8Oxx3C*;S_ha1_$ւ{/MA㱝G26Mn84Rö߆OEf kd=#&,EDuhOܧPr_o>a# OX}aߩqnϭ=q#gݬuIS_l0ؒXXk-Tc 26+hcИY,)"d9rF<`4ϹJ4'ƼM {eAo1{ח])mPڈmgYK1Noeu}onvȆzgzoGSg4 YuŶb2Hl3a Vӓ,&`#+cSw_"c!h 4~/\lt49M:iWvY{Ά:s.z\sfiy%7u?՟WP^աq,0p9&ع/#8U=5s&{<} +r> +)w fvısf1#A.4TOrqѾQ5KqN stBfcݑMvYfP%h:Uf*]U  +VN-s-,3>Ama.%yK˞8780'^_?&sxV~ Ol%7$)NHwgGN~ +Sj YK?{\}o9_QpTOi~}&p^;2g龻{~A"!0!DC<~n~ۯ^iT|usCu%;n*jr8na\CֆcV|"@FZߞ&Y{ H}T~? +_ ^FxFVi]|d7pQo $Fʎ +̫y/v.%q$ bkNV=oyiכ0es4Nu!ւ _:v +x-A"*D,(]7ow +̭k(ϻ[UxP|8#8xn +'BJLOwO/DAs wu~Ԟ:ZWcav͗?!'Sw,cods$`Y ,c E>C}q n?*Y"$"|a[p_D7/y(?1':%xI_IX6O&}!D6_RvZ</ˏlt|őJ+!/Tǿ :>l奙'lȓ377+;{߶KaVpΣqS}LtWa-{1'aW)s.]C~gɭ藻?^~x\(v oh0ǯ^--6k=qW$*7O?= $zmHyX,,YKE^v*Vx}Dqw|򎘹(sg9I7 wA5j{< K=!lQ3AW,`S︀.+Iݾ oeUP]#f.c$ˊ=+7rF"WR RB!LAlY˅9/7Gmz'ɾm-VtOՉ+nq-WuٮPWAe֙Ұ(4 CmgsO7o]/s䴚2@^sb*]i&WNc-sG<Mjv\NڑX` +FS-#̆u'+z̍#;~´[LW!kF݊'7Y^i)kK=Vr= _t_d_ aawjp'q(TPo{4}f-U +s'NdI!h}eKЂҩs+4“s#rLBW̨Iw\Z|c#_K<;_/v[Q}6WbW+\ywIfk;̩L&n"f?c`q#&u%{\= "_GwU| |(,A# 4^-:88 )lb>hhG"$MlV%-]u)랤.7g ٴ-ϖ0%۬V &BmJS(26Ň&(? WݾU ^`:.dJvg+NJ. +RlO='L9<#i!a;!Io af^A.\\.B v HBU^4.F1B{0 ~aZ˖DDT irpw_Z|T9MGKY4|9/vA"$Ha\5!w + +jFC#//\MftѶ1fS)M& +}ߜT&2efsgOlEwt>5`׏Zg~/q0e ;EmF֟G-J2Mk7TI5 D[d|3j@KORfZTtkotd۞:n6=OhPŴ ,=vvJRqFbEh|WjPg))ѱdltM4}h_mtp&Zn/ *kJK)?8Y3 fR'Qe_L_%~(2YJ(͝< ٙGfE 777'Bn^ط'C>"yyI5iƠ=jAkX:LbCE~\ӹ\73hvS yzL '"]l 2 +4#TgJfbjwOPF]ϯ˷6_g O򌭼C@;GY,- JG& Mդ6JWfj/fsAݔ!`D6r.[UUEͥ]:+QA[ko: Hdכ3V'=}<ص ^Rk\64hy WW-O ϶/'Ơ鲝GK{Ng>PU=Ab=Tt.w8ũ'+ݯŲu;lܺTI7Jpqo,ֈJ3/[F7\o88i/Om6qv!c'd2|},0Bh~o'LLL%MkO R4K㋚3Mg]e\^%ڔ+7XtF)h~m :kq>cmcٜf %^7С Ά/m}&#jyК@>hTVdhC4qL+A'Pj"YLq90_d}߹qv|pw>]­7 Ay +k=D7jXS<*gl{gf@w\j;jks. XW5fv=]1vw!ԏ?hGʔxjPk7ڀ\jyPOAϗG\҆ܺMҌK3s,* Z) f6RTN媿:I4ǂ(ƾBzqb<cٖ Eֻ>2';[/z7"AϮ޿\!OqG)2ٍ#ܵgvZ\zϯ^ wO-uXL7.oA_%/;A݈vZthE4ٴjSze۪/ntD e~I}rd؀=Scگf&5ؒ=6g!i?zhRkr,ccK`̃dzH-dX 8VHC1R +kL@TvO:Ü5;ͨJS1yå ,X֝ qw:1__A rAcJlJXbDC-tr0IP,aHcyY@JuQe>bGt*-<Ōϭ&sұ:N&q&fT13ȸhSāV~v9Wmۗn"yˉ=:hmS'=ynMĩ҂ mȺsa[ك/O> <:=AǕ lRLb0X3 G𓇩9-C '/@4ʔ);l 6 U2|ӉvaQXz+_ /\~^wh";'hIHHpgpڞRvppfVc lN:"Ft1 /ЄxĄFkx% g\ih)6#8fC^U}v*6*^tؖ =@poL\7xנۯ9ݷ]!6PmLGwV*=`֫ `ʤך2%z5Zk cK FL&,Nkfu4'ށ/s=SM@]YkCx3-D~V:dGoY~ZkByVҽDO +9O,by:8u*2Ms-p&C #wg Uh)5=J#Љ-UN)3VfUxb᳁>|h qw\Aئ,}yMGsms{cLB!8A癫 r%F"}Re +)q&s`:PJ$CA˛hDgs :T-)!vq ˙0$-c,d;-/.ʌZНAWc,28AnP'PI8%+6N ֗'Dd6Dѥ]ih1_ZqQ>4&b$SloجQlN%׫N6?s;_x::1[n-"Ҕ+ Z@ߘ"1dž#Sنkn| U]qpmb_Osyu*z ǦplÔl}WfLLv{_?[:)A3%]cOvzݮ>ǭӣk +jE Qs^/ZZ,wc?1o{8[:ܚz>ёf wRv[ Ugoĭ)7R$ll`-Svbk.+36-dw:g, e^HGM-V =@SګJ1 &+Ѓ_K߂.>aᥗyQ;Q g+( :*mP;{_8;xZ&̖QΒ ;K'v;Wȏ" ;&) Oti{ƀ3?Yʶnnd9.ecxlkޣVڪO+ +:wpC/jw>.ce;'!:}Ӹ;u?G2hz7p[P|peVR/@{Cd_)C ײL3QZ܄?:Htf :ہf-G#ص:(e| ;֊`g"x&)C݀~H;;k$^쬈̡Y[(OMRbFtWnWF(P` +KU^h2-*#|x?ߟ7.+Ь㱚ZjZ3)'dɛSwCw~՝`s4`h*6V/OՆ5 ʵC5Uせ%Bt8jl 3:GV[I +lj&ᰮ.FX)Ff+UJ Sn%E{-s{vSəD(ܥؿDREU-QE(" #Ӈ7SԍR5[du>\`}5!nUXہ{f[qXf{k%W33oƵqQʘ=7BXE`s5Qa}&qzZ,5L`<+v!7wvV ;+1_F0wA_b 1g"0k#waC{ ?(e~[ƃ6aAQnkP鮩J3}3a7΃td l<~;a i^~ۤAz&?p˟⑘P)TֳE2%&6m[}~6Ē||A$1O$ELr UFY`qAM‚-34aOo3s7,ԁ%g8; qO?|jM2`xPL^pT0m6<^K'Mz&jdfmKkKH3 Fy|1hs>L3H(qG\*n#p9ox%0~*:W/8"(vتvܒPl&A;ag~ITb[n8vVv 4|a.*չmVMwv +*dgΊ< ҠX[*q1/s7[77 &*:K`+㼃_RՀK1+O#7`jdPx%>\='Z3ߊf \ﵯ|E?kr W#yB욡tHIiGd ׈$k+Mao𹰆i*?YM\SWln_9#٨lk,v˗ĕo`Oas>0`3agFzLYkt ;k E {eRpHg@ N j, ug BU\5Gg lL&m7`|rݯzoȎ<'pOT'-cե>  ץړk󁝥{ȷ>wvqwrF5C֜OM!,`zV9ݸM*dg _c[-A[WXX}`@<4qK;]kxDey\k \Jsp~ ^[ߙNw/7Ϫ:< xvޓrf &2V3 4'NTۅs,kl84ooqXdM.$U| NUl0p %!,f 8 +|]6B0uc4SW2]VTkxl]~U>aǒb4Aqlx*!S6]u5Eqx`~fWG],h jRRsqW*|a0㾁8~h Eŝ,>$7n:n'3 ÚC@ uۅ ӔKyׯ&va| B}'v[wz.[FGgC<.owydlj8qއXvVQ8`q0Oƺpv@rAPWUc[81;MbfU;>JĶw +Q]w)ޡ/}~GcܕGg}iwe!G֡T4 %&> + LYm%O5+<5LG*vM*o5 Ɩd혤*=kXoWAX`=K32tD-EJ~!R{Pl{(f[f!Yl%\u;'90oqGb֊}S`!E^%0؆smO\.\o&1Ez' +vb)EZSF +ۭ5!l3c3gy"V +y%e2AqH|l[8o ǡ!a0iX|k1[v._v#ak[ bV\bcp_K=` ++`Sɵ {3Z'S֒I#mkcLJMo* Ɯdg E) + !fT$&#wSNVԝ3&Xu"؇)́U6G؆c\p  zRCEJ _ЍmTh·s&o9Wd8rwC[9u)c. ΄' [ [ pnavm a5ly56G>6p x)R+ '9\lG ֓*'P:k8&>bcRq {iKy[7 XtW26B:<}xha +D`~A_$F*} K[e<emǧGuϑ0ckyp¥_/Rv{0Ԑ|o2>||>>||>>||>>||>>||>>&Nt w I +1` &:{ !" Df:'&E%EDž$Y;f͘co=Scm;Jk"kqb8,,$&btx7GyY;ZE$ +b{ 6.7 + +.kV$O|%xږ &Z㧭M1eol +aͶE~4?b={B5:^/5sa޼ֱ` >ٳϏwOGTL௤5g)3""\9_kVd#|yOϝ`ϟ[/~[`mL[08|Gw0`uꏼ/ W0χ5Q@8R˗GnR@R +5YD6M#呙d-r-[셼=8$DEhu9 / M5j4bV@H+_Y+H!q()YX*2KQ\(`ϻ_0yMFGi6*bh 涎|%1yzPCMjeVA*^fTCWi*4Tb2tAklVuPfM |XH͓sЧ"Z'ziZ:\WdJ Ơq$dtm(Ӂj"L@ _5PE$j%n4:j6A=L!9ŏA[A*2QźTT<4U Š*A#!fWW瑋ClH6W9Khxu`>&ixyoh#YP&Jd"S+sT95%Ãa̍UdTu9n/Mʬ͖NkFPT#J+3ŤQ)ʵTEvheJ x 5 +D뤠j1^c*@J` +Dau!hP0!@te( &,NLF貉P8CEdm.ej)ˬX :_}zy&J 4$xl$A l4E3>6[҅quo%/ΌMTv%:Z -.Ԟ`VT/x IxBH$e|S%kJ 92I7)R_#/; 4)x·I@@ hHpfemh.ք[#S%j:PӬ ?+oV+F U,ғ+4dJlG5+Fˍz4m L4 v"]f̍ 48.am~ z?ʤ2ce$|u#H?e֏+̈́IVE>im/ԟJv٪6ZkhClʄ\}b6LqE\q_Cƌ*jaI=3ԪlBuMo.MIF\sYDg <Ԣ&z'\?XT˶-s`b9gPɡWb@TTr3Mb s}~߃7͖^f9欪1DޗfyEW|K\g. t]Ƴs>?퓾Pgᜉs,>|=c .NgXpE$ߠ +Zb^I KG80.裖#L@\iچhBiHBG[BY#L"Mόы ~&'#,0##.c@'6CGa[p +:s$xi_:=!<<t5I9!96V`l=>*ʽXWa!`n,h.xNlR8(A>@l(>xsT.s@2GFc= a̠;s)>{M 5 |2#~04DKDwV6|/,_ +Z| ଫ>`l6|`]3F|(slK,sh`-9ۆ ă]hD5\sȗ|GsSgKKĎ>[0k=z==t["?kAB`b?ph0lpy,RF3FNhr_,$lh؂<0בu3 S,q#Sƃwgr#gzn5Esxh:B(yxCUaR|dH] e8N^9{l\].pk>+8b|Tϝ 842EpF1>hz$?(7,At( +AW☡3=?]|CabKwaa+yӾߣt|&f2x!അ.BArg Κ{uy]:~_ڠqA GClǕŀU;1yT|Fm"NEirqϴ +|>=A .ĞrY`p/yXDGş9x?7EsBq9x/,4 /!_ +uh`=AgE1* X2#p4Tw@e@'zg&ՅWx:p6Z`nk,G|&j8LAwy4?Ɂ_Z"EDTՃϰ½Td7Q q q1<00r?OE0CD+U{R_|ѐX\Y>1F_@:t} hh`N3' |mhKlxNɳ[ t0 x1N$$GṰi8P(BK<2![Up}n Ήh|;A {t!>1x*8V&IY7h< 0(S>x CC`m͓nʝN h/ 1 8 `|fS`+~o>褓AM3w`(pm30ϰ67C5IyiHiCgA-+0Ƶ>ӎ'?T{r,s('QhI| >]٠EQB^Bxo' 9!zy`fANF\xJ_AS90 "~HX [ Y$qۑ .  8f>SzcPO}YɃ&$֠Eu:sq4ha!ЕqC5'#i>9KcAԴ/1ЙtV&?7U^RvQ3G 7`D̄odl +Ό\`nz9z( X98w3z0pjmđF>X/ n Ba +K>'Xb (g 3aֱXk;1зDpp| uտGXQ/`$ ո@]kסo nMFVlP$]@G +}>wi" m\ +薪^V"o$qM\Q>Jdj1V hzg*hbokq0O8x, E! +b!FY//"+`/ S$|3Q7[Ȍw_dLˍZ\ 9㎣*v^q :0t̩زdj^ +]sh!p%-+$6(uJ?@Dy-~.ԥX 40!/g! ]ń<]KGoˀ(`Na_TcMFB͉'Rs=yXNdQ:з+8~$tFM$֬Ude;xIЅg':6c;aM9H޸WNLj"[C PZ"ws2p=rcJEPMp&ykPٯL9πYA_4š0N`~Snҹ=$k+p? g(e@^ R@:Ao\lr*G{!"_Nto.X3.ㄠye;Gi AAآ'8 qաׂk:  &**2] E!ah q1> !S( 㝮@_B%&0mXćKL6Z"Zp5\pԖ]Xy,ui!O"=1Z! endstream endobj 46 0 obj <>stream +qCyɸLj0hSn/žesWd +Q:@Mb7ɋ|h)ybBjx/£c`MH^w+DXd-=BݎڌmoMx?=&HNm& ^4t`]FS&5{6t*-c (B}kS"X t?=R+^/DSoub]z}Xް&[<7{ Wߐ4c&J٠Հd\6:::?Ĵd1QX+}QF ɘSC]FYOk)T{,`]s OZtE4*Օ(g_d-SK%/Lj8#1GFyD+V::kb~kc"mɿqy$B*,Мu9޲ =D)Q;׀QMt>ѸnCh԰[ӡp_x:vo-x&A x:U@C:qw8Be, g-;d-2^¦V +[-:[f8I!-UT# <^N#Wπ~6a"w\!Cpq=D' E8 fC:)qx)Az siPBXH&U:2u$C<=ۓ#cB/θ^@je=AX A8B+q0wk/Ic! aB +r4!N3\2qk,$d_'{u}#IIl9b x^=O7񹾘 rm> +FpYsc)`'. nkPk @ y#,]> ־%'8vj۰D<:Q珋1!&E)Xϱ-q1S,k1a8zH'feB];葢zY KPJ6vց +.)3W +bkՐ~v7{T\3JAS<gܥМ/H'Q ~PA=?kпD- |{F%\nU$TॷK}ķu5<J v'& 8>oa(KǽX;u5k;? +zXB@=[_2akC.KŰCGc>xASx/Ki5V}3C{+)GAGbTp=(zDjaz_rN !g zLxyL="PHlQ t~4}H_pK#1@zXD^(S]*Tī o3})c6֟`0E*baY7N*cMuHZ<&Gju@= i8pHSZ=d^+8x*0` XW3_>xzP(x< Լ ^n;ٯ = 7?hZc M" h xy cGxu S#Wsp'Q_ӎȣ1anx0n9 _O7Ҳ[g")`%{qH4t&^GLPuT`٨ ۰"EXX^uH]ԣ.w c 4OKc+ہ=&P -t]i9YACam݂=&܇<&D1aDŽH<)9\t!lֶ=^VAb=՘ld6['0E䓼4O[+-Z0U6|8ҐM:6 KQrV@71AcMaVA]pYxcΣlG +NxcJh-Bu Bn{26j6fQU@AxcE%f0 +e_=SaF~7 +wKKg1F[t07u-$V+CCnz{.PLۅ)u-ZV +~KTl§ +N5pxSAh|YƢ (X/$ =ӂxZ%Ϝ 5BTq ߄3\N_lo ] A@Ib//它=C&eCcw͆z0@s$c;[ר +cK (+>Kg*:tT'$Vþ1<)OH-um<^uZMArv ⭠x=G/`]TjSEכH_s+}D kO{+JPN*iUUwg;k5HEѧ&5 Qׅ:mSGZz4\^Vc yr;{ p\J'%U Rɣi1>y *0E7|mB]!(Ul-2j3r:xmIS ^>zX3cQ.%hbWޓ=*aaH X xIj^> Xe#|@x.e ]x7: #` +`mzWA䙢?QCQF=2(B]uCfS^]:Opm%83jF&/w{Ny=GvB41CM ex>Գjػ;U |iC䞱V^WP򻱄{")o3"r +W-~o?g c_n6 xR}d[x5{`8]{k {a/k xoT3l_ +4sQ!FxO7uS%q{š}}cxos\Xڇ<^2: &_BB3s! )^=,`.^q<`b4z?tXJ[ßlFuP?1~>4-=2><31{Gv>|:VT@@oDx*H}|M轁|(vP0.d^(ue>㙡#H܀hn~=1 ֊{ pc5{X煞ǡ 7Sٽ)qWzv \4{G̈́^K:S>7/FLDWW܏도u q o{ԏ(GSozz8xFg,8O({[iл렟FGmVqWF\&N\r_W`N ?p{]ї2B֤ܺ PjvmTf!2i7Ї!L܅rVaXGEfy .#򿷊x@Z>X\#Wu&{?֫LGm{X7iϵETZ~[F85y~%XygUܮ/ḋ=dK$3T[=<ӖW ֢ͧG]"r:vѥ%KqЗ{W=I4O!3$WHJJIZ0x; .qNJ2v7g/6 2v7x q{&6^NWS:ú <\z> +#v#d"B0 2: 6e:̅:I2k@Ljſܭ\4dv4C=N'E1ڄ{":3㼒‡tF?~ G=!!.!ƨ+jvMXe;!6u%WHɍ*\F(1[ >A~ F6yyyևp!_|3>>,N>hf݆c+xb?X+˖ۈʫ_=o)j }Uz ďȼb6W̤}PcVb$w0btV&ީ@,\Rnr[y'yM;h }SO?Hآk6OB=g睦LA :Qך.|>Nq|͈ K~2+z~Rau# u=t\t}bvDZL{M ݮ%:fIU<`oԭZ{o6au7j +|anvNQIKGVLEY4]]u|1 А}B;Q?R-ftc c4R4o 8sy˞~wAE32XXx)WFԮ1lnX\TyqqBh5wuoZi +?o+/Naʠ$M`r愤Ψpiq~EI0s+}PQ(14'*r2_W}A7SﳫSih,.ǟ|D'ڳ[e>buݔ[Bg[*o wR]_3/(󚭌 +\$Nָ$DTȾnWۉjk +. K[m/뭄oDg]âFU2kQa5<#=;ym4UçYT#ׄ {V?Qos΁W7^ٟƂ_U_S>:MO5=cEZBwgz z*:2~+y<'|dn$J[uD|HrN Cm?}̬7OFwKOeֈ?]nѧsi Iطg^o$D$ fiOm`SchTHOTfvST~mxy*:۰Z۰rse]DYcrrr8X„u=O?yO8C?xoUUt}⾖͇~%P.TN `?wH>EUKn'yg‚R_0ou)A~iZu?>=s'hذZ/'iq]Damf"5.<.YcT.wi +wYJ̧:(V Tc#Vr*{=3e%M&%Q7D-|ѣ#B_~1{UJLڋl~m_'}Bæ9%ddb1%Qaf2YRb[\lgU[VCi~NgKpWc`\|FS$Ռw-GL[ʣϴdnN #3-t 3WS1~JkuoU`lz=bOyPe(Q/=Ǐ2].;$xՆ$-r,u-r~_w7Ҍ^1GQ/P)"aVY]`˅QΫ!0GW6;gsJKlq'M&` ȇ&ERއk=uB'?h|NnODl߯Il޹غc?q +~bVebV=by)Y[_:]]#2^n, A1w8ݜ7ꩊqb*na1?"M۳fۈ;m#M~:9J'* + b.1Jgf/!"G9ut\b1 ,b1Yn61s1wRBiZbĊ-V~^ptj8 3c|2z+~[9MsdACӷQɕ11>qAIao|bo1ƿYsTEݱ9"bXcۅP4?=48C9=|}:.w*i|Y- K  g."kAL 1X~R$J3Ӕu WI©N}x& d=->Πn^ Ox^%V)EY-{\"}]y#yukdasdZ,'|0c.A'R#u,q[xGd7lIJJ5 Uk9 +U/DL&&Qb8K}#~<=3]X[#O +.2Pmn_) =Kc +c^+ezG_)M-+;hn.q/v~SW|g?7 ~~-&U+cZ\cp{Ng-Gq8xoлWc3=#^rj7L F N$FMD? fNYMbFQ0@ycsAuDdv-.;+52gt[h1y^U!q&{WCl>*rUWmё_&45JwM{ 35$ztMQMEaOߛ⪽' 71뽏:Ĵyź8zYWˢ1+8,tX-%)J${]ϝ}4J94B?~LabB]bEb{$,94ekn'O]u+p)z*=:쭿Խ*<6?&WYJgrרr/WFUts{uk3&sr8"q$z}{Cp>!T@$XLQjެ~8z\׆{$3c>';C$Z0y#rĭj75^H۽317~8O7E{$41l,vKl)Hi)uMpy-ŧI,G5ȉ73&LsÅ_}59#h|'ʉS7 Ma{2y:9#M7}_ny{SXQZ^=A[tjԹ2*U!(Kc=f=49U6c {1qsʰ yĤa +h!Lr|bڈ%Ĥዉ)cV3+;Rc +\o|9!ڭ28G@&h&(։޽p|yK_B7)f/)1P{.@qR"bhtRor6Du}]12 a$bLbĬ)93KֈeO 71g$f.33Uٳ]'u#w/YU'> .{3#we.UNꝒ\jċ $&dC9kЫS9Ư$EؼPͿĬ ikܘHD,\gI'6ݕ3E9[۪;z?py^qhj˝;]`u;wԸv4:)wAāznϒUV䳩rBBjsNBi3ƯF׶Pŧ +I]bFcbV+b~gbn I Vӧr~@\PUPUW .(Ǖ8:ʝc{*:\c&Dv͚4=dfx2ġc#-szWc!CCJESRrgk1_X2ąǠt4c/ux@1EFqF1za.1g&8[P\F(7&Ds hqG~KXӄWY*U64o_PpI3(FcZk뜒R>78&VvU9C/I-Ro~LDׂ/*% tĬV#f" a&gh͝3{/1OQP"n'rnzNwFwRc(Ls9Ɂk>ڵMsTycdKS@kr]KKiNl!>+C̝XJXnM,'ej1t&7]|2|sވ->c8~[mG1f={ nrHnz=;8v jcue#ZG: _oa/|=[-ZK9j%b0dqM~[HWyTs[Ws;v5LzqqQA[(y!0Ӧ^F%Cb*cbѶR5;b7 vqbfXZX\X% +m?xP;q&/];oD?͖VmfJjfrN_ 8~iމyWn,ƴL35,'v/Ϛr0Ƀ *m7R6=1g ؔG< qIˉ[XbQi?rX;g+g;ՄVpRNG3pI +}җv3O/w3#T{7GְsabCԣA[Ab )o+u@H\QhX>6aґUuڤe"X7"pq\byԉ PXRXcGl;ys6o.4~x2m}EWR`zd hrzzъz ;k3R{"bNifۜ/EPHo{~hB&;#wW-L^)SzRTZ~ {`/7UAVGUɻdZ/8g-X1&`sޤ՜GNb;3Bx-Gy̓6詍A]s# 6unJmK1{ #?UqfǵZ<^qi]#.7]Cp!v茼HNc$wKG%4}ӕn )K?;6~u fm9ZӇdyfn"m%AÔeU^p4r{5$?;<L`E_ |;"x.<%o2Dd--Bc7L(߬ o^ Ԩ<~lKL;Q@R&|QV%)*3./?v؜vCAVAA\^Zzp_?`,& ~YyXeE춺9=n{B1ipvq:S mca`hL0cMS1e{kt m f;!vclBm6BYl Nsh 1HВeST5:"o#s@tkzl-gDZûU,O?g~Ɨz9U?\{2Ni6qH8|z 3K᜘/ԛ㢪*'ޣ_ ywMt))p f_J'YD҃} c;6?n#]0ji(88rKkE] &Wm1xB/wNM.wP7ߪ}۬VTjʉ9FN[-2("/bxp )m[⟾THO|(Q(7,>Bq^e/|" yaSIEOՕRuں򹾐z\3 ~q^ۭdUX e׸m1]|՜[!-#BUY]*q`>b]a }Ci'3Z{յ" !Ds+ՒPB9sBErlv1i;|ιs7ϾuU/]%Zݽ֘#9|;?It=/Lq9ED9^h`Ěj瓎8rGkK0>t扯'vAiWƮo}އ3_%/op7^_jo^}T b?zzWpΝ:7?M磥YSoܣos_y]'B!$XuO7C>j>8fGZnqeon'G\n| hf@X<omJֽVwサ`84 Lh3?Oy'&%0x\vN O~^2X2\7 /͍7_{y!0oWyio }Ӈƻ,sj/bbaL9?G7gxDV7t۳unϖm:oO_!5ZpZqq**6<࿘b%: 913, ]^zn]arZ>\u_zqX]~j%lUAs>\G齕BQ >~Xqf^}ʿ?s%g'q_<StgW^_%W;Ks0Wj8i0_MgTR|[g =#7u?f{['=O +iq|f1OiMgeM[;?J}]ՠ[*sc7Sj-Y&Xa~?7w֣Ȁ/>,4}z7Wxg?}|k?f-4OasnGd"3m4[)z}ذxl\Ro +DRԔr'bFEdQJO?S/=V?semZ'C-ݠk(Ռs' h7? VaăךoMu TtqpP{uX7Y%]Zߥ?JcN¡~5o5$۳ mأsr@>lԺus&9-;]ȯ +g+WVb&O;rcz{@ٙr`(DS5iT:V)j&VpVK/7_g7wOavpĪ1.Vpr]?^wiP10;qwxᅿ #A/B7(+>5]<ʗt/B>`$X? +(>,o|G%iB1{V+//Fq%^/|𸳐buזr]oz})Η?>۾G 0*̅^ޔh+fXsQ6?CSa=? +Gk_m}A3Ě1|B#oEgvXrafAnx}͘d/@~?DX3}/N~!OƓY7}}1f1&m?\ ] IMcE pwm6nhmUC,IZ}Wֻy-۬ۻK j1Ֆ,;}x5jç7Oo.t]MMjxȀQb2n1ܓSs;S=0*՜]=ArATo8vo"(qu|⤘r +idz0ŃļSHK2y"5+'џ)Кs0*á,[ICoOXys_<ڟ 1`\l5 p/{ ~u~ ivhC@f4֠=ğ4kXsw_x7^h%ЯחBwqxkKxsn<.w +j3{mGvAek`Y?c7r#=dVyy:)jT?ڔRq,v- Ɔ蜑dk}p|-`@H9Djxs uI}=JZ,V>Xk{-7Vo;nNe?wNttYTA}.] +'N8fqi==e۱qS=Za8;Ÿީk)' fk6YvjCsF 5c MypC3]8\]`8~Xhg0 +m3䣍Т@fueBP=M(bq"Bvqt}̙+`QqBJ0N-':, nq@XK1q[_]ovAC*I:V~|1 CbJho~};t^ N;fBG:@Bl=X' a)6n[`b%ZCKF$졹?+N/+5VJեܱWSd{7W\kGݸtP;Q{-]}*|}YE75`VZ%/E`lys ƎO7~nyk>tW?ݶt&̈́^kq~=} ։О +i}#Ul(pK/7L#SF nk}a:x(UХZ•E(<B )\%4WC-e"΢6?w\rXClEb uUN2&3Z'SmY 4J:$c8V=rbq8mZ4Fά]F|.pP-W[:\YsuniFN!>}__X6YKX8aFXfqozbc/2(Za#C)|JbHBb:yiI:E3#:` ENqx+= +}2?9ʒƐ,[!v5 ENܦIR8[u dv+Y;Lk_[Fڅ%{oo)O:;dׁ;z0Ynz"qX f7g6'm ]LU2&A Dfc)%cDڦG"rh` U][^\].0Ĉ8[ԉnk/o7ZM ^7|'[ľ{A3'ASX1|\|$mocTh +M2{cH XRJ16acX~A .2ݖXB%=.2G} Oj= K>-Jbx[#c0(蚡_XDzRs6__)ۯ=S/Zυm?sE= rujfCsl3_qz> }~DUjEWb-t[."Wb5uos.A h+>I8r~R;:R%pjv8}}t}*_q1BRσ=b&ߔ3s_-` ՎlmXz۟{wVOu{Z7)8l +ޱ? AKhyFt\h)>mlCJl:-׿v-%@L\X삎/]#VEcFFb%8s\ xMrБJYG%.Î}&]W3?=BVh2*,9BrX褋7]z),& tS~) `A O/oQ +#& a>4'+NWNUjd%<_Y>(U̅ҥ':O)ʊ6LT{0EW:xR>bR#XS˳GnރT<g %gf}Sa`챘1||O񇛙 v]=[P󂙅JgίCM}[lb5#tv脢'B׹\kw{`ʬ$GIZ? RP> fxe9ss{UbOw~_q.ͧq鹤ow慯kOV>FbX.b4j]V+2^ft$av-Hlj5VJHJvNujV$BF|BG0ΤY ]O(4 +gdg!XImϫv'AՔ{b`k-t񉅗Q6Nnpp@.by'9Mժ+ QfKK7kqKS޹az8hqz|xwCoōNVC p#wV,%"3xoMC^p>j!8u%JљJĸ,?4(8ze !l ZW;g|V^_(ZAW`5,4^GN:Kvm5T;xV\u!!qr`&! k]z@s:q̟dqrA;|opPvuPwTUWswi7߾ݺ{H{+3;ǂ9}:kz#@^pOy1Xh79 +aq6JV +0u&kY*tW7C=4<=,;P!8lYme,ǭŕ8j`T[4m Fy2H- 783X!q|#q L sSE97R9;ၟ+]}!f<̜"- ?0M>/`k>hbgM֩`gbg2ԇ(W2J@l<) O3 {Rۿ+w?Kvָ^42kQjȬ|Z)ꙅ$獒BG/=+G[ ⷀ^yj| ֞Y*5Zt=]]4';Y#yӝ|kς?=k/,!8%CF'+^[&g=zdkh,/G\rN &fiPC(#mC "<$[%MZh+CϼUʮKvV5Y,/pP OLfo,1^`F/X{VRp EHkXHR."|&hzד78[,N+ |,xu S#m]uz!WЗȑ%d)^0kqҙ:xuCш9 Ƈ)*4Qj\4C<A),<ta 0!5&7vdH%;+4{){p{3,#nWVTb(fUMR+h-}-Bv_b{7,1?Ь}qViGtxCuS߃ugOwCw^PTs:+iI#3GHuNfp-|@ #8jgʍoB+gLEۏɴ5zcvbM%cŞZ:N?9CKm0ڰ\Y"= .-ιQ ja~ggF1Ǥ٧g%I g"G)#䰌`q:yZpr1 +xJ'l铫,g~`rsrrbJ-9 wo&u>pENoFJfB߼B1\p5X̤`R^og9fxe`gYEfvֈ/rH-.4õNȁs3g2ŔS?ɈrpbouGvρ61kYzwO@%Jv3t{&l/|# v,x|;Z\\`'ZdjmPt~RjG} Ll %r SUl* :rb"_X`χ=f.5Y 8+)Xe$vq'bgc_`kՔ`4!bH']'˕@Cz!|W%ٔF>@Nmn#sEl!FB9; +:Ki3˷6Lעӛdjx6t =㡝v#~v>϶;+,+OE5RnbS9E, d,_Yq/Y)#+Ndv`ẁ7IRl=r8{~`LJXK?x~͵K:CTv-|{E$[>9?Z=O[|9ϾPQ< +rWtz9#3>~`:h)gN@~/zNs!,91E}m x`s{7<ݍ:bD*ǍSԪS򥼒m\V y+n੫<̋YHNe;+yYW( ֩Ic wWe5MV. (TD|kdzM&=!piHb7O3Yuf6>|;^P-%5Z8V^].:Gnys}@jx18eO!X-kKYTN?dˆ/͇ЇpE#__sJ= i \sKi]Y1qM.؍5f>[SEP㪽J;riW?XFXνzk.h,{[&I ]H{Sa\;j_sbY5 ZB,;)F_B δbQjY_J,wD,8+?A ?a☖9b$kEϓm8~_2?~3h,1 .7aā.%.=}!.RB[l;K;X0vxb|HHyӡe-Pbbg~V5>;Β^l}wb[YZgP>-ȇ s̖K{gktx|stMĵŞKR8SI oJlQ +AUԪ Rg{z#Lf3rC~^724FG`9Ͷr[݅O\:43&g*:=Wk''FF fKJť {lF>r0B[QJ-2+QE'YMs.'^PF 1P`fy6ѐyQiȮ=Ff7t24_{&n) ڨuؿ"FM~Tb|<,x4%6rÍǍ6~7eY/9du[dz쬒`IXS'oc]-k3aT C]sjpezg#R۔PϪbbÕ1g\|Sl}S/|u݂3vsWosc _n|vf|LC/vzH% WY7)õ~oY{I#RKQslVB{B̿wsX:yc ~1UX\!W։3, Gl݋,?guZz' +#qLzv @}/-Z@ݏw㬧zkAl|wzgcؽKp.zW;?rOP+ԽBh dNxƠ03OS {cBX;i|ӎ7__T[* 3*Eb19ޛVvz|{3J?+8!)X>qR>.K`?-NLFMȹA^^åG[ f{\V{d Ex{U"zx>OfJG//{^=R* z8Ty~TZO.>ntrg 餱ak7nFGp)m&pR$ma+V!N̪gqeO*OW [^Yb';w6b^α"-C, pmnfӰƤ~"-\,= +|L1&}R10p8CRxjbhL~|X +X,j6j{oJϰ;*5>:SLTo/8h&wqݑ'aUb6+f"c]3k&ȱv*y둯zg8ub%3jgoMOr3G`2"e4;L"' ױ>'}^)ˉgSycNHc6ҖvW} ڦpR:\unλ! b}Q-9RgY:=rh.Rb1y9l8'blۀ?kH󖆟{u +᩶A|pzXXLrGzߴǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫǫϏņ J +r8wu__t8)4a~JĤIqA.[طVXe>4(e']&FGIJoC,óEo/}E^A顉V +Xe;{gne_7nXyŚիֻl\fuk6nt7lXv h|{jv~o/CCfE]DakCZ쏈bP~0Wn+D<]De ]\~{ ^b&e55_Cߞ~~c:7b3W9̟Or˺6lt }{uނb'[[>hY[xYuuNoPShg, Ͱ} dN6Y{k{kwtv?:)c8H?/EXa鶐22j&BȔ6u%{4_Ø!{0xdIvPfKmS2G1}a0AZAUM9'1p)G'b :QVh yD?-2ڐaYx:H.0 EQQcedfה?0aBDQng3 V1$woѐB,p Qf#RJx)pAKk@#JT=d!DbT4@?c'3Q{%Fe9lFK-U?hIxjr87旵jR8%1~dpϳjitƼ JNZSKA<7{ubi+D䍂-^1>0X["Lj|q%$/Z'uqj;.0$b/@0_FeA"AI,Q12{F[mQ> ˃qZ)#bFG+y0[if|-kkMZˆ_xyRG-VXv20G>Z6pA"Y`:z߸9A4Y FkyY! Z:a Y%H/rj%.B2L(11/M29-q}X.!=%P)d߂l$Ki4u`&p2hb%I 0?)&ZY}eq~tjL=nr>2\柜N i-ȅ )B>*d!I<.$Kƪ)I|Df3 96F!?^uV\0Kclb]Bfc{X7_QHΡ}&'@!ht$)6~Qɐ,,6?0?3i30fJ pH%͘/gׂx~H(;=,Dn':`l lJI&{IE\dH!>Hb1iaq| L,^@/*my[+im76r+n\I5חb\6Y:vuRL~:JhtV./h8]I?dv_YbQ:1T48 +~G "Tva#qj⚰A),c1~JRQ_cq-</w:~1 +4"䗘{eCJ, ~QGOtBi_sdaJz\CWC  fװ55cu躟*|zI ބіz)!pBLf(/fHJUcH~BP5om Ixpr n [Y]nKFoB-P+VB%1Snƀx+H8d,ӥ쑐#$d` +X[3D:o?{t2`8gv30I6<h/@ -ﮓ[#%:q!6@k@N Ipn#z(>12TgVQys)Xr$[@vZKe%!#, U5M$_b%6 ϓ꯯Id I5Y'p@:Ÿ|N$_65.r==5.Nk)P[+Jpe<9Art i@*|4~@kR!k I>>dq}nXYIF)RʷߖOA32!C2ǝZi>PH3` d߇1 Ͳt$uHsJ LJeb[c>}KNVYS8_dȑQwX=9*HQ4YO2G@j\H0g_x~5pËo|XǨ| &˜7Ĥ1E|{mH o==xޓ)}rQoHz}ȭ 4C! \˜ UK(ʳkuBYe4esP\7b;RơIeʡBˇ{vޱMR54F#qEdpR쓓 +Y#!;.l3dI5M4Gn,,u<%w=#w| +d!+mQt$+@)w})UזJuV>cԡ4ufWXS`u?IGDdhm2G)Qfu dѷCd385$ A$%7Qn-׌_F0daqj}n-Qr⑱JHH&jKWfvߙ8Yh@rH$h t?ȝ>ơ_v a~j%FkEXOP~GOϱE_R2z}襰|!Bo\Kf1cf!2?I5Td.,n>Iܡ^˳W X<8Hw! c1~#_SKB6UWgL䦏X䞜3 T}}.MbLE9}*wIeŔ:'>żd`(m\ۥ6J,Aɫ,7\ZdH> mG W +\o{n%I\;` u:$˛)oOTzDZ ׂA\XLdʱcd>RrB+kKbX;a%{3e%tٵQSN8CxX+ߢGfd5<֋9 +{BZEoz=5+dL*K=Bn# ۔ Z%KۗH),or֨G{S*C2gQlH'z^$:ߒ^w@Fm3SY\vTǀr͵e|GwV5acyV?2FlcIl'Rxʈ9?lVFPuDLCZewri%YLpgQVW 4`D0RjJ=@ ǀ.洮Y\X:{$Gmf$3`@4e~m/u<&vMQZ"L;dVnJ)rQ g:x.B55Y+־ XD`nc +:`z)+qRk+8B y:*r sgyz_cvP?G?1 V -ˆQ%8UL85_O9|)'np3!!"5axsx+^M2Kڟ0MH^GN1$ W~Iח+Uǧ+TQWGCD=:>a`w_:TjuHP6]B-@vČ`9)l9S(!!AB.X鄠ߐeJ2YP3v7791fFB(]宧{ *Ov$WX]{z$!w6n "'5+9T;6ېD7]_>J2l~}D8.j:?pudbF:rq!I^.rJGcU \p"GBR ʰނLݵCÙRo_$5f*6^_ d ~RՍ%2]w@w|{fQZ)[g7KRt Ӟ cw;Wն$!v§8Pg14fO@Hl>"k8``kW`kFpfy&B}ҾhKSm)7W~]33W͆ۑwm7wBBYnGB7`W{)dx-B;/B6桔a)ARyC ?9Wcui H:~Yf8e$l٥WH3ֺB}D + ~ +8w&yZo!8\H{/݅^"!$+!j'"@W$D b!ݘY 9R MBA,Ԏ`wK#t*.{WO.TJ.p֯J~iiXlRF jj؀<8.@)j!O~ 9@=ڏOv_>􀛠ۻS{": l/fALҲ_YD:BpN XDNr.$9|/lMH_wȁX H: QC˓IG`F~ӾFp okDm\=B~r7+l#N nـ<2 7֘FN}v죒sMlzb3j'rCυ~]֝זfߑ!!FjjR8 l=8{rM-4 g7@Mi:`Z?qd`|OOYnzow#SԲ946J%(wP-Y<%BhMeu|C݅ZQt,ɍoS..<t{+mr=R=Bp{_x ˯-\F>@NUg K('M긿 5yuQ@.s{&7)Ԯ|& +'.{xk1Ÿ)jĺ_F/ +E?GXjWWJS>sjk#t~Go-g0 \*wbP3NP=92jęsN=zT{ǩܤ1Ǔ^>8z+Zۃ}Okv3q>z}j'p,>o?1ݼ`:^mࡏ<&B8HC#b9f2/ʝd)synW !!Kf'g*]|k !!2jSU3=/}!!JH} |kɬ(q!SIR}U}ꓞ3X;Mk> fp:g9K>[إ>q>Xۡ=!u4CV#)A7߉^?+ւpbz$HߣDDkǒ/)uػ=z^TcoBB4*yXC犕$#-ÙeH)W]_ ƞ_°a+^|Ԅ1?;JInfuyJ͵Z<0V\#fخQE}uML_^혆( HP0Fͪv& ӽ s#=:&±% +}fS~Sj~rbtx.!u4 =:1ā` J:g_zF`b;.ܞt| -_j3H ǫ\8q{=bVzj>rUi+T;Wk'ڝybks?bHg;0IRv$7W9`āgnRمp,97h>>i"z-8 #dhMb9(rE89a9̀6F?SbdY5yrS0$d>:9;3.2\[~Q` +{Bgn:W| +dyTZx!&iau ɔÇfWN4Ы +[fUg|#rfjO3 +ţqgT~o z&'ߎB:z +V{JVld +gWVp}vpm/d3f5A9 O8g./OY{5M;>2a&.\<8.bT\W[.|V3ƅY]z/6uw։I3,A N^4{bO Ϥ{,DӱGڇOPt7$ FHK G?YCN9ȁh+bUIKS^u+zRQ{m)K +q#8k,t}uW+זb{@/Cs/=S{i/=,<RZ8@$a6ZcO>WI\“_7\4^]:Ol x;N :'1.1ہ}R&galmSNU3Qf?M2Ũp> xa^nBŒYRq Yu|Ylmmsk/^1;> Ƽ΋߱L8Oe}^4pG8:ԏ·q|pDO{XrťEJv4Bd6OFHs#8P̿S}:{TYJ_tF=gQG3DYdBϘ͵3lD*!6F8FX]oi`>y1eGv¹kpl +b*gABhb#бT3 +9рT"ʑKh K\j`2& Y$P5"5(._2guIĘ|s zϧ qi,ʟX<{>!:>rJƷJH6*eiu,f1bi.bC0<)Ϣhz {RBQp6C}𝏷,fm>*ס答VTjzL}w|E824PUEP¥|:? Z!1sTvvne7o\jy"Fhb;U)87G럅3dg뮱#yݗ'5A?L s{*π'F55tHsiM8V3TȷI*H ;YKeۂz|n Ÿ +c5"CGg G,(:G~KWBvOUAzN&0n1^|M|1d"(H_t'u+k2r;xwݘݔz4@aUXlAN'eph:-*l@( #2uyݪVBRH^20NOHi̍drO~'~,Twɝ&-M[_ҝHWr;#Т\Ӻt+zɨ!U~϶_i-lAڐ.Z"?ń{ +3{Sײ|a_y0Dg'P Q7|*=N\[)kr& cB36&[MQ|(ELЀ0WyT^/Ar']NuEzS2W|KT +92NdƈZ[zz-?٦8 ߫㓷4:5 ,OVLh٣ĽAC,w"# Q" A္lc^/l wSD1s}1|1ž}"ybݗNoLՋNC2sXQ&A/QcZw*LuIH] 5).u FQV7.n%iz!#*cH3no"$ш}(܀qҿd}Wf>p9?6pk|@~"Fz&*B,JN܋ !5=D->Ļ/SŠk7my]"qnYa"'XgM^bW\t?Ch3bo7[kzHդ-&r8‚SSm6 'y11 qPXaF=lȬn},_?;[4?$ w =QE~߃\ E_!["Y9xD__ A&ՈÞ;Dq%u?k2V!h uҶ&odG_#ߍX9upCc ]d|9KQ|@Um; EZ{맯EZdȓߴ_yo>سq*/vd?7 yBWم7]5.0,2-rj:#z!d3mT0Qc0'/ttW jA|r~ NT?S ?S_FoSYsiѾAq5cOߏsv{$5DDs=O[݄5fŠM KWn5-q?:;|x4vӮ`au]ŴM}ߚx7`.| +FT\u^XR<[J܀G8ҦݜjrxqAOx&T<*l)j$U0VaUbͫ|ğh}l|+L] ɻ#,,N"LMuJf"~`a`F>R؋Aze-(n;'|rVi{Z ?8H̪rʯrJLA,:s?V4V" xM_x7m^aFgMDObh`!9 y/q'zś4D<7͇ʣD dE lދ!,>Cu_5}=A1x-hv2.Uuq;sFE>S6]Z؄: ^M!:SŊ>ׅ ?u? +vZ=؞;'li v,aA7|?Se{PJf 31aw0(GJ;ǔdz?h tۘU{\φx"+v`!8 L\uE A_Du]{bOsPwsPbrԷ9(UUqhd6V.h Kz3&3&Mq57Ft`T`+1Ï#aojrLM^$IPw;U Μ m;l:'O9U񚾟oXscm1>/ +7]ܗq}錸h!tij)$9fۖ/E#e~VC/cO s+26;:YR|5!mCX)|-jV|5ESdw5ɵѾ!jͦU1sA aiӪ +/Ӷ ފHqu֨0'|c%*m泅'. խQj]&uMl=E>;=/'龟d:R}aQhEKkPAĄfwilWmWfh2o8ٟ kvkp@G^sS8Noj$+ܤ/*\\%jS9Q]_qcu~qAP mtBsCRqu@WmԽ!LTXH v 蟂ke1e-Qоn&熏O YhC^߶iM m j αz jƯ o#5D׺G79E9ʋ`'GiFc>= qiߌ(r9ߚu5%TgD<\b1B"n:O~EGuԅsY bG^EY轉 z|m> bĸ>m9qktF]@lZ=ɽ2Oou`MǭHظ7:|| +T{޼xRwɛJȂRo=$߻I˽c`-@տ.@UR\}VUЉ(λ% 7.c||~6ز+a%mQ!ɂo5Ao(MJc鿤UCh0${+^c`!5{*ع(ض_ʘӳyآBk{\#܈;*?ZZV- +ssRȰ`]ĉ<)̋êRJ+=s`S#Ey&ܣ@!d|5X;iX@,jK +dŞrJGqr ,̒[.'˧n-[>-PYP}ذ-?ٚK{ǖwx_Q\%23&Wz>0ѳ>4!ofL=%qc#*oĘ<`\!FGǴ^lFI~v:zz؆`fi`:<Zn!X8` ˩\y9S5~bVLB_5{* Ox :|C'^oV-S%~1*'i]s +(%/K$J"J*]"Rk<|:;A۰=W~x?%7F)OQU]J``@켬O"='mXT0ȃISK>e_?Ōk2Il&|-Y\ghuD2 JR'))%-^u;*3U=[<87s+%ܢW;Eܬ?a|} cp}XL[ mtؼd3ѹMg%˴ x3@,f)2l0Yv6i!X5!q6F敻I>Q{2tR5]tdFhD[X=s!lT'3Dg6-7Ce Ӻm |p.| P^yh>A{-^Fʉ$:4GǾ} sYhh 78~SƌOݣ*\ck#*gmOSQ }UR2~6#٢)ڵF`p̣a q\?:wbgEż.)}#*OQR\{#:].{nIќ/e~M Tؾ,4,we_S'0s|7KjO.fCOr<"+teDzض-5eW|s'G>ϩt9{kC\!,Cj1Z PJؔK$xk[ W~{23aM9Q :?: N=׺Go V].ԧHd\[jTSgBe{L 2RJc}F?+N(֟EE`,fnW~i_c:>20& l-*`0QhmmvF+}b^/H)LpKzY!-,qJ)FFó.8 +wILrA^5vr9˘t ',[,}2W `Τ`:0oVxI(x'ZLF]a"ń(ڰ@g:nIz}e + #נ6%ΒΎ+`mJxXO ?|%x,PngK(% +`}````>z?}X4"U~%8`%Cof'4CY+K;}n{{5V>YP]횈.Zz7o?ڇ4^I9pQSv%I”@a6`nxX~Zn`7,*{8phgڂ?U?qEҚwimGBmMZZ./w*Mk4S?2s8*ʯK8-S / ,?m+ֱu\d=(. HM? v隥!{*8[JoF=-q,:[T{b.QͥnQeQ!(:nS0yәldX(,,,[| l&kZ4X,[1x ,TK0Ā#ͳ4hmQʢ=mmjP‹q*=`+sUƎ9ǎ59JǛ\PNg?3tsm_㏘ޏfoEe36%3C߼, οC`#@QXpiͦ`:!Xl{- S)7U>ǏdkoicGl+j稞jx4z]z\SzZWZ/\>gmh+`ųK|9X!yUU`69P,m7Xd?OUhF`nSb-X6-T<؂']ePET\/I./ WlJ0UWDTֺH{ꜥEn1#5ӇYo {)k`B{\?#.6Cn7eUk1niX6UW +k`#̉;Mn랣OK]/V$yEx|3Or;"hT3I/KK`ZĬC +>KoXdǿ'1acٌB? +ZB6s"ؾ5`u@a1'hmf`vkfXo md68^F}&gp-_r,[z PTײMX$جR=k +뜮^y$Rz }t4y.""u'-;hn7sKZ/JSݞV}LF⬵m~ĶiLvt&Bz)iќ`vY`X(Xb|ASXS6^ۍvB +x!;'R1ZYV3Y#ijxxpˁG6YԷ7InJvd' WD7G\ _3J m̴gE`r+A\  |Tѱ, ,Y)IGFCR~AoFSzӑ,Q( wȽf+OZHohU?sefOB.KP=jrk>Ek{r*J:J8s[ȿ;9XeƊS󶃵?mf*d:N~ni{Oq٤.L9s_}.S;MQ򮛥ަLQGS \Con[iA-0 }cl$YP`V"@P n/cy?X̷Yc̘!PËUU@q3lR;c`+v=n}$^O=O>yOf(C6w䏺W>ץeSz7OtM9'e^C4_'jATfvhf<6j?xPri,x͌zɌ_0"?m<),w2*Ur CL?u w9`Ϧ`݁3`U\ۏ?`f-u?e^z:еjijZhc պ^SuׯOhJ'׭zɃ[{ i6&8umL5zX|-H4;p*i)j۫!4Zw]pzĚv)6{y۩0c=Xl?ذֶ0opw$N:Q>OI;ac9EW9t8NF?o mI~6MuDNӶlPBqkhK?,>1=wJ/%M4b<j0'ii]N~aNḭT<6n<8`VlZAO4n+miF :h%zi;}js$-RZ)qo LDk(z{ujh-Vmp~m >0|LUsiiLjow o- w+\Gd/73?i^p3lf?ւ6`s9}|$IHpbF۰m>Vm4ӘQ T҆Vڂ7N;gX54eaKzVRr~"FݹhN} l՜}x'ōڅڊ%O7 +˅2'@3*iB;@ ;H7 V5M:``5v^ܟtF#\^O>JQ&u#EQxnx8o⍎\3*Y,(EֹX/Of6.\gPF}.g02wľc؝<UXoi#O/zI1/7]>VkrANߘ09)+䝯Fw&{na޹3\yXd/tR̕qmʨD-U}EoUoJy?zZ_GkX7U:H. gfǗ\AbvcYcZD(۸I^)OHIdҪe>WgB~N7U_-4Y;Es?)ui֗'8M |vmjJV.@G 9LeO;δHȏ:J>fd,J뗁#زhhm)y?ō)ޅ_ +3j}ea0dA-2n"uP]x"/ :.`i`oq%VDkԪUoV?t<]IGNdɫΙuMg +:Y_^l䋓#Z; i}ܼ#GTKeOG=?BKK>1Ϛº:g_8_~>selsY=-sو_K_̳p̵睼 {d>=oRb'9ѕ;9O7&%s/\&tݩ"al^2Xj˨4)j۴ǴZ^/EM784{q` +v潬a%n-cb.Vpp80KG]h98z0^q@(2d ϸeؒ]\innB^<^»}Xƈ:_*oƯ!=Wڢ獧L<,jTU/sLh}Sݍz^ n^rWna ,(LC7dU0M?xcqѤ]ZK;Y?)+D*@k` ifÎZg1WrLZ .Lm"oowYd6j%)d!ڃA߄MGyE9p1PQ`|OUg2n|iQg:^B}k~r~`<;OcA+9sUX@[xB0m+>t_oO_VS|d ]O[#}_8={xqw4¯%)bg mXθ'n'V~v!Χ5r2~;^bZI{6jOІzA9o7)kZ jsn,ljC?j=-'f"&A"K Saoq[k_FK"ys&|K:J^M-!ܣ/=c^5 ]]u /fv &>H9}Ds[tMU}^wC9,ՐDpOh(=rY5"QA91G%!&4=Kiqzg?"-j`\fXs^ܨ6fcҺS^Y"`$"DZ/G}V*[?hd5i,rfgz7ނ<×=TvY^ A~IA'؅(pCETy!.~fݵgR#e9/o;e/;ﻺ/q;Ye9dTs2e\q?HGf^rV`z/Í{N +k ya|+ ѝwIשh/bx»I2ă6a 07bsB_*Vx&CvVF_(d ؖ2銞2}!v!^>XAksϳV@ˀ&sO]llq~fue2W|y&8Jv)`6a6cf-btfɫ(s6+ c7n94ޢDF\CJFI돚lᛞ)>=a"-K>s˨{x)ua. ?7~/7.;sowE: +9HwKh9%&o0s=8w3q,zyۘxCcK7#JW +i,TX8'ݧBK7 +v"NBqV1J Ѿ"{\ۄq]Ix EU\3TsHT#Xx֐&~0hD<}#W89c*he=11QNm/>sx眧x 5s7b~7$;9iCJߔFf`Ϧ`ۂ@CC `~gL=#h-"# /h6b-"[b{0+YF?.~*COTEn}a$_'@KeܤK'(l aAqP=–qF{, N9`:m,柗YʰͯLlCgsN9M>رr#8O h+@H#7l%k bk!5ġCBO Y`0"#q`%"Q$W:&Zx؋m8EOgH2Md.+PzxY=XϽ 6"ح؍u_c'd9W'af#>϶^3SkzUq?1tI^Flb#B_W$.mܦcg"v$}/96^r!?Qa%M$~]w7l̋C yMD׈w/\$E<̯*15@Tf}VC,0 hM%e8-=kRcSIjGah`Wh!˳Lq:IHaX g[q]:M@Yʊ;L{%#bc._Z,ҤBfu}T͈' +6q7kDst8AdqTHXXOCB^h͵GRǎG< kGkyWbTU{Qt< _aክdO$OAT.$#XZQ\q;v|l;.܌e]yim HhE'I% S\*5v Ò?8 ?5?̼څÎ;MAy7h>bTqO8NFo/|iYqMg 5i/ܜcXƐ9K>PR7"6%啾 +"J3S&'q,!*OwxbaF=Qv3J&nkY:#Y QU n~ߛv +.ыK1@{q{.K4qp2$R]S +b\TK iķaY=F+)skE)tuM\ą!̏}"&:~gT1fXl4E4 3<}6ូq$du5ds]<.t>q9lL,`tCPYY!|ߊb=*Ay&da#-?Ő>EL1DyA ^qP*5sQhaL^O^XOnĞA 8q],gBu0g +`4H1ePM4HFC;2͈#B>A1y'NN=rV¹BdĶǴ1`v|#8@YH 본v0$OXC銛]X2$XǰT| ܟV&,.FSVn3fW+6]GǚzAKZmE=U7z^9*>h$Ѿ|΃5/7m(/&)lp@3 ,$}pSwz&qE ; ĊB%O:-OMAq[Vl4t'!&}۟uaOœ2N.LXh%r=:gQ]5?; 7f!F v9x.+3Hot1︽!< + N2 XG `qPs "7&ī1L#ZĺCE 3.h"/``j=(q/x䙞LmDe+y uI,1 }#a%CZ_b"]a0\K晱)Yᙺ7?/`ibxtXqih?- sdr<.uQH^veM$o5)*T] .6ىwx/]z^aCF݃(On/shǕ05acrBV;.B5BF8 T6+\.]u09$ &7O#~)bqYi 8o<O(]$o;# 8qں"S) tH:3 q1Jh_ a~z1;8\!=.mc0&m^UpaЃm˅4ȓ&#N)}tg7o:Sx\׍5 +%2^ff,CLAn@A ǕDsi`/n*bW#63xVehl"CM`&3ZB)90? X1>Lޅ/rhúґVE\9h'^Iu:-aF[ܨEJFvɇf9[tLRE KkW`?E,@2ĶCX'-Ĝ&uod/C禫 >3Sӌge1k, +<}ж@Sq9efgp{ yX|sYFO>SAGA1ubf|發%jČxQ(!16`624Aف우$`dL!2Bq(EL[rOC䝽1N\"dTj#&dAZF$ /GesH[# +a6-/ud|襈#O]ͬwz%}Jח;"; !q9p.⤓76!߀>+o\어Z`9&2G #X܈7[g77bG.+b2 +A/ebirr1afXr *R^ޢAmf!?v^ß5iW j|Fq5䵴$Ҍv!p1VABQ`Ny['2IYҠC+t UdX("EHK; yكq%TH^vʣpEm([SD$] WD TK +ăE܀q-LjFlcRver il\`9`q[lۺ[WU?XiZZc&C,0F5eJ2w# Ggc0/ ĦyGq\ {yT g5;PELCd[\,C/Lh' + +GYf2H +i5L0uR|ĸ= +a% mGut 1R4;//5apF?'Jj5I3B]yFzGX:gQ{]e'v"|m$*o3響ݦ"zVmmꕝy uVmsuҦ`.mJFv0Uܩ1Fm iͣ"k Q>-LYΉ::rEqMn-{GFKZ0-H3/k#1 1(g*^AR&RiڈH$+Øp;Χh +:-,J޸ 3ZXd-̺!yXۅg +opIu̇y9뢴st9b4ֲ\%1l'#]$FA[^,vs%xb 2: ,طkg ,ٺz,GX#{igg|fp`l8e)K\GeR m>c̚%9S>bz37قq&Ezu&NaK77#R퟽ _ 3Y(GFײ'3?)1Y{訲n{<8IЂ[BWbĈ@*!$5D]Z?y{}~cQ$T9{Z{9sN?0؏F{hTCQ{p?vVꃜ/T23SNݠ8$5Yv}poUH7Bֹ]D(sd_TP JK)B=\R0d\~Ծ/I<y!UcY f݉O*o0)m1ySu˟ϼ;,'ÕWދGb44ŐBrGIȝ{qC㡛eؤe֒CG-zx>w|PWSd,,Tuk@;X /#fi0McWCEK{-sS#lT;˒̟YߢFhj AI-9޽xa_c?Y>T[bhP~z!"Lէ g +)QͶ̎{Z)9! 7ZV(8]aƊV=NuAH̤1vVEJzR>kg! +ޙCa|P0A; zS;+J"kOpΧ'.8ŭiCsoYz*$s#;xۀ^T{7C_ߏ<^mD**~4!8M{Z '1;ެ^Gڱƣ'5!q$Wh%B@y+x)oml)8-䎨gX2hbsgYKzf62㍌lQ9HA)oj"Ղ;SU.|C;{%9+mhgN@;8@><.y }YvփF#oѓs . 5Z;YIO\ɭ*« QW]u`*psS}IJqLe +OpGDhΏ\#t9 jX +U\Y玲 +&y}rQ*]fJp'7/YT}$EYJBc(ks;ƀjS'S, ΊhgIrӋrQ$ nv|x{CZ`o<_C[#yBi]*`N Ds\;A$Rp Gɜ{A[.̻2H^=֎:_$j4OpٸAY(INn 11S,Ua#" E  +;B +FqiAFk2 r6Kq(1~ +|)$q?I >2~+EM +~GFtW>jg}Y{g YYmpZ3RL=*rն(oM񠼑RW@ti(= +6yH>0`]?Mk?)..>&ei,ė]_zXjdSsBT:b,5~ 1&{H_K19g* o-vCf$_f$4P7 QRhhhw!@sZg9~ڗ F5`- c=joc(Nf n.EMDoo8h "~1`44iKՅT/( jJ)é3P>mSJ{A7\'Oz\ơi&[ռCn˰~E5js_ysO bsϧy[dh>\qyYrrYb}h 8IGXvVL60 +Qu1zx߭@sAPOd.,&6=O1 YAݓ Sdi$jY&kQ*=5R7,;)g}},mpv8vvuUm9q%ɇVв1d,5{P={8ǰBܾI4g.TѷT9k3SS b嬓\nEB%cz㺘k Q d/KE&/]7{8{H +ŽlQT5;}t[vGObBdi[(fM? 杞ѱJQt}!wL{]cјw<3┐2&DBEٸ?YG>o)iCjB}^\LAni M;%-',8e{ἱ\ @%֥?1ي)}ȰٗP_̊K} K콄и+Sڴ^X}]{2P NkUJ?*&1= 7L+.1Tg~bg*jXfPM,pnRBEqr9ñ'u +Cǒ}'hٻC9GT?Z[І *<#lOrρsrSvk)!W%v  eyOҖ%Xqp}Xb S/!t jw +Gp-3tZ~N0!sLo\5]D={Fi0r7G(N_7Aa+ n04ؠLg#x?yJ(Fkecs[?qꋋN؆4圵I,1P__OkB=}9n7Pf(TQtu}ɺj&R}8!;OBZr5ć$9W@oJn 壪*M|$gyM,d +p4r仸IXor[Pۆ4gBT7o +"\=-س%nW8 ~ȝ῁#nwZ~HF<^OrL_1jv>йE60i(j>\ \q?)qT +Z9&{E'EAgr82gozb0<kAMy`>:Əm쥍#-q$hQ2%C:mz2LL~W&B1(F J +/ƥԃ3&8f.bӤʌSӕǧ~ÀaKOTcC:;$?ԄԘ2R8D!q`*t@ϛc_/Ǘr|9_/Ǘr|9_/Ǘr|9_/Ǘr|9_/Ǘr|9>&N\n6=vZ-ln3ћh5{׶Nܷۜx,%O͙5ol {W)Wz99:m!OZڸO5wV,5jLYa+6[K'-Z4kŋ /\8gy ק͟`xz\?omc-12Հe܏p?Vzyolf\͓+ɵ(lq3 M՛c}`ѻo7q"=?Rs-Zn~#[X[i1xM6Z&ZƦZx2C#Af!߬ei rrv>fe?mXL.Z&*OmZCVzlZ3̤[umWG(hכwS%fE>;yV~>%*-` %&0vhDC4g$ +Nq2QHSEq@.ƹA#(a-Z&-D.#Ĥ]Sh6[o]Fk(x3;hxJLəBQr_1qm01EGXJR0npd<=ASDxWhBc݈ +9J+%g G3Q 65w222e DJ*7 +2c5k)(m=%?s24΂qp+ RrS*gzXnMlnchV3qƿ'%m -c0_κkC|\Mgy݆U  dKV>=ɣSt'Yf +AYH/'KA[&~-ETAMIJ4 ùQ:"kE%B֩Rh(#mf JUF 4d caV٣Tz_?/y( `lX7J+'v.%t zG*$4mQ>(=,x9Br[yX&ĈՈP2{_2m*dq~ eB{qrA39E 59Ft @st|фi&XނsL?c)?jCp'eRnD>hUsh^.86 $d|R2x/e-i*)IOp:N|hD9lr_AA|/aSSEJRQ3I +Fx4$L|&`Wᖌ 7z0ric5fjơi6z F2T?X +׃ߢ_4KwLbvN\ck&KӸX76TJFDHY;~<ţDG hVDKh(>0k8%61kh_*CIKƠ !xGa-*HpJK#π}xutE/`WkMe-d +eU29OO|KW.9hPBG^fޭL2sN8a/>1.1Eܣ9 dq}1ԡ RaV>1 KOS΀oL/|uХ id[N[{V L.lMg  %XIa uД)E[B/&v@ ! GdU&%4 +)ff h84pP1 FG3-뉦B;4j&tZ(Kh=b6Txk#0W-޻E"ׂBaAo3%< A<-Y#X'C8փQ S_Д LLxP"ןGIԭ X@alR-.d!JhgM#69i\rIدw>-@kS'YkO]d!'ׂuJJGq֏6ѧ>ҏP GS{ =~W, +FF0&8,}J63HIJmGEl C!yhs9HQߊQhL db^@ 7 (QE78OJmb Mgm) |h +AjK|Ϥ͢hZJl  Err/} -G>v =-xH=4NR"6:AmQz +ތ-} Y@$cSGOI㲵 %Vm!W.~}4ͭNϦst)'g1gfSchc{.x$xb[G.-m/gwzbj(#5&MbPWwX: wx) 6E%#m*%DkxF@A{B%!X> +4RϣD08O1>Xg m&#!Ec>b_Y ]ĘGf63ߔ!\PPu̅$ 6|4%@3n 1;ǁ8hV8xK*˥j֋cho=h +HOŘGT3h3}8m~[3N},! _XO3nxsA˂rS|% +7ܴ-H%5&sm±i  @dwIۗc}P>~D6tq!#!X?gVʐQya;D,I3ѳz#Pk҇d*{DHؖ9"79ᖰ~|`0JRQ޹N}hL$("S3@`> >$vV$'ĭOD: 1 4"8K O 0ĖJH>mR'!!(ɧ+\R,Bb'yJ(2aC{0_0o)=qa2mdoas0w@ s <$3!8 #9rF;%c@@}h( ++Oz2?q!TXΉ$&1.dTx 0'5uD1pєo&'Z $BcUۂs$y6 `Dgg #$ r[+y %^%qp!A֤ +' A5=P`DSZ{0C.l1e촑!}[y耜[C4X7<6$1)QlܮG]x [ >A==5p|'5D7[0 y& PnEq0wWP\R6h:!@fdD\mRK悈|_I\ذHq["`fBdrAs  )f$A2\AfsHoɫINcfi%3m(a&yLl>'H1^!xtJr=#>uKN=oѨF %I r f#c[Kž?6*s.`18SKh 혌3mvA +{4H-jO A&z/ѓ&!t.,6"C ؅\œ#$ξ7$QA=H*6i9Ȫ endstream endobj 47 0 obj <>stream +@yPl{_AMIi njsN}xA]ho&+CVjvi38{_CT<Ѝ`8Aze[@JPSbŞMo3Yaf6 ýOP|hZG )qTZO@v HyQK!x XBm\&110HW'iB}!$O@^c<%^dKU@D bx38&F}s*ܓ|h*i" &V~,BRMg*.gcjA\JF'(*.0['}ҙ]_#;>N /MuC-;M22O97D.'Mkf[|*vD:JKGCJr07q/@L1? ԓ=i'f +{|d8G|y|(xd/,0jS\R,,Ĝ/T5.hs$ 0Oi5BeO.]@ 񍹂ʦ +cI"NO&~8(s.~;TH%`b5FB(i]w1u 2j _piGh͕%(kAQf5!x-왤*3<6m(bly2` 9*tYn@IJ+0PL;k4\ɔD.L.@ +'mW1㈘d +]-hHzwډPFp8]"TsDD~Ħ P]*vPnE2.4/A%4GrQ`ss@3 ,=A +[~'m(]CnHLRL/ f JihMr#`+9K})|'?0UP;t-d `si=-<Lr%s`]Q1lÍ4~AB2jSXqyPI} \؅Cpo aR̞.\j$'B3nI5 "kLc!ƂׂؙK>>MQزX"1W5nױf%ŒM|&jd6t &|Me,m)1.C $OJNuOԣ|Oa5Om}+zA,eȜ(%IسqJ/ 'B<ȁSM?)fQarϘ;+j:W(J.8 K3Mmbr[*0oڕ$3(PgQ*%|hmkMWsO/԰ߠ@! ֕'ij]R|$J9\Cӛ2 ~Nإ7[SZ Bb=T/uΣP1Q)vQٲJ *YBڦCmuȠֈ]G*ݨI؛I c;RA2P7fjwIG ||ɾ8*w<_yyGa W~(g!u=<ȩ!2/+- kE.ܬmjf*3h&#y FLaF?AVK'Cu3aS\$f^A>*.Z rBlL`r }5]l sj!ľ!vaDVZxX2 AM. F#[Qi}r_o7]װݢK:x^ $@=ч!-rN..@"0'j9=Ϳ8S&< jH]buTJ@L?`;1VLU\e*r/jLΕyX os33J9<blItcxBѵ†y|} XGC<}'TgIH{;y&t&t5D2k=Yk-sbAX|ƓZ֋L 2 +\(%1♭Ƀ_BU|t? i( +,dsO΅؅P@k`ϑ*[)zzt6th0MZ{G'a0|0@-v ]O:8j+Rq֏@80M>5{*IסSqJ.}Tvw1NuF6 nLUY-մ;*/G)! "@.($)6b:S=V>}rk IgQ4J]2]h. hAI>Yi@HJɒ﹊\UTv  ا/}~~L, ):gP6V|>Hߋ U똬sq`;tMAXKEZ!ɑ}JSݥ-v^\`2bG&%5mec@Tu0=7sI{yj>zHzPvdZWGDUp=Kƃ-9 jQc93bO?SbluU[_cP.Clj;L;< L5e*ږqW  +uX0sFFǺ5ؿ](IJׅbBb)ݢ*\k c +?] N`?^LRlD`U&NbKo/˚ +ͫc> 0}V@0C"%O=Z}WP{c`jigf!_.5블ݓ8e̞qV S G{a޺X3I,+Q866ɹz4Gy +0;3]eL=:b +tWTXjث FW}DВKʸmEȐxÇ g#kڡV+ELjɻa/ qJ`fCk,{DCQuǒ\vĘ_{&=g Ar] /M*3͂U߲هf)[~RY$ Ǟ +Q_@EBF@m>|pBEnq,#S͔#3 t.%Fa8.b$쟨r5_Ƙ=20pYBD3̅@ &y _:*rJA#{ օOXXĚH>ƘqMV-r6:3z%GT3u|ƭ|HhݣzCqؖ~"^9[QKM7iGSQH'㟈V$"H1\!L-֬VOE1P%:t8Zš)t-5, /~0Z3l4*z:ֹbS5S #sic!p?5TTw,8%>us&8Gi>YzHnۅAm[Iy*ɹA>OιT; Tlkkjl̎\vBGQzw va.Kzȷ)M;kTx6=_|^_ XEMq eKmiNt$jX|L˾3#Q+"s`"] +ɦ}#t/{&ML9~w9ݣ{QPG[9kۺ@m]5cŖо +ǀH Q9ͺ<)sj$׶$>{s˂3!Z})\{7 +13 ŨCķ®O*b6˽bVఀANq$^RQ :?"c~I)>`V 䞚GPpSO5A a5ʱ?xSxn!]r7 ffX~eET0ee14֑XGbB@BH_l}_-^I1W"Q,kLڗem?P81EʲIZ?uT/@[91GL:<>>@!LYڸIGE,PrޢKiTV\fY=l_06l${\`ր"}w`eHH&rXab7&]#?O߬?lb嘝uW+k߭Ow8Jxڷ'lu\'܂.A{1K2O'gpT;(mMՍ + 2*1LZJ1JeٽP2Ǿ e jDsNWFl5lX7BLUw.c vZ񓢰֥?O!`  ؙo+g"}z6{JeuJcPa׶m8Gop楰صrav2duZ@=TaY'yɣײg^Z 7n=st:G> Zq:G +h5w9̺3Wus;1ǞsҙV=[`iW}A^hr%V㝛]"sj̖G~5DqgQ~_֊s|#o9M7HUNcsyb+)/%ZMoYsWYlr1qMZ]:!zi}=GJiC4^p/ !%̨o-9 dgZ(lb(T?T\eY +y%Ѣ̮u+,:]O|{?MQ={az҃XrEү/[Uڼ]@ͱn.\9qS<|OeR~sKձܾ +eѽ%fu?dqOnj=MPlsB|`?cODX wc)jN49¾UXf sf3ccF^e}o>k'J%ײ'fX}boF ?S^dYRU]Pڍn_|'H<*'xyC ;ȋ[ˏa-p44dIǶd7 71⻆ Gjƴ✻񅛟W{#"뗷⫮4IG +s/܅W*-η{X_:_|ydO]ņ`RpVFst%ԺJp[pC~C]x\zIɼ8[wr#<'ms:Cu^:f:bkuņ=XN=U)μ ]•6w-GN'+`I..XFee/gcNMbvt63'EVdܞe2K~7V%ONXnڢ7'=oIeo=s_heyf3/Gl#oyo"0&vO ͏miͽfu2Fpv-j*,m.NmM,n(YYHKStTGv/mm,q~+{lv=G8nt|:yc>+[҈]] +r!W" ܬ0+yVsoVd\i=[qBRgKT҄qVr}b崙O+h,V%uJ`ִ߽B +7lzu+|U0{OĚ3vӍ‘V˺RvON9?>RQ=]]w/%/aFnzs\nmc}3nf_m +ʾ|?}Npαچȼ"B3w)/NTX~d6;?w>gÿ1|3uG:+{4Fz{?Kؘż{$YNf5<-g*+ ۖLQu{~6_z}#/;WЕ[y/&PKmYd]u%8(wU͑FW4F5>^0mͲLٽ?N$~a+^s+ںF͓[vOyU7xⱽtGJb_lM)UU6nˏ\{nhYp|/kS=ʻѾr7/\`VLG;JGޏ.誫=tzv$#4aJQޖ<6$tn3 S59?ٕ'|JtĩWw {[ĮS "Zo61_E_궴hvLSݤqo<#U^ՔXLM}ncK=TeJѾG @Y'<.41"Pkp6쪶Ǘ 4{d?,~U1Жܢ’;y7b +<Vy=,pW^]˰}yF-jϔI)ˈ?mGCWG]{g}Ӄ^˳{u$QoQo-۾96bޑyz/ȇ;\7mdRBScMʇ3kAyEYE^S{nEݒћnm7kn/v{sr*~%̸[ܘ1H:ډ:$9w* WטPV{7(Jzٜ?l< 4GJ2j[rJ^?q=Ns@q)|ma{}; +otej Rm 舫~&ޜxh|v/7 njm?ZV,IhJټE+ds(hl"S2E֚SԵ*y֐BBK1y9W.'W_Qg]I-'*ES.*jH*WvT. +c,br Ŀi>?mƻ>.4WZe$Ȧ6/+ӗ }EijlJAA ^Y#4xk(Q2=} d#{F$3:K6nԩd sD7Qmݦw1k}!540˜ GxR[8&̖9^f?\p/y $?  Mj \urW{/[,z{.Sx"o-t_>Iuz0%z\^kjj柼t;$gǭןFol^|әҵrL+9ףoFsFhvLSzͫSYw3a'..+{{rX{FqS\ӿwο4zekMϿ'9C|Gi!;|?ZzZƮ/{\lykvO3y׽{*N9ݶlS׮|֢"/,KlcXt-!xbLtKO^kVnHV +{usfo]-p{R`2B_FOw~g&ƍ3Z')ey)(RL+.G^|fx+.D\y3IٔUѐTޘ_DPކ|_^^&nڳg-Hm=jsP;~ KI~ߋ=<Ԣ_?Ud#eu'ȾZ6{"j*~~jDڮ鷒]j{U!$+/| l+pzKwݎm$agݏ,}sTM/טQ#o}~~׫wIL_rxTt}4O6ml~ݵ{g_vwj^Hн*rT>Qq-vxiЂ# +}柺_z#.}4w$7έ/;pM}>iO7CȾ,M]+/iX=n} -8)һW*nYtjD^XuhcnQMy$ v/g6tM<:4P_T#k #Oi(I_?V6Twl` :e̐_/,Bt%Wgsܢ&1!/1@Аj|kGWV0_L֫Bԝ~{Iߙo{꧓7d#u?J9^`k{l-l2! eȆ-ol;WߟNl<;bzջ>vrhߟֲ# йؼR]{﨨mwAŀ#`"HUT\ "9%JVd1kZ6cMO>[s}{}7{{T@\3S6b/ Z[%-zm7o@v[l7O?y + 24G"?ؗLA4ɘyD/F֢v8,B>€o~R ߞ/<[gU]W/t޺Tymov^Tŝ_--+_\,p>?&]XGt~<Gsih'Kde,V#V,lb[z S},5/ \.ȿ:]r-_lj?q f[:{tb…-P3lUݙ#됲VTͰXorMkA&ez6"siO9ئ T T4QMž?Af"Pd3? +M]*B[T:du@ݱiOT.8W|y"sN9W1>ZNo^vs=u?FYkoߦ˲_l4KFsaWo(ۻE_)6*k4?C|.8Пl&6><\w+ Lt>3<׬,V"I &BֳX4mq (A~`1ť.jz|B5yo.{V:^Yqe󙆶*\*z|_D|үa/KV{Pvx`z^Md%uIz2d6nxƢ(43 p G3fKд)51o "4u.)h~`=v"ui,nZITkܿR~PEިbVD?hxk7GZ8΄g#B^u֭Ʒw{U1s&c@bxdNWA_jY +Gsddjh,!58?N>U{TS||r լ}pn{cS-}cW6r=5UUӕзnNykRϯ޼z~;Ev?=w/n>c:rOȌX"+h\?dl4+?i_}Y{qu%.<[Kk/~eY81p;w{Zf֥ṙn,*/*JL%H?23wB Ew;D!P}&0GD&2lg_R 8̦x s;1喌ӕh]ȚВ=  WלsW ߊGFb5j])~֪⛆_vlj1O +!J߷*3;q;bƷY=+?d O*}P#";^Q4L5!0ӌNŹb4F Aqhg6Tyih4ׁAy ;;O4oujSOqʹ6<}ިB~-r_ǫU_~ɢ~-<߾nĢ*VrGJ=y?}u$g[_":,uze{i,Ӱսi6 T x4ћ,-KbxH#'&tjj T ϟ7P-YVU=U~TI~U)VEp?.x +hߪՠI+rqў wűvE}3`_{O/~pŃ?,Lћ>{dsG4^܍1/ U{bMJLzK[GUUy~CRXCŶyVu\}K)z +V%Sϓr髍U.K#_O}|¶[$n%Oh6ٲ'{ Ŗ*63oYLokAe898;4}{W62G2_ĿQ%{}CxKE_W©ܠoTq[*>[^\~Z4#ٷKWeI^bwL\}FRfGo"<2 ٱrŭ+y/ ' {?Z8r_,=BS|{^tS-Z祋8 +4~526h? 9tx[~W'Y*GϩtF48E/B2N$~q5d@K2VPSW$Fkt?R qm4ˑB˕uj.[zZ5j_UJ귯_{\L+߽(g`.I!Ai"{9k|'ttO/qC胦:.,wdRR]|͕ÏX7Cn^P~ R.~)YKwX*7/]j=`,F縣y~Ihe1k?QNrWU*$?# |CIBOꇗX ǩtK'!O7GDw^p{=5/zqZ;?֟쉎-aóAKVC5Yv{s^ɮ ۊn8fm<dTՠ5]ۖR{tZBu};^s:!Om xޟS{glTêsV_UU]S3*?ͧlÓ45|}Ӝ)ͥ郆&pD/" KX2ۧ=Zs.T:{auY[,( gnDž8]ɜFNU&m4f*L|{A*^eJ;{i-TvK* ȋ|NVz4Hڥqtg.}#UOrWX+=Х逻8R*[Ւ͏jY#B^b +TdjH{*Gw@^.>eZvE#${z"וn#IE )5BSr CJ̆ Ei8#C]';\:;UՌ)1ޅjj"Mӧv<;%.9̡޴w]mSoEU?r=hkn.m,pg8"?8#_!a!*b"sr8Ä6h2 j.˜ ;j2S8z@KOQmZt>OȄ#sVTzCg- |A%׍mqh +CɞwůCd_tz6+{kA:r%G/зLYL~)]9Q;A\}p,QNe''15*}dC@4m Ɠy% +bF+b5'yxYd/ʄJCR +3W.?BI7OmI߹0K,Sʎ +z`vבn-fMv }]_<t׵AZ-=0MRZ=JԃqX7ۺS}l&VkvOW}u9~8)%`\s=#'tC} ]l􎧮swgOa{F&i3qE{yОw.ԑwbk%ksMh;o̩w2޿z|8$Y]?(N=Z|rzJ?U/OFy\)$&G[>G;( +zc#gvk/5d3댄Fsv葻ը+Jb}rf*m#Bl'̖"rmAPnd$q[ijVܑ7 +DA$Ra=5E LмVh? +.*k<zwWW-$jJ(qXME,ԊKj +KK:Hx +8 +lJ8.0ͧ{඿&sqTzͥA'/)[סŗ̉,t.ki\Ud@>x,8QLT}G:d ?.·vW}hWC836mG6KZ?wc~Jփmx~4g+\jY~N)adqTb[{x5ޕ t3麃3OfPmWJuu4+0-ٛNC k"@67Eޞ"+FD *@6h-DŽ{Huz~?l-34b=vtnϳ@;2]zؖ/Xއ#pރ1] +%ML[鶫7A©Wԟoq x,;E%}5qX&h(Y-<Xꆼc)Emx=vޫ[:tW((H",j^}jτ>R&mlY5l{O3{.˜Ћ2IO^A$ߴ~ +M^ȴVT.jwo鍇mA/CL%!ٚtl^p쟓@SO:{Ȭ+YrG}/+&)ujC&H ڑ\~[j'҃=w z+q V!}P(9]q} c?Лk/%vKS[SCV_\# &hQ)Z!GΛK$IA!Yn+yNh +ol(eTNE2DIՕDhhDdh1Y|yʌ3ytlQ Nn'` +:̙]'.ܮ=Afl){D덫dߏn̉g븽E]O\ö\QDjһ|[9uw\w)WO(fZO-Og|!Ӓi2+Lln18uXM\f\lÂhIfN`su2=ShDGyxFt]6I_slP|&L?P #g:T/쵄"t;/zn{*~す:+wX!cTÚڋ~zAq'^*O_ҝ\͟9TKo?PFem1ax +r􏃞?hGJxk9&6@ ZŴ]YBGpħ֌7MmJlh +f|f)\ci\Xip$KY\_pWymf|fS6݌.Qf#6јMk2J +`7p@ \V)C\W.M&\t^u l&ǁ KScjЌ!T׎'bО6$f{z/0g@ÌLJ>_m y ۵\~[Zj2`q;P(QOPwj}6[8)=m~Yp  OʶMqblR4*]ˏG\֠=Lh&hpD?{-RGf +C3sVJYtE)k/އt'cN =|=zC(XGKnl }u z@D~>}c>OvQ:*Yc]hDfr?TM?Q8 ]2=Њn hsYM1V7XtDw[z/a$ə8d l)[>[ȥ7# *BZ H5&bYc_Qc,dvD*:C+ @GLk؞ck4h 848Q:Nȩ6]F8/ࠂPw:chhFכ!h}PW_`zv ]d}*$F62Զ;˹"Yz}#EetZ0!-'gA!ՉF5Qb’_3Xρ:XU9ͦѹc|,)A+Ŝ1k@7Л·_D46bN`<>?y}wDTyÄ+/OjxqeCB/[fgŦԏ*& j*\e?ry @L-"I׮bKRCb*T 4AKA OՒ2L-!? | 61ז*={B'vayf~‰̩AU#3H>YnDz]X; }Dj{HE)yׄcz.98M$Jl_ % + RR\*h6'8’^U*.&QtNBo87,ԗlnk0=לf(fmL'2{eqL0M@k TLe[LJ=*"M X|z alaj,m*a7TJBp~h#<#7Si'tu hKc Ʊ-&aPk-oG`a|'vj1إp9qa9wA@z> _S`P=O]?z愴qdPm g'Obc+:Au:*Kk#qg.ENː+rC4fcvӾlză*gTgbh A|}39&=~ 16 u?\{1lzN~ˋB"+2 "'`2+CA8#ZD#:1OOԡCӴ<|snB ٨T-^qz/Z3WAQl)/ +Eyut]r/ab7TRaqs^ml\ro|ّ7~$=s%ZL{s1\l.J''+曎53XKm"nW^y 3+$zm/\W^gGlBe՛eS@t`?C$96kLj0W1x_2tW"~\/+횬(j$k>&tǶHr2۰;X7%T}~Ǐ u X'=hr` +)Oo3gݓzLz1Tg@qj֢+ 'HGؾ.Kk1Z7q$ :c¦|?rh$БS zg6wu^"FGw64E8rٴm<4 |AJ +.hR(XC ƄV@z7Ao AoL"Gfȶ_w^[ \V% x~ _o ZҞsKOiZX ´2r ~ՙzPm>6I/3 .XK,ԃ6 tSITT60p|wܖN؆lr{-v#w3Լ̂u1W1<l^޸n\>fؾ[k@'D\ǖyZ؇j-~;>(s Z0aIxt;pU>|O<|`;o>lZw|^[½dl?a+1zj ~\5bKv)ގ4i0HiO'mԇZ7׀]@Ok3I``pRw l/T]1O5%ՌuZp=ys͗乍D +]o(1;ފ"ZI,ȣ5$2UNVd6`5B% oA+ˎm<:owr2}|`|c#SpRdjqs#Ųswbg%/ +gFoz*vx@\YAЋAsbC: V8%E\g08ހ6|p:z d7K3~tTY񞩄qYg +YD͇5ے oy#>6_T bBXVlQRA_om{O^}r>=$c΅&kS -*z ]y=Y5E`*"L,q5g;(Nތ +?}:]q:LK c9鸒^kX>|'>U ?ysRC6*Q "f%+ &O-+.#_^`L4BS +@kSb\ZgLx85qtzM37ѽrf)N༦IM#vBwA{Ьh3M"}`GFY-ܮG~>g;K"dNw^!y|쬉"z"*&˚N;(KwϔxFtחnWn$P̭1yqŔn: >?4DlUFMC3{onH{ԝgԝLux) My6+Y*:S$9cc +DL=B + ۏі!j a;$ =H^ahtx;t-p`}Q`\G!oΒr5';k*AL*QǗ(uO챊\EL,2m=|4 u'.州uѧO1Us}N:6Cm]S`7x) 'Y`<NX`;?sm1s Dz +$"2$Ԡv@>krI! HY(A2ZC[k,68P)ĝvv@XUf=)rv 恝{%`u`gQ,X`gaDY>Zyz,2`4 +I\D,O`wa,TM"09pͺ滯,LY4` +pr*&|M=;[# +۬L|nʂ6+El^HVEpk÷)2b:vIw]$,3agt;K2ϖgTpq^;ǵ(_rvփd#σ`2TDDgj1cdg0_ic y~{yI%%]6|޹ՇRT{`ú׆k?xTvBBŦs䅍eMo<>t5rXMM6s\ a+Kzl[Br1 הbsu\:俠]oɡ I2V8'dW.,|>b!HKİȥ ) +z&š'`Km5zb!p Npe# dVo2G9T8B|o& +0xp.rMw,`/f0\o`Aµ](_r\;(ᚏ/ l<f +ݷ\>pN>/tc \:Q ojӇ1au"2`g)v?a/]m7z>]+вfɚلXϪY5 /FYBK!FV$~-[O9M +S kbxR~k \R+>_{U\lïpt.'y 6*^Kh74{3g.tek,Rk't]]-l yHe& k>Cct5| b’i2\PmVau i +]P E*vNT:bˁeb\ya`[ 3=Ā$>`CWaMDV18 9-QKZ4_ZJxAuȪ@xl q5cyQE =Lw~y!?X8tG u4)aL"/A_OŵYB궒N+"ǩ{NPSQ.3`ɪ`q)ީ6aNu&uy @jAP7::bs[ϐYՍ̆ lJl  SxrFʏ {|o2h4QN&y'!W=x,9kqpu *$5sYgYvT^95aX w6Nq1sC)J1.1RZFXdmo|fs,EqqZڂ)ktW\XˇЊdM(=tYYB{ +p`mzɄ3pϊ0a yVhnILE'`da x\]aZ||>@Rd`_UclcygaN]\_w__-߸ka|$g;0o~j ;yy)߅ͤ1\Ĥ}sC.%*7"yJ~$EY ';yv)~b\C=/ū0Up\!>" 8o?=Wώ9[@>!y(7>7=v> n-^O,|ށF3Yuc {/H܃+{O%C#5 F&j X NAK* e"nL8'7F 9 ]=&rd2XUbßO^ux62Dp,X= Xz~)|G-`nu6\dk:hVb-Q/',k.zjUl}vo2ɝtxؠp &ۈLO[U!/i$ڎ-z9}z6<_[įWXV݆Oc{(걄9W 0ޫte Ћґm>`IɮizCKY[́U(6G؇ 6k.}xSl=nC,D(>NJᚉyp/- ) ]'V,ClJ{'^!!OWRW ْW W9~,s!$cXMq3%qxا٭ft&ꏀ}}\+ekW ' h "G ٮϗ 5yC? g~S4b;m'2ugsϑs}/םa>Vtp%#_>**~4FghCxfǁd>{0ʐ|n2-P}<>x|<>x|<>x|<>x|<>x|̘645Ԁ64[!52 `FהԵ11 )Y6G /vY KG6Cixh\lyl.Yklc0xyl6v>ߎ +0w\t%8.]p2E6珗,xE6qeKۏ|  AN6vm8`kAt-"`Hφ 4ِ+gOϏFahrep??,qh9B-y(:8,Zрa{ `Q4BMF#@SѡjAj(5o?y _?PԤHEkSQyڒt-< +dbT/ֺ!oO13b$rVPh_KEfkIQ( 4_O௲:$P'i6%)JG2 +Q 冊i5ƠF&Ulm)t3J5ZJD*F$kA7!t )ڠ-yDi)IfSz oy:) R*DM*qЉ?1[W`.=[Q401jlx*s9C@G(\ϔMFDZVs*_5M4RϛL&S6hl"A[B}Ղ'j5F@@I;NuPij0|:(#ꠠ +̢(5$TO,G$>(9P )RYχ T0=#,EW6Bҥ2@[ʥPD)koA4((u_Oq@gRjqU5P)jDtMVFej) ei r`9uYf<T uHM~ &&C[5 __K(Rlu5tP[vL& $=C~Tk +|pv29@Ȭ1ư" Z< +0LpE!c u}To_!PCԁ-JYo*6h"D'hrZ Ķ^i}se+2̈́=.1_:@@H^Vp+۔O!W 7WB#_0&Kx,=Tly[18 T-!Otd+{iUcI tq#xQqZ|^%_'"=]|D7EDHҠX<4~H +F5 |V"PZJ\Da+A}^GLGjDAt+-&|tT},-E2>Ko&tf/ףIR9%z Zcy|<6KPf|8t9dkC+tZt%T <D'TZm ]DE/uB]Ѕ*'NE;̖3y _O| 'c ]2`W#=:feFеJ:t4!iFް_VךSd)Eൈ"yn=%ޛvP̀&>ԭF;mIgXya(KvڒEB} +Hs4tAGHA4(rw\.!nkRei%`~+UP(X=B`LEkA(B]zza[fPQ~>ILxRC3ǀoBk0'PFh1:h `cLHt܂(єX?s8/\_^gJCjzcPYhy :fudMP +8 GcuAAR6|#rtQ^g XlxeΙKZPlC#ρq|.j@Wbp\X_ ʲlp& J`Hc!EP&Px\G7R(M2ƹ&T,Ya;c_JB ~ӶAиHu*$("G@\nҵI@y|%bFr@8Ê3؃$fՂt !QOy\VQcJ+/O6!G6Gm:o נk"9\ףU|U>P$?!n65.prʷO{P#*@e4|n,1|.d| +,a)EM&xH.8BDOx餆Y&x~ EzyJTGxTk)Gƫ aX3lTAy YH2!yY<^$CϬ6: T r#@tbg5_I|n , Q98 (\IQH)7$\9i,_J&5w +plts)x EJwIՆSAރtm1oT٘")P%2WB'Y9dEIp,W\A|_|A@xl֍Xjp9&B\sAD/ pY-\I`{-@: `%WCLT<\)9RMXQ /A/POi0%*]ICb"_z}gPgOwOm@^ *o[`2Ɓ}BHH8fAy(8z88&9eB'o6#]8o!qD3 9$DQT?DxSD +|Ӏ@LYA} ;P's(E~*qP3r81@TzC,IG'hL811 2KZ`@ ]b +*L%A^ =N]G:d:(ᇬ@~}d Ȫρ_qD~XM:*IH$`C8:&KnAPQE4MX`4M1 Spݨ$ Po$jNcƂL1qAV{'+?Vy"wo%7֗WiϗNI['P)kU `sV" {N(8&r*9䬀#䜑 眳Z̹;y>xznFvUk~_sN:ۘȗkܩǝGB$|9 j(KG GJSj~pKesS+`1`P2i-A6d2(H# Q<>Z`X8f+eBrW + +(ZbN.ŜLA11\{`] \)[0C}CLp*l<8;\8Lc*)$Fa\ Dpk6I{A +|⼠k`E?l9=@MZ(q]CpL̈@AV1!sJa^m9EI<>v^{j$uPy$'AhE?${ X[B|o ${<FށsOH{g+-^!u#:t-8j>g*Spb7&R1o: +VXn)j:%jOrE!~J0C1.!rCAo _*EB]gH=f>h._Q)t*Ie[qP$>$ m1.jP3 mC*f=s0ǙtJ6 +ZIY~pbVQK'Ukʴ@_8UD*!/g!Y=ZF2`]:^WD=7$9137:cG1oErvim?89w*`k񱀱@MaMxXp=J~aJv; ʎCe?{Z4Cm;æH}o+y<1iϱjI1D+'*p=u}ド(Gq LzP 겠 8Qo}JjPCpe'O4P ,w +j)o` +DP9bJƯ8Nu/DQPw4(5٠^ڇLl19saW3cA8^NƄ?t'OX 矻I~FUl`=.yQ?J.'}{:h<}Sx>ĕk1 [\dzrև(KqtBD9 T@A8\pEⵢDMpfAY'1n_KنM" `-! Hci߱ƈc. P y\웳X|F19;^'cs񵑞 *]NsD8BL9<^aO;z Xd!5Bn{O nXbAG>Z\m3ܭә@/7e(c1ӉyK 4*ϡ7%됨W2OYJT8V=(k7ZbyoU?_ Qot!>5sE7;W@j _[ ^b"[ y ks,nQlJ{zGl::8ʰ0GCNڵٳĮj 9 ƼlPMI+;8HI*Kk%0p +Usq^cqyF?ocU`\(E>n\l_#:q8aDA[q轕$5{L̃瀪"`PPb'p$x |љ6̕@\m!}u.rp7tث:LOkxaXϖFn:8B%ug̹/s'F./$FPg"nY):3F%H kcqs$ǔi ~Sq 9#R3׃82ERw A#PC><b((2Cp5K W5=5ǩvc!X \& I 0&}Jj\GP= B/nι^ɜ\ٔB? |FIN8nc#`״Ӗ $ZFmCem??@ +*8qc%5Ww!{>X-L|GhXm:z6L{(P8A28A&:s6Z>}- wt疥FiQjW{#$k0,ee7z I;*ޠpp8C\$kxC^S* |? "_?x \` 3!7{2*5'ON }:~"5tXU\>ft f? s#+Q,;!F\ Qǯ?'Oz3@- z#Poװ>2|96?`{q4C[?X'}EPwGYsus +QG g8oahbL$G Eg +qpwı N f,+ӒJBOy&d3]ø .8B8}6mwˀNӂSt&]kKp> ?K \]$P?;A Mjsv1VOPe"ޮ/R}F;}2d,Ot)CzȔ;@;* Pra ip:>{Qfߩ0viJNsN$?8 +ijTrV.MA,5C O7Ce rPӗS>IAXp%{T|\H+ѐe ;83u lV/C풜%SEC/7Al_4dYzԥM\\x o"ż /ys8RqRK}pJ̘Ŕl*40_pn IrN6PvJvI>Z%0BS'GCBh}l9k9S ,x̆&jQ/25qTP{wt2EM1^KZWD >YL 'j^R « BD-c)SԈDM%Whq:4jA{ю?Th֡~LLj89g8S*zl$A -X RC- !HմGe+w k^`-gmT@&%9p,Ů3@EImֆn#,*9p=xjwىrXJwg΋bPQ]"s8 zB(ΊA|ycH0ɩ̣̕<\,aCTarv~uyBNp;'LN(8cq6Dd~{#-ٸC~xe+;vT"5{cHˤ&\EK.Z$ΜCto5:(҃7WJ 'DqQ>9:tn^#yM\=0WI 8rctlw<~W ͘&Ր&VJ*v05tcrn4vZh0^D>"?;!}u@1RNa]@<n^l, ^WgS4m5v +8 GM95zfbGI +BU[#sdPbxXϪ8~[F8^9g3p1 g Ao>ʮ3O= A*H=ȹrpnbu6hsrFC5DbpFx8M7#gH,,7f^iΧmϑpΨc|&\+ +x\=1n&8Y F pou㘭*v:t"+sX_MxJTh@]7p~'Ztw)~np684Tf6BYK39t58g*t8*R{&87Bg7!6چ=7_#e}^iy&`-ե/J(>8OJBMzװo.8&N',SV<r +#ٰ7E$J^?9;M~ph"gꭏڒ2Ԍ#évAJ8lhj&t=pü^Ic,b8K_<\\ +lU5 +9g8h9Y\c DZ5LCx)pXr!w /wQN0+0p .!88_.p"Ku]Πn$.D<\Mz(p瑚 5c?|Fncb#}> +Ɔ=[nč>@8E䬄L8Mr΁2qξ`Zp Hh)ؠ˘ CQRI1!P&LFN:~ YMN,یs:ab~js!@ΑY…[Aj0}ތN(\ȘM\Vu %c;ڥɆΰa0g&S8+s풋Np_pyz%5<{UܮΖτ3d9L2#$ym6R .v2u*l4qϞIE|\1^#aBfA}rOTtFwS(}ԸWe~إżlq.iK#ާ AWr) ˵UVdWZeZ"jgS @}Ft ˠsجlZܺ&"Қ4pMmFŔ4`O:Mb Ԥ L{}1AyLأ:uv:q;ѸSh*Ψ7G*n+G{*6:uMi{z\(aZ6Q|&*.BRgUa㦽V|?nU[p7Ek$9 -^EYIod}`r;8ꃲ*k2jx/l.HpրUn&ms7DllŦ~lrvQ w3Mw*v[ܪ\˄Z 'ˉZBi]x1w | +TJpx28"O5uC =wg>OS噔wlUfwx"77+&v xk勣y3S8WsCZ^,~m<0{ҧuj[ܮ_+udI;ٔ8lyC-eZ4-/ҒV]-=f˜Z33c8zψS8xB#{͔kr\N{ܶKvYJMg҉uE;4mv+9nR>ӷ̹[m sSoH4Ieջ-,WaɦRjPZ k y%1RbkYm6M䗫ir1{ZNmԄǥԨ= *~0r>sӘgD_hLh>sqe܋$$7o:^.^!WcQWgWӯbqI)iI7-9"U!g/7qyk!L%R{u9 v])Z+[ e+RvLrB-^oȲZh:Fd 22 8K͊p{YND~KVx(e^~%: -??!,߬-=y;Ur*(eJP[MѱU5cqf CfKU"{,UɁo2im:zf4RYaѭߍ_Ḍ^Uqq^qÉYsؼO{W{c/Yc֒ RG;+{AJnJ]{IVܝzj12ڵř-{a}lf̕vcVFzJՊՀјJ9mB~'M?3y_poq?o;N'}R6D?wމ="&1߸k>%h}.P$j yiݞ}ٽτ=x4I,ǸԫaUW-i^y,F Txu㛡gz~t m$Зg6SV+_Yz2AFDfNʥn=i s\z>ƄRK3DqEQE߬ϮOoşqt?q_{γ}=^Ҿ-YG>eqb_W}I{k6R9PԴ QTZY1˂R2w?NmesQQ鰤gYaٲ2m)c5Ǥy '6ˎ]gux=T1b&yՂ<ž:ygi2DpAtAsJX%U~GGz_٧P{1OAL.9{۔ +{ yQ|4$Om,?+=&)#Uo![imqҊ*S;9y$YÖmԭԽ>/FZ^(r7V\,8V+:y#6HJm=ۖ\SeϢ^O8֔w.1tMDCr,E_^ὗC{CGskL:sπk rLl}mC["j +?"Z\ *nerz?-01,iNu I7K+h%%9:|{ڲ6OgJF q5+ +bhX{nGY|}zb^cm$YYnQ]z*5Dәz"X㹂Ftw=Qbf|җO2A].\.z򍕷Tٴ?0ޢ2\\!M2-j?,*d!|q;i9ĖUvֺxT8gzjYfF;?4LxCA7gĦy${T_HN<ٔhy7F=%\HlV!ɹwe]i,2jEV.|FQOEyE(Teȷ+G(YMwv>JUX|(8ݐ]U\S*k.:Զ}^rBtxGtFkdVsr<ިe~~QgbweY=?&{UuF~?w6K>6 ?v׎󇛲O4]J>t9pdY{So2QT͌i.}$yrz"g +#[q-n;~F36n\eK7v=:z7TcZCCdOS]pDPODF[В3aaն!U!% +b爌ci1/B$}֝#? ?oB^Dr}G36嫎rƈKO˺>\;/YoMSY(CO[f]6w8 &$Շoz+C,{_GzT']H=ٔyiwwOד}v^k Rܮt, + }` +ͫ ͫ }\]j"]\6-faŋy->4wNU "O@㢬>mb4Q$ߺGᴴ_e5UV-⼖ uE%S )Z'YvXmS!Z+GaߨHLqL<֜,}µ׺oUWy)*"yz^5qVKdlWԁ(q[8VVZV{#^ +2hϲXؤ"2D㽛K^(h)7>':KTWRRh}\_Ʀ/ycQonRX}Eh^\Vzҳ&4 +"U9GEܮv( Kwu+=߼3O+#b*.{FezE9VDEK:Q})+RUuHٻ@YS/k7?eucIԉԣMY {݊4jmڱ]oA{o({G͛>eU9m^q٢6 $:3Mƛ:'M4In\e^p>q9636Cay=Wqoa2^l˳xk )[7қŸE5.0ѯ5[VUh\Uv>1#־!6UU kpj$\+#+bx*v1I,ܺ ڦ3'tSR_[uxsL{βpܘíYqbccy|/VWUPWn:ErW|_G]#xE90_7.ENaY8fW؅|h<? +qUOTSx6aCdNCTpO{i{EC"6|k8wLyIB)ڰݴ o܎Vkkeh)Ҡ8>E.ե$,"yŵ^Q~<_EZWdh~@96dƊZtkqQ|hoBkl˼c ~c^Xz9oln؆l ~_06r-QUCNF3d&i_f&2WLkE%a8G$yDGĞHIHzs̩Gdܛs1oG~Irvwln<R|&xGA=o3;78d7j_V}=~AL|M~4Wm=eR<aFhcO*h"RSNPC+֛maʚgԊ0C3Y> tw>xJ|]m]9W'*-++H2 +\"_u +TqW/ \ :z(}⚚NB%sp;^봽^N*j6Z0_ -]XW<3c~{y3X4 EC 4|RƟҟ?όģk0I<74jZZ6J;nK="cGEFFFE9[p^^u)+vG||/#ny-nk v_:_Ogc^4r&45zg'oZ8u!^6+%2 +tx?(o FF&)㖢v>}8o|]p#i +8|%6++ 5 'gccmk1/^`,$a +ǜ^d >w/rn/u~,Q;ϙy;&4ҟW;k6y<4{ Z{ms?:*N +Nx+QaGB׸o\Gz"=*o{yhLpotPyEF9]eΑJ\#J)ύZ6J+)JcFW&1!d{xn((44MWفn>ԭҔtx]sUB"?š(SˀWb勿WGEo͎ߺEa^Wm֏umCkc{r"1j 2ck??u=Uq&Wf8B{#j RsO͘cs͐t4i>R]ehs( +黧.Onyu!A[$f"H3{coj^F*tc4x0XiΚM8qr( 1'hd 4MMM [&C 6AA4}MM))4e)MI^[!F[\jFLz= +K LxU+gBQG/ #;V;8%V$&53_1=<{¯COEGCSG.F*ؼM ᅪh-He4q626ՅHu^q-2EkwV9N3_W7[{0g^U1uxJZK\aϵ8V9&.q\7L:ozm|6^i*W𞛨<?7s8?& &\ǶMק^&hjK4C3GxNB)m uF .:{ 9Ux߫{U{xs\I99)6kɪc~xj +R< i^p*RCN}非\{!>RGR||~N&?ov.H`D\6B 9Helg9 sd,k{}*-8E`ԍ^/uxlyᏊ"Uڅ~qmrH.rJL*0uz:g?~+caxF6TR̕ m 4Z-C?dqL1A iZHe.RYifn{<>xKy]HMjr~?4\[Ncg ntNvJuJ\U^ Hftچkޔ%>Ǐx,}\~B84ԙ8VhSpL^SM PDMь z?Z㎖RЊ}J=J +mӖӶ:yS&{>/ÃEyF?||e70E]\[y;Xߦypʨs0!J'( 2441Kt筲AumѼh"=s+r:mƔhRZ)AN&h9{:}4^^Cocxmv63zw݈ Y/&{r(Rr"=<8dZx91ST_kR[8K # ;ks؟' c!ӑhCL8ZHۡ6ahSe{;l+>٠u>7\[7ryC6y_ߢq4Y;_W"V^bȋgb"0vv1e̐vzb:4 sl֥3T0&A* Ђr-ΡPAգ\gh&iq0n=l%T7N&4@y;mYF? Ь%hChZ&FKwB˷GKhRp.Z.FT ' h_8|{gVq7oE}bv-L9o? yngK ;^f<#(D}G']֝mLM-/U8uxyV$؇xEk'}5[MXJ0 sˆhtu4o9ZwF m>8pcqź?xgɧGnԯ*;&tzyw^f~2-wg4ب7M`zeoδlfɆm7M̌ 6*iv>ꖚ}Z{*qE O>FyIe=LqyAFoJU۰3O61K7J5:]>R׈rHɇPC1kO9^vg)k[ :㢾?ߪ/5M,*iـ tuG M&*EU鑰qb9L> :y}!S&pfhkS,,Ds׉Z$-A L.a_c&=8I)OxkQ`2-9Nef^fvy& +ZF jї?d1ūЧKgjsIѪ.?@ÊK /_Z6Vd]%5w5bւmgx3-gcvTygQ/o ]7O#/۠7B&N2۽Sxsfmcl\ݴd|\nr}^obھ,|?vҏXNoԙ Bʆ"D)$wKof|3l8#/>#LYts۸F'Fn1>fM]Kr2s]Bcq^-X/B4]ӴKmrяwou~V}"6{15=gP/~Hk["*,)?9"i[Tf*xlÓQ#6q(R;ckЖcׇ/3_Aubj6qodvj qҮ#S拣r YЦx,tGTlZɋ̣vN>??1"g:cm8]Gҩˆ=[ͤvjK5rle)Ia *T؋e_ {Ӧnr^KB{ӕ7e_ Ctpά˘}pǵ*,h|0\ie]^mgm٢VMCOGzhבm'v:7 3Eyݺ_Z^$@x_uDw狜S 7?OۧOY;Z$b%aq3>VxR`iuĞnK]Vj|-@]aUto^.z^w2j!g014fAQS18)UUHg6$0J`2+%J.)X%_-L_K_#Jxfr619Wy!~<ܧ'{TuݺeEq,rhzIMft3&RCb>y•H˵`N#=_>zн +^U^%n>|-O{=ZL{q` s{$h +k u둉ɽBD;#kmįxƫR%먠܅߭ $M֙2.d< `/ڷ3[GEem}UߵD)Ӆ%kGX"_˾בz?N+#u9oh^sxCGjG]XS6uT@_m\<m_ z ב >"/"ur )u:-{qM/sWazdm'Rj6S[KjkTM1UcY١]O}Rѹ!isw*<fPҴ:9>^dY/>|q\ߢpαzgr_'ȟ| +-sNC iǤ7j7#1aVqvި)::L(GpO#QQp/{VZ܇뙪稀+FSv㙠p,=LeKJrd]\FߺUԶMg>%ojN +n+HkD<\, +Dȼʸc6~I;oX8n Sg&C&ʂQcu %hzmdS4ҵHo~/Q%]=e;1ABSIV'F[zε y=V#[$I?k'^~EDO ),${!'ԅ)i{ڵf~h_aWbMr0-M&3/ktͦޗ*&]c[֘9L'L g&3@S}#Z?o!ںR}Gw +bŸ;%w%5bV# dz{]$9e:mT|L؇+T~UQg7maG /ۙ{8~Sޣ)ĺrYSZwgc^Dѳ%We~dW294<>o"=$v$<;Ќ>I HXQfbhfn1@选Ҡki;MQZ6bNЀߨ sYjK+}&s.}WO_?ސ(Cc{.hRzMs1U_ ox]!t$:3$k}2;:?=ss6W*g?0SI(3nit\&6ItAψ jEW{u.&|3uAl҆iS$Ull8>r( +>MaR+fԋN9SF?RB^۩#9fǕ-:볾Q%̳nY?tys{Rhɨ*5b``R{O ܮM}cNfX(A=3\zxng}ta \o&Y/enuS>qmxaz&R2gƉBTZm76օW |Zrԫq7f3sjtLE',\)P0w/pϘfld8mnF[Ե֦X{g)83lehh hXUWnɳ$!W=y q[-|-ĈH XGt.&6QJf * +o}n?<>* (bigQPS)pJ HHCX ̂*qZ댕JȩIUYu>{g}oD_jYg=?o\񾍏]yܷs|/ƾFl$Ϛ'ǸkFV{>W2js[u7l]G.ƼQVb;Cm;ρpo v|owg7x'b' ߪC`_}Kv+:Wd+|i?V{Tʷ> ]o>[= e̷'w=kwv;˝kޗqr-/\8TucϹgGJkWHWM,p%SL)Q5dʭ`?mNپ[Uz[MIMcws1 |Gs-b?qt':#p)_cnOQ{W0c׿=cN3C~V|困ﹿV{Tϓ= ؉2 ޽"ou={oso3v[?ߤ9>ɵk^cm!5sn;vNV*x%Ŋ7Wt F$o|z|My0_adN0WǼ/͏]̷|5Ƹ5?gzi?.߹|-;y\Lͮa)཯L<ݷ+nپRy+=_2jST}0M nCsQSug?z}K^yS/ ~eԖwl:۲tO|i;ҿGp;T>'[ 7_&?lſq?k}&້gX*w-+l#[\Q +ד]RqM:4=]q9waf ;KLemlnBlz֥K C J1۹kt7ǜ>׵cy5[22hZ7sd݇`2z_䕞_;-' s lyz<<'. _պ[yU}л_&Bo}5̿Uƣc+w]ҵ9]~/apx:v9G~yWȵW?|^y.Lq<傿`{\ѡc8sҸbN`ڳKG><ƻ͉moؽyc?XߝG=bmx_h'+r b<~Q.%~M.MEv6h<]ϼeby,c*#=i̷۽kΘi2PٓX=*b%8_\OGL< +>_1O*1>og_:ߏ G]yngy<]jnyч<|;6ϝõ?+3oiMB4jf$|v`+17e`͑A2v:>1q +bvxpb`NЖc:r\:|9\`+\{]$߃=>|} +tc{z߼o\G~_P?x!]ߪ]\LcM-Ir /YubWr/z\EU fkC 淡럼wcلp1<*!ںWߛ|͝gcNt1$_E8ĕwl8ӷ%`g!-}~`}8߳ +E[\_sgxXWB8P~?=Gp >paqΞ$C|3޿ s=ywaB}gxtסo&fğI<#1x"e0&C '194<#g֡N9 :F8{Sܾ%kf4LizI՜`qG/<ȗX5 +10?uCy3%! 1{sz#aKOKTcW7u+e x)K"izO=/"[K|1Q@_~/u~ߕ\%?{cb\z{O]Kf@L9nޱ*#K6fcsj| +N[fB̡>ڻ`ѩh^]za` ÜJ=jIu/-S1_9vj0iX9=Jzt]sorɞ :Ϛ6(<Ʉ qpу){/E@곂wn:2"_Ձ +Wrd=~%C"hhc>܇?  Twͣxo3ܷNWp12JFWZnE6Ŀ|EEΪih! iWS 1ܾ`(X}h QfKsE\"B{8ޖe#q&p(CMKGڷ㛷TW`!) +`;/lz*oƼ>wwvRλ_.CN ?{O~}ǝ ~XO!wu<Mn.[pc'R[µ*҇8J%SoUR۴xVZ4o׸#C0'7ۘ6=z槇WԖ ,Wp󖎘>"ᔁ_lüW sBU% S0=۟b%GBXFymN{ebxe 1SKgpa~CpƳ5ޟ?J0g(f|̃zP-=߻=0bx@9S}KvnjXE; c˚!#KhAms #[ޱ<^}l,ͬs)>+q JG.so`1 ύ|RιՉN ?IMp\==s7~;s˛w92}_8=O49ӻ\m1e'oQF %z;Gx(3THW%2Gr9wHM$~cǹ{ʷh9'spǦswmGsϼzv>>Qan*13]gvyoo4Nb2Gb9p+8w(egZDڇSNyЇG޽n;m?ל͘+z]{7 Cݪq}zu3ǵޣkp{n|ᜯǮCAѿ;d|UN?}?t{`B`^7ʼ|qCpC53\KD'80OAwK_'=g|+̝8ʻh繞-KFT#CoRrKpOhgr\`_ނy|IFKіQS0ڷKش0Q#V\ŘG>^{&wyUgKNQ^߼OWoј:lskr6Io| y͉ ~~[` 杋za̪Y%C0#M̷1߰7zp?ظC? ˊ9G s?tp,t{G '| _x +a@~7БzugS|Z뼋֔bz͙u7ǵl } +/v791fyZ'!~/uG>t$y3 hn+ptznBe!bfOo<&B鱾}_TwC+1C[/4 ykNmC~Tpc_hzډ/agՆ'yfk|Tϡ?X8Z?pl,{W~ ew~u΁q׫`@P?DwyCnuQcVu[^a=~usB-s'7~t/mP.d3,bgy?Ԅ_r}`~7@+{[|euw\9P?4% ?'RO5JߝsXĜ}:#`;v +̘z[Wk>DÛk]}99"fݱJw0-.^uVp+A̱y ; ס}R9Gx 15E[/kϬ'SvnLj]uTUAύFnę?,X!lgn'jX'V*{_mzjϱo׿޼gyp6DizB\ܛQqwюsi]q+|Gĵh0uzϪW8n +7G1q#B-0n7szagjY"vwJw?t)挭[ +vO׍?xw74_j{Je8Z\u˹vD C|&MyHg 4kHn8m8|ϱ]?{k*#^oL1%7pEgs2YΑ:_ Ď +'Rv?L\ t vV}IM5t8]xah-OW.D,WagEVׁBW?uu_p۵tńthı[{ ү[5[3:<ów9q|0Vo8#W7ȣͦGzywj^y_dz߆Ц!fG/ :r{&^p穁EY=sT{oF5O ~np!.CjkC%0Nkڳc9خ᜿k}Dezjꭄ +}:vF6zv}쩵`_}.9nґuΑh%F,n§^Ǡ'D{Ox CoKC7~k|}׆w!,tsfۺhRXt߹>>*GC+FZ{ +\o!9ӘFXN`3FjY>V\KѰކڷ9th+C,KZ`gC{|ڗE شh]nz.@sV?|ݹ]:B%o|,1;p%&>5vYg 6l vWѿVcYĎEl<*|{~,yjw=5 qk'XR +`ٳ]o9d0tNMdVjvm~)uK=~W :mvgsq퀰`7<;sY=uF`<#vl<+hYn_ćY0Q?v xC{ /Z}vCs5ljoJ%~"v#W!"b9=MG޿]Cw_ 1*;|@ +ss>=m a$lcգqwo}PQ|u WsE |t|߹$z/N{={AY=DY v)3q.C+ ' ;;kUgJjYN5N! ߎ>/bǯ|t F I c] #8߾iR@?X~+?DsUaee('ߡe_}>d?><_Q~7xJՌPIb]=k<%Cwnh0~zq q=ME/_x=sd w X7?9|ɯD}t.2<}U|*Α.;k>)v#C툷{uKw^!)_}&^!ĥ\W@. ޹ |B; N{&wOkax>b6+sM?qIÏ2;bCǺa ڥ߿}IJ +#On +>c_3F3Ox'4 ; חs6\Ym}{-B;"mzzĮ .?ϊuUm^|ދ#x\[_aym.aa8=oJނkX}a8}4a8&ق .A.G$s/:z4ɜڹCwkp&ƷuK]'p](2U̿4Ԇ3z꒧Ը3?`{ЗB;V|ed#.yB܆pT/9:ַṷ/a:8uKVva^-?X1pp}SzC6o~a s' ߱@`7bԡ +|]'񈋂8?M2]|䷷ [q.|@".],OlJ8k\lpcwR?a@쬺|#++]}B\ϺYk?{~&Vu+!_>b?{M!pCW»#-ןStl|`=G^›_-y"_s}^kg>_DkG/1x}p{7|wIյoa35ͣ~Spw5%sB<4u7m_] b1`s{.E.+A̍'wLhi~~\~zgF00B[3=qwi1胅ֿx&Hh+tb \1%KsHxAKj]? fC;nC>ؠ_p0NUL/]k?׽a+ a` _Fʝ⼡ֲ ZO0agw=Ƣ?wwnXi *'}0/hYk_FSE5U=tz˓TcSYhj˱ XaíqC_tNoXG7}3=?gp=|kv:7ٹs"jAo6>'>; +ʱͨ@óny+N j=)dC}SGlc u7tjK|KNE=/"K@L=@ӯ0}1ȯo +o|4G[g<_: K*={~).7ӻ&쵨ї +u=n> ~y[r_ C/?BՈپ>.',}OB",Cƪ0nB n>dy{@\%X=eyɏ\{hӹt Цgփ_x q}t{߯e9Y 1x%xvx)>g/w +n8zs% +}Ą/vfA?xjӓwトvS`;QX03ll~گ } ;bn{vg{<{uxF">sdhcϐ`C[|* !6-}:s{o_o*ԺdmÙ-WRZ烘 (2B|ꙵ%s\16x~`KFFiYh,O00] ƃxf+X< +ہš3o# 7}t?h +:%dLxx^q^8F{tXy5Cq#>G8W0B 0 >A @oOXG }{u'?ⳅlG[ 6]r穫pn'!vmxUxq "dn.my0=q鉱߸λ ŻF?GṗG~= alk8&8Y5y#!N؁ 4{0Lj7W'OS?OS?OS?OS?OS?OS?OS?OS?OS?OS?I754%o-W>ClH[:*]:aby*=%֘%Tm;'&F#qxNdN@t5F 뱴Vg$Hg44 lmgL_['ÿ2;( +6Ie;'r"k%N4Hv87dF%K}9N 6cQ54Ѕ0;IXb^YB?n_W>-GNԿLQLMQ! .n'2hV*6=mCAB"]h7 MHҝ_) vm'k]P{b^fExR"wvwK"Bw@3tE=mH.Q3u +ܚn;~eUfUzyGe>:IG)=27yhleۯ|Q+K7oHnw,R2{sVYKT7#r\KZ-mk[S{:hdݘ5 5Έui \vj?7Z4&}}<4٘'S:jgzwshB[{9UOZ*[(H2hKGgYvغɕ˩[h4 +RA5| +ie,1V|ͥ[r\ W&KrOZeԥ*<nJ}S%X(RSE'Xo)]vlb !#ֵPbT,=%-\Hv'g66V+2̓$&p) +%M͋$ %Փ]rQ_ey!P 6YwQB7[څNv˙!RXu^+"'S<˖*–AIڭߦuW7 +E &so-Ɣ/㻃?Gs#`uG@4``]o3ֽ MlXBPnyr~$]x1H.`Z˻}e2`ϫ^βP[n/ 3wTM#іh"=+Zx6ie}e3Z:f=nhy!PtxK| BRn +DUij, |T{s-^mI]ykeche!g%:5,O.?Lv)9l~nwfɄ%Hcc{K{2xG<ܥ#r,rd9r7>Y6ru=9[QMMtlQI/[g\DSc2?M)PdIZrP'N8ȃ،Xh- +LcL,f[|WF@lSL38X+ +w#3 3LcLL@T_Ai,)3ֻ+@)-9à,,d9+vF1w׎m`J94Vdɫ(+6xX_-</y͒~s`oߊmP귩) |ݷ(`0jVnE=wv+nEnmܶ ٹ-]$aIId$*NIT[# KD&Z>bm5M%E+=ccE/c; ?޶VLcBJcqjzbšKX${KrRX kbhs,+貹ZRJ @H:C6MRss#/7L1dJ&Wnevm^[eꜴ]Jmr^v-[ 5t,.eWK@ +b-Ѵu\x'G7.-O_\-P*^fy>ĔGWxGŷsnq٢ߓg1s rRh;iqm#m1( +F9cFo1 +,F(AZλP> +'aX a`1 ,0𻇁di^*b}bc endstream endobj 48 0 obj <>stream +Iǁ⠋s{Ɯ]BIkyv̠~ݷach|ϰ1h&-d(V?ڬ1mѦXs2bmxqdBJFcI9,>;Sջ x.ݘ~95 w(iIsŕN ޹q# +0GDBu8W&Io=ZY5UyH^F~gc~/Yq~/)Mv-$[vS͑hnY拱A6hr1Ykia3HߙrXNwEN;jMe#$e *U$B&hrcrշfdHv8+S&>pi,8<uS=48>Mj_,%/~^X&E+< gz9r` !"b-' +Yvk;͓-ГEZ43Ҋ&tMh"|7*|֕ЂRuT2=3 +KN^; +oX Hj‹k"χ[%ah +9kcuMX2f]IjhEz?Tx%UYNS1w[V(z^eQq 7uAl ;Hc̲9EMR(W8p=3γ}sT(ꡀO35( EE֑ v/)U89K |\r(52fy+xLQf'k O fl1ܦ7* +C;I5[Gȟя,( ܃чk'}|#ߗMLJW+'t<?麡p¡)Bz d/VgLDe$) )XCVCP~ruMKǗ75٦E%SDJ[9whi񧺔;t:!(;+Ht8rH,,/qCbDYxs +,eI8ewr)5;;6H6Ͳ[6 6ˢ ZJXu2lgEVq]t XY$bAV;Xu*K 2#٪J$:(8/(켃; J*MT˜S(T ,؝2'r9d +α2lgYǖR(cY;<Mq[UlBxto</K="\əYg I2D!!RuG'`E Dodd|gD8uI<:Ε%g%!#Akq6Q'A2/(pVDF$ G 04X;ny5N C0B X +bhx+$Uf!@{Y s20ˌzAh< / t4e%8U&p,'ܗh9FhNӄ J:@cR +e:Q6:ZfQl e6d@f BELs8(SB{aR& +GPt$PN1ÛiRO))RmW:;U>*+(ٍBjҒ,,eImkV\rV]X_׸nBYQJ jl\CVeTW u6 + MT2Ԕ%QlHjUkVo]Y +n\C_TܸɄ9HǙD Ov0,``)nxxT5FCv.(N']ZI+WE( ;Ny'\6$( b.ʢ[U![1Y ,QF tG3A37&[4DrbtF=ATC,ZTD-.mp#jNJTaR8hMFo(Q)P!J5͌v*r h"gޓ&%[CSz `et2ѐ\Qb1ٵ )!p2&64 ðh{q#NL # IqlGM)57HE׌ViϤx'XmT#RNAcsL-Ggy +w<(kFnoJCM (a ڝp1jSVi}_ENE)rSQFUd0ڃWZ%JҊ8< lRX?:̉̚^bmJ11V9ȉ 4o*ސ[QV}~jE*0Tk= p7 ꗲn{0o~)S;&cXde4U*6㥦iWui)\r +›;>e8>O|&\Ϥ0)*L9&&â#FɕEXʪÕU)o=AU 6QflWߕ NSX`N`4p =<^AW&je06{?'j0"߅ qXd)CSF 9QP4C ]fH4.wi?GͧPFAY$0fQ7UuIM6DGaVOwZJUu&hE^s"Cp=CpDZ%HiTOz\3aftzZ8ʊ̕u$ѣXA d̋چʱC_ͰKǏ;4O0Sdp'c֢/͘N Y[y+5F Xq'ImA vX{ۢ{ʬ2xzn>naIP>>'' \y,++cJ6%;d286sib&Z&qR-Y*R DD@KD'zF,œʹ^ +&uQF3y<^8z&@G!N9qUdv&Bb$cq6߰撶hc2CsE/v%$8yeq7'S-Z-0hs 3 \W3m0mDj2 0jbYvیt$=A?C:44 .W*/ǡ'1CAnV+NR9kh RK>tqFrF +>NHnq6 s$C &ץy|*RA;X;b% |O&?N&jhF@T9T;hYM_"Z[cbѦ.I3FHQIiHr-!6 `tQt;ͥ:<<^~ IOl@F9-S"$#Tqzw{hx%0>{o}P-J٭fwHM6}ɒNV4u-5Sظi4UhqV{L)ϰ6EĖD3+M-65@Xנdʌ+oWf1} +3 |9yY!ྷq%$,. W9d1xʌ!dA]XPh /*q rvnT8; AJ +jQ&h՟C$eSPa(sWnP*;e"-4b;h~dfSA:jT`̮EM)Z ڏjzGM0uRS պdE<`3$h)L +`7 B@}$H"4R41NMM:ɐD,RoLtfjf&,Ip1LSl`Bl8L!*P$Z15j7S4 4CfWKBoYhM5k!CLkZDеLWi 9pTI#h.VOT L` ;/pE/,kR0`Oo!>dlVe%%{#Stf'B YR"zתȲ"W a&gIU2T:d$;KYbx:첈/ .13 9XmLo!0dpTkV%S$03cYt+ӓU0,!CbdެiEDP%ftIȚ^ƻlӴZhLB/kVE%*n 1%QVrv dӮMF2wF)I3U ڳME۱_AR =\#F1uF)s^@Ϯ̖LsOL"H:k3zG&i>Id\1^`N2Df")ik7LmIdz)s^AYWdn&i$5љ<"4$3ͻҋ^zmF1fPJuε5$0ηV l25TIQ1T$0K2 LsbWL"IL$7b{y6<1U6OLO.1{g8]B +g79mPɬm.T1XV Qӝzt74D47{2iKfotZ߮Y6j[6HgwI쳶s >l`-LM&k[ot#͆O&CsIY?D[?KsFV'27Xsb]2V7[DDyiϦem9lac 粅drzLm$ 6VL^0VR7:`L6Lno`drn3ۗ&l_6_7C}ي2};pg3ڇ-)!־lKu#+ m"Æɱk_6Lkdqeh3UA6WެYokfIEfAMffAUf8f9]-TsH3S sL3|P sP3R$sT˖Oϒ)I?/U\_־5gyՠ=X'@%qFn"]H&Ԟ{&!j㠼{SR +y:9<ySN;.>OS =3j× TTClh22*dL뿘 +Ȋ<UKQLOH;loEeVNOlX&$cV ʨQ]w3F=FAeH(\SsAq@0O;Bu/9LCuYT䞺S{ȠS/.qv^F3δzXp=Xfh̬9j)gPVQݴV7eUu6r:0K^#z^#V#_)y$[=$sgk)XQ.% 3yӿ(e;m&Q.Q$K\;~@NUJor"$\dԡV]Y=ՂD3(TKMʼn fqV$~U*l0 :e{RM[߁8XAԄ2b2)WeZF"XaS4+XK| eo ei=YV;8Kd~WL}etѩ6L2mhhC]zצ8 ^=N"9V)gӻ\kO4|Ki]EOSLK]Y#^i&Rf6=t{BBEC^;vqqr2'*CXY6jTx>Tnn|S~n6a،u5$8l 6S̉Yvڪg78쌈/ZIgy K! n<"}j+q8A)t& +/,gô蘂2ˡTj -Ɂ q{,UEnZUJumGYצYV3RfWY +,j"Y Th%PPgACNhLg)J3Rc`KfZf6?xY +^3+T *U`w#Љ@D#hj,IP (!P%ehR-=ZkJr2D*ό)ITc<7L<лp?Bt4I 2+FGQ_dhN`/2q/iDNt ^JG$e\:D9>nAwCbeZt$\tEHekXLo :T4d|*CH>a [2T(Vh88JȂu4|$bodžd62'‘d1GtUn'V<a$a  06:4u `IW6BYGC+P :$"XȉN MTrڊP9d$alN A)I .҉ziz,j4Ix0{{ӹ]͵Tv7);Z9ݥ-O'qLTN#MJ&DR\rzVNp(U0=U͉=QRV&V)p25 pPU/i_M.&)[7/b+Y=`s?SĪ ]o"8fhz8MR"&xOv΍SQM J]-٣/clm֨ǻuksD4IƠB0>q^+DN=b2?pSz.97.{G%)qaS'A%~ >ǙFd!urqfB[NY;bhVg?C+ҥVj̦%NQCȼ_\ B,PdT4Мllo6ZŝZ SexcpR=U SL8"˻70,+ˆKx@#n\TeUx$\!:J%<%qQ^W)贀͉1Cd⟘aE 'f't QVVj5P:_j Rm][EmmV$M٪SM7ce$ikTtkm5m&M`++Ye["fJU@iHY?Sm03VΏVM4MxUѥ@$}M|OkjMUQ \W42qͮtoF_>oRa4zv|h9<uLF`G6U6˛)fd[mtQ&豶ɥ5T*X +SǩAǕeHZ2c @p9O@Ȣ$j}o̐iN]MT75Y}F`eY"+[C%' tD! "])5 +}:E'&yvyVģ%Y,Yhg҉SG۱ R `gХ˦hzu@UUi ژ/DQ%7>>[H6l펥IWnOAli:r0%t*3R̒*r 'UӺ BPăf8 ",[Iɬb-qݬnDމ8ZZ1'QV p8a%Zvp[A2z͔7csK^vr--Ң-~|9PX4ESPpR@mT"j;A[{]*ҵqYOɰ01 c_WtZ%("zl6Յ[>u4#!:خ(3bx .~b16m?7uk 0ym_Zb_Q|Q"OOP^;>Lk²bwO_VP -gnB!Z8Hl'pxAgO 0:\B2`"`T&Gӿ :\s <$PZQc+4Dt%/sRbB3g$.&s:/.m& +F +Frb]§Y*OA={UA2t+iD')FٷQ/Qx3OkkLK(Lf\7Ҷ*v +橂Ph(>f;[u'5^ēGG:IتVoC{Cw]OݚRO?nr?[gћ- +\6ZQ5vDIV +u qSr=gz~:a?1?{U+SUyWߴVlѿI4gXkw7>dX-9w$ +VӕFUE?>]6Ζ=y@m;nC:/sQ~j#3g1yv(BUϧÁ8% +8gy|-@FC ˇèFB;2)X +<KP燘z8\Cd C4 >GS{IՕ^0FPBy&4 +KuT-(S p ɢkf9 +~x}.] 0'V6 3,|?¡MRtF8o V9(o@(8#Ux<11x%cB?'8Dž0LG0vPF +V \Q =haP0 fdȡ+, it%J?ׇF{ (P~diTnϷys@eh \FiX `3"E8]~B*Wh? + @=G̈́aar-eI^(lX󄤀gZa lMvb!^=b82EG< htt1 FiG!xiGat%jJq03h $' %||ӤTȡ‚P! ,0̄XBEd`G.L 4::ׂ;ZjJA29&{@S X|OB q@Aʙ=a!Loa1d)т4u0 ]كFAÌxTc  + )J0NC3XxfIpBd4O!(-a@p4 YP82j:TTA *Iq 'Q!A,ʅ#>FP k*$Pd%@qh}a !OP 4I ~9x`uجY'wd ;8؝4#VTA߅4-hxUTFhnD\R(4L"zeB4"Hx  +RXʢA . '°qF;HS2ƲaFz!JoV BsX!$b +V;$.i?DV8`X  <` ]y`20ĀiflÀ +3UA٢cQ *eѱHD h;4ꑾW~Kҗ,!! +,(Z 7H g8 Fw6xuO I +/AВ{uSy +@AXTQL"H]b pXK!_ȵB +IQ] bGIc^]#\)eiy4Fi +n@[NG@5 4vd;w4(wĆĿM^0vA5,4@3 =,BH1{S OVh'7slh?7<9>EѠ}aAB/b~T@ J2rX=4~ jmmTo£ <ⱘpC)gu#T + +6 pL`xUՃy u V*SN@;.ez4i / TrihG~0_A _، k8r2Ƨܼ@2`B7rHJl`{@+xi2n~`y€flX LP%01.zkLj2ZK8h +oAј䫨? N$6ߓB91ϥ@\fl0\qD?3d Y()Bh_1HT+]u_!\(HJf뀎8%.Cc/2|9CfAVxزR_D+hXw/ S @PG`LP>C2OtHQp~x-JQܑ@!q;b;!;l8PBxA]e> + +iEe~C 6°q I*CTn Pa2`T FgE(2\$}yтaay TK`0)F#g`Ռ8ខIr-v;rAgy:IIt658$˯<ںPs(IojG?0v\.^7Twv{_T׹jJ5x] gr3Vv07Rd7Д.X1`=OwxZpt H÷ws?kSu/樏+q=30puѭ&G+`0z|v σ5']BVEBh#%IOџwcyDe9-tiфfH6oS, ̖p`3RK_;d1&no$NO 1ajno64C'W?L:jS4rJF6]t!ybf X3.݌b6&,)́}JZZIub*23Sw5`Pԁ`!.|jV T'g&6gG\|t|m٩S#(ONOjO"כPo ><m fvMac[)T=!̇l8l1(ad/ RpPGL:t|\t!r=+ln&Uwi>O- XZ01jf5ĕQdf[LfvhVn\_ yFYpx.dEqԏd3vƀp-0wa137YoW00*7> ,LJy=,*Lb ν1/XWa~@s%xL`?qHbd] mrnn|eO{ b>_9 +PdR8;p^]d +՘J:YρmZѩ^&y<_߁7C2 )YK,KW u3f# +Mh$x>],n{.Sair8ϻmo]`hGálceBŬ fgIլ8&՛di/L|pmu?3of%o2y]9&% xxChb ZCNeycB\91Un|4P}xHԥ0)u8Gz h\.ef'k. V4T^122L6CvE~^1$lopQF*&cc8nAẐZeyPUVޠ7*)$ Bf˿1u9 +ΌE.Z&jk;V%$֕`xj9ͮXM]+VT:j*%HDD4!Eyo8lFS}*=Z4TĴ{1{Ji?>gp P`(٨AHjʼ“CGӎ(%?U<.\vf{HƠ 5TqZ<˱p0Cv;By/԰B7J kjȨ۞!_n{1.#;v;A ]r%;RzBG@SsUIf+'TģI8 ̖m\ɺdwS̹r.z阒bR% +ibͱ/ɓZ ThI~eOSi6Y( ޷h']4vI 9&4W{쁊ԧ"d" Iʭ3O;A84bfD@0{P4rҢ#U;R{QӪ#$:6Mso7{B7T 0%k,G ԠCRo {7f +j3ľxʢ[d6,nN5mefCx7 ߫H4Gi?6ni"WptBC($= UZ)n39VƞF$2PS扚;8BݼNf"OMCf3:#hBx5wrkQcH/Qm9H8G Knr=E(dĞ3vBQ|~& :h"3xmi'sm7τV\,UŔ-0_BMf<~Lف:JcrBa6d""%ji8(RBq"ߣd4GuY 7HB4q: +&dK^w[ w\LRY~ieQj#Dظvjj$5#l:L`j2֮KJ =j9j1e4{X]ica SSv]3k.S]NlׂY+ 7E2\Fƶ|e,E ~ذW>n}ڮq:@3zsœ& =`H1" @h!7.r%<4", {1s0QWٿ9P Z%:Q v'ϺB[f @c4 Ѝm$-Gn1EGLdu >\ɍ1{jZ-,F-% +`z/E55d#](C!Z:3ڽiG՟Jq}a),>3=6uEwxzrY c#M##.ї'q[m<'eZjTܦޯoˉKfHOb~&p*:!|</9_7Bc;Y.a.ک}fόbO qǧd3h<'.Dd{3>.Fgvͥf}docT͑啳-Cޤ__) +?qlm a l?tJeN;ߛ7vÝ'*~;E&< D˭'oKqٯi,7hD8lH.ι7VSlq͈N;hCM$f\m.̠S'҅K[;CX#ks5xP=36Ädžm xjf"ie|U2#g>=x&gvg-07?]%yڗ}::THYzc ^j*$BF~χX52%yŨvŰG?|x3`3:/Rl:O6mvѯ$ ;6xgQ$PL_³ZZ23jdmۢmaPg+mb.^H}W(YX<ϛZ/jT*'.ǻ'aaQWg7s232EC'&B?qLD[kYQZIޥ_[oMcIR]\;=fq k1Ţ#OILmR S n|KKKa,`Sc kfCipfQ >PH(^Vݮ|yoQa$Z,Gf"iQn[00'݈*X(}9FS{ٓ߾[1\9M6+DY3>ѱ7TFaw|?tH0̺`v<: cd}vA9>Ncqfpk9gT #3J:_:˽-c< !Tz*>z>UhPem` oIʿ=8E|VR9YEY1&$tk"ӆlΫDPF.c\@!@Q;ԣ0FxG!0Pm^0㘒ar;?#{[dis f'HG%0+K+H6[E.A3{ޞ$be~{6=(QxkI/d*P{Ivgv `5#ypXJ) Qכ\^;gHpYodJWJu/wƶ0zA,+ɩΗLVөaDj@ x +STflp]==A2t\Hڷ`'#Op-~e6j)ƾ瀬 w@qnIH2m>;CЙ] (MM\|hnCNoW,H4cCW@bgMwJpKP:co'cqxR"S @A6<( 4/l zN#.j3, Ki{{|;*TZO*'E63a/܃S%}4/KT˳ǖ.voտ]\\L0Ftw{eؗz5\>:@=La]'KϿJ RӊLiyIM` ""%o4`6dDޫVSR +آ컚l.5x +\;jHnovx[ ]47KDY +ͬѮlu; 2#rO FsKgurˑŐM{坙^ZQ4_bL6Nrl {߁s,˄(o9ф/,Tu gL>'"7ӽj"-$&$|: s#. !5O8h1qä;P]dv$XC^>ÉHs]+Ab ;;c}׸o[.ӷ}Xhf9ʌ FeJ͊kMPtWWb533{ַ쒡D1ۯ*sILۧ Py+ ޴r!?+d|L^#XEf(){@y˽FA5P*9E~$>Vdz-,1c͋OεݪGd\]+?5#T;'&C-ң7 & ?8s!;M63]25 $"^09"??d*z3yLMzl^MuYQpcЯRL-ʃ͹We)`q@h%6ZH2gi0&CWCKDt +l/RZME#js4`~ާǶcoufTctXrUw[T"Y!,}}!k[.|1Q95C0Z~6_癷&"t EEۿ5Y/jڠ+g ¡05un)c=1NS3C.Z+*mse5ޖsϰ l=Jd'J&P_ʨ69ǂHfct[[TrQј\m勌iɆ̒j$xk}Oͭ^}J\y/Jrj-Q +% F8cso;oT#uXePi/dSe-'5l`MͽhLf}\JOdd|w4SPFמO0 7Fc9va٥O[&sW$h ;K}|v)\9 ZF٭` w`e- V4c׶;_ +?'⸸ĹoFn^z 5G4F7d;1}pʌ+-mcY 2yjl<\@A^ M2N'ۥ`2lQt}b㾷fJzX0l1G+OA6ҫ:̾νnsTnƱQ #95P 8 |C5{1QId^K rJ\,^3;ނL/?sZblvKehe?I駻ӌgstv}$non&BXlau0%-XN&HV@6ݩi/(A5v!qCbTȝ D22i)>oD,K֗76]f=g!8izw^WoXFG1]^_s"Cԭk钽 wt|[e!xEQET}hš#(SanwKV8%\<+FsVD5}?R9'+`MewT3ϓM[}bU9_F߂[9|Ծd^[Hy{"hSWs-+.g.}4 +^<젿\&^hW2>ߥEIfߟ)DP Em7 +LlΑ/Holq6*kŠ{0kTG"ˣf %!'[ܿQNo\D`e*S +7|4z8U*;:dpɚB]c[ +uSQ +wN6Um!8YLgm8"*Vst`@B!?'BFae7NVTQ:L6p ׾RaCyeP_wԺ%6FKe/֣h$*񫠄Nj%D*f++YD A?: +9Vr+j6A!%) ]48< 4Sm*ZIy`?Dqf; V~ %a/X+ 5 fF T.  +*JhG)Ymqw0\@rǜohS*?#uK,L ٞ&lvfX瀖IZ-ͮ'YzOsؽe\=(KY&q@ִA`++& 5۠ScsJvF{r@ #OʠĈt[/r er;NB=N. d;\=Na2٩b`CO.٢(Df}\;E'UgD1=@?MRQKF+cjfT(/6v@vJ@鬻a¸'n5'Iz-vkjܤg\U۬@L ipP%=]z@2kC[GDV6SmeRDkct`ZS.LhPҴ){>N >>!ðb=dD2.s1ܜ2dԧiX^jiUB3DKE:8YI C\tg4|X# XHǝjaDFD}4^jN`4T[&^Df(5/SyUIEY'`f]eńY% ,h!Z"GDnutP*֦c<9ϲ*!&$% / .UZ,쎯SNױTcTŲns]OD-?U W;1w-cxVUár?b .k3=XTbqPN'}kMZ7&÷ +>d1O<睁>{P#k=owΦ'f} eu>I4?;՟}Ї.C)j[x.< ssO]&a]fv]Щl~nlC]EadJ; #F{|ofS]2EӱX'WZ3;-H\;VPSp] +U-QuěIFy K_Ko||1"gvn\.0ʥl42S-l%KVÛ󷏨ىrm3:5 {cdcg{SYjOk?*IwOt&UK*埘ܤbe?,L]-*lo?-4ZzFl92Lɶ3ob~G~DxXl̍,vX"oq]-lci֚Z/-)a nK}ڭpC m^Xk 9.g{pNTh c-;ˋ% +Yb6gNjUU+nI,H%d,G۫%X_Xrτھz+%-rsu[j`%'FX;Kka/}Ykl P8 ,Vaܯ.,Al=b:k<,l}ԵRUbulk|gcnJ,qgҚXw>qaͽk0XۅnjZ;Y ˫7ȣhNml]uޱ6kc}as0Wc{k Fҝ-䠽𼻱]EGD)Vm "g+1[閱5?b~[vڞ֭u׶{cnJgvۢ6z5pޗ>.By/, 鼸6v x +j݈bT)/oj-]nwߔޝNtvv/oq{5^)H;e6>&f_seepWFHL3#϶Jth:|1m> =:vNǦw{'z8'gdjc=ůk|ٍ+:«s;M\scW`߻Xb+޻* ]Ezz]욥ֵMngjwޚ+Mlܵt/ě9 <̧p<˿VrmHT*\JCɦwɒNO\6*W\8]suO~-}\`,^\QDն5^VKxf CB׺Ё:xn_=\~㶏xEʑzH_ w#Y HQ_4}_oDax6i`tXDBwNnn^ҷ)&J&lr]?=xX2S#*:b&B3;f>% +㫣O)x)ٙqkF$܄ԕggvpI; zݴOp2  ny=u5/Isړ[-2zcj}Y?:@coOϊ>0P/ +m >hk^Fb(>w6PHJ5͙Zssdn\YRA7m> [a;nW K49m٧iN!N q|(˵&FtL#,4s-r"]Mp|k` DZ-JhrE+jӛx^ǥ gº(N#3gQdV֕PX7ޥ;Wkzi׹1MJx>%Ҏ\DSޣ(h{׵b7fP +xW':MlެʫvU`y)*-RB9tq۩Ea,o @Ȓ_,6@_ݕg.,TzG`#觏̥-jYSksS F9/uc˙Ӛcz*Dr7lrQz:zU)Pryb}=}Ot 8!=`U<}1=}dZX`tg1237qz>8VWYtHzu~zQO=PDf|CbwCi|\|,DӭOoūopkfd:,3a6aŁ*+Z"usO.lN znXDkU]!V 9Տh']cPd,S͵S)"Bgv܇?ZwXPR&LCV'4^X8f\'!,sf4" +1:e}?i'wŨV?p 5a )#DHJ4|u#`UY.+I#!=C'\?k-fA^@shSh!aƎ|1Ulf!=嘏dzv񏯲<979xIAHC1QMTH^%c8 |>sG_DKSC4O6N +g[hqS+5?b1lOc":L?!va.ܗdy ʊTxko`ums(Fw=b +(OV-zgv +CV (;]ѼXT|{/Yy*imMqZ\[>mE55q]\v`jaFʗsQ{)gN)altS]&bDZ;(PB^#HK\"*AiOݮR|񻝩T~ך*.NZzx%@f">GxBC +vV^N0^W3TJAyg b GuU$47vl,`'*${ɯ |̉A>rjI&Z}=Q|ƫ+b0b2k=Ur[JjdyW`HCސCEP&]mAIgh׏kLY-aݙe= Yw:C]171F&t&e|*HIKg7cJƙ]ejbڱk>Wn.Nؑc55hPh<`v_ eܦwt"c\NNT@r4 m^CA]ib9lK*\50cZ6DD@/Q0Z)ćuu!/ jY7#.}}Wfż<'+my%`]LTyx_ +9ӴҾƼc(&ZL 5c[V#US,ڬRfo܊]?;aj Z?d`>d*"&o=*LohmRhnRUS_xiU92:e6N^3ACB3eXmT&-ďٸ0!]3|ui,ԛ+3? %Zk% + +Km3ZTaB'M/NW}aվ'юW$h}/ {DSlqmłaɯC+Ucsus |gF͚hAOHF]!{:n덋6{5-fOOfܞ3!;TiM +-1R TȢ=y26+{9DHp?S ٰbB3cSe )uRZ~E K 7V`fY/?ɧ8WO}1XcBkMh1Xb/ +]M-_boG.Tcֆmc]6kh{c]σ5 _AeyzZ;hd=ZgdrTRo- @{>iL&p7t65kJZaq3s,5& +%:OA0)BqKbmSo'M.~(Lr\ FtԈ4HٶЙٽyY*6&:{ʕ H(@WP%A`lhM˜gF#.k5m]^uk+օ5t: +:Nq q>Sj4+贪SCg\A'V N辂Y qT-: +:j/WVG5ttBk+,WIȦ*bܪs3J^wP_Rz})~ylʩd' +#ͨ3fT*ztKd4C:ZK٤b.{:l S} SC~#~)b7xH/*vBJL׎oe"1-nYuDrŮ(:S`ynOnR&Ln*Vd*oܣ> em8aL8d,G;V0{0h J$7Nd?QHץ;~䕹Ņ&d3ȁ?,B+eӨt2;? Sz ($Ag'꿆53_FZ1v(SS~OuLE?w_lKwf]yv.N$IdcӘnu\#o6ŮOωQJʝ9BAdҜ,q;ytfd &t=&)̯(Uڑz>ƾVyܾG&wtL+WVϿo=o&Mp|9_Uy&NX;Qu4.xnVY +!u:Vij=fTMg9s:aɩ{N&nnH۵LN7iEo;y툹&s E(tɼ_"Ǔ_y9SߨrL7T޴Gl0`}!`HUPtN]XjcdeKtZ֨]߯ӚT_ӪٯA5ǟTi};j[M|)תNdAR5J +_;j:Z:ݽoWj5:Qg~NK*f5ha5aHM):*UimXM~H/Uiij:L~T}Tic~c_ӪSF5N/WiuptZ-FGNN$Wiu 0TM^坏QM>`췪LBj:N9$um96T:P:ݣdw& /vԨpeO2lP iy]M8}_݉5i_ 1ƾk]TR1JX˖y'UGZ+ 8ܘc5uk\թZ6qmyݣFu=fUQ4U㚺_CiކuaGM5>=Nj5{)Lv^[hM?Td$.Ce} uдxI}}r-I%eK.\ r|*s^,Wʜ+=lE}S6qE]'ȥتPvzEx/@EwugT]gdwOziz8!KBmB~4ƞD۳+ٍ ]D٧VWv 扈.hzf<;=fZpǟh[VmC3՘EM\^vD>2:%ƅw}.r/պ3昫vb?le"eH!]6j߾xl:ۥM'O6}3Kq"ԸLGj_IAœSJ~"@;3_u=h0ׇ]y:S쐈,M*q-1f=[4=HgsMdMg ?cQn\|| էOk2^ +8&Sh{)౿SiOoN).e:&ͻۧ:^vW~_s~<؉&sy{\xwpyD*wwUm~kOޱ +pg[`7OGְg WVJZjǫlZ@Q![*_,]ы`~yo"|F|;G|HGe+m/(^(ӮHoJ~oo/w*bWjwwF~jwN1?yor߮ XA5!`UR[b/oo<Ә?Ļ~#[!{иnMrWc"TyO+ޯ틒Y~~yr߽Tzu(]=fw =m˿~AZѻ~x?od9{}WlRn*;w-]''߽lxoY^=?|{y˻~{}o߯u]W*T1twFֵCсQw@ki!=}=?dml)mt]_۞ٳbwVrc\Yw~ӵi]&YghցcԶjWPm*w;_xo\bol귽՟뷷ޏ[]ߪyUʃg뷷aey~5 ޯMZvw~i7;c]=jb~üwAUnKP7ƈr~5ut6!xF΀׷VGcXϧ? E0xy' fGfyxٽ] t ұk/gOd[?enMgO=o=}|⷟???J|Jubӱyq͍Y9Xl];rsΥWwoXyM5?(<Ʌt%딽-N}{til#եS>S~?$هN-.xX>mxͽw*;пάdwgG?ڵ;TxK߾?|f'^Z2'xv4'IL=]ۘ W?Y|qK$OjЉ-.ƱlY0-*.gչ|?wgk ?g6/^%1$Gw~ rO3XlΥ_u㯽?[p&y"ޗ^,liY˳# ]h8{7~1?+XųVTXhdK? sd7xcua/b9ԞsXԯn5?swJqv8U~9oA5K#MC/Xn8I<7zڹX8_z}}g~~詣v^}̖^Y|y+uգŵ/t C0 +h?ꛢWZ>fig'Vgl'Ylծ>܉Ë^xk!/ +o|bW~ݕ-XO%Ӄ,rqVz_z,勼ׅ'.E 0R?z62Ůty:ų|+q_Xu|7'uq݃~<򼵎؅K;Ŕ$P]v⮾RKԳ|1\cuQ*qe\2#,^JYh*WWNqLí[ɳ868ka2- ~ϿnY:C:do'$s)ڝs7Srva >$?_XbG«#5>>܋fȍ?wo_ǰp >HK?- ?ڥey7ɉq.ݸraRTa\觭Ǚv7l\XΧ_}_.ֺps۷٩6<>o>'?;b/?,?;z 7ֱ#M0;:» cX=v&7vL0ّ#+g6ӟ1| y2קdoKqKS_$M|k Z +g2'Ϟ~mML֏1q|th'˼~5[/uȋu8W3g?B "ƘfS^~NѩtR[S|AKøZ'v~|;].wj>Nf#X~{LN!<?Cx-?0r^?#0HܱC8(ά}KG}t އPh^_BIK]7 xx4y ΍;'qmxPZ]N01*vbqSl(f|}m,Mgx/,2~rm@'6͙ngOrUX)~dاu,c y(=<-h&`q |bc$2:mQXvXڝ]m]gìZli~V~yza4r3ˏ.|{{tnpx3>*W{M廦xzuʏqمoN01}鉵~ w m1FprR{W'46FY{GsN8a @јNB~~2v~xun5'< 8,];z%dLю| +݀pq9kg_h\Ώǻh{Uv3\r׏ ҄H0|@?ĐTƐnuhOƅrq/0VBK礛ǫ϶|:y4fvg~|rQ6WA=S׷g̬ o?|~_y^ݼ{_vs׃L7bw`/. 8t!p,:Nz?Ncٲa6,|Y}ۧkVqٓyq؛^m?J^Ej>Vd~B9W2}5Sݪ_>Ȳ7/j[%fggb|(^ap/͋%3 ?o|s!fHWYt69M{K)\H*}Mmw?Vv;0KJ13`9>O./w|rx9mfj+NOt7OɿEr \er2۷Mv;;n+٥Ϟ +/lsW3n쭞㳸1b]l7;C=p+W1X}x7AW=~ٓٽc>'ǂ/__{|[?Ul +=N,aHQ~U{W7Grrp+ÌCC@fh q#CGcp`am*vS:HpнGI{? ?A3c@X +O vRO~[]Iʭ$]Z}٣WǏJL/JLҚ?rَ#CQ%{^y]tNG.ܩvk`';Axs_Eo$6ir_]6uj~4$ߎҤkzs$`{XGYt!FQ7ǯ$Pt"ڏ ۯp8ܹ愽AN߉5;(y֮ik/m}qg?'Xpu(;#ZlA}aO۽LLmfy5>tYJ[4_M5ua6qwu_qwuN[91?⼖ޕ4pw%q !Q[8ܽPg1t9OK79ܫg}?6fŁtY-ƌR[uuӧEÍ^З71;r~l7{V镥ϊ"ϒn[ӟ^6fN7?vg:]S~.imvN>a࿁?zAnv*HM$q I=k{/~ DƇޘ7U $?b9\sc*Ϛ>?M*#>\/V: ,$$ݭ1-x⿣"ڹ+G\FgA9׵r/(kK>$%הBƌ}s> y% n.X@Vff߼tӾz8twp}~Pm+qZ~X<~=}a} __Ifz;NM4cQ-E=|<,z>q޸yH\\:w{Ŧ\{7 )Tdb΍w &zv[_=\^w˝x)ݽMcf?Z뷧f6/ׇtGԺefMJVK{3,dbz曧Eߩ72+_k25Qs;Σ=V՟kl|ɹj(+dCLLq L'Vĸ 5XP=rww3l6 "F(gXԏX0鎰&:;ۉA w1j9r3n _}_>u?u}G>|"MqGVYNWӵՕ's=m|pmL46OǫpoN/7CP_ׯ6۷SgnLpBo{+w. jP|t6Q8pp ?Ǧ<9+ngµA6Sot/ 00O1n^cƆR)X*=֠.ᶺp|?hU6!JRw/ -ګr0cwφU]twF@oI> !!4#H=v7U?}]>׾(! 4[9ޘCO7?4ů|:4th{0WI@G.%~lP>,!9b~Iom =1jG߾])|G~1 %G7s] +كa4R.k;>(ݧD}Q %'R0 %}XvC*Xgy{Z(C YJg4jֶYVWYdA:nHcYE^zh^nuƶѧԶhunQUhbS5Re<=R۪Pݐd +i%yB[+"0ʐ +&^e ՉDyEƪ-(JZb*}3'MEȫAyYVŲ +\rzJJ-Ɋ}DjQȠam\Q;ס'pA:Im`Mdۼ*jR16>؆U(:evBm/䙶^1月f1pE@ udlju]NuEGk4g7"Je,-&[m0m5jP(sx`&tǡEir[=D' sQO/](YWI_QsfykZTx8ӿ6ADǾ~;ޟIxlJHGђnZFsQGOu#a##tENDu9TE!Xjd9+E ,UJ+şMe {O{ bmhC'ig"oT+GDjs͝K0Huc⩺> )ʶy B'y%lJ'.vEҢE=$j-AQBANLI^βFV7NxTB,>x=HiHC*di[@AiȻ u(y)zyJJ35D+kOKfu+s#mi(n$!~S!-g⪲(5(E70DgP D9RFTDKdO&lD U\įK65.m0R, +DIB\ -bJ414t}EMjovג/7;ߒ~ G(/z7(89Tu"5t-eKQǩ twUTы=s8Q$ e̵PJ$6ޥ 4D:ڜeHIKI2SQGMwI2-V#J[!Ҩ"%k0/ +,$#vV/"CNLHKVBM_RqMi\$,w_S*e/ˮf)Z11K +fJ )>"w$k|,&jLYVrbK@Z1}"17NYM:)in@X!uYRm 4ĀfʈCӮfu[t3XU#[Jz@ڑ[Ѥ{"Bˁcg-TYH?A8dm3GK}Dة`@u x)%ٰ _=bo?#)15)6adthc(HUC25TGV,( +t?@`(G`bFMC}2uG +2rC +J62oY 'nNrI %sH x%NQVmw-}j,*֙Xn!E M)<Y2Ɛp`(EqLG-\ tʥ7qbAKg +B(hrpu$ KҾe6=$dt9F;K @XM/ľQQz@, +^n`V<$Ů%ɡM:ݔ +23/>TC2FgI +p-*$@~%M:%/Wbre:7݂$8 +i:LsԠUE&I\{YCĬ%ӤYy$tx'-i;r_}6`9 l MTtLa0J#EaOTz]%zY"ϯ#WdKJ A÷d9E7X"͊,T|'tKJRpkNWAeFe|'âis)n=_6>lJ*A]"* d_8:e}SZ`D+b ȟ*ɍgüXIҊ%\5@s +Pqgt-WۼSO; 怜Ha'[F# ?MZtR:RdYBECB!#J#'Ui&QI(b zƳ+'-_(>$>B3maAx-M}j B8iJ4 +θZp* ԌdHE*qOD2c0Ї8bgz}h$eT Ѥ3kIPb 6Rֆ`Hl*FФ]5$ti\}ndYݑh04Hy @i1W$4=ijs.d\$ƐE蒑`ts!2 #-Ǝ.p~P 6~JsM#t/r@ajA0"b`adʩIXAؾ-q#VW]WiS`ϼ6A܉dRE"7E;׏yFt +{ 9]DQWE;b"j/LHhpx L, pZwI;kؚIDHp nS&l +9"M@uNhRȐ/m:dhܓh"#)!&;Y[ JB^ۑV,ƹ:\nŤ**AtC` +! qȚ0U"ii`R\$ +.ʒt@c%i@~(,d6h-+/ g-b4`ё .W(}~Raڙ/@ *2GQ@&FN0NI`WF* +]-k0uBQDe!xZ/_Dl 4}M3LM\ F⧄|~hך7< ycBEO"0MRl5X|tCn\L1IXI&V14`F3D|S y +k"(#oYZ[`*pFM 4!v +"3PSD80״qi;W B޲d1,fy+I\Po(Ei @>|33gB{ jAR׀|1z<uH>$!._Bı*Äp#w`%Jt){o4ƾWC&n@5l!`k EOJvA3 ɜҡˡA&JW p9RX*`NC9쪫2zbDs7$ptLj9EBQQ=9m*aK<5`_Iy1/bV`C@z + 6ۤi 4UB:BC M@35Uvсrl,1`!2=Zy8Rt$_QYV݀1I`{1\S* Q- PlY 7Gg$UJ ׆wC*Mا( +.+sX&X -HI2hv9 @w5V57L.A⼘2D&2TD$=Ti~+.8`Tt"qCɧ9 +DY2i- pY`!SNALa 8*K!VtRZUj/Œh'-Z;/f@mtU=Px WR 7qkKH~kTlL@`"ayB0 +@b}[wgy`=R_:C;|I,QT⴦H]CpZi]d|w t9+JK&u&2QIO`{EEa$3``X.fT j@<Sd ]M.ܐcGv0Q0}JX3jRIk$='s(7pΚXh+hb*tIr7E;!r$ڄ:YK9'*~hY&gH,N.7dcx C<\d0Ddk66/ |6N`]*lSv +nh܆aMD;QB6hS>CpT)Z #Hp8\j3o'rz?DӔKܘ ڡ\I

S$wUJdF1'Zv~_P?/e.d,Rb%xưty1eMm-[iRR|y@"K# ##ַ늦Epl9 [Uأ%kԦD@Cf3,D-'INvJgs[M%KĤIirטn5٣ )QJR,3f615j Zh Й#0j7 gP:$<.%]N=SE,!hbt.s +ZN%qOu!*RpMkGtr\`=30l8?sYJ#`mU'{ItE=.hϥR?hKZ)vBc Z١+ ظ+X #3 ؃+bB+=j"5@i2%W>i:O1iN}))QVG? O5-av?G8;@HḰ8Qx\M6tN4 3@63kZa5ՍM'pHb`P]*,aEF\K2 vsʠD5 hсEꇦ?(,M<%W&; %P?RRrUm. iDWf"/Ӡ*Zl* Kq"θ6:@–ҁ26 1gSEn&nKfHN6iH4Y,$/"2\9j4'k/emt 0Ao(?f,CXKރx`@0 9? t-QfYBAivC8/=џ""򮙛.0i +r4tUkNw@A4t4gi 4)FA#Vhm^o7(`'$b%HbZz +Eg2p՜m${r]UB4քԈdaJ($z#-hBP';fNK;!99!#1NVyGnfW2s%&EbMUD߸ 2q<,AB!nȽf +^ +|-TK?#;J84WpsT:柂`'u%NKQ/ÆjnHDvӖ%AI:iDiRoD Iq氠9HG .Ghԁ9@9I:FX?"3gCUtп" E(:Ue0]&! T&ng PIԈbM'~Dh,|:A#eFji݉" \\'+!а !RW+2Pe%&6a%L)ɼ-~ Ԟk^08PKbzLP lRmjX#y"hΆ _ڄ5/IaNƶ˺4V߲L= E: 0$5/M6C +zLs+pvtȹ^I +\gxtBvQ wFcf49٬A8Qi]2 )"8Eã PIJ!Fٸ݂88Qd~3+cBJ dR +q9y@5ƫtt(R~Ew\.Fn liӦ@&[g -m!UA{u9}aH vB0BeZ{W]Ofg!,oKVڬm"ЎC(&66DJݡTEnse#'u8/ͻCah)A(R0*&aCHpA47 Њ5tJ xHyF8 XOB*ݺxQ˩6 X\ILelɱg,629>V@>A=~(@'Φ7 "Y2L6=aiL!l!:bAr<:x6iͥԑ]d޺,Hn&G (nԿ&͋QB&& +0})5U$GJ?k(`O3N=)4R¥H?RC.-n젭H{#4 Ȭ % ,Of io<GvjIPiīB .d>4ab5L*Ypݸ\wOh&E  +o0O NcҨMKis%nś]ΒЯӦ*):3- ̜$?ѩqD +ݒ7#h˞UݽP+55t]07\gblMPA!Bf~f9ڹ6EӠʨh2sJk'͔JCO@הMCxh`Ȉ)Yk?e +CuT n%㻬 '”0F>\A)pI]}nWk36oѹ,:(4$ČѕwpO^*.'h2?S])[wCGdc"n'GX~ dA(zD"/'e)QnZL.^R̘v.*j%P nzT1:nj EÚRWK<< p#%U^X²yi5ȋp;_Ծ☌x$o]/@P}%z~sH0dIo[Bqd|ɇP*6Y˫kh2G+ITyYvډZWwBR)R8ΓER<~FnNYj4t\jKEC ?sĠH;?@V4qg|66Hi~~M0&)`}5`Mt'g<>`K$C2G}:wZc?ܬHLCPԤԢ iƨͲ++hȹkZҌB4*vx2Bj <=QS) @%kmϷVއvE}p,/!4s {9n=T: /x +8[D .#R!zV*UDZNYx~b5(`]Ξl4̈fX mGJGA@e*[|) "ɾNLty,ŒcU{=wd6?'$EI'qێ("R `Dl)9f +X̓A5!U.Σ`rMtp=1}+` +~Cx0LګR"PݪZj]hyQߧylmRoh[<("ÔCftK҅S840V, q[Bn6.40 K*z.P6JXaDVN2A~gRC3Ddڃur'~G E47zBrH?UnSj>3#VC7]YNgôZ-&D0^]Bwx ]x7My A\1zq)R4"4C~f$ulBgK`N=XMnKE\ARZ ' ~|}"1O{#?(w=$ +:pNʘlja>:(ľ'?Pi݌eFjxڏtPDqVhzIqngߣ܇lkM$^>rFv=WOZJG3pty* ɓpOMY svDi +V~GO@PnE²[)4]  tOCqt1K}wa~78>!~5kQ 3wGm7 +eeX9abG 9%XCOz#K!{;Rn-EPZP@џs}.1G4:hb=P+QF8%VVzMzEנ/Kt.類N,=4@L2 DWК *&ɓU p-w29 yj +FtZ +sj &hG_ ]4~yԩG҂xAl#.(冴< rT+-IM65Z^hrob?cLrYN٦=jT_,\M +v6gDNA$m7dI_Bl~9nƐ& QVo@GBU?my@CZae^v_> "E1 + S654/-wLokH"'Mc&=&Ms ݙ5;VCs=ִ[x!zۼSZѣbE&5,znZw*ƴb?i@ceiBlXMi$ tSoZf3t @&rjTxB03)*imG /:~5P"/uZYY4߯U-Q 4H?.dR5:LV4) -BbC2;Go..a$#{m+k#A翵Y'E+UWaf7p>{)%Nm&D +bk83Bu)W])*@?@#ěP6[Qq{<߶| -,+ Q:|rLgjlkjO@gjϛG3 m7J$RhopcU3}@sTsuKKci +L;ڂ +*vcdJ?S;#@!J~ֵx4(t&+ Il8tq`!'/Go W +u!R2Bmb̚CO4E?/u/sfLW+#V@*W`Ezu5 (aUG:5Ԧ4{*"E,s0ٜWl@ц<;&JO2`_g +ϻDAU$[ 3xn#-aٯ3RA9W®X_]=l ͗/~2{Jp_ ʺCdX^5ə,CZPixHKU d3@?Y1*}P{֯o6Mq٫>@2#@,KtFRô\j18GApNM"yc2;_p0JheFǥjOMɹ3AU^Qr +G@T˿0 \qaK-_dA]2|!^!)ƃ~q)BxrwiXIhr+CxrO{zD+/^jIzg !B'e?KT9yŦn|2W?+t:OѣL nowiP8cYb׶W趡>M_Yُ;/jFi]=S'Gb5`h!qz +G\ȌxXJ# ־},hgd{yKxd*+iׯR>b-ەZnY,X_6AXHE9JO?C,yjj%XTM)H[{AbQա¾̏ύQPZ]  K42V`Y*#IhC"n5%P-ՠ]w&ω^$3zh=y3H i`rSQRIɺ]X&^guF07l ۭѾ'&aWZ(U^Ov)HMJ=o̴_Kj 0rj#R(?U +n49{F uh+ca}UG˲e9Һ=)8lچGk]i*Xݐ7-hȐ̕9X߃->QkY0ʽ*0v# +\ +QФXO;\RlV dq$ ዏRPM*{jհ}عRm!Igro/RÀ8g:uB(aFu;H嬞X`!O̟;D_G>Nh~v 'BCY3(|CWqJO/«pJ s5g悴#lW//׸@8μZdc;wufuR]O4W{9rf^ѾRoxG Jci]?)Qc(8w#E;MODK_5qhy !2=Wt_ZE#6{L'Y +OLeB_#Y;'%kW<4~B&TyZq&2iGf<`w$ʏa6g #wC2PPiKEt:}@Y{amAJi}3gګ>#ET^p~LMv¢+C endstream endobj 49 0 obj <>stream +hE$Ulo+p|2E=I&c ҔPmVo3`7A +{v0tWnCT&'Ԍ DXG[E07 ]QHţ'Q'^ PttKi5z%3 oq%A u͉97FX sɩ{kvO&q[Xg#NJwd\+zp@ ) ߬`BA57}RKW}^ +Ü|Zy7";i#fHfL20/-$O3{S6BOь4$=pL04LNs7̙֏jgQ>ׇz(l1z sp#փvc`' gk~q#kNLHu2BAW 45"O2o7&%"e2ZuKfDwVzU{4woo;G}9_ }NWU,;5Nnjy#Q!I߇EL7i\v!L YFt0i +'rZ@B;Ck? HnaYr]"3$̯ĭ=& +]6iK,SK(YW+E&<#:*o~3.v4)+reImvNR {擦od;{Vmg y+kK ՘#H 6+~q@PC[+ 9 Cti&5MY2屷 ze˄~,~4=)6&%O}J4 phs]CtEy_82VNF=dE7lDT^kKa}vK|]a$u?ߡ&x$guTd:ƒ/7p\'abIBGY(WBK6-fʺ҄CR̎]ߜ}҂`$ Z`l+*XhdG~}EzK-$M\RLkɫjfwT_̯F kΐck{kܽRd>$MDq/G8+ @]|a@qPK'>j-C*^(ZKE ݑKt\-rȋ3debα",)!KȚ~&^g~,5.Iqj4ܬ!* 2ʋ~"Q9z.0R9b3O$lN,o(3x\]8R_utKX[?,o:@3:`D+?ط4$[(?'o+{>hlջq ^÷q iQOі bBA.3H+BqGRH"V] ] Xk~C|;=O79뎣nbG''jl+m^R$Z`a0R4%Jc=>@ O iq~_:)g"+8}QEf^Jxґ~[GAm@A2҈7$+Xe CxSL[jNXe=B\3+>nSQOyKy&ԠIϐV64fK;߹yP/8NAM:SU:}']r +5ɘHF ''ΐ$sY*$ἳwUCQPr I$*c3{T@Y2PP)DIi*$8!B +rRHzΨ陵[@w|rX)5d5uG[XWJe{[aتrg w\"3AtHoQ<5B^orD w _xMcw+֧Nq*F0qIqD騃!>կ:9xbQ%s +ELH+4KOZds(;U&:TI7 +tRDd2UC)Mp!!Cݿ3%߀6 tTtdDaB/~O9ӜE2np0$)ctf>"]9fL%jL?P=_<0S;.+H+Q;>Rc )uu˱͈jQY2\!yOf_+ ՠl˲FcGί(4:7 qbfWuH.w٩2_!2~/)ي,Eo:{F\)sL)פt_/JީBc +TT:BĦsFHeGt;7PFeƭ ;+Po-u飿8knbuKLWudsxv+tWi]ŕj]i\嫅GN.#:ѓپ'գ<ң1\6}(p(^̮h$Cy2!&5FqR;Gۨs,qW6*l>AY-zrd7}hrG+5izL>N j`eLl)SV{1E׆wо'43'"E"?{1Q|dfX12]qTJKfLFʹ)BY]5og_:la)jGK_=\L:NO)&toȀȽ<Ħ1GʉȪ=ILGg[,>ޠ6%Ԅb+#$Ɲ?{źqhutX3?CJ:(@ͧaoZjS)r֧Oi} @/? QGPҼ⸣1yę'r: aK~x1 _e@#zdY ?{AkY*QhS E WVgQ FЂBU6b:u5,C +k6Qg]2`H+ZVvZ +ErX_ZNj=l|YN5A H hWE/C+ +>><_a;;%tid ;*NX2䯕{)k+S~Q(D/˓imv:UQ<0ǎE)sh/Y{7GmP? I?/}3z,?gk \I ٦} J{[RɠJD׎uZt;[# ro9P4^AcF5b4#+x,9:CLu .Qq s]ErJh_*;dieyr#ԭb3]]~|'V,r_pm<2\ +,tkBkXh "/rj3]mA"n[Qq"J5IBg&\Ń1;9PHBЪԐ%! &K7QAq?vE;d-a{ XFY{:ygv$jT=6$Nc q +!b+Bi 9bEWIro*X1bR{j{LJq:o15{qE6? +1/GmՉEMC\*T>}F=^Ac +Rz燠BC`?mL9H9z +Bm0ޯ iD7qRRla(p#cY .'b-tpR׬ 6Kz +2ʕ(dw1Mztňw\wm3k@sa &#DSlV*%FNd{pGi.'4>IÅ1qv>Ah{}?#vtC4WOh/W(H P;N@JLV$dԼ,~$Ւ}b6% S/cy] X`-|]ĊE^נu9ghiHNx`CNSW5C]owh5$!IљLHM9yRZy +1#6hӆUX b-OE(gx\@čӷU.̶x*&a9HѠ'*TdKe UZ3¤Z3Qʲ= W~̏HB+*h¯جPx +mp!r)NUΐx<#'1]#+/8a]֠!Pc#H9^-`KOpx5袓nWBLJޥJ@~'҃~(F /RQ6Cfb64[%*!|JE"S ~CV\,>~.eH%}k [Um٧J °rԼ@wc}9lҡZs pT랺EvlZ3MnxM `v;=BHvE4A|4jL<-^7Ok0tP1сFn{CL0c}:}) +;|SziԝZ&x2+gh(E$"ߕV-Mo礢y5E +x$Ш7n[e@%=usZR(DԾJ(6#ʴW2BL| +Ho#o/Ib+8ܕo=UVǽ"IbdEB%'O:LBxDQg`qI5JK" '󱺏fv +4ut(U*AscΪ}smA֥ +Bꊄ,%QYrη#TQ`f,z#}sW(\0׍ǛeRH.&YK)kB5%f [Tv3=6-!5Dњ%rb!^wQ]y9RϫK g%ڳ? ZRp鳠Єژ&t%6?QC|JN9"vlQo5iRtTB&|TYZbj;hT16쳒A./U1E\@֋<Sa)P83TJQ*ӃU)>T}3;~7_G "WD̘Y?$vfx;1RJ|LTpٰ! {Ur?N([,Z8&Yom忌PuI-PojG/v?wj{HzFY_]O?ǥ▅~ y^. wC8D6Ƒ<\j4l >slƱ1O#Q6|jAN +puېRޞate?(Ȥ={'}d@d!!. +qBO,$|WLaYa73ŽaI \| ;[eB 99ͶC#ƞ +f*| 䉌>ts<ifCEW`H-5 vD>(fx_A<}8zb%"-jmE,mcgWܢ> R-]Dꦙ4>C`$*޷optoa*~nM"pAGRdqFf`xU@j~_,s`Rn>F@@D7d?~k*N\IrÌ'GknΓ7Sa=MNJʁXPZŌ^mr3wjWClA "s[S$p.B@'U#U.c6U<e6U;:-iMEnш*rOn6ռ'ޚG)'ųG窾uR3|D@G 2 {(Mpř1KUɥO:moLg7M':\>^XFDћZ +e_= wG|%l׬-[ Iyp%G0AaqNZvoO[ uٷ[F"f(ꪀec钸FͨAj&v|kՔwH "ydyxSQ27vk4 DS%*;Onrhl{,Nae@-z +׋ػ;ڏ<ϞKXX"JYCIqJ4kkҦ_AHa59aF *5Y,cXʪS[6g<0K%3P U66 —lvnRF Lt &~gbڳ~x3 +k%^,=}e8#VAWT~8gt՟mrMbM}; 11mUjʀFlT1fS]rjbMsMFI87:xf[yzߥ0Uh7VTc|Y$.dbAE}~cGH:YIo@ 3 BI*KYThCn* d9:|nId"1e(}}sxN|Rayⴡ(SW' p>8hץz JBz{W'F!)\OėFt 5r=Fq4TOԐ#dRYlQI(ъ>I,P0hD˟w&ߑKP^y1꧎ NN# Ń2(w!"I^HspG;B-jSju"~Kݡ YeR=~gtC5BiPo*D Eq"8GPk"ք.5rO N .d 9wsPTvOh3VdIUK2oQɋ}2i$=T0nE cLA +ySKl!ŋHBH:& +g=CIP7W`ljzv2v;(A%x5 %M9L{X QL~Щua5gzg<7pK5m e3w#LH?cEb"E3W$S;NC*CyrB#̇ZաP(mv +7Gx ȚƮNgC UVÂTȼqRFǏ${| N +:4V#/g6L|E'n xse5顂]$U 3Gc +4gGrÔĩ2[]HWM̧VؾdHD}k4eˤ~Fw8FrmFgNpuheV v}lbu(/g 57 Zܟ_w!r0}lMW+ ySf ?pj +U*;|f7ʬSVmk_:EQNQjwqj)kEcEܱ!xvhJӠFW]`@{ϢZ,҂! +aWXMȥFZB0OPIYX,ho6u/A5ҙGe{F RZ"dg`_.sRXPP2 j+7\Q_*r֔3Ћ dp^aEӵ*yC%G0D[W} NL]2jcTJJ0tHb+@ Ɔ,]埐+0l_@Fz;[ԓ6(_I#ӟ { VRjCe6U8/qA +qaa-wu'5\чͬU~b9Xe8&I9#"`ycrD:>]M}߸د~m.~ӎ}.f%"O!~N랊zEA .J f DLAl]eDyiP*;tyn6]!-+nxv:>":)5%~aVvJ{0TWs8;ڦdés.?H.3 +?e 5U{Ց AHN +5rIf7|4>nc-հ=dL + ?oN Zz1(T -$\a +T)r`o?5a^Q4Gޗ+5;֢fޥ9#d/Ƚf.%vs[f(7AǼI2!#D ̀M:)7bjqZ%SG`SGtWh ! 3r=Iji0sKJ@mxա ՟a=%|8(ǑY,c$\E*#uNa27M0kNp&Je!8Q;8cY?g];u %ȹgfq}fSjAˍ9]7ZIW.)qR5nmN?+?q.A֦2$6L.dO|} P<^iskljyFۭV8R8Go &bByjQ@sCT1 +W0~K1'S_ሮ1fL1wQϣU=SS)>/!CٔTgkA D}hNiNf}_6Йhg19s9r))@?A-=H Vt\ (Y=%}R! ?e\hdeTePphׂ,2GX!+$Ny?b5Xq4<Ӿ_;Wo/{6vwF` FJT)mO|sK7 XKch8I|bȽ!X[ٺ^EĤ/Lw.Eu}+D$]sŜkQ1FZ:w-#hp%M ~m\&4 _:3͕)zOdLHG !{1!HpB7So֪*4@i$C1ڞ=5WҚ95'#IHK2o%[ϠQڷ {&[Untn-o1 TnÑyُJ}?HX n$G:hhOR9U ǝ~@Za0DHtX$#{zFOE8Dɮ@.)Vn2!kɣ"2'ؗ/9.=#Zިޖvy}}(͉ZRQ%KtٟqS=@73"gXpVA2yֈzufj"ŷ@]1zDV0򲪻@'GV}&4;?I*QQ)E"T}H4#ԣy20u5 ? ?S6nM "aɋVۭDwBOܐWxw8iVڭ1> mIszo^\'D^MlҒ^C z%:}ټW>ؼI?Y%|~¦>b<=$K0'#I,~ݍ`Q"A#px]ZԏvpFngIrg?0i^Mվҥ`V^زz` K#Y&w |z o\K:T3GoA(V~G4/ȯ+@FM?'IZJCZc^`8a[,[{%cZ( +!VB*9sgaѼV]$3hB";0 +,(/-yld:;6i;h^V>@ѽsߎA!ɪ]ˉvf5gZ<&%8g $=b<(i'Q˲3CQ>_kEQi9F6jKj﹵mŽmD.:24YRdqxb3X!ZF1 ^3ش @CԸ5~sr!k6?))p]v3sμN[9~c?ZF~VRpG8"t;j)Zt  Spo|"9hRj 1lF +}Bbi! C@ +@cX: Ed/^3LAUErUc3>abQ %n#SHv/c"YXIр9i=k/Eib8>1PIX3j",:̷h?(@DM Cz%\ɘRk_#I\]D[ QXL?f|Et~DE2TèAG =[P?RzzCfAwP87T—y z";VIq'V2`q 6sgtڟ!]GɔՅΩ yJT},x+T!gBt$thjԐP׷/Jmԗcz ͒HSWSm_r2؍Z?%2&\Q'T1JHG`*@N3x=3ǨE%8IhL 8HEQ&Gq$JTx@I!vVEa[GJrGeR½8Ûj1c CA7v9ՊrNLuo{{|_[@O!}rÿ'znò. BadaH.3">"*o2xO4R\/YA{ʫb>RrȤLSjBd(ܠxcK`Y-ȡH&F`#HDɜ>\Q-Hv򹽫<_v۽ҨI)*NbqN^Iz<#&O\VCl'C1".VObtC9~FYO njJzOIOi%vu^%6iR0Ud(u:lΨ>)1O=F33Z%U$KZu ; + 'Ƥ)|ܫ[EsZm/ɤp8-5H@[ SUUR..kɑRg;] +NO\ex wջ8rkOr Y*1`Oȁ8mdPJhkQCR:M`-IkM ?AX|iFPSb_`UQN1^ > &aT>Cs{W rϮ'ڀҝ"r>J_yWiJ@ +R"ftKcyChgPg ++9 "Glŷ*#QTʎAhk_jҞB?Nŀά5|0x !9ʆw@BiʟrL tć Yfp9cd ;Ӹ(\J?iUC-z)33x9@F8oI} ]|0-AĒ5 P~=jRpI|R Q l #@ڮ3SUH)#dyP Н݇7&q^Y<_z47z-:-A))=S:W=bchRCG1@2ݎJsB[ ߙHWRʱh/#Z#-.׎9ƅmԠ%Li1K>扻2$XkB ̅V Q&Fd;'ӯD~980>R鷺pGPSIYV>U lE4 :b] +QY8ː(Aڡň3zSZ)I$i85Ct:wۖrJV6.=6=x$JTMb + #@#K&{w)=/#0,FV~(:~cd#x>~e#3IʿUn ?eGU?i4fzەU6M#IH/DmEAg?Zr"7{8ԅ%mBi-i҉SrbN 1'ڟh@i9HG%42|┷ Bgj_*G5·U\AgT8I==jh.FErP w`D5&n B']vkARI?nx Lb蓭J{^S^qIgE+ʱ$tBt;W͊㍘zB~G06ǂhx?N]ҹiGҽjߵ1`#^rPi.wGQ*<+2Y6L3t"Mfي`="n@w8"aL +S8gt$L 5F8r{2ۋ`O#Fz t.uj(tt^ob8"U LT+/l'irʬ\J^U|=dDo_@Ϙj~4S}"^Ez,݈3L Z@p)SxҜTd+*Q,13oikks/;ЬO䘢UCOz ewxr zqRЏ? Q-wֻ4U +!+>+]WL*N}(6`D'|L64( W$w-.tyZy 4T7()5~ QXJLMKξ2⡨d 0JzAq΃3VM1{vV/A)@}pD8ѥgc´q!؛Ny S5Gs6{Pv_[%= 3)A0kQjSVY]0sA:|ۑL +I${yN~'=\wSC8x߫B4b9\޻#FvEHNZ~b$Oџ<U䰶P}B )()ٜ5B@!ml5FajBo{*5[JvLa4"h]cm:D{s`4cOb(&sHsy?!֕X!Pz:TǬCR +pv 9[D^J1 +LEb6Ha?:1Z" яmI-TJVOaq܉w>T'O.acjd: +b19oo!B!Mv8^D6%5x>6/ +毘wSSG$ +±hF (3*"fzIOf&А0`:L3w.RS+)ډg`H0qՆC-n.%)! 3d?^uAT l 1ԑ |X6=̧#JV>6"ڱN;uT9k{/l(Jh. T 渳_̻H4BX+L*(u葉HNHņpЬɻhMHCEiB`$B[(ȠJԩE`]Ge;KS \%唜ˡHes1 OxcJ뵔t)g<%  eI/}J-!J;GH2Tl$-sAjR59w/?? ?"9@"]z񳜁C;룥2(,f|yWU ;J]x* b L:uBZ)v"m#]*VTyS(gJ4C+.ΦG_(G*-lp"3҂$3۶ +-p$(-N,!㈱'oVH-J9d=+KHW"{T'uOo#G@SNSJ 6zrȋtK +%'rQ|bCn'Cz4eiB~/ *@vvd2d:㠚x繡XREf↔+ݢWҰG\̙W|B%Y0CH?rСoz!u AOvm'h{J1B>"UY:Rԉ͘%\/f +]0r`E(sT4KIm*]V9Vl\e/%әbqFؾGKyoT#Zt!=ֳ+;dO{gLqGaDɥFy@sJF/3)x \҆jS-)\> VY`6Ǧ-"8lp! Q%}N(C hRIxjbY΃hFңHc(H=xjOI>Y_:eڄ52W g`Art-N]ނkCdtU;䈡sgP!8v`,)IØ;c~ib +$\0潐4i3)jX-̖~)C3x/ةz'UYp':gQzTQ!*9GU1C-5G=LR#f= X.t' !$)n8N1CV<k+ $螤)*#qGl(!D1c#SѯB7]Cob VHm[= .+S \*yP]}FFE&5rZ=ve= Q_m^חWH2!G!uFG`WfiWw<'"zB;0жhd݁D@+ y lh+QqOyHLgp ^ f`3Z*0n)Ab X׬~JԈefrĬmښ"]WًiP"cT# |4kcDi@EwЙA'Y^D-.%Ag4҉qfsgPC8G(hZ A`h~p^òEƒR/F3}+Yh5O8 + `6"Tge59W7`(B˔ eM2̭e_G䋑 jMx^5+̩d %f&>ɜ̬}ǻC`W]K!z~ 2h hp,4̐.RK;짋v=bj61~DU]qAGXA![^P;jqmSýqjvxC}Ex'Xmdm[Hڲ8j7~'.̉H^@)4\<|0,*TDQikFx1Q;, `Cst&y_xH찐" J,T1POE)q)F: #_Gx%4ʌ]O7hq) hV` &awT^z!.܈2))|P}7G';uF-5M!<K'i2Y4j<ė Ų,W(fy\&Nkz̒K^.4r/l` %lv g$pwe !:C\):?\SGAWh.(/qtDE$K3Mh|pK1Mhub{ZRWL$vۣ5(_'ˊڀ\RS{SZNW2n1"Z%yc%pTaf!H%ib؇(A7f_k|<4< nhYasI-k=N&vJ?r M҈+;Zsg,!udբ /NGf⎽*rT;T>frܝaaFnz{\nn%_:*Lgx>´YJ=D~53am5'+:( /<*i̿gy<RQ'Mt̞!O{(w@g-FnUWpg`l\adN$:!אV(.$4 r/W0ߘhO^b#!QCt/`=CfKEDSCϥz;LM#@wMD (O;!/ݺPg &ժjo'9(~m8hkʠjI|uB.{ ,B֋=ODu{zo70$J -@c ],#s͏Dލy/$0QZ"ZS3Eb9b&ϔWp亣禹T]Wt~Bt!ݝϴʮsF:u]J3AH hbGi9@}iJ_Cu _#Cpj{d5SrwTi 㷦c)wCvotWQeޣ4SOEy'!Rj!h܃ 02VO Z+ZdOsѬh#B8QjօRZ`=O9ޖ}F`#b#JO!'rґ.;l UΎfУ}8_)(BqtO F5ҿj찁 ,\TLE\p؟Gg<Gi=\#|Mwہ ZOuX&OUz/"P#ɻPbCF 發(ibʐ Ӎ<5aUB}0 cO] +xH~!_*^ !"->Գxca/-ѡXV +C8@DŽ?Ԯ(3(S +W9qV~G )GߕBSΌ{}iHQg"|m@W<4a +@ԀoN:f'?V]vcW2EML%+xy__%R =0+_4uCDAk2Dyblkl}&"'oh:FU@8E{ȣ)8♈.L:xi8t)ChMjD9 2z5 5D1BuQ2FyZ +$f,"̳Te=uWB|oUbؾR' iTe9M/"mTec͘+cỔťuaPe4yi;zuE6|&!UZ/5!܇Bi.p +L`dYMVARSS'ѱY!x 4[NAHtOFl!Q;e Rz|j](]{w=tgNgD aq>^N -Wq5ɼe;rA]r.="_|[}tjgdċOJ^hmGu_oO3Ɯ1P1aA^R!6'OSJXQy@qt'+w<)EhCQS ~jgcϤ3/0(WWb[ɻH*Ȋ.mA1RԨ!CDS/'lGE0LBy~F4o"&BO&ΞS!uyުCXQAsYGéX_}n>.*;2#=EPTO{ +NJeET-f3V+Fa,}=.89.#>A͛gLV YBuI%.ze@gL5n$@7D}hc(}؇cZE$6SX6p3g __A`OA}?ċUQ$$6}] PԨdݧܯÊvţ_iib.;Hg {=e@j'љ~A]'Fb~* +Ќh.HlԐGH>aJ|ՠ>v/ǘtE}f@Sq'L//bIH囃t,Hľ{?jYX.UNa s%K $hΊi`_G ` +de4*X@(g +jYz!~nF72 1=O=Wm'}᳴b@7)_`O"m ] ?#ƤX8tq@jdnQ]M7芒 Ǎ  +QG2/)# +! ivzgrv.qyyt䇙ړJ׈"<ɼhPwWq7e;|U?BV8 M4#naEzWYF2 ]egJ%LgT]Uw|zj B /VWc]w)' RzF޷!f*Hwp" [$/Όy%;LjVZIAdL=M%Tns&s 3y-rD:\!:<.H F2'21:yIOW :dK$*FwDx#K}*g {B΂fP<="oXY +SSCRgoã;#+c6l91sy(1! v!|<s^v5J/ 5D &'g&@MtR ]*8-ݴz(U#ÓQ+!UƄgMi$S={߹#Hnf@ +4J<ӯr)#B]OI[ș@1l!+VN![W&ͯ}XʕK㊂Cw\Ef!_`;W`+5li-TOQVк &:ҡw=(ߢiI})NDeiL\K'0ũ2rVa O + Ԋk)bA*NO#C4Iߊb +D%׀=LJx p]SeYdpļ``?sd9]z53 #w/̌( [WeVf%<$؏:]C%J`s׮aL6oY`W!xr f\5OWM8mTraNR:q*!ȧVRw30=oC?x:mfh-=*-'YpAHO2j]~]-yq))vw  jiF8'vh|F=@i^Beƒ޽TVEMowR3&n{xZjg c/2o9PPz,P~oeM's%r7-ƄLHHǟb\Q{ _?/} ]Eq9HE%Xx>Yzd1-)]b"x#(/]LtUA`{ _~[5&:kNE9X-Bx2D6!T]7-#u+(=("53:HuS/l8ϴ*=C*U5.zՕf?-d9[kf uL]B52E~[Ol@>/єثJ{KՁpT8w}#Sp=D_ػxoSso ӑ-4ZSzb"mg7d +fEKZ,l9qwB?WJWX=9/fᤨ D 7c.LC&Q%e OF\QoW],{{383bMMEi'- ++Ho_lD +W4@G{pFB4ݎ,=@<նDShA2gh^` zn%_KsUbqM }ÔP~},̬J+9*mSYap ѹ@v!aS+~-L;5"tאuו8vsROY` hHMްT 1/:c5A?i*J%o1Pn3o?"wol!T"_eRvcֹ4d%`+i>;.Sqp2'8b6#xmٵ;{"}(٣&1l'aG-]BhO/w,>l{l,sN! &]1sG@-!![I;=BjPT ~іn 锗{l$V۷HE$v2s_f) ڑ!'˦;4{O#3( j!vߵBrђ6qqN? ֚2gdq 뤰U-Taq]n{>10yF1knU <L:*}%/GDg䨯 0c&zi̎QM)yor~/i1aqE1.ޡje)4fי? Z0aP #M+77{ ]6B_1/,\+dѿE6B <\9I7 ç6XW?Z+;q|ɴ D2HƨQv5mSlPA Dҿ~ΞT*=Gvm~` (/ AЦܠ]1 H'!6Z{8 9Y:ȭNz?i_$ZAWmH +/Ia=c%cHdqTbLW>4]17uHQQ]$bO?K]ܛ/힜D*h#_i7!X +Gr#P +ܷF'IzщEʨ~9饃 W + `*$`bX" ̞\ߊS1;>##y% C)Uȱv˥Q>c cTSHg 7b剛x p٩f[2c^ӋW?bt +4xVεY&%e))q +߃(o2'}Kz4ogP ܷbт0!;% ĉWnF4ɽlqugÏ2!;awp:}s+iUA7BjGI_1c*֮"1KO"n:@Yetԋaa{0vb;V]c)&H;C]FD4DBU.Q@P :sgE؊rV/)#@<~yq9%H<^ǡC^U`!fz˥㋸ҙCGs?T'7,wG1?Kb@|7Ӝx5\3t͎/y׭ĻdG \r?lS,kgu'O?}khe#fBhZQ}dwԭOu'JOP8#fud=,_;j.b= +[!1b'O-- 򞚖!q)V|>'`hA^8D)".|CMRK  PCZ + D;(4pM-T 92M@!VPQo(4>k7\|^5G]^eHkv8 DD)[@@lҔΕRm@+z-:c00e7% "ȼBĔJdoO )S X'F .w_KG8uQFZpO#хקLW@8I]yJ~E:2A[~p L+7[:1fL!xdSPB'fN<~5Y_P_]a8"{4TP#w~ DԠu;}~A?.{H&!9H9bEP h?m₍ $'YCKJ=c1q` v|L3D,}YSl)dӃ ggWܕw~#%Vr:5ܫ%1&`#PבCﯱHEʑcnj /[^sԓxN{ |R2Ld) E%bbg¥G . |T4cNLLZ ֮wԇ;Y9b5A%i4Zׂ|L1D4D~#%^cu jHOSD@.I(68101YB]Or)5N㌷'w) EfJ4 +EFŽo{<%Np9T@. w㝹7褜*_Cu(sJʾv)1FVwO5`=[78*lJDVv6O6ZI{3l(g}r?hrM(>ҺcǬԅ>Ңjg(+^ILK(4,3&]WL&]|,f[Akst'te+`phe73 HPDWy3zJU%QbILj'52+Dd]6m/2b??gyׂC^tEZ*aEjq_^ueѠ GIDvZzAL? / y~a% Z~Fx'`7͎`8wO7 ]UW3>_ -K͐H- l(I՗$:ŖGO ږ1z 4F T3B *eb[0FK9_AP\׉o~B`L%~cLN-]&j!xK^y+ݡygC3tW! jY\xp I7N~teK~cF|P[,CxOkbBG%nT"~Q O_#?ܢayz= S2=\ie3h]ȏƮkZ-NVL+C5\Q¾qPTB諈 7v 5@J 3?{4 p?yS]9R_: $'CD{2mYW@L [R"z>^-D&s')DA(h_l{i!Pҟ}j*qHG006V B} +>%Uv= + B]q&ܮwwtOY/9ƀOrv8L @;A9K{G174,t! ?|MRSr6~qXĢ)hļ㫽wnxpӘX|5JT䣤zK_bI BbN)C>NO;cp% dYy{;)4ŨZ-+QxE>ٮE&2M!1/9`F gJ(ɣv/R}9Պ6T%C땡==v+a?BJmAƠذ#dަE<+4Wn{ɘ`BGSf\TfDt_+]%{{\GݟEa';T-KKNu +wLm5( psx[Ut=B|+xW`}Wچ*B 5fxi Ef$+cWE,?c olЯ5%AZ6x} М1vK4b#[ۼz$e%?¨SaD@;{#=.-#N +z^;1 9xb Ŋv_,3jsDud""2whn: _FMs j12XE3hxŢu"Clx=Ȓ֠ ˚y81i)4~r~R4dO\M(18fj{ d#AsԭH? +!ť'\5zB Bھsa"`YY('C쌊u\f਒||‰P(V1F;+T"ii 8#YxpKKiGfgZ\~qc$b5$OBHޘ[ <ԣ&!4΢de폨t.sɏq<״Ȉ8Ia?gg4;X JCZ[+5?.Iy xXئ9cy S#Lwzp)KI1q !`_Y>!`Kl9ωIU߾GhsqkTWd{5iGOY O-GQrg5<ɀ!#c_n4 I$W$}@Q_;tqR^b +YGk2/fg _wFwB  콊{]o3i;uxx ZvxE-j4]b0}orGUN(G;ԞzP+zh> ͱXΠS@x#x8[3CgM'A&9Q4{7P}=^YKN, >!N +$5L/M5HŠDOI&"_#JN_ +ɛœ T4G?;L*G(cO!:GxΝg.JڨuuF Ph(; 8]zTϝVO1[8},pDEv 'ikQ̆D +Wma#G-I:y(M $>4%fM#s + +ۨHH)sqW 㫼{!l؁hg>c"xTlFC"5qvL#cIuM]ȮSC'SoA ]9΂^.Lix{;y-T81aI+00fhI:CwW JAWl-F}3J)VmwTG3TX he?d{œ^uyǒӴ7ΪAӫb';!\gH6gU#(caQS*,l:*6h?O8y;>BW f5.*HB5)rGUi0@Wm^hZ'h,+U\OOOОJN|5B6 i󖅒Cy Nw G׊Ǵ(gd* {_AT i0{HIVs>g@2_QO>aQCɡ&OEʒZxZ՜2 Q2RU!9ɰ$ +Jk +"2#Tmt5hzeiln=š Qh <[x>b_<[WM&UpQ\NJJc/lЋ$S;^͜U:F̯[0#,j_fHޱ-uw#C{@F$/+!?t@3ZSVj߻ 0:mԀa0Pfc0Džɠƽմ1#zj-2_2Q \?" ]ZԯAJOl`Ë|5LdQpɉgf(k+j [ 95TҧE-B1 +#eIU63YbHWI "Bȭ4LnSRsdI^^ɐp@H&y +=NU{JJC~M6_ +!t^kV)zR X  Ե,h9ާz܆ qYUظpgov4t} ?eL3u8iא81gNw-w>\(u^4j$4%msB2$i{׈IKBs"ݽzm:QȡzmZ#)έp׫!ؓ,έ(]հğR=@YjξrJ2E J| ~M|u#K0%;9#=_G;bloQJ%yDpI:u[^+x7YgdjT#jp|Ȱ' g=0 p7D- zǞ?8n +P$&Ԏƀ@t4Vʻ)h|l8aZe`ZV\{29O<ܿr6R.Сo) F$ZC"hSXWj#{bx(5HC!MH%($=cm1YX<u@Fq)0+"$}bq+-IH UQ&zךg+H9yW:|\|jh2u`?әea&롽 C\r`ꎠ=MIoϿK3P!>W@s>{8%=Ah쨍'2&#?!|3"OgGc[Q,"xD|$vi?z'[Y'|m26&`|ޖxU1*Gjg]cTy|W ](߇_"YVj X2O2tdo`z}ì¶8X` } BǤY${pv m#8;@5A2Qrc]AYIov/օ0rEI* 8R)xC%?^O< + +o~T<9ف2v@㌐9ʨXxzR7WLVt#?xU Y"*(*$裻&+\gpx}h*!ZNE֭s|cPQ|?fovlCTO!X +A=Bd6MgD(7vnՍk1+:AJpA;${DVp:cKg$ɹh*{.oP)`_?GW|yɆ"6 RDS8ߛ݂z\}ocv఑0N#6ύ߸kOi‹phwy9G;D1J"fi=apHo Nq l0O38jl +hxѽnBf$wƫdLt*t{zP1)QC5uտidڟyif\L*KG}A/1˯}fe%nx6֌U)`(͙: ڭ7g}N ^us-՛r˭^?GϨ+lGRZHC9z.a8?]swu'v/B8}AVA0#eP@N+/y#E @u8}PWncg'VGbI)gQs3˴*N ʾr*5_dŢij+kazDĊU힟!]j +-+5l v!2e$Oe#beR'+tcfHD ++N5usӯQꎀ)#:pK$ ^(C}mF/EPk4!Te"c!vpNp\=X,V`+}XwB֪!,`ņ0o7Bag)b;-AG*ʳY0{..:/+rj/Q3t^K( TgokT#AH:EV ҇2\#պ;ʙ@5z0K(S.<˫ȸE@ggXayAԓ@OvF0 Lo[K#A QO\ NU%f+i{pɛ:{KML4KI`Hښ]/7"):q<%zqv{"e%[]#c~˸;CT!zv;!ϗU1K`HV}z`xi}ycHk.qwG:jM O"",.B&+z7 b9)$#R.Nx2LMА"W0HoL?EQs*Ti-T}uǮ}K)b$DT珺ãS03j%D4$h|çTT?dyW,_~aӮ:Fkx/kI?i$7gݗF<ӑ ' _&#1LHo_[=W3 PpSVPZ=jD5_&R-&كāX{ 2%G51)SH_g b(&\;7 %\J4$ 7\ +L爖è.D'}"%KkԼc\xU4 @cH7`#{"ףT$Y4`At3pw܄ڸ@CJfY'~Bh`iFpGm1NcHNw0?+$Ѿ&˻ +S&_52iQ^iCKHv:IP˻tJm\Z|~bo.C4fpB`ej4!ӽC'HhfyTP΄ ~Π0J\G!o$iɑn{Q '} ޭ~O}EO)Cy=PpY:~ }GAMIQ o^K|yή|,ڤw:`(#Ɯ+=B{%c9#}N\t?|Ch]z +%;3]'uxlePW{K#Pxi[.L1S)0B2o1=4YpWǘe}q}YIN(fo{4$O+%+%zC: +7iN{,h_gb̳h3a6wMXVźy@ #ԧs:tBSMdg!DHV:9y_"~ihӔKoSl ɟ/?Lr@BMd 0ؿ3eԞNN=yh蝈`z5ah/_]eF󋎴[O|58$?gN/׽ЍRP>B޻ē:#КN!R(e^P'le"9 !s fQm,0w3$㘼E7pa(IH,#O=c|cAB… +^dqS_WEvD +]YGᾞh1C:'Fd&j-_dإ"^WOQ +@yW倫TNw&ĞZ&oc@<`mnjBjL 1Wz{Y_ɣݣ48;sHW&Qa?gR"6~;kM`2ZVc$oPS`ݡT\%#CH2ĕ="hŹW'Cmcx_ΤZ~( ziAX/G=2ߨYiWs \gn!}d'91ڛ[2NvSH=Ez +ui0r')d2+ Qn(o*qJܜTF}`3F"@qZ\Vl$;E^av~s'V@ea+")E!l3 ϝ +j$l5BMལR`rh9=Ep9""LOf^1/W3BRRFeMx[0HwHBFayGGMJL/P n&\B#za\(o*HAa۽QZJj"v <z-6B!!YbW!n8Š4ᅻ {l7m_[%7B;*y tM'܉vvÕj;iݬ`ope);xG5d>gt#N^?g/}'LKn._7sCXfs;ꉎt#e.V32(~{A:8DH]*lܪqzYSvŖpBgZ5k~|olG_p3n*#tT6ꑦc3s5- :_;Z$Ӣ)A.vQޙ9ȣvLph"$/vO28,[#J>Ҧh4b!wzM|f)<_Thzɢ`)o᧳4!M;wzAʟxݟDr7fr@} _⽏%|/56ypZ %3j~{K}]Lm7B!@`^T"!(ЈvD:Sf^Cl#A)Db[%quI +u8ސ jCMy-h)ER3Ǧ)Q7 $}Pp0U&V؁ \sN|CRzf`m `;'}0F*;-q>S!pd@j"J;8""~ 'LG.'eDiM|XS K{ *}/4?GF{|#h~$>9}` Qkӛ 9̈ k<^2qt}`>PE9δCN^eDl qIAU뗦Pq7;O.z[iOG! +O.2w5pUu.ͺ`[6"//'b<"}~-b9Y[gegߧ"4`)RHup q?#y2ɕK4DE2UP\-';D`zَ`)ݖaDEdhoGbEѼDRA!{BEwF1 gLyu#zCl #F  þ[*(=-tSȡtDV:|lD:2cEsFNTU~(ui##I@?a-שͻi +"u]t]oWpN] XkJ}d`v`mCRI z(@Ժ#jr}y_NÜg|ח`(jP-RxQ2n-Jgp\%<ⷼ?CYohxUeWYU0YZbѺ@oEYl,-6Zub[Q<㛖djHOfWRcС<TwBX8Idل0}:ދb`B{〲u8Dc,6EGW=b|4Ost,GY岽&UfߗHdBP6]'˫@Nο3I_ Оho57zƒ+az&fOPb]jDzsLᣧZ弩b_^LꚐ$e םvL1H:2W`91;| +2:U;BwѰYOt5Xg{o`wqM=@R=RºPaxc"qC+{,oI/.>"5y"&= =|D,*Q~_sb9:(?Q3}hU׋—IK?Ƭe({ dqnNl*0_ 1 1[?JNO ztLϰn/& { [$%Kˤl/1[H0G9"ƠjMO +q= uoWdƞ}<֮#**{ɔFՇ[A%KRK1呚 ~_pG<@δuGA/Xo_aGWſd!kK |봰]}Ta!=@mTbp?+w1||%ScaT@Og/ED--LsA,-UDž}ׁPݧC8#o>q6*~ /}CXt)=y*FOXR~BR1dGINLxRc? sa|h $`7B42(m-gUbNR+ɽ0I;d/hE;8f#Ы*wDC5+OS#w!/%}+hޣZ^qŽi-էj ܠ/)+rum"V_}mQs#ܙ m#&1}!2Йp%= E]}(# ; +4,Hvll3S+Z:(ݞ+@.| 2d'. ͎5^fUɰ +IFJԧ'梆чl\Q~~_ $aW[ݣ8 UDSg(Ei}3P&ȗ@&S6w._Y' |@I\" ]vwEH%wJgfBӁoMgSh3[*P +8=NNB#@#xacp|['ut䵐+#bF?:2SG(ULwl +F@َT<)@cy2! +8Rg.e݀GKi?ҨsF +9pϭ l>c/!%[00|y"RR8_3nHdM0K>q:2{ { mdzwzF#zkM7mgܔ>x<C<8 98ԻPʭ6UV&( U ,#86a0}Ň#yD۪VvVDp 鷓& Qp+WS}U6(_%m'|%ƉЀ{/N9T^ظlꠜz M1C@̧ ˠSĴHQ4j~ pX*FW5\+-{h Oʱb΍j/-2%~JGhbabkLM-T.;'E؊͛:fB%TŜ6g5 M6ky +7dZhLcqLVFAΣH)z/AKWD,33]#q%h0X;VI |GN%*UIcx/O'[iRxpIUwxp3V6м^y;W 3 +޵cVZzK׿o +>cgkPwk.Y ~T_0Z|h6]acpb4HX 8{EꞭr_"- +_3Q53ˁa7AobDI0Ij!}J?R{۾<?_AI8P%`-O<#إR;kM[xދ>o|7ɗlA%_\jpGzEF:Zq"WgYI;&bVP.w'~*oeh[ȱsޅ[Wigx/Q(}lx e;W$y/ߵz <rDEGɼJ` L=FAjW)NW4M'8ʒP1W[Y(Ǝ+̊vc}+.u8w7>{Zl@/Vw9JN !Z\%1Ph.ʻS"p+ML9)<Т"im^1{O]^7+9)WH~&JFn:X>/ya]̎Jr̖"=*АY"`6Cgq)_]~,&||}D +V9'@|cV,Wr8OI;"mE= qݙ뿥,W/X{>dxv +lHhƌ&O Rԙi 0E |E^+UkP3:W+(b~ v.XjjbUqG'&4 j 90; I۫AM7RH:ynf Z-Dwz5R_-AiIE6G5Z!30-?,(BZZHc:cdKlx8סJ Gl5Ɣx\CÁ|]ѫF'p )G EK7IcʑƑ'}+Upu*0ػ QPj *|regTD"Vq~d:Jo;e;g݄=G\א"[7X%<+aOέb#3*p\I*34ٽ?q(:ln, xd9KQGivzNN7zCJj*Cd9'ߌ#~/EkMr4#9jaR5y}xB<i'=&v+&b±ľfC+( ɑk!Qގ$v{+qR_r}M]P:h3KiQP/LOd[ԃ1ASv9/0B$( s4{ds$CPwXpGG0",6~ї▪a +mNUe'/!>5HMM*,^=Z3XES Y GpVs0'q0crS@z~N lyu ܔ}=gU" PɼFrh!x`^ +&ZZMJ3wqV7c|:m6^_izWއG)P*="S7/W(*Pɶ:@ƎwԷW2S/. ?'?DTUcft%S"ː"`V?t#*s 4 =DU&1nu}G'0Oamb)9/\zl?WB%NdX=>'?>ʶX읁hj;v~Q?9[nį&=g+6'ro 2XDhl_- +G`KRA:c ,83r)]ϫJ +7 !. +Q[= 9J#L,8y@ Cn93_ +y:~X>zoDq\M^:O[JTjoՖ>U;Gp,V ROpӹn14| ܠ~?XGmg"$W-J o=5D}tS|d/I#B|cRq;Ŧ XQ̡~fq!SS'GESXӅBO]qE\oj!5 +p*N| _ ȀWUĿM#n&FGbE*@8H8wdIǐJ H`zq9@&@IDI'j[Sa~wHHf#%t +fE8ZBu\jWC~:1trF<'6n[icD!#jAʑ,+ȓC`u|Che0IdJiGy^dPlE{R_5Җ@#Uzj96F9>x"x"?EpҪeqw+@/@^P R" RikFl v[C4,E_H|hJVpq [<λ뙿 MD + _TKvJVU_|_=,@ۤ/\9M8E@w(k|M\nU=o_NѪ}7':o9(+]㓝D}+^X?75+x] <@DrچY XVe1w*? +v +~g?lN!!Tc\":#QxlF[Et16 40t9_Y[zaWǻcgo >}ѱ?~;-! e2K]g&ֺ V5(*|"",rkU+\0!1EV}qDT@.4I4X(4"-.[Hp1V NR@8zowpdLwJY$ VC0`ڊİJN)$>FL[l#oZ!_w 0fɢµ +jnXm_@r?AZ:h䟪5drK(IKFұh#,k`w8gSVfwAvN8IۣaL +w Cd3Ou5=ReɳηҚ!< c[8 :,34p'h.Cn<%)s,GƤW2f"j(l1A3&Z%tM oQbڒ)3VXԠa$ [Y4DL;?X%/34Tm>GW iZ&<0[n'7-h/&Π z;]7lA\oD?m, QR^aZ| )UM#pX*O 4@; W.2nt#Қ;ɝv3YNLUIӹtf@u'OG EhF=uG*[EǠfWd*|C7jP%Z4de> &߀-v QP<PU*g-]1Ho["y2?ߘ_VdO_KAJ5q.G!(whfDu(RZj;Kz #y1G6L,ם\N{9(Rqa 0{@v@1#T=yFeP3k$g' g $**OP<;էSԱg7z=g} v|nQ`<\Nm?CF(ei iqÿ뙎Rpi#SG${rPuz 9#gܙ|̩1G`.u {d/)[E;DݭޱH%Ꙡ=qFuojwv|JrG 54uFՁM ~s֓CeL +W5gF+<;st_ p;աNq aG`г};ъm10K@ =lXM)8?`mG_!\)mL +yުu%3k a݈c=M u%2J*T;ޒM§x|훃a^3[Cp?|=ėeqc ľ.旞7_r _L?bGQlx!@&3{Gg4CS^)4hnPʉWq7joBbMym +@"p-΍|,#0dK2ȕŅ,:Ҷ2D}_ d/Rg/&Me y<99Y'`8Xa2Z;6JPAucS߈/ RmEa}ycO{,Gz5m] +}5;W9 kJsFV647{q])R'H_QKѣ>0t( ?uۅ㉲ʍsG|P.ɐqӛOJ:.HQG)Y#H9hd$W --`NJ$'I}d%ҝC ]ýv4`x$|`)Ҵ~8yd2/fz /A7ONTgg*T_h*efI`(]{ +Nx3(@=g%_gBRLKD$I1$bJckLAHBϴ4R=,uq'[60Mi3OHa(tQ%X .pg88;$f+h~ޭGR 9{i;~$sRLv'CY!ʛzKM9 G6nXHA6ىGӈX;zԗcFڰKe>0z̍ά/˝lGI<)Z%P-6; &%RsxGLݗ f}k'~nd:Yҗ gг"VBн +MNΏJ!nr]u<4/̌9+*887W]S⦆9;0OViy?U2kPR923*k ƞ,ɳETeBCja*m g ).Cj> hj(},{a/سG)V_bVuۀhmP!T+A- log=W&0d +-qAIJngDng%C9f(w"z"ήOԝU1S5AO|P@/N^~iG8c_Z4Gn+ +½Us!L,U:.48Dй+&,un7C<2\$l,Gg̝Jqw@F&-?O`n&b>7ddžP㳡mu~g葖cMR)^P!<ʰ7VZ+^'o^XV|}ޙ~G$kX=,ĴФ\Y __Š~#sz@rBkO6I?Y~- ##V4FӝD +WTysPXDSK]p x%h{RHsr&"(ͅD|SW֑w&0;ofz?eu_cJI6PAABH%9|ƝF<סéU1zH=Ϊa=_OeGK ʊ'bg 0><2CM{2 +Ć+Ar$qKԹEgGˌHJvf Hg Ζ(\y@Ãsilv/1СtrL窕Q9$Eq( CS}NX[ὐPs"1+@D nhd~cn-;!u- jWi%?~q'qI?K~T&Ț? +;I=W"Nv!j(?%NYRݏlo2:g)k~E~QI:nYRHdԉG?-jQo<qF. L3ʽQKJix`2}n|/=e^}zD312#HuD>{a`X-ֈI0N ѺmaP6k*>:֠#.a}風O;clXL ?Tj|AVjNBA5k$@)팄ci㵳VvkI ,~%?PAWJ{&+pOo|/!}T.CgM|޹<"/iuOgn r_Eh. +m)FøYsǠv?;}dƮ}#hvJ2s*/:-Uez䖤sBe>D|Sw~psEW<[qy#n=v-sc넍bM5lj}t"g"e|;kOqjRTP lwTkz+ƣqFYuac[CEZOb.Z۫F7ר3YhMNo)_gۈwY2}veG˹@Ju=es|>anM"Grr!AL;pU}20ӈ&SlOti,diImqD\ˀnN`gr2yYA@{)]kȅA!k"^un[I^x>`j w0uK߿v`~F0˾l`|RC4++h(3;D.&#Fxft+eL~H?Bb4y֐溈V 0!rJ*Aw}h^kt"J2#" ;bCIc<1Q˷^>G[_N[I[)r~ Gܳ:(ujߜZrGmh~nDa2ѡ[K =qZ\~cÛRNxG80{:X CB P؁ +Ϩ`%Y<Ȉ|^[7D\# +ULi6S/Cȋ=gxH=x࡬Yq]q4-wP=z ΖKh(Y.({n}v`3Zԩqp\ +r(qRR@ypLvk4J{F"u4Xpa>w]QLw:2f2rDVzSP i,l%)8"Un8XVj+WQ7^;MMEj>ub.z26d}M~ЯWkuŃ&o_ 3\V6'5J!w9j%tߊi[uEuAyrZ{aħ/yR +qoD'&kBg OlT8 +#9XUs0DÅzT}1} 7=g榞JO9J*G|8QH:e`,Ky}Fza_)0˯WEˆG8*M LqkKG=Fg\zSrDҒz٪w:I@ u h?g:*qLe}HؠœzE~g؃4VGϳ-.@vȪ)c:ˇf B HDqoYLĶA˓ +b[ǓUnN87WiVzz'>^?lN9JCO)VICUI!kdHgfL%u)t{4;5Q% +TvEsS`C=dž Gxlrpk 1cxYk9=r%<2k"Zr*D  &Dv;[wBK +`yaFi""SAr!n802{(YJàa$k:ƅCCw5cǒ)-l{adz!I]9 e)̈́[Ba/xkROV~GdW00'L!З@g센ǀpmR +>TZ zCpH,Y53+*cQpu/)!򟡦7S"J,g^0iG$YKoS!YVJ+{ʀC +x0Z;y8w0WCS e(YŻV}sZ]rTpce$oQ#4ǎyf2F9ú(r4]eBĀ&e,#KUbyPn(^|߳gMogֳ9.΍w+LAq_<&3dhySwzH+?YyƝdCaC`_Lg>M;bK)',iθ]K_?e򫲲'{h*[ kW{>]|Wl;QuM+X@^(d + _kN#J:xD¢1{H5W1å}_#D2g&8(y(xm81g%%ұo5 }i"c#϶VCGPlu*yҺ  {$ џ!,zL0R? +ANf:.ʹwUBۃ58D2Il/I}x +8} V{NuF(%9Y~+uG貤 + a%Ufԗ ֱ@/>(JE)W|6GxoAg%rb׬`?{+-4ry\C $[-o^Zi)W~1lI02MtII^eX1/rUP6Gk"xJ Ӯ&o'ɰ(Y0!ۡj_wzɘ50hݴq1a ՈwfHFT2 Q +GNve䮀'!Y?C$m#by!ZX>龧ݔYDq|2~&Gu|We>p{ƭ%wƍϭRnʩJ@{ w#x55w{^ry9q(hE!$)Q)ϭw l=;[ ]Gz-z;G ] 7"Fz˙X,n=gҟI0K^Z [s1vV> KT>e{`}*A7^:|׵}?E_ KzPu>#$8M9P8/AZbiW6 S?1:%)&1Z@&8J)IdnP\]:28Gn ٢֩(lTu*AfO G(pE63xGXv(]u&-Z3)aPВI9;J"L͠u0|a𙈖7KF +h{*MtI re +v5FYeP=C闶\wU=A]XC ۶IVU@_]%kvcxЊG_,wt䌼ʰ +$,z =yy]8=s ,׌VڲT3Tp>Xzץ[k?Ҧ~!7Y Ka)8H*գ]B 줅مGGK Ebhe՚<8bCT P\דZ`9v0cD*xNF~4ǎ(gH$?E튉#Qssd\3\w!w\rx8ENi'B=8a # S+VStvK*hֶA!-N*F33<15"8"3;O!><yf{]ol>N;/h%5'?İ"4u"yBYʎUZpvE#ujϐ@3o-T=p^י| u' drGđYhIkT,[͖m6kMrg4Qyr9%PPTPIc8mބ@}hiڮ*&/}nZH7HB:ւ| ãJY4[?G&p]|fVAJhd\)P7خvzt׎tP0puN%CmOz=RH7Y"b:QSEfSX+T|mxE'_" bΦ3zK(}da@8Hj$Ե ma(5ۨ{뤖6WKThGI^ig9hLWCQ|y}05>zhXQ[@Grj|^RM藬;S׏"5XSGCvZU=HZE`7hSjfiaδn#~kG *zœFPd A3EneÅZ i]$ZiBP: ~<LuBrb17_f-aH\}FD>S#ȫ#; L܄6s L8ݣ̟ε_eѾ+Q +BQbN@,8 +w@r5|/*vYI~(m!WBi+z :V^:y"tbPq(ι/s0:l7>BЯdԢ*ҐZߺdz˽Yѝe`Gho]E/H. iNW ўlp &>ՀK5_>9U"}B.O 6L%Dʒ-數y>7v W/&CSMSh(&(@=:А2A>&h^q!۵|D_4 z!w#:>Zhی Cg3rmhώ^;.݂TA0uhaF݈*gP ++]km:G;N3"a?SBTQ bn ziKE_%^DwoV{zWB "XՎsZEl*8S*%g;UN%ßb43sUdxf\(\w3poZ%,;Ao-˯{;IGԏ4ܣQsڇsBzuֵʱ3Iȍ#jK@gv&1"z$Ac}3˶VzAbYZKz p+|rE1$z֝xbtnjYCFqQYh,BtjS`Wrŗ UnPe@!3M>_!*4=ahRg_{n^g77!cl&Q7'غaԓ$=} >1;{?(R;g";'u؟6-h֋PU¥h"% YȣgNdSYy3r#5D4୆[1`^-eN5'ٽ"9sFwv=ʱ/bztFՄBʴeb6XAҔ_$7B#vB$êU=)sqq39jD aЈN$AHC&2﫿/ilaݑXS#}>E1kfYFr|Ru9QX yU ەo3=&9nSzRg2?փ G_ҍzB[C+2`qU$}'H\4-v#h$$|Fl'"@gq҆J"Mu٠41+"A5jS +GhW؎ 3̹dʇU))A?r:[=r*ٞĨ 0든PѨ!Wxm1TjbŁp A~;^U)I(^Dpn +P E! ToR%w//PSEƶE)& j4X&!n}T:b2)=hLkȁΎH^} +yg06lS+; +&5+I, a%zRDJuHm|ZʪHԙEU+ +)Rr>6O@PQ -(H+ڸk3L{5=Cf70Qѿ܏Sλ@dt\ %Ԏ=\rly*cKw]G %/ ˘4+:!qBam;KK͋H暷w!ՖA(.1H_4Ư9<Z~DM._N- oBFq#]j|cSh5+{gQ޼"P( ++)zoLi6};u~0#=&#+JYV.ї%"Nv)ax&IC.NPI$%SE˷w8@Ay}Sm BP³\S 6U9C3i^:S)me!+,Ĵou)mD]Af{Ra gc'?Dq#T`]7Z>ڝGhsnLFO.$ϊQw%_\˧uhtO~7}7ڮJ?0&M 10ّ-3eWzv%qle`+ljZu_ 9Á +N\b.Rc`.w4n* à+|HaWgD"=ܫ%tŞ$ %SqBt!r0?[8ոg$()אUAI\$L ֩eݮyFEξ;¹kJ|zw5sn< gz c'ބkO l. h9V@`OC'LV:)ݡӴQuG#iĠu9iSkrx&eA"Ra{p= GN|(ay#|Ό=Ǖ냹N3o'M_HO+O}l_wy̔&Lq + U +A;3Hr"Qbȩ֙q-v?>ID/Al`wf^ +!-2lirD &A!bp,O` `laqA&]jH}AbLoL+PW=rS4jS+l ^wV8ì tH&:bi^0^ t!gXTˁ/q`R ;u U$>~TUF(`Nwv\lP/)ίR})}3%/T\sEGX?1Ê2'I`(g]|stI4[3d˺_F"C~C%"p{&Sdz# XL&nvdN|!(rS{/S @hhEN= + @,Q2W)DA^/":k'{❵<7hB#@ZWֽ +:LڱEuǠYQ8Kl)]5Ĕɐ#k:!m +gNش:.RhABX[#25%jIOmIhSq=*,H񠲖H{=*j#Ie7[*@)- `}J cA#,.EXeM MY0obU q,EL?# Aq\! .m##@۔v<YxaY$y W(9hfyu1d9 )B [N5TEx?hZ Qb)g߿?UZ4 +RcϢqFf)H$n/諲eYԊNcjŊ#VsHwO ȟarڸkm%t@5qrh4R4 }tvk!׳& m}Vyʹi)󣃾7gN(UA٢J, +d s*߾X_ȪE;8*PUD endstream endobj 50 0 obj <>stream + ^U [9(Z@ڔ3iwd #>h%𶆘jY{!eJ^1I\߬}F+%˚^+a3E0//>y4 ;vT.&;c:#@Oz?Uh壭7sN)R\Pt\;C8j=C0g^Ρ| )(FbY(q\(әh t1HS[d`Z<qTtmCdܸh`(ou*o 2eMe)4\(NJ&zx%LLYyzD^̼i`rf}Rp>X{} c3dv y(93ZS/:|b '`37䊥8[ B#15[׍0=sg~*OJm?9Ubx'8rX_]LEh8LT(qEgM,B΄(XgAh9њCGz" %#i*QnԚ'Yשq"VˆXkWpΘ#?+dIljUfj0^AcYNjvWvJI8Ub@o6zاinjwgض)0\^vv9.W*Ql pE'sHFaZ,s>i%fϙފ_>Z]32 iǼplQUJo95OγmnDL,1$NNۯΏڵ :+VVv&&/,>e{)_[MW/h}L̓~пzTvWdX!;:S~he}+45HuI 5 }=hJzC~d?ð]7֢{E##:8JEQPǏ}T*<`zem1;%xOLz&N{VB +*X Q$bqEBX^[sTXJiŶeZZ^wmvxO<0Qr$uՐLֻ49o [(lqz2ZAU5(!c,a՝$SMYr+anSǝT+^" -ّ^zq۴MۀChP GFt)B"BZĬHU)W1$Y#&CF}@֊Eo//Q)(OkS-^ǷþR? ߎ"p.6Hd>k|t\I~D kH?IA,vfOG.SA䀼t"1K1a8xx:'۱?~pĸGQArt%*B{{jz/VC{heNfzɸ#rN-!dѰ@{y5Lk%Չ# 4]z1gH++yU*_#Rοd!kA%NSY֤o@)ms Q qc^O0z흎#G>Jʅ"L6k Ɔ_"pATOGHN%H8bt>vJX9ՁʹF^H h+3)^ȠhW>Ț^23V_΄@_.UdJ\llW7g5dG]M4*K}DO5^œ_\]qR`S_SKNȕ@\ޔ<5`⦪BZ^O("GD5 iO9Q%9_Lwt$`'}g ԣ~eĪ1 HkAaB Ur,ЉΔ/f{',?s}BwۻyvimA:HYP81XHI42dq$:(mQWI}5]m¬"2\omթoL[ө ½<۾RKŇ 5VIG&0"|ӭ1WTFAa qZ)= +KN6i}|S_odoھ;!3z uxmDkHoUC O{zGd~_?o;vv{}?!ǹALF7TF1*/C%Ŭ_hD[($j,C*EZe,;S!# !uI"+\u,(z2q+d뭊.wTteژOI +iJ:(,*%yak΋;SJ DԒvnd8jOjURѬ!f} ^qQ:SEGܤ(`LUHceTk brW!Yy+Ml4\he(tGE̻/zz~&5,C%W3&2؃)o}q::*Yku!\|b\%B_%, *4q@HHe&|M4\4e 3c49wzQ4xFŎbe;i]q3?jzEר*KS' +Pe-xzal)j^uK!@'ܥ,8X/%ץ>0 +-gQd~'KNk%w d<}OMv};ۍ K$D!t+p"_Wꂫ/ C)"2Jl'^'vOZqit>CZdc@RN%XQC.fW`&mBpڤq悌g0"w`io0,P-R8+POoR3Z-&rB`ͷ#=f&s[T l`Y~yb x>C6jV &( w3+ :uzѲtF{8r;$m 5kږva4zgBPj-/G(wK\>ٙFluk+hp¯y̒7GtEf6Q;R^J&{Ow=ފp[n,r@wQaŤahcG _">x~dީ%o7wfXX)5مX{4)V)_D!ZQ]x~ZT\)A^ٮ́4#;ݸ5aGApv}//F^I'=gEפ}ZJb7Wb\6E*bMN:Xd[%WCIJ@o CfK + )5Un3;nPJc&9lԐ 1U};)˓@jYLmskZo3IA~xhWoƿΨVuj3&mSʑ0f1ր!%WhZfvL Fd/\2zzoxsc(mKdNaP=i!~aQ~7ƬT^[_;_9Zh{jmrB8.]tw"!;K >ZScYpB^{ 5EUW)R.:Ӿ6~8ESٺUcACVxm.^ϖ3c/j45[9e?L m4ttF 5-J0~ Ճ1xy%)WN3Q޻W@ԄGlL+2/_ fgPRT'2(n5m>?R|Ƹs<"8>O QO$j*-AAkLy_H۰ͷj@DEs\}9͸,# +9僛gNAkmD2e= *>2$/Z;-:xv9ՎF/\%rxfCtQHnQ?b$ }>;s!O{/NuzzР#*&127f5a W2r<&Jqn `b:<$3xqչ_0=0ՠuWk> אt\nGn٭ ٵu95 ii#>V\Ib51i k՝{XDa ܸ,_ą&(ϧz_-i$)@H4hT CXezTG0m"*B$;Qd@It=3?i4DŽ^}0E z"^rҘgsG⻰1#7+&H;4qg.Ɉ[u-$q6#:2b(,QDy3~tRʓBs=˦`-4֘+*t\ͨ5[QQYjSɈl" hDTgk㊭Q 7OAMd/aNOiYlɍ~w{FLV\Ѵy(X !_>RJ`B/Wr S3ŷ/ dsU]c)f̲ka~E + n?F K°8a"b]nj)*3B8M>=|f}.{IF|jf!i{Vn]k- ʢ~#TCa䭜*wSgC=.?FZ٬O >:B)s[byزujh_fء©W_ U_}Mk_$8ˁNg!4Fb({:|19Zas3jp\"htL{G9<%zt=j_슄dCVVx`,_+k%sK@8BE|VqFDE9ԙҨgSW, +#(+`rIxmw=þ;qrɈ TeJ4h2禄;q +LH?Ň 4!-3Cxki$@sdfr5Rۡν\mCOjS#.f#t*Mj)8>3Ez| +jte+Y4C7~kD2NGfĺFPCsS<4^,-3w{ Tsl3Ҟ.ADR/68 +٩Ixw!#ɝw-2X#WiA4I1nnzxcYm +nE/C$5kol z_ϼwĶ"6Jj+:zz%Ŝ1KJb0Ū 7[>BtFt!wEG+[~-'"X5dpl.vA{Bp~s,&kfh:=}w i\vQָkR^p*@-H8r{;6DY_-RkYكS?>1ΦuՉ|dV|TCJ2C`PC'FV=h7?J!1d `o: u9Cgs%z7p]MV;B!π05vhYgPe"|o%.A$:D?tzR')Tv˜ խAk5BI#TYк!췶hTcCs{ܓGbPYU|ŗ$měaQfĠ !Z3d:f,(GRkzzT ~.Fs +AG BGp' eZPu5aᄊZ&KT +JЗYa(z0l3W>)4:Xy4  =nnB߳ӵx{)XPخZ$e۴{oY +7C+:g_%)w FS!ڶ爓DI_|{]܉UʌTjȃp3\Ft1elG\FMFbnj +ל&wh*rz,Zʳ.+yU)\Fir>l0d>,,80#} $٧xb\H[+Nw֡؛A;F9qS}ĕyz4ȑf2R'\~`k_, 0${PBFI@_䰂Dv)Ip~YET5GA@Xfᰞ!­U,o*w(8_7189]:˓[X );YK6j@HwAsyDpۃ<,HYry*Mq3ĶQ +t`\<@.|:W0[]OI"̯I,&#rẁlHF \ "+ VlWr^wM^(!0Tuzo=x#8+mW韅vL9G%m~ Qj n\^3d8HZ:Lw-0YQi0(< Vi. l<+mQ$qIKImEdz:'Elm0\x4OsڶYLm ZZ/nhl3;6 s-p{2,g?i&Ѹ ?~i|AS:&O#U8iTώ~ Cȓok,{f lpfӿI(\4pd0(TfL=h}9 "n lvzq͌!#,c AHhKJy+zT:]*sbO0<^n3*I~f.9o1n.S|H9AO[W ,V+N@%G5V 4Hm +V=HA5x`ܖfq)L=#JAh|Zyl7uBxS5h~'65W,3)E6e9WZ_NuXUt*}Ȃ,S!sWBZ(`#TuםSaN@Q YOG**FvnZIt' ˰ErR,GoaxX;;cL= o\ZG]8"rZ8yA~?)͈b1cWiB)j|Փ5<&!zGvr/aJMxd +DXba{!\6-V¶իβbY"lE?S0z!AF2δyg|;Pr-a{LPk9I+ԢGJ'x8Ca\a|*sd.):t.f:]ܰy6±^vU@~{PgjJLm#֕_bTDZDTը~N=MAcwG"ũ1f|rC( OX-!jT c|95+(86tIwfz@*lRԌxTיyrf B6ǎ;b%S ѪGEk~ Xs?Fo23?[ĺ@+>]z߬PŕK1$GW/.x=Cz6ѵ6CSD?M_kGtS:ygJ_A4m+ho{,tv?m"Cb)-XRDBA+okj)!Go9xi Ү1h ɡc]z+:L d-?TnQP $ˠgG2@ {ۈ&/gk6QRA驃 +tf7-^M!ImT7{]LBg)Oy48T=W+Vh][7vPO3GHzA {*i(o;5[G\R/]W#j#S6zZP% -Q߈`w5iڑ%ڔOGڌ +1K,T.@HiuO1w̓$^ҽk[NngzJpOfXt 6AE'N'ȜLpK0ٖ"GjR2z{JhWXbNU+b9꒩萀{};ld*AV),cr(U|]f_*Ǘ6iY@vpU%O;$lchڸSST5t/lleas!h! VIO1K+W4i#ͨf[vc H#47i>::.eh%B;I_(Pqhrϧ &d6)B ݐC:] a5y U$ Ĕz$,)z4N`;/CT9ďkHl_I*XzE'i&o_ +FDFG`.ƐU{Dc'mɅL#Z&yDn%#%$mmDtgTn~=bLF 2:1ި꟩>_SdvTNuV|t6֩9Uli~c7X3D+A7} XkkIL# WˊF|mXC =^6Sðh xz8Xtpk4\j߈iJ6`hЗFO׉D1)O;u]F/6ӏe]%C⦂&0VXM^,b"+`WOa}b,]0 +{knp}bO3'46} ǁ%l(sN2);QB Ph!9usbeDS/%Zh.xi=>J 6(!CnakC' +z~ſP;ӫ;hUwrf#oyCKA0`ueه:w݃| ن2$FY mPh{m;B?2iު{4vVxr\# J44ޞ!bL5!BȮ +Œ| ^\7A.~}!0z8JzcA8Wɔ(ݏ Pq?Wr +k G& .34F uJ'{WhFT[$TJ]^@~ZЯNCrlKK;g"S +Y7 a+[dpH +).:dݔFmZvQ5H[ԫTң85'EЍj?ᆪ{LW GlUvT(NZ`v#G,1lz"Y +@j{FzFgD Sލ^^p .}ik3:1tp*L,Eu,ֈh71?diZ==c]׊,IE̺PCј^iE COOqds=xʹVB+咣4͚gDPCh1 +(/ۃ8:ZeK8) 0H&Z6Z/^\3 0F +#/>/b3-^S>*!񠊐 9IvOT}GB[zAT0H{9@4ϴloL#5<9M+zPതKR-?=y@eRtMW $?`1m2vp#g" 4L>F9-# +:Q̻KLG;-eY\5stc͹o鵠}0%ޑ'Tel>h;\U_ke&̿O.9\1tVyt|;qتqT\I$Zeq5fl\b1Y hGZ5kE1)%2*)ܰkg|l6Qu w>a=jZ#G+E+0Fbح|+6uYw=:+*+-t_rggy`r1pZzW[l:_w)DF/cU֚7͡R^ Ub zsяN|=W4 BSXn#=t5lakͽ7]mQC!i7%g ;Y5RKϟN}XPu !ym{ @B%^S%ۼ2 ,!F[!'=j+\˭2$lLۨH*z83غ`,A$)nI;3ʖXbӴ]OḒS]e*[:`eFr=T>}hxMӱ/Ǭ1Zֲ:SKҌ^XqKF' ,` ]YK&b UsW#dBHݹ<^?ѫ<}~oo=F%c<?qu1&_t Yb_ =l,#Ӹ;F5xפm5>@qܓH\ AMktTvɗ; xQC%1|itD8D#<;L.Fi?C8::N=_dAl\>Q>b?w ~꼲m 4&P[pHv<\D<b`1KP(y޼ߟapQ[xakל(VT!iqh7R(8Lv4zfA$=kJu=2t !2ğ+0 ϜJsXb1+iC- N1pN Aꊧ멶 |PjaATxWw4@K |8 [(? &".93$F0h.Ag7H#QS<pR2H#⭚ny(;#y}~]f;R,ZYPIwlq) Wx}CE1ȄGE_+!8EF?QQϷ~dCg~I(P;<Ck:Kxun|n^lHǕtud܏l![p瘱'zdr.#Onץ4 "IsA+ujmאF'xN@RwD^B ~[z޽ +eedb?ޭJRp󀝱v3mH_mZ)R~[ A"n=&]qEna*[*?b[O2S8 Dtd=΢ +ҕ!WWkz[X F2%)X{q\lH&K*DV[hStYRC7^C.֚\Ϫ\Bbqx_qn_"Y8GybD»- ǰ|JF!${ɠO9R;M(xi cHP-k(QBzqWTJ e؍VpO~lh=^Gw ޺Gd1*!ΛX oogyFT}wśRf~{vNwzYZVNrYXX J|!k>o\f$,uU^KU3`*qr +YĈwo~WHݵ#CӲ rC{ _X83"۞6y 71g-.׍Hbeإ"I ( SHq|> A,\.bY m`8FPIMQjt`#JtǍ + 3bWɚ6!T=eA@m-}_1-24,]'4yv\ >YMQǖ>f#N +/d/+Tx@J ;V)~ɮuJP>ZB9&z-TA 9H]WCJcڽaՒRЫeC`ǷU~>Ǡf_b?K8PɽeiCHX\}ǷۧZ8|_iM٦sU>8:^)*RO/E'cv:^;A`]Je0hQPhfhIXU!,Gi^s* +rw=Hqtm! ֩·hM}ޭ] &ɲ Iq TkBp-eۯT5ǹSRA^]q8y@pSZ-N>CvEYf'(7+˛<_+bs*8z*.a%~Gu/"fcGvjԐ +X$PR1ϩڵ'NdGb]0b=BؕRۤ;i7+8"ť[ N" \#~ŔjW6_l!Ӥb -.#ؙ'D+oEDex_W_ ш#h8ɓI zB6*i3QIvZp6hg?s+RǙ?^C,}(4zL"? ;]0Xo%}C)&u%O '_{3D_EәzDcQ( |=_o[l];q޵0Rܪf{$qzl/D[6%X1Ff}/Ud]o9d},⒂Gc7N5*[-nvks'!!.bQqP؇lh  d@( +)xu5׻TVgH/ϔ%pn#.pEw{g3mA=t9>C`,}'~=A Ӱ?4F-٣׫t<Ok}ϙh1۱! 09brO15ߓ?>SI-AYVeqD(:!+3 !Ja#|K4Ȣ"K,_TDi16? Zߛ %ڹ#|ʒWIFS"V;zo ^.Gp4\ +7זܛߦ +4K=Y=J#u}#Ik[]N +#WN,c[D%O<æqlmI{ mJkYq_Q:Up7F~"d`s M5wg/mqii"F07vUB%\ZNw3)قM_I +dD#"o$d|vb<68ΊY1$-T%NokT|}] Wٰ4SX_.V&Q 4\Fe6Fg0s{ ^6{.Ө֫rOO79р5Q;ږFqy +' 8'7=f(:A!-HSw^!Q.b<א-~j)Y#X!~FOH  g)zOB܃@+xH_s"f9>#`(GPtWЯz] ӕt0X'L_纔{%<<I1 +Sc~3$@ 8SY1>xOٴsَHUzK7lI\x w7*m|yX* ctF10)ϳ$LI%IhXvɩ>J# ^t@#gZWDiV(9ᏬLqVc<`sP;R1Vn7xiafTjݏ́HKKw)_zT m MJs*a/#tKovQ\Ns}gh^]]ztz ˫ $zg}ZA!P2 ,;p;̿x(߷ʾJCi;E<|CACsiEzz4ĂOwryC@1'}D%:lh l8sHQWE;.8>MlwVU($uUFՠ8OcB]u 9" Yr 1dċ ąBT~Px*`"5}zyp)?Gz\/L a\+й3ě;B["@#ñNqi=Bxy?0pik? ͭWUf'Gi~كVثnZ\]e{K='ap&߿ء~̺LR\ؼ8/9Y;Z$lwI1!$@`ໄg|v +>)y}/DT\Ftq?(@*ϠhOdV, +d.^@h#6Ǎ p°V-Dփ vWg\W.HrTz< M,4c.H S_m!Cz@DEiu .JM2)AAY} Q +3CvWP-w2!8ι<.U`J⌑ ' "8=F1v-|⩒(Un~ GV77?؅۪Z#MJ"nPYߣJ1WClgHw\!"~?" } TG PB8|3E녺PuQu59<:Lu+j5+Dz_+ +t@O`jwRɀ!LIGA&vT;/H"}R-x+OaXYč'3NuCL[bAg)c] {oIC)[{P*DHmbP59g{udC :Z\,9{L +ϒM2;>=O~`דW @,:f@I#E.U +6H6y:Z2463헿_ 5=5L!ν0i[q=^}RF WnN-(F4B#:өFs(PhH.VYn{MHWE"r 59ABL-ci&&\KsG:t&ɷ@|H;}W+y3 +פ`*l@ +g}\@.Mj=ІMtzANP˪6[NvS)Xmw B8WCi$DkIPD3EA`28.2:6[U&mDUha6 >s1ևx"V0ÙCl ">0 pNU;9?-s?B#8nY-!EDsJ:cߚW_~i1kL*mĚD[J{ԩetd[LoAK2-ЯᢣyrtPK @J,\$e+>zc 4M XTX5d}wrBH+xar : yc6)aMA )(lkn<UT$sȑ3^.A{+$W ֓}x߹>70((: H`feMPa +b9w!kTt/%&_~i#7Xd> NmF,BW<\ѓ.M#keWnSC[E0+bixF2G BI/i{(t] +-j[/S@ .6d5AKכ[N!#)]5+wnӭAgΈ:ďqz#\!F]kƵ$fҎrBYҼ퀵 +Wc:Ƹ@nnZZ/Pa^ĔΠPE8\}Vp3Vy0XBS,Ѳj7iiT.۴W*%t/@cԩ: +KBy2DrV͊lJ}f.0\E{LA0`icwfX+L.ك_|HuLtL[ C($ߚ WOm*h^jFBTsnn=M.'w .9=j4{=Я߁pvz'RU h.ڲa]_L4<%9p%+uH s u{.%%!uDJ+}`rڝV2Ca c9ݟ!Zג% +AJzq"uzZ=4hҮ2[;vc7PwPߎ37??:64v]Nr20+h%2ZsW߾wqnp&:n*\R1@08u3YL%_ąG5Ihڲ'ה)Q܏D浮!%(͌^ي.v"C0`NݜndVC(m)7"9"d@zy_7F?t橉 +FvCewT8bjg.98>Ɲ?G6M7@nwPd*Kr] +^`C(,=s@1(f_cB$zF[:]1k[bLwBAT|VȺhJmlo|[Id\Y]yv>x:FFC[/V 7W-<PMS\_M3˄ŗPjC3vcʅ^eXR-朮ABl}efL>**kVv̼N~ԝ=E1qG*Y"H ̆b3?3a}Cm5R: `4kr" +bg<\AGZrE]8%$R634HiADB?KZ>ʌ{b.K%ֶmaz;ɈeTJ9 `NrJ: +juLf34h`\?PǖHKtRUbdB5q$s "яҊQA-hKJodOYU4ittSh=?MJ@;*-qbeeNn:13hN4qÉb"QUrhDQ;0Hg1 r`s8]]YQg4_1d a\5`} +/@ a+ R:2Wv@Zق; _:Ї8e畢c`!쁨~ho؟vB/\v3s<* ! I?$eHۏt FCJ+jkUkO#1 W Z[j):JQ@6LRf]]IǃFWڃ."B|T4:FbwQsMMD@r$ϼxzϝd.Zq9jRiDfW\C4فdO.h- kMڞōJ_eP[F8*/ ކE>f@d6&kMЅOd=ݟS]IeN +%Mg]hn~BȊul?y~hm@l"=zmd)YK "5d]Qlޔu®<i%9E8lZSݰב,O/#> DLo̞Ʃ`bqL0La|U{1y$fJDmFGOL=-~;p914J|ԾiQ۽4?BosN;8 61<#_ XCBBwZi}Sзr_ibl[r4?gxʷS[z#O-eoA$6+i#eԄ]ԑxXYZbyL +0Pi"ahK>z6D]k f2~+%^Zot>3> 9I(T갆PP?VWXCF3k'?S{T@uHK“K]~}Bp=р70-xWZל}_g i}VXdtb9g5OƶkV_J!l6e0.i0Gf̦wWUnuGGc=!z1GEbzN%l[[5 웰# 1@r3C=C02irN 1DÙMQ^f:ex@d>xOܪDXd8Q~?/:ħ9a|KR +NW)f2YI_ >$-2$UI $NGogp6ĂV¿r*K&mZtG*g\(&RG][$bbJmp+Nj@A)n>TmfR2C`~gUqLt^?RP8 H4<Ak|Xߍ!) [:Ht_; 3+%X:x=&Al}G]3$z ayg֩< `+#G~J^yc=-J5gkK# !76vK ~Gfѣ +E*n +ؔxϐ\~yZ.*JNllo^ޤ6S3L!q~k/FFZ#,.aLF"ekZw +wx}>DZUh R5aV]Y +9N*bQzpJmfKXBo"=r_$VB$zX>W'g+ߙ:1HwDO(WIx[9ו&e%[jpA]j_6^ v no6lգظjV>VhjQj5ͺ\ɗb D`(N(%F=b۵;OK jD;қ:·FCň'QGa[1}lJa+͚ҥG,' s51 +Pp[ +K#EW_mE&.]N¤{(M2c[_+"VU4Mbqf?ġW,S8v>(U!',3P1%fT/s7^2zx{T@ 7(*pO6t7HKudzg\N0*(l6%lCߦŃ̢'K!0vxYYawߟbX#IdɎE5  v-AYpi}6#-*mȐEQAN2NϜjnJ +b6_%!:w|SA()T*?茵lh"S0o7Us9Fuoyk]:9-£uSȋ;@О-ԧo P{ƟVK$Wu0fNHX6MQaV{g\NlҐQTBX0X$ ˸=#֢V{n-˳DTTN:Qץw.dJvod *ji/ł RƉPcHqEDv#>,g e_{5dG ֆRӊuhO DޟA}Wz9†Ws$$=zFL ,["ShmXo-b+᫲]ChӼDRȐ7Cܔ/Yn9w7}+eA[]KJJ7xlAxj 8FW]#=62HϵRCyMbT* |0!+Ne\]o(W,<8Uv$< m_3I;Λ=MakZ0#*Ru)2ʩ<Եz U_S@c\ڡ{JO%CmWݔŁ\ 5LGR3b]^J҂THxDTORCbp ,׌l!tW AX^W۴C1 ߆6V #i uMa)Փk9#mҨ5VL=I05[ @FꪐLq!Rr7M~ouG}Nbq>̙p\>||~qFQYBxODTrfD_+ p&ŪbgM¶^@e{_ B*)٘Ԡ+H fja05I(ï $V,Ѷ"ct1b#҈2P/9 +ǚ@d% W3o2D#RٳAݷ#p)4zҸ-_ X1 GABN,o=w}8ƠJHJ:sB l-Qc8\nq +:\?WǗ|dpb^_[$,YgjR Y t܃lNI*[ +aي/(f|7TjD NCi:;sZ{ 1 +zqqJ jOg t7$ŽHtʱX@T=n$9p`<>5ڞ_F +!ߞ_TKx A5+@F)"߫Bh 5^Lj. -SKe +[h}{t<}4T#wVYNe(H!u,N>MN%EpS}Q8YK_3bn+UBWM/ 믞]Kwf*^ \53)HA)9K2Vۂ$6%21[5*$V'Z/(n꯽璂A"jvJd 4*5{8K c@}+2=ǡ@8gob78z{DlWthV'Cjncx=">!; ^[I3Ѹ> dBdcDuEQ!^rW+=EXo~K?Oͤ(Lѝ'Gc:KtRe9[Ѫ,_ |N{3:}'. ̉8Bٟ鈣"lˀ9UNd)R5ZLk>B\"vԐ]Vrx7+l83̪&@9to (We] umW+ \YTvnV͠K.ur_XW?^LDA|w?={3$ =DwW*w3V'@ "tA ޷"':<__e͠7uP7텵9UDͺ#(zb<L4G(=e?kF%屘4ce,[KP.vL]ШH$\qkvit w@kOu51A<܉orA"0qsF֞`l)QGكK̺\T(\wĔ>uۘ`-۱/$p3=hk\+, XQ|#6W@,~]g}*ogW1VhycN~DP!߽fNiD~=.|t>& xTO9Yf$SL=Jy6hdgH-{G$6#MCkLӕ[`n%' +x3Aoe)s8%Y (E 0WBB@T5Jμ2ōY~$\H#6:MvN`׺5bT|p(R5/i/bࢷJlzCr 1bnPڒgKfxZS7AYaqr~K`<ִぱ*x=B'Ie{Ȝ:@gzYS돬Z~k=ӑ2+ +>%}s5XRsjd ƚi;c;qGdO'}-};O!nshk@T2bLABM J!Ag GGϋzF@h:}M<}q ?4nb,=ʺqȳ2D<nM4 ZW +I@V·uS# p34, +ޔ_@  5; QsQuOyrxDv.5*_c. US(8&Dnl{w^mU69@e 3=0W87Hͧ_xPfKu$.ґ SjgJ@q&0Rд+2}6qdmMC/?bcrc[:IGRTaJZn1fq&j[ (H=z%(-afEIfǝxk3bw{\AmeF^}-eZ÷Z8X˻)k=MPIhG QOh]C`VhgՑN+k? |^OcuvɕU%dž衁F/{yHO-xY [xYGQݽyjZQz!ܮ@ێaҕ>}ۈV8&ͭqJԨd!KJ<9ә<Ԙ d{M%/a^>x~oZ(}0qͷM4(rPTҒK}t8`)5 ؁/]۹9cСt׉'!rF n2 ~о5ƈcYmzY^Q%ެx^zZCߞW(R=-̲T0u&5DP<,PrVa y`Da+\Ng58pcJ|++=橾f-WF(W iw$>7ۙyK^A5"r>{IÜy쫄2!9dY{^u跔Y6#!7,.BuQ&hg߶ehUzmuOii7[rbGz2<54g +>E;6)*FCwBՒo?Ҥ/ҏ~N%#يO wȔH!=# !l:׍ emODi 75\9ݮ}lMDsKr-Z`+(#N \ CW =:շwWIrv~\uq"=ܣtOdd@dE 1AS[@ewCRgcIp{!H9I{EJTtTͷuƺ +zu=Qm8L6E7y9`. rRSS5C}$ +E(ݖXWŵRmE['7v>- +A,PH' \HUY#%_bzgKp}J3|/fRCŮ\՛KE7!rlS[:B  ? f-kP}y4KB`Txcѱd=54)bZ@/6r>|`aOLZW@UTU,Cu[w9<[j-ZLz%N h9w8}Bo ,IDȑκCӡ\B&fP1^aZAgQo<ߐC{8pCkd٨=C; s*rMzTmjla2"/:#h43TVؚ~ q')+,<= 2 YQIU.o4cBUqqcÕ#ZQ+N0:mҍDV')3^:9#Ԡnbl4M:!`U@o:6kTH ndkYM+ST>˄[w G6kGc?B}C󱱷|ѤK<=HY8 +'j9&z8x` JXݗP+P 9w{p?UW (WnF:X-Q{_,}dj7AT*OKnRK˚X ZlH{DX֐g fQGuǍ'|%Y B Tq1PPOl-;L(}XV`Am&Sql#CۙrLh>N˹]ex`4;"UQ4#-j^! h`~-fiKǂr3N}-E5ME))\w^xwkI!Ng"kxs]Wҗ՚x8iw D+Z1ӼGG, JcQ3xCNVF8]3O(URon%fC5`M ]&OKG.±+k!f) +=_pco |>@*?w#C/oθY…*du?PKPPUC~} g=ؐ`/.j +l6R (Q>թ*=۪"}QgXƣ60V.{M0NNjZ;J,Cyɱ%cXCS@oK;Q++~ L3+=[(iDY|KzoIj6&Ό`$kЎԖ{h]uhYw ٹRЉ[ Ĥϐ OWR7t;& uVP+'0ж&b}oSt֙Nɴ|[ ՠC#/ %n'!hstOśgLKIJ˻1nYǵL]b>!\&FqK'!iSٳ3](P]W =' -(YR}Os7XUC4N[IǠW „Twy#LprZ@M ;9beZC1E0rXX^R Q8LbA)飂v;p9M걁k*mG1 HP*1IgXM2 +)IS:i73>~ ؿ |K=7Jw]1jNNR +hC۵^FwkTx_.ZE!xy瓲E |OII<jfCɉFZDMӬG3dG[@E75-_sI$^֌h|^UxiL&np;$WLƩ8ڭ(hA3tܸC>5ĕW =tԚIBE#d!}.ԓ1.c\` rFRmòfD*\)]>.ڨOV"P_Y,o^u{$|uY҉ر=/aUC1T[?Bݿ(|]ȭX[5} +/ZOy:5JdV7d''lJ.$̈Uy M_jLdN\ZkVoLwU$g*kɤveEC#iIRT_6{{:J `)0846Pʗ$8H5])B*m63]Uq02-devsGY7\5>ft퍠(nQkLPjKoʍAg. +xQτjħ4 3$|jfA}%ćm)vbWGd< +M"g}bLao6O@;_U-Y 車 wrP0>k}cQ9lʽBȰS4V-^L c7"9/VajD+b?&Iw{D"'cF#ّR0dS[h/CƘzն tE+9թټԴcjA*] :ːp]Pkθj>n\Jpy^iKTRc j,KF D!%S1ZrġKI^WyH-Lg32! x@V2%򖟇sъŰS)5زr([Q Qv/pyN70\`e(:%b|?#M|/U M1!j}yԷZ8CrWBHbO >6KS'x?2wsK>j%c3QXڭRH@D rwHZnC NU&}2Gqc9brUu~u$Xݹ'ŀS(7{ D8e{N&h[< +O;É* mZbf# l<{OHћkAѡpgI?umTo8CHnwk}$>LkJisBu&j6Q};jfSĕ7Ao +6%~|CV$Y&A`'+MI$sB{3FVx(qpXB/Lu'Ay dϚQͤ}UD&R̾s@t/>z-^l*NowrQMfNĿH7²%Iy@Ól(Zzz4$,֎+ψ[|!fX:s#?X+yc̀cbѣ to~a8C8$|lt;@FN:}1A5w!s*a޽UW[LN7 +x-{7t#l}J.=¿TEo.i_ S_aZB)!%+gm0wJf*"0b"q$&mzt(Z^ՕӥQoGT%!z@E/,UHqb;^ w6\CYFw\ h~611Cu]#QY=Eb]ԇ]_{q JgЈi (maC؇1''ms{S C89Ü!w>5 ղQ!]@M|˺\viQ+ c](0 +xD[M69lcKY(!Np1Zp$fܫ![,◖N Mt2(`K,3#^99e}3C nbK[Τ@eFf&Iilc7фv !eA]asjM.p}H_h'RQ7⇒3D=^BlMA *,Pgq#,F=wy:65gCj8ɓRgP_оd֨OvjAq 0ƱT2n@u0㎥;z +}r8uzC@ _.YZR=ugJ8;Q!o WǝUCM~?׫4C1 Sl"y;]Zt+a'w>;i#gH5h' + ha;pjs*ԐHs% lF^NrQ2kuSƆ[L@4w 3}JIЉL6hN S`412VlӲ +um@^l4E&w`S쎓e/3xG2d2͏|6 +DK1ݬQ(zط]6ݭ׮3ACeZ8gy+u3R4ݼj~kcUfö*sFX+Ũʄ %:m@6=eL#bI@Y2cvdH癄?y,fOԟf=,/dDz%h>w2{i#ln#}NlLjwo졇Wf1)VÈ 8$ XRá|zKO|ͅ] +eiBSۦhIBj)@J6v21 7}ܓ ! +FOA8wώhqwX +[z70gwmY sVbӭM!6}[74UᜉZ'҅L[{oC75R͊s}իjzZ8xkk}& H. nFzU}TGeɫ X3S=ngHUqTHrD2pYYNAfbC3Aϻ[)vC}N +&WiPló鷱&Vw'L8^Ou}eWg*^e)A`vGcIПIx"3Z;ƥ3`F"U]}jѣʯ;gTV(6})w( 2%$ǪCU0J&s S\kU(.8Sw߱a/H7ÐXnĨ F]z-,~6bG-{ˢK3r B*è,zG8P[3dxp*ih3hMgm6eTpX#lEB RY + );sT3M)6S[1P :ثdQ@o]Gm~\U.PힺƆѨY!g ٜ<5'Юdo +7Ϛs3hBZy>qGwmM}\]]Tr壒wTo|$l+繪oQ: +H;$V'V + ]KJTghA3NU}nj@~ٿ6(~S bg8V3(Xqt३8>[]JAE(`?6Z" g3ƴ'0J{tgc>܊O&!ێ7j%TpeUꃦKG!nb)ԾRzX^wsABPwSdg_5\Va~$t@EyڪO"$P?tPڡ׮;ZQ5F: f<ƌ'93iUZE!Dh}<8?[VRj$sCJs*AN=VLX>h#rb!ZYŀ!RݣUHRS{egTAOgk9.3)'cju^h9n1iTD(W{fxC2Dθl>5 U5j4aPzy6UFDmbW׺q^~iN` b gJt&}~F ' +OKEⰕ(5I9dL8oTm +@N^Fz0֤VKC_[dÞFN 1 +M_9Җ܎x:>]IlEXcUУdB~UOj~ |S]k@P| +2 )gHNq='9TJM}Wcb[!ŀГm"g TEQ)" .8( yXW\BJ= PLD"Ke l, +IKeͲj/WM/7'43Uimk#?48Kb~JP<έfh\/ +n'DTC]w*?0 (ǯ0-R ˌ7l;Ker:h罔 $)GeF=L1Ѐ+bŠD *mjlrǟ ڕZHEѾQLo:'@' +Cn7)u\OIGpR; ~39IN 0 %@0|Ė|;0NGM鞥נn+S 5W[XjӻՈt.Db_ rq8@E2Q^hw +}쏻Ԥɴ^`jk&ɠk YU!kqGR~ V,LIJm;2g[A :\u5Xs +ҦU.iٽ-t\BI ^W;C(m׳X+YSiҘ̢nV>Rg +`s$K8YK:EaPW'rG ;Flx V߶va y!gZmjTtLM_,wNHiُZP(\eQfx/0OjmG j~#"-pеjLY>%`;xSqU %VwTOs VC]r(eghXK_p@GJ|0B^jxbi.hv sH|;}̬+Pb6秃i6#[?5Bq(; <&R;I{2ͭHǨI??G@ݘEA29ѱOĺmFţfKbC]`={mdR62/6}zrs` +kӈԦFА5k+>DQ— ^F6纫>#>Vv ֩8r|,=7>blpt,f+sETJA<00OahqӓYA[ .kQV!:SWݖeKnSut?KXz+nH!G[IP$rkPJ3@kqb9KȬ|($95NzxM޹-G51>#y2:Sg M#֞2e"l2\q`NK r+(A`3<«ЃXevFEe*^1P=iy!)mU4 z ZJ +P>*W5de:w4t}TN~كJjMlƜSbOФB&->]󉟜c3ȩ##)Rѡ{2z͸^mȐzzJdYehtt$lBDEs(Tn ]je458.<OQ` VNA*GgAO;^\fώɩK_biوX=3}g"A$FiI] E@!g %/'Lk4>DeHv+>U;ڥvEـۨLLXforOYC >GCnV1.CpoP\Jg^/qm%@h*]R^7zW}wXubeZ:<*'A5dR=-/r&j,V`JÂyC!*0 АX3V@P=FB:s'TsS'Oo]$2 8!~]gR5gڃiNaܼ2D+hI&_#ΕwE@FV}]!s '~G\ o9B J?!d;bc;J`k5aeO.%Yr7.n-%TllcV ߤ{EdgHrjW<#&ݷTJ x +:K#o^hrh(sn,ݎM 3 vndm=ND&[ſ΄M$ ƚb8k4Mj$H>p%b({$Y#LѵAZM݇iRt)èڭ+(kb}ԐuX\#="ԱG[Cֲ!F߉iY*nY9ixAEZ_ bhersS ih"⏠q)LBfCfzi-AfK0kǎز/<3~-෾5Y/gE &ʵ:b4J(QiGrDSekAڞuhG=9)-U[+:`ԸL?/xMּMsz=|Rn#;=3;|b^8A.2&ÔǙxyM +HG؝ļ3gsmgu5gCI/TixISi?fj@ k[C^$$x{qB)V(S"Kl-۹"1pCx[4[_tysLa֐=vڋP ,qŝ~SH[C6MT«Tpb\WgB4ٱlu~h= `!z-9h uV^o5SujкS񼚘G@aBʞ+}DXQI4h|%adsZ1UUJi:&r/)ܞom[;GviFi`7qPF]:j5gٙO8.T{3ONx'bgP}F q'*sLh]\yzdעۢJ%L.%Z!`Mhŀ%{d +z[=kPZe'Ռ8'Vf߸>(KZ Y )QVү +P!9yy!]]8ZB* A0>3Dpj?5iʐOrS_Ǩ&V> + +AޫLMWNʸPU|M!7.xF!<{{[.'?S3lI?6&JYP0vpoiHJIо[B}BxRwGvO)w3znK- =x?ϔ:끗{ً@@գ@ΰ)CzJ׿~"C"sPM;}۪(g Y'"fqI$n;\K~F)TV[q>3fq\u;j YM=:X"]]Osg@P\EeuS*| +&<ܝZ#Y IcDM Ok kn + iPI-=Cf7 9Lco@%Y?V,x`~|GV Aԧvf׸cZ!vt{ھ(f COem^yK` 61tw0Bxl3FmqLiSg} +4H&Ԙ@&g ‰ܥcS廨MEk:L8=KfI5}A#¨\P/o)aѸH)r:2naZp#)<2qlӮhsd$E)Vk:tBείgw7H1uGdvYf}r5)`%3O$h!M'58Th֗O;ڴY7}}n{'‘yAgvCG3#G\I@7mwFR3?8qKm1aX@Ԓ7W7Ixy O;cs:@Dq4_+HȕK6$v?7y[;VkrJ ΀! g5Onk22F=]!R>o]nC:M+ou6a3O4kR+F`|]ޢ03h- ir\s* y 1 hX*m @ G-R.Ha<|'yq`Rs˜}׼=ѣؽ.vN"@| +Uptqj 7,Evpe$|"o5 {B8ߡz08RP&݁CK_t"$ѥ}fH?-9`X @yO)cv-L8]f~}.yAd*'͙9,Xe+S8C+j[Tdg792)}VCјR0]a0Apb`UbT5Nֳ0ai֛9@qfa<ľ<$lڒZ1cJLrx--͓%/cfqs6C:dYÞ7dZWSݣ7{V8wubdX{Zf_4(;bI+m2>^h"cP>/J%x9Qo]BKb;މ[7kB"VȲ-&[_#o< *iĈ0 DIqlcS<w&?"`>E sƩ eI P)8#d9hn}l{]2+u6-aKBބQkB\Pu(+o259~!A"Ϲ+ܛytuiVEPAIϳOŝQ +D4nd)nomѣ}sI#ڑV9io:ĚpL[G㋇F^[ARB| ԑ=nM\~^13@r˰?HhAw蔗H́XHnɇ/%:=l6mfkr=vdN=!D57;<o֠6!f䍗䝇rRr%Xw.d(P+f!\3Fw|Ү++oyY2dCvpol>?Cf(X~חr2c 7KsW.`6afsc=e#cl(zxAAD5hVD[E;`K`(z96Kz1?JZ7ƎSJq#ce{pNFQE=Z J2[:ra2j(|ҟy +gQ{JQ` +4 +KmМ˹(䈣$9?;Moq}7.K~ywaA7|s2sp1{@]SwP)~)D?x\0GG0:D*^槧dp'}daqG2 EX9~`pߑ$p~S 𼪌5dt->IQ'X<CuH1>QG (Ѯ'~4b0O8]Fyzn<-虿A2䘨NÏ04R1G]併M_:17 gLIdɉL9M?~AW (9{mqrKXȯ2˴'o{]i;4rzcHz.Kxfd\\LH :UL׿O| r" @#gUP/Gc"mFxn +i艎.IT0ÒKdܭ}޷]1 L0ԙG*:p.؟\}A2n?y-_|p'X;ᓊj7F!sjڨ FFȾ/h秢ZDOxBۗqU=AXXiL[c6jx[ɘ/IjY>MŃ+|^GjJQoDn]8ٳHX+2_Qb>a\rioHOvDy<Ȍ*q:8O)bP69+.fr~ڥFKI +{oNLU3ͼ7O%h37gm:c㉨u_[_u&D&S״P5#y[* +<}#yQvUWanmS PbX?K| )S +ތy VATܾx F7rđP.AdDSܡaGo:UmuioPZdT=D@oS`t/&sEL!|sJ"^h+'voGjYgmQZ_zRy|똚OuYI=YPC3uE4%$! ;<~(S/65;m#=Jl s_ұIEr7rG\ڂ+Zdoex0BV"\Nlvh*%`K>5.qjDXZzU \IO ò` +piatEuՖaSOC,׶QH)-$*UG$4^oAe$]7ѩn?rLKr_\9%my*W?[ُPŏ}=wHN)c90(  bp; :o# +@ `X5 B}a +~~WDb7p[ꃮB暜d;dFz +aFݕJ:j)Ls[-YiLx=Vz0Χ&G<0E/S?;k[]D8Mf;fj̇G5z`;U~v}6Ppw4᡹Dֶ{zL@=p~գ)&`0yè[$ΗCe X\O_:9M|TZ?]Ci7]Z۩xؓV +yoBFn4V~Nk[ݶ?~7?)&iAE%b׽u>{#yY~=^1^;[P!y, 82_8Ru;]P~?֛8Ay.N$\>Bk8ҠFgEuIL7wl\CZ5+>KU;s'MX!Y|]OrO`Ek1Mms&\cIExX7Уi=x_%m] 񋿊XgKj=y:kyAqՉCôTĤ%m}Y :8&Nh_ܶI2Lc`M%Cd#'=8lw25HMNyZt[jJFoY_o<` d5ul`IOHlƈZ|CV-a-$V +WDResxc.]u+=Q +h:~|5fcpPV3 >ڶ6ͼҦ`0OS[DYVPeRI5aՏN=u,xbX9g '!ݑf']8z=(xֽ}IjUyE̷ ['}u2l>rql +]{}),:́ᾦc];cYyg6h95qgFچ9UC1q_ˑ:GDsF +[֒N2X ABDB{0UvKpMN/gl$0Ɲ:+="1z+BEYVOH[fFZU޼#]B7Uπ)tNLSF4 XKjbsք6v/~a%9,GykIQr[iozB7 . j%Mś̫ӊlSنeAt̖j+F ,~4{@l'^=sCZߞqS{^>c ʳ(TwV*'yN&͉շ.9c^[ s%DC +{{,#[%"xԟdΰƉWUޜmfmq*lo, b蒧9S Z?G~D6}E5ݒ̽%V%tʱA*yz'K&'r39up5dF?CAYclEp%1`a풓CfCbD1WYL|q6b|3.# +$ :2Bw%/(7{nR }%*%wIv4cFHc0Zt8w7ɤg'?CFJdjS{Dfe{g,㭮BlrĔ\z5qEzs ![/ fd1 +kxǴ: +fLu}ͭ%LIhNYZ;fy>3k]ivC {);lWgIL&@LN桳 +2On-sug汜26S>?xb=2e dї_gwdyHnzymy΍{%s)@<CxI#: +j𰛍=!btnV|SXZSN[:2=-OC:lQ:v6 \ӣ͇abG(*~R5sq%[>L%KyˣR 䎂:ӠIj}v}%UGu$H6= 'M*as>'} 6\h3C/m$(d;8GA/2 +YՀq?I︡_Wh*1]2 2(]Q6#hMC`H%LHKS2fK24]x%Y|k\X: #/Qq +y4dt|qЙf:Kx@2 ]ǯ `ej^VaVhR}α>a nwRC[7g-o,++uyŏ { uan3>t9[e|_n8 +6 +!k ZKHq/*0r&:D=ܖ7ize[G! (`u&ۄ3sc$L\54ǍKqW\X{ۇftkIM$J[\ȶ'}eD0p^Q _6ԎtR6vXUކ{c(ۦYMYs׷vIJG!?A@GG(CUv{,|#7ԛ33ViuZfٍĞ']P> p)'SƠmïHa/[&8p@%U=ӏŁ[?L3y_zTp6as8ڱ:B=GvhOR.<):͢zl:D4CVФDڍ[Qܮڝ<: FrpW;G?N]+ߏi&}|lO`=C#"Q +4nxt i3sMon@][|{Ǝ0mn<{?^X@O2 ``' ro"]2Lt:$Rˏ%uCn a"PVxxtENkъ 7(QwFwͣLFG nh&dx<*hS5>0iʧc"jnsNbK8 +qKL_ND*L"*6ma{h-O]u5%*;4$dkgyB[y#vjl9w=TN3RL OH:?&%n8td Iq2W{{(sNQҗ9qsDŽ8w_(ۭ !&iQcsLPdp g|؁PS<23 %%:us{N%n2=A8*Mk=\.{ 2OP0H>nU)#BB=m`h:hg&VNs4[[+ph0ZϬqm^]B&'zVgN& ZZdl\=,a2Qs`3VOykWK"XA}M73křɹ#`I̬G|jo+=VpWd;v;:|-+uZ<]_OwYûrSD:FYtY> +Ɩ}Rb$MmA]}T١5:S%SH?Tœc;2fa?'$Tt??_\@.I`û8^VEy ^8[&B>#0JFar^yUNV \(ƅ]h[{A؞C>6mq1ԹV1rg3,CVqmi`2Oajݒ{x.,Bj5.kRT*o̎iG?|97A'U!zzohސX2bFDsƟuctG'RctwTqֹ 6!Ov£k&bwl:gՇK>fI \E:$\ D%1_V*O,<0S^{|Mx,> z*G _B5c'4"*:,~Y4g l~zqTyb(y>xֻSxX2Hv67xBhvX$\  u3w#B3'o%R)1gL-8gSCWEicQ 8暦k#’N8Ol*g qgL\ONhFLRv{ b*ݛWg'Z͂!G)eqڟqcq/GYF;sy-emKWce| =7Lc\Ocǚڻ/1~t4Z+?NG/L+7\#Sp)H~$J"rYCOJ᳥.O,: +U皖kQ .S^;mݞIjbQ`uVg.^MUj\|K|+jc>׬E pjIbR&~~/8ն6)-\{*$4z^>wꘝr嘻͕aZh5eEJWyw~wқ 8hr&k$zGM+epy9Z:>]w7.Ciް+7tLO|R^cEObv_sak(ӛl0s.^邓F⧙$qq[^}txϱP3̟ЄA{g/C\C,V\}Hoڷe9:,8PÏ~G]A\jF}I:̟~`A{K8U11a,XKOp +QkkUIG&풠%zb&4sF>{ȋ$=|A߈\2#6B!_euVֲyxn1?~|q j.hvlvo9xE3WeKR۽Űwأq'tGa,ԔH?_ADSc~uv 9")xnL-5 It7}G$5и:6Zp*FY~q 7V"E/N|^FO h!x fJ+Bb˗s;zZ.˕&Shlg$. +uv,'ސέ%2`~)zɈ*+Ŕ"򬁴"DEQ70mX/@;$\qqi3'Ymϩ++az1xy\?T?Qج̾<4ő9_Q aG<\pJdU#3a./U9tR9[^.v''Ar0jEnR[Iޯ0VB?۬T U8C +߇Y\Z_j[ǑS.Qp1-I29zx_Ϙz88gyGF0O+*NW=PC"S4WZb_CuHle5GCB33@a_8uJ| +ejuj$fٲ[MS "=pK4w az[ʷ;}u'D U aGK%=W~):X$'c|_^jK\"Giyb!Bh6t}. cbJ0.:Pب(K&4=̫v5$-uz޷ܽD8ŤE#C.^gd1t´>sh2QߚߩFz7DyY90k؞*#:F /:.* >rqKbb^B: +5݊8U".6K +^g+MDi5\n^%LVrO#CqZAQBKD)y{9wC}~ K2NJaPcZQ8n[y_dj+yW->YAxq3}sKTڭSQxUWŧ]$|G*1)׎ۋL9zd\X!Q?uZ/!E!KVɖ p3Çx٣ u&3U&kh +Ⓒd!2t:bg}E z5 y2?O!Col"ruE\vVw3xY١튧 "/gTxc|uHQ +=kq9Fka%eRې_!l8ٞ1 ,FE,LQ̰zD„Yފs + .1ߠd.бYM/(sKS(}wB)2,q\ +H`㡄^H +]>5Glr~-+i#m*CQ}:D-3B39W+u<7OmpDØ QěNMHt xB~ +z7W-kN QuRuc[԰#E:9e')1UÞvөY.) ),ǫbtgԤþV Y1lˤW|L_b~P(爥WAg|ʂNI$@̸u,6|ĵ*yP\܇XRU&$83.4z54n*uνjfvqre쬗)LmۓZ"Ks鴗P.w!d譧0CT~iWyj"|K`k3$%5&S`ƍ - cfoU!O2x>Uf~Xxf6\ee2ؔ7n=Dn"ϣ"!X[:'zՏF'̀ĖnLDSK/ ^k Ƕw NVK;IP*Ulz`0Xn_lJ{p_\ծό %e0 4,Xk_B_02&0qFhƮg!!kIKfPPv14Y~gnڶ4v +ݵ(1 !ݢ;Fڢ!2w_lmwR$pFzf G6V=-N:'JAE'WNl>x6FH&M-?4c4 i1jYpMy3a*0X;njxw ]]ٕ&JPT֘:+3yp`zl&@%so)@(c|(Uq|yHPcbDZLŋ|[&(L1ƌ"|<( > R3Xv_{D/a +I% +)wNz[qRwx{{3 +<!'It))09ݢ%ccQt}Bzν5VKuo` ɝҒB=g&\*|F[VEW.&zt~!UVyf.8ra@͊zS{qMWBѕ+Ad ,y#f:Uq!!r徔Ҹ̽h˼8BDLUj,pOp:[aJ'$ JAR8h]aZX|"?WklJ1S29ވI} WMQbG4%KKjwcsrJcM̵tG}uolaJ().C:7L#e8>>Xo*5x}97"czeBW/,Fz SЎ`3)1aH*km_"&8$b +;Ȅ+%-kV&4E|53I/f9w9sUxc{$[ZtFD\cm=#*jn'a)VCk]gwizЇgΓx !WYI;)'9$gSR4y@ƪ1/} Thj ؉&"Yv5U +DtR"%'=7$(w GwI;6Rb&9 sBR=B!' RL 6⑸ +dʌOlؓ쨵P" nbZ({ +G#ܳ;n"kT@G`# =AU8/t%C|6dFĕq_b?:{g r~*N40F vS@#›Y֣{nwS7 +0^Z`f&#VX fGQr[jHL +Yng^ʹnA{zJ+,];ȄwO)B1\IHRKsyfZE0h&C,K|mrVjNZo(@=/ȮN芃I2bhH;ݎz7IAOPY*k׍ÇzƆ΀짞 + 5턜8YC[N[6 +TQRjP^Da)4dRFߛӒgA)(SϽk]зϰ 9|y(kDj)Mjڅ{%~H{>~trwח0MAlѣ־}kMt +6k68 endstream endobj 51 0 obj <>stream +G+,/:YvI6]~8Tbbi1A<$]ױ6@a\s~LI}<^z:(4_V¢Б$S܏:cIlHY VZS?]T ϸ& +KkQ|'/D>%=g( +LdLCW=0L^:[Ou, +4mXL%CY/$̓l=I#ǂ$$c',n +޴ƋMR"+IE~d>;j݈ []Wy#YF#um;=H#6 H"&7S:J^MhZNwꈴ4ړwa'H'[k6 ]N-2*X/klP'N\I3LO;QU_7-ɫ5ʎ%l[;*ՈWJuӁyTA2%6D :+f{({b;ϲ?ϧ<] i'@4<6h!]pf$ThqѤW}O5H/~od:^?LӜؗ]3IԞHeth *ZM(3ks[Ɓt/&kH$y4>~uw_FRCLKSKF@1Hxˊ4*5}C 'u 31IȗO_nKĄ_#AxXq"=Kк{̷2T7ܢw e=~8Bԯ^QpY\k(KK GXjw& *Y#c odN\rk6"Qszr J}KZ!:r⯇B-EJr4s[(g<'_<b4Ek8ƊvP,6oqJ@c֛Kk3aǭ]M!Nj NS+D[(ܑ*¦T@\_Jt=.wIgA׫lP'b?A ;q¤R~7n_BlvfkeqB w\@ 'dw$SMͲG`:XOLW0'@cѺC~WS[Jx+psG8Ӛ5^8N@80)V +5o8 Q4Mc(~(ksMx_@ q:ljC5fђ1=rsk?7BV>/"NBov"b["18?Cدr\T@afr>%_")&H[ +'oQ]K%?sDc0uv- ~w&py­/4Y,ouGn !?-8"-cCHP55_5vv3j}(xt#<ٛ2@uL;!Of1A|b|s t+6_[BJAE)̽A8MuBD_l"ѣ<2~*E'\d)'2`Rt cc>p2Э.9Xč5RhaUx `7*n;9CoZ Pдz4%P s#;,zzvz5$$_cq +›!<4h V(TjFMI22JJ(*B㯟p+`!u|d3YWa9,qsϛH!<@TX֙9-]7 +&K\O`z+swG*@:^[z~JMxJק)#qCC ; %3rI + J4'X0#ha1hfp3U3eHW0|Bx֔[]Am& F띔5.w<25Bft'7ʘ9]/7/šYt_XO;^Xt'K]WMF{+ cWHn|RiH]ksR/}"d 9d^B]3]sZ*ZۦPj{~7|n@a8F$p&uXՓf n8#&X+:aX4O#QGRXoJϔ &QgD'o~^GJ$5Z,u=u#wΊ,p7N޳2Pn鼭l]KעN78[=b7sAݒVesd5xLJc6FH#z:sÉ͉xΙ2KN+bȩvg$ݰ;] SݯivQlo Y~d>/ꭞ*+fѐL\;p|݄gt12i7,n*1_ay Q6l?#1wHSrLt,e0i-WsR&JMǤ+ +Lu,0I:F߄gP<]rسs5%^$ +llݭ*n{eu!23UT쨾@/USCJ:<߇ygb _=wE:&&IQCI.>ںKlQcI u G~Q4Y%: 6X{9Y;Q([(2`#NXVa8Ogڼ6i|>|WZ;* H v5}FV.JFWL'Ccl bU+8i  pxSiP]u ƌ%w+HْJ +g%MQ& +"ez^g?$L+ +>y ;h)&K'd*67b% q 4/! ~ujԝDPz#}뢊a]Sss^I/oo]1ޢi2vV/:$qN W9lx\ ϟM8٪<+E(ȅ.fPk&|U|~.9JCTo/?hOhIuWLj1D~6o|dd!_Ng>NUĪz ؛Y\*`nQtNj!(x`4I PzN=\r\,+ȣJ8e!MPzT-%$?ڤ`0{"Mw& > U*w6/sC*Pͯhsp3+hU["W~¹5oEi-VμgmG#6G ›aЍ lj NUV:g&>q+o*46dI7#ȧdݷqO?P0bޔt6n†0VhVAjl,G0*u!Yfm兡']% $4j/ɨ;G#˯hOjyY7cbXLNènߝx$@ĎG%fQ0530A)i9#b}+{g7rԗ8!޳A_<PO)Vh>@!>7 o=# .;arj@ۊ$*$SJ0 +6]9PvCnqԶV +H#А^>z.ز1t֒tDzLڪooz*Ydi$ z`f ΞD1LZډWQ\32fgwA`QD3WއC+sc#wo]'[`o1mW@OVrK?pR8޶y=.e3L_X{Rb,o>#mgp +$D4E\^C xUrͷOɄ2 ϑH< +T+9ToV{[y=|ʽQaL:PҒ*%Cx@;Vngi,|~DV^zcs/bVC PoeA ʄv]b$}(+U+m5_H6&Ɛ)~&F j: +<٤|gTU\G@rm{I(;e~'+IyY798}B.ۺʎ;+AP2N콒@D +;nv.u$N228:2zس $F|cϘ +#-lvlхq[&f pخ*ZM8HlWQ |8,ge + +Gz+<w ,`Vi{st5X=>(xu6bQO9YOLAxd9 FDn%@n[Jdt݀"edȒ`BVJ3P!nKnrt:H#v9 +t֮ڟ& f"7ϗZyIO*y'nLjNXsbdŐ<%L A'|_ NP5m3\%Bzfz3\5(< JG q:*D}n^J% > fO`173#@nі5QEBXch@l+%>0*e #9>R=eɖk.b3Ķi%F\N 3k+>bffxmUE43̊N5 :xW[ +lFҬϰha1a/5"c.{\m9UzJPE]Gvѹ$AMD(XT1EjO2OХ8pdǏq.Lؠѡf,% +LZ4# KEȂSrI5`b~WB),r8jIg\m]OV؉v(Myyz-fNL9^豈:Ӆ|#+4-ˎ X *.=EFA! GbT5˿=v/g#Ñ<ớވ :AXk%_J3Vߜ%(o0cW>n1%f U9m.IZ~*Q a$DIՒ6a^TjPŠMP:x3="l{ +-+%*V2%y2'v5E[ߟ#Zzq^n"̟>̑h ؁1|$f~LTh6?ߤH.d@P L: M )s\'"^9;5II=;5i9Q.zH^o1KF ˗}I]L@ܩsPH=[CŮ-AnDݢ_X{lߐUDU8kyVg -1DGf?ŁKh=D@ݟe4o5ujPkXOpWMi(4m%IM >Iio^;}R$ 0\%[XGZ5N&Y8!+m sdDfMFsDji;a~dZuE!ћ3@(x.$OtVxz&ycSxۦ 2o8Ɇ^_rrÞ[a5kd;FYΈg{tNjhP*y'CPdAS߉oο$JoCL1X)GD$ Zn5Wk6#yvM55cbo< $:gl. KWŽ%:~$vPt,\~Ԍ}@)zxOp.!#! +Vqq񣚉.0 IaFqm.3RD #q;v?$V_U-iOg9>lh?qm!t߶[Z5b >l +Z+8ěV%`R +n{VF49H5 R_l(L# fVy SIdCSˠiLuǫd"&fC! rT'PaN`V4j9OA<OLU<;JiCiVMBGDؿ^QIpjAE_I w3mǹCb:#pTE |τ rʶ1^'BN/FKǩ?1/e4^ig4Y{[0 /Ӿ݁';7O^4P`m^m2Hyѝ&袺 p>,қMarrdVG:@r?z[ī\϶rݻI +5 2v6{FnwB:B)@؊hk=.2oJ/P}x6tK?Lz7zK`ln]}~H/piՋ"Þq;SQpaUorzR'|lkOsMW xc>%:UAp@͏&,{8\W^Vk[o՟dއ]ve3Sn{LomE )4G*Sr'"Td?CO_c3} iYdrd^G ؽ/e@W]"Y 7PHQy8:vAbSw{@_n}>(㪡ǂj~q?J*̦Ih + T?˨4%U^n׷LjnɵmK1ZЖ 8?c6 +; 7:I +غh3Wo:glݼK^;(Ǫ'(AP*TOÊv(]{`}߻)cw{*޻]);YEUΡt0Nj'G_=DrՁOVߦo:]֡^tZkyE 7"{R|nj2w'ٶ׹[> "P[PlClly +X@$3Hx1%Oi&Ί}a$3'T'н \ +v3pgwUVB15Q#q7)9bk.m_^>*ŕd:)ܕ=I0(1B\GpʫJGGVK5]=ɤ(dg=}^zylwJnbџ ~^o$=zZOݩE#4ʧPrKϪDWKq,7vw +Zђ$.'7ע@3;)lMA걖2.P0EmH;iŚ`8 +W2E>CȦ1Oq}34SCU1ՌQʦcT룍$o)ZuˏԨp鴐NhOR2!Lډi;hQ螈KW>[/\d\oyLNDzR2?h+3VGUA<GI *rUJ;qɩXA&JBه_.wRg3r)8q~aZiN-uyf _H@2)ҡSrZ'X+d ]"UVZR4'[)o* ;l#\RC EbOSI-=PԩטNG NXu| !o~ΐ#޴_ .t%)%$AwP[Kv!j_6mC-Mej)b> gמ^ X;IuZSN*/h$*)'D8g|k rehô4Y^(e q8~zc{-0ΞQ\r~*=S4 ܿK˿ + O,]XaIڃceݽ5MmOζ&7/we-~N̰d0(H]WU)0)09ǝz"^0H.@$A#\˿Hf9/g,@='ӌ9IpQ=V3?P2eiw3Qט[ aQS!/i2XhWD]һv * 9W̅R|rDR1Ŀ=9>xeEZt%ڝWh#4WAګ4C31K_x/wsa>2֗ /ˮ9|AݯQaƼKxJ;%f`i MVZ;SJe7<%J rX%D/f6%Tҗn?%_oop3(19_r1wcU U4L{e -De{ ܲiU+(*h[AQv[- +I!C! + j>g${LsGZ?b`VCڛJgrs^,;nD1 8N[NQyAS˾j~ @0CHuI$p+L!qVT3jXNI" <ޮwnh% DT/G0{YM"A +#H9j>7zd4Ug8unE!lv2B3BGYR=Zw_B,2' J@|ثqSԧi Vs iiv IAxm`76s:p(7"I锪DTu BB׏ ++y[<Q`z޷7eHF=t3'cZ1B=䶵=үXN55CWzNJX` [>w'1iBӵh k3R4{FKT4Qux>WCjxߝ{99#ƻe#'B";y0:(~~B#2jCO|捵ώ,5 z{bWm$\V:No/Q\UN RM Z>olkGsnƑ\SQL]`_B{*"j{#T1ia;ũ# [5#:V zN_4 aUO}XTNVzxtPlb1p"^*!򼯏9eSn̚w/)`mv#a 1$’7{ʌݙLoG r%p՞̠;]D &QK 杻/E54mI2б1̀/qRjE.i Z)M$wuc-6ٗXI` +zEvi!ֻf;T S^~|nX?O7V(!#0gUCAfeג{(6 +.ऺ43JFz,H_4 Yn|ƽx%#\|!=11dx;j-#CRϧDvo$'Sґ$Y OFA7Ҟ @iN3k,r@|>{^n?IB[_Ml4~̓QB˂xS\s$փl 0A:!=SH['բM,Cq+Gu+Ww"J2 Y9VLUM'#I:>`We7!o GV(ZCzֽz"q[T9):U2" [.oBGN] +(HB&thؼt6/N#"rb]* oj-£H ල{B(ksM$T^Cy>9|?J{Sb:j*"xCоm`?-&!]ig|잒)8x/(:W$%IM6]09㬺H4-_%5plCBЁת\a\IEB8uOdSJCzݖrܕgKQG&@ )K\b H3=V[s7V?WUR7-JT59#a/ +1|tq^eϭnt]PgQ9q,~8jSDH[fA%3vLyY t''wlP1#ͬ6ܕ#/m}ho_r (YoC Ӳe6}di+ҮQeD0{3E ,O2ˌ@Ӂ xz "?ٍ.ɟQ%ȝ#xҋlr[?*yEtd6DKov L4H_ڂ[@nQ^U>rT+U՞=F5+aQ:jwY"&x&4SwbF}Gu,á_FKjP'4I,^k"C.r]'NF˧J6DHg$y䴌 ![阮#Ý㮀dpK(M"v|.OЋj! .23G%Ҡ"&<,{nyI,Ң| VY">&vřG`V^#8 m6V@KNnijޏLMRMwX8eH19G9IM>Du툎>88l2Ub(mY9UvEɭDtqKao̤.IkSDWh|t*gdTu|"4$!0\-Y PXO]!EśQ*" ,@8D/HWzk~FXe{υry! f?j\%v:-k1H&0DKCY>YrG|oXOyNøc>gklwgkuz!3se6D)[˾SDsBrY"?([~VʙJ6WjP?chUޫ P8{܁(AljW` +[pu]ؿ^mYԙ8 E!HᐏO1Xܙi6> Qtl>w_/C.JXO8iB!&/DaP8 TLk,v .7>;a::K>6o(HbRz#:Hvબ9i/f1wTmј-[ ԛ9A)Uh{Ta28:>GztI\RJO!jro(Ld?NNjAIEkc- GN'j9& PHEm%5W^-Epȸ D +%GԒXjKm7|?4 +3]l_IPn@TEZV6+ݠRdZdX@¼ٔ3{aX 1 + 6gfz &"2Vk!CvCCH1 hD{8P[nu!3H$lޘlA~~ۿKlNjF5vZ5dMh} G|fC =OZx;G!-1T,uT28͚ v,C :5RU9kq'"jBaWCJ{Ǹ="LC"o$h{AfQ`?jXi\~By[w~W?sdN!SYlHsWޑJ!fEon"ŋ[DbW>Z;4'/Bm`l89vǎ!DJH3*b4LwLx+30B.n4`/v0Ďͭ~7bfW쵫Oh#\b#\ܱOzJ3D Hxߥ[7NJ,*5Ԟrդf 7CH`倫#j2lrbE M(NϐgWr%=w$^$v +mc2H)?LN:y b2k[})Ir>za-eP^K=442TOb#%t6sƥ;_--~{$LQ:h\ML!&8 b':0jAќBݻ.gK # OFQ4j mйvL~.Fn.Q4~wxHAPN'ymխ@6hh8VmۓD" 4k#VgTTt'Q[<0m>({>s1]RIfL yW^hJ2S0J=L]j2'QnTy$9qɏ|5hkMA7u\Giב#P[jx~]C|W + -ibHK6ʦN h#I؉j  w,xb3DR=Jp=)h++$5nDRWˁWI.VCm(K%ţV!戊Aϴ*]ES>XRxOZ@~=:DটIh#~1~7u1([?rp+ ɊВ7 !?Cpֵ`0FLcbzgM;FmT$J9,<-AM#53q0  +1"պ#(>ЩL'# XrGwxU[ԍs͚%uۧ)}G#L"/! :S}bUo]S)IU&p/,j8b,~gHFMv)>;ly0| 9`oKUZO [ TiLQIB@уt;WJ_.aRS D5Q7.-p%-R0D> +ȰlRvX~5hcRaL-ŠTs@+mI4G'FRTTtVnjIH ZUW5[Pr+trZj]*v4X/IX +Y' 9i[V(o^^pOA'ɣt^6rŬ %H‘e UIJ{d8f;CU(] +ч0w4b]u%|5PGXiQIpi>hh=r~ɍ\,3;$A"QvXU} P3oO@Jj D : +3pjdJ Pprc*y}{#%K^ЫA4{wHqЭNTNG6Pa4V/*BmQEPWf0=Gu2d"fg[#=JM~ @ǜKY# r^{_'RLXxfHB4(S^"?CUȲ״Uj:Nר*[#|.6ΖG"Ȑp֝Hȃ?&r`gkHBB.ID+$ pTu6эSir#%M2,tc%z +l],Ш;r"dwLޟ$5F svIFi +?bN$#F ƜXUnB;s\o{!M|϶1TEb5٢@(K.5c#CXe?"lVaw?8p cq0_.7NwT +7U<#6Tt3$?*>.d>"`A5 B'8q·MDmM9^@u&V' +YCF!LHw#tΌsUpHTƽ%jKQSzOM%̳Џc%:srDV=iu],gh0u%-@Oq3GQT=aB +@^Q3Y֊6"@-*PL5_АNw>LtxccGn>QHh`>89BΙ")fWK~'Lbf9?d(V }K-nט~?]#A; A`3?]>paؙ# S'GX`\Sǡ=u?? +9Gqϫڦ VWK0R)7X +Q!gEEo[!!pHM9ҲP)ԒYjeg4꥛,"x +2м1;K+.6sE8=$xpey.4cVD^Z YrpkOEw0;yYQ}RܩU_N`4>Yb͙'Vy{&sSE3'<%&%R5UC9>UA#!B D/Z.b;Bxࢢ]i{$d^- {i>TʿN7*Jy,Ӊ+BZ/?e%5푋Zn.[t(ea{Ň5hAȐmEz"zطe?z~( V 2! )%J{3;LpA\&|񩏮e|`fOi{!Sw`}0Cu4BR(oR xot* .! IwTx{/BCdVo$gl(P5f  ;9Xήb٤'qF#"c4P: +e`\y !㉃ p[b̈wEaK08%\g8 ڠY=nFڃulٻS0"!-nyOX>J6 + -eS``AEW̌nosI")$M +"3qNOHpϻàԸ5DDeY{c?WW'+/aDa NOK;I +~Q. TL&gnT?Y@}zsfFYq<1!ͭlT_&C%G֜ͭ|O%GN^%}gԋ1Kuâ>V)'RC?)yw0#;l1l47t+ ",=K;0 MEB+3N:T3܁p ˋQkWo8L%}`cK>(ay`k`=B$|AT{xY,2bbN} =|SkZ&rR?3GބJ'44Wjq@^ERj pJqJiHثȰuE/qL@3K9T+ha[dQ~!5u /֩ J=<.W; +'&M7 מ:(^O{OL +r;.aP)S:k'in _bDd1=@X539TdObAn芢@-r ؊boA- :TF| 1 + -@ t ѯqnsD#?9![ +/ᦿP[F޳*S: h*F5t#e\$?$O$&#+!@!S+ 3\gUmz=Šg.xro%5Xf/;GTk(,A"!d^"7 =WE"_md{}_9\ݹf!c "CJhr-6m'jQ{2̸^ +6V;`K¶+ژ|KD؞@T~N i#Dl]u Oq#h<~O7dKqLA%]֕L!&9H ֻX훆rgR5cM}I}5=w TqܲUuU, 8*Z4?]oᲰ7F&vJDv$߷ +(Il1jM G *>BHU?+C-9 +ҘsN6lV nu8s]#'jA!N+rf>{8l$md-jD%ٌC:'S%Lcedgm&˗ GO׷P9V6&X@F#Ǜ 瓐rsLt Z}vdFG6~DocD א#Ǭ!Xq ނz +D2'EWSāň=$x~=>LV -VʘB_6AqmDY'ek~%L{F>?\!c*41|>H}|lJAYt0SPΜFtWABF>q#%ިcinrzV$EG+;{Tө +-&!([| BB@EO L"SM ,h4=M[֣stapQm BT7(("3d )+pSQ"ZD ⒕yP4DO+ )ψC-ቺa@y痜2ݜuw܋kBFIH(UUW[A*B rY}i +kLTRDq6JhmN_\Y/k_i(x85?{Ow+\`н 0A22>wk䋱(DPqjƇrx'PwS(In8'#O +WT 1⡵UzhIN`\ +=`DlI 78ROt-ְ߭p>SɔH9kߙ?+TPT: xpXhOpw㮯:>B:㧣m-첽hlE9b[6'Y_c_!~gY hPQ!TYMX- D$U;Jԓ^5-u;L|Y+1'8zpPcVXёAiVO]&۩ȩL>ҔőO*0)Z3}P>L^Nn_!`>JfDU4ڛޡb[R3uBJt{ʷ흟UV@Q "OR'y/G GNy: + + bPN/O-_!ߌ{mu$"ŃN3) ~_u8kG!9yh+]+yS +#N%o =3bV"u^~U"w$P=aB=XE6 d=_Z㨭Ɲ:GS[v~sFpHqy9Wdh)\#~*{;_'#`m=M'_*;FyRn_C7~BEy37oJC 2.7u!J]!7liD.Zbg6?ywGKM[ +=<€uBBO~ KzC'0 =y^_AE Q\paG0A-m"/̥x$PkܛA bL7֚u?byTu>9Qbs84 +)?wo(u됙7]1Sf`3x*Uk7Vbײ'? +Q1?0O'w0v$P4S3ޔ7>k?tڡL +~U =`{ \u'hjy^b2)`MSt+ʆ1ߙ:A2B"*Թ9[sb#&AҤ&A=8DEЏl}p`ql4'<Wr#S">:(('ЄG +%V #YVT!޴T>J<(+ K>jꎊ^Y#0baamwtf *Pa,7%^q|I[V + $Az͆fުٰQDO5Fyd-PD;(2+Q('U슦L2bEv[!կ,,"\-FYAyucbE jzEB6|Yt,ʝpôd+đקқK Ch}1_(,jULSs߬/H~iS0?C\_& aI.:d}o3]@, (*($?w^a-`F}jrD:ѲA7l(\K[ HwpEV}${pؤ1wt$g=@e vxQz uїV#$I]}=aES!2Q +ϴJAER9 +APt<;qhB1cu#H;\2WuF\Nљtǔ. RdxGu?;w/+;&d4X@psfwJ=<+,xJr$ +it/O+RGTE1W\㚫v_t~=PeGlF!Eu6m5mIfJC KKyȆ_6s0۪uBqU'41 + (PAcXg0J0Cu~{n%A F2h7+LQ6xUSƷ86׋wce@jB8xAVb{&5Xu wL# )_a&AQ?%H|ե{C]w4}H7iEİB =tʆ +G)d&+>tFk; +`+`"rw+4!pyͪ#ΣD/lm p um2+ugE2ȳcR w~g\´WܕӾ^3,Ǿ(%q>7fĤQm?+~/I,~Si@385Dyc-X{&KOmg:+@Y$鍆y2@ OH5FЫw:;&cقz,)v!DkɎ$5+ [i~8ִ.pKQ^_=N$PPAG!ۄB{b$1zB5ha64H +&D>ڤ(bWCC8;SSR m+&~^PܝzE] + jŗȸ'ZG Q(簡+kJ +TD!گ N yb: >|3DI_+C읅}Wz;2-;1]LZ6ƓªDIŀj7d#D1"K|Λ&AKL3YW=_mcջ0$O`k)LSz 3 $VNT~4/I,UgSЏyIz+(3j3ڿt-M_QUm3Pv%;WY#\KN?G\rftLWJY1\{ rA0 Hn 2(mG䱫8p,3Z߰1oڷK;M.j$qEver{`ⴶ]".{C7uNNjXmў=H1IJi<zVhcV!=wTzuuZ +#[=f!gGcM+V8zZ DP;[|k۫&pQnVyeUnCuimWiW3 NzĤ|VPB:hS늉*DZ,jP w:w<|_dTKˣ)׏w _iD*:Bg@OT`s3q{5E + ٔ>[Y鄆}EuHN1a8 J$d~!_҅}lX҃_lqNd3Rx4vjMgH~\ ?\OwW$g@<0d 2t/;*- f p;&%l(<R$hA.pD颇&XTBp"SD_77pt1l򃘇AGq@W+h/ .*hf{#M{óf4#P.5#x?(ؑvɝJfʒE,y7ڻ]1GfOf~gHrm88G q:C^А"{0崮F )pP +4D`hzDPWIav"C{yk!'Q*TrA}IIut>} >?gzUu +iЄ w,tG`NO_O̸g=]>ԧ<Ų HB;C_=)B%R VZ#6OO{f0ǫͷl#Yu!P"h=5ڹV? +42<\84G4({iWUZ Ey璘J+.]A.r2; kA"=Z zQE"eGWSqq8`\`;CsxɍH1A\`d;UuAW֞]K2;CTJ򘡙@/?/]=1 "JkjW4Z^%6 eoz /wNe#? V!WTiwww ক<ntu2>h-ʦpؗ j4F%&bXJWY`re 3L<%K* @b;1=BO?j̨ :ƐxC#fOf=ࠕZJg_wуVMyOEhE!`) 0sXVk +#:p]z5C"Ghݫ|x@f33p2d]\Ȉ%iMSEt]KFjP6ɹ>@0~7iy` +r#Ptr(2MjՐ-[ +=&'CVލ8B.J,WB9sDٙh36 (raKH {_ ĵAD|~`x}3 肯ȇA;H@MLʁRv#-]D]EJE.0r-ԆT#IL ~̩!=}wr'O.'PACohBz|`;)$ve5u̘^})eø"IDy]N:je>[_q%7^5o읣_qS,@{tΖ!.$?8PjcA++Ѫ(%F6{-| C8s*M5N>@QzxlEGB⛘㺊_?3zJ(b(PW#ce*|$G.s??5g͐VQ>U>wLƨM#5VW"NGg\6U ʞ!_Ax`awѝ?X sA*jp}J P^}tҕ@LjumgL YȄZ*KfVAsyvF?EfB0o7 +u+!X +œهc>o8oGy~iC5&٧X\ZI^_nqkίPɃE!O;65!L3@P})Cz)bgvfR܃vRۡF5Çaف-'hfjSKH}9G+VQlKf 98<&bDX@,VH73,p@ÞB@_5@{F6sX";Vq9XbUf@c~Γ&Bi;8U[CDq_Q]MIhb?7-= +"+ ܲ{xB5-# EԒnː +(l@ y[eh 8Ĥc2 +y҇Pu9MQ!U +2?A?p2aH!B&abq2C-V>掽(FUVv}rDl{֠6PļvTbwM[ Q¢a#-Wd{jJkiC/84XDEYWBSePEe0NLxaA¥nш4Oί"Y*&{^aNԠ>R8Y! ogı,r4/y}סNU )!UGA1Cѕrityv}_PBw92;VsRE]%ءv֯!+BW8W5ɡF2^Ӿf5\a"Zcir2w*XwrTb4!95'%Z +K@?KThuRn~R-KOto->A^* 7tnYij =[u {';đ4yb0g|r?d#Tc7 # LC}mQsoXqsq)mnUCe: r2ʣLZχڍL^5dW5X LB4[ԥ*$$MMMKKU3^)#u&y9?@E~Ϧ E.:);"+ءs0#j/mw:vP$~bwmŭz/!Č~8-DݓpK1HZ*/vbŗIKABI(p̞qC\fqD,vupBo_KM^v~sO$UsVuh3EUQL<-]6Slf6_v}G8o&qNTD;!,}AlvLUK:;< +J!+bxs$PCZyq& 'rhOPM-Xeg +CdMweL{Qa@G3,]8|m%Octjj$O {"D*ffIJ\==}zFH+Ɯ'Heʫ@zT@[ΊL!ب{_@GJG +%HǨUZ*B~)6ߒ~=]E)),;kϽZ6{du-_/slU(?Pe6?`Wp$&|\n&gnI[l|=>_=W1HBF%̇q'aF4"By+ob7ӹ'"g0O:thvL-t5yR2Fǵ>7s9_8@8>}&dX}%4 qv=_ޞdF^^Y0AN} + +W<MU0-wq; +7+rrfVzx hFqGU~MQdtE6!g1iٿ3{{q/ hg?ˈJÎxČLXxTuf=%'w +{ĈZ Ԫr-uVmdF8q2jD9τH,^qLn/hOWh[8qszjTsμo>R~Y']Sɀ3l@ *? QvVH+YڮE8>;ʀzVj^Wb޳8 ͫIJՑPC2Q" ޓFJ.Aرg=\Y*>`X(B40:b64PG:{P$av WPcE +)wQ^CSpDwǹLsd䨫"b;Xլ=Yw,k?&8-ag6 CG!F]g;0z,6d_8SJ}^cS~S_vz]cc^5{^cHΗ~G"wsu7! -Y(.d hb 98*4G QҠ\$XsmЄvy1 If]k.FlNv̢Lʍ9>vOQ&w$^ԐAqVbjꉏb‘L<L{IJU +`I!1H:iQ1Nn}Z'ᶟNYheb332aR79jNxEي둋:3^kG-SI, +un5p8p{N r3onL;=:juXR^P<&[d^@p_E؄[ :KCI@4QsSHY_b"sg.H=Q6=ұR~l(e#bE}e}ʨ]6;QktpsG% 펟0D%vScD3*w*SwX?i^vO2#0;;91@a",xYK>&>(@§*Q9ĉ zB>N֤ImR~‑zoY{;>*/ G}*(y#Z9JNsr +&f\oF'fl?swmyÝ@" jf/|1gfvȕ+:B1X2BTF۟*NB$ 뾎7QӺ[0Y4Zl YolsQ![sQ㹺mB!D+Ơ3`8[8@;^*aeHF)S:^R2 u9>o/~2LBIkʰ F}SfɈh +G,vSlPDqwXiPȔ>wnqe;fͤ3My։qF y-U_vf Y3h-`W[#濒FGmeF΂Rf $5LY}`'tcϚ1^$Gy9RD]eBMim;@4[I)ˍ=pgfNdBx!]WZ QH`:z*#k(BrGm{۸;$ s0\GgpB*ϵ&Yu_tVF'Վt8y1DqW9A"Bk!a6R[эRԙ_CH ]V:vJ"UūO]T+B#R#k-?*[&lzMc/]U"tٻՁAHI[$3"g3"A7ej$h7)GI&=[UʕXݾ?eBK7YA9>VI^xcVG1uB{ĨoP5Г]pT @{luRJ`M%/x]jBP]4G|-dݨ*> O;q2f8{3,71Þn%:դ2v@;ЈJ+ +QJdrw3QVǼjpmJRKlV%FQE9t$yw.n>kZݾfl|s ЦM {R{ "sYp<K;v#sJ)+ NNb3z .T|#R{}? ٿ~tig)bg6-f?#HnD$di4uJ_~?(L0@D)2)`D `!Yk#\Uȍ y{Hw +i^3h:Lq.%ɔ1V%n\c7 %,㹋6Н+\!C$ipw 1۽ Wࣃ;<;Cڗc@|.KB'V(8+;W+}Ji @1gI,\=TVJ0hGw mm'{O/XY4a֝*S/gs=ڒ,T5#0ʃC;u5/ΥȒ0; Aa"w9%;,#TB6WC8|}co C(fRWƐ\-hB\-±戣ݾ GE/c% 򏽫&{z FtHqR u.>F^7ņ%w}'5gj0QEK1'ñ}S*&Ze=W ~$Aw3yOAqvGZK.+qU5EDM6B[1}c>W@eαP|%0qDj+*NIzjQn &y\)_wInff1A` 'LKrCw"%O>o ek AZZ(odʈ^kG.vꏦk~k`_~`_+Hh:ɳNA-(WKx֐,Fk˸rH\(# BLH3Z{(%_i?dg#WҢR+=`zwB+\ץ{ih ^֛y P)r?ǙV @=;gITjrB%k oΖ5g@=.2Cb/0yi! `]W@m<˵~]w,$[V”]PD{lC%z։ )S֚])(bi9MXn|~. y&z&x~ +(PTk Ddy{PBSwDuAA9a#_]?:3u#GIDD;-]]tAxwN*|wo=aW qtU=S<Фs&^zH>q،8̓ɒ]਎M> ~4Bnh+ +C\FR8+~>)HcfC +(]k9sh5ECOJ_=|[9]luz%J|׏zۧzi\AL>DޑoAi5rr>RTB!`hڔn^7ؿ3c&@*!%:~JxNoBj`IސIowFۅS\,\B};ݯT +ڵgoFx* +zaz׮ o7 j0wU\9Դ +֏@(&+狤תZ/ <*JnDtqR΄Tr-V{>waSע$f/A6z;af#c OaT5'US {6~Sո0TK^kh?դf6o+|oȤ]AiZյ"2])"Zaj ȉB冔8?DE`iD97U9R&+Sdx$n~̮@&lZ.]"37)ekԚ͕:>CȩG^-]9>O?Bmͤ M N5 j#hDs1%[A蟦.)`ѠIж-0 6 E +k+{6̢r9ԸYGIA;An6߂b$L~&jNtg9kw\'ijP**[C%H]XjբB5PR\-HGNqnXFMogz?|!h}rA-)0( +9w0R+yjHGt>YW(_g:.ׂp +7y73<,$CSO2>~卮&\B%g;j:w;6mR#SAŎx.+@-=5|o%w9:, Z(y֘*.ʔ4~9U| ֑%A`x60n5Vvë#~]8IKW\QD-IBfE2` ӝDfйI! l& uJFC[R!µ6F=p~b'g|k]/C0<( nCP(ManKR'R~멄L2VݷrZRk+\o +ݘ.xg@p-zeܲat}ujqz y(#apɘϞ*%5#60NI'z5pYʡ}J]Ue5W +{FLCHY)w3)y"n 1X_|3 hW W#F6J)uyI b:n._5$&Kd\S=WL\;Hc,>a#jYet RwY;R|gY<JS Na8{aQl%c9HrEK#-K7qkeUsMyc Z <*Σr9}x=*<47ڇ3=e9C`% "M< N⵹'g 8Lv.cӡ'z9H-)4NcΣDf Ӣsa]>i8 0bBQ*jXїu+e_J/ KߌzW + +dآ<y~XH^g(07Ė;7uLba >{TyCL ^C?]oo#~ʬkSXDC5wqNԓ@ lT)\.",غLx4VH p=uTg|G.˺[ }TOvdq~ OFL` )骪52::zwPRY'-B.%:SR.[u xt8BL +4TD뀀xIW *w/,FPAN +x]ieUz@[Ћ~!f] +0`&ŷHڧAS{y ~M1:mN 5l(w#kFlŠj +"g3_Yn6O 3HqzES1CG5hP'yagN8KP&p(k>[`F R{ik"ABN%1nt)BdJL=_s<I)U[췅"2TP.e *a!V^oPPhL~"t9D|%g{yx'VG` e͡~7VcztӠ}鱷GڒA1zdBBGmNwbqmؒoڢL㵲b )Hottc𣰚蛷UqJ^ﹼ5ģev|1AՒcgnAҖT}@/ o0K=T_+ϒx!jfЛ[Đ2OQg_ҦM2zs ϧꯀrTrQ\V\'eMJJT!.2hI["z @&蘐㚐#rR+Yg[2 mF}&Vm}n;ڨgjpPP&r!=HRl@GxٚFjDU`Vm4#׉Ğ :hn33D#\5t\H=b_͠'.~-x?AfgUt6eR|x"yp[$BTVF s+@{z;!]~+; +gU1gIPZ,GIHtBZ`;:a#bqVoF~DFd@M<0F>z&=ÇUd~SIӫ˞ +$9`ʢ 3xDFLHҤItXZ#n%x$bSOH}ZyĚn`_%oRƇlrzH+QIBu\ci帰A{)E.49h>Qf04~wxyHD~ Zi +vXpFVzv1Z +څ+禌.0%~4* c `A#\*Ŭ8<̌6ȱmk -AmLn-;7T)ςJe )ScQ3`Y:+Od)%AtF`}YUcgp'd4##,Ai3Չ+qFEyymUTu@CD'*tjXrqn!vfnZH7UUVJ!:<} {čot>FюZwZ +&<.c o^xQGLqUԀ׀0g2|4 +B˸.m_6hR3bq)W+kS da`6c9=Bƒť)@_'# C +r~\e& _VN>o^J;_r~̶ΒzI\kmE '*'GC2n Q=slH4h-=©ٜ hGp&-0@=ʔx֛:`'HdchkI +1fԣQS }C)ZwSeT2@;KlBVB+ێTT@"#`U{/BDqQ4i +dBnUPUKl럧pM%Y(ȉAٍK}Tt~~xecz|ݼgJ6af6{lF9A +f"u =;*](kׅM~GݏXrUTT,w{F(Mx..!HFժcVe;ytr4,?w0]\ 4+X4U 9Z.+zВ[49~jccb)rњPC' ݛ6J`FKJ mIU"TH;fRVdXK0!^TDP:ByӇ-D޳떓OPʻ\ RYky"vL+gnDwrͱ,:QgېHxb:߹ޕH:=Ε鯪_`Ai:7+f1 V0^M \wc@'FG1 g.ԇ|Y-l{<ج0j5kBR5:>6t%P[#l|u!}-zn#z<?",+U'2q3 Ow] 98ҹyOv>=5{Gv5XU#=' +%?N|R%"2,32#O; {:(R(Se1:VfȷXIV6,K$^;Ֆ&'5Bnw[  ےcWZdB|Jh?& uj}xe*u0tS~4"8(8?KP6cEj rkyzFG^)%eʿQKm2(0$=Ļ0H;Nw„rIm2"M9=[Ժ +[q_528OAHi&mhGid{J|s`~< +ጫg#D;!] Tr~u@ɾ{F=K F ⳱U' #/,Z8~(DhX::ˮ')qNLOixw5PQ32;KʊkS1G>-{n?mETRbS.;3oyJk0  g\H=끁&r)QbNB$4ʯ9)H^(C &8;H75+rLTV$OgGe)5}=67T#to `wuh:oQjw+u`Gq*RѼ5fGJ!-SGŁlUcҟ!o峧w6|nEҰAI{5ַ\S~G}VbTh`vzҬuZ k| y,)diݛ6 /g)Bs%`t&U~Q_A!rɩQhB!☪;" +-%t?H:v k;U,O.FkH/Sn )A?O܅XJSp`eO*LA%Rۛ@ 1Mm?zk~кa0(1ga + #9ơz(9/LpJvlCG2D.AIKF;-:J8TL(r?S첁ʽ"ҪArI +Bϧx֯"Z?l{b-818t& Ж|?UΖ&@4g0oB( 15vt[zCdb)B)R^7h-~eVV.tH!/UDiizipaHAp>,Eڵ-VR.(/筆/7_\DWWcұkYBl1 4! ٠3ch__kf~=1w]5'dEEj+ v燼+ˆڦKP +W8 c뇼 zCt<l1-T f$ m^k !kK9M0gfNW1ùq~΍ȃoNFu>yG9;|+0HU#*xv%GŽ1HM{i" '8gQ.J1D̡$QJ$=65R 9t;Ew Rbni$h5>黇4)J0}|k9vIN!ODL4Xk%4Ԋhd7\cfq}Ăh{tZfxghL4bK3qcW(E@ 9͛s!5OiQ'5x +?%buX GFG~#cK^!: /h59WB,ͦ'h+ޓ1Ѯ+BZUt'bGCwZ Q1iFAn?E.}kϹ4՚rϬy;#1prRn_]rAL#ig Wz,sPi)Bm祒zkFe"{>F+jCHpSgK׹tCCpMB*ќw!U}Lv[WḴw dL DfF +F9>D|Qqq~.bxBDK}0HosFE$P+GOލU8 +֮"g.]lRU?.'2VqQkK≔}^ْn7*Jm:ʸR9Ίd +A E .grq[,zFϐDqx&ޡAsH(+v+!65џ ^qG+fOп[WGJU)%y3fkGnlA +*nP]7,NXw}[=/aX\UG1_y:{8(NWrThS}' +̈́3Z=nBaTfm")Vv'bF@9:; vS}Az5 Uh#Fz4L'>3U$4բ &GI-q&(g,ʞ?PMr7boXdm)Xt~y1FxO: 4(ƙ ,ߡW0}?dzL-tr~E7[ecC[V8G{MHeW9 6ѱN5c6cP#DO ;9(`O#A˱Lڹ⚪3WVNHW#EH0quV)d`&qQPKB 9<`dT#1}FM +RM ;ބĹ۳V\w~o2rw־7o].%+l(Z آqcj c|_jn(n')L՗Q^\3*dTCZ{Ǥ ,ʠF֍onܤb %y-Ƶw*b~5OUؖkz* FkxΖqJ"-a>:zqu8F h!;8)Ez<&"|7p%?2Tw'`WFe(iF;3#}fH1v +t2Rk`K<9"vt]&Ӭ/$mQ˳ÿ%1r:u0D%Id(=;\.9sHlvGL׮]0V"WxO&w8UN":; fWآCKIፇ§RsidS{@]?֣[B剓Afngo ãXa!'u],-\A(VbXl%x#BO)>UN j)멏rg" a +PC3#8Yx=^ׅTb s>р$EsKUs|7ȔJY9vj\(r<շCqbOC2ԅdqjA%KȘٓIuҥjV\qSλ+>|Щ%02tͼ? s%sSAdW;؞:AJl&}mGCW2w8NpgG=97B>r=]a?-F<4*?&pԝ% qbp-,vتglQ3Ur +~53/*[@3eͫTeIr&SC~Tsz.ŝ'}qN&hzdc +=HL>oΟ__4Ȱ0Ov% S>W +6qyTL \hH\?M(G>_XFm# e1w\iQ3Jykr4FГdF:IiiF)ʦ@l=%JJ; }vg/|G MBcuQz>E8F70Ow\yި6¯1$ޠR>W3![n^::HVTQ)D:zJ,5+DђGc:e3[8;[՗iѺ=r8/H yd+^ CMch؝Tl-l?53f͉2R"o>xbbTtg9}hѐ kԎؒ:J0C5`QWT%||dN"<W8Ə7$)Y]@,<~[;|I +PB>4ZO|T➈B̐ ej hӵ*aQ +7@aEDȐyV-FG$/~w/q)r=Z&A&AT#4~;MH +DKm9)CB<\A|:&vYtWGNtSR]坷:cU^_=>Jh][HO(d$`_}i`0c\.-/A]`EM5ThK$/X-ąa~HDm;VQch4UO `CvC:)e +;g&7œ!r.]h2}c@U~2jӼܼ;&;~} P=wfN-ABPW;_`oQxM?|1-UdUWM =eVw*m<͆+J&e`* JJ$^b`il _@OmwLؤ65m9Z-Z] Apt2Y4.dAlKPI,xbz +g:X4kD\֠NEKjK>\+VA!>K kgg$jFH?AQt+w g8e vxZ .89 +ާ1ud:h:Rx O$ UIfzЬ2BX(N|"6Zk/;yZ_`S +}O!poJ_Kc@P!-GX{82ۙ+8STt'o['A&)"J-5;FyYJ{(b|( f })DDŽg Mbu0>hRI$8.qv>xYk^ҺšW)ǤK+@8 s*P$}.cgiP뫯!R)Jkkn%u%FQ4и=w;~*-iAJ 7+D|bqSQ+`sr.KI(\Z_{(E99Cz +"U~:@St9`cPQ(# 1d]@?cg`k>i ""o]#B]{Ux0"vz{($xy)\4:߸ZM4?,T}ifҀ|Sq +\ .J]ǽ9RлX Հ#.->%3Rl(;5nɅai7(c"/y,|2e8)j[f #0|5po_#0*wAѱ0}ؓ*i!kc'+@ݩU :W +ߧ8dϙ&5v#o()r*|/iG\̮8H(D³A(iז*epBQZñCTaas#Ҷhmf2RkE;ʽkiƴ znr&>Y{96J GxM+TF{ 2c:"•d:W&^QOX$/jG 1jPz!Hl;2bJ |{=X_xWp 6O#  XT';*?7}A]pb<Ld:Wj }UV_l_9O"I13N&gB^Q!<x;}Flg̋Z4_Fo\3#֣SqVļ2+m'DOy ޏO b4*_K- ݶFe^C X'+43BGTF +7 ǖSCȐP"7,]k+4 .EWFYQ8@Otd`Jk%wRضeGtc[ܞo3? W`8~:JK"\] btܺܬ5is.`‹%R#r-Tmأe)/ͫ;1`VWn8^W"A~D NnC} ?D 2GJoj=F%bNB惝CyHy_K|DSQUr`fG%4# +^.DHidRsF$P=0"G H]N]00g IY=۹!#þ#`'2#S: YyC:](SSl*;مx*)X|Ņ- Z7>$BO̥!my3-R9̵XA9w ټ+Cҁ&i1}&n''*&8έDĢ=#_CͯȯZ4Uէ̄(KD[K%U}ZS'J>h9yL?r[ޥ o%UdڣϹ+q@Uxmdُ`%.o[ +a:vNj&f2\)h9So`9u&n#c~uRS;U&e還1(/㘟vfWf +D(ZǒWODwy(Ud׿W> =vBa)X]<;ڨaBX- (A!g +J0`fk*ji+%?WzQݼO|.MƑW+g;>[|Rΰ84}1&Ǫ E#;RB +T-Gc)kqh' +;GI.BO~JebJ8ȨVQ +e +Ӆij᧽udBV6RP&]zC~!_4^b]ZRxS=M zOxgvU%3)sM inl_JU8]\(ǍK,M;eBt g<,uqΈ*fw^7$Yt /\@ФG/ɼ;) 7,ƋD= K  yFё _ZPpԘe(/IϤbb~UAݿE`h6Ѡ vYp.Ow} mr4Z u}EbWcf:ahi( >; 3u(,:X~>̖\9J-Wa(AgTY8 YvA{ +55 tݐ>E9C'1R"yG4ѹ5 D +:_ʐj\NjC>TMebqTѥDoevlg]Cbh¼jc~'ha~!qWL^TPK*a'@5(5` I<[jNw%= FŢ:L`*Ɍk2Aj?|Y3ڜɰbϛGtz]F^;T< \Q$g Ե325Z`-̰gW=Q$X 6s|쎀8Qf1g A֎ܑ)7\lo,-N LYbxq.)e~5e%o9'։qS/`'1AГkG}:/afItNލ',y %L3^Nn3C'r-mgDq0C}I>JШgiƽ*:/ʺ|ddUQ"J]CRїS|`wX#-OoČ\O&dƖw pL#1ShJtUHj&~rxrixAe[5jqMlM8C*ԛs{CL!.YEG:dx:Xn1ru"`tPЂ +^& 50B{7J%\zf.Pr9cb9vAkSW#ЍY`t؍tQ1I +Fr F]M,&VR [f*$ϏE"J:;+D(31+!Ks #NfԥnBNT6]5yϣ5I|h#p{+]|KǶPDӊN=E~6yZM{GVF֮DMtW$B;l ];w@Ed'챚3' ףʳ١-~:C 4쬸r%Ǎ`*f)E|M ;S:XF܍Zn|!MTO -m_b|D@) f*f-7UAy_-qY{-PoǶ;@䆬pm=eԳZOmCDQed$P̘I<|ss-+6G|K G|1kB)UtubwJ./;1rtqQ+qOq0p 2vBȊ^SsI1}ɑdf;N!RZ |x{SKT6^%Bʯ {NdTDFVl u@Rҕ_9YlŌ.Fq-W:9Vtބ+VGx @ըAX-FӪTl=L{R$ 3wQs}kpk㢃nBQ)s,#L/@iAPQ_v@ oaeȕc;oe2 += +pXL.!6Y,{ ` ^C*; h9N/bDB+#苤V0ugj QϹ`HACq4nG6rq KSLaЗDjrz\d%27|ޱ,:y1C/5w~Qzr 0!Lq r+oM,F/N)ۻ'sʽԼVQw7aRS{it&>'jC +o(oE{Y rBԮr%2[HpE#]mpAVbΫ{tYjrBMy-}PXù b;+,EH!˯4zVOo8 +wƵ(;rpK0,sgМw3c4GC쭓%C+(ƦȖJ\KM.h) +E4l6;1u\3ͯd0Sx=3"Pgv3m8v}T´,HHCtz娦GK$QZm{RC>-ZM,!ZgƒF19095&Tu¿X9ѥ:/C(Lr+K)q{kW_|hn5FWDv3Tt,(]>+BY5ob>9Asmf>[m3#Mvaݼ9$;m53jftm,̺!y#_Mǹg^@Mb4VϮTi,GM|waYqXyV^yTD#Լ*;3"؆KdCz2W\/O|uRis"}+2*܉yT_Wh)gѫ;JW?y02A:kHeE~Z-X +"!}?OMBtl ]bdEԫuqU,M~ n!Џ:PJM +OJ uyie Fm%w*4#[d֚(^:#[憄訿#?“/\Lk@Q4&̟ U;{"quy:UA5yHfT u +w3Q3dgGn(O3{$!mDVZt$2YZ#?2,Ar&jfƬ!WdG& C9 k6\* #\ACoiJjz2׆ +VT YG`% QyTӹe,̇`}%Щ3uđ֦3f*Afw&TiKe~0`oLTc0U :X¢W)]2 ǃׂ7#yX??pJqXȴd=#M+JקI"E]S嘟!v*R޶;8Z6i 9'?@6¼#qM%'nu^:| 5 BX!p2odA3|8cR)# Pݡ;r6$\6;DxMv0W["(Ր7F8vLR~=*|(Ji(?QŽ7bA@Y\Nf y(GDǞAcmL4#2ǂ F";㉅p$gX"kUef*U5~~nowۓpʨAt/l>K +P#R)-`>]&go`A-ؒiAɗM<&z^80*0瘥+ 3^(%pȃsSQ?uSO~*t+ãSz +=d}6JIvH6l l!gֆ\tgfAyKӨ)]4{P ?gΆqҊ+q,1ʥH)O;QODjdr"SEUsNJq<]fA!՟ft hu:t1fGA\IJDZWLG!Yr>Tj\7ya+xwB!R "b(~*^&:{8 %M#w\VPtM(\Aam uFm~j3޴=* u27>TOd@n endstream endobj 8 0 obj [7 0 R] endobj 52 0 obj <> endobj xref 0 53 0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000061431 00000 n +0000000000 00000 f +0000536092 00000 n +0000535728 00000 n +0000535542 00000 n +0002188030 00000 n +0000061482 00000 n +0000061895 00000 n +0000548368 00000 n +0000545685 00000 n +0000545572 00000 n +0000532323 00000 n +0000534981 00000 n +0000535029 00000 n +0000535612 00000 n +0000535643 00000 n +0000543744 00000 n +0000536334 00000 n +0000536591 00000 n +0000544065 00000 n +0000545720 00000 n +0000548442 00000 n +0000549162 00000 n +0000550518 00000 n +0000565801 00000 n +0000631389 00000 n +0000696977 00000 n +0000762565 00000 n +0000828153 00000 n +0000893741 00000 n +0000959329 00000 n +0001024917 00000 n +0001090505 00000 n +0001156093 00000 n +0001221681 00000 n +0001287269 00000 n +0001352857 00000 n +0001418445 00000 n +0001484033 00000 n +0001549621 00000 n +0001615209 00000 n +0001680797 00000 n +0001728914 00000 n +0001794502 00000 n +0001860090 00000 n +0001925678 00000 n +0001991266 00000 n +0002056854 00000 n +0002122442 00000 n +0002188053 00000 n +trailer <<86B2650A87464FF1BEA49FEBE523C26E>]>> startxref 2188267 %%EOF \ No newline at end of file diff --git a/ext/requests-logo.svg b/ext/requests-logo.svg new file mode 100755 index 0000000..80406e7 --- /dev/null +++ b/ext/requests-logo.svg @@ -0,0 +1 @@ +requestsRequestshumanshttp for \ No newline at end of file diff --git a/pytest.ini b/pytest.ini new file mode 100755 index 0000000..c1fa878 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = -p no:warnings \ No newline at end of file diff --git a/requests/__init__.py b/requests/__init__.py old mode 100644 new mode 100755 index db3586e..268e7dc --- a/requests/__init__.py +++ b/requests/__init__.py @@ -6,14 +6,14 @@ # / """ -requests HTTP library +Requests HTTP Library ~~~~~~~~~~~~~~~~~~~~~ Requests is an HTTP library, written in Python, for human beings. Basic GET usage: >>> import requests - >>> r = requests.get('http://python.org') + >>> r = requests.get('https://www.python.org') >>> r.status_code 200 >>> 'Python is a programming language' in r.content @@ -22,8 +22,8 @@ ... or POST: >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post("http://httpbin.org/post", data=payload) - >>> print r.text + >>> r = requests.post('http://httpbin.org/post', data=payload) + >>> print(r.text) { ... "form": { @@ -36,27 +36,74 @@ The other HTTP methods are supported - see `requests.api`. Full documentation is at . -:copyright: (c) 2012 by Kenneth Reitz. +:copyright: (c) 2017 by Kenneth Reitz. :license: Apache 2.0, see LICENSE for more details. - """ -__title__ = 'requests' -__version__ = '1.0.4' -__build__ = 0x01004 -__author__ = 'Kenneth Reitz' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2012 Kenneth Reitz' +import urllib3 +import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.22 + assert major == 1 + assert minor >= 21 + assert minor <= 22 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +try: + from urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() +except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + from . import utils +from . import packages from .models import Request, Response, PreparedRequest from .api import request, get, head, post, patch, put, delete, options from .sessions import session, Session from .status_codes import codes from .exceptions import ( RequestException, Timeout, URLRequired, - TooManyRedirects, HTTPError, ConnectionError + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout ) # Set default logging handler to avoid "No handler found" warnings. @@ -68,4 +115,7 @@ class NullHandler(logging.Handler): def emit(self, record): pass -logging.getLogger(__name__).addHandler(NullHandler()) \ No newline at end of file +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/requests/__version__.py b/requests/__version__.py new file mode 100755 index 0000000..dc33eef --- /dev/null +++ b/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.18.4' +__build__ = 0x021804 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2017 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/requests/_internal_utils.py b/requests/_internal_utils.py new file mode 100755 index 0000000..759d9a5 --- /dev/null +++ b/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/requests/adapters.py b/requests/adapters.py old mode 100644 new mode 100755 index 14dc3c1..76e6bc6 --- a/requests/adapters.py +++ b/requests/adapters.py @@ -8,54 +8,261 @@ and maintain connections. """ +import os.path import socket +from urllib3.poolmanager import PoolManager, proxy_from_url +from urllib3.response import HTTPResponse +from urllib3.util import Timeout as TimeoutSauce +from urllib3.util.retry import Retry +from urllib3.exceptions import ClosedPoolError +from urllib3.exceptions import ConnectTimeoutError +from urllib3.exceptions import HTTPError as _HTTPError +from urllib3.exceptions import MaxRetryError +from urllib3.exceptions import NewConnectionError +from urllib3.exceptions import ProxyError as _ProxyError +from urllib3.exceptions import ProtocolError +from urllib3.exceptions import ReadTimeoutError +from urllib3.exceptions import SSLError as _SSLError +from urllib3.exceptions import ResponseError + from .models import Response -from .packages.urllib3.poolmanager import PoolManager, proxy_from_url -from .hooks import dispatch_hook -from .compat import urlparse, basestring, urldefrag +from .compat import urlparse, basestring from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, - prepend_scheme_if_needed) + prepend_scheme_if_needed, get_auth_from_url, urldefragauth, + select_proxy) from .structures import CaseInsensitiveDict -from .packages.urllib3.exceptions import MaxRetryError -from .packages.urllib3.exceptions import TimeoutError -from .packages.urllib3.exceptions import SSLError as _SSLError -from .packages.urllib3.exceptions import HTTPError as _HTTPError from .cookies import extract_cookies_to_jar -from .exceptions import ConnectionError, Timeout, SSLError +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema) +from .auth import _basic_auth_str + +try: + from urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") +DEFAULT_POOLBLOCK = False DEFAULT_POOLSIZE = 10 DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None class BaseAdapter(object): - """The Base Transport Adapter""" + """ + .. The Base Transport Adapter + + ベースのトランスポートアダプタ。 + """ def __init__(self): super(BaseAdapter, self).__init__() - def send(self): + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """ + .. Sends PreparedRequest object. Returns Response object. + + PreparedRequest オブジェクトを送信します。Response オブジェクトを返却します。 + + .. :param request: The :class:`PreparedRequest ` being sent. + .. :param stream: (optional) Whether to stream the request content. + .. :param timeout: (optional) How long to wait for the server to send + .. data before giving up, as a float, or a :ref:`(connect timeout, + .. read timeout) ` tuple. + .. :type timeout: float or tuple + .. :param verify: (optional) Either a boolean, in which case it controls whether we verify + .. the server's TLS certificate, or a string, in which case it must be a path + .. to a CA bundle to use + .. :param cert: (optional) Any user-provided SSL certificate to be trusted. + .. :param proxies: (optional) The proxies dictionary to apply to the request. + + :param request: :class:`PreparedRequest ` が送信されます。 + :param stream: (任意) リクエストのコンテンツをストリーミングするかどうか。 + :param timeout: (任意) サーバーからのデータ返却をどれくらい待つかを float か :ref:`(connect timeout, read timeout) ` のタプルで指定します。 + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (任意) 信頼できるユーザーが提供している SSL 証明書。 + :param proxies: (任意) リクエストに付与するプロキシのディクショナリ。 + """ raise NotImplementedError def close(self): + """ + .. Cleans up adapter specific items. + + アダプタ特有の項目の後片付けをします。 + """ raise NotImplementedError class HTTPAdapter(BaseAdapter): - """Built-In HTTP Adapter for Urllib3.""" - def __init__(self, pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE): - self.max_retries = DEFAULT_RETRIES + """ + .. The built-in HTTP Adapter for urllib3. + + urllib3 用の組み込みの HTTP アダプタ。 + + .. Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session ` class under the + covers. + + Requests のセッションがトランスポートアダプタのインターフェースを実装することによって、 + HTTP と HTTPS の URL に接続するための一般的なユースケースで使うインターフェースを提供しています。 + このクラスは通常、:class:`Session ` クラスと使うために作成されます。 + + .. :param pool_connections: The number of urllib3 connection pools to cache. + .. :param pool_maxsize: The maximum number of connections to save in the pool. + .. :param max_retries: The maximum number of retries each connection + .. should attempt. Note, this applies only to failed DNS lookups, socket + .. connections and connection timeouts, never to requests where data has + .. made it to the server. By default, Requests does not retry failed + .. connections. If you need granular control over the conditions under + .. which we retry a request, import urllib3's ``Retry`` class and pass + .. that instead. + .. :param pool_block: Whether the connection pool should block for connections. + + :param pool_connections: キャッシュする urllib3 のコネクションプールの数。 + :param pool_maxsize: コネクションプールに保存する接続の最大数。 + :param max_retries: それぞれの接続が試行する最大回数。 + これは、失敗した DNS ルックアップ、ソケット接続、コネクションのタイムアウトのみ適用され、 + サーバーに送信したリクエストのデータには適用されません。 + デフォルトでは、Requests は失敗した接続の再試行をしません。 + リクエストを再試行する条件を細かく制御する必要がある場合、urllib3 の ``Retry`` + クラスをインポートし、代わりとして渡します。 + :param pool_block: コネクションプールが接続をブロックするかどうか。 + + .. Usage + + 使い方:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) self.config = {} + self.proxy_manager = {} super(HTTPAdapter, self).__init__() - self.init_poolmanager(pool_connections, pool_maxsize) + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return dict((attr, getattr(self, attr, None)) for attr in + self.__attrs__) + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. - def init_poolmanager(self, connections, maxsize): - self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize) + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager def cert_verify(self, conn, url, verify, cert): - if url.startswith('https') and verify: + """ + .. Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + SSL 証明書を検証します。 + このメソッドは、使用者のコードから呼び出されるべきではなくて、 + :class:`HTTPAdapter ` をサブクラス化して使う時のみ公開されます。 + + .. :param conn: The urllib3 connection object associated with the cert. + .. :param url: The requested URL. + .. :param verify: Either a boolean, in which case it controls whether we verify + .. the server's TLS certificate, or a string, in which case it must be a path + .. to a CA bundle to use + .. :param cert: The SSL certificate to verify. + + :param conn: 証明書に関連付けられた urllib3 のコネクションオブジェクト。 + :param url: リクエストした URL 。 + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: 検証する SSL 証明書。 + """ + if url.lower().startswith('https') and verify: cert_loc = None @@ -66,14 +273,20 @@ def cert_verify(self, conn, url, verify, cert): if not cert_loc: cert_loc = DEFAULT_CA_BUNDLE_PATH - if not cert_loc: - raise Exception("Could not find a suitable SSL CA certificate bundle.") + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {0}".format(cert_loc)) conn.cert_reqs = 'CERT_REQUIRED' - conn.ca_certs = cert_loc + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc else: conn.cert_reqs = 'CERT_NONE' conn.ca_certs = None + conn.ca_cert_dir = None if cert: if not isinstance(cert, basestring): @@ -81,8 +294,32 @@ def cert_verify(self, conn, url, verify, cert): conn.key_file = cert[1] else: conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {0}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {0}".format(conn.key_file)) def build_response(self, req, resp): + """ + .. Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + urllib3 のレスポンスから :class:`Response ` オブジェクトを構築します。 + これは、使用者のコードから呼び出されるべきではなくて、:class:`HTTPAdapter ` をサブクラス化して使う時のみ公開されます。 + + .. :param req: The :class:`PreparedRequest ` used to generate the response. + .. :param resp: The urllib3 response object. + .. :rtype: requests.Response + + :param req: レスポンスを生成するための :class:`PreparedRequest ` 。 + :param resp: urllib3 レスポンスオブジェクト。 + :rtype: requests.Response + """ response = Response() # Fallback to None if there's no status_code, for whatever reason. @@ -94,6 +331,7 @@ def build_response(self, req, resp): # Set encoding. response.encoding = get_encoding_from_headers(response.headers) response.raw = resp + response.reason = response.raw.reason if isinstance(req.url, bytes): response.url = req.url.decode('utf-8') @@ -107,87 +345,253 @@ def build_response(self, req, resp): response.request = req response.connection = self - # Run the Response hook. - response = dispatch_hook('response', req.hooks, response) return response def get_connection(self, url, proxies=None): - """Returns a connection for the given URL.""" - proxies = proxies or {} - proxy = proxies.get(urlparse(url).scheme) + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) if proxy: - proxy = prepend_scheme_if_needed(proxy, urlparse(url).scheme) - conn = proxy_from_url(proxy) + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() conn = self.poolmanager.connection_from_url(url) return conn def close(self): - """Dispose of any internal state. + """Disposes of any internal state. - Currently, this just closes the PoolManager, which closes pooled - connections. + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. """ self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() def request_url(self, request, proxies): """Obtain the url to use when making the final request. - If the message is being sent through a proxy, the full URL has to be - used. Otherwise, we should only use the path portion of the URL.""" - proxies = proxies or {} - proxy = proxies.get(urlparse(request.url).scheme) + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False if proxy: - url, _ = urldefrag(request.url) - else: - url = request.path_url + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) return url + def add_headers(self, request, **kwargs): + """ + .. Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter `. + + 接続に必要なヘッダーを追加します。 + v2.0 では、デフォルトでは何もしませんが、 + :class:`HTTPAdapter ` をサブクラスとして、 + 上書きするために残されています。 + + .. This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + これは使用者のコードから呼び出されるべきではなくて、 + :class:`HTTPAdapter ` をサブクラス化して使う時のみ公開されます。 + + .. :param request: The :class:`PreparedRequest ` to add headers to. + .. :param kwargs: The keyword arguments from the call to send(). + + :param request: ヘッダーに追加するための :class:`PreparedRequest `。 + :param kwargs: send() から呼び出された時に渡ってくるキーワード引数。 + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param proxies: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): - """Sends PreparedRequest object. Returns Response object.""" + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ conn = self.get_connection(request.url, proxies) self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) + self.add_headers(request) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {0}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) try: - # Send the request. - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout, - ) + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) - except socket.error as sockerr: - raise ConnectionError(sockerr) + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7+ versions, use buffering of HTTP + # responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 2.6 versions and back + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) except MaxRetryError as e: - raise ConnectionError(e) + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) except (_SSLError, _HTTPError) as e: if isinstance(e, _SSLError): - raise SSLError(e) - elif isinstance(e, TimeoutError): - raise Timeout(e) + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) else: - raise Timeout('Request timed out.') - - r = self.build_response(request, resp) - - if not stream: - r.content + raise - return r \ No newline at end of file + return self.build_response(request, resp) diff --git a/requests/api.py b/requests/api.py old mode 100644 new mode 100755 index 9ab53b5..bf9c032 --- a/requests/api.py +++ b/requests/api.py @@ -1,119 +1,236 @@ -# -*- coding: utf-8 -*- - -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. - -""" - -from . import sessions - - -def request(method, url, **kwargs): - """Constructs and sends a :class:`Request `. - Returns :class:`Response ` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload. - :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) Float describing the timeout of the request. - :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'http://httpbin.org/get') - - """ - - session = sessions.Session() - return session.request(method=method, url=url, **kwargs) - - -def get(url, **kwargs): - """Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return request('get', url, **kwargs) - - -def options(url, **kwargs): - """Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return request('options', url, **kwargs) - - -def head(url, **kwargs): - """Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return request('head', url, **kwargs) - - -def post(url, data=None, **kwargs): - """Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return request('post', url, data=data, **kwargs) - - -def put(url, data=None, **kwargs): - """Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return request('put', url, data=data, **kwargs) - - -def patch(url, data=None, **kwargs): - """Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return request('patch', url, data=data, **kwargs) - - -def delete(url, **kwargs): - """Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return request('delete', url, **kwargs) \ No newline at end of file +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """ + .. Constructs and sends a :class:`Request `. + + :class:`Request ` を生成し、送信します。 + + .. :param method: method for the new :class:`Request` object. + .. :param url: URL for the new :class:`Request` object. + .. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + .. :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + .. :param json: (optional) json data to send in the body of the :class:`Request`. + .. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + .. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + .. :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + .. ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + .. or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + .. defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + .. to add for the file. + .. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + .. :param timeout: (optional) How many seconds to wait for the server to send data + .. before giving up, as a float, or a :ref:`(connect timeout, read + .. timeout) ` tuple. + .. :type timeout: float or tuple + .. :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + .. :type allow_redirects: bool + .. :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + .. :param verify: (optional) Either a boolean, in which case it controls whether we verify + .. the server's TLS certificate, or a string, in which case it must be a path + .. to a CA bundle to use. Defaults to ``True``. + .. :param stream: (optional) if ``False``, the response content will be immediately downloaded. + .. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + .. :return: :class:`Response ` object + .. :rtype: requests.Response + + :param method: 新しく作成した :class:`Request` オブジェクトの HTTP メソッド。 + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param params: (任意) :class:`Request` のクエリ文字列として送信されるディクショナリ、もしくはバイトデータ。 + :param data: (任意) :class:`Request` のボディとして送信するディクショナリ、 + もしくは(フォームエンコードされた) ``[(key, value)]`` 形式のタプルの一覧、バイトデータ、ファイル形式のオブジェクト。 + :param json: (任意) :class:`Request` のボディとして送信する JSON データ。 + :param headers: (任意) :class:`Request` と一緒に送信するための HTTP ヘッダーのディクショナリ。 + :param cookies: (任意) :class:`Request` と一緒に送信するためのディクショナリか CookieJar オブジェクト。 + :param files: (任意) マルチパートのエンコーディングアップロードのための ``'name': file-like-objects`` (もしくは、``{'name': file-tuple}``) のディクショナリ。 + ``file-tuple`` は、``('filename', fileobj)`` 形式、``('filename', fileobj, 'content_type')`` 形式、``('filename', fileobj, 'content_type', custom_headers)`` 形式にできます。 + ``'content-type'`` は指定されたファイルのコンテントタイプを定義する文字列で、``custom_headers`` はファイルに追加するヘッダーを含むディクショナリ形式のオブジェクトです。 + :param auth: (任意) Basic / Digest / 独自の HTTP 認証を有効にするためのタプル。 + :param timeout: (任意) サーバーからのデータ返却をどれくらい待つかを float か :ref:`(connect timeout, read timeout) ` のタプルで指定します。 + :type timeout: float or tuple + :param allow_redirects: (任意) ブーリアン。GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD のリダイレクトを有効/無効にします。デフォルトは ``True`` です。 + :type allow_redirects: bool + :param proxies: (任意) プロキシへの URL にプロトコルをマッピングするためのディクショナリ。 + :param verify: (任意) ブーリアンの場合、サーバーの TLS 証明書を検証するか文字列を検証するかを制御します。 + この場合、使う認証局のバンドルへのパスでなければいけません。デフォルトは ``True`` 。 + :param stream: (任意) ``False`` の場合、レスポンスの内容はすぐにダウンロードが開始されます。 + :param cert: (任意) 文字列の場合は、SSL 証明書(.pem)へのパス。タプルの場合は、('cert', 'key') のペア。 + :return: :class:`Response ` オブジェクト。 + :rtype: requests.Response + + .. Usage + + 使い方:: + + >>> import requests + >>> req = requests.request('GET', 'http://httpbin.org/get') + + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r""" + .. Sends a GET request. + + GET リクエストを送信します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :return: :class:`Response ` object + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param params: (任意) :class:`Request` のクエリ文字列で送信されるディクショナリ、もしくはバイトデータ。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :return: :class:`Response ` オブジェクト。 + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + r""" + .. Sends a HEAD request. + + HEAD リクエストを送信します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :return: :class:`Response ` object + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :return: :class:`Response ` オブジェクト。 + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r""" + .. Sends a POST request. + + POST リクエストを送信します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + .. :param json: (optional) json data to send in the body of the :class:`Request`. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :return: :class:`Response ` object + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param data: (任意) :class:`Request` のボティで送信する(フォームエンコードされた)ディクショナリ、バイトデータ、ファイル形式のオブジェクト。 + :param json: (任意) :class:`Request` のボティで送信する JSON データ。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :return: :class:`Response ` オブジェクト。 + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r""" + .. Sends a PUT request. + + PUT リクエストを送信します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + .. :param json: (optional) json data to send in the body of the :class:`Request`. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :return: :class:`Response ` object + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param data: (任意) :class:`Request` のボティで送信する(フォームエンコードされた)ディクショナリ、バイトデータ、ファイル形式のオブジェクト。 + :param json: (任意) :class:`Request` のボティで送信する JSON データ。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :return: :class:`Response ` オブジェクト。 + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r""" + .. Sends a PATCH request. + + PATCH リクエストを送信します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + .. :param json: (optional) json data to send in the body of the :class:`Request`. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :return: :class:`Response ` object + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param data: (任意) :class:`Request` のボティで送信する(フォームエンコードされた)ディクショナリ、バイトデータ、ファイル形式のオブジェクト。 + :param json: (任意) :class:`Request` のボティで送信する JSON データ。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :return: :class:`Response ` オブジェクト。 + :rtype: requests.Response + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + r""" + .. Sends a DELETE request. + + DELETE リクエストを送信します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :return: :class:`Response ` object + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :return: :class:`Response ` オブジェクト。 + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/requests/auth.py b/requests/auth.py old mode 100644 new mode 100755 index 9d33e5f..ae36a62 --- a/requests/auth.py +++ b/requests/auth.py @@ -8,18 +8,19 @@ """ import os +import re import time import hashlib -import logging +import threading +import warnings from base64 import b64encode -from .compat import urlparse, str +from .compat import urlparse, str, basestring +from .cookies import extract_cookies_to_jar +from ._internal_utils import to_native_string from .utils import parse_dict_header - -log = logging.getLogger(__name__) - CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' CONTENT_TYPE_MULTI_PART = 'multipart/form-data' @@ -27,65 +28,148 @@ def _basic_auth_str(username, password): """Returns a Basic Auth string.""" - return 'Basic ' + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1') + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({0!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({0!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(password), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr class AuthBase(object): - """Base class that all auth implementations derive from""" + """ + .. Base class that all auth implementations derive from + + 全ての認証処理の実装が継承する基本となるクラス。 + """ def __call__(self, r): raise NotImplementedError('Auth hooks must be callable.') + class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" + """ + .. Attaches HTTP Basic Authentication to the given Request object. + + 渡した Request オブジェクトに HTTP Basic 認証を付与する。 + """ + def __init__(self, username, password): self.username = username self.password = password + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + def __call__(self, r): r.headers['Authorization'] = _basic_auth_str(self.username, self.password) return r class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authenetication to a given Request object.""" + """ + .. Attaches HTTP Proxy Authentication to a given Request object. + + 渡した Request オブジェクトに HTTP Proxy 認証を付与する。 + """ + def __call__(self, r): r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) return r class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" + """ + .. Attaches HTTP Digest Authentication to the given Request object. + + 渡した Request オブジェクトに HTTP Digest 認証を付与する。 + """ + def __init__(self, username, password): self.username = username self.password = password - self.last_nonce = '' - self.nonce_count = 0 - self.chal = {} + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None def build_digest_header(self, method, url): - - realm = self.chal['realm'] - nonce = self.chal['nonce'] - qop = self.chal.get('qop') - algorithm = self.chal.get('algorithm', 'MD5') - opaque = self.chal.get('opaque', None) - - algorithm = algorithm.upper() + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() # lambdas assume digest modules are imported at the top level - if algorithm == 'MD5': + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': def md5_utf8(x): if isinstance(x, str): x = x.encode('utf-8') return hashlib.md5(x).hexdigest() hash_utf8 = md5_utf8 - elif algorithm == 'SHA': + elif _algorithm == 'SHA': def sha_utf8(x): if isinstance(x, str): x = x.encode('utf-8') return hashlib.sha1(x).hexdigest() hash_utf8 = sha_utf8 - # XXX MD5-sess + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) if hash_utf8 is None: @@ -94,75 +178,132 @@ def sha_utf8(x): # XXX not implemented yet entdig = None p_parsed = urlparse(url) - path = p_parsed.path + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" if p_parsed.query: path += '?' + p_parsed.query A1 = '%s:%s:%s' % (self.username, realm, self.password) A2 = '%s:%s' % (method, path) - if qop == 'auth': - if nonce == self.last_nonce: - self.nonce_count += 1 - else: - self.nonce_count = 1 - - ncvalue = '%08x' % self.nonce_count - s = str(self.nonce_count).encode('utf-8') - s += nonce.encode('utf-8') - s += time.ctime().encode('utf-8') - s += os.urandom(8) - - cnonce = (hashlib.sha1(s).hexdigest()[:16]) - noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, hash_utf8(A2)) - respdig = KD(hash_utf8(A1), noncebit) - elif qop is None: - respdig = KD(hash_utf8(A1), "%s:%s" % (nonce, hash_utf8(A2))) + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) else: # XXX handle auth-int. return None - self.last_nonce = nonce + self._thread_local.last_nonce = nonce # XXX should the partial digests be encoded too? base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ - 'response="%s"' % (self.username, realm, nonce, path, respdig) + 'response="%s"' % (self.username, realm, nonce, path, respdig) if opaque: base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm if entdig: base += ', digest="%s"' % entdig - base += ', algorithm="%s"' % algorithm if qop: - base += ', qop=auth, nc=%s, cnonce="%s"' % (ncvalue, cnonce) + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) return 'Digest %s' % (base) - def handle_401(self, r): - """Takes the given response and tries digest-auth, if needed.""" + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. - num_401_calls = r.request.hooks['response'].count(self.handle_401) + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) s_auth = r.headers.get('www-authenticate', '') - if 'digest' in s_auth.lower() and num_401_calls < 2: + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: - self.chal = parse_dict_header(s_auth.replace('Digest ', '')) + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) # Consume content and release the original connection # to allow our new request to reuse the same one. r.content - r.raw.release_conn() - - r.request.headers['Authorization'] = self.build_digest_header(r.request.method, r.request.url) - _r = r.connection.send(r.request) + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) _r.history.append(r) + _r.request = prep return _r + self._thread_local.num_401_calls = 1 return r def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() # If we have a saved nonce, skip the 401 - if self.last_nonce: + if self._thread_local.last_nonce: r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None r.register_hook('response', self.handle_401) - return r \ No newline at end of file + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/requests/cacert.pem b/requests/cacert.pem deleted file mode 100644 index dfacf57..0000000 --- a/requests/cacert.pem +++ /dev/null @@ -1,3338 +0,0 @@ -## -## ca-bundle.crt -- Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Wed Jan 18 00:04:16 2012 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1 -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## - -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is the Netscape security libraries. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1994-2000 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** -# @(#) $RCSfile: certdata.txt,v $ $Revision: 1.81 $ $Date: 2012/01/17 22:02:37 $ - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 1 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMTAeFw05ODEy -MTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJE -NySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2i -o74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFGp5fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -ACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lNQseSJqBcNJo4cvj9axY+IO6CizEq -kzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4 -RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- - -Digital Signature Trust Co. Global CA 3 -======================================= ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJVUzEkMCIGA1UE -ChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQLEwhEU1RDQSBFMjAeFw05ODEy -MDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFs -IFNpZ25hdHVyZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGOD -VvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JS -xhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBo -BgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0 -dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFB6CTShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAM -BgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GB -AEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHRxdf0CiUPPXiBng+xZ8SQTGPdXqfi -up/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1 -mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo3QwcjARBglghkgBhvhC -AQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdER -gL7YibkIozH5oSQJFrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQh7A6tcOdBTcS -o8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z -2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjX -OP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 2 -============================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEXMBUGA1UE -ChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoT -DkVxdWlmYXggU2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn -2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5 -BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUx -JjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9e -uSBIplBqy/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAAyGgq3oThr1 -jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia -78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUm -V+GRMOrN ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx -ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 -XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk -lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB -lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy -lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt -66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn -wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh -D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy -BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie -J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud -DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU -a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv -Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 -UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm -VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK -+JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW -IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 -WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X -f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II -4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 -VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT -EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx -OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg -DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij -KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K -DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv -BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp -p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 -nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX -MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM -Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz -uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT -BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB -BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD -VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 -ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE -AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV -qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s -hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z -POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 -Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp -8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC -bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu -g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p -vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr -qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Firmaprofesional Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT -GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp -Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA -ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL -MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT -OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2 -ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V -j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH -lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf -3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8 -NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww -KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG -AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD -ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf -wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm -7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG -VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA= ------END CERTIFICATE----- - -Wells Fargo Root CA -=================== ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDAxMDExMTY0MTI4WhcNMjEwMTE0MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dl -bGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEv -MC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n135zHCLielTWi5MbqNQ1mX -x3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHESxP9cMIlrCL1dQu3U+SlK93OvRw6esP3 -E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4OJgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5 -OEL8pahbSCOz6+MlsoCultQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4j -sNtlAHCEAQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMBAAGj -YTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcBCzAyMDAGCCsGAQUF -BwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRwb2xpY3kwDQYJKoZIhvcNAQEFBQAD -ggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrv -m+0fazbuSCUlFLZWohDo7qd/0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0R -OhPs7fpvcmR7nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ33ZwmVxwQ023 -tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG -EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy -dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4 -MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln -aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC -IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM -MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF -NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe -AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC -b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn -7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN -cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp -WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5 -haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY -MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw -HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9 -MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn -jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ -MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H -VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl -vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl -OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3 -1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq -nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy -x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw -EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN -MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp -c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq -t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C -jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg -vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF -ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR -AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend -jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO -peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR -7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi -GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 -OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm -5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr -44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf -Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m -Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp -mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk -vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf -KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br -NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj -viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT -BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X -DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 -aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG -9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 -N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm -+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH -6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu -MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h -qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 -FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs -ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc -celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X -CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB -tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P -4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F -kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L -3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx -/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa -DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP -e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu -WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ -DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub -DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -AC Ra\xC3\xADz Certic\xC3\xA1mara S.A. -====================================== ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT -AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg -LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w -HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+ -U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh -IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN -yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU -2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3 -4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP -2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm -8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf -HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa -Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK -5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b -czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g -ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF -BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug -cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf -AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX -EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v -/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3 -MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4 -3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk -eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f -/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h -RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU -Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Class 3 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw -MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W -yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo -6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ -uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk -2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE -O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8 -yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9 -IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal -092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc -5A== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg -QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe -Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p -ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt -IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by -X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b -gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr -eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ -TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy -Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn -uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI -qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm -ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0 -Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW -Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t -FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm -zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k -XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT -bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU -RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK -1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt -2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ -Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9 -AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) Főtanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ -5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn -vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj -CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil -e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR -OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI -CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65 -48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi -trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737 -qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB -AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC -ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA -A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz -+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj -f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN -kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk -CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF -URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb -CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h -oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV -IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD -T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4 -MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG -A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk -WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD -YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew -MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb -m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk -HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT -xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2 -3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9 -2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq -TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz -4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU -9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv -bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg -aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP -eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk -zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1 -ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI -KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq -nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE -I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp -MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o -tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA== ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi -=================================================== ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz -ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3 -MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0 -cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u -aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY -8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y -jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI -JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk -9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG -SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d -F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq -D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4 -Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -TC TrustCenter Universal CA III -=============================== ------BEGIN CERTIFICATE----- -MIID4TCCAsmgAwIBAgIOYyUAAQACFI0zFQLkbPQwDQYJKoZIhvcNAQEFBQAwezELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEoMCYGA1UEAxMfVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIElJSTAe -Fw0wOTA5MDkwODE1MjdaFw0yOTEyMzEyMzU5NTlaMHsxCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNU -QyBUcnVzdENlbnRlciBHbWJIMSQwIgYDVQQLExtUQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0Ex -KDAmBgNVBAMTH1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJSUkwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQDC2pxisLlxErALyBpXsq6DFJmzNEubkKLF5+cvAqBNLaT6hdqbJYUt -QCggbergvbFIgyIpRJ9Og+41URNzdNW88jBmlFPAQDYvDIRlzg9uwliT6CwLOunBjvvya8o84pxO -juT5fdMnnxvVZ3iHLX8LR7PH6MlIfK8vzArZQe+f/prhsq75U7Xl6UafYOPfjdN/+5Z+s7Vy+Eut -CHnNaYlAJ/Uqwa1D7KRTyGG299J5KmcYdkhtWyUB0SbFt1dpIxVbYYqt8Bst2a9c8SaQaanVDED1 -M4BDj5yjdipFtK+/fz6HP3bFzSreIMUWWMv5G/UPyw0RUmS40nZid4PxWJ//AgMBAAGjYzBhMB8G -A1UdIwQYMBaAFFbn4VslQ4Dg9ozhcbyO5YAvxEjiMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgEGMB0GA1UdDgQWBBRW5+FbJUOA4PaM4XG8juWAL8RI4jANBgkqhkiG9w0BAQUFAAOCAQEA -g8ev6n9NCjw5sWi+e22JLumzCecYV42FmhfzdkJQEw/HkG8zrcVJYCtsSVgZ1OK+t7+rSbyUyKu+ -KGwWaODIl0YgoGhnYIg5IFHYaAERzqf2EQf27OysGh+yZm5WZ2B6dF7AbZc2rrUNXWZzwCUyRdhK -BgePxLcHsU0GDeGl6/R1yrqc0L2z0zIkTO5+4nYES0lT2PLpVDP85XEfPRRclkvxOvIAu2y0+pZV -CIgJwcyRGSmwIC3/yzikQOEXvnlhgP8HA4ZMTnsGnxGGjYnuJ8Tb4rwZjgvDwxPHLQNjO9Po5KIq -woIIlBZU8O8fJ5AluA0OKBtHd0e9HKgl8ZS0Zg== ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG -EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz -MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu -QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ -03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK -ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU -+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC -PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT -OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK -F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK -0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ -0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB -leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID -AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ -SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG -NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx -MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O -BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l -Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga -kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q -hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs -g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 -aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 -nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC -ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo -Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z -WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- \ No newline at end of file diff --git a/requests/certs.py b/requests/certs.py old mode 100644 new mode 100755 index eb7f105..d1a378d --- a/requests/certs.py +++ b/requests/certs.py @@ -2,30 +2,17 @@ # -*- coding: utf-8 -*- """ -certs.py -~~~~~~~~ +requests.certs +~~~~~~~~~~~~~~ -This module returns the preferred default CA certificate bundle. +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. If you are packaging Requests, e.g., for a Linux distribution or a managed environment, you can change the definition of where() to return a separately packaged CA bundle. """ - -import os.path - -certifi = None -try: - import certifi -except ImportError: - pass - -def where(): - """Return the preferred certificate bundle.""" - if certifi: - return certifi.where() - - return os.path.join(os.path.dirname(__file__), 'cacert.pem') +from certifi import where if __name__ == '__main__': - print(where()) \ No newline at end of file + print(where()) diff --git a/requests/compat.py b/requests/compat.py old mode 100644 new mode 100755 index d23d0ca..f417cfd --- a/requests/compat.py +++ b/requests/compat.py @@ -1,10 +1,14 @@ # -*- coding: utf-8 -*- """ -pythoncompat +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. """ -from .packages import charade as chardet +import chardet import sys @@ -21,58 +25,6 @@ #: Python 3.x? is_py3 = (_ver[0] == 3) -#: Python 3.0.x -is_py30 = (is_py3 and _ver[1] == 0) - -#: Python 3.1.x -is_py31 = (is_py3 and _ver[1] == 1) - -#: Python 3.2.x -is_py32 = (is_py3 and _ver[1] == 2) - -#: Python 3.3.x -is_py33 = (is_py3 and _ver[1] == 3) - -#: Python 3.4.x -is_py34 = (is_py3 and _ver[1] == 4) - -#: Python 2.7.x -is_py27 = (is_py2 and _ver[1] == 7) - -#: Python 2.6.x -is_py26 = (is_py2 and _ver[1] == 6) - -#: Python 2.5.x -is_py25 = (is_py2 and _ver[1] == 5) - -#: Python 2.4.x -is_py24 = (is_py2 and _ver[1] == 4) # I'm assuming this is not by choice. - - -# --------- -# Platforms -# --------- - - -# Syntax sugar. -_ver = sys.version.lower() - -is_pypy = ('pypy' in _ver) -is_jython = ('jython' in _ver) -is_ironpython = ('iron' in _ver) - -# Assume CPython, if nothing else. -is_cpython = not any((is_pypy, is_jython, is_ironpython)) - -# Windows-based system. -is_windows = 'win32' in str(sys.platform).lower() - -# Standard Linux 2+ system. -is_linux = ('linux' in str(sys.platform).lower()) -is_osx = ('darwin' in str(sys.platform).lower()) -is_hpux = ('hpux' in str(sys.platform).lower()) # Complete guess. -is_solaris = ('solar==' in str(sys.platform).lower()) # Complete guess. - try: import simplejson as json except ImportError: @@ -83,25 +35,27 @@ # --------- if is_py2: - from urllib import quote, unquote, quote_plus, unquote_plus, urlencode + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag from urllib2 import parse_http_list import cookielib from Cookie import Morsel from StringIO import StringIO - from .packages.urllib3.packages.ordered_dict import OrderedDict + + from urllib3.packages.ordered_dict import OrderedDict builtin_str = str bytes = str str = unicode basestring = basestring numeric_types = (int, long, float) - - + integer_types = (int, long) elif is_py3: from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag - from urllib.request import parse_http_list + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment from http import cookiejar as cookielib from http.cookies import Morsel from io import StringIO @@ -111,4 +65,5 @@ str = str bytes = bytes basestring = (str, bytes) - numeric_types = (int, float) \ No newline at end of file + numeric_types = (int, float) + integer_types = (int,) diff --git a/requests/cookies.py b/requests/cookies.py old mode 100644 new mode 100755 index fd4ed44..99a3a75 --- a/requests/cookies.py +++ b/requests/cookies.py @@ -1,373 +1,616 @@ -# -*- coding: utf-8 -*- - -""" -Compatibility code to be able to use `cookielib.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -import collections -from .compat import cookielib, urlparse, Morsel - -try: - import threading - # grr, pyflakes: this fixes "redefinition of unused 'threading'" - threading -except ImportError: - import dummy_threading as threading - - -class MockRequest(object): - """Wraps a `requests.Request` to mimic a `urllib2.Request`. - - The code in `cookielib.CookieJar` expects this interface in order to correctly - manage cookie policies, i.e., determine whether a cookie can be set, given the - domains of the request and the cookie. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - def __init__(self, request): - self._r = request - self._new_headers = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self): - return self.type - - def get_host(self): - return urlparse(self._r.url).netloc - - def get_origin_req_host(self): - return self.get_host() - - def get_full_url(self): - return self._r.url - - def is_unverifiable(self): - return True - - def has_header(self, name): - return name in self._r.headers or name in self._new_headers - - def get_header(self, name, default=None): - return self._r.headers.get(name, self._new_headers.get(name, default)) - - def add_header(self, key, val): - """cookielib has no legitimate use for this method; add it back if you find one.""" - raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") - - def add_unredirected_header(self, name, value): - self._new_headers[name] = value - - def get_new_headers(self): - return self._new_headers - - @property - def unverifiable(self): - return self.is_unverifiable() - - -class MockResponse(object): - """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. - - ...what? Basically, expose the parsed HTTP headers from the server response - the way `cookielib` expects to see them. - """ - - def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self): - return self._headers - - def getheaders(self, name): - self._headers.getheaders(name) - - -def extract_cookies_to_jar(jar, request, response): - """Extract the cookies from the response into a CookieJar. - - :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) - :param request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) - - -def get_cookie_header(jar, request): - """Produce an appropriate Cookie header string to be sent with `request`, or None.""" - r = MockRequest(request) - jar.add_cookie_header(r) - return r.get_new_headers().get('Cookie') - - -def remove_cookie_by_name(cookiejar, name, domain=None, path=None): - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables = [] - for cookie in cookiejar: - if cookie.name == name: - if domain is None or domain == cookie.domain: - if path is None or path == cookie.path: - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific.""" - - -class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Don't use the dict interface internally; it's just for compatibility with - with external client code. All `requests` code should work out of the box - with externally provided instances of CookieJar, e.g., LWPCookieJar and - FileCookieJar. - - Caution: dictionary operations that are normally O(1) may be O(n). - - Unlike a regular CookieJar, this class is pickleable. - """ - - def get(self, name, default=None, domain=None, path=None): - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. Caution: operation is O(n), not O(1).""" - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set(self, name, value, **kwargs): - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains.""" - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def keys(self): - """Dict-like keys() that returns a list of names of cookies from the jar. - See values() and items().""" - keys = [] - for cookie in iter(self): - keys.append(cookie.name) - return keys - - def values(self): - """Dict-like values() that returns a list of values of cookies from the jar. - See keys() and items().""" - values = [] - for cookie in iter(self): - values.append(cookie.value) - return values - - def items(self): - """Dict-like items() that returns a list of name-value tuples from the jar. - See keys() and values(). Allows client-code to call "dict(RequestsCookieJar) - and get a vanilla python dict of key value pairs.""" - items = [] - for cookie in iter(self): - items.append((cookie.name, cookie.value)) - return items - - def list_domains(self): - """Utility method to list all the domains in the jar.""" - domains = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self): - """Utility method to list all the paths in the jar.""" - paths = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self): - """Returns True if there are multiple domains in the jar. - Returns False otherwise.""" - domains = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain old - Python dict of name-value pairs of cookies that meet the requirements.""" - dictionary = {} - for cookie in iter(self): - if (domain is None or cookie.domain == domain) and (path is None - or cookie.path == path): - dictionary[cookie.name] = cookie.value - return dictionary - - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws exception - if there are more than one cookie with name. In that case, use the more - explicit get() method instead. Caution: operation is O(n), not O(1).""" - return self._find_no_duplicates(name) - - def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws exception - if there is already a cookie of that name in the jar. In that case, use the more - explicit set() method instead.""" - self.set(name, value) - - def __delitem__(self, name): - """Deletes a cookie given a name. Wraps cookielib.CookieJar's remove_cookie_by_name().""" - remove_cookie_by_name(self, name) - - def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. Takes as args name - and optional domain and path. Returns a cookie.value. If there are conflicting cookies, - _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown - if there are conflicting cookies.""" - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def _find_no_duplicates(self, name, domain=None, path=None): - """__get_item__ and get call _find_no_duplicates -- never used in Requests internally. - Takes as args name and optional domain and path. Returns a cookie.value. - Throws KeyError if cookie is not found and CookieConflictError if there are - multiple cookies that match name and optionally domain and path.""" - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: # if there are multiple cookies that meet passed in criteria - raise CookieConflictError('There are multiple cookies with name, %r' % (name)) - toReturn = cookie.value # we will eventually return this as long as no cookie conflict - - if toReturn: - return toReturn - raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) - - def __getstate__(self): - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop('_cookies_lock') - return state - - def __setstate__(self, state): - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if '_cookies_lock' not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self): - """This is not implemented. Calling this will throw an exception.""" - raise NotImplementedError - - -def create_cookie(name, value, **kwargs): - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result = dict( - version=0, - name=name, - value=value, - port=None, - domain='', - path='/', - secure=False, - expires=None, - discard=True, - comment=None, - comment_url=None, - rest={'HttpOnly': None}, - rfc2109=False,) - - badargs = set(kwargs) - set(result) - if badargs: - err = 'create_cookie() got unexpected keyword arguments: %s' - raise TypeError(err % list(badargs)) - - result.update(kwargs) - result['port_specified'] = bool(result['port']) - result['domain_specified'] = bool(result['domain']) - result['domain_initial_dot'] = result['domain'].startswith('.') - result['path_specified'] = bool(result['path']) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel): - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - c = create_cookie( - name=morsel.key, - value=morsel.value, - version=morsel['version'] or 0, - port=None, - port_specified=False, - domain=morsel['domain'], - domain_specified=bool(morsel['domain']), - domain_initial_dot=morsel['domain'].startswith('.'), - path=morsel['path'], - path_specified=bool(morsel['path']), - secure=bool(morsel['secure']), - expires=morsel['max-age'] or morsel['expires'], - discard=False, - comment=morsel['comment'], - comment_url=bool(morsel['comment']), - rest={'HttpOnly': morsel['httponly']}, - rfc2109=False,) - return c - - -def cookiejar_from_dict(cookie_dict, cookiejar=None): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - for name in cookie_dict: - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - return cookiejar \ No newline at end of file +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar +import collections + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """ + Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """ + .. There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + + CookieJar に指定した Cookie と同じものがあります。 + .get と .set を使って、別のドメインとパスを引数に含めます。 + """ + + +class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + .. This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + いくつかのクライアントがディクショナリの操作をするための response.cookies と session.cookies を + サポートしていることを想定しているかもしれないので、リクエストとセッションをデフォルトで指定しないように生成した + CookieJar です。 + + .. Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Requests は内部的にディクショナリのインターフェースを使用していません。 + それは外部クライアントのコードとの互換性のためです。 + 全てのリクエストのコードは、外部から提供された ``CookieJar`` のインスタンス(例: ``LWPCookieJar`` や ``FileCookieJar``)を使って動作します。 + + .. Unlike a regular CookieJar, this class is pickleable. + + 通常の CookieJar とは異なり、このクラスは Pickle 化することが可能です。 + + .. warning dictionary operations that are normally O(1) may be O(n). + + .. warning:: 通常は O(1) となるディクショナリの処理は、O(n) とすることができる。 + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """ + .. Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + ディクショナリの iterkeys() のように、jar から Cookie の名前を返すイテレータを返却します。 + + .. seealso itervalues() and iteritems(). + + .. seealso:: itervalues() と iteritems() 。 + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """ + .. Dict-like keys() that returns a list of names of cookies from the + jar. + + ディクショナリの keys() のように、jar から Cookie の名前のリストを返却します。 + + .. seealso values() and items(). + + .. seealso:: values() と items() 。 + """ + return list(self.iterkeys()) + + def itervalues(self): + """ + .. Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + ディクショナリの itervalues() のように、jar から Cookie の値を返すイテレータを返却します。 + + .. seealso iterkeys() and iteritems(). + + .. seealso:: iterkeys() と iteritems() 。 + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """ + .. Dict-like values() that returns a list of values of cookies from the + jar. + + ディクショナリの values() のように、jar から Cookie の値のリストを返却します。 + + .. seealso keys() and items(). + + .. seealso:: keys() と items() 。 + """ + return list(self.itervalues()) + + def iteritems(self): + """ + .. Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + ディクショナリの iteritems() のように、jar から名前と値のタプルのイテレータを返却します。 + + .. seealso iterkeys() and itervalues(). + + .. seealso:: iterkeys() と itervalues() 。 + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """ + .. Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + jar の名前と値のタプルのリストを返すディクショナリ形式の items()。 + クライアントコードで ``dict(RequestsCookieJar)`` を呼び出して、 + Vanilla Python のキーと値のペアのディクショナリを取得できるようにします。 + + .. seealso keys() and values(). + + .. seealso:: keys() と values() 。 + """ + return list(self.iteritems()) + + def list_domains(self): + """ + .. Utility method to list all the domains in the jar. + + jar 内の全てのドメインの一覧を表示するユーティリティメソッド。 + """ + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """ + .. Utility method to list all the paths in the jar. + + jar 内の全てのパスの一覧を表示するユーティリティメソッド。 + """ + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """ + .. Returns True if there are multiple domains in the jar. + Returns False otherwise. + + jar に複数のドメインがある場合は True を返し、そうでなければ False を返します。 + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """ + .. Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + 引数として、任意のドメインとパスを受け取り、要件を満たす Cookie の名前と値のペアの古い Python のディクショナリを返却します。 + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """ + .. Updates this jar with cookies from another CookieJar or dict-like + + この jar を別の CookieJar かディクショナリ形式の Cookie に更新します。 + """ + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.update(self) + return new_cj + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = dict( + version=0, + name=name, + value=value, + port=None, + domain='', + path='/', + secure=False, + expires=None, + discard=True, + comment=None, + comment_url=None, + rest={'HttpOnly': None}, + rfc2109=False,) + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """ + .. Returns a CookieJar from a key/value dictionary. + + キー/値のディクショナリから CookieJar を返却します。 + + .. :param cookie_dict: Dict of key/values to insert into CookieJar. + .. :param cookiejar: (optional) A cookiejar to add the cookies to. + .. :param overwrite: (optional) If False, will not replace cookies + .. already in the jar with new ones. + + :param cookie_dict: CookieJar に入れるキー/値のディクショナリ。 + :param cookiejar: (任意) Cookie に追加するための CookieJar。 + :param overwrite: (任意) False にすると、すでに Jar にある Cookie を新しいものに置き換えません。 + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/requests/exceptions.py b/requests/exceptions.py old mode 100644 new mode 100755 index 922486f..3b25412 --- a/requests/exceptions.py +++ b/requests/exceptions.py @@ -5,22 +5,47 @@ ~~~~~~~~~~~~~~~~~~~ This module contains the set of Requests' exceptions. - """ +from urllib3.exceptions import HTTPError as BaseHTTPError + + +class RequestException(IOError): + """ + .. There was an ambiguous exception that occurred while handling your + request. + リクエストの処理中に原因不明な例外が起きた時に送出されます。 + """ -class RequestException(RuntimeError): - """There was an ambiguous exception that occurred while handling your - request.""" + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) class HTTPError(RequestException): - """An HTTP error occurred.""" - response = None + """ + .. An HTTP error occurred. + + HTTP エラーが起きた時に送出されます。 + """ class ConnectionError(RequestException): - """A Connection error occurred.""" + """ + .. A Connection error occurred. + + コネクションエラーが起きた時に送出されます。 + """ + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" class SSLError(ConnectionError): @@ -28,15 +53,54 @@ class SSLError(ConnectionError): class Timeout(RequestException): - """The request timed out.""" + """ + .. The request timed out. + + リクエストがタイムアウトした時に送出されます。 + + .. Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + + このエラーを受け取ると、:exc:`~requests.exceptions.ConnectTimeout` と + :exc:`~requests.exceptions.ReadTimeout` の2つのエラーを受け取ることになります。 + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """ + .. The request timed out while trying to connect to the remote server. + + リモートサーバーに接続しようとして、リクエストがタイムアウトした時に送出されます。 + + .. Requests that produced this error are safe to retry. + + このエラーが発生したリクエストは、再度実行しても問題ありません。 + """ + + +class ReadTimeout(Timeout): + """ + .. The server did not send any data in the allotted amount of time. + + サーバーが設定された時間内にデータを返却しなかった場合に送出されます。 + """ class URLRequired(RequestException): - """A valid URL is required to make a request.""" + """ + .. A valid URL is required to make a request. + + リクエストを生成するときに有効な URL が必要です。 + """ class TooManyRedirects(RequestException): - """Too many redirects.""" + """ + .. Too many redirects. + + リダイレクト回数が多すぎる時に送出されます。 + """ class MissingSchema(RequestException, ValueError): @@ -48,4 +112,45 @@ class InvalidSchema(RequestException, ValueError): class InvalidURL(RequestException, ValueError): - """ The URL provided was somehow invalid. """ \ No newline at end of file + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/requests/help.py b/requests/help.py new file mode 100755 index 0000000..5440ee6 --- /dev/null +++ b/requests/help.py @@ -0,0 +1,120 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +import idna +import urllib3 +import chardet + +from . import __version__ as requests_version + +try: + from .packages.urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module. + system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None) + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/requests/hooks.py b/requests/hooks.py old mode 100644 new mode 100755 index be873e4..32b32de --- a/requests/hooks.py +++ b/requests/hooks.py @@ -10,34 +10,25 @@ ``response``: The response generated from a Request. - """ - - HOOKS = ['response'] + def default_hooks(): - hooks = {} - for event in HOOKS: - hooks[event] = [] - return hooks + return dict((event, []) for event in HOOKS) # TODO: response is the only one -def dispatch_hook(key, hooks, hook_data): - """Dispatches a hook dictionary on a given piece of data.""" +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" hooks = hooks or dict() - - if key in hooks: - hooks = hooks.get(key) - + hooks = hooks.get(key) + if hooks: if hasattr(hooks, '__call__'): hooks = [hooks] - for hook in hooks: - _hook_data = hook(hook_data) + _hook_data = hook(hook_data, **kwargs) if _hook_data is not None: hook_data = _hook_data - - return hook_data \ No newline at end of file + return hook_data diff --git a/requests/models.py b/requests/models.py old mode 100644 new mode 100755 index ec802f6..e4dfe4a --- a/requests/models.py +++ b/requests/models.py @@ -1,607 +1,1089 @@ -# -*- coding: utf-8 -*- - -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import collections -import logging - -from io import BytesIO -from .hooks import default_hooks -from .structures import CaseInsensitiveDict -from .status_codes import codes - -from .auth import HTTPBasicAuth -from .cookies import cookiejar_from_dict, get_cookie_header -from .packages.urllib3.filepost import encode_multipart_formdata -from .exceptions import HTTPError, RequestException, MissingSchema, InvalidURL -from .utils import ( - stream_untransfer, guess_filename, requote_uri, - stream_decode_response_unicode, to_key_val_list, parse_header_links, - iter_slices, guess_json_utf) -from .compat import ( - cookielib, urlparse, urlunparse, urlsplit, urlencode, str, bytes, StringIO, - is_py2, chardet, json, builtin_str, basestring) - -REDIRECT_STATI = (codes.moved, codes.found, codes.other, codes.temporary_moved) -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 10 * 1024 - -log = logging.getLogger(__name__) - - -class RequestEncodingMixin(object): - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = '/' - - url.append(path) - - query = p.query - if query: - url.append('?') - url.append(query) - - return ''.join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but abritrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, 'read'): - return data - elif hasattr(data, '__iter__'): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): - vs = [vs] - for v in vs: - if v is not None: - result.append( - (k.encode('utf-8') if isinstance(k, str) else k, - v.encode('utf-8') if isinstance(v, str) else v)) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but abritrary - if parameters are supplied as a dict. - - """ - if (not files) or isinstance(data, str): - return None - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, list): - for v in val: - new_fields.append((field, builtin_str(v))) - else: - new_fields.append((field, builtin_str(val))) - - for (k, v) in files: - # support for explicit filename - if isinstance(v, (tuple, list)): - fn, fp = v - else: - fn = guess_filename(v) or k - fp = v - if isinstance(fp, str): - fp = StringIO(fp) - if isinstance(fp, bytes): - fp = BytesIO(fp) - new_fields.append((k, (fn, fp.read()))) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin(object): - def register_hook(self, event, hook): - """Properly register a hook.""" - - if isinstance(hook, collections.Callable): - self.hooks[event].append(hook) - elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request ` object. - - Used to prepare a :class:`PreparedRequest `, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach the request. If a dictionary is provided, form-encoding will take place. - :param params: dictionary of URL parameters to append to the URL. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') - >>> req.prepare() - - - """ - def __init__(self, - method=None, - url=None, - headers=None, - files=None, - data=dict(), - params=dict(), - auth=None, - cookies=None, - hooks=None): - - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.params = params - self.auth = auth - self.cookies = cookies - self.hooks = hooks - - def __repr__(self): - return '' % (self.method) - - def prepare(self): - """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" - p = PreparedRequest() - - p.prepare_method(self.method) - p.prepare_url(self.url, self.params) - p.prepare_headers(self.headers) - p.prepare_cookies(self.cookies) - p.prepare_body(self.data, self.files) - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - p.prepare_auth(self.auth) - - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest ` object, - containing the exact bytes that will be sent to the server. - - Generated from either a :class:`Request ` object or manually. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'http://httpbin.org/get') - >>> r = req.prepare() - - - >>> s = requests.Session() - >>> s.send(r) - - - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - - def __repr__(self): - return '' % (self.method) - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = self.method.upper() - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - try: - url = unicode(url) - except NameError: - # We're on Python 3. - url = str(url) - except UnicodeDecodeError: - pass - - # Support for unicode domain names and paths. - scheme, netloc, path, _params, query, fragment = urlparse(url) - - if not scheme: - raise MissingSchema("Invalid URL %r: No schema supplied" % url) - - try: - netloc = netloc.encode('idna').decode('utf-8') - except UnicodeError: - raise InvalidURL('URL has an invalid label.') - - # Bare domains aren't valid URLs. - if not path: - path = '/' - - if is_py2: - if isinstance(scheme, str): - scheme = scheme.encode('utf-8') - if isinstance(netloc, str): - netloc = netloc.encode('utf-8') - if isinstance(path, str): - path = path.encode('utf-8') - if isinstance(_params, str): - _params = _params.encode('utf-8') - if isinstance(query, str): - query = query.encode('utf-8') - if isinstance(fragment, str): - fragment = fragment.encode('utf-8') - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = '%s&%s' % (query, enc_params) - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, _params, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - if headers: - self.headers = CaseInsensitiveDict(headers) - else: - self.headers = CaseInsensitiveDict() - - def prepare_body(self, data, files): - """Prepares the given HTTP body data.""" - - # If a generator is provided, error out. - if isinstance(data, type(_ for _ in [])): - raise NotImplementedError('Generator bodies are not supported yet.') - - # Nottin' on you. - body = None - content_type = None - - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - - body = self._encode_params(data) - if isinstance(data, str) or isinstance(data, builtin_str) or hasattr(data, 'read'): - content_type = None - else: - content_type = 'application/x-www-form-urlencoded' - - self.headers['Content-Length'] = '0' - if hasattr(body, 'seek') and hasattr(body, 'tell'): - body.seek(0, 2) - self.headers['Content-Length'] = str(body.tell()) - body.seek(0, 0) - elif body is not None: - self.headers['Content-Length'] = str(len(body)) - - # Add content-type if it wasn't explicitly provided. - if (content_type) and (not 'content-type' in self.headers): - self.headers['Content-Type'] = content_type - - self.body = body - - def prepare_auth(self, auth): - """Prepares the given HTTP auth data.""" - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data.""" - - if isinstance(cookies, cookielib.CookieJar): - cookies = cookies - else: - cookies = cookiejar_from_dict(cookies) - - if 'cookie' not in self.headers: - cookie_header = get_cookie_header(cookies, self) - if cookie_header is not None: - self.headers['Cookie'] = cookie_header - - -class Response(object): - """The :class:`Response ` object, which contains a - server's response to an HTTP request. - """ - - def __init__(self): - super(Response, self).__init__() - - self._content = False - self._content_consumed = False - - #: Integer Code of responded HTTP Status. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Requires that ``stream=True` on the request. - # This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response ` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - def __repr__(self): - return '' % (self.status_code) - - def __bool__(self): - """Returns true if :attr:`status_code` is 'OK'.""" - return self.ok - - def __nonzero__(self): - """Returns true if :attr:`status_code` is 'OK'.""" - return self.ok - - @property - def ok(self): - try: - self.raise_for_status() - except RequestException: - return False - return True - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the lovely Charade library - (Thanks, Ian!).""" - return chardet.detect(self.content)['encoding'] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. This avoids reading the content - at once into memory for large responses. The chunk size is the number - of bytes it should read into memory. This is not necessarily the - length of each item returned as decoding can take place. - """ - if self._content_consumed: - # simulate reading small chunks of the content - return iter_slices(self._content, chunk_size) - - def generate(): - while 1: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - self._content_consumed = True - - gen = stream_untransfer(generate(), self) - - if decode_unicode: - gen = stream_decode_response_unicode(gen, self) - - return gen - - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None): - """Iterates over the response data, one line at a time. This - avoids reading the content at once into memory for large - responses. - """ - - pending = None - - for chunk in self.iter_content( - chunk_size=chunk_size, - decode_unicode=decode_unicode): - - if pending is not None: - chunk = pending + chunk - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - for line in lines: - yield line - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - try: - if self._content_consumed: - raise RuntimeError( - 'The content for this response was already consumed') - - if self.status_code is 0: - self._content = None - else: - self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() - - except AttributeError: - self._content = None - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - if Response.encoding is None and chardet module is available, encoding - will be guessed. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return str('') - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors='replace') - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors='replace') - - return content - - def json(self): - """Returns the json-encoded content of a response, if any.""" - - if not self.encoding and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using chardet to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - return json.loads(self.content.decode(encoding)) - return json.loads(self.text or self.content) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers['link'] - - # l = MultiDict() - l = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get('rel') or link.get('url') - l[key] = link - - return l - - def raise_for_status(self): - """Raises stored :class:`HTTPError` or :class:`URLError`, if one occurred.""" - - http_error_msg = '' - - if 400 <= self.status_code < 500: - http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason) - - elif 500 <= self.status_code < 600: - http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason) - - if http_error_msg: - http_error = HTTPError(http_error_msg) - http_error.response = self - raise http_error - - def close(self): - return self.raw.release_conn() \ No newline at end of file +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import collections +import datetime +import sys + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. +import encodings.idna + +from urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url +from urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar +from .exceptions import ( + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) +from ._internal_utils import to_native_string, unicode_is_ascii +from .utils import ( + guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len, check_header_validity) +from .compat import ( + cookielib, urlunparse, urlsplit, urlencode, str, bytes, + is_py2, chardet, builtin_str, basestring) +from .compat import json as complexjson +from .status_codes import codes + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """ + .. Build the path URL to use. + + 使用するパス URL を生成します。 + """ + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if (not files): + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + (field.decode('utf-8') if isinstance(field, bytes) else field, + v.encode('utf-8') if isinstance(v, str) else v)) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + else: + fdata = fp.read() + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """ + .. Properly register a hook. + + フックを正しく登録してください。 + """ + + if event not in self.hooks: + raise ValueError('Unsupported event specified, with event name "%s"' % (event)) + + if isinstance(hook, collections.Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) + + def deregister_hook(self, event, hook): + """ + .. Deregister a previously registered hook. + Returns True if the hook existed, False if not. + + 既に登録されているフックを解除します。 + フックが存在する場合、True を返し、そうでなければ False を返します。 + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """ + .. A user-created :class:`Request ` object. + + 作成した :class:`Request ` オブジェクト。 + + .. Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + サーバーに送信される時に :class:`PreparedRequest ` が用意されます。 + + .. :param method: HTTP method to use. + .. :param url: URL to send. + .. :param headers: dictionary of headers to send. + .. :param files: dictionary of {filename: fileobject} files to multipart upload. + .. :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. + .. :param json: json for the body to attach to the request (if files or data is not specified). + .. :param params: dictionary of URL parameters to append to the URL. + .. :param auth: Auth handler or (user, pass) tuple. + .. :param cookies: dictionary or CookieJar of cookies to attach to this request. + .. :param hooks: dictionary of callback hooks, for internal usage. + + :param method: 使用する HTTP メソッド。 + :param url: 送信する URL。 + :param headers: 送信するヘッダーのディクショナリ。 + :param files: マルチパートのアップロードをするための {filename: fileobject} 形式のディクショナリ。 + :param data: リクエストに付与するボディ。ディクショナリとして提供されている場合、フォームエンコードされます。 + :param json: (ファイル、もしくはデータが指定されていない場合)リクエストに付与する JSON のボディ。 + :param params: URL に追加するための URL パラメータのディクショナリ。 + :param auth: 認証用のヘッダーか (user, pass) のタプル。 + :param cookies: このリクエストオブジェクトに付与する Cookie のディクショナリか CookieJar。 + :param hooks: 内部的に使う用のコールバックフックのディクショナリ。 + + .. Usage + + 使い方:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req.prepare() + + """ + + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '' % (self.method) + + def prepare(self): + """ + .. Constructs a :class:`PreparedRequest ` for transmission and returns it. + + 送信するための :class:`PreparedRequest ` を生成し、返却します。 + """ + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """ + .. The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + 変更可能な :class:`PreparedRequest ` オブジェクトで、 + サーバーに送信されるバイト列を含みます。 + + .. Generated from either a :class:`Request ` object or manually. + + :class:`Request ` オブジェクトから生成されるか、手動かのどちらかの方法で生成します。 + + .. Usage + + 使い方:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> r = req.prepare() + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + def __init__(self): + #: .. HTTP verb to send to the server. + #: + #: サーバーに送信する HTTP メソッド。 + self.method = None + #: .. HTTP URL to send the request to. + #: + #: 送信する HTTP URL。 + self.url = None + #: .. dictionary of HTTP headers. + #: + #: HTTP ヘッダーのディクショナリ。 + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: .. request body to send to the server. + #: + #: サーバーに送信するリクエストボディ。 + self.body = None + #: .. dictionary of callback hooks, for internal usage. + #: + #: 内部的に使う用のコールバックフックのディクショナリ。 + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + """ + .. Prepares the entire request with the given parameters. + + 渡したパラメータでリクエストの処理の準備をします。 + """ + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """ + .. Prepares the given HTTP method. + + 渡した HTTP メソッドで処理の準備をします。 + """ + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + import idna + + try: + host = idna.encode(host, uts46=True).decode('utf-8') + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """ + .. Prepares the given HTTP URL. + + 渡した HTTP URL で処理の準備をします。 + """ + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/requests/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + elif host.startswith(u'*'): + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """ + .. Prepares the given HTTP headers. + + 渡した HTTP ヘッダーで処理の準備をします。 + """ + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """ + .. Prepares the given HTTP body data. + + 渡した HTTP ボディデータで処理の準備をします。 + """ + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + body = complexjson.dumps(json) + if not isinstance(body, bytes): + body = body.encode('utf-8') + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, collections.Mapping)) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + if is_stream: + body = data + + if getattr(body, 'tell', None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + """ + .. Prepare Content-Length header based on request method and body + + リクエストメソッドやボディに基いて Content-Length ヘッダーの前処理をします。 + """ + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers['Content-Length'] = builtin_str(length) + elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """ + .. Prepares the given HTTP auth data. + + 渡した HTTP 認証データで処理の準備をします。 + """ + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """ + .. Prepares the given HTTP cookie data. + + 渡した HTTP Cookie データで処理の準備をします。 + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest ` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """ + .. The :class:`Response ` object, which contains a + server's response to an HTTP request. + + HTTP リクエストに対するサーバーからのレスポンスを含む + :class:`Response ` オブジェクト。 + """ + + __attrs__ = [ + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: .. Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + #: + #: 大文字と小文字を区別しないレスポンスヘッダーのディクショナリ。 + #: 例として、``headers['content-encoding']`` は ``'Content-Encoding'`` のレスポンスヘッダーの値を返却します。 + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: .. Encoding to decode with when accessing r.text. + #: + #: r.text アクセスする時にデコードするエンコーディング。 + self.encoding = None + + #: .. A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + #: + #: Request の履歴にある :class:`Response ` オブジェクトの一覧。 + #: リダイレクトのレスポンスはここには含まれません。 + #: リストはリクエストの古い順から新しい順の順番になっています。 + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: .. A CookieJar of Cookies the server sent back. + #: + #: サーバーから返却された Cookie の CookieJar。 + self.cookies = cookiejar_from_dict({}) + + #: .. The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + #: + #: リクエストを送信してからレスポンスが到着するまでの経過した時間(時間差)。 + #: このプロパティはリクエストの最初のバイトを送信してからヘッダーをパースするまでの時間を計測します。 + #: よって、レスポンスのコンテンツ、もしくは ``stream`` キーワード引数の値を操作することの影響は受けません。 + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return dict( + (attr, getattr(self, attr, None)) + for attr in self.__attrs__ + ) + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """ + .. True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + + このレスポンスが、(:meth:`Session.resolve_redirects` による)自動的に処理された正しい形式の HTTP リダイレクトである場合は True を返します。 + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """ + .. True if this Response one of the permanent versions of redirect. + + このレスポンスがリダイレクトの永続化するものであれば True を返します。 + """ + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """ + .. Returns a PreparedRequest for the next request in a redirect chain, if there is one. + + リダイレクト内の次のリクエストがある場合、PreparedRequest を返します。 + """ + return self._next + + @property + def apparent_encoding(self): + """ + .. The apparent encoding, provided by the chardet library. + + chardet ライブラリで提供されているエンコーディング。 + """ + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """ + .. Content of the response, in bytes. + + レスポンスのバイト列のコンテンツ。 + """ + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r""" + .. Returns the json-encoded content of a response, if any. + + JSON エンコードされたレスポンスのコンテンツを返します。 + + .. :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + .. :raises ValueError: If the response body does not contain valid json. + + :param \*\*kwargs: ``json.loads`` に必要なオプショナルの引数。 + :raises ValueError: レスポンスボディに有効な JSON が含まれていない場合。 + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """ + .. Returns the parsed header links of the response, if any. + + レスポンスのパース済みのヘッダーのリンクがあれば返します。 + """ + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """ + .. Raises stored :class:`HTTPError`, if one occurred. + + :class:`HTTPError` があれば、:class:`HTTPError` を発生させます。 + """ + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """ + .. Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + コネクションをプールに戻してリリースします。 + このメソッドが呼び出されると、元の ``生`` のオブジェクトに再度アクセスするべきではありません。 + + .. *Note: Should not normally need to be called explicitly.* + + *注意: 通常、明示的に呼び出す必要はありません。* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/requests/packages.py b/requests/packages.py new file mode 100755 index 0000000..7232fe0 --- /dev/null +++ b/requests/packages.py @@ -0,0 +1,14 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + locals()[package] = __import__(package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == package or mod.startswith(package + '.'): + sys.modules['requests.packages.' + mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/requests/packages/__init__.py b/requests/packages/__init__.py deleted file mode 100644 index 5a33689..0000000 --- a/requests/packages/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from __future__ import absolute_import - -from . import urllib3 \ No newline at end of file diff --git a/requests/packages/charade/__init__.py b/requests/packages/charade/__init__.py deleted file mode 100755 index 26378d4..0000000 --- a/requests/packages/charade/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -__version__ = "1.0.1" - - -def detect(aBuf): - from . import universaldetector - u = universaldetector.UniversalDetector() - u.reset() - u.feed(aBuf) - u.close() - return u.result diff --git a/requests/packages/charade/big5freq.py b/requests/packages/charade/big5freq.py deleted file mode 100755 index 65bffc0..0000000 --- a/requests/packages/charade/big5freq.py +++ /dev/null @@ -1,925 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Big5 frequency table -# by Taiwan's Mandarin Promotion Council -# -# -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -#Char to FreqOrder table -BIG5_TABLE_SIZE = 5376 - -Big5CharToFreqOrder = ( - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 -#Everything below is of no interest for detection purpose -2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 -2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 -5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 -5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 -5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 -5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 -5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 -5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 -5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 -5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 -5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 -5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 -5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 -5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 -6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 -6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 -6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 -6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 -6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 -6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 -6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 -6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 -6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 -6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 -6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 -6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 -6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 -6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 -6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 -6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 -6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 -6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 -6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 -6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 -6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 -6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 -6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 -6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 -6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 -6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 -6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 -6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 -6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 -6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 -6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 -6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 -6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 -6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 -6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 -6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 -6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 -6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 -6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 -6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 -6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 -3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 -6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 -6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 -3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 -6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 -6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 -6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 -6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 -6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 -6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 -6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 -4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 -6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 -6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 -3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 -6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 -6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 -6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 -6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 -6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 -6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 -6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 -6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 -6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 -6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 -6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 -7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 -7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 -7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 -7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 -7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 -7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 -7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 -7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 -7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 -7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 -7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 -7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 -7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 -7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 -7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 -7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 -7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 -7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 -7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 -7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 -7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 -7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 -7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 -7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 -7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 -7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 -7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 -7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 -7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 -7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 -7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 -7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 -7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 -7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 -7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 -7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 -7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 -7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 -7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 -7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 -7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 -7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 -7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 -7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 -7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 -7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 -7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 -3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 -7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 -7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 -7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 -7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 -4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 -7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 -7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 -7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 -7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 -7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 -7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 -7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 -7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 -7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 -7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 -7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 -8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 -8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 -8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 -8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 -8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 -8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 -8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 -8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 -8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 -8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 -8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 -8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 -8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 -8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 -8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 -8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 -8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 -8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 -8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 -8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 -8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 -8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 -8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 -8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 -8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 -8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 -8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 -8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 -8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 -8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 -8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 -8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 -8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 -8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 -8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 -8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 -8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 -8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 -8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 -8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 -8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 -8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 -8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 -8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 -8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 -8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 -8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 -8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 -8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 -8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 -8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 -8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 -8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 -8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 -8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 -8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 -8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 -8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 -8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 -4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 -8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 -8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 -8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 -8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 -9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 -9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 -9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 -9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 -9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 -9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 -9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 -9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 -9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 -9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 -9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 -9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 -9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 -9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 -9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 -9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 -9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 -9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 -9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 -9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 -9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 -9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 -9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 -9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 -9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 -9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 -9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 -9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 -9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 -9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 -9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 -9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 -9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 -9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 -9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 -9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 -9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 -9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 -3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 -9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 -9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 -9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 -4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 -9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 -9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 -9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 -9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 -9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 -9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 -9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 -9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 -9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 -9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 -9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 -9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 -9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 -9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 -9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 -9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 -9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 -9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 -9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 -9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 -9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 -9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 -9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 -10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 -10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 -10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 -10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 -10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 -10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 -10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 -10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 -10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 -4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 -10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 -10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 -10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 -10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 -10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 -10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 -10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 -10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 -4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 -10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 -10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 -10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 -10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 -10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 -10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 -10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 -10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 -10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 -10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 -10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 -10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 -10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 -10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 -10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 -10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 -10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 -4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 -10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 -10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 -10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 -10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 -10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 -10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 -10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 -10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 -10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 -10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 -10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 -10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 -10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 -10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 -10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 -10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 -10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 -10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 -10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 -10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 -10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 -10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 -10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 -10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 -10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 -10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 -10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 -10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 -10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 -10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 -11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 -11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 -11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 -4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 -11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 -11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 -11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 -11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 -11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 -11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 -11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 -11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 -11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 -11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 -11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 -11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 -11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 -11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 -11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 -11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 -11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 -11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 -11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 -11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 -11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 -11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 -11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 -11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 -11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 -11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 -11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 -11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 -11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 -11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 -11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 -11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 -4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 -11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 -11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 -11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 -11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 -11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 -11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 -11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 -11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 -11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 -11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 -11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 -11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 -11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 -11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 -11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 -11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 -11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 -11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 -11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 -11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 -11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 -11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 -11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 -11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 -11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 -11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 -11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 -11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 -12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 -12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 -12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 -12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 -12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 -12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 -12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 -12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 -12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 -12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 -12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 -12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 -12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 -12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 -12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 -4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 -4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 -4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 -12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 -12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 -12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 -12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 -12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 -12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 -12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 -12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 -12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 -12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 -12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 -12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 -12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 -12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 -12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 -12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 -12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 -12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 -12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 -12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 -12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 -12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 -12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 -12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 -12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 -12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 -12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 -12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 -12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 -12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 -12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 -12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 -12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 -12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 -12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 -12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 -12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 -12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 -12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 -12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 -12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 -12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 -12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 -12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 -12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 -12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 -12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 -4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 -13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 -13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 -13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 -13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 -13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 -13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 -13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 -4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 -13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 -13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 -13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 -13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 -13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 -13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 -13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 -13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 -13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 -13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 -13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 -13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 -13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 -13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 -13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 -5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 -13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 -13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 -13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 -13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 -13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 -13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 -13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 -13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 -13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 -13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 -13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 -13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 -13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 -13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 -13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 -13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 -13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 -13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 -13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 -13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 -13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 -13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 -13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 -13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 -13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 -13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 -13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 -13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 -13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 -13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 -13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 -13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 -13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 -13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 -13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 -13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 -13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 -13968,13969,13970,13971,13972) #13973 - -# flake8: noqa diff --git a/requests/packages/charade/big5prober.py b/requests/packages/charade/big5prober.py deleted file mode 100755 index becce81..0000000 --- a/requests/packages/charade/big5prober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import Big5DistributionAnalysis -from .mbcssm import Big5SMModel - - -class Big5Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(Big5SMModel) - self._mDistributionAnalyzer = Big5DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "Big5" diff --git a/requests/packages/charade/chardistribution.py b/requests/packages/charade/chardistribution.py deleted file mode 100755 index 253408f..0000000 --- a/requests/packages/charade/chardistribution.py +++ /dev/null @@ -1,230 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, - EUCTW_TYPICAL_DISTRIBUTION_RATIO) -from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, - EUCKR_TYPICAL_DISTRIBUTION_RATIO) -from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, - GB2312_TYPICAL_DISTRIBUTION_RATIO) -from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, - BIG5_TYPICAL_DISTRIBUTION_RATIO) -from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, - JIS_TYPICAL_DISTRIBUTION_RATIO) -from .compat import wrap_ord - -ENOUGH_DATA_THRESHOLD = 1024 -SURE_YES = 0.99 -SURE_NO = 0.01 - - -class CharDistributionAnalysis: - def __init__(self): - # Mapping table to get frequency order from char order (get from - # GetOrder()) - self._mCharToFreqOrder = None - self._mTableSize = None # Size of above table - # This is a constant value which varies from language to language, - # used in calculating confidence. See - # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html - # for further detail. - self._mTypicalDistributionRatio = None - self.reset() - - def reset(self): - """reset analyser, clear any state""" - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - self._mTotalChars = 0 # Total characters encountered - # The number of characters whose frequency order is less than 512 - self._mFreqChars = 0 - - def feed(self, aBuf, aCharLen): - """feed a character with known length""" - if aCharLen == 2: - # we only care about 2-bytes character in our distribution analysis - order = self.get_order(aBuf) - else: - order = -1 - if order >= 0: - self._mTotalChars += 1 - # order is valid - if order < self._mTableSize: - if 512 > self._mCharToFreqOrder[order]: - self._mFreqChars += 1 - - def get_confidence(self): - """return confidence based on existing data""" - # if we didn't receive any character in our consideration range, - # return negative answer - if self._mTotalChars <= 0: - return SURE_NO - - if self._mTotalChars != self._mFreqChars: - r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) - * self._mTypicalDistributionRatio)) - if r < SURE_YES: - return r - - # normalize confidence (we don't want to be 100% sure) - return SURE_YES - - def got_enough_data(self): - # It is not necessary to receive all data to draw conclusion. - # For charset detection, certain amount of data is enough - return self._mTotalChars > ENOUGH_DATA_THRESHOLD - - def get_order(self, aBuf): - # We do not handle characters based on the original encoding string, - # but convert this encoding string to a number, here called order. - # This allows multiple encodings of a language to share one frequency - # table. - return -1 - - -class EUCTWDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCTWCharToFreqOrder - self._mTableSize = EUCTW_TABLE_SIZE - self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-TW encoding, we are interested - # first byte range: 0xc4 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xC4: - return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class EUCKRDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = EUCKRCharToFreqOrder - self._mTableSize = EUCKR_TABLE_SIZE - self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-KR encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char = wrap_ord(aBuf[0]) - if first_char >= 0xB0: - return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 - else: - return -1 - - -class GB2312DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = GB2312CharToFreqOrder - self._mTableSize = GB2312_TABLE_SIZE - self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for GB2312 encoding, we are interested - # first byte range: 0xb0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0xB0) and (second_char >= 0xA1): - return 94 * (first_char - 0xB0) + second_char - 0xA1 - else: - return -1 - - -class Big5DistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = Big5CharToFreqOrder - self._mTableSize = BIG5_TABLE_SIZE - self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for big5 encoding, we are interested - # first byte range: 0xa4 -- 0xfe - # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if first_char >= 0xA4: - if second_char >= 0xA1: - return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 - else: - return 157 * (first_char - 0xA4) + second_char - 0x40 - else: - return -1 - - -class SJISDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for sjis encoding, we are interested - # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe - # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe - # no validation needed here. State machine has done that - first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) - if (first_char >= 0x81) and (first_char <= 0x9F): - order = 188 * (first_char - 0x81) - elif (first_char >= 0xE0) and (first_char <= 0xEF): - order = 188 * (first_char - 0xE0 + 31) - else: - return -1 - order = order + second_char - 0x40 - if second_char > 0x7F: - order = -1 - return order - - -class EUCJPDistributionAnalysis(CharDistributionAnalysis): - def __init__(self): - CharDistributionAnalysis.__init__(self) - self._mCharToFreqOrder = JISCharToFreqOrder - self._mTableSize = JIS_TABLE_SIZE - self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO - - def get_order(self, aBuf): - # for euc-JP encoding, we are interested - # first byte range: 0xa0 -- 0xfe - # second byte range: 0xa1 -- 0xfe - # no validation needed here. State machine has done that - char = wrap_ord(aBuf[0]) - if char >= 0xA0: - return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 - else: - return -1 diff --git a/requests/packages/charade/charsetgroupprober.py b/requests/packages/charade/charsetgroupprober.py deleted file mode 100755 index 85e7a1c..0000000 --- a/requests/packages/charade/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -from .charsetprober import CharSetProber - - -class CharSetGroupProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mActiveNum = 0 - self._mProbers = [] - self._mBestGuessProber = None - - def reset(self): - CharSetProber.reset(self) - self._mActiveNum = 0 - for prober in self._mProbers: - if prober: - prober.reset() - prober.active = True - self._mActiveNum += 1 - self._mBestGuessProber = None - - def get_charset_name(self): - if not self._mBestGuessProber: - self.get_confidence() - if not self._mBestGuessProber: - return None -# self._mBestGuessProber = self._mProbers[0] - return self._mBestGuessProber.get_charset_name() - - def feed(self, aBuf): - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - continue - st = prober.feed(aBuf) - if not st: - continue - if st == constants.eFoundIt: - self._mBestGuessProber = prober - return self.get_state() - elif st == constants.eNotMe: - prober.active = False - self._mActiveNum -= 1 - if self._mActiveNum <= 0: - self._mState = constants.eNotMe - return self.get_state() - return self.get_state() - - def get_confidence(self): - st = self.get_state() - if st == constants.eFoundIt: - return 0.99 - elif st == constants.eNotMe: - return 0.01 - bestConf = 0.0 - self._mBestGuessProber = None - for prober in self._mProbers: - if not prober: - continue - if not prober.active: - if constants._debug: - sys.stderr.write(prober.get_charset_name() - + ' not active\n') - continue - cf = prober.get_confidence() - if constants._debug: - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), cf)) - if bestConf < cf: - bestConf = cf - self._mBestGuessProber = prober - if not self._mBestGuessProber: - return 0.0 - return bestConf -# else: -# self._mBestGuessProber = self._mProbers[0] -# return self._mBestGuessProber.get_confidence() diff --git a/requests/packages/charade/charsetprober.py b/requests/packages/charade/charsetprober.py deleted file mode 100755 index 9758171..0000000 --- a/requests/packages/charade/charsetprober.py +++ /dev/null @@ -1,62 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import re - - -class CharSetProber: - def __init__(self): - pass - - def reset(self): - self._mState = constants.eDetecting - - def get_charset_name(self): - return None - - def feed(self, aBuf): - pass - - def get_state(self): - return self._mState - - def get_confidence(self): - return 0.0 - - def filter_high_bit_only(self, aBuf): - aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) - return aBuf - - def filter_without_english_letters(self, aBuf): - aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) - return aBuf - - def filter_with_english_letters(self, aBuf): - # TODO - return aBuf diff --git a/requests/packages/charade/codingstatemachine.py b/requests/packages/charade/codingstatemachine.py deleted file mode 100755 index 8dd8c91..0000000 --- a/requests/packages/charade/codingstatemachine.py +++ /dev/null @@ -1,61 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart -from .compat import wrap_ord - - -class CodingStateMachine: - def __init__(self, sm): - self._mModel = sm - self._mCurrentBytePos = 0 - self._mCurrentCharLen = 0 - self.reset() - - def reset(self): - self._mCurrentState = eStart - - def next_state(self, c): - # for each byte we get its class - # if it is first byte, we also get byte length - # PY3K: aBuf is a byte stream, so c is an int, not a byte - byteCls = self._mModel['classTable'][wrap_ord(c)] - if self._mCurrentState == eStart: - self._mCurrentBytePos = 0 - self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] - # from byte's class and stateTable, we get its next state - curr_state = (self._mCurrentState * self._mModel['classFactor'] - + byteCls) - self._mCurrentState = self._mModel['stateTable'][curr_state] - self._mCurrentBytePos += 1 - return self._mCurrentState - - def get_current_charlen(self): - return self._mCurrentCharLen - - def get_coding_state_machine(self): - return self._mModel['name'] diff --git a/requests/packages/charade/compat.py b/requests/packages/charade/compat.py deleted file mode 100755 index f86c46b..0000000 --- a/requests/packages/charade/compat.py +++ /dev/null @@ -1,26 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# Contributor(s): -# Ian Cordasco - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - - -def wrap_ord(a): - if isinstance(a, str): - return ord(a) - elif isinstance(a, int): - return a diff --git a/requests/packages/charade/constants.py b/requests/packages/charade/constants.py deleted file mode 100755 index e4d148b..0000000 --- a/requests/packages/charade/constants.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -_debug = 0 - -eDetecting = 0 -eFoundIt = 1 -eNotMe = 2 - -eStart = 0 -eError = 1 -eItsMe = 2 - -SHORTCUT_THRESHOLD = 0.95 diff --git a/requests/packages/charade/escprober.py b/requests/packages/charade/escprober.py deleted file mode 100755 index 80a844f..0000000 --- a/requests/packages/charade/escprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .escsm import (HZSMModel, ISO2022CNSMModel, ISO2022JPSMModel, - ISO2022KRSMModel) -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .compat import wrap_ord - - -class EscCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = [ - CodingStateMachine(HZSMModel), - CodingStateMachine(ISO2022CNSMModel), - CodingStateMachine(ISO2022JPSMModel), - CodingStateMachine(ISO2022KRSMModel) - ] - self.reset() - - def reset(self): - CharSetProber.reset(self) - for codingSM in self._mCodingSM: - if not codingSM: - continue - codingSM.active = True - codingSM.reset() - self._mActiveSM = len(self._mCodingSM) - self._mDetectedCharset = None - - def get_charset_name(self): - return self._mDetectedCharset - - def get_confidence(self): - if self._mDetectedCharset: - return 0.99 - else: - return 0.00 - - def feed(self, aBuf): - for c in aBuf: - # PY3K: aBuf is a byte array, so c is an int, not a byte - for codingSM in self._mCodingSM: - if not codingSM: - continue - if not codingSM.active: - continue - codingState = codingSM.next_state(wrap_ord(c)) - if codingState == constants.eError: - codingSM.active = False - self._mActiveSM -= 1 - if self._mActiveSM <= 0: - self._mState = constants.eNotMe - return self.get_state() - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - self._mDetectedCharset = codingSM.get_coding_state_machine() # nopep8 - return self.get_state() - - return self.get_state() diff --git a/requests/packages/charade/escsm.py b/requests/packages/charade/escsm.py deleted file mode 100755 index bd302b4..0000000 --- a/requests/packages/charade/escsm.py +++ /dev/null @@ -1,242 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -HZ_cls = ( -1,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,0,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,4,0,5,2,0, # 78 - 7f -1,1,1,1,1,1,1,1, # 80 - 87 -1,1,1,1,1,1,1,1, # 88 - 8f -1,1,1,1,1,1,1,1, # 90 - 97 -1,1,1,1,1,1,1,1, # 98 - 9f -1,1,1,1,1,1,1,1, # a0 - a7 -1,1,1,1,1,1,1,1, # a8 - af -1,1,1,1,1,1,1,1, # b0 - b7 -1,1,1,1,1,1,1,1, # b8 - bf -1,1,1,1,1,1,1,1, # c0 - c7 -1,1,1,1,1,1,1,1, # c8 - cf -1,1,1,1,1,1,1,1, # d0 - d7 -1,1,1,1,1,1,1,1, # d8 - df -1,1,1,1,1,1,1,1, # e0 - e7 -1,1,1,1,1,1,1,1, # e8 - ef -1,1,1,1,1,1,1,1, # f0 - f7 -1,1,1,1,1,1,1,1, # f8 - ff -) - -HZ_st = ( -eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 - 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f - 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 - 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f -) - -HZCharLenTable = (0, 0, 0, 0, 0, 0) - -HZSMModel = {'classTable': HZ_cls, - 'classFactor': 6, - 'stateTable': HZ_st, - 'charLenTable': HZCharLenTable, - 'name': "HZ-GB-2312"} - -ISO2022CN_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,0,0,0,0, # 20 - 27 -0,3,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,4,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022CN_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 - 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 -eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f -) - -ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022CNSMModel = {'classTable': ISO2022CN_cls, - 'classFactor': 9, - 'stateTable': ISO2022CN_st, - 'charLenTable': ISO2022CNCharLenTable, - 'name': "ISO-2022-CN"} - -ISO2022JP_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,2,2, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,7,0,0,0, # 20 - 27 -3,0,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -6,0,4,0,8,0,0,0, # 40 - 47 -0,9,5,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022JP_st = ( -eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 -eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 -eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f -eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 -eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f -eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 -eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f -eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 -) - -ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - -ISO2022JPSMModel = {'classTable': ISO2022JP_cls, - 'classFactor': 10, - 'stateTable': ISO2022JP_st, - 'charLenTable': ISO2022JPCharLenTable, - 'name': "ISO-2022-JP"} - -ISO2022KR_cls = ( -2,0,0,0,0,0,0,0, # 00 - 07 -0,0,0,0,0,0,0,0, # 08 - 0f -0,0,0,0,0,0,0,0, # 10 - 17 -0,0,0,1,0,0,0,0, # 18 - 1f -0,0,0,0,3,0,0,0, # 20 - 27 -0,4,0,0,0,0,0,0, # 28 - 2f -0,0,0,0,0,0,0,0, # 30 - 37 -0,0,0,0,0,0,0,0, # 38 - 3f -0,0,0,5,0,0,0,0, # 40 - 47 -0,0,0,0,0,0,0,0, # 48 - 4f -0,0,0,0,0,0,0,0, # 50 - 57 -0,0,0,0,0,0,0,0, # 58 - 5f -0,0,0,0,0,0,0,0, # 60 - 67 -0,0,0,0,0,0,0,0, # 68 - 6f -0,0,0,0,0,0,0,0, # 70 - 77 -0,0,0,0,0,0,0,0, # 78 - 7f -2,2,2,2,2,2,2,2, # 80 - 87 -2,2,2,2,2,2,2,2, # 88 - 8f -2,2,2,2,2,2,2,2, # 90 - 97 -2,2,2,2,2,2,2,2, # 98 - 9f -2,2,2,2,2,2,2,2, # a0 - a7 -2,2,2,2,2,2,2,2, # a8 - af -2,2,2,2,2,2,2,2, # b0 - b7 -2,2,2,2,2,2,2,2, # b8 - bf -2,2,2,2,2,2,2,2, # c0 - c7 -2,2,2,2,2,2,2,2, # c8 - cf -2,2,2,2,2,2,2,2, # d0 - d7 -2,2,2,2,2,2,2,2, # d8 - df -2,2,2,2,2,2,2,2, # e0 - e7 -2,2,2,2,2,2,2,2, # e8 - ef -2,2,2,2,2,2,2,2, # f0 - f7 -2,2,2,2,2,2,2,2, # f8 - ff -) - -ISO2022KR_st = ( -eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 -eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f -eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 -eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f -eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 -) - -ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) - -ISO2022KRSMModel = {'classTable': ISO2022KR_cls, - 'classFactor': 6, - 'stateTable': ISO2022KR_st, - 'charLenTable': ISO2022KRCharLenTable, - 'name': "ISO-2022-KR"} - -# flake8: noqa diff --git a/requests/packages/charade/eucjpprober.py b/requests/packages/charade/eucjpprober.py deleted file mode 100755 index 8e64fdc..0000000 --- a/requests/packages/charade/eucjpprober.py +++ /dev/null @@ -1,90 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCJPDistributionAnalysis -from .jpcntx import EUCJPContextAnalysis -from .mbcssm import EUCJPSMModel - - -class EUCJPProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCJPSMModel) - self._mDistributionAnalyzer = EUCJPDistributionAnalysis() - self._mContextAnalyzer = EUCJPContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return "EUC-JP" - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar, charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) diff --git a/requests/packages/charade/euckrfreq.py b/requests/packages/charade/euckrfreq.py deleted file mode 100755 index a179e4c..0000000 --- a/requests/packages/charade/euckrfreq.py +++ /dev/null @@ -1,596 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology - -# 128 --> 0.79 -# 256 --> 0.92 -# 512 --> 0.986 -# 1024 --> 0.99944 -# 2048 --> 0.99999 -# -# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 -# Random Distribution Ration = 512 / (2350-512) = 0.279. -# -# Typical Distribution Ratio - -EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 - -EUCKR_TABLE_SIZE = 2352 - -# Char to FreqOrder table , -EUCKRCharToFreqOrder = ( \ - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 -#Everything below is of no interest for detection purpose -2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, -2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, -2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, -2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, -2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, -2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, -2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, -2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, -2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, -2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, -2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, -2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, -2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, -2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, -1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, -2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, -2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, -2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, -2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, -2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, -2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, -2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, -2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, -2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, -3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, -3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, -3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, -3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, -3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, -3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, -3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, -3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, -3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, -3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, -3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, -3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, -3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, -3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, -3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, -3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, -3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, -3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, -3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, -3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, -3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, -3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, -3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, -3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, -3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, -3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, -3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, -3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, -3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, -3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, -3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, -3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, -1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, -1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, -3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, -3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, -3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, -3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, -3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, -3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, -3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, -3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, -3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, -3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, -3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, -3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, -3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, -1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, -3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, -3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, -3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, -3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, -3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, -3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, -3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, -1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, -3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, -3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, -3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, -3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, -1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, -3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, -3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, -3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, -3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, -3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, -3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, -3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, -4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, -4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, -1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, -4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, -4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, -4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, -4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, -4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, -4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, -4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, -4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, -4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, -4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, -4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, -4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, -4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, -4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, -4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, -4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, -4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, -4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, -4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, -4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, -4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, -4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, -4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, -4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, -4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, -4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, -4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, -4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, -4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, -4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, -4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, -4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, -4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, -4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, -4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, -4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, -4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, -4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, -4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, -4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, -4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, -4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, -1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, -4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, -4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, -4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, -4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, -4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, -4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, -4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, -4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, -4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, -4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, -4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, -4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, -4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, -4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, -4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, -4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, -4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, -4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, -4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, -4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, -5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, -5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, -1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, -5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, -5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, -5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, -5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, -5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, -1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, -5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, -5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, -5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, -5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, -5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, -1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, -5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, -5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, -5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, -5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, -5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, -5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, -5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, -5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, -5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, -5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, -5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, -5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, -5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, -5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, -5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, -5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, -5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, -5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, -5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, -5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, -5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, -5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, -5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, -1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, -5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, -5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, -5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, -5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, -1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, -5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, -5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, -5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, -5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, -5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, -1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, -5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, -1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, -5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, -5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, -5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, -5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, -5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, -5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, -5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, -5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, -5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, -5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, -5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, -5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, -5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, -5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, -6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, -6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, -6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, -6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, -6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, -6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, -6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, -6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, -6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, -6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, -6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, -6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, -6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, -6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, -6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, -6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, -6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 -6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, -6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, -6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, -6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, -6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, -6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, -6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, -6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, -6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, -6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, -6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, -6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, -6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, -6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, -6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, -6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, -6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, -6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, -1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, -6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, -6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, -6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, -6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, -6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, -1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, -6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, -1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, -6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, -6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, -6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, -1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, -6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, -6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, -6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, -6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, -6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, -6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, -6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, -6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, -6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, -6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, -6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, -6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, -6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, -6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, -6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, -6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, -6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, -7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, -7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, -7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, -7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, -7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, -7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, -7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, -7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, -7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, -7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, -7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, -7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, -7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, -7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, -7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, -7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, -7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, -7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, -7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, -7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, -7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, -7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, -7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, -7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, -7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, -7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, -7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, -7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, -7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, -7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, -7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, -7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, -7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, -7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, -7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, -7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, -7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, -7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, -7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, -7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, -7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, -7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, -7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, -7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, -7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, -7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, -7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, -7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, -7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, -7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, -7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, -7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, -7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, -7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, -7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, -7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, -7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, -8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, -8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, -8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, -8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, -8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, -8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, -8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, -8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, -8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, -8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, -8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, -8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, -8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, -8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, -8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, -8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, -8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, -8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, -8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, -8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, -8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, -8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, -8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, -8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, -8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, -8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, -8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, -8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, -8736,8737,8738,8739,8740,8741) - -# flake8: noqa diff --git a/requests/packages/charade/euckrprober.py b/requests/packages/charade/euckrprober.py deleted file mode 100755 index 5982a46..0000000 --- a/requests/packages/charade/euckrprober.py +++ /dev/null @@ -1,42 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCKRDistributionAnalysis -from .mbcssm import EUCKRSMModel - - -class EUCKRProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCKRSMModel) - self._mDistributionAnalyzer = EUCKRDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-KR" diff --git a/requests/packages/charade/euctwfreq.py b/requests/packages/charade/euctwfreq.py deleted file mode 100755 index 576e750..0000000 --- a/requests/packages/charade/euctwfreq.py +++ /dev/null @@ -1,428 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# EUCTW frequency table -# Converted from big5 work -# by Taiwan's Mandarin Promotion Council -# - -# 128 --> 0.42261 -# 256 --> 0.57851 -# 512 --> 0.74851 -# 1024 --> 0.89384 -# 2048 --> 0.97583 -# -# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 -# Random Distribution Ration = 512/(5401-512)=0.105 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - -EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 - -# Char to FreqOrder table , -EUCTW_TABLE_SIZE = 8102 - -EUCTWCharToFreqOrder = ( - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 -#Everything below is of no interest for detection purpose -2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 -2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 -8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 -8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 -8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 -8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 -8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 -8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 -8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 -8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 -8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 -8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 -8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 -8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 -8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 -8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 -8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 -8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 -8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 -8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 -8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 -8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 -8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 -8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 -8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 -8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 -8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 -8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 -8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 -8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 -8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 -8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 -8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 -8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 -8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 -8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 -8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 -8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 -8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 - -# flake8: noqa diff --git a/requests/packages/charade/euctwprober.py b/requests/packages/charade/euctwprober.py deleted file mode 100755 index fe652fe..0000000 --- a/requests/packages/charade/euctwprober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import EUCTWDistributionAnalysis -from .mbcssm import EUCTWSMModel - -class EUCTWProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(EUCTWSMModel) - self._mDistributionAnalyzer = EUCTWDistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "EUC-TW" diff --git a/requests/packages/charade/gb2312freq.py b/requests/packages/charade/gb2312freq.py deleted file mode 100755 index 1238f51..0000000 --- a/requests/packages/charade/gb2312freq.py +++ /dev/null @@ -1,472 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# GB2312 most frequently used character table -# -# Char to FreqOrder table , from hz6763 - -# 512 --> 0.79 -- 0.79 -# 1024 --> 0.92 -- 0.13 -# 2048 --> 0.98 -- 0.06 -# 6768 --> 1.00 -- 0.02 -# -# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 -# Random Distribution Ration = 512 / (3755 - 512) = 0.157 -# -# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - -GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 - -GB2312_TABLE_SIZE = 3760 - -GB2312CharToFreqOrder = ( -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 -#Everything below is of no interest for detection purpose -5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, -5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, -5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, -3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, -4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, -5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, -5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, -4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, -4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, -4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, -4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, -3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, -6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, -4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, -6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, -4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, -4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, -4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, -5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, -3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, -4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, -3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, -4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, -4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, -6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, -6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, -5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, -4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, -6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, -4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, -5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, -5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, -5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, -6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, -3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, -6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, -4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, -5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, -6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, -6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, -4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, -5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, -4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, -5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, -5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, -4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, -4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, -5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, -4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, -4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, -5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, -4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, -4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, -4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, -5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, -5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, -4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, -3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, -4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, -6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, -5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, -5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, -4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, -6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, -5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, -6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, -4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, -5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, -5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, -3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, -5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, -6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, -4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, -6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, -4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, -4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, -6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, -3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, -6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, -4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, -3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, -3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, -3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, -4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, -2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, -5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, -4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, -5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, -5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, -5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, -4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, -5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, -4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, -5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, -1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, -3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, -4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, -4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, -6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, -4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, -5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, -3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, -5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, -5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, -5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, -3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, -5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, -5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, -3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, -5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, -5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, -5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, -6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, -4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, -6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, -4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, -3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, -4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, -5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, -5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, -5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, -3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, -3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, -6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, -6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, -5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, -6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, -6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, -6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, -6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, -6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, -5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, -6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, -6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, -3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, -3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, -4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, -4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, -3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, -5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, -5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, -5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, -5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, -5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, -4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, -5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, -6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, -5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, -4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, -4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, -6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, -3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, -4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, -4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, -5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, -6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, -6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, -4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, -6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, -5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, -5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, -5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, -5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, -5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, -4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, -5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, -5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, -5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, -5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, -6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, -4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, -5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, -4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, -4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, -6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, -4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, -6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, -3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, -5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, -6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, -6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, -6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, -5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, -6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, -6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, -3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, -5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, -4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) - -# flake8: noqa diff --git a/requests/packages/charade/gb2312prober.py b/requests/packages/charade/gb2312prober.py deleted file mode 100755 index 0325a2d..0000000 --- a/requests/packages/charade/gb2312prober.py +++ /dev/null @@ -1,41 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import GB2312DistributionAnalysis -from .mbcssm import GB2312SMModel - -class GB2312Prober(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(GB2312SMModel) - self._mDistributionAnalyzer = GB2312DistributionAnalysis() - self.reset() - - def get_charset_name(self): - return "GB2312" diff --git a/requests/packages/charade/hebrewprober.py b/requests/packages/charade/hebrewprober.py deleted file mode 100755 index ba225c5..0000000 --- a/requests/packages/charade/hebrewprober.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Shy Shalom -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe, eDetecting -from .compat import wrap_ord - -# This prober doesn't actually recognize a language or a charset. -# It is a helper prober for the use of the Hebrew model probers - -### General ideas of the Hebrew charset recognition ### -# -# Four main charsets exist in Hebrew: -# "ISO-8859-8" - Visual Hebrew -# "windows-1255" - Logical Hebrew -# "ISO-8859-8-I" - Logical Hebrew -# "x-mac-hebrew" - ?? Logical Hebrew ?? -# -# Both "ISO" charsets use a completely identical set of code points, whereas -# "windows-1255" and "x-mac-hebrew" are two different proper supersets of -# these code points. windows-1255 defines additional characters in the range -# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific -# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. -# x-mac-hebrew defines similar additional code points but with a different -# mapping. -# -# As far as an average Hebrew text with no diacritics is concerned, all four -# charsets are identical with respect to code points. Meaning that for the -# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters -# (including final letters). -# -# The dominant difference between these charsets is their directionality. -# "Visual" directionality means that the text is ordered as if the renderer is -# not aware of a BIDI rendering algorithm. The renderer sees the text and -# draws it from left to right. The text itself when ordered naturally is read -# backwards. A buffer of Visual Hebrew generally looks like so: -# "[last word of first line spelled backwards] [whole line ordered backwards -# and spelled backwards] [first word of first line spelled backwards] -# [end of line] [last word of second line] ... etc' " -# adding punctuation marks, numbers and English text to visual text is -# naturally also "visual" and from left to right. -# -# "Logical" directionality means the text is ordered "naturally" according to -# the order it is read. It is the responsibility of the renderer to display -# the text from right to left. A BIDI algorithm is used to place general -# punctuation marks, numbers and English text in the text. -# -# Texts in x-mac-hebrew are almost impossible to find on the Internet. From -# what little evidence I could find, it seems that its general directionality -# is Logical. -# -# To sum up all of the above, the Hebrew probing mechanism knows about two -# charsets: -# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are -# backwards while line order is natural. For charset recognition purposes -# the line order is unimportant (In fact, for this implementation, even -# word order is unimportant). -# Logical Hebrew - "windows-1255" - normal, naturally ordered text. -# -# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be -# specifically identified. -# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew -# that contain special punctuation marks or diacritics is displayed with -# some unconverted characters showing as question marks. This problem might -# be corrected using another model prober for x-mac-hebrew. Due to the fact -# that x-mac-hebrew texts are so rare, writing another model prober isn't -# worth the effort and performance hit. -# -#### The Prober #### -# -# The prober is divided between two SBCharSetProbers and a HebrewProber, -# all of which are managed, created, fed data, inquired and deleted by the -# SBCSGroupProber. The two SBCharSetProbers identify that the text is in -# fact some kind of Hebrew, Logical or Visual. The final decision about which -# one is it is made by the HebrewProber by combining final-letter scores -# with the scores of the two SBCharSetProbers to produce a final answer. -# -# The SBCSGroupProber is responsible for stripping the original text of HTML -# tags, English characters, numbers, low-ASCII punctuation characters, spaces -# and new lines. It reduces any sequence of such characters to a single space. -# The buffer fed to each prober in the SBCS group prober is pure text in -# high-ASCII. -# The two SBCharSetProbers (model probers) share the same language model: -# Win1255Model. -# The first SBCharSetProber uses the model normally as any other -# SBCharSetProber does, to recognize windows-1255, upon which this model was -# built. The second SBCharSetProber is told to make the pair-of-letter -# lookup in the language model backwards. This in practice exactly simulates -# a visual Hebrew model using the windows-1255 logical Hebrew model. -# -# The HebrewProber is not using any language model. All it does is look for -# final-letter evidence suggesting the text is either logical Hebrew or visual -# Hebrew. Disjointed from the model probers, the results of the HebrewProber -# alone are meaningless. HebrewProber always returns 0.00 as confidence -# since it never identifies a charset by itself. Instead, the pointer to the -# HebrewProber is passed to the model probers as a helper "Name Prober". -# When the Group prober receives a positive identification from any prober, -# it asks for the name of the charset identified. If the prober queried is a -# Hebrew model prober, the model prober forwards the call to the -# HebrewProber to make the final decision. In the HebrewProber, the -# decision is made according to the final-letters scores maintained and Both -# model probers scores. The answer is returned in the form of the name of the -# charset identified, either "windows-1255" or "ISO-8859-8". - -# windows-1255 / ISO-8859-8 code points of interest -FINAL_KAF = 0xea -NORMAL_KAF = 0xeb -FINAL_MEM = 0xed -NORMAL_MEM = 0xee -FINAL_NUN = 0xef -NORMAL_NUN = 0xf0 -FINAL_PE = 0xf3 -NORMAL_PE = 0xf4 -FINAL_TSADI = 0xf5 -NORMAL_TSADI = 0xf6 - -# Minimum Visual vs Logical final letter score difference. -# If the difference is below this, don't rely solely on the final letter score -# distance. -MIN_FINAL_CHAR_DISTANCE = 5 - -# Minimum Visual vs Logical model score difference. -# If the difference is below this, don't rely at all on the model score -# distance. -MIN_MODEL_DISTANCE = 0.01 - -VISUAL_HEBREW_NAME = "ISO-8859-8" -LOGICAL_HEBREW_NAME = "windows-1255" - - -class HebrewProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mLogicalProber = None - self._mVisualProber = None - self.reset() - - def reset(self): - self._mFinalCharLogicalScore = 0 - self._mFinalCharVisualScore = 0 - # The two last characters seen in the previous buffer, - # mPrev and mBeforePrev are initialized to space in order to simulate - # a word delimiter at the beginning of the data - self._mPrev = ' ' - self._mBeforePrev = ' ' - # These probers are owned by the group prober. - - def set_model_probers(self, logicalProber, visualProber): - self._mLogicalProber = logicalProber - self._mVisualProber = visualProber - - def is_final(self, c): - return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, - FINAL_TSADI] - - def is_non_final(self, c): - # The normal Tsadi is not a good Non-Final letter due to words like - # 'lechotet' (to chat) containing an apostrophe after the tsadi. This - # apostrophe is converted to a space in FilterWithoutEnglishLetters - # causing the Non-Final tsadi to appear at an end of a word even - # though this is not the case in the original text. - # The letters Pe and Kaf rarely display a related behavior of not being - # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' - # for example legally end with a Non-Final Pe or Kaf. However, the - # benefit of these letters as Non-Final letters outweighs the damage - # since these words are quite rare. - return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] - - def feed(self, aBuf): - # Final letter analysis for logical-visual decision. - # Look for evidence that the received buffer is either logical Hebrew - # or visual Hebrew. - # The following cases are checked: - # 1) A word longer than 1 letter, ending with a final letter. This is - # an indication that the text is laid out "naturally" since the - # final letter really appears at the end. +1 for logical score. - # 2) A word longer than 1 letter, ending with a Non-Final letter. In - # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, - # should not end with the Non-Final form of that letter. Exceptions - # to this rule are mentioned above in isNonFinal(). This is an - # indication that the text is laid out backwards. +1 for visual - # score - # 3) A word longer than 1 letter, starting with a final letter. Final - # letters should not appear at the beginning of a word. This is an - # indication that the text is laid out backwards. +1 for visual - # score. - # - # The visual score and logical score are accumulated throughout the - # text and are finally checked against each other in GetCharSetName(). - # No checking for final letters in the middle of words is done since - # that case is not an indication for either Logical or Visual text. - # - # We automatically filter out all 7-bit characters (replace them with - # spaces) so the word boundary detection works properly. [MAP] - - if self.get_state() == eNotMe: - # Both model probers say it's not them. No reason to continue. - return eNotMe - - aBuf = self.filter_high_bit_only(aBuf) - - for cur in aBuf: - if cur == ' ': - # We stand on a space - a word just ended - if self._mBeforePrev != ' ': - # next-to-last char was not a space so self._mPrev is not a - # 1 letter word - if self.is_final(self._mPrev): - # case (1) [-2:not space][-1:final letter][cur:space] - self._mFinalCharLogicalScore += 1 - elif self.is_non_final(self._mPrev): - # case (2) [-2:not space][-1:Non-Final letter][ - # cur:space] - self._mFinalCharVisualScore += 1 - else: - # Not standing on a space - if ((self._mBeforePrev == ' ') and - (self.is_final(self._mPrev)) and (cur != ' ')): - # case (3) [-2:space][-1:final letter][cur:not space] - self._mFinalCharVisualScore += 1 - self._mBeforePrev = self._mPrev - self._mPrev = cur - - # Forever detecting, till the end or until both model probers return - # eNotMe (handled above) - return eDetecting - - def get_charset_name(self): - # Make the decision: is it Logical or Visual? - # If the final letter score distance is dominant enough, rely on it. - finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore - if finalsub >= MIN_FINAL_CHAR_DISTANCE: - return LOGICAL_HEBREW_NAME - if finalsub <= -MIN_FINAL_CHAR_DISTANCE: - return VISUAL_HEBREW_NAME - - # It's not dominant enough, try to rely on the model scores instead. - modelsub = (self._mLogicalProber.get_confidence() - - self._mVisualProber.get_confidence()) - if modelsub > MIN_MODEL_DISTANCE: - return LOGICAL_HEBREW_NAME - if modelsub < -MIN_MODEL_DISTANCE: - return VISUAL_HEBREW_NAME - - # Still no good, back to final letter distance, maybe it'll save the - # day. - if finalsub < 0.0: - return VISUAL_HEBREW_NAME - - # (finalsub > 0 - Logical) or (don't know what to do) default to - # Logical. - return LOGICAL_HEBREW_NAME - - def get_state(self): - # Remain active as long as any of the model probers are active. - if (self._mLogicalProber.get_state() == eNotMe) and \ - (self._mVisualProber.get_state() == eNotMe): - return eNotMe - return eDetecting diff --git a/requests/packages/charade/jisfreq.py b/requests/packages/charade/jisfreq.py deleted file mode 100755 index 064345b..0000000 --- a/requests/packages/charade/jisfreq.py +++ /dev/null @@ -1,569 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# Sampling from about 20M text materials include literature and computer technology -# -# Japanese frequency table, applied to both S-JIS and EUC-JP -# They are sorted in order. - -# 128 --> 0.77094 -# 256 --> 0.85710 -# 512 --> 0.92635 -# 1024 --> 0.97130 -# 2048 --> 0.99431 -# -# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 -# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 -# -# Typical Distribution Ratio, 25% of IDR - -JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 - -# Char to FreqOrder table , -JIS_TABLE_SIZE = 4368 - -JISCharToFreqOrder = ( - 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 -3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 -1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 -2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 -2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 -5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 -1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 -5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 -5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 -5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 -5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 -5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 -5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 -1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 -1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 -1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 -2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 -3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 -3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 - 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 - 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 -1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 - 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 -5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 - 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 - 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 - 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 - 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 - 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 -5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 -5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 -5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 -4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 -5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 -5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 -5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 -5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 -5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 -5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 -5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 -5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 -5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 -3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 -5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 -5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 -5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 -5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 -5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 -5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 -5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 -5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 -5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 -5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 -5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 -5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 -5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 -5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 -5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 -5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 -5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 -5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 -5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 -5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 -5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 -5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 -5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 -5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 -5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 -5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 -5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 -5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 -5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 -5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 -5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 -5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 -5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 -5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 -5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 -5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 -6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 -6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 -6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 -6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 -6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 -6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 -6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 -6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 -4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 - 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 - 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 -1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 -1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 - 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 -3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 -3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 - 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 -3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 -3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 - 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 -2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 - 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 -3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 -1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 - 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 -1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 - 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 -2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 -2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 -2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 -2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 -1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 -1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 -1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 -1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 -2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 -1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 -2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 -1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 -1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 -1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 -1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 -1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 -1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 - 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 - 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 -1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 -2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 -2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 -2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 -3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 -3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 - 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 -3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 -1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 - 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 -2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 -1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 - 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 -3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 -4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 -2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 -1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 -2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 -1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 - 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 - 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 -1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 -2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 -2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 -2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 -3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 -1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 -2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 - 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 - 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 - 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 -1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 -2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 - 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 -1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 -1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 - 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 -1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 -1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 -1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 - 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 -2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 - 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 -2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 -3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 -2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 -1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 -6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 -1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 -2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 -1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 - 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 - 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 -3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 -3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 -1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 -1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 -1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 -1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 - 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 - 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 -2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 - 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 -3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 -2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 - 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 -1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 -2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 - 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 -1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 - 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 -4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 -2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 -1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 - 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 -1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 -2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 - 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 -6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 -1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 -1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 -2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 -3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 - 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 -3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 -1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 - 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 -1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 - 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 -3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 - 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 -2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 - 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 -4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 -2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 -1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 -1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 -1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 - 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 -1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 -3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 -1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 -3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 - 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 - 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 - 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 -2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 -1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 - 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 -1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 - 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 -1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 - 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 - 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 - 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 -1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 -1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 -2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 -4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 - 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 -1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 - 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 -1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 -3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 -1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 -2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 -2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 -1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 -1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 -2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 - 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 -2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 -1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 -1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 -1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 -1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 -3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 -2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 -2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 - 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 -3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 -3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 -1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 -2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 -1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 -2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 -#Everything below is of no interest for detection purpose -2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 -6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 -6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 -6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 -6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 -4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 -4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 -3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 -3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 -4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 -3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 -6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 -4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 -6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 -6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 -6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 -6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 -6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 -6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 -3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 -3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 -6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 -2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 -4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 -4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 -4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 -6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 -3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 -4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 -4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 -6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 -4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 -6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 -3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 -2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 -4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 -2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 -6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 -4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 -6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 -6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 -6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 -4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 -6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 -2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 -6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 -4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 -6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 -4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 -4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 -6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 -6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 -6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 -3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 -1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 -3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 -3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 -4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 -6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 -3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 -6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 -3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 -3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 -2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 -6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 -6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 -3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 -6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 -3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 -6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 -6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 -6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 -4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 -6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 -4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 -3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 -3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 -6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 -6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 -4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 -6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 -6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 -6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 -6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 -6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 -6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 -4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 -4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 -3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 -6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 -4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 -2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 -6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 -6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 -4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 -2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 -4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 -2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 -4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 -4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 -4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 -6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 -3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 -6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 -3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 -6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 -2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 -3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 -7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 -2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 -3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 -3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 -3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 -3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 -7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 -7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 -7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 -7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 -7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 -4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 -3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 -3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 -4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 -3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 -3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 -7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 -4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 -7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 -7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 -7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 -7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 -7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 -4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 -4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 -7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 -3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 -4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 -7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 -7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 -4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 -3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 -3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 -7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 -4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 -4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 -4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 -4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 -4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 -4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 -7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 -7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 -7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 -7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 -7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 -2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 -3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 -7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 -7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 -3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 -4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 -3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 -3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 -2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 -7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 -7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 -4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 -3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 -3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 -7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 -7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 -7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 -4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 -7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 -2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 -3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 -4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 -7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 -4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 -4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 -7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 -7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 -5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 -7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 -7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 -7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 -7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 -7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 -5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 -5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 -7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 -3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 -7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 -7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 -3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 -7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 -7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 -1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 -3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 -4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 -2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 -3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 -2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 -5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 -4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 -4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 -5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 -7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 -7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 -7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 -7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 -3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 -7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 -3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 -7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 -4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 -7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 -7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 -7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 -7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 -7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 -7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 -7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 -7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 - -# flake8: noqa diff --git a/requests/packages/charade/jpcntx.py b/requests/packages/charade/jpcntx.py deleted file mode 100755 index f7f69ba..0000000 --- a/requests/packages/charade/jpcntx.py +++ /dev/null @@ -1,219 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .compat import wrap_ord - -NUM_OF_CATEGORY = 6 -DONT_KNOW = -1 -ENOUGH_REL_THRESHOLD = 100 -MAX_REL_THRESHOLD = 1000 -MINIMUM_DATA_THRESHOLD = 4 - -# This is hiragana 2-char sequence table, the number in each cell represents its frequency category -jp2CharContext = ( -(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), -(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), -(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), -(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), -(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), -(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), -(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), -(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), -(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), -(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), -(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), -(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), -(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), -(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), -(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), -(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), -(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), -(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), -(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), -(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), -(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), -(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), -(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), -(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), -(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), -(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), -(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), -(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), -(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), -(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), -(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), -(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), -(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), -(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), -(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), -(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), -(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), -(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), -(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), -(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), -(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), -(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), -(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), -(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), -(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), -(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), -(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), -(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), -(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), -(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), -(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), -(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), -(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), -(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), -(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), -(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), -(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), -(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), -(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), -(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), -(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), -(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), -(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), -(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), -(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), -(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), -(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), -(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), -(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), -(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), -(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), -(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), -(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), -(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), -(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), -) - -class JapaneseContextAnalysis: - def __init__(self): - self.reset() - - def reset(self): - self._mTotalRel = 0 # total sequence received - # category counters, each interger counts sequence in its category - self._mRelSample = [0] * NUM_OF_CATEGORY - # if last byte in current buffer is not the last byte of a character, - # we need to know how many bytes to skip in next buffer - self._mNeedToSkipCharNum = 0 - self._mLastCharOrder = -1 # The order of previous char - # If this flag is set to True, detection is done and conclusion has - # been made - self._mDone = False - - def feed(self, aBuf, aLen): - if self._mDone: - return - - # The buffer we got is byte oriented, and a character may span in more than one - # buffers. In case the last one or two byte in last buffer is not - # complete, we record how many byte needed to complete that character - # and skip these bytes here. We can choose to record those bytes as - # well and analyse the character once it is complete, but since a - # character will not make much difference, by simply skipping - # this character will simply our logic and improve performance. - i = self._mNeedToSkipCharNum - while i < aLen: - order, charLen = self.get_order(aBuf[i:i + 2]) - i += charLen - if i > aLen: - self._mNeedToSkipCharNum = i - aLen - self._mLastCharOrder = -1 - else: - if (order != -1) and (self._mLastCharOrder != -1): - self._mTotalRel += 1 - if self._mTotalRel > MAX_REL_THRESHOLD: - self._mDone = True - break - self._mRelSample[jp2CharContext[self._mLastCharOrder][order]] += 1 - self._mLastCharOrder = order - - def got_enough_data(self): - return self._mTotalRel > ENOUGH_REL_THRESHOLD - - def get_confidence(self): - # This is just one way to calculate confidence. It works well for me. - if self._mTotalRel > MINIMUM_DATA_THRESHOLD: - return (self._mTotalRel - self._mRelSample[0]) / self._mTotalRel - else: - return DONT_KNOW - - def get_order(self, aBuf): - return -1, 1 - -class SJISContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): - charLen = 2 - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 202) and (0x9F <= second_char <= 0xF1): - return second_char - 0x9F, charLen - - return -1, charLen - -class EUCJPContextAnalysis(JapaneseContextAnalysis): - def get_order(self, aBuf): - if not aBuf: - return -1, 1 - # find out current char's byte length - first_char = wrap_ord(aBuf[0]) - if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): - charLen = 2 - elif first_char == 0x8F: - charLen = 3 - else: - charLen = 1 - - # return its order if it is hiragana - if len(aBuf) > 1: - second_char = wrap_ord(aBuf[1]) - if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): - return second_char - 0xA1, charLen - - return -1, charLen - -# flake8: noqa diff --git a/requests/packages/charade/langbulgarianmodel.py b/requests/packages/charade/langbulgarianmodel.py deleted file mode 100755 index e5788fc..0000000 --- a/requests/packages/charade/langbulgarianmodel.py +++ /dev/null @@ -1,229 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -# this table is modified base on win1251BulgarianCharToOrderMap, so -# only number <64 is sure valid - -Latin5_BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 -) - -win1251BulgarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 96.9392% -# first 1024 sequences:3.0618% -# rest sequences: 0.2992% -# negative sequences: 0.0020% -BulgarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -) - -Latin5BulgarianModel = { - 'charToOrderMap': Latin5_BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -Win1251BulgarianModel = { - 'charToOrderMap': win1251BulgarianCharToOrderMap, - 'precedenceMatrix': BulgarianLangModel, - 'mTypicalPositiveRatio': 0.969392, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - - -# flake8: noqa diff --git a/requests/packages/charade/langcyrillicmodel.py b/requests/packages/charade/langcyrillicmodel.py deleted file mode 100755 index f0b9af2..0000000 --- a/requests/packages/charade/langcyrillicmodel.py +++ /dev/null @@ -1,331 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants - -# KOI8-R language model -# Character Mapping Table: -KOI8R_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 -) - -win1251_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -) - -latin5_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -macCyrillic_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -) - -IBM855_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -) - -IBM866_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 97.6601% -# first 1024 sequences: 2.3389% -# rest sequences: 0.1237% -# negative sequences: 0.0009% -RussianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -) - -Koi8rModel = { - 'charToOrderMap': KOI8R_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "KOI8-R" -} - -Win1251CyrillicModel = { - 'charToOrderMap': win1251_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "windows-1251" -} - -Latin5CyrillicModel = { - 'charToOrderMap': latin5_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-5" -} - -MacCyrillicModel = { - 'charToOrderMap': macCyrillic_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "MacCyrillic" -}; - -Ibm866Model = { - 'charToOrderMap': IBM866_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM866" -} - -Ibm855Model = { - 'charToOrderMap': IBM855_CharToOrderMap, - 'precedenceMatrix': RussianLangModel, - 'mTypicalPositiveRatio': 0.976601, - 'keepEnglishLetter': False, - 'charsetName': "IBM855" -} - -# flake8: noqa diff --git a/requests/packages/charade/langgreekmodel.py b/requests/packages/charade/langgreekmodel.py deleted file mode 100755 index 891fe34..0000000 --- a/requests/packages/charade/langgreekmodel.py +++ /dev/null @@ -1,227 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin7_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -win1253_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 -253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.2851% -# first 1024 sequences:1.7001% -# rest sequences: 0.0359% -# negative sequences: 0.0148% -GreekLangModel = ( -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -Latin7GreekModel = { - 'charToOrderMap': Latin7_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "ISO-8859-7" -} - -Win1253GreekModel = { - 'charToOrderMap': win1253_CharToOrderMap, - 'precedenceMatrix': GreekLangModel, - 'mTypicalPositiveRatio': 0.982851, - 'keepEnglishLetter': False, - 'charsetName': "windows-1253" -} - -# flake8: noqa diff --git a/requests/packages/charade/langhebrewmodel.py b/requests/packages/charade/langhebrewmodel.py deleted file mode 100755 index 248b02a..0000000 --- a/requests/packages/charade/langhebrewmodel.py +++ /dev/null @@ -1,203 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Simon Montagu -# Portions created by the Initial Developer are Copyright (C) 2005 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Shoshannah Forbes - original C code (?) -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Windows-1255 language model -# Character Mapping Table: -win1255_CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 98.4004% -# first 1024 sequences: 1.5981% -# rest sequences: 0.087% -# negative sequences: 0.0015% -HebrewLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -) - -Win1255HebrewModel = { - 'charToOrderMap': win1255_CharToOrderMap, - 'precedenceMatrix': HebrewLangModel, - 'mTypicalPositiveRatio': 0.984004, - 'keepEnglishLetter': False, - 'charsetName': "windows-1255" -} - -# flake8: noqa diff --git a/requests/packages/charade/langhungarianmodel.py b/requests/packages/charade/langhungarianmodel.py deleted file mode 100755 index c748d28..0000000 --- a/requests/packages/charade/langhungarianmodel.py +++ /dev/null @@ -1,227 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# Character Mapping Table: -Latin2_HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -win1250HungarianCharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 94.7368% -# first 1024 sequences:5.2623% -# rest sequences: 0.8894% -# negative sequences: 0.0009% -HungarianLangModel = ( -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -) - -Latin2HungarianModel = { - 'charToOrderMap': Latin2_HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "ISO-8859-2" -} - -Win1250HungarianModel = { - 'charToOrderMap': win1250HungarianCharToOrderMap, - 'precedenceMatrix': HungarianLangModel, - 'mTypicalPositiveRatio': 0.947368, - 'keepEnglishLetter': True, - 'charsetName': "windows-1250" -} - -# flake8: noqa diff --git a/requests/packages/charade/langthaimodel.py b/requests/packages/charade/langthaimodel.py deleted file mode 100755 index 0508b1b..0000000 --- a/requests/packages/charade/langthaimodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Communicator client code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -# 255: Control characters that usually does not exist in any text -# 254: Carriage/Return -# 253: symbol (punctuation) that does not belong to word -# 252: 0 - 9 - -# The following result for thai was collected from a limited sample (1M). - -# Character Mapping Table: -TIS620CharToOrderMap = ( -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 -253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -) - -# Model Table: -# total sequences: 100% -# first 512 sequences: 92.6386% -# first 1024 sequences:7.3177% -# rest sequences: 1.0230% -# negative sequences: 0.0436% -ThaiLangModel = ( -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -) - -TIS620ThaiModel = { - 'charToOrderMap': TIS620CharToOrderMap, - 'precedenceMatrix': ThaiLangModel, - 'mTypicalPositiveRatio': 0.926386, - 'keepEnglishLetter': False, - 'charsetName': "TIS-620" -} - -# flake8: noqa diff --git a/requests/packages/charade/latin1prober.py b/requests/packages/charade/latin1prober.py deleted file mode 100755 index ad695f5..0000000 --- a/requests/packages/charade/latin1prober.py +++ /dev/null @@ -1,139 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetprober import CharSetProber -from .constants import eNotMe -from .compat import wrap_ord - -FREQ_CAT_NUM = 4 - -UDF = 0 # undefined -OTH = 1 # other -ASC = 2 # ascii capital letter -ASS = 3 # ascii small letter -ACV = 4 # accent capital vowel -ACO = 5 # accent capital other -ASV = 6 # accent small vowel -ASO = 7 # accent small other -CLASS_NUM = 8 # total classes - -Latin1_CharToClass = ( - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F - OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F - ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 - ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F - OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F - ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 - ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F - OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 - OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F - UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 - OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 - OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF - ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 - ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF - ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 - ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF - ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 - ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF - ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 - ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF -) - -# 0 : illegal -# 1 : very unlikely -# 2 : normal -# 3 : very likely -Latin1ClassModel = ( - # UDF OTH ASC ASS ACV ACO ASV ASO - 0, 0, 0, 0, 0, 0, 0, 0, # UDF - 0, 3, 3, 3, 3, 3, 3, 3, # OTH - 0, 3, 3, 3, 3, 3, 3, 3, # ASC - 0, 3, 3, 3, 1, 1, 3, 3, # ASS - 0, 3, 3, 3, 1, 2, 1, 2, # ACV - 0, 3, 3, 3, 3, 3, 3, 3, # ACO - 0, 3, 1, 3, 1, 1, 1, 3, # ASV - 0, 3, 1, 3, 1, 1, 3, 3, # ASO -) - - -class Latin1Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self.reset() - - def reset(self): - self._mLastCharClass = OTH - self._mFreqCounter = [0] * FREQ_CAT_NUM - CharSetProber.reset(self) - - def get_charset_name(self): - return "windows-1252" - - def feed(self, aBuf): - aBuf = self.filter_with_english_letters(aBuf) - for c in aBuf: - charClass = Latin1_CharToClass[wrap_ord(c)] - freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) - + charClass] - if freq == 0: - self._mState = eNotMe - break - self._mFreqCounter[freq] += 1 - self._mLastCharClass = charClass - - return self.get_state() - - def get_confidence(self): - if self.get_state() == eNotMe: - return 0.01 - - total = sum(self._mFreqCounter) - if total < 0.01: - confidence = 0.0 - else: - confidence = ((self._mFreqCounter[3] / total) - - (self._mFreqCounter[1] * 20.0 / total)) - if confidence < 0.0: - confidence = 0.0 - # lower the confidence of latin1 so that other more accurate - # detector can take priority. - confidence = confidence * 0.5 - return confidence diff --git a/requests/packages/charade/mbcharsetprober.py b/requests/packages/charade/mbcharsetprober.py deleted file mode 100755 index bb42f2f..0000000 --- a/requests/packages/charade/mbcharsetprober.py +++ /dev/null @@ -1,86 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber - - -class MultiByteCharSetProber(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mDistributionAnalyzer = None - self._mCodingSM = None - self._mLastChar = [0, 0] - - def reset(self): - CharSetProber.reset(self) - if self._mCodingSM: - self._mCodingSM.reset() - if self._mDistributionAnalyzer: - self._mDistributionAnalyzer.reset() - self._mLastChar = [0, 0] - - def get_charset_name(self): - pass - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mDistributionAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - return self._mDistributionAnalyzer.get_confidence() diff --git a/requests/packages/charade/mbcsgroupprober.py b/requests/packages/charade/mbcsgroupprober.py deleted file mode 100755 index e349a9b..0000000 --- a/requests/packages/charade/mbcsgroupprober.py +++ /dev/null @@ -1,52 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# Proofpoint, Inc. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .utf8prober import UTF8Prober -from .sjisprober import SJISProber -from .eucjpprober import EUCJPProber -from .gb2312prober import GB2312Prober -from .euckrprober import EUCKRProber -from .big5prober import Big5Prober -from .euctwprober import EUCTWProber - - -class MBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - UTF8Prober(), - SJISProber(), - EUCJPProber(), - GB2312Prober(), - EUCKRProber(), - Big5Prober(), - EUCTWProber() - ] - self.reset() diff --git a/requests/packages/charade/mbcssm.py b/requests/packages/charade/mbcssm.py deleted file mode 100755 index fc7904a..0000000 --- a/requests/packages/charade/mbcssm.py +++ /dev/null @@ -1,535 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .constants import eStart, eError, eItsMe - -# BIG5 - -BIG5_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 4,4,4,4,4,4,4,4, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 4,3,3,3,3,3,3,3, # a0 - a7 - 3,3,3,3,3,3,3,3, # a8 - af - 3,3,3,3,3,3,3,3, # b0 - b7 - 3,3,3,3,3,3,3,3, # b8 - bf - 3,3,3,3,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -BIG5_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f - eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 -) - -Big5CharLenTable = (0, 1, 1, 2, 0) - -Big5SMModel = {'classTable': BIG5_cls, - 'classFactor': 5, - 'stateTable': BIG5_st, - 'charLenTable': Big5CharLenTable, - 'name': 'Big5'} - -# EUC-JP - -EUCJP_cls = ( - 4,4,4,4,4,4,4,4, # 00 - 07 - 4,4,4,4,4,4,5,5, # 08 - 0f - 4,4,4,4,4,4,4,4, # 10 - 17 - 4,4,4,5,4,4,4,4, # 18 - 1f - 4,4,4,4,4,4,4,4, # 20 - 27 - 4,4,4,4,4,4,4,4, # 28 - 2f - 4,4,4,4,4,4,4,4, # 30 - 37 - 4,4,4,4,4,4,4,4, # 38 - 3f - 4,4,4,4,4,4,4,4, # 40 - 47 - 4,4,4,4,4,4,4,4, # 48 - 4f - 4,4,4,4,4,4,4,4, # 50 - 57 - 4,4,4,4,4,4,4,4, # 58 - 5f - 4,4,4,4,4,4,4,4, # 60 - 67 - 4,4,4,4,4,4,4,4, # 68 - 6f - 4,4,4,4,4,4,4,4, # 70 - 77 - 4,4,4,4,4,4,4,4, # 78 - 7f - 5,5,5,5,5,5,5,5, # 80 - 87 - 5,5,5,5,5,5,1,3, # 88 - 8f - 5,5,5,5,5,5,5,5, # 90 - 97 - 5,5,5,5,5,5,5,5, # 98 - 9f - 5,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,0,5 # f8 - ff -) - -EUCJP_st = ( - 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 - eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f - 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 -) - -EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) - -EUCJPSMModel = {'classTable': EUCJP_cls, - 'classFactor': 6, - 'stateTable': EUCJP_st, - 'charLenTable': EUCJPCharLenTable, - 'name': 'EUC-JP'} - -# EUC-KR - -EUCKR_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,3,3,3, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,3,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 2,2,2,2,2,2,2,2, # e0 - e7 - 2,2,2,2,2,2,2,2, # e8 - ef - 2,2,2,2,2,2,2,2, # f0 - f7 - 2,2,2,2,2,2,2,0 # f8 - ff -) - -EUCKR_st = ( - eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 - eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f -) - -EUCKRCharLenTable = (0, 1, 2, 0) - -EUCKRSMModel = {'classTable': EUCKR_cls, - 'classFactor': 4, - 'stateTable': EUCKR_st, - 'charLenTable': EUCKRCharLenTable, - 'name': 'EUC-KR'} - -# EUC-TW - -EUCTW_cls = ( - 2,2,2,2,2,2,2,2, # 00 - 07 - 2,2,2,2,2,2,0,0, # 08 - 0f - 2,2,2,2,2,2,2,2, # 10 - 17 - 2,2,2,0,2,2,2,2, # 18 - 1f - 2,2,2,2,2,2,2,2, # 20 - 27 - 2,2,2,2,2,2,2,2, # 28 - 2f - 2,2,2,2,2,2,2,2, # 30 - 37 - 2,2,2,2,2,2,2,2, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,2, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,6,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,3,4,4,4,4,4,4, # a0 - a7 - 5,5,1,1,1,1,1,1, # a8 - af - 1,1,1,1,1,1,1,1, # b0 - b7 - 1,1,1,1,1,1,1,1, # b8 - bf - 1,1,3,1,3,3,3,3, # c0 - c7 - 3,3,3,3,3,3,3,3, # c8 - cf - 3,3,3,3,3,3,3,3, # d0 - d7 - 3,3,3,3,3,3,3,3, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,3,3,3, # e8 - ef - 3,3,3,3,3,3,3,3, # f0 - f7 - 3,3,3,3,3,3,3,0 # f8 - ff -) - -EUCTW_st = ( - eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 - eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f - 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 - eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) - -EUCTWSMModel = {'classTable': EUCTW_cls, - 'classFactor': 7, - 'stateTable': EUCTW_st, - 'charLenTable': EUCTWCharLenTable, - 'name': 'x-euc-tw'} - -# GB2312 - -GB2312_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 3,3,3,3,3,3,3,3, # 30 - 37 - 3,3,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,4, # 78 - 7f - 5,6,6,6,6,6,6,6, # 80 - 87 - 6,6,6,6,6,6,6,6, # 88 - 8f - 6,6,6,6,6,6,6,6, # 90 - 97 - 6,6,6,6,6,6,6,6, # 98 - 9f - 6,6,6,6,6,6,6,6, # a0 - a7 - 6,6,6,6,6,6,6,6, # a8 - af - 6,6,6,6,6,6,6,6, # b0 - b7 - 6,6,6,6,6,6,6,6, # b8 - bf - 6,6,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 6,6,6,6,6,6,6,6, # e0 - e7 - 6,6,6,6,6,6,6,6, # e8 - ef - 6,6,6,6,6,6,6,6, # f0 - f7 - 6,6,6,6,6,6,6,0 # f8 - ff -) - -GB2312_st = ( - eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 - eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 - 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f - eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 - eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f -) - -# To be accurate, the length of class 6 can be either 2 or 4. -# But it is not necessary to discriminate between the two since -# it is used for frequency analysis only, and we are validing -# each code range there as well. So it is safe to set it to be -# 2 here. -GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) - -GB2312SMModel = {'classTable': GB2312_cls, - 'classFactor': 7, - 'stateTable': GB2312_st, - 'charLenTable': GB2312CharLenTable, - 'name': 'GB2312'} - -# Shift_JIS - -SJIS_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 2,2,2,2,2,2,2,2, # 40 - 47 - 2,2,2,2,2,2,2,2, # 48 - 4f - 2,2,2,2,2,2,2,2, # 50 - 57 - 2,2,2,2,2,2,2,2, # 58 - 5f - 2,2,2,2,2,2,2,2, # 60 - 67 - 2,2,2,2,2,2,2,2, # 68 - 6f - 2,2,2,2,2,2,2,2, # 70 - 77 - 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,3,3,3, # 80 - 87 - 3,3,3,3,3,3,3,3, # 88 - 8f - 3,3,3,3,3,3,3,3, # 90 - 97 - 3,3,3,3,3,3,3,3, # 98 - 9f - #0xa0 is illegal in sjis encoding, but some pages does - #contain such byte. We need to be more error forgiven. - 2,2,2,2,2,2,2,2, # a0 - a7 - 2,2,2,2,2,2,2,2, # a8 - af - 2,2,2,2,2,2,2,2, # b0 - b7 - 2,2,2,2,2,2,2,2, # b8 - bf - 2,2,2,2,2,2,2,2, # c0 - c7 - 2,2,2,2,2,2,2,2, # c8 - cf - 2,2,2,2,2,2,2,2, # d0 - d7 - 2,2,2,2,2,2,2,2, # d8 - df - 3,3,3,3,3,3,3,3, # e0 - e7 - 3,3,3,3,3,4,4,4, # e8 - ef - 4,4,4,4,4,4,4,4, # f0 - f7 - 4,4,4,4,4,0,0,0 # f8 - ff -) - - -SJIS_st = ( - eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 -) - -SJISCharLenTable = (0, 1, 1, 2, 0, 0) - -SJISSMModel = {'classTable': SJIS_cls, - 'classFactor': 6, - 'stateTable': SJIS_st, - 'charLenTable': SJISCharLenTable, - 'name': 'Shift_JIS'} - -# UCS2-BE - -UCS2BE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2BE_st = ( - 5, 7, 7,eError, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 - 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f - 6, 6, 6, 6, 5, 7, 7,eError,#20-27 - 5, 8, 6, 6,eError, 6, 6, 6,#28-2f - 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 -) - -UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) - -UCS2BESMModel = {'classTable': UCS2BE_cls, - 'classFactor': 6, - 'stateTable': UCS2BE_st, - 'charLenTable': UCS2BECharLenTable, - 'name': 'UTF-16BE'} - -# UCS2-LE - -UCS2LE_cls = ( - 0,0,0,0,0,0,0,0, # 00 - 07 - 0,0,1,0,0,2,0,0, # 08 - 0f - 0,0,0,0,0,0,0,0, # 10 - 17 - 0,0,0,3,0,0,0,0, # 18 - 1f - 0,0,0,0,0,0,0,0, # 20 - 27 - 0,3,3,3,3,3,0,0, # 28 - 2f - 0,0,0,0,0,0,0,0, # 30 - 37 - 0,0,0,0,0,0,0,0, # 38 - 3f - 0,0,0,0,0,0,0,0, # 40 - 47 - 0,0,0,0,0,0,0,0, # 48 - 4f - 0,0,0,0,0,0,0,0, # 50 - 57 - 0,0,0,0,0,0,0,0, # 58 - 5f - 0,0,0,0,0,0,0,0, # 60 - 67 - 0,0,0,0,0,0,0,0, # 68 - 6f - 0,0,0,0,0,0,0,0, # 70 - 77 - 0,0,0,0,0,0,0,0, # 78 - 7f - 0,0,0,0,0,0,0,0, # 80 - 87 - 0,0,0,0,0,0,0,0, # 88 - 8f - 0,0,0,0,0,0,0,0, # 90 - 97 - 0,0,0,0,0,0,0,0, # 98 - 9f - 0,0,0,0,0,0,0,0, # a0 - a7 - 0,0,0,0,0,0,0,0, # a8 - af - 0,0,0,0,0,0,0,0, # b0 - b7 - 0,0,0,0,0,0,0,0, # b8 - bf - 0,0,0,0,0,0,0,0, # c0 - c7 - 0,0,0,0,0,0,0,0, # c8 - cf - 0,0,0,0,0,0,0,0, # d0 - d7 - 0,0,0,0,0,0,0,0, # d8 - df - 0,0,0,0,0,0,0,0, # e0 - e7 - 0,0,0,0,0,0,0,0, # e8 - ef - 0,0,0,0,0,0,0,0, # f0 - f7 - 0,0,0,0,0,0,4,5 # f8 - ff -) - -UCS2LE_st = ( - 6, 6, 7, 6, 4, 3,eError,eError,#00-07 - eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f - eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 - 5, 5, 5,eError, 5,eError, 6, 6,#18-1f - 7, 6, 8, 8, 5, 5, 5,eError,#20-27 - 5, 5, 5,eError,eError,eError, 5, 5,#28-2f - 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 -) - -UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) - -UCS2LESMModel = {'classTable': UCS2LE_cls, - 'classFactor': 6, - 'stateTable': UCS2LE_st, - 'charLenTable': UCS2LECharLenTable, - 'name': 'UTF-16LE'} - -# UTF-8 - -UTF8_cls = ( - 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value - 1,1,1,1,1,1,0,0, # 08 - 0f - 1,1,1,1,1,1,1,1, # 10 - 17 - 1,1,1,0,1,1,1,1, # 18 - 1f - 1,1,1,1,1,1,1,1, # 20 - 27 - 1,1,1,1,1,1,1,1, # 28 - 2f - 1,1,1,1,1,1,1,1, # 30 - 37 - 1,1,1,1,1,1,1,1, # 38 - 3f - 1,1,1,1,1,1,1,1, # 40 - 47 - 1,1,1,1,1,1,1,1, # 48 - 4f - 1,1,1,1,1,1,1,1, # 50 - 57 - 1,1,1,1,1,1,1,1, # 58 - 5f - 1,1,1,1,1,1,1,1, # 60 - 67 - 1,1,1,1,1,1,1,1, # 68 - 6f - 1,1,1,1,1,1,1,1, # 70 - 77 - 1,1,1,1,1,1,1,1, # 78 - 7f - 2,2,2,2,3,3,3,3, # 80 - 87 - 4,4,4,4,4,4,4,4, # 88 - 8f - 4,4,4,4,4,4,4,4, # 90 - 97 - 4,4,4,4,4,4,4,4, # 98 - 9f - 5,5,5,5,5,5,5,5, # a0 - a7 - 5,5,5,5,5,5,5,5, # a8 - af - 5,5,5,5,5,5,5,5, # b0 - b7 - 5,5,5,5,5,5,5,5, # b8 - bf - 0,0,6,6,6,6,6,6, # c0 - c7 - 6,6,6,6,6,6,6,6, # c8 - cf - 6,6,6,6,6,6,6,6, # d0 - d7 - 6,6,6,6,6,6,6,6, # d8 - df - 7,8,8,8,8,8,8,8, # e0 - e7 - 8,8,8,8,8,9,8,8, # e8 - ef - 10,11,11,11,11,11,11,11, # f0 - f7 - 12,13,13,13,14,15,0,0 # f8 - ff -) - -UTF8_st = ( - eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 - 9, 11, 8, 7, 6, 5, 4, 3,#08-0f - eError,eError,eError,eError,eError,eError,eError,eError,#10-17 - eError,eError,eError,eError,eError,eError,eError,eError,#18-1f - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 - eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f - eError,eError, 5, 5, 5, 5,eError,eError,#30-37 - eError,eError,eError,eError,eError,eError,eError,eError,#38-3f - eError,eError,eError, 5, 5, 5,eError,eError,#40-47 - eError,eError,eError,eError,eError,eError,eError,eError,#48-4f - eError,eError, 7, 7, 7, 7,eError,eError,#50-57 - eError,eError,eError,eError,eError,eError,eError,eError,#58-5f - eError,eError,eError,eError, 7, 7,eError,eError,#60-67 - eError,eError,eError,eError,eError,eError,eError,eError,#68-6f - eError,eError, 9, 9, 9, 9,eError,eError,#70-77 - eError,eError,eError,eError,eError,eError,eError,eError,#78-7f - eError,eError,eError,eError,eError, 9,eError,eError,#80-87 - eError,eError,eError,eError,eError,eError,eError,eError,#88-8f - eError,eError, 12, 12, 12, 12,eError,eError,#90-97 - eError,eError,eError,eError,eError,eError,eError,eError,#98-9f - eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 - eError,eError,eError,eError,eError,eError,eError,eError,#a8-af - eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 - eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf - eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 - eError,eError,eError,eError,eError,eError,eError,eError #c8-cf -) - -UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) - -UTF8SMModel = {'classTable': UTF8_cls, - 'classFactor': 16, - 'stateTable': UTF8_st, - 'charLenTable': UTF8CharLenTable, - 'name': 'UTF-8'} - -# flake8: noqa diff --git a/requests/packages/charade/sbcharsetprober.py b/requests/packages/charade/sbcharsetprober.py deleted file mode 100755 index 37291bd..0000000 --- a/requests/packages/charade/sbcharsetprober.py +++ /dev/null @@ -1,120 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from . import constants -from .charsetprober import CharSetProber -from .compat import wrap_ord - -SAMPLE_SIZE = 64 -SB_ENOUGH_REL_THRESHOLD = 1024 -POSITIVE_SHORTCUT_THRESHOLD = 0.95 -NEGATIVE_SHORTCUT_THRESHOLD = 0.05 -SYMBOL_CAT_ORDER = 250 -NUMBER_OF_SEQ_CAT = 4 -POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 -#NEGATIVE_CAT = 0 - - -class SingleByteCharSetProber(CharSetProber): - def __init__(self, model, reversed=False, nameProber=None): - CharSetProber.__init__(self) - self._mModel = model - # TRUE if we need to reverse every pair in the model lookup - self._mReversed = reversed - # Optional auxiliary prober for name decision - self._mNameProber = nameProber - self.reset() - - def reset(self): - CharSetProber.reset(self) - # char order of last character - self._mLastOrder = 255 - self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT - self._mTotalSeqs = 0 - self._mTotalChar = 0 - # characters that fall in our sampling range - self._mFreqChar = 0 - - def get_charset_name(self): - if self._mNameProber: - return self._mNameProber.get_charset_name() - else: - return self._mModel['charsetName'] - - def feed(self, aBuf): - if not self._mModel['keepEnglishLetter']: - aBuf = self.filter_without_english_letters(aBuf) - aLen = len(aBuf) - if not aLen: - return self.get_state() - for c in aBuf: - order = self._mModel['charToOrderMap'][wrap_ord(c)] - if order < SYMBOL_CAT_ORDER: - self._mTotalChar += 1 - if order < SAMPLE_SIZE: - self._mFreqChar += 1 - if self._mLastOrder < SAMPLE_SIZE: - self._mTotalSeqs += 1 - if not self._mReversed: - i = (self._mLastOrder * SAMPLE_SIZE) + order - model = self._mModel['precedenceMatrix'][i] - else: # reverse the order of the letters in the lookup - i = (order * SAMPLE_SIZE) + self._mLastOrder - model = self._mModel['precedenceMatrix'][i] - self._mSeqCounters[model] += 1 - self._mLastOrder = order - - if self.get_state() == constants.eDetecting: - if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: - cf = self.get_confidence() - if cf > POSITIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, we have a' - 'winner\n' % - (self._mModel['charsetName'], cf)) - self._mState = constants.eFoundIt - elif cf < NEGATIVE_SHORTCUT_THRESHOLD: - if constants._debug: - sys.stderr.write('%s confidence = %s, below negative' - 'shortcut threshhold %s\n' % - (self._mModel['charsetName'], cf, - NEGATIVE_SHORTCUT_THRESHOLD)) - self._mState = constants.eNotMe - - return self.get_state() - - def get_confidence(self): - r = 0.01 - if self._mTotalSeqs > 0: - r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs - / self._mModel['mTypicalPositiveRatio']) - r = r * self._mFreqChar / self._mTotalChar - if r >= 1.0: - r = 0.99 - return r diff --git a/requests/packages/charade/sbcsgroupprober.py b/requests/packages/charade/sbcsgroupprober.py deleted file mode 100755 index 1b6196c..0000000 --- a/requests/packages/charade/sbcsgroupprober.py +++ /dev/null @@ -1,69 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from .charsetgroupprober import CharSetGroupProber -from .sbcharsetprober import SingleByteCharSetProber -from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, - Latin5CyrillicModel, MacCyrillicModel, - Ibm866Model, Ibm855Model) -from .langgreekmodel import Latin7GreekModel, Win1253GreekModel -from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel -from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel -from .langthaimodel import TIS620ThaiModel -from .langhebrewmodel import Win1255HebrewModel -from .hebrewprober import HebrewProber - - -class SBCSGroupProber(CharSetGroupProber): - def __init__(self): - CharSetGroupProber.__init__(self) - self._mProbers = [ - SingleByteCharSetProber(Win1251CyrillicModel), - SingleByteCharSetProber(Koi8rModel), - SingleByteCharSetProber(Latin5CyrillicModel), - SingleByteCharSetProber(MacCyrillicModel), - SingleByteCharSetProber(Ibm866Model), - SingleByteCharSetProber(Ibm855Model), - SingleByteCharSetProber(Latin7GreekModel), - SingleByteCharSetProber(Win1253GreekModel), - SingleByteCharSetProber(Latin5BulgarianModel), - SingleByteCharSetProber(Win1251BulgarianModel), - SingleByteCharSetProber(Latin2HungarianModel), - SingleByteCharSetProber(Win1250HungarianModel), - SingleByteCharSetProber(TIS620ThaiModel), - ] - hebrewProber = HebrewProber() - logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, - False, hebrewProber) - visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, - hebrewProber) - hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) - self._mProbers.extend([hebrewProber, logicalHebrewProber, - visualHebrewProber]) - - self.reset() diff --git a/requests/packages/charade/sjisprober.py b/requests/packages/charade/sjisprober.py deleted file mode 100755 index b173614..0000000 --- a/requests/packages/charade/sjisprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -import sys -from .mbcharsetprober import MultiByteCharSetProber -from .codingstatemachine import CodingStateMachine -from .chardistribution import SJISDistributionAnalysis -from .jpcntx import SJISContextAnalysis -from .mbcssm import SJISSMModel -from . import constants - - -class SJISProber(MultiByteCharSetProber): - def __init__(self): - MultiByteCharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(SJISSMModel) - self._mDistributionAnalyzer = SJISDistributionAnalysis() - self._mContextAnalyzer = SJISContextAnalysis() - self.reset() - - def reset(self): - MultiByteCharSetProber.reset(self) - self._mContextAnalyzer.reset() - - def get_charset_name(self): - return "SHIFT_JIS" - - def feed(self, aBuf): - aLen = len(aBuf) - for i in range(0, aLen): - codingState = self._mCodingSM.next_state(aBuf[i]) - if codingState == constants.eError: - if constants._debug: - sys.stderr.write(self.get_charset_name() - + ' prober hit error at byte ' + str(i) - + '\n') - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - charLen = self._mCodingSM.get_current_charlen() - if i == 0: - self._mLastChar[1] = aBuf[0] - self._mContextAnalyzer.feed(self._mLastChar[2 - charLen:], - charLen) - self._mDistributionAnalyzer.feed(self._mLastChar, charLen) - else: - self._mContextAnalyzer.feed(aBuf[i + 1 - charLen:i + 3 - - charLen], charLen) - self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], - charLen) - - self._mLastChar[0] = aBuf[aLen - 1] - - if self.get_state() == constants.eDetecting: - if (self._mContextAnalyzer.got_enough_data() and - (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - contxtCf = self._mContextAnalyzer.get_confidence() - distribCf = self._mDistributionAnalyzer.get_confidence() - return max(contxtCf, distribCf) diff --git a/requests/packages/charade/universaldetector.py b/requests/packages/charade/universaldetector.py deleted file mode 100755 index 3d5336b..0000000 --- a/requests/packages/charade/universaldetector.py +++ /dev/null @@ -1,171 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is Mozilla Universal charset detector code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 2001 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# Shy Shalom - original C code -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -import sys -from .latin1prober import Latin1Prober # windows-1252 -from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets -from .sbcsgroupprober import SBCSGroupProber # single-byte character sets -from .escprober import EscCharSetProber # ISO-2122, etc. -import re - -MINIMUM_THRESHOLD = 0.20 -ePureAscii = 0 -eEscAscii = 1 -eHighbyte = 2 - - -class UniversalDetector: - def __init__(self): - self._highBitDetector = re.compile(b'[\x80-\xFF]') - self._escDetector = re.compile(b'(\033|~{)') - self._mEscCharSetProber = None - self._mCharSetProbers = [] - self.reset() - - def reset(self): - self.result = {'encoding': None, 'confidence': 0.0} - self.done = False - self._mStart = True - self._mGotData = False - self._mInputState = ePureAscii - self._mLastChar = b'' - if self._mEscCharSetProber: - self._mEscCharSetProber.reset() - for prober in self._mCharSetProbers: - prober.reset() - - def feed(self, aBuf): - if self.done: - return - - aLen = len(aBuf) - if not aLen: - return - - if not self._mGotData: - # If the data starts with BOM, we know it is UTF - if aBuf[:3] == '\xEF\xBB\xBF': - # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8", 'confidence': 1.0} - elif aBuf[:4] == '\xFF\xFE\x00\x00': - # FF FE 00 00 UTF-32, little-endian BOM - self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} - elif aBuf[:4] == '\x00\x00\xFE\xFF': - # 00 00 FE FF UTF-32, big-endian BOM - self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} - elif aBuf[:4] == '\xFE\xFF\x00\x00': - # FE FF 00 00 UCS-4, unusual octet order BOM (3412) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-3412", - 'confidence': 1.0 - } - elif aBuf[:4] == '\x00\x00\xFF\xFE': - # 00 00 FF FE UCS-4, unusual octet order BOM (2143) - self.result = { - 'encoding': "X-ISO-10646-UCS-4-2143", - 'confidence': 1.0 - } - elif aBuf[:2] == '\xFF\xFE': - # FF FE UTF-16, little endian BOM - self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} - elif aBuf[:2] == '\xFE\xFF': - # FE FF UTF-16, big endian BOM - self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} - - self._mGotData = True - if self.result['encoding'] and (self.result['confidence'] > 0.0): - self.done = True - return - - if self._mInputState == ePureAscii: - if self._highBitDetector.search(aBuf): - self._mInputState = eHighbyte - elif ((self._mInputState == ePureAscii) and - self._escDetector.search(self._mLastChar + aBuf)): - self._mInputState = eEscAscii - - self._mLastChar = aBuf[-1:] - - if self._mInputState == eEscAscii: - if not self._mEscCharSetProber: - self._mEscCharSetProber = EscCharSetProber() - if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: - self.result = { - 'encoding': self._mEscCharSetProber.get_charset_name(), - 'confidence': self._mEscCharSetProber.get_confidence() - } - self.done = True - elif self._mInputState == eHighbyte: - if not self._mCharSetProbers: - self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), - Latin1Prober()] - for prober in self._mCharSetProbers: - if prober.feed(aBuf) == constants.eFoundIt: - self.result = {'encoding': prober.get_charset_name(), - 'confidence': prober.get_confidence()} - self.done = True - break - - def close(self): - if self.done: - return - if not self._mGotData: - if constants._debug: - sys.stderr.write('no data received!\n') - return - self.done = True - - if self._mInputState == ePureAscii: - self.result = {'encoding': 'ascii', 'confidence': 1.0} - return self.result - - if self._mInputState == eHighbyte: - proberConfidence = None - maxProberConfidence = 0.0 - maxProber = None - for prober in self._mCharSetProbers: - if not prober: - continue - proberConfidence = prober.get_confidence() - if proberConfidence > maxProberConfidence: - maxProberConfidence = proberConfidence - maxProber = prober - if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): - self.result = {'encoding': maxProber.get_charset_name(), - 'confidence': maxProber.get_confidence()} - return self.result - - if constants._debug: - sys.stderr.write('no probers hit minimum threshhold\n') - for prober in self._mCharSetProbers[0].mProbers: - if not prober: - continue - sys.stderr.write('%s confidence = %s\n' % - (prober.get_charset_name(), - prober.get_confidence())) diff --git a/requests/packages/charade/utf8prober.py b/requests/packages/charade/utf8prober.py deleted file mode 100755 index 1c0bb5d..0000000 --- a/requests/packages/charade/utf8prober.py +++ /dev/null @@ -1,76 +0,0 @@ -######################## BEGIN LICENSE BLOCK ######################## -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is -# Netscape Communications Corporation. -# Portions created by the Initial Developer are Copyright (C) 1998 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Mark Pilgrim - port to Python -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA -# 02110-1301 USA -######################### END LICENSE BLOCK ######################### - -from . import constants -from .charsetprober import CharSetProber -from .codingstatemachine import CodingStateMachine -from .mbcssm import UTF8SMModel - -ONE_CHAR_PROB = 0.5 - - -class UTF8Prober(CharSetProber): - def __init__(self): - CharSetProber.__init__(self) - self._mCodingSM = CodingStateMachine(UTF8SMModel) - self.reset() - - def reset(self): - CharSetProber.reset(self) - self._mCodingSM.reset() - self._mNumOfMBChar = 0 - - def get_charset_name(self): - return "utf-8" - - def feed(self, aBuf): - for c in aBuf: - codingState = self._mCodingSM.next_state(c) - if codingState == constants.eError: - self._mState = constants.eNotMe - break - elif codingState == constants.eItsMe: - self._mState = constants.eFoundIt - break - elif codingState == constants.eStart: - if self._mCodingSM.get_current_charlen() >= 2: - self._mNumOfMBChar += 1 - - if self.get_state() == constants.eDetecting: - if self.get_confidence() > constants.SHORTCUT_THRESHOLD: - self._mState = constants.eFoundIt - - return self.get_state() - - def get_confidence(self): - unlike = 0.99 - if self._mNumOfMBChar < 6: - for i in range(0, self._mNumOfMBChar): - unlike = unlike * ONE_CHAR_PROB - return 1.0 - unlike - else: - return unlike diff --git a/requests/packages/urllib3/__init__.py b/requests/packages/urllib3/__init__.py deleted file mode 100755 index 55de87e..0000000 --- a/requests/packages/urllib3/__init__.py +++ /dev/null @@ -1,58 +0,0 @@ -# urllib3/__init__.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -""" -urllib3 - Thread-safe connection pooling and re-using. -""" - -__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' -__license__ = 'MIT' -__version__ = 'dev' - - -from .connectionpool import ( - HTTPConnectionPool, - HTTPSConnectionPool, - connection_from_url -) - -from . import exceptions -from .filepost import encode_multipart_formdata -from .poolmanager import PoolManager, ProxyManager, proxy_from_url -from .response import HTTPResponse -from .util import make_headers, get_host - - -# Set default logging handler to avoid "No handler found" warnings. -import logging -try: # Python 2.7+ - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - -logging.getLogger(__name__).addHandler(NullHandler()) - -def add_stderr_logger(level=logging.DEBUG): - """ - Helper for quickly adding a StreamHandler to the logger. Useful for - debugging. - - Returns the handler after adding it. - """ - # This method needs to be in this __init__.py to get the __name__ correct - # even if urllib3 is vendored within another package. - logger = logging.getLogger(__name__) - handler = logging.StreamHandler() - handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) - logger.addHandler(handler) - logger.setLevel(level) - logger.debug('Added an stderr logging handler to logger: %s' % __name__) - return handler - -# ... Clean up. -del NullHandler diff --git a/requests/packages/urllib3/_collections.py b/requests/packages/urllib3/_collections.py deleted file mode 100755 index a052b1d..0000000 --- a/requests/packages/urllib3/_collections.py +++ /dev/null @@ -1,94 +0,0 @@ -# urllib3/_collections.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -from collections import MutableMapping -from threading import Lock - -try: # Python 2.7+ - from collections import OrderedDict -except ImportError: - from .packages.ordered_dict import OrderedDict - - -__all__ = ['RecentlyUsedContainer'] - - -_Null = object() - - -class RecentlyUsedContainer(MutableMapping): - """ - Provides a thread-safe dict-like container which maintains up to - ``maxsize`` keys while throwing away the least-recently-used keys beyond - ``maxsize``. - - :param maxsize: - Maximum number of recent elements to retain. - - :param dispose_func: - Every time an item is evicted from the container, - ``dispose_func(value)`` is called. Callback which will get called - """ - - ContainerCls = OrderedDict - - def __init__(self, maxsize=10, dispose_func=None): - self._maxsize = maxsize - self.dispose_func = dispose_func - - self._container = self.ContainerCls() - self._lock = Lock() - - def __getitem__(self, key): - # Re-insert the item, moving it to the end of the eviction line. - with self._lock: - item = self._container.pop(key) - self._container[key] = item - return item - - def __setitem__(self, key, value): - evicted_value = _Null - with self._lock: - # Possibly evict the existing value of 'key' - evicted_value = self._container.get(key, _Null) - self._container[key] = value - - # If we didn't evict an existing value, we might have to evict the - # least recently used item from the beginning of the container. - if len(self._container) > self._maxsize: - _key, evicted_value = self._container.popitem(last=False) - - if self.dispose_func and evicted_value is not _Null: - self.dispose_func(evicted_value) - - def __delitem__(self, key): - with self._lock: - value = self._container.pop(key) - - if self.dispose_func: - self.dispose_func(value) - - def __len__(self): - with self._lock: - return len(self._container) - - def __iter__(self): - raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') - - def clear(self): - with self._lock: - # Copy pointers to all values, then wipe the mapping - # under Python 2, this copies the list of values twice :-| - values = list(self._container.values()) - self._container.clear() - - if self.dispose_func: - for value in values: - self.dispose_func(value) - - def keys(self): - with self._lock: - return self._container.keys() diff --git a/requests/packages/urllib3/connectionpool.py b/requests/packages/urllib3/connectionpool.py deleted file mode 100755 index af8760d..0000000 --- a/requests/packages/urllib3/connectionpool.py +++ /dev/null @@ -1,583 +0,0 @@ -# urllib3/connectionpool.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import logging -import socket -import errno - -from socket import error as SocketError, timeout as SocketTimeout - -try: # Python 3 - from http.client import HTTPConnection, HTTPException - from http.client import HTTP_PORT, HTTPS_PORT -except ImportError: - from httplib import HTTPConnection, HTTPException - from httplib import HTTP_PORT, HTTPS_PORT - -try: # Python 3 - from queue import LifoQueue, Empty, Full -except ImportError: - from Queue import LifoQueue, Empty, Full - - -try: # Compiled with SSL? - HTTPSConnection = object - BaseSSLError = None - ssl = None - - try: # Python 3 - from http.client import HTTPSConnection - except ImportError: - from httplib import HTTPSConnection - - import ssl - BaseSSLError = ssl.SSLError - -except (ImportError, AttributeError): # Platform-specific: No SSL. - pass - - -from .request import RequestMethods -from .response import HTTPResponse -from .util import get_host, is_connection_dropped, ssl_wrap_socket -from .exceptions import ( - ClosedPoolError, - EmptyPoolError, - HostChangedError, - MaxRetryError, - SSLError, - TimeoutError, -) - -from .packages.ssl_match_hostname import match_hostname, CertificateError -from .packages import six - - -xrange = six.moves.xrange - -log = logging.getLogger(__name__) - -_Default = object() - -port_by_scheme = { - 'http': HTTP_PORT, - 'https': HTTPS_PORT, -} - - -## Connection objects (extension of httplib) - -class VerifiedHTTPSConnection(HTTPSConnection): - """ - Based on httplib.HTTPSConnection but wraps the socket with - SSL certification. - """ - cert_reqs = None - ca_certs = None - ssl_version = None - - def set_cert(self, key_file=None, cert_file=None, - cert_reqs='CERT_NONE', ca_certs=None): - ssl_req_scheme = { - 'CERT_NONE': ssl.CERT_NONE, - 'CERT_OPTIONAL': ssl.CERT_OPTIONAL, - 'CERT_REQUIRED': ssl.CERT_REQUIRED - } - - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = ssl_req_scheme.get(cert_reqs) or ssl.CERT_NONE - self.ca_certs = ca_certs - - def connect(self): - # Add certificate verification - sock = socket.create_connection((self.host, self.port), self.timeout) - - # Wrap socket using verification with the root certs in - # trusted_root_certs - self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file, - cert_reqs=self.cert_reqs, - ca_certs=self.ca_certs, - server_hostname=self.host, - ssl_version=self.ssl_version) - - if self.ca_certs: - match_hostname(self.sock.getpeercert(), self.host) - - -## Pool objects - -class ConnectionPool(object): - """ - Base class for all connection pools, such as - :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. - """ - - scheme = None - QueueCls = LifoQueue - - def __init__(self, host, port=None): - self.host = host - self.port = port - - def __str__(self): - return '%s(host=%r, port=%r)' % (type(self).__name__, - self.host, self.port) - - -class HTTPConnectionPool(ConnectionPool, RequestMethods): - """ - Thread-safe connection pool for one host. - - :param host: - Host used for this HTTP Connection (e.g. "localhost"), passed into - :class:`httplib.HTTPConnection`. - - :param port: - Port used for this HTTP Connection (None is equivalent to 80), passed - into :class:`httplib.HTTPConnection`. - - :param strict: - Causes BadStatusLine to be raised if the status line can't be parsed - as a valid HTTP/1.0 or 1.1 status line, passed into - :class:`httplib.HTTPConnection`. - - :param timeout: - Socket timeout for each individual connection, can be a float. None - disables timeout. - - :param maxsize: - Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to false, more - connections will be created but they will not be saved once they've - been used. - - :param block: - If set to True, no more than ``maxsize`` connections will be used at - a time. When no free connections are available, the call will block - until a connection has been released. This is a useful side effect for - particular multithreaded situations where one does not want to use more - than maxsize connections per host to prevent flooding. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - scheme = 'http' - - def __init__(self, host, port=None, strict=False, timeout=None, maxsize=1, - block=False, headers=None): - ConnectionPool.__init__(self, host, port) - RequestMethods.__init__(self, headers) - - self.strict = strict - self.timeout = timeout - self.pool = self.QueueCls(maxsize) - self.block = block - - # Fill the queue up so that doing get() on it will block properly - for _ in xrange(maxsize): - self.pool.put(None) - - # These are mostly for testing and debugging purposes. - self.num_connections = 0 - self.num_requests = 0 - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPConnection`. - """ - self.num_connections += 1 - log.info("Starting new HTTP connection (%d): %s" % - (self.num_connections, self.host)) - return HTTPConnection(host=self.host, - port=self.port, - strict=self.strict) - - def _get_conn(self, timeout=None): - """ - Get a connection. Will return a pooled connection if one is available. - - If no connections are available and :prop:`.block` is ``False``, then a - fresh connection is returned. - - :param timeout: - Seconds to wait before giving up and raising - :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and - :prop:`.block` is ``True``. - """ - conn = None - try: - conn = self.pool.get(block=self.block, timeout=timeout) - - except AttributeError: # self.pool is None - raise ClosedPoolError(self, "Pool is closed.") - - except Empty: - if self.block: - raise EmptyPoolError(self, - "Pool reached maximum size and no more " - "connections are allowed.") - pass # Oh well, we'll create a new connection then - - # If this is a persistent connection, check if it got disconnected - if conn and is_connection_dropped(conn): - log.info("Resetting dropped connection: %s" % self.host) - conn.close() - - return conn or self._new_conn() - - def _put_conn(self, conn): - """ - Put a connection back into the pool. - - :param conn: - Connection object for the current host and port as returned by - :meth:`._new_conn` or :meth:`._get_conn`. - - If the pool is already full, the connection is closed and discarded - because we exceeded maxsize. If connections are discarded frequently, - then maxsize should be increased. - - If the pool is closed, then the connection will be closed and discarded. - """ - try: - self.pool.put(conn, block=False) - return # Everything is dandy, done. - except AttributeError: - # self.pool is None. - pass - except Full: - # This should never happen if self.block == True - log.warning("HttpConnectionPool is full, discarding connection: %s" - % self.host) - - # Connection never got put back into the pool, close it. - conn.close() - - def _make_request(self, conn, method, url, timeout=_Default, - **httplib_request_kw): - """ - Perform a request on a given httplib connection object taken from our - pool. - """ - self.num_requests += 1 - - if timeout is _Default: - timeout = self.timeout - - conn.timeout = timeout # This only does anything in Py26+ - conn.request(method, url, **httplib_request_kw) - - # Set timeout - sock = getattr(conn, 'sock', False) # AppEngine doesn't have sock attr. - if sock: - sock.settimeout(timeout) - - try: # Python 2.7+, use buffering of HTTP responses - httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 2.6 and older - httplib_response = conn.getresponse() - - # AppEngine doesn't have a version attr. - http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') - log.debug("\"%s %s %s\" %s %s" % (method, url, http_version, - httplib_response.status, - httplib_response.length)) - return httplib_response - - def close(self): - """ - Close all pooled connections and disable the pool. - """ - # Disable access to the pool - old_pool, self.pool = self.pool, None - - try: - while True: - conn = old_pool.get(block=False) - if conn: - conn.close() - - except Empty: - pass # Done. - - def is_same_host(self, url): - """ - Check if the given ``url`` is a member of the same host as this - connection pool. - """ - if url.startswith('/'): - return True - - # TODO: Add optional support for socket.gethostbyname checking. - scheme, host, port = get_host(url) - - if self.port and not port: - # Use explicit default port for comparison when none is given. - port = port_by_scheme.get(scheme) - - return (scheme, host, port) == (self.scheme, self.host, self.port) - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True, timeout=_Default, - pool_timeout=None, release_conn=None, **response_kw): - """ - Get a connection from the pool and perform an HTTP request. This is the - lowest level call for making a request, so you'll need to specify all - the raw details. - - .. note:: - - More commonly, it's appropriate to use a convenience method provided - by :class:`.RequestMethods`, such as :meth:`request`. - - .. note:: - - `release_conn` will only behave as expected if - `preload_content=False` because we want to make - `preload_content=False` the default behaviour someday soon without - breaking backwards compatibility. - - :param method: - HTTP request method (such as GET, POST, PUT, etc.) - - :param body: - Data to send in the request body (useful for creating - POST requests, see HTTPConnectionPool.post_url for - more convenience). - - :param headers: - Dictionary of custom headers to send, such as User-Agent, - If-None-Match, etc. If None, pool headers are used. If provided, - these headers completely replace any pool-specific headers. - - :param retries: - Number of retries to allow before raising a MaxRetryError exception. - - :param redirect: - If True, automatically handle redirects (status codes 301, 302, - 303, 307). Each redirect counts as a retry. - - :param assert_same_host: - If ``True``, will make sure that the host of the pool requests is - consistent else will raise HostChangedError. When False, you can - use the pool on an HTTP proxy and request foreign hosts. - - :param timeout: - If specified, overrides the default timeout for this one request. - - :param pool_timeout: - If set and the pool is set to block=True, then this method will - block for ``pool_timeout`` seconds and raise EmptyPoolError if no - connection is available within the time period. - - :param release_conn: - If False, then the urlopen call will not release the connection - back into the pool once a response is received (but will release if - you read the entire contents of the response such as when - `preload_content=True`). This is useful if you're not preloading - the response's content immediately. You will need to call - ``r.release_conn()`` on the response ``r`` to return the connection - back into the pool. If None, it takes the value of - ``response_kw.get('preload_content', True)``. - - :param \**response_kw: - Additional parameters are passed to - :meth:`urllib3.response.HTTPResponse.from_httplib` - """ - if headers is None: - headers = self.headers - - if retries < 0: - raise MaxRetryError(self, url) - - if timeout is _Default: - timeout = self.timeout - - if release_conn is None: - release_conn = response_kw.get('preload_content', True) - - # Check host - if assert_same_host and not self.is_same_host(url): - host = "%s://%s" % (self.scheme, self.host) - if self.port: - host = "%s:%d" % (host, self.port) - - raise HostChangedError(self, url, retries - 1) - - conn = None - - try: - # Request a connection from the queue - conn = self._get_conn(timeout=pool_timeout) - - # Make the request on the httplib connection object - httplib_response = self._make_request(conn, method, url, - timeout=timeout, - body=body, headers=headers) - - # If we're going to release the connection in ``finally:``, then - # the request doesn't need to know about the connection. Otherwise - # it will also try to release it and we'll have a double-release - # mess. - response_conn = not release_conn and conn - - # Import httplib's response into our own wrapper object - response = HTTPResponse.from_httplib(httplib_response, - pool=self, - connection=response_conn, - **response_kw) - - # else: - # The connection will be put back into the pool when - # ``response.release_conn()`` is called (implicitly by - # ``response.read()``) - - except Empty as e: - # Timed out by queue - raise TimeoutError(self, "Request timed out. (pool_timeout=%s)" % - pool_timeout) - - except SocketTimeout as e: - # Timed out by socket - raise TimeoutError(self, "Request timed out. (timeout=%s)" % - timeout) - - except BaseSSLError as e: - # SSL certificate error - raise SSLError(e) - - except CertificateError as e: - # Name mismatch - raise SSLError(e) - - except (HTTPException, SocketError) as e: - # Connection broken, discard. It will be replaced next _get_conn(). - conn = None - # This is necessary so we can access e below - err = e - - if retries == 0: - raise MaxRetryError(self, url, e) - - finally: - if release_conn: - # Put the connection back to be reused. If the connection is - # expired then it will be None, which will get replaced with a - # fresh connection during _get_conn. - self._put_conn(conn) - - if not conn: - # Try again - log.warn("Retrying (%d attempts remain) after connection " - "broken by '%r': %s" % (retries, err, url)) - return self.urlopen(method, url, body, headers, retries - 1, - redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, **response_kw) - - # Handle redirect? - redirect_location = redirect and response.get_redirect_location() - if redirect_location: - if response.status == 303: - method = 'GET' - log.info("Redirecting %s -> %s" % (url, redirect_location)) - return self.urlopen(method, redirect_location, body, headers, - retries - 1, redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, **response_kw) - - return response - - -class HTTPSConnectionPool(HTTPConnectionPool): - """ - Same as :class:`.HTTPConnectionPool`, but HTTPS. - - When Python is compiled with the :mod:`ssl` module, then - :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:`httplib.HTTPSConnection`. - - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, and ``ssl_version`` - are only used if :mod:`ssl` is available and are fed into - :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket into an SSL socket. - """ - - scheme = 'https' - - def __init__(self, host, port=None, - strict=False, timeout=None, maxsize=1, - block=False, headers=None, - key_file=None, cert_file=None, - cert_reqs='CERT_NONE', ca_certs=None, ssl_version=None): - - HTTPConnectionPool.__init__(self, host, port, - strict, timeout, maxsize, - block, headers) - self.key_file = key_file - self.cert_file = cert_file - self.cert_reqs = cert_reqs - self.ca_certs = ca_certs - self.ssl_version = ssl_version - - def _new_conn(self): - """ - Return a fresh :class:`httplib.HTTPSConnection`. - """ - self.num_connections += 1 - log.info("Starting new HTTPS connection (%d): %s" - % (self.num_connections, self.host)) - - if not ssl: # Platform-specific: Python compiled without +ssl - if not HTTPSConnection or HTTPSConnection is object: - raise SSLError("Can't connect to HTTPS URL because the SSL " - "module is not available.") - - return HTTPSConnection(host=self.host, - port=self.port, - strict=self.strict) - - connection = VerifiedHTTPSConnection(host=self.host, - port=self.port, - strict=self.strict) - connection.set_cert(key_file=self.key_file, cert_file=self.cert_file, - cert_reqs=self.cert_reqs, ca_certs=self.ca_certs) - - if self.ssl_version is None: - connection.ssl_version = ssl.PROTOCOL_SSLv23 - else: - connection.ssl_version = self.ssl_version - - return connection - - -def connection_from_url(url, **kw): - """ - Given a url, return an :class:`.ConnectionPool` instance of its host. - - This is a shortcut for not having to parse out the scheme, host, and port - of the url before creating an :class:`.ConnectionPool` instance. - - :param url: - Absolute URL string that must include the scheme. Port is optional. - - :param \**kw: - Passes additional parameters to the constructor of the appropriate - :class:`.ConnectionPool`. Useful for specifying things like - timeout, maxsize, headers, etc. - - Example: :: - - >>> conn = connection_from_url('http://google.com/') - >>> r = conn.request('GET', '/') - """ - scheme, host, port = get_host(url) - if scheme == 'https': - return HTTPSConnectionPool(host, port=port, **kw) - else: - return HTTPConnectionPool(host, port=port, **kw) diff --git a/requests/packages/urllib3/contrib/ntlmpool.py b/requests/packages/urllib3/contrib/ntlmpool.py deleted file mode 100755 index bb41fd1..0000000 --- a/requests/packages/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,120 +0,0 @@ -# urllib3/contrib/ntlmpool.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -""" -NTLM authenticating pool, contributed by erikcederstran - -Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 -""" - -try: - from http.client import HTTPSConnection -except ImportError: - from httplib import HTTPSConnection -from logging import getLogger -from ntlm import ntlm - -from urllib3 import HTTPSConnectionPool - - -log = getLogger(__name__) - - -class NTLMConnectionPool(HTTPSConnectionPool): - """ - Implements an NTLM authentication version of an urllib3 connection pool - """ - - scheme = 'https' - - def __init__(self, user, pw, authurl, *args, **kwargs): - """ - authurl is a random URL on the server that is protected by NTLM. - user is the Windows user, probably in the DOMAIN\username format. - pw is the password for the user. - """ - super(NTLMConnectionPool, self).__init__(*args, **kwargs) - self.authurl = authurl - self.rawuser = user - user_parts = user.split('\\', 1) - self.domain = user_parts[0].upper() - self.user = user_parts[1] - self.pw = pw - - def _new_conn(self): - # Performs the NTLM handshake that secures the connection. The socket - # must be kept open while requests are performed. - self.num_connections += 1 - log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s' % - (self.num_connections, self.host, self.authurl)) - - headers = {} - headers['Connection'] = 'Keep-Alive' - req_header = 'Authorization' - resp_header = 'www-authenticate' - - conn = HTTPSConnection(host=self.host, port=self.port) - - # Send negotiation message - headers[req_header] = ( - 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) - log.debug('Request headers: %s' % headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - reshdr = dict(res.getheaders()) - log.debug('Response status: %s %s' % (res.status, res.reason)) - log.debug('Response headers: %s' % reshdr) - log.debug('Response data: %s [...]' % res.read(100)) - - # Remove the reference to the socket, so that it can not be closed by - # the response object (we want to keep the socket open) - res.fp = None - - # Server should respond with a challenge message - auth_header_values = reshdr[resp_header].split(', ') - auth_header_value = None - for s in auth_header_values: - if s[:5] == 'NTLM ': - auth_header_value = s[5:] - if auth_header_value is None: - raise Exception('Unexpected %s response header: %s' % - (resp_header, reshdr[resp_header])) - - # Send authentication message - ServerChallenge, NegotiateFlags = \ - ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) - auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, - self.user, - self.domain, - self.pw, - NegotiateFlags) - headers[req_header] = 'NTLM %s' % auth_msg - log.debug('Request headers: %s' % headers) - conn.request('GET', self.authurl, None, headers) - res = conn.getresponse() - log.debug('Response status: %s %s' % (res.status, res.reason)) - log.debug('Response headers: %s' % dict(res.getheaders())) - log.debug('Response data: %s [...]' % res.read()[:100]) - if res.status != 200: - if res.status == 401: - raise Exception('Server rejected request: wrong ' - 'username or password') - raise Exception('Wrong server response: %s %s' % - (res.status, res.reason)) - - res.fp = None - log.debug('Connection established') - return conn - - def urlopen(self, method, url, body=None, headers=None, retries=3, - redirect=True, assert_same_host=True): - if headers is None: - headers = {} - headers['Connection'] = 'Keep-Alive' - return super(NTLMConnectionPool, self).urlopen(method, url, body, - headers, retries, - redirect, - assert_same_host) diff --git a/requests/packages/urllib3/exceptions.py b/requests/packages/urllib3/exceptions.py deleted file mode 100755 index c5eb962..0000000 --- a/requests/packages/urllib3/exceptions.py +++ /dev/null @@ -1,87 +0,0 @@ -# urllib3/exceptions.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - - -## Base Exceptions - -class HTTPError(Exception): - "Base exception used by this module." - pass - - -class PoolError(HTTPError): - "Base exception for errors caused within a pool." - def __init__(self, pool, message): - self.pool = pool - HTTPError.__init__(self, "%s: %s" % (pool, message)) - - def __reduce__(self): - # For pickling purposes. - return self.__class__, (None, self.url) - - -class SSLError(HTTPError): - "Raised when SSL certificate fails in an HTTPS connection." - pass - - -class DecodeError(HTTPError): - "Raised when automatic decoding based on Content-Type fails." - pass - - -## Leaf Exceptions - -class MaxRetryError(PoolError): - "Raised when the maximum number of retries is exceeded." - - def __init__(self, pool, url, reason=None): - self.reason = reason - - message = "Max retries exceeded with url: %s" % url - if reason: - message += " (Caused by %s: %s)" % (type(reason), reason) - else: - message += " (Caused by redirect)" - - PoolError.__init__(self, pool, message) - self.url = url - - -class HostChangedError(PoolError): - "Raised when an existing pool gets a request for a foreign host." - - def __init__(self, pool, url, retries=3): - message = "Tried to open a foreign host with url: %s" % url - PoolError.__init__(self, pool, message) - - self.url = url - self.retries = retries - - -class TimeoutError(PoolError): - "Raised when a socket timeout occurs." - pass - - -class EmptyPoolError(PoolError): - "Raised when a pool runs out of connections and no more are allowed." - pass - - -class ClosedPoolError(PoolError): - "Raised when a request enters a pool after the pool has been closed." - pass - - -class LocationParseError(ValueError, HTTPError): - "Raised when get_host or similar fails to parse the URL input." - - def __init__(self, location): - message = "Failed to parse: %s" % location - HTTPError.__init__(self, message) - - self.location = location diff --git a/requests/packages/urllib3/filepost.py b/requests/packages/urllib3/filepost.py deleted file mode 100755 index 8d900bd..0000000 --- a/requests/packages/urllib3/filepost.py +++ /dev/null @@ -1,98 +0,0 @@ -# urllib3/filepost.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import codecs -import mimetypes - -from uuid import uuid4 -from io import BytesIO - -from .packages import six -from .packages.six import b - -writer = codecs.lookup('utf-8')[3] - - -def choose_boundary(): - """ - Our embarassingly-simple replacement for mimetools.choose_boundary. - """ - return uuid4().hex - - -def get_content_type(filename): - return mimetypes.guess_type(filename)[0] or 'application/octet-stream' - - -def iter_fields(fields): - """ - Iterate over fields. - - Supports list of (k, v) tuples and dicts. - """ - if isinstance(fields, dict): - return ((k, v) for k, v in six.iteritems(fields)) - - return ((k, v) for k, v in fields) - - -def encode_multipart_formdata(fields, boundary=None): - """ - Encode a dictionary of ``fields`` using the multipart/form-data MIME format. - - :param fields: - Dictionary of fields or list of (key, value) or (key, value, MIME type) - field tuples. The key is treated as the field name, and the value as - the body of the form-data bytes. If the value is a tuple of two - elements, then the first element is treated as the filename of the - form-data section and a suitable MIME type is guessed based on the - filename. If the value is a tuple of three elements, then the third - element is treated as an explicit MIME type of the form-data section. - - Field names and filenames must be unicode. - - :param boundary: - If not specified, then a random boundary will be generated using - :func:`mimetools.choose_boundary`. - """ - body = BytesIO() - if boundary is None: - boundary = choose_boundary() - - for fieldname, value in iter_fields(fields): - body.write(b('--%s\r\n' % (boundary))) - - if isinstance(value, tuple): - if len(value) == 3: - filename, data, content_type = value - else: - filename, data = value - content_type = get_content_type(filename) - writer(body).write('Content-Disposition: form-data; name="%s"; ' - 'filename="%s"\r\n' % (fieldname, filename)) - body.write(b('Content-Type: %s\r\n\r\n' % - (content_type,))) - else: - data = value - writer(body).write('Content-Disposition: form-data; name="%s"\r\n' - % (fieldname)) - body.write(b'\r\n') - - if isinstance(data, int): - data = str(data) # Backwards compatibility - - if isinstance(data, six.text_type): - writer(body).write(data) - else: - body.write(data) - - body.write(b'\r\n') - - body.write(b('--%s--\r\n' % (boundary))) - - content_type = b('multipart/form-data; boundary=%s' % boundary) - - return body.getvalue(), content_type diff --git a/requests/packages/urllib3/packages/__init__.py b/requests/packages/urllib3/packages/__init__.py deleted file mode 100755 index 37e8351..0000000 --- a/requests/packages/urllib3/packages/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from __future__ import absolute_import - -from . import ssl_match_hostname - diff --git a/requests/packages/urllib3/packages/ordered_dict.py b/requests/packages/urllib3/packages/ordered_dict.py deleted file mode 100755 index 7f8ee15..0000000 --- a/requests/packages/urllib3/packages/ordered_dict.py +++ /dev/null @@ -1,260 +0,0 @@ -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. -# Copyright 2009 Raymond Hettinger, released under the MIT License. -# http://code.activestate.com/recipes/576693/ - -try: - from thread import get_ident as _get_ident -except ImportError: - from dummy_thread import get_ident as _get_ident - -try: - from _abcoll import KeysView, ValuesView, ItemsView -except ImportError: - pass - - -class OrderedDict(dict): - 'Dictionary that remembers insertion order' - # An inherited dict maps keys to values. - # The inherited dict provides __getitem__, __len__, __contains__, and get. - # The remaining methods are order-aware. - # Big-O running times for all methods are the same as for regular dictionaries. - - # The internal self.__map dictionary maps keys to links in a doubly linked list. - # The circular doubly linked list starts and ends with a sentinel element. - # The sentinel element never gets deleted (this simplifies the algorithm). - # Each link is stored as a list of length three: [PREV, NEXT, KEY]. - - def __init__(self, *args, **kwds): - '''Initialize an ordered dictionary. Signature is the same as for - regular dictionaries, but keyword arguments are not recommended - because their insertion order is arbitrary. - - ''' - if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) - try: - self.__root - except AttributeError: - self.__root = root = [] # sentinel node - root[:] = [root, root, None] - self.__map = {} - self.__update(*args, **kwds) - - def __setitem__(self, key, value, dict_setitem=dict.__setitem__): - 'od.__setitem__(i, y) <==> od[i]=y' - # Setting a new item creates a new link which goes at the end of the linked - # list, and the inherited dictionary is updated with the new key/value pair. - if key not in self: - root = self.__root - last = root[0] - last[1] = root[0] = self.__map[key] = [last, root, key] - dict_setitem(self, key, value) - - def __delitem__(self, key, dict_delitem=dict.__delitem__): - 'od.__delitem__(y) <==> del od[y]' - # Deleting an existing item uses self.__map to find the link which is - # then removed by updating the links in the predecessor and successor nodes. - dict_delitem(self, key) - link_prev, link_next, key = self.__map.pop(key) - link_prev[1] = link_next - link_next[0] = link_prev - - def __iter__(self): - 'od.__iter__() <==> iter(od)' - root = self.__root - curr = root[1] - while curr is not root: - yield curr[2] - curr = curr[1] - - def __reversed__(self): - 'od.__reversed__() <==> reversed(od)' - root = self.__root - curr = root[0] - while curr is not root: - yield curr[2] - curr = curr[0] - - def clear(self): - 'od.clear() -> None. Remove all items from od.' - try: - for node in self.__map.itervalues(): - del node[:] - root = self.__root - root[:] = [root, root, None] - self.__map.clear() - except AttributeError: - pass - dict.clear(self) - - def popitem(self, last=True): - '''od.popitem() -> (k, v), return and remove a (key, value) pair. - Pairs are returned in LIFO order if last is true or FIFO order if false. - - ''' - if not self: - raise KeyError('dictionary is empty') - root = self.__root - if last: - link = root[0] - link_prev = link[0] - link_prev[1] = root - root[0] = link_prev - else: - link = root[1] - link_next = link[1] - root[1] = link_next - link_next[0] = root - key = link[2] - del self.__map[key] - value = dict.pop(self, key) - return key, value - - # -- the following methods do not depend on the internal structure -- - - def keys(self): - 'od.keys() -> list of keys in od' - return list(self) - - def values(self): - 'od.values() -> list of values in od' - return [self[key] for key in self] - - def items(self): - 'od.items() -> list of (key, value) pairs in od' - return [(key, self[key]) for key in self] - - def iterkeys(self): - 'od.iterkeys() -> an iterator over the keys in od' - return iter(self) - - def itervalues(self): - 'od.itervalues -> an iterator over the values in od' - for k in self: - yield self[k] - - def iteritems(self): - 'od.iteritems -> an iterator over the (key, value) items in od' - for k in self: - yield (k, self[k]) - - def update(*args, **kwds): - '''od.update(E, **F) -> None. Update od from dict/iterable E and F. - - If E is a dict instance, does: for k in E: od[k] = E[k] - If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] - Or if E is an iterable of items, does: for k, v in E: od[k] = v - In either case, this is followed by: for k, v in F.items(): od[k] = v - - ''' - if len(args) > 2: - raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) - elif not args: - raise TypeError('update() takes at least 1 argument (0 given)') - self = args[0] - # Make progressively weaker assumptions about "other" - other = () - if len(args) == 2: - other = args[1] - if isinstance(other, dict): - for key in other: - self[key] = other[key] - elif hasattr(other, 'keys'): - for key in other.keys(): - self[key] = other[key] - else: - for key, value in other: - self[key] = value - for key, value in kwds.items(): - self[key] = value - - __update = update # let subclasses override update without breaking __init__ - - __marker = object() - - def pop(self, key, default=__marker): - '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. - If key is not found, d is returned if given, otherwise KeyError is raised. - - ''' - if key in self: - result = self[key] - del self[key] - return result - if default is self.__marker: - raise KeyError(key) - return default - - def setdefault(self, key, default=None): - 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' - if key in self: - return self[key] - self[key] = default - return default - - def __repr__(self, _repr_running={}): - 'od.__repr__() <==> repr(od)' - call_key = id(self), _get_ident() - if call_key in _repr_running: - return '...' - _repr_running[call_key] = 1 - try: - if not self: - return '%s()' % (self.__class__.__name__,) - return '%s(%r)' % (self.__class__.__name__, self.items()) - finally: - del _repr_running[call_key] - - def __reduce__(self): - 'Return state information for pickling' - items = [[k, self[k]] for k in self] - inst_dict = vars(self).copy() - for k in vars(OrderedDict()): - inst_dict.pop(k, None) - if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) - - def copy(self): - 'od.copy() -> a shallow copy of od' - return self.__class__(self) - - @classmethod - def fromkeys(cls, iterable, value=None): - '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S - and values equal to v (which defaults to None). - - ''' - d = cls() - for key in iterable: - d[key] = value - return d - - def __eq__(self, other): - '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive - while comparison to a regular mapping is order-insensitive. - - ''' - if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() - return dict.__eq__(self, other) - - def __ne__(self, other): - return not self == other - - # -- the following methods are only used in Python 2.7 -- - - def viewkeys(self): - "od.viewkeys() -> a set-like object providing a view on od's keys" - return KeysView(self) - - def viewvalues(self): - "od.viewvalues() -> an object providing a view on od's values" - return ValuesView(self) - - def viewitems(self): - "od.viewitems() -> a set-like object providing a view on od's items" - return ItemsView(self) diff --git a/requests/packages/urllib3/packages/six.py b/requests/packages/urllib3/packages/six.py deleted file mode 100755 index 27d8011..0000000 --- a/requests/packages/urllib3/packages/six.py +++ /dev/null @@ -1,385 +0,0 @@ -"""Utilities for writing code that runs on Python 2 and 3""" - -#Copyright (c) 2010-2011 Benjamin Peterson - -#Permission is hereby granted, free of charge, to any person obtaining a copy of -#this software and associated documentation files (the "Software"), to deal in -#the Software without restriction, including without limitation the rights to -#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -#the Software, and to permit persons to whom the Software is furnished to do so, -#subject to the following conditions: - -#The above copyright notice and this permission notice shall be included in all -#copies or substantial portions of the Software. - -#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import operator -import sys -import types - -__author__ = "Benjamin Peterson " -__version__ = "1.2.0" # Revision 41c74fef2ded - - -# True if we are running on Python 3. -PY3 = sys.version_info[0] == 3 - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) - # This is a bit ugly, but it avoids running this again. - delattr(tp, self.name) - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - - -class _MovedItems(types.ModuleType): - """Lazy loading of moved objects""" - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("reload_module", "__builtin__", "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("copyreg", "copy_reg"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("winreg", "_winreg"), -] -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) -del attr - -moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_code = "__code__" - _func_defaults = "__defaults__" - - _iterkeys = "keys" - _itervalues = "values" - _iteritems = "items" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_code = "func_code" - _func_defaults = "func_defaults" - - _iterkeys = "iterkeys" - _itervalues = "itervalues" - _iteritems = "iteritems" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -if PY3: - def get_unbound_function(unbound): - return unbound - - Iterator = object - - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) -else: - def get_unbound_function(unbound): - return unbound.im_func - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) - - -def iterkeys(d): - """Return an iterator over the keys of a dictionary.""" - return iter(getattr(d, _iterkeys)()) - -def itervalues(d): - """Return an iterator over the values of a dictionary.""" - return iter(getattr(d, _itervalues)()) - -def iteritems(d): - """Return an iterator over the (key, value) pairs of a dictionary.""" - return iter(getattr(d, _iteritems)()) - - -if PY3: - def b(s): - return s.encode("latin-1") - def u(s): - return s - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") - import io - StringIO = io.StringIO - BytesIO = io.BytesIO -else: - def b(s): - return s - def u(s): - return unicode(s, "unicode_escape") - int2byte = chr - import StringIO - StringIO = BytesIO = StringIO.StringIO -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -if PY3: - import builtins - exec_ = getattr(builtins, "exec") - - - def reraise(tp, value, tb=None): - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - - - print_ = getattr(builtins, "print") - del builtins - -else: - def exec_(code, globs=None, locs=None): - """Execute code in a namespace.""" - if globs is None: - frame = sys._getframe(1) - globs = frame.f_globals - if locs is None: - locs = frame.f_locals - del frame - elif locs is None: - locs = globs - exec("""exec code in globs, locs""") - - - exec_("""def reraise(tp, value, tb=None): - raise tp, value, tb -""") - - - def print_(*args, **kwargs): - """The new-style print function.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - def write(data): - if not isinstance(data, basestring): - data = str(data) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) - -_add_doc(reraise, """Reraise an exception.""") - - -def with_metaclass(meta, base=object): - """Create a base class with a metaclass.""" - return meta("NewBase", (base,), {}) diff --git a/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100755 index 9560b04..0000000 --- a/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -"""The match_hostname() function from Python 3.2, essential when using SSL.""" - -import re - -__version__ = '3.2.2' - -class CertificateError(ValueError): - pass - -def _dnsname_to_pat(dn): - pats = [] - for frag in dn.split(r'.'): - if frag == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - else: - # Otherwise, '*' matches any dotless fragment. - frag = re.escape(frag) - pats.append(frag.replace(r'\*', '[^.]*')) - return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - -def match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules - are mostly followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_to_pat(value).match(hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_to_pat(value).match(hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") diff --git a/requests/packages/urllib3/poolmanager.py b/requests/packages/urllib3/poolmanager.py deleted file mode 100755 index a124202..0000000 --- a/requests/packages/urllib3/poolmanager.py +++ /dev/null @@ -1,163 +0,0 @@ -# urllib3/poolmanager.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import logging - -from ._collections import RecentlyUsedContainer -from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool -from .connectionpool import connection_from_url, port_by_scheme -from .request import RequestMethods -from .util import parse_url - - -__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] - - -pool_classes_by_scheme = { - 'http': HTTPConnectionPool, - 'https': HTTPSConnectionPool, -} - -log = logging.getLogger(__name__) - - -class PoolManager(RequestMethods): - """ - Allows for arbitrary requests while transparently keeping track of - necessary connection pools for you. - - :param num_pools: - Number of connection pools to cache before discarding the least - recently used pool. - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - - :param \**connection_pool_kw: - Additional parameters are used to create fresh - :class:`urllib3.connectionpool.ConnectionPool` instances. - - Example: :: - - >>> manager = PoolManager(num_pools=2) - >>> r = manager.request('GET', 'http://google.com/') - >>> r = manager.request('GET', 'http://google.com/mail') - >>> r = manager.request('GET', 'http://yahoo.com/') - >>> len(manager.pools) - 2 - - """ - - def __init__(self, num_pools=10, headers=None, **connection_pool_kw): - RequestMethods.__init__(self, headers) - self.connection_pool_kw = connection_pool_kw - self.pools = RecentlyUsedContainer(num_pools, - dispose_func=lambda p: p.close()) - - def clear(self): - """ - Empty our store of pools and direct them all to close. - - This will not affect in-flight connections, but they will not be - re-used after completion. - """ - self.pools.clear() - - def connection_from_host(self, host, port=None, scheme='http'): - """ - Get a :class:`ConnectionPool` based on the host, port, and scheme. - - If ``port`` isn't given, it will be derived from the ``scheme`` using - ``urllib3.connectionpool.port_by_scheme``. - """ - port = port or port_by_scheme.get(scheme, 80) - - pool_key = (scheme, host, port) - - # If the scheme, host, or port doesn't match existing open connections, - # open a new ConnectionPool. - pool = self.pools.get(pool_key) - if pool: - return pool - - # Make a fresh ConnectionPool of the desired type - pool_cls = pool_classes_by_scheme[scheme] - pool = pool_cls(host, port, **self.connection_pool_kw) - - self.pools[pool_key] = pool - - return pool - - def connection_from_url(self, url): - """ - Similar to :func:`urllib3.connectionpool.connection_from_url` but - doesn't pass any additional parameters to the - :class:`urllib3.connectionpool.ConnectionPool` constructor. - - Additional parameters are taken from the :class:`.PoolManager` - constructor. - """ - u = parse_url(url) - return self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - def urlopen(self, method, url, redirect=True, **kw): - """ - Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` - with custom cross-host redirect logic and only sends the request-uri - portion of the ``url``. - - The given ``url`` parameter must be absolute, such that an appropriate - :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. - """ - u = parse_url(url) - conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) - - kw['assert_same_host'] = False - kw['redirect'] = False - if 'headers' not in kw: - kw['headers'] = self.headers - - response = conn.urlopen(method, u.request_uri, **kw) - - redirect_location = redirect and response.get_redirect_location() - if not redirect_location: - return response - - if response.status == 303: - method = 'GET' - - log.info("Redirecting %s -> %s" % (url, redirect_location)) - kw['retries'] = kw.get('retries', 3) - 1 # Persist retries countdown - return self.urlopen(method, redirect_location, **kw) - - -class ProxyManager(RequestMethods): - """ - Given a ConnectionPool to a proxy, the ProxyManager's ``urlopen`` method - will make requests to any url through the defined proxy. - """ - - def __init__(self, proxy_pool): - self.proxy_pool = proxy_pool - - def _set_proxy_headers(self, headers=None): - headers_ = {'Accept': '*/*'} - if headers: - headers_.update(headers) - - return headers_ - - def urlopen(self, method, url, **kw): - "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." - kw['assert_same_host'] = False - kw['headers'] = self._set_proxy_headers(kw.get('headers')) - return self.proxy_pool.urlopen(method, url, **kw) - - -def proxy_from_url(url, **pool_kw): - proxy_pool = connection_from_url(url, **pool_kw) - return ProxyManager(proxy_pool) diff --git a/requests/packages/urllib3/request.py b/requests/packages/urllib3/request.py deleted file mode 100755 index 2b4704e..0000000 --- a/requests/packages/urllib3/request.py +++ /dev/null @@ -1,142 +0,0 @@ -# urllib3/request.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -try: - from urllib.parse import urlencode -except ImportError: - from urllib import urlencode - -from .filepost import encode_multipart_formdata - - -__all__ = ['RequestMethods'] - - -class RequestMethods(object): - """ - Convenience mixin for classes who implement a :meth:`urlopen` method, such - as :class:`~urllib3.connectionpool.HTTPConnectionPool` and - :class:`~urllib3.poolmanager.PoolManager`. - - Provides behavior for making common types of HTTP request methods and - decides which type of request field encoding to use. - - Specifically, - - :meth:`.request_encode_url` is for sending requests whose fields are encoded - in the URL (such as GET, HEAD, DELETE). - - :meth:`.request_encode_body` is for sending requests whose fields are - encoded in the *body* of the request using multipart or www-orm-urlencoded - (such as for POST, PUT, PATCH). - - :meth:`.request` is for making any kind of request, it will look up the - appropriate encoding format and use one of the above two methods to make - the request. - - Initializer parameters: - - :param headers: - Headers to include with all requests, unless other headers are given - explicitly. - """ - - _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) - _encode_body_methods = set(['PATCH', 'POST', 'PUT', 'TRACE']) - - def __init__(self, headers=None): - self.headers = headers or {} - - def urlopen(self, method, url, body=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **kw): # Abstract - raise NotImplemented("Classes extending RequestMethods must implement " - "their own ``urlopen`` method.") - - def request(self, method, url, fields=None, headers=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the appropriate encoding of - ``fields`` based on the ``method`` used. - - This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the option - to drop down to more specific methods when necessary, such as - :meth:`request_encode_url`, :meth:`request_encode_body`, - or even the lowest level :meth:`urlopen`. - """ - method = method.upper() - - if method in self._encode_url_methods: - return self.request_encode_url(method, url, fields=fields, - headers=headers, - **urlopen_kw) - else: - return self.request_encode_body(method, url, fields=fields, - headers=headers, - **urlopen_kw) - - def request_encode_url(self, method, url, fields=None, **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the url. This is useful for request methods like GET, HEAD, DELETE, etc. - """ - if fields: - url += '?' + urlencode(fields) - return self.urlopen(method, url, **urlopen_kw) - - def request_encode_body(self, method, url, fields=None, headers=None, - encode_multipart=True, multipart_boundary=None, - **urlopen_kw): - """ - Make a request using :meth:`urlopen` with the ``fields`` encoded in - the body. This is useful for request methods like POST, PUT, PATCH, etc. - - When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode the - payload with the appropriate content type. Otherwise - :meth:`urllib.urlencode` is used with the - 'application/x-www-form-urlencoded' content type. - - Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request signing, - such as with OAuth. - - Supports an optional ``fields`` parameter of key/value strings AND - key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example: :: - - fields = { - 'foo': 'bar', - 'fakefile': ('foofile.txt', 'contents of foofile'), - 'realfile': ('barfile.txt', open('realfile').read()), - 'typedfile': ('bazfile.bin', open('bazfile').read(), - 'image/jpeg'), - 'nonamefile': 'contents of nonamefile field', - } - - When uploading a file, providing a filename (the first parameter of the - tuple) is optional but recommended to best mimick behavior of browsers. - - Note that if ``headers`` are supplied, the 'Content-Type' header will be - overwritten because it depends on the dynamic random boundary string - which is used to compose the body of the request. The random boundary - string can be explicitly set with the ``multipart_boundary`` parameter. - """ - if encode_multipart: - body, content_type = encode_multipart_formdata(fields or {}, - boundary=multipart_boundary) - else: - body, content_type = (urlencode(fields or {}), - 'application/x-www-form-urlencoded') - - if headers is None: - headers = self.headers - - headers_ = {'Content-Type': content_type} - headers_.update(headers) - - return self.urlopen(method, url, body=body, headers=headers_, - **urlopen_kw) diff --git a/requests/packages/urllib3/response.py b/requests/packages/urllib3/response.py deleted file mode 100755 index 833be62..0000000 --- a/requests/packages/urllib3/response.py +++ /dev/null @@ -1,204 +0,0 @@ -# urllib3/response.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -import gzip -import logging -import zlib - -from io import BytesIO - -from .exceptions import DecodeError -from .packages.six import string_types as basestring - - -log = logging.getLogger(__name__) - - -def decode_gzip(data): - gzipper = gzip.GzipFile(fileobj=BytesIO(data)) - return gzipper.read() - - -def decode_deflate(data): - try: - return zlib.decompress(data) - except zlib.error: - return zlib.decompress(data, -zlib.MAX_WBITS) - - -class HTTPResponse(object): - """ - HTTP Response container. - - Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. - - Extra parameters for behaviour not present in httplib.HTTPResponse: - - :param preload_content: - If True, the response's body will be preloaded during construction. - - :param decode_content: - If True, attempts to decode specific content-encoding's based on headers - (like 'gzip' and 'deflate') will be skipped and raw data will be used - instead. - - :param original_response: - When this HTTPResponse wrapper is generated from an httplib.HTTPResponse - object, it's convenient to include the original for debug purposes. It's - otherwise unused. - """ - - CONTENT_DECODERS = { - 'gzip': decode_gzip, - 'deflate': decode_deflate, - } - - def __init__(self, body='', headers=None, status=0, version=0, reason=None, - strict=0, preload_content=True, decode_content=True, - original_response=None, pool=None, connection=None): - self.headers = headers or {} - self.status = status - self.version = version - self.reason = reason - self.strict = strict - - self._decode_content = decode_content - self._body = body if body and isinstance(body, basestring) else None - self._fp = None - self._original_response = original_response - - self._pool = pool - self._connection = connection - - if hasattr(body, 'read'): - self._fp = body - - if preload_content and not self._body: - self._body = self.read(decode_content=decode_content) - - def get_redirect_location(self): - """ - Should we redirect and where to? - - :returns: Truthy redirect location string if we got a redirect status - code and valid location. ``None`` if redirect status and no - location. ``False`` if not a redirect status code. - """ - if self.status in [301, 302, 303, 307]: - return self.headers.get('location') - - return False - - def release_conn(self): - if not self._pool or not self._connection: - return - - self._pool._put_conn(self._connection) - self._connection = None - - @property - def data(self): - # For backwords-compat with earlier urllib3 0.4 and earlier. - if self._body: - return self._body - - if self._fp: - return self.read(cache_content=True) - - def read(self, amt=None, decode_content=None, cache_content=False): - """ - Similar to :meth:`httplib.HTTPResponse.read`, but with two additional - parameters: ``decode_content`` and ``cache_content``. - - :param amt: - How much of the content to read. If specified, decoding and caching - is skipped because we can't decode partial content nor does it make - sense to cache partial content as the full response. - - :param decode_content: - If True, will attempt to decode the body based on the - 'content-encoding' header. (Overridden if ``amt`` is set.) - - :param cache_content: - If True, will save the returned data such that the same result is - returned despite of the state of the underlying file object. This - is useful if you want the ``.data`` property to continue working - after having ``.read()`` the file object. (Overridden if ``amt`` is - set.) - """ - # Note: content-encoding value should be case-insensitive, per RFC 2616 - # Section 3.5 - content_encoding = self.headers.get('content-encoding', '').lower() - decoder = self.CONTENT_DECODERS.get(content_encoding) - if decode_content is None: - decode_content = self._decode_content - - if self._fp is None: - return - - try: - if amt is None: - # cStringIO doesn't like amt=None - data = self._fp.read() - else: - return self._fp.read(amt) - - try: - if decode_content and decoder: - data = decoder(data) - except (IOError, zlib.error): - raise DecodeError("Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding) - - if cache_content: - self._body = data - - return data - - finally: - if self._original_response and self._original_response.isclosed(): - self.release_conn() - - @classmethod - def from_httplib(ResponseCls, r, **response_kw): - """ - Given an :class:`httplib.HTTPResponse` instance ``r``, return a - corresponding :class:`urllib3.response.HTTPResponse` object. - - Remaining parameters are passed to the HTTPResponse constructor, along - with ``original_response=r``. - """ - - # Normalize headers between different versions of Python - headers = {} - for k, v in r.getheaders(): - # Python 3: Header keys are returned capitalised - k = k.lower() - - has_value = headers.get(k) - if has_value: # Python 3: Repeating header keys are unmerged. - v = ', '.join([has_value, v]) - - headers[k] = v - - # HTTPResponse objects in Python 3 don't have a .strict attribute - strict = getattr(r, 'strict', 0) - return ResponseCls(body=r, - headers=headers, - status=r.status, - version=r.version, - reason=r.reason, - strict=strict, - original_response=r, - **response_kw) - - # Backwards-compatibility methods for httplib.HTTPResponse - def getheaders(self): - return self.headers - - def getheader(self, name, default=None): - return self.headers.get(name, default) diff --git a/requests/packages/urllib3/util.py b/requests/packages/urllib3/util.py deleted file mode 100755 index 8d8654f..0000000 --- a/requests/packages/urllib3/util.py +++ /dev/null @@ -1,298 +0,0 @@ -# urllib3/util.py -# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - - -from base64 import b64encode -from collections import namedtuple -from socket import error as SocketError - -try: - from select import poll, POLLIN -except ImportError: # `poll` doesn't exist on OSX and other platforms - poll = False - try: - from select import select - except ImportError: # `select` doesn't exist on AppEngine. - select = False - -try: # Test for SSL features - SSLContext = None - HAS_SNI = False - - from ssl import wrap_socket, CERT_NONE, SSLError, PROTOCOL_SSLv23 - from ssl import SSLContext # Modern SSL? - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - - -from .packages import six -from .exceptions import LocationParseError - - -class Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'])): - """ - Datastructure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. - """ - slots = () - - def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None): - return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or '/' - - if self.query is not None: - uri += '?' + self.query - - return uri - - -def split_first(s, delims): - """ - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example: :: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, '', None - - return s[:min_idx], s[min_idx+1:], min_delim - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - - Partly backwards-compatible with :mod:`urlparse`. - - Example: :: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - - # While this code has overlap with stdlib's urlparse, it is much - # simplified for our needs and less annoying. - # Additionally, this imeplementations does silly things to be optimal - # on CPython. - - scheme = None - auth = None - host = None - port = None - path = None - fragment = None - query = None - - # Scheme - if '://' in url: - scheme, url = url.split('://', 1) - - # Find the earliest Authority Terminator - # (http://tools.ietf.org/html/rfc3986#section-3.2) - url, path_, delim = split_first(url, ['/', '?', '#']) - - if delim: - # Reassemble the path - path = delim + path_ - - # Auth - if '@' in url: - auth, url = url.split('@', 1) - - # IPv6 - if url and url[0] == '[': - host, url = url[1:].split(']', 1) - - # Port - if ':' in url: - _host, port = url.split(':', 1) - - if not host: - host = _host - - if not port.isdigit(): - raise LocationParseError("Failed to parse: %s" % url) - - port = int(port) - - elif not host and url: - host = url - - if not path: - return Url(scheme, auth, host, port, path, query, fragment) - - # Fragment - if '#' in path: - path, fragment = path.split('#', 1) - - # Query - if '?' in path: - path, query = path.split('?', 1) - - return Url(scheme, auth, host, port, path, query, fragment) - - -def get_host(url): - """ - Deprecated. Use :func:`.parse_url` instead. - """ - p = parse_url(url) - return p.scheme or 'http', p.hostname, p.port - - -def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - Example: :: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ','.join(accept_encoding) - else: - accept_encoding = 'gzip,deflate' - headers['accept-encoding'] = accept_encoding - - if user_agent: - headers['user-agent'] = user_agent - - if keep_alive: - headers['connection'] = 'keep-alive' - - if basic_auth: - headers['authorization'] = 'Basic ' + \ - b64encode(six.b(basic_auth)).decode('utf-8') - - return headers - - -def is_connection_dropped(conn): - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`httplib.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, 'sock', False) - if not sock: # Platform-specific: AppEngine - return False - - if not poll: # Platform-specific - if not select: # Platform-specific: AppEngine - return False - - try: - return select([sock], [], [], 0.0)[0] - except SocketError: - return True - - # This version is better on platforms that support it. - p = poll() - p.register(sock, POLLIN) - for (fno, ev) in p.poll(0.0): - if fno == sock.fileno(): - # Either data is buffered (bad), or the connection is dropped. - return True - - -if SSLContext is not None: # Python 3.2+ - def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=CERT_NONE, - ca_certs=None, server_hostname=None, - ssl_version=PROTOCOL_SSLv23): - """ - All arguments except `server_hostname` have the same meaning as for - :func:`ssl.wrap_socket` - - :param server_hostname: - Hostname of the expected certificate - """ - context = SSLContext(ssl_version) - context.verify_mode = cert_reqs - if ca_certs: - try: - context.load_verify_locations(ca_certs) - except TypeError as e: # Reraise as SSLError - # FIXME: This block needs a test. - raise SSLError(e) - if certfile: - # FIXME: This block needs a test. - context.load_cert_chain(certfile, keyfile) - if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI - return context.wrap_socket(sock, server_hostname=server_hostname) - return context.wrap_socket(sock) - -else: # Python 3.1 and earlier - def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=CERT_NONE, - ca_certs=None, server_hostname=None, - ssl_version=PROTOCOL_SSLv23): - return wrap_socket(sock, keyfile=keyfile, certfile=certfile, - ca_certs=ca_certs, cert_reqs=cert_reqs, - ssl_version=ssl_version) diff --git a/requests/sessions.py b/requests/sessions.py old mode 100644 new mode 100755 index 48ea204..0bfd07a --- a/requests/sessions.py +++ b/requests/sessions.py @@ -1,397 +1,901 @@ -# -*- coding: utf-8 -*- - -""" -requests.session -~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). - -""" -import os - -from .compat import cookielib -from .cookies import cookiejar_from_dict -from .models import Request -from .hooks import dispatch_hook, default_hooks -from .utils import from_key_val_list, default_headers -from .exceptions import TooManyRedirects, InvalidSchema - -from .compat import urlparse, urljoin -from .adapters import HTTPAdapter - -from .utils import requote_uri, get_environ_proxies, get_netrc_auth - -from .status_codes import codes -REDIRECT_STATI = (codes.moved, codes.found, codes.other, codes.temporary_moved) -DEFAULT_REDIRECT_LIMIT = 30 - - -def merge_kwargs(local_kwarg, default_kwarg): - """Merges kwarg dictionaries. - - If a local key in the dictionary is set to None, it will be removed. - """ - - if default_kwarg is None: - return local_kwarg - - if isinstance(local_kwarg, str): - return local_kwarg - - if local_kwarg is None: - return default_kwarg - - # Bypass if not a dictionary (e.g. timeout) - if not hasattr(default_kwarg, 'items'): - return local_kwarg - - default_kwarg = from_key_val_list(default_kwarg) - local_kwarg = from_key_val_list(local_kwarg) - - # Update new values. - kwargs = default_kwarg.copy() - kwargs.update(local_kwarg) - - # Remove keys that are set to None. - for (k, v) in local_kwarg.items(): - if v is None: - del kwargs[k] - - return kwargs - - -class SessionRedirectMixin(object): - - def resolve_redirects(self, resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None): - """Receives a Response. Returns a generator of Responses.""" - - i = 0 - - # ((resp.status_code is codes.see_other)) - while (('location' in resp.headers and resp.status_code in REDIRECT_STATI)): - - resp.content # Consume socket so it can be released - - if i >= self.max_redirects: - raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects) - - # Release the connection back into the pool. - resp.close() - - url = resp.headers['location'] - method = req.method - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith('//'): - parsed_rurl = urlparse(resp.url) - url = '%s:%s' % (parsed_rurl.scheme, url) - - # Facilitate non-RFC2616-compliant 'location' headers - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - if not urlparse(url).netloc: - # Compliant with RFC3986, we percent encode the url. - url = urljoin(resp.url, requote_uri(url)) - - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 - if resp.status_code is codes.see_other and req.method != 'HEAD': - method = 'GET' - - # Do what the browsers do, despite standards... - if resp.status_code in (codes.moved, codes.found) and req.method == 'POST': - method = 'GET' - - # Remove the cookie headers that were sent. - headers = req.headers - try: - del headers['Cookie'] - except KeyError: - pass - - resp = self.request( - url=url, - method=method, - headers=headers, - params=req.params, - auth=req.auth, - cookies=req.cookies, - allow_redirects=False, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies - ) - - i += 1 - yield resp - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistience, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('http://httpbin.org/get') - 200 - """ - - def __init__(self): - - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request ` sent from this - #: :class:`Session `. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request `. - self.auth = None - - #: Dictionary mapping protocol to the URL of the proxy (e.g. - #: {'http': 'foo.bar:3128'}) to be used on each - #: :class:`Request `. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request `. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - self.verify = True - - #: SSL certificate default. - self.cert = None - - #: Maximum number of redirects to follow. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Should we trust the environment? - self.trust_env = True - - # Set up a CookieJar to be used by default - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = {} - self.mount('http://', HTTPAdapter()) - self.mount('https://', HTTPAdapter()) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def request(self, method, url, - params=None, - data=None, - headers=None, - cookies=None, - files=None, - auth=None, - timeout=None, - allow_redirects=True, - proxies=None, - hooks=None, - stream=None, - verify=None, - cert=None): - - cookies = cookies or {} - proxies = proxies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Bubble down session cookies. - for cookie in self.cookies: - cookies.set_cookie(cookie) - - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - env_proxies = get_environ_proxies(url) or {} - for (k, v) in env_proxies.items(): - proxies.setdefault(k, v) - - # Set environment's basic authentication. - if not auth: - auth = get_netrc_auth(url) - - # Look for configuration. - if not verify and verify is not False: - verify = os.environ.get('REQUESTS_CA_BUNDLE') - - # Curl compatibility. - if not verify and verify is not False: - verify = os.environ.get('CURL_CA_BUNDLE') - - - # Merge all the kwargs. - params = merge_kwargs(params, self.params) - headers = merge_kwargs(headers, self.headers) - auth = merge_kwargs(auth, self.auth) - proxies = merge_kwargs(proxies, self.proxies) - hooks = merge_kwargs(hooks, self.hooks) - stream = merge_kwargs(stream, self.stream) - verify = merge_kwargs(verify, self.verify) - cert = merge_kwargs(cert, self.cert) - - - # Create the Request. - req = Request() - req.method = method.upper() - req.url = url - req.headers = headers - req.files = files - req.data = data - req.params = params - req.auth = auth - req.cookies = cookies - req.hooks = hooks - - # Prepare the Request. - prep = req.prepare() - - # Send the request. - resp = self.send(prep, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) - - # Persist cookies. - for cookie in resp.cookies: - self.cookies.set_cookie(cookie) - - # Redirect resolving generator. - gen = self.resolve_redirects(resp, req, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) - - # Resolve redirects if allowed. - history = [r for r in gen] if allow_redirects else [] - - # Shuffle things around if there's history. - if history: - history.insert(0, resp) - resp = history.pop() - resp.history = tuple(history) - - # Response manipulation hook. - self.response = dispatch_hook('response', hooks, resp) - - return resp - - def get(self, url, **kwargs): - """Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('GET', url, **kwargs) - - def options(self, url, **kwargs): - """Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', True) - return self.request('OPTIONS', url, **kwargs) - - def head(self, url, **kwargs): - """Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - kwargs.setdefault('allow_redirects', False) - return self.request('HEAD', url, **kwargs) - - def post(self, url, data=None, **kwargs): - """Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('POST', url, data=data, **kwargs) - - def put(self, url, data=None, **kwargs): - """Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('PUT', url, data=data, **kwargs) - - def patch(self, url, data=None, **kwargs): - """Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('PATCH', url, data=data, **kwargs) - - def delete(self, url, **kwargs): - """Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - """ - - return self.request('DELETE', url, **kwargs) - - def send(self, request, **kwargs): - """Send a given PreparedRequest.""" - adapter = self.get_adapter(url=request.url) - r = adapter.send(request, **kwargs) - return r - - def get_adapter(self, url): - """Returns the appropriate connnection adapter for the given URL.""" - for (prefix, adapter) in self.adapters.items(): - - if url.startswith(prefix): - return adapter - - # Nothing matches :-/ - raise InvalidSchema("No connection adapters were found for '%s'" % url) - - def close(self): - """Closes all adapters and as such the session""" - for _, v in self.adapters.items(): - v.close() - - def mount(self, prefix, adapter): - """Registers a connection adapter to a prefix.""" - self.adapters[prefix] = adapter - - def __getstate__(self): - return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - -def session(): - """Returns a :class:`Session` for context-management.""" - - return Session() \ No newline at end of file +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import platform +import time +from collections import Mapping +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if platform.system() == 'Windows': + try: # Python 3.3+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """ + .. Receives a Response. Returns a redirect URI or ``None`` + + レスポンスを受け取って、リダイレクト URI か ``None`` を返却します。 + """ + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """ + .. Receives a Response. Returns a generator of Responses or Requests. + + レスポンスを受け取ります。レスポンスかリクエストのジェネレータを返却します。 + """ + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) + + # The scheme should be lower case... + parsed = urlparse(url) + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/requests/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/requests/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """ + .. When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + + リダイレクトされた際、リクエストから認証情報を削除して認証情報を漏れないようにすることができます。 + このメソッドは、認証情報を可能な限り失わないようして削除しつつ、認証情報を再適用することができます。 + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers: + # If we get redirected to a new host, we should strip out any + # authentication headers. + original_parsed = urlparse(response.request.url) + redirect_parsed = urlparse(url) + + if (original_parsed.hostname != redirect_parsed.hostname): + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """ + .. This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + このメソッドは環境変数を考慮して、プロキシの設定を再評価します。 + NO_PROXY でカバーしている URL にリダイレクトした場合、プロキシの設定を削除します。 + それ以外の場合、この URL にプロキシのキーがないことを設定します。(以前のリダイレクトによって削除された場合) + + .. This method also replaces the Proxy-Authorization header where + necessary. + + このメソッドは必要に応じて、Proxy-Authorization ヘッダーも置換します。 + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') + + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """ + .. When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + + リダイレクトされた際、特定の仕様やブラウザの挙動によって、リクエストのメソッドを変更することができます。 + """ + method = prepared_request.method + + # http://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """ + .. A Requests session. + + Requests のセッション。 + + .. Provides cookie persistence, connection-pooling, and configuration. + + Cookieの永続化、コネクションプール、コンフィグの機能を提供します。 + + .. Basic Usage:: + + 基本的な使い方:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('http://httpbin.org/get') + + + .. Or as a context manager:: + + もしくは、コンテキストマネージャーとしても使えます。:: + + >>> with requests.Session() as s: + >>> s.get('http://httpbin.org/get') + + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: .. A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + #: + #: この :class:`Session ` から送信された各 :class:`Request ` で + #: 送信するための大文字・小文字を区別しないヘッダーのディクショナリ。 + self.headers = default_headers() + + #: .. Default Authentication tuple or object to attach to + #: :class:`Request `. + #: + #: :class:`Request ` に付与するデフォルトの認証情報のタプル、 + #: もしくはオブジェクト。 + self.auth = None + + #: .. Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request `. + #: + #: プロキシの URL に各 :class:`Request ` で使うために必要なプロトコル、 + #: もしくはプロトコルとホストをマッピングするためのディクショナリ。 + #: (例: {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) + self.proxies = {} + + #: .. Event-handling hooks. + #: + #: イベント処理をするためのフック。 + self.hooks = default_hooks() + + #: .. Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + #: + #: 各 :class:`Request ` に付与するクエリ文字列のディクショナリ。 + #: ディクショナリの値は、クエリパラメータに対応するリスト形式にしてもいい。 + self.params = {} + + #: .. Stream response content default. + #: + #: ストリームのレスポンスの内容。 + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: .. SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + #: + #: SSL クライアントの証明書でデフォルトの挙動として、文字列の場合は証明書ファイル(.pem)へのパスで、 + #: タプルの場合は('cert', 'key')のペアとなります。 + self.cert = None + + #: .. Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + #: + #: 許可するリダイレクトの最大回数。リクエストがこのリミットを超えると、 + #: :class:`TooManyRedirects` の例外が送出されます。 + #: これはデフォルトでは、requests.models.DEFAULT_REDIRECT_LIMIT の値となり、 + #: 値は 30 です。 + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: .. Trust environment settings for proxy configuration, default + #: authentication and similar. + #: + #: プロキシ設定、デフォルトの認証等の信頼できる環境変数。 + self.trust_env = True + + #: .. A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar `, but + #: may be any other ``cookielib.CookieJar`` compatible object. + #: + #: CookieJar は、現在のセッションで設定されている全ての未処理の Cookie を含んでいます。 + #: デフォルトでは、:class:`RequestsCookieJar ` ですが、 + #: 他の ``cookielib.CookieJar`` と互換性のあるオブジェクトでも問題ありません。 + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """ + .. Constructs a :class:`PreparedRequest ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request ` instance and those of the + :class:`Session`. + + 送信のための :class:`PreparedRequest ` を生成し、返却します。 + :class:`PreparedRequest` は、:class:`Request ` インスタンスと + :class:`Session` の設定がマージされます。 + + .. :param request: :class:`Request` instance to prepare with this + .. session's settings. + .. :rtype: requests.PreparedRequest + + :param request: このセッションの設定で準備する :class:`Request` のインスタンス。 + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): + """ + .. Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :class:`Request ` を生成し、送信するための準備をします。 + :class:`Response ` オブジェクトを返却します。 + + .. :param method: method for the new :class:`Request` object. + .. :param url: URL for the new :class:`Request` object. + .. :param params: (optional) Dictionary or bytes to be sent in the query + .. string for the :class:`Request`. + .. :param data: (optional) Dictionary, bytes, or file-like object to send + .. in the body of the :class:`Request`. + .. :param json: (optional) json to send in the body of the + .. :class:`Request`. + .. :param headers: (optional) Dictionary of HTTP Headers to send with the + .. :class:`Request`. + .. :param cookies: (optional) Dict or CookieJar object to send with the + .. :class:`Request`. + .. :param files: (optional) Dictionary of ``'filename': file-like-objects`` + .. for multipart encoding upload. + .. :param auth: (optional) Auth tuple or callable to enable + .. Basic/Digest/Custom HTTP Auth. + .. :param timeout: (optional) How long to wait for the server to send + .. data before giving up, as a float, or a :ref:`(connect timeout, + .. read timeout) ` tuple. + .. :type timeout: float or tuple + .. :param allow_redirects: (optional) Set to True by default. + .. :type allow_redirects: bool + .. :param proxies: (optional) Dictionary mapping protocol or protocol and + .. hostname to the URL of the proxy. + .. :param stream: (optional) whether to immediately download the response + .. content. Defaults to ``False``. + .. :param verify: (optional) Either a boolean, in which case it controls whether we verify + .. the server's TLS certificate, or a string, in which case it must be a path + .. to a CA bundle to use. Defaults to ``True``. + .. :param cert: (optional) if String, path to ssl client cert file (.pem). + .. If Tuple, ('cert', 'key') pair. + .. :rtype: requests.Response + + :param method: 新しく作成した :class:`Request` オブジェクトの HTTP メソッド。 + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param params: (任意) :class:`Request` のクエリ文字列として送信されるディクショナリ、もしくはバイトデータ。 + :param data: (任意) :class:`Request` のボディとして送信するディクショナリ、 + もしくは(フォームエンコードされた) ``[(key, value)]`` 形式のタプルの一覧、バイトデータ、ファイル形式のオブジェクト。 + :param json: (任意) :class:`Request` のボディとして送信する JSON データ。 + :param headers: (任意) :class:`Request` と一緒に送信するための HTTP ヘッダーのディクショナリ。 + :param cookies: (任意) :class:`Request` と一緒に送信するためのディクショナリか CookieJar オブジェクト。 + :param files: (任意) マルチパートのエンコーディングアップロードのための ``'filename': file-like-objects`` のディクショナリ。 + :param auth: (任意) Basic / Digest / 独自の HTTP 認証を有効にするためのタプル、もしくは呼び出し可能なオブジェクト。 + :param timeout: (任意) サーバーからのデータ返却をどれくらい待つかを float か :ref:`(connect timeout, read timeout) ` のタプルで指定します。 + :type timeout: float or tuple + :param allow_redirects: (任意) デフォルトでは True に設定されています。 + :type allow_redirects: bool + :param proxies: (任意) プロキシの URL にプロトコルやホスト名をマッピングするディクショナリ。 + :param stream: (任意) レスポンスのコンテンツをすぐにダウンロードするかどうかを指定します。デフォルトは ``False`` です。 + :param verify: (任意) ブーリアンの場合、サーバーの TLS 証明書を検証するか文字列を検証するかを制御します。 + この場合、使う認証局のバンドルへのパスでなければいけません。デフォルトは ``True`` 。 + :param cert: (任意) 文字列の場合は、SSL 証明書(.pem)へのパス。タプルの場合は、('cert', 'key') のペア。 + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r""" + .. Sends a GET request. Returns :class:`Response` object. + + GET リクエストを送信します。:class:`Response` オブジェクトを返却します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r""" + .. Sends a OPTIONS request. Returns :class:`Response` object. + + OPTIONS リクエストを送信します。:class:`Response` オブジェクトを返却します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r""" + .. Sends a HEAD request. Returns :class:`Response` object. + + HEAD リクエストを送信します。:class:`Response` オブジェクトを返却します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r""" + .. Sends a POST request. Returns :class:`Response` object. + + POST リクエストを送信します。:class:`Response` オブジェクトを返却します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + .. :param json: (optional) json to send in the body of the :class:`Request`. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param data: (任意) :class:`Request` のボティで送信するディクショナリ、バイトデータ、ファイル形式のオブジェクト。 + :param json: (任意) :class:`Request` のボティで送信する JSON データ。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r""" + .. Sends a PUT request. Returns :class:`Response` object. + + PUT リクエストを送信します。:class:`Response` オブジェクトを返却します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param data: (任意) :class:`Request` のボティで送信するディクショナリ、バイトデータ、ファイル形式のオブジェクト。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r""" + .. Sends a PATCH request. Returns :class:`Response` object. + + PATCH リクエストを送信します。:class:`Response` オブジェクトを返却します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param data: (任意) :class:`Request` のボティで送信するディクショナリ、バイトデータ、ファイル形式のオブジェクト。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r""" + .. Sends a DELETE request. Returns :class:`Response` object. + + DELETE リクエストを送信します。:class:`Response` オブジェクトを返却します。 + + .. :param url: URL for the new :class:`Request` object. + .. :param \*\*kwargs: Optional arguments that ``request`` takes. + .. :rtype: requests.Response + + :param url: 新しく作成した :class:`Request` オブジェクトのURL。 + :param \*\*kwargs: ``request`` が受け取る任意の引数。 + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """ + .. Send a given PreparedRequest. + + 渡された PreparedRequest を送信します。 + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + .. Check the environment and merge it with some settings. + + 環境変数を確認しながら、いくつかの設定をマージします。 + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + .. Returns the appropriate connection adapter for the given URL. + + 指定された URL の適切なコネクションアダプタを返却します。 + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """ + .. Closes all adapters and as such the session + + 全てのアダプタやセッション等をクローズします。 + """ + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """ + .. Registers a connection adapter to a prefix. + + プレフィックスに接続のためのアダプタを登録します。 + + .. Adapters are sorted in descending order by prefix length. + + アダプタはプレフィックスの長さによって降順にソートされます。 + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + :rtype: Session + """ + + return Session() diff --git a/requests/status_codes.py b/requests/status_codes.py old mode 100644 new mode 100755 index 5d702e6..dee8919 --- a/requests/status_codes.py +++ b/requests/status_codes.py @@ -18,7 +18,8 @@ 205: ('reset_content', 'reset'), 206: ('partial_content', 'partial'), 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), - 208: ('im_used',), + 208: ('already_reported',), + 226: ('im_used',), # Redirection. 300: ('multiple_choices',), @@ -29,7 +30,8 @@ 305: ('use_proxy',), 306: ('switch_proxy',), 307: ('temporary_redirect', 'temporary_moved', 'temporary'), - 308: ('resume_incomplete', 'resume'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 # Client Error. 400: ('bad_request', 'bad'), @@ -51,6 +53,7 @@ 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), 417: ('expectation_failed',), 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), 422: ('unprocessable_entity', 'unprocessable'), 423: ('locked',), 424: ('failed_dependency', 'dependency'), @@ -62,6 +65,7 @@ 444: ('no_response', 'none'), 449: ('retry_with', 'retry'), 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), 499: ('client_closed_request',), # Server Error. @@ -75,12 +79,13 @@ 507: ('insufficient_storage',), 509: ('bandwidth_limit_exceeded', 'bandwidth'), 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), } codes = LookupDict(name='status_codes') -for (code, titles) in list(_codes.items()): +for code, titles in _codes.items(): for title in titles: setattr(codes, title, code) - if not title.startswith('\\'): - setattr(codes, title.upper(), code) \ No newline at end of file + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) diff --git a/requests/structures.py b/requests/structures.py old mode 100644 new mode 100755 index cce627a..05d2b3f --- a/requests/structures.py +++ b/requests/structures.py @@ -5,47 +5,85 @@ ~~~~~~~~~~~~~~~~~~~ Data structures that power Requests. - """ +import collections + +from .compat import OrderedDict + + +class CaseInsensitiveDict(collections.MutableMapping): + """A case-insensitive ``dict``-like object. -class CaseInsensitiveDict(dict): - """Case-insensitive Dictionary + Implements all methods and operations of + ``collections.MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header.""" + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. - @property - def lower_keys(self): - if not hasattr(self, '_lower_keys') or not self._lower_keys: - self._lower_keys = dict((k.lower(), k) for k in list(self.keys())) - return self._lower_keys + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ - def _clear_lower_keys(self): - if hasattr(self, '_lower_keys'): - self._lower_keys.clear() + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) def __setitem__(self, key, value): - dict.__setitem__(self, key, value) - self._clear_lower_keys() + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] def __delitem__(self, key): - dict.__delitem__(self, self.lower_keys.get(key.lower(), key)) - self._lower_keys.clear() + del self._store[key.lower()] - def __contains__(self, key): - return key.lower() in self.lower_keys + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) - def __getitem__(self, key): - # We allow fall-through here, so values default to None - if key in self: - return dict.__getitem__(self, self.lower_keys[key.lower()]) + def __len__(self): + return len(self._store) - def get(self, key, default=None): - if key in self: - return self[key] + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, collections.Mapping): + other = CaseInsensitiveDict(other) else: - return default + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) class LookupDict(dict): @@ -64,4 +102,4 @@ def __getitem__(self, key): return self.__dict__.get(key, None) def get(self, key, default=None): - return self.__dict__.get(key, default) \ No newline at end of file + return self.__dict__.get(key, default) diff --git a/requests/utils.py b/requests/utils.py old mode 100644 new mode 100755 index 217f06b..c55fbed --- a/requests/utils.py +++ b/requests/utils.py @@ -1,577 +1,938 @@ -# -*- coding: utf-8 -*- - -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. - -""" - -import cgi -import codecs -import os -import platform -import re -import sys -import zlib -from netrc import netrc, NetrcParseError - -from . import __version__ -from . import certs -from .compat import parse_http_list as _parse_list_header -from .compat import quote, urlparse, bytes, str, OrderedDict, urlunparse -from .cookies import RequestsCookieJar, cookiejar_from_dict - -_hush_pyflakes = (RequestsCookieJar,) - -NETRC_FILES = ('.netrc', '_netrc') - -# if certifi is installed, use its CA bundle; -# otherwise, try and use the OS bundle -DEFAULT_CA_BUNDLE_PATH = certs.where() - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, 'items'): - d = d.items() - - return d - - -def get_netrc_auth(url): - """Returns the Requests tuple auth for a given url from netrc.""" - - try: - locations = (os.path.expanduser('~/{0}'.format(f)) for f in NETRC_FILES) - netrc_path = None - - for loc in locations: - if os.path.exists(loc) and not netrc_path: - netrc_path = loc - - # Abort early if there isn't one. - if netrc_path is None: - return netrc_path - - ri = urlparse(url) - - # Strip port numbers from netloc - host = ri.netloc.split(':')[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = (0 if _netrc[0] else 1) - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, IOError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth - pass - - # AppEngine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, 'name', None) - if name and name[0] != '<' and name[-1] != '>': - return name - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - ValueError: need more than 1 value to unpack - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - ValueError: cannot encode objects that are not 2-tuples. - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError('cannot encode objects that are not 2-tuples') - - if isinstance(value, dict): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - """ - result = {} - for item in _parse_list_header(value): - if '=' not in item: - result[item] = None - continue - name, value = item.split('=', 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != '\\\\': - return value.replace('\\\\', '\\').replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - """ - - cj2 = cookiejar_from_dict(cookie_dict) - for cookie in cj2: - cj.set_cookie(cookie) - return cj - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - - charset_re = re.compile(r']', flags=re.I) - - return charset_re.findall(content) - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - """ - - content_type = headers.get('content-type') - - if not content_type: - return None - - content_type, params = cgi.parse_header(content_type) - - if 'charset' in params: - return params['charset'].strip("'\"") - - if 'text' in content_type: - return 'ISO-8859-1' - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes a iterator.""" - - if r.encoding is None: - for item in iterator: - yield item - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode('', final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - while pos < len(string): - yield string[pos:pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - - 2. every encodings from ```` - - 3. fall back and replace all unicode characters - - """ - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors='replace') - except TypeError: - return r.content - - -def stream_decompress(iterator, mode='gzip'): - """Stream decodes an iterator over compressed data - - :param iterator: An iterator over compressed data - :param mode: 'gzip' or 'deflate' - :return: An iterator over decompressed data - """ - - if mode not in ['gzip', 'deflate']: - raise ValueError('stream_decompress mode must be gzip or deflate') - - zlib_mode = 16 + zlib.MAX_WBITS if mode == 'gzip' else -zlib.MAX_WBITS - dec = zlib.decompressobj(zlib_mode) - try: - for chunk in iterator: - rv = dec.decompress(chunk) - if rv: - yield rv - except zlib.error: - # If there was an error decompressing, just return the raw chunk - yield chunk - # Continue to return the rest of the raw data - for chunk in iterator: - yield chunk - else: - # Make sure everything has been returned from the decompression object - buf = dec.decompress(bytes()) - rv = buf + dec.flush() - if rv: - yield rv - - -def stream_untransfer(gen, resp): - ce = resp.headers.get('content-encoding', '').lower() - if 'gzip' in ce: - gen = stream_decompress(gen, mode='gzip') - elif 'deflate' in ce: - gen = stream_decompress(gen, mode='deflate') - - return gen - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - + "0123456789-._~") - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - """ - parts = uri.split('%') - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - c = chr(int(h, 16)) - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = '%' + parts[i] - else: - parts[i] = '%' + parts[i] - return ''.join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - """ - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, unreserved, - # or '%') - return quote(unquote_unreserved(uri), safe="!#$%&'()*+,/:;=?@[]~") - - -def get_environ_proxies(url): - """Return a dict of environment proxies.""" - - proxy_keys = [ - 'all', - 'http', - 'https', - 'ftp', - 'socks' - ] - - get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy = get_proxy('no_proxy') - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the netloc, both with and without the port. - no_proxy = no_proxy.split(',') - netloc = urlparse(url).netloc - - for host in no_proxy: - if netloc.endswith(host) or netloc.split(':')[0].endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return {} - - # If we get here, we either didn't have no_proxy set or we're not going - # anywhere that no_proxy applies to. - proxies = [(key, get_proxy(key + '_proxy')) for key in proxy_keys] - return dict([(key, val) for (key, val) in proxies if val]) - - -def default_user_agent(): - """Return a string representing the default user agent.""" - _implementation = platform.python_implementation() - - if _implementation == 'CPython': - _implementation_version = platform.python_version() - elif _implementation == 'PyPy': - _implementation_version = '%s.%s.%s' % ( - sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro - ) - if sys.pypy_version_info.releaselevel != 'final': - _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel]) - elif _implementation == 'Jython': - _implementation_version = platform.python_version() # Complete Guess - elif _implementation == 'IronPython': - _implementation_version = platform.python_version() # Complete Guess - else: - _implementation_version = 'Unknown' - - try: - p_system = platform.system() - p_release = platform.release() - except IOError: - p_system = 'Unknown' - p_release = 'Unknown' - - return " ".join([ - 'python-requests/%s' % __version__, - '%s/%s' % (_implementation, _implementation_version), - '%s/%s' % (p_system, p_release), - ]) - -def default_headers(): - return { - 'User-Agent': default_user_agent(), - 'Accept-Encoding': ', '.join(('gzip', 'deflate', 'compress')), - 'Accept': '*/*' - } - - -def parse_header_links(value): - """Return a dict of parsed link headers proxies. - - i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" - - """ - - links = [] - - replace_chars = " '\"" - - for val in value.split(","): - try: - url, params = val.split(";", 1) - except ValueError: - url, params = val, '' - - link = {} - - link["url"] = url.strip("<> '\"") - - for param in params.split(";"): - try: - key,value = param.split("=") - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE): - return 'utf-32' # BOM included - if sample[:3] == codecs.BOM_UTF8: - return 'utf-8-sig' # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return 'utf-16' # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return 'utf-8' - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return 'utf-16-be' - if sample[1::2] == _null2: # 2nd and 4th are null - return 'utf-16-le' - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return 'utf-32-be' - if sample[1:] == _null3: - return 'utf-32-le' - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url, new_scheme): - '''Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument.''' - scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) - - # urlparse is a finicky beast, and sometimes decides that there isn't a - # netloc present. Assume that it's being over-cautious, and switch netloc - # and path if urlparse decided there was no netloc. - if not netloc: - netloc, path = path, netloc - - return urlunparse((scheme, netloc, path, params, query, fragment)) \ No newline at end of file +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import cgi +import codecs +import collections +import contextlib +import io +import os +import platform +import re +import socket +import struct +import warnings + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + + +if platform.system() == 'Windows': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + if is_py3: + import winreg + else: + import _winreg as winreg + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + proxyEnable = winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0] + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{0}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See http://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: need more than 1 value to unpack + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, collections.Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """ + .. Returns a key/value dictionary from a CookieJar. + + CookieJar からキー/値のディクショナリを返却します。 + + .. :param cj: CookieJar object to extract cookies from. + .. :rtype: dict + + :param cj: Cookie を抽出するための CookieJar オブジェクト。 + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """ + .. Returns a CookieJar from a key/value dictionary. + + キー/値のディクショナリから CookieJar を返却します。 + + .. :param cj: CookieJar to insert cookies into. + .. :param cookie_dict: Dict of key/values to insert into CookieJar. + .. :rtype: CookieJar + + :param cj: Cookie に入れるための CookieJar。 + :param cookie_dict: CookieJar に入れるキー/値のディクショナリ。 + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """ + .. Returns encodings from given content string. + + 渡したコンテンツの文字列からエンコーディングを取得して返却する。 + + .. :param content: bytestring to extract encodings from. + + :param content: エンコーディングを取得するためのバイト列。 + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def get_encoding_from_headers(headers): + """ + .. Returns encodings from given HTTP Header Dict. + + 渡した HTTP ヘッダーのディクショナリからエンコーディングを取得して返却します。 + + .. :param headers: dictionary to extract encoding from. + .. :rtype: str + + :param headers: エンコーディングを取得するためのディクショナリ。 + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = cgi.parse_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """ + .. Returns the requested content back in unicode. + + リクエストしたコンテンツを Unicode で返却します。 + + .. :param r: Response object to get unicode content from. + + :param r: Unicode コンテンツを取得するためのレスポンスのオブジェクト。 + + .. Tried: + + 以下の処理を試します。: + + .. charset from content-type + .. fall back and replace all unicode characters + + 1. コンテンツタイプの charset + 2. 全ての Unicode 文字を置き換えて、fall back します。 + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + netloc = urlparse(url).netloc + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the netloc, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + ip = netloc.split(':')[0] + if is_ipv4_address(ip): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(ip, proxy_ip): + return True + elif ip == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + for host in no_proxy: + if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + # If the system proxy settings indicate that this URL should be bypassed, + # don't proxy. + # The proxy_bypass function is incredibly buggy on OS X in early versions + # of Python 2.6, so allow this call to fail. Only catch the specific + # exceptions we've seen, though: this call failing in other ways can reveal + # legitimate problems. + with set_environ('no_proxy', no_proxy_arg): + try: + bypass = proxy_bypass(netloc) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a dict of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/requirements.txt b/requirements.txt old mode 100644 new mode 100755 index c88bf43..8d79283 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,16 @@ -py==1.4.12 -pytest==2.3.4 -invoke==0.2.0 \ No newline at end of file +-e .[socks] +pytest>=2.8.0 +codecov +pytest-httpbin==0.0.7 +pytest-mock +pytest-cov +pytest-xdist +alabaster +readme_renderer +Sphinx<=1.5.5 +PySocks +setuptools>=18.5 +docutils +flake8 +tox +detox diff --git a/setup.cfg b/setup.cfg new file mode 100755 index 0000000..2a9acf1 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal = 1 diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index ca365d9..ed4892d --- a/setup.py +++ b/setup.py @@ -1,46 +1,78 @@ #!/usr/bin/env python import os +import re import sys -import requests +from codecs import open -try: - from setuptools import setup -except ImportError: - from distutils.core import setup +from setuptools import setup +from setuptools.command.test import test as TestCommand +here = os.path.abspath(os.path.dirname(__file__)) + +class PyTest(TestCommand): + user_options = [('pytest-args=', 'a', "Arguments to pass into py.test")] + + def initialize_options(self): + TestCommand.initialize_options(self) + try: + from multiprocessing import cpu_count + self.pytest_args = ['-n', str(cpu_count()), '--boxed'] + except (ImportError, NotImplementedError): + self.pytest_args = ['-n', '1', '--boxed'] + + def finalize_options(self): + TestCommand.finalize_options(self) + self.test_args = [] + self.test_suite = True + + def run_tests(self): + import pytest + + errno = pytest.main(self.pytest_args) + sys.exit(errno) + +# 'setup.py publish' shortcut. if sys.argv[-1] == 'publish': - os.system('python setup.py sdist upload') + os.system('python setup.py sdist bdist_wheel') + os.system('twine upload dist/*') sys.exit() -packages = [ - 'requests', - 'requests.packages', - 'requests.packages.charade', - 'requests.packages.urllib3', - 'requests.packages.urllib3.packages', - 'requests.packages.urllib3.contrib', - 'requests.packages.urllib3.packages.ssl_match_hostname' +packages = ['requests'] + +requires = [ + 'chardet>=3.0.2,<3.1.0', + 'idna>=2.5,<2.7', + 'urllib3>=1.21.1,<1.23', + 'certifi>=2017.4.17' + ] +test_requirements = ['pytest-httpbin==0.0.7', 'pytest-cov', 'pytest-mock', 'pytest-xdist', 'PySocks>=1.5.6, !=1.5.7', 'pytest>=2.8.0'] + +about = {} +with open(os.path.join(here, 'requests', '__version__.py'), 'r', 'utf-8') as f: + exec(f.read(), about) -requires = [] +with open('README.rst', 'r', 'utf-8') as f: + readme = f.read() +with open('HISTORY.rst', 'r', 'utf-8') as f: + history = f.read() setup( - name='requests', - version=requests.__version__, - description='Python HTTP for Humans.', - long_description=open('README.rst').read() + '\n\n' + - open('HISTORY.rst').read(), - author='Kenneth Reitz', - author_email='me@kennethreitz.com', - url='http://python-requests.org', + name=about['__title__'], + version=about['__version__'], + description=about['__description__'], + long_description=readme + '\n\n' + history, + author=about['__author__'], + author_email=about['__author_email__'], + url=about['__url__'], packages=packages, package_data={'': ['LICENSE', 'NOTICE'], 'requests': ['*.pem']}, package_dir={'requests': 'requests'}, include_package_data=True, install_requires=requires, - license=open('LICENSE').read(), + license=about['__license__'], zip_safe=False, classifiers=( 'Development Status :: 5 - Production/Stable', @@ -51,7 +83,18 @@ 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', - + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: PyPy' ), -) \ No newline at end of file + cmdclass={'test': PyTest}, + tests_require=test_requirements, + extras_require={ + 'security': ['pyOpenSSL>=0.14', 'cryptography>=1.3.4', 'idna>=2.0.0'], + 'socks': ['PySocks>=1.5.6, !=1.5.7'], + 'socks:sys_platform == "win32" and (python_version == "2.7" or python_version == "2.6")': ['win_inet_pton'], + }, +) + diff --git a/tasks.py b/tasks.py deleted file mode 100644 index 571e7d5..0000000 --- a/tasks.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- - -import requests -from invoke import run, task - -@task -def test(): - run('py.test', pty=True) - -@task -def deps(): - print('Vendoring urllib3...') - - run('rm -fr requests/packages/urllib3') - run('git clone https://github.com/shazow/urllib3.git') - run('mv urllib3/urllib3 requests/packages/') - run('rm -fr urllib3') - - print('Vendoring Charade...') - - run('rm -fr requests/packages/charade') - run('git clone https://github.com/sigmavirus24/charade.git') - run('mv charade/charade requests/packages/') - run('rm -fr charade') - -@task -def certs(): - print('Grabbing latest CA Bundle...') - r = requests.get('https://raw.github.com/kennethreitz/certifi/master/certifi/cacert.pem') - - with open('requests/cacert.pem', 'w') as f: - f.write(r.content) \ No newline at end of file diff --git a/test_requests.py b/test_requests.py deleted file mode 100644 index 0d327f9..0000000 --- a/test_requests.py +++ /dev/null @@ -1,877 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -"""Tests for Requests.""" - -from __future__ import division -import json -import os -import unittest -import pickle - -import requests -import pytest -from requests.auth import HTTPDigestAuth -from requests.adapters import HTTPAdapter -from requests.compat import str, cookielib, getproxies, urljoin, urlparse -from requests.cookies import cookiejar_from_dict -from requests.exceptions import InvalidURL, MissingSchema -from requests.structures import CaseInsensitiveDict - -try: - import StringIO -except ImportError: - import io as StringIO - -HTTPBIN = os.environ.get('HTTPBIN_URL', 'http://httpbin.org/') -# Issue #1483: Make sure the URL always has a trailing slash -HTTPBIN = HTTPBIN.rstrip('/') + '/' - - -def httpbin(*suffix): - """Returns url for HTTPBIN resource.""" - return urljoin(HTTPBIN, '/'.join(suffix)) - - -class RequestsTestCase(unittest.TestCase): - - _multiprocess_can_split_ = True - - def setUp(self): - """Create simple data set with headers.""" - pass - - def tearDown(self): - """Teardown.""" - pass - - def test_entry_points(self): - - requests.session - requests.session().get - requests.session().head - requests.get - requests.head - requests.put - requests.patch - requests.post - - def test_invalid_url(self): - self.assertRaises(MissingSchema, requests.get, 'hiwpefhipowhefopw') - self.assertRaises(InvalidURL, requests.get, 'http://') - - def test_basic_building(self): - req = requests.Request() - req.url = 'http://kennethreitz.org/' - req.data = {'life': '42'} - - pr = req.prepare() - assert pr.url == req.url - assert pr.body == 'life=42' - - def test_no_content_length(self): - get_req = requests.Request('GET', httpbin('get')).prepare() - self.assertTrue('Content-Length' not in get_req.headers) - head_req = requests.Request('HEAD', httpbin('head')).prepare() - self.assertTrue('Content-Length' not in head_req.headers) - - def test_path_is_not_double_encoded(self): - request = requests.Request('GET', "http://0.0.0.0/get/test case").prepare() - - self.assertEqual(request.path_url, "/get/test%20case") - - def test_params_are_added_before_fragment(self): - request = requests.Request('GET', - "http://example.com/path#fragment", params={"a": "b"}).prepare() - self.assertEqual(request.url, - "http://example.com/path?a=b#fragment") - request = requests.Request('GET', - "http://example.com/path?key=value#fragment", params={"a": "b"}).prepare() - self.assertEqual(request.url, - "http://example.com/path?key=value&a=b#fragment") - - def test_mixed_case_scheme_acceptable(self): - s = requests.Session() - s.proxies = getproxies() - parts = urlparse(httpbin('get')) - schemes = ['http://', 'HTTP://', 'hTTp://', 'HttP://', - 'https://', 'HTTPS://', 'hTTps://', 'HttPs://'] - for scheme in schemes: - url = scheme + parts.netloc + parts.path - r = requests.Request('GET', url) - r = s.send(r.prepare()) - self.assertEqual(r.status_code, 200, - "failed for scheme %s" % scheme) - - def test_HTTP_200_OK_GET_ALTERNATIVE(self): - r = requests.Request('GET', httpbin('get')) - s = requests.Session() - s.proxies = getproxies() - - r = s.send(r.prepare()) - - self.assertEqual(r.status_code, 200) - - def test_HTTP_302_ALLOW_REDIRECT_GET(self): - r = requests.get(httpbin('redirect', '1')) - self.assertEqual(r.status_code, 200) - - # def test_HTTP_302_ALLOW_REDIRECT_POST(self): - # r = requests.post(httpbin('status', '302'), data={'some': 'data'}) - # self.assertEqual(r.status_code, 200) - - def test_HTTP_200_OK_GET_WITH_PARAMS(self): - heads = {'User-agent': 'Mozilla/5.0'} - - r = requests.get(httpbin('user-agent'), headers=heads) - - self.assertTrue(heads['User-agent'] in r.text) - self.assertEqual(r.status_code, 200) - - def test_HTTP_200_OK_GET_WITH_MIXED_PARAMS(self): - heads = {'User-agent': 'Mozilla/5.0'} - - r = requests.get(httpbin('get') + '?test=true', params={'q': 'test'}, headers=heads) - self.assertEqual(r.status_code, 200) - - def test_set_cookie_on_301(self): - s = requests.session() - url = httpbin('cookies/set?foo=bar') - r = s.get(url) - self.assertTrue(s.cookies['foo'] == 'bar') - - def test_cookie_sent_on_redirect(self): - s = requests.session() - s.get(httpbin('cookies/set?foo=bar')) - r = s.get(httpbin('redirect/1')) # redirects to httpbin('get') - self.assertTrue("Cookie" in r.json()["headers"]) - - def test_cookie_removed_on_expire(self): - s = requests.session() - s.get(httpbin('cookies/set?foo=bar')) - self.assertTrue(s.cookies['foo'] == 'bar') - s.get( - httpbin('response-headers'), - params={ - 'Set-Cookie': - 'foo=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT' - } - ) - assert 'foo' not in s.cookies - - def test_cookie_quote_wrapped(self): - s = requests.session() - s.get(httpbin('cookies/set?foo="bar:baz"')) - self.assertTrue(s.cookies['foo'] == '"bar:baz"') - - def test_cookie_persists_via_api(self): - s = requests.session() - r = s.get(httpbin('redirect/1'), cookies={'foo':'bar'}) - self.assertTrue('foo' in r.request.headers['Cookie']) - self.assertTrue('foo' in r.history[0].request.headers['Cookie']) - - def test_request_cookie_overrides_session_cookie(self): - s = requests.session() - s.cookies['foo'] = 'bar' - r = s.get(httpbin('cookies'), cookies={'foo': 'baz'}) - assert r.json()['cookies']['foo'] == 'baz' - # Session cookie should not be modified - assert s.cookies['foo'] == 'bar' - - def test_generic_cookiejar_works(self): - cj = cookielib.CookieJar() - cookiejar_from_dict({'foo': 'bar'}, cj) - s = requests.session() - s.cookies = cj - r = s.get(httpbin('cookies')) - # Make sure the cookie was sent - assert r.json()['cookies']['foo'] == 'bar' - # Make sure the session cj is still the custom one - assert s.cookies is cj - - def test_requests_in_history_are_not_overridden(self): - resp = requests.get(httpbin('redirect/3')) - urls = [r.url for r in resp.history] - req_urls = [r.request.url for r in resp.history] - self.assertEquals(urls, req_urls) - - def test_user_agent_transfers(self): - - heads = { - 'User-agent': 'Mozilla/5.0 (github.com/kennethreitz/requests)' - } - - r = requests.get(httpbin('user-agent'), headers=heads) - self.assertTrue(heads['User-agent'] in r.text) - - heads = { - 'user-agent': 'Mozilla/5.0 (github.com/kennethreitz/requests)' - } - - r = requests.get(httpbin('user-agent'), headers=heads) - self.assertTrue(heads['user-agent'] in r.text) - - def test_HTTP_200_OK_HEAD(self): - r = requests.head(httpbin('get')) - self.assertEqual(r.status_code, 200) - - def test_HTTP_200_OK_PUT(self): - r = requests.put(httpbin('put')) - self.assertEqual(r.status_code, 200) - - def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self): - auth = ('user', 'pass') - url = httpbin('basic-auth', 'user', 'pass') - - r = requests.get(url, auth=auth) - self.assertEqual(r.status_code, 200) - - r = requests.get(url) - self.assertEqual(r.status_code, 401) - - s = requests.session() - s.auth = auth - r = s.get(url) - self.assertEqual(r.status_code, 200) - - def test_basicauth_with_netrc(self): - auth = ('user', 'pass') - wrong_auth = ('wronguser', 'wrongpass') - url = httpbin('basic-auth', 'user', 'pass') - - def get_netrc_auth_mock(url): - return auth - requests.sessions.get_netrc_auth = get_netrc_auth_mock - - # Should use netrc and work. - r = requests.get(url) - self.assertEqual(r.status_code, 200) - - # Given auth should override and fail. - r = requests.get(url, auth=wrong_auth) - self.assertEqual(r.status_code, 401) - - s = requests.session() - - # Should use netrc and work. - r = s.get(url) - self.assertEqual(r.status_code, 200) - - # Given auth should override and fail. - s.auth = wrong_auth - r = s.get(url) - self.assertEqual(r.status_code, 401) - - def test_DIGEST_HTTP_200_OK_GET(self): - - auth = HTTPDigestAuth('user', 'pass') - url = httpbin('digest-auth', 'auth', 'user', 'pass') - - r = requests.get(url, auth=auth) - self.assertEqual(r.status_code, 200) - - r = requests.get(url) - self.assertEqual(r.status_code, 401) - - s = requests.session() - s.auth = HTTPDigestAuth('user', 'pass') - r = s.get(url) - self.assertEqual(r.status_code, 200) - - def test_DIGEST_AUTH_RETURNS_COOKIE(self): - url = httpbin('digest-auth', 'auth', 'user', 'pass') - auth = HTTPDigestAuth('user', 'pass') - r = requests.get(url) - assert r.cookies['fake'] == 'fake_value' - - r = requests.get(url, auth=auth) - assert r.status_code == 200 - - def test_DIGEST_AUTH_SETS_SESSION_COOKIES(self): - url = httpbin('digest-auth', 'auth', 'user', 'pass') - auth = HTTPDigestAuth('user', 'pass') - s = requests.Session() - s.get(url, auth=auth) - assert s.cookies['fake'] == 'fake_value' - - def test_DIGEST_STREAM(self): - - auth = HTTPDigestAuth('user', 'pass') - url = httpbin('digest-auth', 'auth', 'user', 'pass') - - r = requests.get(url, auth=auth, stream=True) - self.assertNotEqual(r.raw.read(), b'') - - r = requests.get(url, auth=auth, stream=False) - self.assertEqual(r.raw.read(), b'') - - - def test_DIGESTAUTH_WRONG_HTTP_401_GET(self): - - auth = HTTPDigestAuth('user', 'wrongpass') - url = httpbin('digest-auth', 'auth', 'user', 'pass') - - r = requests.get(url, auth=auth) - self.assertEqual(r.status_code, 401) - - r = requests.get(url) - self.assertEqual(r.status_code, 401) - - s = requests.session() - s.auth = auth - r = s.get(url) - self.assertEqual(r.status_code, 401) - - def test_POSTBIN_GET_POST_FILES(self): - - url = httpbin('post') - post1 = requests.post(url).raise_for_status() - - post1 = requests.post(url, data={'some': 'data'}) - self.assertEqual(post1.status_code, 200) - - with open('requirements.txt') as f: - post2 = requests.post(url, files={'some': f}) - self.assertEqual(post2.status_code, 200) - - post4 = requests.post(url, data='[{"some": "json"}]') - self.assertEqual(post4.status_code, 200) - - try: - requests.post(url, files=['bad file data']) - except ValueError: - pass - - def test_POSTBIN_GET_POST_FILES_WITH_DATA(self): - - url = httpbin('post') - post1 = requests.post(url).raise_for_status() - - post1 = requests.post(url, data={'some': 'data'}) - self.assertEqual(post1.status_code, 200) - - with open('requirements.txt') as f: - post2 = requests.post(url, data={'some': 'data'}, files={'some': f}) - self.assertEqual(post2.status_code, 200) - - post4 = requests.post(url, data='[{"some": "json"}]') - self.assertEqual(post4.status_code, 200) - - try: - requests.post(url, files=['bad file data']) - except ValueError: - pass - - def test_conflicting_post_params(self): - url = httpbin('post') - with open('requirements.txt') as f: - pytest.raises(ValueError, "requests.post(url, data='[{\"some\": \"data\"}]', files={'some': f})") - pytest.raises(ValueError, "requests.post(url, data=u'[{\"some\": \"data\"}]', files={'some': f})") - - def test_request_ok_set(self): - r = requests.get(httpbin('status', '404')) - self.assertEqual(r.ok, False) - - def test_status_raising(self): - r = requests.get(httpbin('status', '404')) - self.assertRaises(requests.exceptions.HTTPError, r.raise_for_status) - - r = requests.get(httpbin('status', '500')) - self.assertFalse(r.ok) - - def test_decompress_gzip(self): - r = requests.get(httpbin('gzip')) - r.content.decode('ascii') - - def test_unicode_get(self): - url = httpbin('/get') - requests.get(url, params={'foo': 'føø'}) - requests.get(url, params={'føø': 'føø'}) - requests.get(url, params={'føø': 'føø'}) - requests.get(url, params={'foo': 'foo'}) - requests.get(httpbin('ø'), params={'foo': 'foo'}) - - def test_unicode_header_name(self): - requests.put(httpbin('put'), headers={str('Content-Type'): 'application/octet-stream'}, data='\xff') # compat.str is unicode. - - def test_urlencoded_get_query_multivalued_param(self): - - r = requests.get(httpbin('get'), params=dict(test=['foo', 'baz'])) - self.assertEqual(r.status_code, 200) - self.assertEqual(r.url, httpbin('get?test=foo&test=baz')) - - def test_different_encodings_dont_break_post(self): - r = requests.post(httpbin('post'), - data={'stuff': json.dumps({'a': 123})}, - params={'blah': 'asdf1234'}, - files={'file': ('test_requests.py', open(__file__, 'rb'))}) - self.assertEqual(r.status_code, 200) - - def test_unicode_multipart_post(self): - r = requests.post(httpbin('post'), - data={'stuff': u'ëlïxr'}, - files={'file': ('test_requests.py', open(__file__, 'rb'))}) - self.assertEqual(r.status_code, 200) - - r = requests.post(httpbin('post'), - data={'stuff': u'ëlïxr'.encode('utf-8')}, - files={'file': ('test_requests.py', open(__file__, 'rb'))}) - self.assertEqual(r.status_code, 200) - - r = requests.post(httpbin('post'), - data={'stuff': 'elixr'}, - files={'file': ('test_requests.py', open(__file__, 'rb'))}) - self.assertEqual(r.status_code, 200) - - r = requests.post(httpbin('post'), - data={'stuff': 'elixr'.encode('utf-8')}, - files={'file': ('test_requests.py', open(__file__, 'rb'))}) - self.assertEqual(r.status_code, 200) - - def test_unicode_multipart_post_fieldnames(self): - filename = os.path.splitext(__file__)[0] + '.py' - r = requests.Request(method='POST', - url=httpbin('post'), - data={'stuff'.encode('utf-8'): 'elixr'}, - files={'file': ('test_requests.py', - open(filename, 'rb'))}) - prep = r.prepare() - self.assertTrue(b'name="stuff"' in prep.body) - self.assertFalse(b'name="b\'stuff\'"' in prep.body) - - def test_custom_content_type(self): - r = requests.post(httpbin('post'), - data={'stuff': json.dumps({'a': 123})}, - files={'file1': ('test_requests.py', open(__file__, 'rb')), - 'file2': ('test_requests', open(__file__, 'rb'), - 'text/py-content-type')}) - self.assertEqual(r.status_code, 200) - self.assertTrue(b"text/py-content-type" in r.request.body) - - def test_hook_receives_request_arguments(self): - def hook(resp, **kwargs): - assert resp is not None - assert kwargs != {} - - requests.Request('GET', HTTPBIN, hooks={'response': hook}) - - def test_prepared_request_hook(self): - def hook(resp, **kwargs): - resp.hook_working = True - return resp - - req = requests.Request('GET', HTTPBIN, hooks={'response': hook}) - prep = req.prepare() - - s = requests.Session() - s.proxies = getproxies() - resp = s.send(prep) - - self.assertTrue(hasattr(resp, 'hook_working')) - - def test_prepared_from_session(self): - class DummyAuth(requests.auth.AuthBase): - def __call__(self, r): - r.headers['Dummy-Auth-Test'] = 'dummy-auth-test-ok' - return r - - req = requests.Request('GET', httpbin('headers')) - self.assertEqual(req.auth, None) - - s = requests.Session() - s.auth = DummyAuth() - - prep = s.prepare_request(req) - resp = s.send(prep) - - self.assertTrue(resp.json()['headers']['Dummy-Auth-Test'], 'dummy-auth-test-ok') - - def test_links(self): - r = requests.Response() - r.headers = { - 'cache-control': 'public, max-age=60, s-maxage=60', - 'connection': 'keep-alive', - 'content-encoding': 'gzip', - 'content-type': 'application/json; charset=utf-8', - 'date': 'Sat, 26 Jan 2013 16:47:56 GMT', - 'etag': '"6ff6a73c0e446c1f61614769e3ceb778"', - 'last-modified': 'Sat, 26 Jan 2013 16:22:39 GMT', - 'link': ('; rel="next", ; ' - ' rel="last"'), - 'server': 'GitHub.com', - 'status': '200 OK', - 'vary': 'Accept', - 'x-content-type-options': 'nosniff', - 'x-github-media-type': 'github.beta', - 'x-ratelimit-limit': '60', - 'x-ratelimit-remaining': '57' - } - self.assertEqual(r.links['next']['rel'], 'next') - - def test_cookie_parameters(self): - key = 'some_cookie' - value = 'some_value' - secure = True - domain = 'test.com' - rest = {'HttpOnly': True} - - jar = requests.cookies.RequestsCookieJar() - jar.set(key, value, secure=secure, domain=domain, rest=rest) - - self.assertEqual(len(jar), 1) - self.assertTrue('some_cookie' in jar) - - cookie = list(jar)[0] - self.assertEqual(cookie.secure, secure) - self.assertEqual(cookie.domain, domain) - self.assertEqual(cookie._rest['HttpOnly'], rest['HttpOnly']) - - def test_time_elapsed_blank(self): - r = requests.get(httpbin('get')) - td = r.elapsed - total_seconds = ((td.microseconds + (td.seconds + td.days * 24 * 3600) - * 10**6) / 10**6) - self.assertTrue(total_seconds > 0.0) - - def test_response_is_iterable(self): - r = requests.Response() - io = StringIO.StringIO('abc') - read_ = io.read - - def read_mock(amt, decode_content=None): - return read_(amt) - setattr(io, 'read', read_mock) - r.raw = io - self.assertTrue(next(iter(r))) - io.close() - - def test_get_auth_from_url(self): - url = 'http://user:pass@complex.url.com/path?query=yes' - self.assertEqual(('user', 'pass'), - requests.utils.get_auth_from_url(url)) - - def test_cannot_send_unprepared_requests(self): - r = requests.Request(url=HTTPBIN) - self.assertRaises(ValueError, requests.Session().send, r) - - def test_http_error(self): - error = requests.exceptions.HTTPError() - self.assertEqual(error.response, None) - response = requests.Response() - error = requests.exceptions.HTTPError(response=response) - self.assertEqual(error.response, response) - error = requests.exceptions.HTTPError('message', response=response) - self.assertEqual(str(error), 'message') - self.assertEqual(error.response, response) - - def test_session_pickling(self): - r = requests.Request('GET', httpbin('get')) - s = requests.Session() - - s = pickle.loads(pickle.dumps(s)) - s.proxies = getproxies() - - r = s.send(r.prepare()) - self.assertEqual(r.status_code, 200) - - def test_fixes_1329(self): - """ - Ensure that header updates are done case-insensitively. - """ - s = requests.Session() - s.headers.update({'ACCEPT': 'BOGUS'}) - s.headers.update({'accept': 'application/json'}) - r = s.get(httpbin('get')) - headers = r.request.headers - self.assertEqual( - headers['accept'], - 'application/json' - ) - self.assertEqual( - headers['Accept'], - 'application/json' - ) - self.assertEqual( - headers['ACCEPT'], - 'application/json' - ) - - def test_uppercase_scheme_redirect(self): - parts = urlparse(httpbin('html')) - url = "HTTP://" + parts.netloc + parts.path - r = requests.get(httpbin('redirect-to'), params={'url': url}) - self.assertEqual(r.status_code, 200) - self.assertEqual(r.url.lower(), url.lower()) - - def test_transport_adapter_ordering(self): - s = requests.Session() - order = ['https://', 'http://'] - self.assertEqual(order, list(s.adapters)) - s.mount('http://git', HTTPAdapter()) - s.mount('http://github', HTTPAdapter()) - s.mount('http://github.com', HTTPAdapter()) - s.mount('http://github.com/about/', HTTPAdapter()) - order = [ - 'http://github.com/about/', - 'http://github.com', - 'http://github', - 'http://git', - 'https://', - 'http://', - ] - self.assertEqual(order, list(s.adapters)) - s.mount('http://gittip', HTTPAdapter()) - s.mount('http://gittip.com', HTTPAdapter()) - s.mount('http://gittip.com/about/', HTTPAdapter()) - order = [ - 'http://github.com/about/', - 'http://gittip.com/about/', - 'http://github.com', - 'http://gittip.com', - 'http://github', - 'http://gittip', - 'http://git', - 'https://', - 'http://', - ] - self.assertEqual(order, list(s.adapters)) - s2 = requests.Session() - s2.adapters = {'http://': HTTPAdapter()} - s2.mount('https://', HTTPAdapter()) - self.assertTrue('http://' in s2.adapters) - self.assertTrue('https://' in s2.adapters) - - def test_header_remove_is_case_insensitive(self): - # From issue #1321 - s = requests.Session() - s.headers['foo'] = 'bar' - r = s.get(httpbin('get'), headers={'FOO': None}) - assert 'foo' not in r.request.headers - - def test_params_are_merged_case_sensitive(self): - s = requests.Session() - s.params['foo'] = 'bar' - r = s.get(httpbin('get'), params={'FOO': 'bar'}) - assert r.json()['args'] == {'foo': 'bar', 'FOO': 'bar'} - - - def test_long_authinfo_in_url(self): - url = 'http://{0}:{1}@{2}:9000/path?query#frag'.format( - 'E8A3BE87-9E3F-4620-8858-95478E385B5B', - 'EA770032-DA4D-4D84-8CE9-29C6D910BF1E', - 'exactly-------------sixty-----------three------------characters', - ) - r = requests.Request('GET', url).prepare() - self.assertEqual(r.url, url) - - def test_header_keys_are_native(self): - headers = {u'unicode': 'blah', 'byte'.encode('ascii'): 'blah'} - r = requests.Request('GET', httpbin('get'), headers=headers) - p = r.prepare() - - # This is testing that they are builtin strings. A bit weird, but there - # we go. - self.assertTrue('unicode' in p.headers.keys()) - self.assertTrue('byte' in p.headers.keys()) - - def test_can_send_nonstring_objects_with_files(self): - data = {'a': 0.0} - files = {'b': 'foo'} - r = requests.Request('POST', httpbin('post'), data=data, files=files) - p = r.prepare() - - self.assertTrue('multipart/form-data' in p.headers['Content-Type']) - - -class TestContentEncodingDetection(unittest.TestCase): - - def test_none(self): - encodings = requests.utils.get_encodings_from_content('') - self.assertEqual(len(encodings), 0) - - def test_html_charset(self): - """HTML5 meta charset attribute""" - content = '' - encodings = requests.utils.get_encodings_from_content(content) - self.assertEqual(len(encodings), 1) - self.assertEqual(encodings[0], 'UTF-8') - - def test_html4_pragma(self): - """HTML4 pragma directive""" - content = '' - encodings = requests.utils.get_encodings_from_content(content) - self.assertEqual(len(encodings), 1) - self.assertEqual(encodings[0], 'UTF-8') - - def test_xhtml_pragma(self): - """XHTML 1.x served with text/html MIME type""" - content = '' - encodings = requests.utils.get_encodings_from_content(content) - self.assertEqual(len(encodings), 1) - self.assertEqual(encodings[0], 'UTF-8') - - def test_xml(self): - """XHTML 1.x served as XML""" - content = '' - encodings = requests.utils.get_encodings_from_content(content) - self.assertEqual(len(encodings), 1) - self.assertEqual(encodings[0], 'UTF-8') - - def test_precedence(self): - content = ''' - - - - '''.strip() - encodings = requests.utils.get_encodings_from_content(content) - self.assertEqual(encodings, ['HTML5', 'HTML4', 'XML']) - - -class TestCaseInsensitiveDict(unittest.TestCase): - - def test_mapping_init(self): - cid = CaseInsensitiveDict({'Foo': 'foo','BAr': 'bar'}) - self.assertEqual(len(cid), 2) - self.assertTrue('foo' in cid) - self.assertTrue('bar' in cid) - - def test_iterable_init(self): - cid = CaseInsensitiveDict([('Foo', 'foo'), ('BAr', 'bar')]) - self.assertEqual(len(cid), 2) - self.assertTrue('foo' in cid) - self.assertTrue('bar' in cid) - - def test_kwargs_init(self): - cid = CaseInsensitiveDict(FOO='foo', BAr='bar') - self.assertEqual(len(cid), 2) - self.assertTrue('foo' in cid) - self.assertTrue('bar' in cid) - - def test_docstring_example(self): - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - self.assertEqual(cid['aCCEPT'], 'application/json') - self.assertEqual(list(cid), ['Accept']) - - def test_len(self): - cid = CaseInsensitiveDict({'a': 'a', 'b': 'b'}) - cid['A'] = 'a' - self.assertEqual(len(cid), 2) - - def test_getitem(self): - cid = CaseInsensitiveDict({'Spam': 'blueval'}) - self.assertEqual(cid['spam'], 'blueval') - self.assertEqual(cid['SPAM'], 'blueval') - - def test_fixes_649(self): - """__setitem__ should behave case-insensitively.""" - cid = CaseInsensitiveDict() - cid['spam'] = 'oneval' - cid['Spam'] = 'twoval' - cid['sPAM'] = 'redval' - cid['SPAM'] = 'blueval' - self.assertEqual(cid['spam'], 'blueval') - self.assertEqual(cid['SPAM'], 'blueval') - self.assertEqual(list(cid.keys()), ['SPAM']) - - def test_delitem(self): - cid = CaseInsensitiveDict() - cid['Spam'] = 'someval' - del cid['sPam'] - self.assertFalse('spam' in cid) - self.assertEqual(len(cid), 0) - - def test_contains(self): - cid = CaseInsensitiveDict() - cid['Spam'] = 'someval' - self.assertTrue('Spam' in cid) - self.assertTrue('spam' in cid) - self.assertTrue('SPAM' in cid) - self.assertTrue('sPam' in cid) - self.assertFalse('notspam' in cid) - - def test_get(self): - cid = CaseInsensitiveDict() - cid['spam'] = 'oneval' - cid['SPAM'] = 'blueval' - self.assertEqual(cid.get('spam'), 'blueval') - self.assertEqual(cid.get('SPAM'), 'blueval') - self.assertEqual(cid.get('sPam'), 'blueval') - self.assertEqual(cid.get('notspam', 'default'), 'default') - - def test_update(self): - cid = CaseInsensitiveDict() - cid['spam'] = 'blueval' - cid.update({'sPam': 'notblueval'}) - self.assertEqual(cid['spam'], 'notblueval') - cid = CaseInsensitiveDict({'Foo': 'foo','BAr': 'bar'}) - cid.update({'fOO': 'anotherfoo', 'bAR': 'anotherbar'}) - self.assertEqual(len(cid), 2) - self.assertEqual(cid['foo'], 'anotherfoo') - self.assertEqual(cid['bar'], 'anotherbar') - - def test_update_retains_unchanged(self): - cid = CaseInsensitiveDict({'foo': 'foo', 'bar': 'bar'}) - cid.update({'foo': 'newfoo'}) - self.assertEquals(cid['bar'], 'bar') - - def test_iter(self): - cid = CaseInsensitiveDict({'Spam': 'spam', 'Eggs': 'eggs'}) - keys = frozenset(['Spam', 'Eggs']) - self.assertEqual(frozenset(iter(cid)), keys) - - def test_equality(self): - cid = CaseInsensitiveDict({'SPAM': 'blueval', 'Eggs': 'redval'}) - othercid = CaseInsensitiveDict({'spam': 'blueval', 'eggs': 'redval'}) - self.assertEqual(cid, othercid) - del othercid['spam'] - self.assertNotEqual(cid, othercid) - self.assertEqual(cid, {'spam': 'blueval', 'eggs': 'redval'}) - - def test_setdefault(self): - cid = CaseInsensitiveDict({'Spam': 'blueval'}) - self.assertEqual( - cid.setdefault('spam', 'notblueval'), - 'blueval' - ) - self.assertEqual( - cid.setdefault('notspam', 'notblueval'), - 'notblueval' - ) - - def test_lower_items(self): - cid = CaseInsensitiveDict({ - 'Accept': 'application/json', - 'user-Agent': 'requests', - }) - keyset = frozenset(lowerkey for lowerkey, v in cid.lower_items()) - lowerkeyset = frozenset(['accept', 'user-agent']) - self.assertEqual(keyset, lowerkeyset) - - def test_preserve_key_case(self): - cid = CaseInsensitiveDict({ - 'Accept': 'application/json', - 'user-Agent': 'requests', - }) - keyset = frozenset(['Accept', 'user-Agent']) - self.assertEqual(frozenset(i[0] for i in cid.items()), keyset) - self.assertEqual(frozenset(cid.keys()), keyset) - self.assertEqual(frozenset(cid), keyset) - - def test_preserve_last_key_case(self): - cid = CaseInsensitiveDict({ - 'Accept': 'application/json', - 'user-Agent': 'requests', - }) - cid.update({'ACCEPT': 'application/json'}) - cid['USER-AGENT'] = 'requests' - keyset = frozenset(['ACCEPT', 'USER-AGENT']) - self.assertEqual(frozenset(i[0] for i in cid.items()), keyset) - self.assertEqual(frozenset(cid.keys()), keyset) - self.assertEqual(frozenset(cid), keyset) - - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100755 index 0000000..9be94bc --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +"""Requests test package initialisation.""" + +import warnings + +import urllib3 +from urllib3.exceptions import SNIMissingWarning + +# urllib3 sets SNIMissingWarning to only go off once, +# while this test suite requires it to always fire +# so that it occurs during test_requests.test_https_warnings +warnings.simplefilter('always', SNIMissingWarning) diff --git a/tests/compat.py b/tests/compat.py new file mode 100755 index 0000000..f68e801 --- /dev/null +++ b/tests/compat.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from requests.compat import is_py3 + + +try: + import StringIO +except ImportError: + import io as StringIO + +try: + from cStringIO import StringIO as cStringIO +except ImportError: + cStringIO = None + +if is_py3: + def u(s): + return s +else: + def u(s): + return s.decode('unicode-escape') diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100755 index 0000000..cd64a76 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +import pytest +from requests.compat import urljoin + + +def prepare_url(value): + # Issue #1483: Make sure the URL always has a trailing slash + httpbin_url = value.url.rstrip('/') + '/' + + def inner(*suffix): + return urljoin(httpbin_url, '/'.join(suffix)) + + return inner + + +@pytest.fixture +def httpbin(httpbin): + return prepare_url(httpbin) + + +@pytest.fixture +def httpbin_secure(httpbin_secure): + return prepare_url(httpbin_secure) diff --git a/tests/test_help.py b/tests/test_help.py new file mode 100755 index 0000000..c11d43f --- /dev/null +++ b/tests/test_help.py @@ -0,0 +1,40 @@ +# -*- encoding: utf-8 + +import sys + +import pytest + +from requests.help import info + + +@pytest.mark.skipif(sys.version_info[:2] != (2,6), reason="Only run on Python 2.6") +def test_system_ssl_py26(): + """OPENSSL_VERSION_NUMBER isn't provided in Python 2.6, verify we don't + blow up in this case. + """ + assert info()['system_ssl'] == {'version': ''} + + +@pytest.mark.skipif(sys.version_info < (2,7), reason="Only run on Python 2.7+") +def test_system_ssl(): + """Verify we're actually setting system_ssl when it should be available.""" + assert info()['system_ssl']['version'] != '' + + +class VersionedPackage(object): + def __init__(self, version): + self.__version__ = version + + +def test_idna_without_version_attribute(mocker): + """Older versions of IDNA don't provide a __version__ attribute, verify + that if we have such a package, we don't blow up. + """ + mocker.patch('requests.help.idna', new=None) + assert info()['idna'] == {'version': ''} + + +def test_idna_with_version_attribute(mocker): + """Verify we're actually setting idna version when it should be available.""" + mocker.patch('requests.help.idna', new=VersionedPackage('2.6')) + assert info()['idna'] == {'version': '2.6'} diff --git a/tests/test_hooks.py b/tests/test_hooks.py new file mode 100755 index 0000000..014b439 --- /dev/null +++ b/tests/test_hooks.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +import pytest + +from requests import hooks + + +def hook(value): + return value[1:] + + +@pytest.mark.parametrize( + 'hooks_list, result', ( + (hook, 'ata'), + ([hook, lambda x: None, hook], 'ta'), + ) +) +def test_hooks(hooks_list, result): + assert hooks.dispatch_hook('response', {'response': hooks_list}, 'Data') == result + + +def test_default_hooks(): + assert hooks.default_hooks() == {'response': []} diff --git a/tests/test_lowlevel.py b/tests/test_lowlevel.py new file mode 100755 index 0000000..c87234b --- /dev/null +++ b/tests/test_lowlevel.py @@ -0,0 +1,237 @@ +# -*- coding: utf-8 -*- + +import pytest +import threading +import requests + +from tests.testserver.server import Server, consume_socket_content + +from .utils import override_environ + + +def test_chunked_upload(): + """can safely send generators""" + close_server = threading.Event() + server = Server.basic_response_server(wait_to_close_event=close_server) + data = iter([b'a', b'b', b'c']) + + with server as (host, port): + url = 'http://{0}:{1}/'.format(host, port) + r = requests.post(url, data=data, stream=True) + close_server.set() # release server block + + assert r.status_code == 200 + assert r.request.headers['Transfer-Encoding'] == 'chunked' + + +def test_digestauth_401_count_reset_on_redirect(): + """Ensure we correctly reset num_401_calls after a successful digest auth, + followed by a 302 redirect to another digest auth prompt. + + See https://github.com/requests/requests/issues/1979. + """ + text_401 = (b'HTTP/1.1 401 UNAUTHORIZED\r\n' + b'Content-Length: 0\r\n' + b'WWW-Authenticate: Digest nonce="6bf5d6e4da1ce66918800195d6b9130d"' + b', opaque="372825293d1c26955496c80ed6426e9e", ' + b'realm="me@kennethreitz.com", qop=auth\r\n\r\n') + + text_302 = (b'HTTP/1.1 302 FOUND\r\n' + b'Content-Length: 0\r\n' + b'Location: /\r\n\r\n') + + text_200 = (b'HTTP/1.1 200 OK\r\n' + b'Content-Length: 0\r\n\r\n') + + expected_digest = (b'Authorization: Digest username="user", ' + b'realm="me@kennethreitz.com", ' + b'nonce="6bf5d6e4da1ce66918800195d6b9130d", uri="/"') + + auth = requests.auth.HTTPDigestAuth('user', 'pass') + + def digest_response_handler(sock): + # Respond to initial GET with a challenge. + request_content = consume_socket_content(sock, timeout=0.5) + assert request_content.startswith(b"GET / HTTP/1.1") + sock.send(text_401) + + # Verify we receive an Authorization header in response, then redirect. + request_content = consume_socket_content(sock, timeout=0.5) + assert expected_digest in request_content + sock.send(text_302) + + # Verify Authorization isn't sent to the redirected host, + # then send another challenge. + request_content = consume_socket_content(sock, timeout=0.5) + assert b'Authorization:' not in request_content + sock.send(text_401) + + # Verify Authorization is sent correctly again, and return 200 OK. + request_content = consume_socket_content(sock, timeout=0.5) + assert expected_digest in request_content + sock.send(text_200) + + return request_content + + close_server = threading.Event() + server = Server(digest_response_handler, wait_to_close_event=close_server) + + with server as (host, port): + url = 'http://{0}:{1}/'.format(host, port) + r = requests.get(url, auth=auth) + # Verify server succeeded in authenticating. + assert r.status_code == 200 + # Verify Authorization was sent in final request. + assert 'Authorization' in r.request.headers + assert r.request.headers['Authorization'].startswith('Digest ') + # Verify redirect happened as we expected. + assert r.history[0].status_code == 302 + close_server.set() + + +def test_digestauth_401_only_sent_once(): + """Ensure we correctly respond to a 401 challenge once, and then + stop responding if challenged again. + """ + text_401 = (b'HTTP/1.1 401 UNAUTHORIZED\r\n' + b'Content-Length: 0\r\n' + b'WWW-Authenticate: Digest nonce="6bf5d6e4da1ce66918800195d6b9130d"' + b', opaque="372825293d1c26955496c80ed6426e9e", ' + b'realm="me@kennethreitz.com", qop=auth\r\n\r\n') + + expected_digest = (b'Authorization: Digest username="user", ' + b'realm="me@kennethreitz.com", ' + b'nonce="6bf5d6e4da1ce66918800195d6b9130d", uri="/"') + + auth = requests.auth.HTTPDigestAuth('user', 'pass') + + def digest_failed_response_handler(sock): + # Respond to initial GET with a challenge. + request_content = consume_socket_content(sock, timeout=0.5) + assert request_content.startswith(b"GET / HTTP/1.1") + sock.send(text_401) + + # Verify we receive an Authorization header in response, then + # challenge again. + request_content = consume_socket_content(sock, timeout=0.5) + assert expected_digest in request_content + sock.send(text_401) + + # Verify the client didn't respond to second challenge. + request_content = consume_socket_content(sock, timeout=0.5) + assert request_content == b'' + + return request_content + + close_server = threading.Event() + server = Server(digest_failed_response_handler, wait_to_close_event=close_server) + + with server as (host, port): + url = 'http://{0}:{1}/'.format(host, port) + r = requests.get(url, auth=auth) + # Verify server didn't authenticate us. + assert r.status_code == 401 + assert r.history[0].status_code == 401 + close_server.set() + + +def test_digestauth_only_on_4xx(): + """Ensure we only send digestauth on 4xx challenges. + + See https://github.com/requests/requests/issues/3772. + """ + text_200_chal = (b'HTTP/1.1 200 OK\r\n' + b'Content-Length: 0\r\n' + b'WWW-Authenticate: Digest nonce="6bf5d6e4da1ce66918800195d6b9130d"' + b', opaque="372825293d1c26955496c80ed6426e9e", ' + b'realm="me@kennethreitz.com", qop=auth\r\n\r\n') + + auth = requests.auth.HTTPDigestAuth('user', 'pass') + + def digest_response_handler(sock): + # Respond to GET with a 200 containing www-authenticate header. + request_content = consume_socket_content(sock, timeout=0.5) + assert request_content.startswith(b"GET / HTTP/1.1") + sock.send(text_200_chal) + + # Verify the client didn't respond with auth. + request_content = consume_socket_content(sock, timeout=0.5) + assert request_content == b'' + + return request_content + + close_server = threading.Event() + server = Server(digest_response_handler, wait_to_close_event=close_server) + + with server as (host, port): + url = 'http://{0}:{1}/'.format(host, port) + r = requests.get(url, auth=auth) + # Verify server didn't receive auth from us. + assert r.status_code == 200 + assert len(r.history) == 0 + close_server.set() + + +_schemes_by_var_prefix = [ + ('http', ['http']), + ('https', ['https']), + ('all', ['http', 'https']), +] + +_proxy_combos = [] +for prefix, schemes in _schemes_by_var_prefix: + for scheme in schemes: + _proxy_combos.append(("{0}_proxy".format(prefix), scheme)) + +_proxy_combos += [(var.upper(), scheme) for var, scheme in _proxy_combos] + + +@pytest.mark.parametrize("var,scheme", _proxy_combos) +def test_use_proxy_from_environment(httpbin, var, scheme): + url = "{0}://httpbin.org".format(scheme) + fake_proxy = Server() # do nothing with the requests; just close the socket + with fake_proxy as (host, port): + proxy_url = "socks5://{0}:{1}".format(host, port) + kwargs = {var: proxy_url} + with override_environ(**kwargs): + # fake proxy's lack of response will cause a ConnectionError + with pytest.raises(requests.exceptions.ConnectionError): + requests.get(url) + + # the fake proxy received a request + assert len(fake_proxy.handler_results) == 1 + + # it had actual content (not checking for SOCKS protocol for now) + assert len(fake_proxy.handler_results[0]) > 0 + + +def test_redirect_rfc1808_to_non_ascii_location(): + path = u'š' + expected_path = b'%C5%A1' + redirect_request = [] # stores the second request to the server + + def redirect_resp_handler(sock): + consume_socket_content(sock, timeout=0.5) + location = u'//{0}:{1}/{2}'.format(host, port, path) + sock.send( + b'HTTP/1.1 301 Moved Permanently\r\n' + b'Content-Length: 0\r\n' + b'Location: ' + location.encode('utf8') + b'\r\n' + b'\r\n' + ) + redirect_request.append(consume_socket_content(sock, timeout=0.5)) + sock.send(b'HTTP/1.1 200 OK\r\n\r\n') + + close_server = threading.Event() + server = Server(redirect_resp_handler, wait_to_close_event=close_server) + + with server as (host, port): + url = u'http://{0}:{1}'.format(host, port) + r = requests.get(url=url, allow_redirects=True) + assert r.status_code == 200 + assert len(r.history) == 1 + assert r.history[0].status_code == 301 + assert redirect_request[0].startswith(b'GET /' + expected_path + b' HTTP/1.1') + assert r.url == u'{0}/{1}'.format(url, expected_path.decode('ascii')) + + close_server.set() diff --git a/tests/test_packages.py b/tests/test_packages.py new file mode 100755 index 0000000..b55cb68 --- /dev/null +++ b/tests/test_packages.py @@ -0,0 +1,13 @@ +import requests + + +def test_can_access_urllib3_attribute(): + requests.packages.urllib3 + + +def test_can_access_idna_attribute(): + requests.packages.idna + + +def test_can_access_chardet_attribute(): + requests.packages.chardet diff --git a/tests/test_requests.py b/tests/test_requests.py new file mode 100755 index 0000000..a2b2213 --- /dev/null +++ b/tests/test_requests.py @@ -0,0 +1,2389 @@ +# -*- coding: utf-8 -*- + +"""Tests for Requests.""" + +from __future__ import division +import json +import os +import pickle +import collections +import contextlib +import warnings + +import io +import requests +import pytest +from requests.adapters import HTTPAdapter +from requests.auth import HTTPDigestAuth, _basic_auth_str +from requests.compat import ( + Morsel, cookielib, getproxies, str, urlparse, + builtin_str, OrderedDict) +from requests.cookies import ( + cookiejar_from_dict, morsel_to_cookie) +from requests.exceptions import ( + ConnectionError, ConnectTimeout, InvalidSchema, InvalidURL, + MissingSchema, ReadTimeout, Timeout, RetryError, TooManyRedirects, + ProxyError, InvalidHeader, UnrewindableBodyError, SSLError) +from requests.models import PreparedRequest +from requests.structures import CaseInsensitiveDict +from requests.sessions import SessionRedirectMixin +from requests.models import urlencode +from requests.hooks import default_hooks + +from .compat import StringIO, u +from .utils import override_environ +from urllib3.util import Timeout as Urllib3Timeout + +# Requests to this URL should always fail with a connection timeout (nothing +# listening on that port) +TARPIT = 'http://10.255.255.1' + +try: + from ssl import SSLContext + del SSLContext + HAS_MODERN_SSL = True +except ImportError: + HAS_MODERN_SSL = False + +try: + requests.pyopenssl + HAS_PYOPENSSL = True +except AttributeError: + HAS_PYOPENSSL = False + + +class TestRequests: + + def test_entry_points(self): + + requests.session + requests.session().get + requests.session().head + requests.get + requests.head + requests.put + requests.patch + requests.post + # Not really an entry point, but people rely on it. + from requests.packages.urllib3.poolmanager import PoolManager + + @pytest.mark.parametrize( + 'exception, url', ( + (MissingSchema, 'hiwpefhipowhefopw'), + (InvalidSchema, 'localhost:3128'), + (InvalidSchema, 'localhost.localdomain:3128/'), + (InvalidSchema, '10.122.1.1:3128/'), + (InvalidURL, 'http://'), + )) + def test_invalid_url(self, exception, url): + with pytest.raises(exception): + requests.get(url) + + def test_basic_building(self): + req = requests.Request() + req.url = 'http://kennethreitz.org/' + req.data = {'life': '42'} + + pr = req.prepare() + assert pr.url == req.url + assert pr.body == 'life=42' + + @pytest.mark.parametrize('method', ('GET', 'HEAD')) + def test_no_content_length(self, httpbin, method): + req = requests.Request(method, httpbin(method.lower())).prepare() + assert 'Content-Length' not in req.headers + + @pytest.mark.parametrize('method', ('POST', 'PUT', 'PATCH', 'OPTIONS')) + def test_no_body_content_length(self, httpbin, method): + req = requests.Request(method, httpbin(method.lower())).prepare() + assert req.headers['Content-Length'] == '0' + + @pytest.mark.parametrize('method', ('POST', 'PUT', 'PATCH', 'OPTIONS')) + def test_empty_content_length(self, httpbin, method): + req = requests.Request(method, httpbin(method.lower()), data='').prepare() + assert req.headers['Content-Length'] == '0' + + def test_override_content_length(self, httpbin): + headers = { + 'Content-Length': 'not zero' + } + r = requests.Request('POST', httpbin('post'), headers=headers).prepare() + assert 'Content-Length' in r.headers + assert r.headers['Content-Length'] == 'not zero' + + def test_path_is_not_double_encoded(self): + request = requests.Request('GET', "http://0.0.0.0/get/test case").prepare() + + assert request.path_url == '/get/test%20case' + + @pytest.mark.parametrize( + 'url, expected', ( + ('http://example.com/path#fragment', 'http://example.com/path?a=b#fragment'), + ('http://example.com/path?key=value#fragment', 'http://example.com/path?key=value&a=b#fragment') + )) + def test_params_are_added_before_fragment(self, url, expected): + request = requests.Request('GET', url, params={"a": "b"}).prepare() + assert request.url == expected + + def test_params_original_order_is_preserved_by_default(self): + param_ordered_dict = OrderedDict((('z', 1), ('a', 1), ('k', 1), ('d', 1))) + session = requests.Session() + request = requests.Request('GET', 'http://example.com/', params=param_ordered_dict) + prep = session.prepare_request(request) + assert prep.url == 'http://example.com/?z=1&a=1&k=1&d=1' + + def test_params_bytes_are_encoded(self): + request = requests.Request('GET', 'http://example.com', + params=b'test=foo').prepare() + assert request.url == 'http://example.com/?test=foo' + + def test_binary_put(self): + request = requests.Request('PUT', 'http://example.com', + data=u"ööö".encode("utf-8")).prepare() + assert isinstance(request.body, bytes) + + def test_whitespaces_are_removed_from_url(self): + # Test for issue #3696 + request = requests.Request('GET', ' http://example.com').prepare() + assert request.url == 'http://example.com/' + + @pytest.mark.parametrize('scheme', ('http://', 'HTTP://', 'hTTp://', 'HttP://')) + def test_mixed_case_scheme_acceptable(self, httpbin, scheme): + s = requests.Session() + s.proxies = getproxies() + parts = urlparse(httpbin('get')) + url = scheme + parts.netloc + parts.path + r = requests.Request('GET', url) + r = s.send(r.prepare()) + assert r.status_code == 200, 'failed for scheme {0}'.format(scheme) + + def test_HTTP_200_OK_GET_ALTERNATIVE(self, httpbin): + r = requests.Request('GET', httpbin('get')) + s = requests.Session() + s.proxies = getproxies() + + r = s.send(r.prepare()) + + assert r.status_code == 200 + + def test_HTTP_302_ALLOW_REDIRECT_GET(self, httpbin): + r = requests.get(httpbin('redirect', '1')) + assert r.status_code == 200 + assert r.history[0].status_code == 302 + assert r.history[0].is_redirect + + def test_HTTP_307_ALLOW_REDIRECT_POST(self, httpbin): + r = requests.post(httpbin('redirect-to'), data='test', params={'url': 'post', 'status_code': 307}) + assert r.status_code == 200 + assert r.history[0].status_code == 307 + assert r.history[0].is_redirect + assert r.json()['data'] == 'test' + + def test_HTTP_307_ALLOW_REDIRECT_POST_WITH_SEEKABLE(self, httpbin): + byte_str = b'test' + r = requests.post(httpbin('redirect-to'), data=io.BytesIO(byte_str), params={'url': 'post', 'status_code': 307}) + assert r.status_code == 200 + assert r.history[0].status_code == 307 + assert r.history[0].is_redirect + assert r.json()['data'] == byte_str.decode('utf-8') + + def test_HTTP_302_TOO_MANY_REDIRECTS(self, httpbin): + try: + requests.get(httpbin('relative-redirect', '50')) + except TooManyRedirects as e: + url = httpbin('relative-redirect', '20') + assert e.request.url == url + assert e.response.url == url + assert len(e.response.history) == 30 + else: + pytest.fail('Expected redirect to raise TooManyRedirects but it did not') + + def test_HTTP_302_TOO_MANY_REDIRECTS_WITH_PARAMS(self, httpbin): + s = requests.session() + s.max_redirects = 5 + try: + s.get(httpbin('relative-redirect', '50')) + except TooManyRedirects as e: + url = httpbin('relative-redirect', '45') + assert e.request.url == url + assert e.response.url == url + assert len(e.response.history) == 5 + else: + pytest.fail('Expected custom max number of redirects to be respected but was not') + + def test_http_301_changes_post_to_get(self, httpbin): + r = requests.post(httpbin('status', '301')) + assert r.status_code == 200 + assert r.request.method == 'GET' + assert r.history[0].status_code == 301 + assert r.history[0].is_redirect + + def test_http_301_doesnt_change_head_to_get(self, httpbin): + r = requests.head(httpbin('status', '301'), allow_redirects=True) + print(r.content) + assert r.status_code == 200 + assert r.request.method == 'HEAD' + assert r.history[0].status_code == 301 + assert r.history[0].is_redirect + + def test_http_302_changes_post_to_get(self, httpbin): + r = requests.post(httpbin('status', '302')) + assert r.status_code == 200 + assert r.request.method == 'GET' + assert r.history[0].status_code == 302 + assert r.history[0].is_redirect + + def test_http_302_doesnt_change_head_to_get(self, httpbin): + r = requests.head(httpbin('status', '302'), allow_redirects=True) + assert r.status_code == 200 + assert r.request.method == 'HEAD' + assert r.history[0].status_code == 302 + assert r.history[0].is_redirect + + def test_http_303_changes_post_to_get(self, httpbin): + r = requests.post(httpbin('status', '303')) + assert r.status_code == 200 + assert r.request.method == 'GET' + assert r.history[0].status_code == 303 + assert r.history[0].is_redirect + + def test_http_303_doesnt_change_head_to_get(self, httpbin): + r = requests.head(httpbin('status', '303'), allow_redirects=True) + assert r.status_code == 200 + assert r.request.method == 'HEAD' + assert r.history[0].status_code == 303 + assert r.history[0].is_redirect + + def test_header_and_body_removal_on_redirect(self, httpbin): + purged_headers = ('Content-Length', 'Content-Type') + ses = requests.Session() + req = requests.Request('POST', httpbin('post'), data={'test': 'data'}) + prep = ses.prepare_request(req) + resp = ses.send(prep) + + # Mimic a redirect response + resp.status_code = 302 + resp.headers['location'] = 'get' + + # Run request through resolve_redirects + next_resp = next(ses.resolve_redirects(resp, prep)) + assert next_resp.request.body is None + for header in purged_headers: + assert header not in next_resp.request.headers + + def test_transfer_enc_removal_on_redirect(self, httpbin): + purged_headers = ('Transfer-Encoding', 'Content-Type') + ses = requests.Session() + req = requests.Request('POST', httpbin('post'), data=(b'x' for x in range(1))) + prep = ses.prepare_request(req) + assert 'Transfer-Encoding' in prep.headers + + # Create Response to avoid https://github.com/kevin1024/pytest-httpbin/issues/33 + resp = requests.Response() + resp.raw = io.BytesIO(b'the content') + resp.request = prep + setattr(resp.raw, 'release_conn', lambda *args: args) + + # Mimic a redirect response + resp.status_code = 302 + resp.headers['location'] = httpbin('get') + + # Run request through resolve_redirect + next_resp = next(ses.resolve_redirects(resp, prep)) + assert next_resp.request.body is None + for header in purged_headers: + assert header not in next_resp.request.headers + + def test_HTTP_200_OK_GET_WITH_PARAMS(self, httpbin): + heads = {'User-agent': 'Mozilla/5.0'} + + r = requests.get(httpbin('user-agent'), headers=heads) + + assert heads['User-agent'] in r.text + assert r.status_code == 200 + + def test_HTTP_200_OK_GET_WITH_MIXED_PARAMS(self, httpbin): + heads = {'User-agent': 'Mozilla/5.0'} + + r = requests.get(httpbin('get') + '?test=true', params={'q': 'test'}, headers=heads) + assert r.status_code == 200 + + def test_set_cookie_on_301(self, httpbin): + s = requests.session() + url = httpbin('cookies/set?foo=bar') + s.get(url) + assert s.cookies['foo'] == 'bar' + + def test_cookie_sent_on_redirect(self, httpbin): + s = requests.session() + s.get(httpbin('cookies/set?foo=bar')) + r = s.get(httpbin('redirect/1')) # redirects to httpbin('get') + assert 'Cookie' in r.json()['headers'] + + def test_cookie_removed_on_expire(self, httpbin): + s = requests.session() + s.get(httpbin('cookies/set?foo=bar')) + assert s.cookies['foo'] == 'bar' + s.get( + httpbin('response-headers'), + params={ + 'Set-Cookie': + 'foo=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT' + } + ) + assert 'foo' not in s.cookies + + def test_cookie_quote_wrapped(self, httpbin): + s = requests.session() + s.get(httpbin('cookies/set?foo="bar:baz"')) + assert s.cookies['foo'] == '"bar:baz"' + + def test_cookie_persists_via_api(self, httpbin): + s = requests.session() + r = s.get(httpbin('redirect/1'), cookies={'foo': 'bar'}) + assert 'foo' in r.request.headers['Cookie'] + assert 'foo' in r.history[0].request.headers['Cookie'] + + def test_request_cookie_overrides_session_cookie(self, httpbin): + s = requests.session() + s.cookies['foo'] = 'bar' + r = s.get(httpbin('cookies'), cookies={'foo': 'baz'}) + assert r.json()['cookies']['foo'] == 'baz' + # Session cookie should not be modified + assert s.cookies['foo'] == 'bar' + + def test_request_cookies_not_persisted(self, httpbin): + s = requests.session() + s.get(httpbin('cookies'), cookies={'foo': 'baz'}) + # Sending a request with cookies should not add cookies to the session + assert not s.cookies + + def test_generic_cookiejar_works(self, httpbin): + cj = cookielib.CookieJar() + cookiejar_from_dict({'foo': 'bar'}, cj) + s = requests.session() + s.cookies = cj + r = s.get(httpbin('cookies')) + # Make sure the cookie was sent + assert r.json()['cookies']['foo'] == 'bar' + # Make sure the session cj is still the custom one + assert s.cookies is cj + + def test_param_cookiejar_works(self, httpbin): + cj = cookielib.CookieJar() + cookiejar_from_dict({'foo': 'bar'}, cj) + s = requests.session() + r = s.get(httpbin('cookies'), cookies=cj) + # Make sure the cookie was sent + assert r.json()['cookies']['foo'] == 'bar' + + def test_cookielib_cookiejar_on_redirect(self, httpbin): + """Tests resolve_redirect doesn't fail when merging cookies + with non-RequestsCookieJar cookiejar. + + See GH #3579 + """ + cj = cookiejar_from_dict({'foo': 'bar'}, cookielib.CookieJar()) + s = requests.Session() + s.cookies = cookiejar_from_dict({'cookie': 'tasty'}) + + # Prepare request without using Session + req = requests.Request('GET', httpbin('headers'), cookies=cj) + prep_req = req.prepare() + + # Send request and simulate redirect + resp = s.send(prep_req) + resp.status_code = 302 + resp.headers['location'] = httpbin('get') + redirects = s.resolve_redirects(resp, prep_req) + resp = next(redirects) + + # Verify CookieJar isn't being converted to RequestsCookieJar + assert isinstance(prep_req._cookies, cookielib.CookieJar) + assert isinstance(resp.request._cookies, cookielib.CookieJar) + assert not isinstance(resp.request._cookies, requests.cookies.RequestsCookieJar) + + cookies = {} + for c in resp.request._cookies: + cookies[c.name] = c.value + assert cookies['foo'] == 'bar' + assert cookies['cookie'] == 'tasty' + + def test_requests_in_history_are_not_overridden(self, httpbin): + resp = requests.get(httpbin('redirect/3')) + urls = [r.url for r in resp.history] + req_urls = [r.request.url for r in resp.history] + assert urls == req_urls + + def test_history_is_always_a_list(self, httpbin): + """Show that even with redirects, Response.history is always a list.""" + resp = requests.get(httpbin('get')) + assert isinstance(resp.history, list) + resp = requests.get(httpbin('redirect/1')) + assert isinstance(resp.history, list) + assert not isinstance(resp.history, tuple) + + def test_headers_on_session_with_None_are_not_sent(self, httpbin): + """Do not send headers in Session.headers with None values.""" + ses = requests.Session() + ses.headers['Accept-Encoding'] = None + req = requests.Request('GET', httpbin('get')) + prep = ses.prepare_request(req) + assert 'Accept-Encoding' not in prep.headers + + def test_headers_preserve_order(self, httpbin): + """Preserve order when headers provided as OrderedDict.""" + ses = requests.Session() + ses.headers = OrderedDict() + ses.headers['Accept-Encoding'] = 'identity' + ses.headers['First'] = '1' + ses.headers['Second'] = '2' + headers = OrderedDict([('Third', '3'), ('Fourth', '4')]) + headers['Fifth'] = '5' + headers['Second'] = '222' + req = requests.Request('GET', httpbin('get'), headers=headers) + prep = ses.prepare_request(req) + items = list(prep.headers.items()) + assert items[0] == ('Accept-Encoding', 'identity') + assert items[1] == ('First', '1') + assert items[2] == ('Second', '222') + assert items[3] == ('Third', '3') + assert items[4] == ('Fourth', '4') + assert items[5] == ('Fifth', '5') + + @pytest.mark.parametrize('key', ('User-agent', 'user-agent')) + def test_user_agent_transfers(self, httpbin, key): + + heads = {key: 'Mozilla/5.0 (github.com/requests/requests)'} + + r = requests.get(httpbin('user-agent'), headers=heads) + assert heads[key] in r.text + + def test_HTTP_200_OK_HEAD(self, httpbin): + r = requests.head(httpbin('get')) + assert r.status_code == 200 + + def test_HTTP_200_OK_PUT(self, httpbin): + r = requests.put(httpbin('put')) + assert r.status_code == 200 + + def test_BASICAUTH_TUPLE_HTTP_200_OK_GET(self, httpbin): + auth = ('user', 'pass') + url = httpbin('basic-auth', 'user', 'pass') + + r = requests.get(url, auth=auth) + assert r.status_code == 200 + + r = requests.get(url) + assert r.status_code == 401 + + s = requests.session() + s.auth = auth + r = s.get(url) + assert r.status_code == 200 + + @pytest.mark.parametrize( + 'username, password', ( + ('user', 'pass'), + (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8')), + (42, 42), + (None, None), + )) + def test_set_basicauth(self, httpbin, username, password): + auth = (username, password) + url = httpbin('get') + + r = requests.Request('GET', url, auth=auth) + p = r.prepare() + + assert p.headers['Authorization'] == _basic_auth_str(username, password) + + def test_basicauth_encodes_byte_strings(self): + """Ensure b'test' formats as the byte string "test" rather + than the unicode string "b'test'" in Python 3. + """ + auth = (b'\xc5\xafsername', b'test\xc6\xb6') + r = requests.Request('GET', 'http://localhost', auth=auth) + p = r.prepare() + + assert p.headers['Authorization'] == 'Basic xa9zZXJuYW1lOnRlc3TGtg==' + + @pytest.mark.parametrize( + 'url, exception', ( + # Connecting to an unknown domain should raise a ConnectionError + ('http://doesnotexist.google.com', ConnectionError), + # Connecting to an invalid port should raise a ConnectionError + ('http://localhost:1', ConnectionError), + # Inputing a URL that cannot be parsed should raise an InvalidURL error + ('http://fe80::5054:ff:fe5a:fc0', InvalidURL) + )) + def test_errors(self, url, exception): + with pytest.raises(exception): + requests.get(url, timeout=1) + + def test_proxy_error(self): + # any proxy related error (address resolution, no route to host, etc) should result in a ProxyError + with pytest.raises(ProxyError): + requests.get('http://localhost:1', proxies={'http': 'non-resolvable-address'}) + + def test_basicauth_with_netrc(self, httpbin): + auth = ('user', 'pass') + wrong_auth = ('wronguser', 'wrongpass') + url = httpbin('basic-auth', 'user', 'pass') + + old_auth = requests.sessions.get_netrc_auth + + try: + def get_netrc_auth_mock(url): + return auth + requests.sessions.get_netrc_auth = get_netrc_auth_mock + + # Should use netrc and work. + r = requests.get(url) + assert r.status_code == 200 + + # Given auth should override and fail. + r = requests.get(url, auth=wrong_auth) + assert r.status_code == 401 + + s = requests.session() + + # Should use netrc and work. + r = s.get(url) + assert r.status_code == 200 + + # Given auth should override and fail. + s.auth = wrong_auth + r = s.get(url) + assert r.status_code == 401 + finally: + requests.sessions.get_netrc_auth = old_auth + + def test_DIGEST_HTTP_200_OK_GET(self, httpbin): + + auth = HTTPDigestAuth('user', 'pass') + url = httpbin('digest-auth', 'auth', 'user', 'pass') + + r = requests.get(url, auth=auth) + assert r.status_code == 200 + + r = requests.get(url) + assert r.status_code == 401 + + s = requests.session() + s.auth = HTTPDigestAuth('user', 'pass') + r = s.get(url) + assert r.status_code == 200 + + def test_DIGEST_AUTH_RETURNS_COOKIE(self, httpbin): + url = httpbin('digest-auth', 'auth', 'user', 'pass') + auth = HTTPDigestAuth('user', 'pass') + r = requests.get(url) + assert r.cookies['fake'] == 'fake_value' + + r = requests.get(url, auth=auth) + assert r.status_code == 200 + + def test_DIGEST_AUTH_SETS_SESSION_COOKIES(self, httpbin): + url = httpbin('digest-auth', 'auth', 'user', 'pass') + auth = HTTPDigestAuth('user', 'pass') + s = requests.Session() + s.get(url, auth=auth) + assert s.cookies['fake'] == 'fake_value' + + def test_DIGEST_STREAM(self, httpbin): + + auth = HTTPDigestAuth('user', 'pass') + url = httpbin('digest-auth', 'auth', 'user', 'pass') + + r = requests.get(url, auth=auth, stream=True) + assert r.raw.read() != b'' + + r = requests.get(url, auth=auth, stream=False) + assert r.raw.read() == b'' + + def test_DIGESTAUTH_WRONG_HTTP_401_GET(self, httpbin): + + auth = HTTPDigestAuth('user', 'wrongpass') + url = httpbin('digest-auth', 'auth', 'user', 'pass') + + r = requests.get(url, auth=auth) + assert r.status_code == 401 + + r = requests.get(url) + assert r.status_code == 401 + + s = requests.session() + s.auth = auth + r = s.get(url) + assert r.status_code == 401 + + def test_DIGESTAUTH_QUOTES_QOP_VALUE(self, httpbin): + + auth = HTTPDigestAuth('user', 'pass') + url = httpbin('digest-auth', 'auth', 'user', 'pass') + + r = requests.get(url, auth=auth) + assert '"auth"' in r.request.headers['Authorization'] + + def test_POSTBIN_GET_POST_FILES(self, httpbin): + + url = httpbin('post') + requests.post(url).raise_for_status() + + post1 = requests.post(url, data={'some': 'data'}) + assert post1.status_code == 200 + + with open('requirements.txt') as f: + post2 = requests.post(url, files={'some': f}) + assert post2.status_code == 200 + + post4 = requests.post(url, data='[{"some": "json"}]') + assert post4.status_code == 200 + + with pytest.raises(ValueError): + requests.post(url, files=['bad file data']) + + def test_POSTBIN_SEEKED_OBJECT_WITH_NO_ITER(self, httpbin): + + class TestStream(object): + def __init__(self, data): + self.data = data.encode() + self.length = len(self.data) + self.index = 0 + + def __len__(self): + return self.length + + def read(self, size=None): + if size: + ret = self.data[self.index:self.index + size] + self.index += size + else: + ret = self.data[self.index:] + self.index = self.length + return ret + + def tell(self): + return self.index + + def seek(self, offset, where=0): + if where == 0: + self.index = offset + elif where == 1: + self.index += offset + elif where == 2: + self.index = self.length + offset + + test = TestStream('test') + post1 = requests.post(httpbin('post'), data=test) + assert post1.status_code == 200 + assert post1.json()['data'] == 'test' + + test = TestStream('test') + test.seek(2) + post2 = requests.post(httpbin('post'), data=test) + assert post2.status_code == 200 + assert post2.json()['data'] == 'st' + + def test_POSTBIN_GET_POST_FILES_WITH_DATA(self, httpbin): + + url = httpbin('post') + requests.post(url).raise_for_status() + + post1 = requests.post(url, data={'some': 'data'}) + assert post1.status_code == 200 + + with open('requirements.txt') as f: + post2 = requests.post(url, data={'some': 'data'}, files={'some': f}) + assert post2.status_code == 200 + + post4 = requests.post(url, data='[{"some": "json"}]') + assert post4.status_code == 200 + + with pytest.raises(ValueError): + requests.post(url, files=['bad file data']) + + def test_post_with_custom_mapping(self, httpbin): + class CustomMapping(collections.MutableMapping): + def __init__(self, *args, **kwargs): + self.data = dict(*args, **kwargs) + + def __delitem__(self, key): + del self.data[key] + + def __getitem__(self, key): + return self.data[key] + + def __setitem__(self, key, value): + self.data[key] = value + + def __iter__(self): + return iter(self.data) + + def __len__(self): + return len(self.data) + + data = CustomMapping({'some': 'data'}) + url = httpbin('post') + found_json = requests.post(url, data=data).json().get('form') + assert found_json == {'some': 'data'} + + def test_conflicting_post_params(self, httpbin): + url = httpbin('post') + with open('requirements.txt') as f: + pytest.raises(ValueError, "requests.post(url, data='[{\"some\": \"data\"}]', files={'some': f})") + pytest.raises(ValueError, "requests.post(url, data=u('[{\"some\": \"data\"}]'), files={'some': f})") + + def test_request_ok_set(self, httpbin): + r = requests.get(httpbin('status', '404')) + assert not r.ok + + def test_status_raising(self, httpbin): + r = requests.get(httpbin('status', '404')) + with pytest.raises(requests.exceptions.HTTPError): + r.raise_for_status() + + r = requests.get(httpbin('status', '500')) + assert not r.ok + + def test_decompress_gzip(self, httpbin): + r = requests.get(httpbin('gzip')) + r.content.decode('ascii') + + @pytest.mark.parametrize( + 'url, params', ( + ('/get', {'foo': 'føø'}), + ('/get', {'føø': 'føø'}), + ('/get', {'føø': 'føø'}), + ('/get', {'foo': 'foo'}), + ('ø', {'foo': 'foo'}), + )) + def test_unicode_get(self, httpbin, url, params): + requests.get(httpbin(url), params=params) + + def test_unicode_header_name(self, httpbin): + requests.put( + httpbin('put'), + headers={str('Content-Type'): 'application/octet-stream'}, + data='\xff') # compat.str is unicode. + + def test_pyopenssl_redirect(self, httpbin_secure, httpbin_ca_bundle): + requests.get(httpbin_secure('status', '301'), verify=httpbin_ca_bundle) + + def test_invalid_ca_certificate_path(self, httpbin_secure): + INVALID_PATH = '/garbage' + with pytest.raises(IOError) as e: + requests.get(httpbin_secure(), verify=INVALID_PATH) + assert str(e.value) == 'Could not find a suitable TLS CA certificate bundle, invalid path: {0}'.format(INVALID_PATH) + + def test_invalid_ssl_certificate_files(self, httpbin_secure): + INVALID_PATH = '/garbage' + with pytest.raises(IOError) as e: + requests.get(httpbin_secure(), cert=INVALID_PATH) + assert str(e.value) == 'Could not find the TLS certificate file, invalid path: {0}'.format(INVALID_PATH) + + with pytest.raises(IOError) as e: + requests.get(httpbin_secure(), cert=('.', INVALID_PATH)) + assert str(e.value) == 'Could not find the TLS key file, invalid path: {0}'.format(INVALID_PATH) + + def test_http_with_certificate(self, httpbin): + r = requests.get(httpbin(), cert='.') + assert r.status_code == 200 + + def test_https_warnings(self, httpbin_secure, httpbin_ca_bundle): + """warnings are emitted with requests.get""" + if HAS_MODERN_SSL or HAS_PYOPENSSL: + warnings_expected = ('SubjectAltNameWarning', ) + else: + warnings_expected = ('SNIMissingWarning', + 'InsecurePlatformWarning', + 'SubjectAltNameWarning', ) + + with pytest.warns(None) as warning_records: + warnings.simplefilter('always') + requests.get(httpbin_secure('status', '200'), + verify=httpbin_ca_bundle) + + warning_records = [item for item in warning_records + if item.category.__name__ != 'ResourceWarning'] + + warnings_category = tuple( + item.category.__name__ for item in warning_records) + assert warnings_category == warnings_expected + + def test_certificate_failure(self, httpbin_secure): + """ + When underlying SSL problems occur, an SSLError is raised. + """ + with pytest.raises(SSLError): + # Our local httpbin does not have a trusted CA, so this call will + # fail if we use our default trust bundle. + requests.get(httpbin_secure('status', '200')) + + def test_urlencoded_get_query_multivalued_param(self, httpbin): + + r = requests.get(httpbin('get'), params=dict(test=['foo', 'baz'])) + assert r.status_code == 200 + assert r.url == httpbin('get?test=foo&test=baz') + + def test_different_encodings_dont_break_post(self, httpbin): + r = requests.post(httpbin('post'), + data={'stuff': json.dumps({'a': 123})}, + params={'blah': 'asdf1234'}, + files={'file': ('test_requests.py', open(__file__, 'rb'))}) + assert r.status_code == 200 + + @pytest.mark.parametrize( + 'data', ( + {'stuff': u('ëlïxr')}, + {'stuff': u('ëlïxr').encode('utf-8')}, + {'stuff': 'elixr'}, + {'stuff': 'elixr'.encode('utf-8')}, + )) + def test_unicode_multipart_post(self, httpbin, data): + r = requests.post(httpbin('post'), + data=data, + files={'file': ('test_requests.py', open(__file__, 'rb'))}) + assert r.status_code == 200 + + def test_unicode_multipart_post_fieldnames(self, httpbin): + filename = os.path.splitext(__file__)[0] + '.py' + r = requests.Request( + method='POST', url=httpbin('post'), + data={'stuff'.encode('utf-8'): 'elixr'}, + files={'file': ('test_requests.py', open(filename, 'rb'))}) + prep = r.prepare() + assert b'name="stuff"' in prep.body + assert b'name="b\'stuff\'"' not in prep.body + + def test_unicode_method_name(self, httpbin): + files = {'file': open(__file__, 'rb')} + r = requests.request( + method=u('POST'), url=httpbin('post'), files=files) + assert r.status_code == 200 + + def test_unicode_method_name_with_request_object(self, httpbin): + files = {'file': open(__file__, 'rb')} + s = requests.Session() + req = requests.Request(u('POST'), httpbin('post'), files=files) + prep = s.prepare_request(req) + assert isinstance(prep.method, builtin_str) + assert prep.method == 'POST' + + resp = s.send(prep) + assert resp.status_code == 200 + + def test_non_prepared_request_error(self): + s = requests.Session() + req = requests.Request(u('POST'), '/') + + with pytest.raises(ValueError) as e: + s.send(req) + assert str(e.value) == 'You can only send PreparedRequests.' + + def test_custom_content_type(self, httpbin): + r = requests.post( + httpbin('post'), + data={'stuff': json.dumps({'a': 123})}, + files={ + 'file1': ('test_requests.py', open(__file__, 'rb')), + 'file2': ('test_requests', open(__file__, 'rb'), + 'text/py-content-type')}) + assert r.status_code == 200 + assert b"text/py-content-type" in r.request.body + + def test_hook_receives_request_arguments(self, httpbin): + def hook(resp, **kwargs): + assert resp is not None + assert kwargs != {} + + s = requests.Session() + r = requests.Request('GET', httpbin(), hooks={'response': hook}) + prep = s.prepare_request(r) + s.send(prep) + + def test_session_hooks_are_used_with_no_request_hooks(self, httpbin): + hook = lambda x, *args, **kwargs: x + s = requests.Session() + s.hooks['response'].append(hook) + r = requests.Request('GET', httpbin()) + prep = s.prepare_request(r) + assert prep.hooks['response'] != [] + assert prep.hooks['response'] == [hook] + + def test_session_hooks_are_overridden_by_request_hooks(self, httpbin): + hook1 = lambda x, *args, **kwargs: x + hook2 = lambda x, *args, **kwargs: x + assert hook1 is not hook2 + s = requests.Session() + s.hooks['response'].append(hook2) + r = requests.Request('GET', httpbin(), hooks={'response': [hook1]}) + prep = s.prepare_request(r) + assert prep.hooks['response'] == [hook1] + + def test_prepared_request_hook(self, httpbin): + def hook(resp, **kwargs): + resp.hook_working = True + return resp + + req = requests.Request('GET', httpbin(), hooks={'response': hook}) + prep = req.prepare() + + s = requests.Session() + s.proxies = getproxies() + resp = s.send(prep) + + assert hasattr(resp, 'hook_working') + + def test_prepared_from_session(self, httpbin): + class DummyAuth(requests.auth.AuthBase): + def __call__(self, r): + r.headers['Dummy-Auth-Test'] = 'dummy-auth-test-ok' + return r + + req = requests.Request('GET', httpbin('headers')) + assert not req.auth + + s = requests.Session() + s.auth = DummyAuth() + + prep = s.prepare_request(req) + resp = s.send(prep) + + assert resp.json()['headers'][ + 'Dummy-Auth-Test'] == 'dummy-auth-test-ok' + + def test_prepare_request_with_bytestring_url(self): + req = requests.Request('GET', b'https://httpbin.org/') + s = requests.Session() + prep = s.prepare_request(req) + assert prep.url == "https://httpbin.org/" + + def test_request_with_bytestring_host(self, httpbin): + s = requests.Session() + resp = s.request( + 'GET', + httpbin('cookies/set?cookie=value'), + allow_redirects=False, + headers={'Host': b'httpbin.org'} + ) + assert resp.cookies.get('cookie') == 'value' + + def test_links(self): + r = requests.Response() + r.headers = { + 'cache-control': 'public, max-age=60, s-maxage=60', + 'connection': 'keep-alive', + 'content-encoding': 'gzip', + 'content-type': 'application/json; charset=utf-8', + 'date': 'Sat, 26 Jan 2013 16:47:56 GMT', + 'etag': '"6ff6a73c0e446c1f61614769e3ceb778"', + 'last-modified': 'Sat, 26 Jan 2013 16:22:39 GMT', + 'link': ('; rel="next", ; ' + ' rel="last"'), + 'server': 'GitHub.com', + 'status': '200 OK', + 'vary': 'Accept', + 'x-content-type-options': 'nosniff', + 'x-github-media-type': 'github.beta', + 'x-ratelimit-limit': '60', + 'x-ratelimit-remaining': '57' + } + assert r.links['next']['rel'] == 'next' + + def test_cookie_parameters(self): + key = 'some_cookie' + value = 'some_value' + secure = True + domain = 'test.com' + rest = {'HttpOnly': True} + + jar = requests.cookies.RequestsCookieJar() + jar.set(key, value, secure=secure, domain=domain, rest=rest) + + assert len(jar) == 1 + assert 'some_cookie' in jar + + cookie = list(jar)[0] + assert cookie.secure == secure + assert cookie.domain == domain + assert cookie._rest['HttpOnly'] == rest['HttpOnly'] + + def test_cookie_as_dict_keeps_len(self): + key = 'some_cookie' + value = 'some_value' + + key1 = 'some_cookie1' + value1 = 'some_value1' + + jar = requests.cookies.RequestsCookieJar() + jar.set(key, value) + jar.set(key1, value1) + + d1 = dict(jar) + d2 = dict(jar.iteritems()) + d3 = dict(jar.items()) + + assert len(jar) == 2 + assert len(d1) == 2 + assert len(d2) == 2 + assert len(d3) == 2 + + def test_cookie_as_dict_keeps_items(self): + key = 'some_cookie' + value = 'some_value' + + key1 = 'some_cookie1' + value1 = 'some_value1' + + jar = requests.cookies.RequestsCookieJar() + jar.set(key, value) + jar.set(key1, value1) + + d1 = dict(jar) + d2 = dict(jar.iteritems()) + d3 = dict(jar.items()) + + assert d1['some_cookie'] == 'some_value' + assert d2['some_cookie'] == 'some_value' + assert d3['some_cookie1'] == 'some_value1' + + def test_cookie_as_dict_keys(self): + key = 'some_cookie' + value = 'some_value' + + key1 = 'some_cookie1' + value1 = 'some_value1' + + jar = requests.cookies.RequestsCookieJar() + jar.set(key, value) + jar.set(key1, value1) + + keys = jar.keys() + assert keys == list(keys) + # make sure one can use keys multiple times + assert list(keys) == list(keys) + + def test_cookie_as_dict_values(self): + key = 'some_cookie' + value = 'some_value' + + key1 = 'some_cookie1' + value1 = 'some_value1' + + jar = requests.cookies.RequestsCookieJar() + jar.set(key, value) + jar.set(key1, value1) + + values = jar.values() + assert values == list(values) + # make sure one can use values multiple times + assert list(values) == list(values) + + def test_cookie_as_dict_items(self): + key = 'some_cookie' + value = 'some_value' + + key1 = 'some_cookie1' + value1 = 'some_value1' + + jar = requests.cookies.RequestsCookieJar() + jar.set(key, value) + jar.set(key1, value1) + + items = jar.items() + assert items == list(items) + # make sure one can use items multiple times + assert list(items) == list(items) + + def test_cookie_duplicate_names_different_domains(self): + key = 'some_cookie' + value = 'some_value' + domain1 = 'test1.com' + domain2 = 'test2.com' + + jar = requests.cookies.RequestsCookieJar() + jar.set(key, value, domain=domain1) + jar.set(key, value, domain=domain2) + assert key in jar + items = jar.items() + assert len(items) == 2 + + # Verify that CookieConflictError is raised if domain is not specified + with pytest.raises(requests.cookies.CookieConflictError): + jar.get(key) + + # Verify that CookieConflictError is not raised if domain is specified + cookie = jar.get(key, domain=domain1) + assert cookie == value + + def test_cookie_duplicate_names_raises_cookie_conflict_error(self): + key = 'some_cookie' + value = 'some_value' + path = 'some_path' + + jar = requests.cookies.RequestsCookieJar() + jar.set(key, value, path=path) + jar.set(key, value) + with pytest.raises(requests.cookies.CookieConflictError): + jar.get(key) + + def test_time_elapsed_blank(self, httpbin): + r = requests.get(httpbin('get')) + td = r.elapsed + total_seconds = ((td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6) + assert total_seconds > 0.0 + + def test_empty_response_has_content_none(self): + r = requests.Response() + assert r.content is None + + def test_response_is_iterable(self): + r = requests.Response() + io = StringIO.StringIO('abc') + read_ = io.read + + def read_mock(amt, decode_content=None): + return read_(amt) + setattr(io, 'read', read_mock) + r.raw = io + assert next(iter(r)) + io.close() + + def test_response_decode_unicode(self): + """When called with decode_unicode, Response.iter_content should always + return unicode. + """ + r = requests.Response() + r._content_consumed = True + r._content = b'the content' + r.encoding = 'ascii' + + chunks = r.iter_content(decode_unicode=True) + assert all(isinstance(chunk, str) for chunk in chunks) + + # also for streaming + r = requests.Response() + r.raw = io.BytesIO(b'the content') + r.encoding = 'ascii' + chunks = r.iter_content(decode_unicode=True) + assert all(isinstance(chunk, str) for chunk in chunks) + + def test_response_reason_unicode(self): + # check for unicode HTTP status + r = requests.Response() + r.url = u'unicode URL' + r.reason = u'Komponenttia ei löydy'.encode('utf-8') + r.status_code = 404 + r.encoding = None + assert not r.ok # old behaviour - crashes here + + def test_response_reason_unicode_fallback(self): + # check raise_status falls back to ISO-8859-1 + r = requests.Response() + r.url = 'some url' + reason = u'Komponenttia ei löydy' + r.reason = reason.encode('latin-1') + r.status_code = 500 + r.encoding = None + with pytest.raises(requests.exceptions.HTTPError) as e: + r.raise_for_status() + assert reason in e.value.args[0] + + def test_response_chunk_size_type(self): + """Ensure that chunk_size is passed as None or an integer, otherwise + raise a TypeError. + """ + r = requests.Response() + r.raw = io.BytesIO(b'the content') + chunks = r.iter_content(1) + assert all(len(chunk) == 1 for chunk in chunks) + + r = requests.Response() + r.raw = io.BytesIO(b'the content') + chunks = r.iter_content(None) + assert list(chunks) == [b'the content'] + + r = requests.Response() + r.raw = io.BytesIO(b'the content') + with pytest.raises(TypeError): + chunks = r.iter_content("1024") + + def test_request_and_response_are_pickleable(self, httpbin): + r = requests.get(httpbin('get')) + + # verify we can pickle the original request + assert pickle.loads(pickle.dumps(r.request)) + + # verify we can pickle the response and that we have access to + # the original request. + pr = pickle.loads(pickle.dumps(r)) + assert r.request.url == pr.request.url + assert r.request.headers == pr.request.headers + + def test_prepared_request_is_pickleable(self, httpbin): + p = requests.Request('GET', httpbin('get')).prepare() + + # Verify PreparedRequest can be pickled and unpickled + r = pickle.loads(pickle.dumps(p)) + assert r.url == p.url + assert r.headers == p.headers + assert r.body == p.body + + # Verify unpickled PreparedRequest sends properly + s = requests.Session() + resp = s.send(r) + assert resp.status_code == 200 + + def test_prepared_request_with_file_is_pickleable(self, httpbin): + files = {'file': open(__file__, 'rb')} + r = requests.Request('POST', httpbin('post'), files=files) + p = r.prepare() + + # Verify PreparedRequest can be pickled and unpickled + r = pickle.loads(pickle.dumps(p)) + assert r.url == p.url + assert r.headers == p.headers + assert r.body == p.body + + # Verify unpickled PreparedRequest sends properly + s = requests.Session() + resp = s.send(r) + assert resp.status_code == 200 + + def test_prepared_request_with_hook_is_pickleable(self, httpbin): + r = requests.Request('GET', httpbin('get'), hooks=default_hooks()) + p = r.prepare() + + # Verify PreparedRequest can be pickled + r = pickle.loads(pickle.dumps(p)) + assert r.url == p.url + assert r.headers == p.headers + assert r.body == p.body + assert r.hooks == p.hooks + + # Verify unpickled PreparedRequest sends properly + s = requests.Session() + resp = s.send(r) + assert resp.status_code == 200 + + def test_cannot_send_unprepared_requests(self, httpbin): + r = requests.Request(url=httpbin()) + with pytest.raises(ValueError): + requests.Session().send(r) + + def test_http_error(self): + error = requests.exceptions.HTTPError() + assert not error.response + response = requests.Response() + error = requests.exceptions.HTTPError(response=response) + assert error.response == response + error = requests.exceptions.HTTPError('message', response=response) + assert str(error) == 'message' + assert error.response == response + + def test_session_pickling(self, httpbin): + r = requests.Request('GET', httpbin('get')) + s = requests.Session() + + s = pickle.loads(pickle.dumps(s)) + s.proxies = getproxies() + + r = s.send(r.prepare()) + assert r.status_code == 200 + + def test_fixes_1329(self, httpbin): + """Ensure that header updates are done case-insensitively.""" + s = requests.Session() + s.headers.update({'ACCEPT': 'BOGUS'}) + s.headers.update({'accept': 'application/json'}) + r = s.get(httpbin('get')) + headers = r.request.headers + assert headers['accept'] == 'application/json' + assert headers['Accept'] == 'application/json' + assert headers['ACCEPT'] == 'application/json' + + def test_uppercase_scheme_redirect(self, httpbin): + parts = urlparse(httpbin('html')) + url = "HTTP://" + parts.netloc + parts.path + r = requests.get(httpbin('redirect-to'), params={'url': url}) + assert r.status_code == 200 + assert r.url.lower() == url.lower() + + def test_transport_adapter_ordering(self): + s = requests.Session() + order = ['https://', 'http://'] + assert order == list(s.adapters) + s.mount('http://git', HTTPAdapter()) + s.mount('http://github', HTTPAdapter()) + s.mount('http://github.com', HTTPAdapter()) + s.mount('http://github.com/about/', HTTPAdapter()) + order = [ + 'http://github.com/about/', + 'http://github.com', + 'http://github', + 'http://git', + 'https://', + 'http://', + ] + assert order == list(s.adapters) + s.mount('http://gittip', HTTPAdapter()) + s.mount('http://gittip.com', HTTPAdapter()) + s.mount('http://gittip.com/about/', HTTPAdapter()) + order = [ + 'http://github.com/about/', + 'http://gittip.com/about/', + 'http://github.com', + 'http://gittip.com', + 'http://github', + 'http://gittip', + 'http://git', + 'https://', + 'http://', + ] + assert order == list(s.adapters) + s2 = requests.Session() + s2.adapters = {'http://': HTTPAdapter()} + s2.mount('https://', HTTPAdapter()) + assert 'http://' in s2.adapters + assert 'https://' in s2.adapters + + def test_header_remove_is_case_insensitive(self, httpbin): + # From issue #1321 + s = requests.Session() + s.headers['foo'] = 'bar' + r = s.get(httpbin('get'), headers={'FOO': None}) + assert 'foo' not in r.request.headers + + def test_params_are_merged_case_sensitive(self, httpbin): + s = requests.Session() + s.params['foo'] = 'bar' + r = s.get(httpbin('get'), params={'FOO': 'bar'}) + assert r.json()['args'] == {'foo': 'bar', 'FOO': 'bar'} + + def test_long_authinfo_in_url(self): + url = 'http://{0}:{1}@{2}:9000/path?query#frag'.format( + 'E8A3BE87-9E3F-4620-8858-95478E385B5B', + 'EA770032-DA4D-4D84-8CE9-29C6D910BF1E', + 'exactly-------------sixty-----------three------------characters', + ) + r = requests.Request('GET', url).prepare() + assert r.url == url + + def test_header_keys_are_native(self, httpbin): + headers = {u('unicode'): 'blah', 'byte'.encode('ascii'): 'blah'} + r = requests.Request('GET', httpbin('get'), headers=headers) + p = r.prepare() + + # This is testing that they are builtin strings. A bit weird, but there + # we go. + assert 'unicode' in p.headers.keys() + assert 'byte' in p.headers.keys() + + def test_header_validation(self, httpbin): + """Ensure prepare_headers regex isn't flagging valid header contents.""" + headers_ok = {'foo': 'bar baz qux', + 'bar': u'fbbq'.encode('utf8'), + 'baz': '', + 'qux': '1'} + r = requests.get(httpbin('get'), headers=headers_ok) + assert r.request.headers['foo'] == headers_ok['foo'] + + def test_header_value_not_str(self, httpbin): + """Ensure the header value is of type string or bytes as + per discussion in GH issue #3386 + """ + headers_int = {'foo': 3} + headers_dict = {'bar': {'foo': 'bar'}} + headers_list = {'baz': ['foo', 'bar']} + + # Test for int + with pytest.raises(InvalidHeader) as excinfo: + r = requests.get(httpbin('get'), headers=headers_int) + assert 'foo' in str(excinfo.value) + # Test for dict + with pytest.raises(InvalidHeader) as excinfo: + r = requests.get(httpbin('get'), headers=headers_dict) + assert 'bar' in str(excinfo.value) + # Test for list + with pytest.raises(InvalidHeader) as excinfo: + r = requests.get(httpbin('get'), headers=headers_list) + assert 'baz' in str(excinfo.value) + + def test_header_no_return_chars(self, httpbin): + """Ensure that a header containing return character sequences raise an + exception. Otherwise, multiple headers are created from single string. + """ + headers_ret = {'foo': 'bar\r\nbaz: qux'} + headers_lf = {'foo': 'bar\nbaz: qux'} + headers_cr = {'foo': 'bar\rbaz: qux'} + + # Test for newline + with pytest.raises(InvalidHeader): + r = requests.get(httpbin('get'), headers=headers_ret) + # Test for line feed + with pytest.raises(InvalidHeader): + r = requests.get(httpbin('get'), headers=headers_lf) + # Test for carriage return + with pytest.raises(InvalidHeader): + r = requests.get(httpbin('get'), headers=headers_cr) + + def test_header_no_leading_space(self, httpbin): + """Ensure headers containing leading whitespace raise + InvalidHeader Error before sending. + """ + headers_space = {'foo': ' bar'} + headers_tab = {'foo': ' bar'} + + # Test for whitespace + with pytest.raises(InvalidHeader): + r = requests.get(httpbin('get'), headers=headers_space) + # Test for tab + with pytest.raises(InvalidHeader): + r = requests.get(httpbin('get'), headers=headers_tab) + + @pytest.mark.parametrize('files', ('foo', b'foo', bytearray(b'foo'))) + def test_can_send_objects_with_files(self, httpbin, files): + data = {'a': 'this is a string'} + files = {'b': files} + r = requests.Request('POST', httpbin('post'), data=data, files=files) + p = r.prepare() + assert 'multipart/form-data' in p.headers['Content-Type'] + + def test_can_send_file_object_with_non_string_filename(self, httpbin): + f = io.BytesIO() + f.name = 2 + r = requests.Request('POST', httpbin('post'), files={'f': f}) + p = r.prepare() + + assert 'multipart/form-data' in p.headers['Content-Type'] + + def test_autoset_header_values_are_native(self, httpbin): + data = 'this is a string' + length = '16' + req = requests.Request('POST', httpbin('post'), data=data) + p = req.prepare() + + assert p.headers['Content-Length'] == length + + def test_nonhttp_schemes_dont_check_URLs(self): + test_urls = ( + 'data:image/gif;base64,R0lGODlhAQABAHAAACH5BAUAAAAALAAAAAABAAEAAAICRAEAOw==', + 'file:///etc/passwd', + 'magnet:?xt=urn:btih:be08f00302bc2d1d3cfa3af02024fa647a271431', + ) + for test_url in test_urls: + req = requests.Request('GET', test_url) + preq = req.prepare() + assert test_url == preq.url + + @pytest.mark.xfail(raises=ConnectionError) + def test_auth_is_stripped_on_redirect_off_host(self, httpbin): + r = requests.get( + httpbin('redirect-to'), + params={'url': 'http://www.google.co.uk'}, + auth=('user', 'pass'), + ) + assert r.history[0].request.headers['Authorization'] + assert not r.request.headers.get('Authorization', '') + + def test_auth_is_retained_for_redirect_on_host(self, httpbin): + r = requests.get(httpbin('redirect/1'), auth=('user', 'pass')) + h1 = r.history[0].request.headers['Authorization'] + h2 = r.request.headers['Authorization'] + + assert h1 == h2 + + def test_manual_redirect_with_partial_body_read(self, httpbin): + s = requests.Session() + r1 = s.get(httpbin('redirect/2'), allow_redirects=False, stream=True) + assert r1.is_redirect + rg = s.resolve_redirects(r1, r1.request, stream=True) + + # read only the first eight bytes of the response body, + # then follow the redirect + r1.iter_content(8) + r2 = next(rg) + assert r2.is_redirect + + # read all of the response via iter_content, + # then follow the redirect + for _ in r2.iter_content(): + pass + r3 = next(rg) + assert not r3.is_redirect + + def test_prepare_body_position_non_stream(self): + data = b'the data' + s = requests.Session() + prep = requests.Request('GET', 'http://example.com', data=data).prepare() + assert prep._body_position is None + + def test_rewind_body(self): + data = io.BytesIO(b'the data') + s = requests.Session() + prep = requests.Request('GET', 'http://example.com', data=data).prepare() + assert prep._body_position == 0 + assert prep.body.read() == b'the data' + + # the data has all been read + assert prep.body.read() == b'' + + # rewind it back + requests.utils.rewind_body(prep) + assert prep.body.read() == b'the data' + + def test_rewind_partially_read_body(self): + data = io.BytesIO(b'the data') + s = requests.Session() + data.read(4) # read some data + prep = requests.Request('GET', 'http://example.com', data=data).prepare() + assert prep._body_position == 4 + assert prep.body.read() == b'data' + + # the data has all been read + assert prep.body.read() == b'' + + # rewind it back + requests.utils.rewind_body(prep) + assert prep.body.read() == b'data' + + def test_rewind_body_no_seek(self): + class BadFileObj: + def __init__(self, data): + self.data = data + + def tell(self): + return 0 + + def __iter__(self): + return + + data = BadFileObj('the data') + s = requests.Session() + prep = requests.Request('GET', 'http://example.com', data=data).prepare() + assert prep._body_position == 0 + + with pytest.raises(UnrewindableBodyError) as e: + requests.utils.rewind_body(prep) + + assert 'Unable to rewind request body' in str(e) + + def test_rewind_body_failed_seek(self): + class BadFileObj: + def __init__(self, data): + self.data = data + + def tell(self): + return 0 + + def seek(self, pos, whence=0): + raise OSError() + + def __iter__(self): + return + + data = BadFileObj('the data') + s = requests.Session() + prep = requests.Request('GET', 'http://example.com', data=data).prepare() + assert prep._body_position == 0 + + with pytest.raises(UnrewindableBodyError) as e: + requests.utils.rewind_body(prep) + + assert 'error occurred when rewinding request body' in str(e) + + def test_rewind_body_failed_tell(self): + class BadFileObj: + def __init__(self, data): + self.data = data + + def tell(self): + raise OSError() + + def __iter__(self): + return + + data = BadFileObj('the data') + s = requests.Session() + prep = requests.Request('GET', 'http://example.com', data=data).prepare() + assert prep._body_position is not None + + with pytest.raises(UnrewindableBodyError) as e: + requests.utils.rewind_body(prep) + + assert 'Unable to rewind request body' in str(e) + + def _patch_adapter_gzipped_redirect(self, session, url): + adapter = session.get_adapter(url=url) + org_build_response = adapter.build_response + self._patched_response = False + + def build_response(*args, **kwargs): + resp = org_build_response(*args, **kwargs) + if not self._patched_response: + resp.raw.headers['content-encoding'] = 'gzip' + self._patched_response = True + return resp + + adapter.build_response = build_response + + def test_redirect_with_wrong_gzipped_header(self, httpbin): + s = requests.Session() + url = httpbin('redirect/1') + self._patch_adapter_gzipped_redirect(s, url) + s.get(url) + + @pytest.mark.parametrize( + 'username, password, auth_str', ( + ('test', 'test', 'Basic dGVzdDp0ZXN0'), + (u'имя'.encode('utf-8'), u'пароль'.encode('utf-8'), 'Basic 0LjQvNGPOtC/0LDRgNC+0LvRjA=='), + )) + def test_basic_auth_str_is_always_native(self, username, password, auth_str): + s = _basic_auth_str(username, password) + assert isinstance(s, builtin_str) + assert s == auth_str + + def test_requests_history_is_saved(self, httpbin): + r = requests.get(httpbin('redirect/5')) + total = r.history[-1].history + i = 0 + for item in r.history: + assert item.history == total[0:i] + i += 1 + + def test_json_param_post_content_type_works(self, httpbin): + r = requests.post( + httpbin('post'), + json={'life': 42} + ) + assert r.status_code == 200 + assert 'application/json' in r.request.headers['Content-Type'] + assert {'life': 42} == r.json()['json'] + + def test_json_param_post_should_not_override_data_param(self, httpbin): + r = requests.Request(method='POST', url=httpbin('post'), + data={'stuff': 'elixr'}, + json={'music': 'flute'}) + prep = r.prepare() + assert 'stuff=elixr' == prep.body + + def test_response_iter_lines(self, httpbin): + r = requests.get(httpbin('stream/4'), stream=True) + assert r.status_code == 200 + + it = r.iter_lines() + next(it) + assert len(list(it)) == 3 + + def test_response_context_manager(self, httpbin): + with requests.get(httpbin('stream/4'), stream=True) as response: + assert isinstance(response, requests.Response) + + assert response.raw.closed + + def test_unconsumed_session_response_closes_connection(self, httpbin): + s = requests.session() + + with contextlib.closing(s.get(httpbin('stream/4'), stream=True)) as response: + pass + + assert response._content_consumed is False + assert response.raw.closed + + @pytest.mark.xfail + def test_response_iter_lines_reentrant(self, httpbin): + """Response.iter_lines() is not reentrant safe""" + r = requests.get(httpbin('stream/4'), stream=True) + assert r.status_code == 200 + + next(r.iter_lines()) + assert len(list(r.iter_lines())) == 3 + + def test_session_close_proxy_clear(self, mocker): + proxies = { + 'one': mocker.Mock(), + 'two': mocker.Mock(), + } + session = requests.Session() + mocker.patch.dict(session.adapters['http://'].proxy_manager, proxies) + session.close() + proxies['one'].clear.assert_called_once_with() + proxies['two'].clear.assert_called_once_with() + + def test_proxy_auth(self, httpbin): + adapter = HTTPAdapter() + headers = adapter.proxy_headers("http://user:pass@httpbin.org") + assert headers == {'Proxy-Authorization': 'Basic dXNlcjpwYXNz'} + + def test_proxy_auth_empty_pass(self, httpbin): + adapter = HTTPAdapter() + headers = adapter.proxy_headers("http://user:@httpbin.org") + assert headers == {'Proxy-Authorization': 'Basic dXNlcjo='} + + def test_response_json_when_content_is_None(self, httpbin): + r = requests.get(httpbin('/status/204')) + # Make sure r.content is None + r.status_code = 0 + r._content = False + r._content_consumed = False + + assert r.content is None + with pytest.raises(ValueError): + r.json() + + def test_response_without_release_conn(self): + """Test `close` call for non-urllib3-like raw objects. + Should work when `release_conn` attr doesn't exist on `response.raw`. + """ + resp = requests.Response() + resp.raw = StringIO.StringIO('test') + assert not resp.raw.closed + resp.close() + assert resp.raw.closed + + def test_empty_stream_with_auth_does_not_set_content_length_header(self, httpbin): + """Ensure that a byte stream with size 0 will not set both a Content-Length + and Transfer-Encoding header. + """ + auth = ('user', 'pass') + url = httpbin('post') + file_obj = io.BytesIO(b'') + r = requests.Request('POST', url, auth=auth, data=file_obj) + prepared_request = r.prepare() + assert 'Transfer-Encoding' in prepared_request.headers + assert 'Content-Length' not in prepared_request.headers + + def test_stream_with_auth_does_not_set_transfer_encoding_header(self, httpbin): + """Ensure that a byte stream with size > 0 will not set both a Content-Length + and Transfer-Encoding header. + """ + auth = ('user', 'pass') + url = httpbin('post') + file_obj = io.BytesIO(b'test data') + r = requests.Request('POST', url, auth=auth, data=file_obj) + prepared_request = r.prepare() + assert 'Transfer-Encoding' not in prepared_request.headers + assert 'Content-Length' in prepared_request.headers + + def test_chunked_upload_does_not_set_content_length_header(self, httpbin): + """Ensure that requests with a generator body stream using + Transfer-Encoding: chunked, not a Content-Length header. + """ + data = (i for i in [b'a', b'b', b'c']) + url = httpbin('post') + r = requests.Request('POST', url, data=data) + prepared_request = r.prepare() + assert 'Transfer-Encoding' in prepared_request.headers + assert 'Content-Length' not in prepared_request.headers + + def test_custom_redirect_mixin(self, httpbin): + """Tests a custom mixin to overwrite ``get_redirect_target``. + + Ensures a subclassed ``requests.Session`` can handle a certain type of + malformed redirect responses. + + 1. original request receives a proper response: 302 redirect + 2. following the redirect, a malformed response is given: + status code = HTTP 200 + location = alternate url + 3. the custom session catches the edge case and follows the redirect + """ + url_final = httpbin('html') + querystring_malformed = urlencode({'location': url_final}) + url_redirect_malformed = httpbin('response-headers?%s' % querystring_malformed) + querystring_redirect = urlencode({'url': url_redirect_malformed}) + url_redirect = httpbin('redirect-to?%s' % querystring_redirect) + urls_test = [url_redirect, + url_redirect_malformed, + url_final, + ] + + class CustomRedirectSession(requests.Session): + def get_redirect_target(self, resp): + # default behavior + if resp.is_redirect: + return resp.headers['location'] + # edge case - check to see if 'location' is in headers anyways + location = resp.headers.get('location') + if location and (location != resp.url): + return location + return None + + session = CustomRedirectSession() + r = session.get(urls_test[0]) + assert len(r.history) == 2 + assert r.status_code == 200 + assert r.history[0].status_code == 302 + assert r.history[0].is_redirect + assert r.history[1].status_code == 200 + assert not r.history[1].is_redirect + assert r.url == urls_test[2] + + +class TestCaseInsensitiveDict: + + @pytest.mark.parametrize( + 'cid', ( + CaseInsensitiveDict({'Foo': 'foo', 'BAr': 'bar'}), + CaseInsensitiveDict([('Foo', 'foo'), ('BAr', 'bar')]), + CaseInsensitiveDict(FOO='foo', BAr='bar'), + )) + def test_init(self, cid): + assert len(cid) == 2 + assert 'foo' in cid + assert 'bar' in cid + + def test_docstring_example(self): + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + assert cid['aCCEPT'] == 'application/json' + assert list(cid) == ['Accept'] + + def test_len(self): + cid = CaseInsensitiveDict({'a': 'a', 'b': 'b'}) + cid['A'] = 'a' + assert len(cid) == 2 + + def test_getitem(self): + cid = CaseInsensitiveDict({'Spam': 'blueval'}) + assert cid['spam'] == 'blueval' + assert cid['SPAM'] == 'blueval' + + def test_fixes_649(self): + """__setitem__ should behave case-insensitively.""" + cid = CaseInsensitiveDict() + cid['spam'] = 'oneval' + cid['Spam'] = 'twoval' + cid['sPAM'] = 'redval' + cid['SPAM'] = 'blueval' + assert cid['spam'] == 'blueval' + assert cid['SPAM'] == 'blueval' + assert list(cid.keys()) == ['SPAM'] + + def test_delitem(self): + cid = CaseInsensitiveDict() + cid['Spam'] = 'someval' + del cid['sPam'] + assert 'spam' not in cid + assert len(cid) == 0 + + def test_contains(self): + cid = CaseInsensitiveDict() + cid['Spam'] = 'someval' + assert 'Spam' in cid + assert 'spam' in cid + assert 'SPAM' in cid + assert 'sPam' in cid + assert 'notspam' not in cid + + def test_get(self): + cid = CaseInsensitiveDict() + cid['spam'] = 'oneval' + cid['SPAM'] = 'blueval' + assert cid.get('spam') == 'blueval' + assert cid.get('SPAM') == 'blueval' + assert cid.get('sPam') == 'blueval' + assert cid.get('notspam', 'default') == 'default' + + def test_update(self): + cid = CaseInsensitiveDict() + cid['spam'] = 'blueval' + cid.update({'sPam': 'notblueval'}) + assert cid['spam'] == 'notblueval' + cid = CaseInsensitiveDict({'Foo': 'foo', 'BAr': 'bar'}) + cid.update({'fOO': 'anotherfoo', 'bAR': 'anotherbar'}) + assert len(cid) == 2 + assert cid['foo'] == 'anotherfoo' + assert cid['bar'] == 'anotherbar' + + def test_update_retains_unchanged(self): + cid = CaseInsensitiveDict({'foo': 'foo', 'bar': 'bar'}) + cid.update({'foo': 'newfoo'}) + assert cid['bar'] == 'bar' + + def test_iter(self): + cid = CaseInsensitiveDict({'Spam': 'spam', 'Eggs': 'eggs'}) + keys = frozenset(['Spam', 'Eggs']) + assert frozenset(iter(cid)) == keys + + def test_equality(self): + cid = CaseInsensitiveDict({'SPAM': 'blueval', 'Eggs': 'redval'}) + othercid = CaseInsensitiveDict({'spam': 'blueval', 'eggs': 'redval'}) + assert cid == othercid + del othercid['spam'] + assert cid != othercid + assert cid == {'spam': 'blueval', 'eggs': 'redval'} + assert cid != object() + + def test_setdefault(self): + cid = CaseInsensitiveDict({'Spam': 'blueval'}) + assert cid.setdefault('spam', 'notblueval') == 'blueval' + assert cid.setdefault('notspam', 'notblueval') == 'notblueval' + + def test_lower_items(self): + cid = CaseInsensitiveDict({ + 'Accept': 'application/json', + 'user-Agent': 'requests', + }) + keyset = frozenset(lowerkey for lowerkey, v in cid.lower_items()) + lowerkeyset = frozenset(['accept', 'user-agent']) + assert keyset == lowerkeyset + + def test_preserve_key_case(self): + cid = CaseInsensitiveDict({ + 'Accept': 'application/json', + 'user-Agent': 'requests', + }) + keyset = frozenset(['Accept', 'user-Agent']) + assert frozenset(i[0] for i in cid.items()) == keyset + assert frozenset(cid.keys()) == keyset + assert frozenset(cid) == keyset + + def test_preserve_last_key_case(self): + cid = CaseInsensitiveDict({ + 'Accept': 'application/json', + 'user-Agent': 'requests', + }) + cid.update({'ACCEPT': 'application/json'}) + cid['USER-AGENT'] = 'requests' + keyset = frozenset(['ACCEPT', 'USER-AGENT']) + assert frozenset(i[0] for i in cid.items()) == keyset + assert frozenset(cid.keys()) == keyset + assert frozenset(cid) == keyset + + def test_copy(self): + cid = CaseInsensitiveDict({ + 'Accept': 'application/json', + 'user-Agent': 'requests', + }) + cid_copy = cid.copy() + assert cid == cid_copy + cid['changed'] = True + assert cid != cid_copy + + +class TestMorselToCookieExpires: + """Tests for morsel_to_cookie when morsel contains expires.""" + + def test_expires_valid_str(self): + """Test case where we convert expires from string time.""" + + morsel = Morsel() + morsel['expires'] = 'Thu, 01-Jan-1970 00:00:01 GMT' + cookie = morsel_to_cookie(morsel) + assert cookie.expires == 1 + + @pytest.mark.parametrize( + 'value, exception', ( + (100, TypeError), + ('woops', ValueError), + )) + def test_expires_invalid_int(self, value, exception): + """Test case where an invalid type is passed for expires.""" + morsel = Morsel() + morsel['expires'] = value + with pytest.raises(exception): + morsel_to_cookie(morsel) + + def test_expires_none(self): + """Test case where expires is None.""" + + morsel = Morsel() + morsel['expires'] = None + cookie = morsel_to_cookie(morsel) + assert cookie.expires is None + + +class TestMorselToCookieMaxAge: + + """Tests for morsel_to_cookie when morsel contains max-age.""" + + def test_max_age_valid_int(self): + """Test case where a valid max age in seconds is passed.""" + + morsel = Morsel() + morsel['max-age'] = 60 + cookie = morsel_to_cookie(morsel) + assert isinstance(cookie.expires, int) + + def test_max_age_invalid_str(self): + """Test case where a invalid max age is passed.""" + + morsel = Morsel() + morsel['max-age'] = 'woops' + with pytest.raises(TypeError): + morsel_to_cookie(morsel) + + +class TestTimeout: + + def test_stream_timeout(self, httpbin): + try: + requests.get(httpbin('delay/10'), timeout=2.0) + except requests.exceptions.Timeout as e: + assert 'Read timed out' in e.args[0].args[0] + + @pytest.mark.parametrize( + 'timeout, error_text', ( + ((3, 4, 5), '(connect, read)'), + ('foo', 'must be an int, float or None'), + )) + def test_invalid_timeout(self, httpbin, timeout, error_text): + with pytest.raises(ValueError) as e: + requests.get(httpbin('get'), timeout=timeout) + assert error_text in str(e) + + @pytest.mark.parametrize( + 'timeout', ( + None, + Urllib3Timeout(connect=None, read=None) + )) + def test_none_timeout(self, httpbin, timeout): + """Check that you can set None as a valid timeout value. + + To actually test this behavior, we'd want to check that setting the + timeout to None actually lets the request block past the system default + timeout. However, this would make the test suite unbearably slow. + Instead we verify that setting the timeout to None does not prevent the + request from succeeding. + """ + r = requests.get(httpbin('get'), timeout=timeout) + assert r.status_code == 200 + + @pytest.mark.parametrize( + 'timeout', ( + (None, 0.1), + Urllib3Timeout(connect=None, read=0.1) + )) + def test_read_timeout(self, httpbin, timeout): + try: + requests.get(httpbin('delay/10'), timeout=timeout) + pytest.fail('The recv() request should time out.') + except ReadTimeout: + pass + + @pytest.mark.parametrize( + 'timeout', ( + (0.1, None), + Urllib3Timeout(connect=0.1, read=None) + )) + def test_connect_timeout(self, timeout): + try: + requests.get(TARPIT, timeout=timeout) + pytest.fail('The connect() request should time out.') + except ConnectTimeout as e: + assert isinstance(e, ConnectionError) + assert isinstance(e, Timeout) + + @pytest.mark.parametrize( + 'timeout', ( + (0.1, 0.1), + Urllib3Timeout(connect=0.1, read=0.1) + )) + def test_total_timeout_connect(self, timeout): + try: + requests.get(TARPIT, timeout=timeout) + pytest.fail('The connect() request should time out.') + except ConnectTimeout: + pass + + def test_encoded_methods(self, httpbin): + """See: https://github.com/requests/requests/issues/2316""" + r = requests.request(b'GET', httpbin('get')) + assert r.ok + + +SendCall = collections.namedtuple('SendCall', ('args', 'kwargs')) + + +class RedirectSession(SessionRedirectMixin): + def __init__(self, order_of_redirects): + self.redirects = order_of_redirects + self.calls = [] + self.max_redirects = 30 + self.cookies = {} + self.trust_env = False + + def send(self, *args, **kwargs): + self.calls.append(SendCall(args, kwargs)) + return self.build_response() + + def build_response(self): + request = self.calls[-1].args[0] + r = requests.Response() + + try: + r.status_code = int(self.redirects.pop(0)) + except IndexError: + r.status_code = 200 + + r.headers = CaseInsensitiveDict({'Location': '/'}) + r.raw = self._build_raw() + r.request = request + return r + + def _build_raw(self): + string = StringIO.StringIO('') + setattr(string, 'release_conn', lambda *args: args) + return string + + +def test_json_encodes_as_bytes(): + # urllib3 expects bodies as bytes-like objects + body = {"key": "value"} + p = PreparedRequest() + p.prepare( + method='GET', + url='https://www.example.com/', + json=body + ) + assert isinstance(p.body, bytes) + + +def test_requests_are_updated_each_time(httpbin): + session = RedirectSession([303, 307]) + prep = requests.Request('POST', httpbin('post')).prepare() + r0 = session.send(prep) + assert r0.request.method == 'POST' + assert session.calls[-1] == SendCall((r0.request,), {}) + redirect_generator = session.resolve_redirects(r0, prep) + default_keyword_args = { + 'stream': False, + 'verify': True, + 'cert': None, + 'timeout': None, + 'allow_redirects': False, + 'proxies': {}, + } + for response in redirect_generator: + assert response.request.method == 'GET' + send_call = SendCall((response.request,), default_keyword_args) + assert session.calls[-1] == send_call + + +@pytest.mark.parametrize("var,url,proxy", [ + ('http_proxy', 'http://example.com', 'socks5://proxy.com:9876'), + ('https_proxy', 'https://example.com', 'socks5://proxy.com:9876'), + ('all_proxy', 'http://example.com', 'socks5://proxy.com:9876'), + ('all_proxy', 'https://example.com', 'socks5://proxy.com:9876'), +]) +def test_proxy_env_vars_override_default(var, url, proxy): + session = requests.Session() + prep = PreparedRequest() + prep.prepare(method='GET', url=url) + + kwargs = { + var: proxy + } + scheme = urlparse(url).scheme + with override_environ(**kwargs): + proxies = session.rebuild_proxies(prep, {}) + assert scheme in proxies + assert proxies[scheme] == proxy + + +@pytest.mark.parametrize( + 'data', ( + (('a', 'b'), ('c', 'd')), + (('c', 'd'), ('a', 'b')), + (('a', 'b'), ('c', 'd'), ('e', 'f')), + )) +def test_data_argument_accepts_tuples(data): + """Ensure that the data argument will accept tuples of strings + and properly encode them. + """ + p = PreparedRequest() + p.prepare( + method='GET', + url='http://www.example.com', + data=data, + hooks=default_hooks() + ) + assert p.body == urlencode(data) + + +@pytest.mark.parametrize( + 'kwargs', ( + None, + { + 'method': 'GET', + 'url': 'http://www.example.com', + 'data': 'foo=bar', + 'hooks': default_hooks() + }, + { + 'method': 'GET', + 'url': 'http://www.example.com', + 'data': 'foo=bar', + 'hooks': default_hooks(), + 'cookies': {'foo': 'bar'} + }, + { + 'method': 'GET', + 'url': u('http://www.example.com/üniçø∂é') + }, + )) +def test_prepared_copy(kwargs): + p = PreparedRequest() + if kwargs: + p.prepare(**kwargs) + copy = p.copy() + for attr in ('method', 'url', 'headers', '_cookies', 'body', 'hooks'): + assert getattr(p, attr) == getattr(copy, attr) + + +def test_urllib3_retries(httpbin): + from urllib3.util import Retry + s = requests.Session() + s.mount('http://', HTTPAdapter(max_retries=Retry( + total=2, status_forcelist=[500] + ))) + + with pytest.raises(RetryError): + s.get(httpbin('status/500')) + + +def test_urllib3_pool_connection_closed(httpbin): + s = requests.Session() + s.mount('http://', HTTPAdapter(pool_connections=0, pool_maxsize=0)) + + try: + s.get(httpbin('status/200')) + except ConnectionError as e: + assert u"Pool is closed." in str(e) + + +class TestPreparingURLs(object): + @pytest.mark.parametrize( + 'url,expected', + ( + ('http://google.com', 'http://google.com/'), + (u'http://ジェーピーニック.jp', u'http://xn--hckqz9bzb1cyrb.jp/'), + (u'http://xn--n3h.net/', u'http://xn--n3h.net/'), + ( + u'http://ジェーピーニック.jp'.encode('utf-8'), + u'http://xn--hckqz9bzb1cyrb.jp/' + ), + ( + u'http://straße.de/straße', + u'http://xn--strae-oqa.de/stra%C3%9Fe' + ), + ( + u'http://straße.de/straße'.encode('utf-8'), + u'http://xn--strae-oqa.de/stra%C3%9Fe' + ), + ( + u'http://Königsgäßchen.de/straße', + u'http://xn--knigsgchen-b4a3dun.de/stra%C3%9Fe' + ), + ( + u'http://Königsgäßchen.de/straße'.encode('utf-8'), + u'http://xn--knigsgchen-b4a3dun.de/stra%C3%9Fe' + ), + ( + b'http://xn--n3h.net/', + u'http://xn--n3h.net/' + ), + ( + b'http://[1200:0000:ab00:1234:0000:2552:7777:1313]:12345/', + u'http://[1200:0000:ab00:1234:0000:2552:7777:1313]:12345/' + ), + ( + u'http://[1200:0000:ab00:1234:0000:2552:7777:1313]:12345/', + u'http://[1200:0000:ab00:1234:0000:2552:7777:1313]:12345/' + ) + ) + ) + def test_preparing_url(self, url, expected): + r = requests.Request('GET', url=url) + p = r.prepare() + assert p.url == expected + + @pytest.mark.parametrize( + 'url', + ( + b"http://*.google.com", + b"http://*", + u"http://*.google.com", + u"http://*", + u"http://☃.net/" + ) + ) + def test_preparing_bad_url(self, url): + r = requests.Request('GET', url=url) + with pytest.raises(requests.exceptions.InvalidURL): + r.prepare() + + @pytest.mark.parametrize( + 'input, expected', + ( + ( + b"http+unix://%2Fvar%2Frun%2Fsocket/path%7E", + u"http+unix://%2Fvar%2Frun%2Fsocket/path~", + ), + ( + u"http+unix://%2Fvar%2Frun%2Fsocket/path%7E", + u"http+unix://%2Fvar%2Frun%2Fsocket/path~", + ), + ( + b"mailto:user@example.org", + u"mailto:user@example.org", + ), + ( + u"mailto:user@example.org", + u"mailto:user@example.org", + ), + ( + b"data:SSDimaUgUHl0aG9uIQ==", + u"data:SSDimaUgUHl0aG9uIQ==", + ) + ) + ) + def test_url_mutation(self, input, expected): + """ + This test validates that we correctly exclude some URLs from + preparation, and that we handle others. Specifically, it tests that + any URL whose scheme doesn't begin with "http" is left alone, and + those whose scheme *does* begin with "http" are mutated. + """ + r = requests.Request('GET', url=input) + p = r.prepare() + assert p.url == expected + + @pytest.mark.parametrize( + 'input, params, expected', + ( + ( + b"http+unix://%2Fvar%2Frun%2Fsocket/path", + {"key": "value"}, + u"http+unix://%2Fvar%2Frun%2Fsocket/path?key=value", + ), + ( + u"http+unix://%2Fvar%2Frun%2Fsocket/path", + {"key": "value"}, + u"http+unix://%2Fvar%2Frun%2Fsocket/path?key=value", + ), + ( + b"mailto:user@example.org", + {"key": "value"}, + u"mailto:user@example.org", + ), + ( + u"mailto:user@example.org", + {"key": "value"}, + u"mailto:user@example.org", + ), + ) + ) + def test_parameters_for_nonstandard_schemes(self, input, params, expected): + """ + Setting parameters for nonstandard schemes is allowed if those schemes + begin with "http", and is forbidden otherwise. + """ + r = requests.Request('GET', url=input, params=params) + p = r.prepare() + assert p.url == expected diff --git a/tests/test_structures.py b/tests/test_structures.py new file mode 100755 index 0000000..e4d2459 --- /dev/null +++ b/tests/test_structures.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- + +import pytest + +from requests.structures import CaseInsensitiveDict, LookupDict + + +class TestCaseInsensitiveDict: + + @pytest.fixture(autouse=True) + def setup(self): + """CaseInsensitiveDict instance with "Accept" header.""" + self.case_insensitive_dict = CaseInsensitiveDict() + self.case_insensitive_dict['Accept'] = 'application/json' + + def test_list(self): + assert list(self.case_insensitive_dict) == ['Accept'] + + possible_keys = pytest.mark.parametrize('key', ('accept', 'ACCEPT', 'aCcEpT', 'Accept')) + + @possible_keys + def test_getitem(self, key): + assert self.case_insensitive_dict[key] == 'application/json' + + @possible_keys + def test_delitem(self, key): + del self.case_insensitive_dict[key] + assert key not in self.case_insensitive_dict + + def test_lower_items(self): + assert list(self.case_insensitive_dict.lower_items()) == [('accept', 'application/json')] + + def test_repr(self): + assert repr(self.case_insensitive_dict) == "{'Accept': 'application/json'}" + + def test_copy(self): + copy = self.case_insensitive_dict.copy() + assert copy is not self.case_insensitive_dict + assert copy == self.case_insensitive_dict + + @pytest.mark.parametrize( + 'other, result', ( + ({'AccePT': 'application/json'}, True), + ({}, False), + (None, False) + ) + ) + def test_instance_equality(self, other, result): + assert (self.case_insensitive_dict == other) is result + + +class TestLookupDict: + + @pytest.fixture(autouse=True) + def setup(self): + """LookupDict instance with "bad_gateway" attribute.""" + self.lookup_dict = LookupDict('test') + self.lookup_dict.bad_gateway = 502 + + def test_repr(self): + assert repr(self.lookup_dict) == "" + + get_item_parameters = pytest.mark.parametrize( + 'key, value', ( + ('bad_gateway', 502), + ('not_a_key', None) + ) + ) + + @get_item_parameters + def test_getitem(self, key, value): + assert self.lookup_dict[key] == value + + @get_item_parameters + def test_get(self, key, value): + assert self.lookup_dict.get(key) == value diff --git a/tests/test_testserver.py b/tests/test_testserver.py new file mode 100755 index 0000000..3c77075 --- /dev/null +++ b/tests/test_testserver.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- + +import threading +import socket +import time + +import pytest +import requests +from tests.testserver.server import Server + + +class TestTestServer: + + def test_basic(self): + """messages are sent and received properly""" + question = b"success?" + answer = b"yeah, success" + + def handler(sock): + text = sock.recv(1000) + assert text == question + sock.sendall(answer) + + with Server(handler) as (host, port): + sock = socket.socket() + sock.connect((host, port)) + sock.sendall(question) + text = sock.recv(1000) + assert text == answer + sock.close() + + def test_server_closes(self): + """the server closes when leaving the context manager""" + with Server.basic_response_server() as (host, port): + sock = socket.socket() + sock.connect((host, port)) + + sock.close() + + with pytest.raises(socket.error): + new_sock = socket.socket() + new_sock.connect((host, port)) + + def test_text_response(self): + """the text_response_server sends the given text""" + server = Server.text_response_server( + "HTTP/1.1 200 OK\r\n" + + "Content-Length: 6\r\n" + + "\r\nroflol" + ) + + with server as (host, port): + r = requests.get('http://{0}:{1}'.format(host, port)) + + assert r.status_code == 200 + assert r.text == u'roflol' + assert r.headers['Content-Length'] == '6' + + def test_basic_response(self): + """the basic response server returns an empty http response""" + with Server.basic_response_server() as (host, port): + r = requests.get('http://{0}:{1}'.format(host, port)) + assert r.status_code == 200 + assert r.text == u'' + assert r.headers['Content-Length'] == '0' + + def test_basic_waiting_server(self): + """the server waits for the block_server event to be set before closing""" + block_server = threading.Event() + + with Server.basic_response_server(wait_to_close_event=block_server) as (host, port): + sock = socket.socket() + sock.connect((host, port)) + sock.sendall(b'send something') + time.sleep(2.5) + sock.sendall(b'still alive') + block_server.set() # release server block + + def test_multiple_requests(self): + """multiple requests can be served""" + requests_to_handle = 5 + + server = Server.basic_response_server(requests_to_handle=requests_to_handle) + + with server as (host, port): + server_url = 'http://{0}:{1}'.format(host, port) + for _ in range(requests_to_handle): + r = requests.get(server_url) + assert r.status_code == 200 + + # the (n+1)th request fails + with pytest.raises(requests.exceptions.ConnectionError): + r = requests.get(server_url) + + @pytest.mark.skip(reason="this fails non-deterministically under pytest-xdist") + def test_request_recovery(self): + """can check the requests content""" + # TODO: figure out why this sometimes fails when using pytest-xdist. + server = Server.basic_response_server(requests_to_handle=2) + first_request = b'put your hands up in the air' + second_request = b'put your hand down in the floor' + + with server as address: + sock1 = socket.socket() + sock2 = socket.socket() + + sock1.connect(address) + sock1.sendall(first_request) + sock1.close() + + sock2.connect(address) + sock2.sendall(second_request) + sock2.close() + + assert server.handler_results[0] == first_request + assert server.handler_results[1] == second_request + + def test_requests_after_timeout_are_not_received(self): + """the basic response handler times out when receiving requests""" + server = Server.basic_response_server(request_timeout=1) + + with server as address: + sock = socket.socket() + sock.connect(address) + time.sleep(1.5) + sock.sendall(b'hehehe, not received') + sock.close() + + assert server.handler_results[0] == b'' + + def test_request_recovery_with_bigger_timeout(self): + """a biggest timeout can be specified""" + server = Server.basic_response_server(request_timeout=3) + data = b'bananadine' + + with server as address: + sock = socket.socket() + sock.connect(address) + time.sleep(1.5) + sock.sendall(data) + sock.close() + + assert server.handler_results[0] == data + + def test_server_finishes_on_error(self): + """the server thread exits even if an exception exits the context manager""" + server = Server.basic_response_server() + with pytest.raises(Exception): + with server: + raise Exception() + + assert len(server.handler_results) == 0 + + # if the server thread fails to finish, the test suite will hang + # and get killed by the jenkins timeout. + + def test_server_finishes_when_no_connections(self): + """the server thread exits even if there are no connections""" + server = Server.basic_response_server() + with server: + pass + + assert len(server.handler_results) == 0 + + # if the server thread fails to finish, the test suite will hang + # and get killed by the jenkins timeout. diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100755 index 0000000..b3f398e --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,680 @@ +# -*- coding: utf-8 -*- + +import os +import copy +from io import BytesIO + +import pytest +from requests import compat +from requests.cookies import RequestsCookieJar +from requests.structures import CaseInsensitiveDict +from requests.utils import ( + address_in_network, dotted_netmask, + get_auth_from_url, get_encoding_from_headers, + get_encodings_from_content, get_environ_proxies, + guess_filename, guess_json_utf, is_ipv4_address, + is_valid_cidr, iter_slices, parse_dict_header, + parse_header_links, prepend_scheme_if_needed, + requote_uri, select_proxy, should_bypass_proxies, super_len, + to_key_val_list, to_native_string, + unquote_header_value, unquote_unreserved, + urldefragauth, add_dict_to_cookiejar, set_environ) +from requests._internal_utils import unicode_is_ascii + +from .compat import StringIO, cStringIO + + +class TestSuperLen: + + @pytest.mark.parametrize( + 'stream, value', ( + (StringIO.StringIO, 'Test'), + (BytesIO, b'Test'), + pytest.mark.skipif('cStringIO is None')((cStringIO, 'Test')), + )) + def test_io_streams(self, stream, value): + """Ensures that we properly deal with different kinds of IO streams.""" + assert super_len(stream()) == 0 + assert super_len(stream(value)) == 4 + + def test_super_len_correctly_calculates_len_of_partially_read_file(self): + """Ensure that we handle partially consumed file like objects.""" + s = StringIO.StringIO() + s.write('foobarbogus') + assert super_len(s) == 0 + + @pytest.mark.parametrize('error', [IOError, OSError]) + def test_super_len_handles_files_raising_weird_errors_in_tell(self, error): + """If tell() raises errors, assume the cursor is at position zero.""" + class BoomFile(object): + def __len__(self): + return 5 + + def tell(self): + raise error() + + assert super_len(BoomFile()) == 0 + + @pytest.mark.parametrize('error', [IOError, OSError]) + def test_super_len_tell_ioerror(self, error): + """Ensure that if tell gives an IOError super_len doesn't fail""" + class NoLenBoomFile(object): + def tell(self): + raise error() + + def seek(self, offset, whence): + pass + + assert super_len(NoLenBoomFile()) == 0 + + def test_string(self): + assert super_len('Test') == 4 + + @pytest.mark.parametrize( + 'mode, warnings_num', ( + ('r', 1), + ('rb', 0), + )) + def test_file(self, tmpdir, mode, warnings_num, recwarn): + file_obj = tmpdir.join('test.txt') + file_obj.write('Test') + with file_obj.open(mode) as fd: + assert super_len(fd) == 4 + assert len(recwarn) == warnings_num + + def test_super_len_with__len__(self): + foo = [1,2,3,4] + len_foo = super_len(foo) + assert len_foo == 4 + + def test_super_len_with_no__len__(self): + class LenFile(object): + def __init__(self): + self.len = 5 + + assert super_len(LenFile()) == 5 + + def test_super_len_with_tell(self): + foo = StringIO.StringIO('12345') + assert super_len(foo) == 5 + foo.read(2) + assert super_len(foo) == 3 + + def test_super_len_with_fileno(self): + with open(__file__, 'rb') as f: + length = super_len(f) + file_data = f.read() + assert length == len(file_data) + + def test_super_len_with_no_matches(self): + """Ensure that objects without any length methods default to 0""" + assert super_len(object()) == 0 + + +class TestToKeyValList: + + @pytest.mark.parametrize( + 'value, expected', ( + ([('key', 'val')], [('key', 'val')]), + ((('key', 'val'), ), [('key', 'val')]), + ({'key': 'val'}, [('key', 'val')]), + (None, None) + )) + def test_valid(self, value, expected): + assert to_key_val_list(value) == expected + + def test_invalid(self): + with pytest.raises(ValueError): + to_key_val_list('string') + + +class TestUnquoteHeaderValue: + + @pytest.mark.parametrize( + 'value, expected', ( + (None, None), + ('Test', 'Test'), + ('"Test"', 'Test'), + ('"Test\\\\"', 'Test\\'), + ('"\\\\Comp\\Res"', '\\Comp\\Res'), + )) + def test_valid(self, value, expected): + assert unquote_header_value(value) == expected + + def test_is_filename(self): + assert unquote_header_value('"\\\\Comp\\Res"', True) == '\\\\Comp\\Res' + + +class TestGetEnvironProxies: + """Ensures that IP addresses are correctly matches with ranges + in no_proxy variable. + """ + + @pytest.fixture(autouse=True, params=['no_proxy', 'NO_PROXY']) + def no_proxy(self, request, monkeypatch): + monkeypatch.setenv(request.param, '192.168.0.0/24,127.0.0.1,localhost.localdomain,172.16.1.1') + + @pytest.mark.parametrize( + 'url', ( + 'http://192.168.0.1:5000/', + 'http://192.168.0.1/', + 'http://172.16.1.1/', + 'http://172.16.1.1:5000/', + 'http://localhost.localdomain:5000/v1.0/', + )) + def test_bypass(self, url): + assert get_environ_proxies(url, no_proxy=None) == {} + + @pytest.mark.parametrize( + 'url', ( + 'http://192.168.1.1:5000/', + 'http://192.168.1.1/', + 'http://www.requests.com/', + )) + def test_not_bypass(self, url): + assert get_environ_proxies(url, no_proxy=None) != {} + + @pytest.mark.parametrize( + 'url', ( + 'http://192.168.1.1:5000/', + 'http://192.168.1.1/', + 'http://www.requests.com/', + )) + def test_bypass_no_proxy_keyword(self, url): + no_proxy = '192.168.1.1,requests.com' + assert get_environ_proxies(url, no_proxy=no_proxy) == {} + + @pytest.mark.parametrize( + 'url', ( + 'http://192.168.0.1:5000/', + 'http://192.168.0.1/', + 'http://172.16.1.1/', + 'http://172.16.1.1:5000/', + 'http://localhost.localdomain:5000/v1.0/', + )) + def test_not_bypass_no_proxy_keyword(self, url, monkeypatch): + # This is testing that the 'no_proxy' argument overrides the + # environment variable 'no_proxy' + monkeypatch.setenv('http_proxy', 'http://proxy.example.com:3128/') + no_proxy = '192.168.1.1,requests.com' + assert get_environ_proxies(url, no_proxy=no_proxy) != {} + + +class TestIsIPv4Address: + + def test_valid(self): + assert is_ipv4_address('8.8.8.8') + + @pytest.mark.parametrize('value', ('8.8.8.8.8', 'localhost.localdomain')) + def test_invalid(self, value): + assert not is_ipv4_address(value) + + +class TestIsValidCIDR: + + def test_valid(self): + assert is_valid_cidr('192.168.1.0/24') + + @pytest.mark.parametrize( + 'value', ( + '8.8.8.8', + '192.168.1.0/a', + '192.168.1.0/128', + '192.168.1.0/-1', + '192.168.1.999/24', + )) + def test_invalid(self, value): + assert not is_valid_cidr(value) + + +class TestAddressInNetwork: + + def test_valid(self): + assert address_in_network('192.168.1.1', '192.168.1.0/24') + + def test_invalid(self): + assert not address_in_network('172.16.0.1', '192.168.1.0/24') + + +class TestGuessFilename: + + @pytest.mark.parametrize( + 'value', (1, type('Fake', (object,), {'name': 1})()), + ) + def test_guess_filename_invalid(self, value): + assert guess_filename(value) is None + + @pytest.mark.parametrize( + 'value, expected_type', ( + (b'value', compat.bytes), + (b'value'.decode('utf-8'), compat.str) + )) + def test_guess_filename_valid(self, value, expected_type): + obj = type('Fake', (object,), {'name': value})() + result = guess_filename(obj) + assert result == value + assert isinstance(result, expected_type) + + +class TestContentEncodingDetection: + + def test_none(self): + encodings = get_encodings_from_content('') + assert not len(encodings) + + @pytest.mark.parametrize( + 'content', ( + # HTML5 meta charset attribute + '', + # HTML4 pragma directive + '', + # XHTML 1.x served with text/html MIME type + '', + # XHTML 1.x served as XML + '', + )) + def test_pragmas(self, content): + encodings = get_encodings_from_content(content) + assert len(encodings) == 1 + assert encodings[0] == 'UTF-8' + + def test_precedence(self): + content = ''' + + + + '''.strip() + assert get_encodings_from_content(content) == ['HTML5', 'HTML4', 'XML'] + + +class TestGuessJSONUTF: + + @pytest.mark.parametrize( + 'encoding', ( + 'utf-32', 'utf-8-sig', 'utf-16', 'utf-8', 'utf-16-be', 'utf-16-le', + 'utf-32-be', 'utf-32-le' + )) + def test_encoded(self, encoding): + data = '{}'.encode(encoding) + assert guess_json_utf(data) == encoding + + def test_bad_utf_like_encoding(self): + assert guess_json_utf(b'\x00\x00\x00\x00') is None + + @pytest.mark.parametrize( + ('encoding', 'expected'), ( + ('utf-16-be', 'utf-16'), + ('utf-16-le', 'utf-16'), + ('utf-32-be', 'utf-32'), + ('utf-32-le', 'utf-32') + )) + def test_guess_by_bom(self, encoding, expected): + data = u'\ufeff{}'.encode(encoding) + assert guess_json_utf(data) == expected + + +USER = PASSWORD = "%!*'();:@&=+$,/?#[] " +ENCODED_USER = compat.quote(USER, '') +ENCODED_PASSWORD = compat.quote(PASSWORD, '') + + +@pytest.mark.parametrize( + 'url, auth', ( + ( + 'http://' + ENCODED_USER + ':' + ENCODED_PASSWORD + '@' + + 'request.com/url.html#test', + (USER, PASSWORD) + ), + ( + 'http://user:pass@complex.url.com/path?query=yes', + ('user', 'pass') + ), + ( + 'http://user:pass%20pass@complex.url.com/path?query=yes', + ('user', 'pass pass') + ), + ( + 'http://user:pass pass@complex.url.com/path?query=yes', + ('user', 'pass pass') + ), + ( + 'http://user%25user:pass@complex.url.com/path?query=yes', + ('user%user', 'pass') + ), + ( + 'http://user:pass%23pass@complex.url.com/path?query=yes', + ('user', 'pass#pass') + ), + ( + 'http://complex.url.com/path?query=yes', + ('', '') + ), + )) +def test_get_auth_from_url(url, auth): + assert get_auth_from_url(url) == auth + + +@pytest.mark.parametrize( + 'uri, expected', ( + ( + # Ensure requoting doesn't break expectations + 'http://example.com/fiz?buz=%25ppicture', + 'http://example.com/fiz?buz=%25ppicture', + ), + ( + # Ensure we handle unquoted percent signs in redirects + 'http://example.com/fiz?buz=%ppicture', + 'http://example.com/fiz?buz=%25ppicture', + ), + )) +def test_requote_uri_with_unquoted_percents(uri, expected): + """See: https://github.com/requests/requests/issues/2356""" + assert requote_uri(uri) == expected + + +@pytest.mark.parametrize( + 'uri, expected', ( + ( + # Illegal bytes + 'http://example.com/?a=%--', + 'http://example.com/?a=%--', + ), + ( + # Reserved characters + 'http://example.com/?a=%300', + 'http://example.com/?a=00', + ) + )) +def test_unquote_unreserved(uri, expected): + assert unquote_unreserved(uri) == expected + + +@pytest.mark.parametrize( + 'mask, expected', ( + (8, '255.0.0.0'), + (24, '255.255.255.0'), + (25, '255.255.255.128'), + )) +def test_dotted_netmask(mask, expected): + assert dotted_netmask(mask) == expected + + +http_proxies = {'http': 'http://http.proxy', + 'http://some.host': 'http://some.host.proxy'} +all_proxies = {'all': 'socks5://http.proxy', + 'all://some.host': 'socks5://some.host.proxy'} +mixed_proxies = {'http': 'http://http.proxy', + 'http://some.host': 'http://some.host.proxy', + 'all': 'socks5://http.proxy'} +@pytest.mark.parametrize( + 'url, expected, proxies', ( + ('hTTp://u:p@Some.Host/path', 'http://some.host.proxy', http_proxies), + ('hTTp://u:p@Other.Host/path', 'http://http.proxy', http_proxies), + ('hTTp:///path', 'http://http.proxy', http_proxies), + ('hTTps://Other.Host', None, http_proxies), + ('file:///etc/motd', None, http_proxies), + + ('hTTp://u:p@Some.Host/path', 'socks5://some.host.proxy', all_proxies), + ('hTTp://u:p@Other.Host/path', 'socks5://http.proxy', all_proxies), + ('hTTp:///path', 'socks5://http.proxy', all_proxies), + ('hTTps://Other.Host', 'socks5://http.proxy', all_proxies), + + ('http://u:p@other.host/path', 'http://http.proxy', mixed_proxies), + ('http://u:p@some.host/path', 'http://some.host.proxy', mixed_proxies), + ('https://u:p@other.host/path', 'socks5://http.proxy', mixed_proxies), + ('https://u:p@some.host/path', 'socks5://http.proxy', mixed_proxies), + ('https://', 'socks5://http.proxy', mixed_proxies), + # XXX: unsure whether this is reasonable behavior + ('file:///etc/motd', 'socks5://http.proxy', all_proxies), + )) +def test_select_proxies(url, expected, proxies): + """Make sure we can select per-host proxies correctly.""" + assert select_proxy(url, proxies) == expected + + +@pytest.mark.parametrize( + 'value, expected', ( + ('foo="is a fish", bar="as well"', {'foo': 'is a fish', 'bar': 'as well'}), + ('key_without_value', {'key_without_value': None}) + )) +def test_parse_dict_header(value, expected): + assert parse_dict_header(value) == expected + + +@pytest.mark.parametrize( + 'value, expected', ( + ( + CaseInsensitiveDict(), + None + ), + ( + CaseInsensitiveDict({'content-type': 'application/json; charset=utf-8'}), + 'utf-8' + ), + ( + CaseInsensitiveDict({'content-type': 'text/plain'}), + 'ISO-8859-1' + ), + )) +def test_get_encoding_from_headers(value, expected): + assert get_encoding_from_headers(value) == expected + + +@pytest.mark.parametrize( + 'value, length', ( + ('', 0), + ('T', 1), + ('Test', 4), + ('Cont', 0), + ('Other', -5), + ('Content', None), + )) +def test_iter_slices(value, length): + if length is None or (length <= 0 and len(value) > 0): + # Reads all content at once + assert len(list(iter_slices(value, length))) == 1 + else: + assert len(list(iter_slices(value, 1))) == length + + +@pytest.mark.parametrize( + 'value, expected', ( + ( + '; rel=front; type="image/jpeg"', + [{'url': 'http:/.../front.jpeg', 'rel': 'front', 'type': 'image/jpeg'}] + ), + ( + '', + [{'url': 'http:/.../front.jpeg'}] + ), + ( + ';', + [{'url': 'http:/.../front.jpeg'}] + ), + ( + '; type="image/jpeg",;', + [ + {'url': 'http:/.../front.jpeg', 'type': 'image/jpeg'}, + {'url': 'http://.../back.jpeg'} + ] + ), + )) +def test_parse_header_links(value, expected): + assert parse_header_links(value) == expected + + +@pytest.mark.parametrize( + 'value, expected', ( + ('example.com/path', 'http://example.com/path'), + ('//example.com/path', 'http://example.com/path'), + )) +def test_prepend_scheme_if_needed(value, expected): + assert prepend_scheme_if_needed(value, 'http') == expected + + +@pytest.mark.parametrize( + 'value, expected', ( + ('T', 'T'), + (b'T', 'T'), + (u'T', 'T'), + )) +def test_to_native_string(value, expected): + assert to_native_string(value) == expected + + +@pytest.mark.parametrize( + 'url, expected', ( + ('http://u:p@example.com/path?a=1#test', 'http://example.com/path?a=1'), + ('http://example.com/path', 'http://example.com/path'), + ('//u:p@example.com/path', '//example.com/path'), + ('//example.com/path', '//example.com/path'), + ('example.com/path', '//example.com/path'), + ('scheme:u:p@example.com/path', 'scheme://example.com/path'), + )) +def test_urldefragauth(url, expected): + assert urldefragauth(url) == expected + + +@pytest.mark.parametrize( + 'url, expected', ( + ('http://192.168.0.1:5000/', True), + ('http://192.168.0.1/', True), + ('http://172.16.1.1/', True), + ('http://172.16.1.1:5000/', True), + ('http://localhost.localdomain:5000/v1.0/', True), + ('http://172.16.1.12/', False), + ('http://172.16.1.12:5000/', False), + ('http://google.com:5000/v1.0/', False), + )) +def test_should_bypass_proxies(url, expected, monkeypatch): + """Tests for function should_bypass_proxies to check if proxy + can be bypassed or not + """ + monkeypatch.setenv('no_proxy', '192.168.0.0/24,127.0.0.1,localhost.localdomain,172.16.1.1') + monkeypatch.setenv('NO_PROXY', '192.168.0.0/24,127.0.0.1,localhost.localdomain,172.16.1.1') + assert should_bypass_proxies(url, no_proxy=None) == expected + + +@pytest.mark.parametrize( + 'cookiejar', ( + compat.cookielib.CookieJar(), + RequestsCookieJar() + )) +def test_add_dict_to_cookiejar(cookiejar): + """Ensure add_dict_to_cookiejar works for + non-RequestsCookieJar CookieJars + """ + cookiedict = {'test': 'cookies', + 'good': 'cookies'} + cj = add_dict_to_cookiejar(cookiejar, cookiedict) + cookies = dict((cookie.name, cookie.value) for cookie in cj) + assert cookiedict == cookies + + +@pytest.mark.parametrize( + 'value, expected', ( + (u'test', True), + (u'æíöû', False), + (u'ジェーピーニック', False), + ) +) +def test_unicode_is_ascii(value, expected): + assert unicode_is_ascii(value) is expected + + +@pytest.mark.parametrize( + 'url, expected', ( + ('http://192.168.0.1:5000/', True), + ('http://192.168.0.1/', True), + ('http://172.16.1.1/', True), + ('http://172.16.1.1:5000/', True), + ('http://localhost.localdomain:5000/v1.0/', True), + ('http://172.16.1.12/', False), + ('http://172.16.1.12:5000/', False), + ('http://google.com:5000/v1.0/', False), + )) +def test_should_bypass_proxies_no_proxy( + url, expected, monkeypatch): + """Tests for function should_bypass_proxies to check if proxy + can be bypassed or not using the 'no_proxy' argument + """ + no_proxy = '192.168.0.0/24,127.0.0.1,localhost.localdomain,172.16.1.1' + # Test 'no_proxy' argument + assert should_bypass_proxies(url, no_proxy=no_proxy) == expected + + +@pytest.mark.skipif(os.name != 'nt', reason='Test only on Windows') +@pytest.mark.parametrize( + 'url, expected, override', ( + ('http://192.168.0.1:5000/', True, None), + ('http://192.168.0.1/', True, None), + ('http://172.16.1.1/', True, None), + ('http://172.16.1.1:5000/', True, None), + ('http://localhost.localdomain:5000/v1.0/', True, None), + ('http://172.16.1.22/', False, None), + ('http://172.16.1.22:5000/', False, None), + ('http://google.com:5000/v1.0/', False, None), + ('http://mylocalhostname:5000/v1.0/', True, ''), + ('http://192.168.0.1/', False, ''), + )) +def test_should_bypass_proxies_win_registry(url, expected, override, + monkeypatch): + """Tests for function should_bypass_proxies to check if proxy + can be bypassed or not with Windows registry settings + """ + if override is None: + override = '192.168.*;127.0.0.1;localhost.localdomain;172.16.1.1' + if compat.is_py3: + import winreg + else: + import _winreg as winreg + + class RegHandle: + def Close(self): + pass + + ie_settings = RegHandle() + + def OpenKey(key, subkey): + return ie_settings + + def QueryValueEx(key, value_name): + if key is ie_settings: + if value_name == 'ProxyEnable': + return [1] + elif value_name == 'ProxyOverride': + return [override] + + monkeypatch.setenv('http_proxy', '') + monkeypatch.setenv('https_proxy', '') + monkeypatch.setenv('ftp_proxy', '') + monkeypatch.setenv('no_proxy', '') + monkeypatch.setenv('NO_PROXY', '') + monkeypatch.setattr(winreg, 'OpenKey', OpenKey) + monkeypatch.setattr(winreg, 'QueryValueEx', QueryValueEx) + + +@pytest.mark.parametrize( + 'env_name, value', ( + ('no_proxy', '192.168.0.0/24,127.0.0.1,localhost.localdomain'), + ('no_proxy', None), + ('a_new_key', '192.168.0.0/24,127.0.0.1,localhost.localdomain'), + ('a_new_key', None), + )) +def test_set_environ(env_name, value): + """Tests set_environ will set environ values and will restore the environ.""" + environ_copy = copy.deepcopy(os.environ) + with set_environ(env_name, value): + assert os.environ.get(env_name) == value + + assert os.environ == environ_copy + + +def test_set_environ_raises_exception(): + """Tests set_environ will raise exceptions in context when the + value parameter is None.""" + with pytest.raises(Exception) as exception: + with set_environ('test1', None): + raise Exception('Expected exception') + + assert 'Expected exception' in str(exception.value) diff --git a/requests/packages/urllib3/contrib/__init__.py b/tests/testserver/__init__.py similarity index 100% rename from requests/packages/urllib3/contrib/__init__.py rename to tests/testserver/__init__.py diff --git a/tests/testserver/server.py b/tests/testserver/server.py new file mode 100755 index 0000000..6a1dcaa --- /dev/null +++ b/tests/testserver/server.py @@ -0,0 +1,127 @@ +# -*- coding: utf-8 -*- + +import threading +import socket +import select + + +def consume_socket_content(sock, timeout=0.5): + chunks = 65536 + content = b'' + + while True: + more_to_read = select.select([sock], [], [], timeout)[0] + if not more_to_read: + break + + new_content = sock.recv(chunks) + if not new_content: + break + + content += new_content + + return content + + +class Server(threading.Thread): + """Dummy server using for unit testing""" + WAIT_EVENT_TIMEOUT = 5 + + def __init__(self, handler=None, host='localhost', port=0, requests_to_handle=1, wait_to_close_event=None): + super(Server, self).__init__() + + self.handler = handler or consume_socket_content + self.handler_results = [] + + self.host = host + self.port = port + self.requests_to_handle = requests_to_handle + + self.wait_to_close_event = wait_to_close_event + self.ready_event = threading.Event() + self.stop_event = threading.Event() + + @classmethod + def text_response_server(cls, text, request_timeout=0.5, **kwargs): + def text_response_handler(sock): + request_content = consume_socket_content(sock, timeout=request_timeout) + sock.send(text.encode('utf-8')) + + return request_content + + + return Server(text_response_handler, **kwargs) + + @classmethod + def basic_response_server(cls, **kwargs): + return cls.text_response_server( + "HTTP/1.1 200 OK\r\n" + + "Content-Length: 0\r\n\r\n", + **kwargs + ) + + def run(self): + try: + self.server_sock = self._create_socket_and_bind() + # in case self.port = 0 + self.port = self.server_sock.getsockname()[1] + self.ready_event.set() + self._handle_requests() + + if self.wait_to_close_event: + self.wait_to_close_event.wait(self.WAIT_EVENT_TIMEOUT) + finally: + self.ready_event.set() # just in case of exception + self._close_server_sock_ignore_errors() + self.stop_event.set() + + def _create_socket_and_bind(self): + sock = socket.socket() + sock.bind((self.host, self.port)) + sock.listen(0) + return sock + + def _close_server_sock_ignore_errors(self): + try: + self.server_sock.close() + except IOError: + pass + + def _handle_requests(self): + for _ in range(self.requests_to_handle): + sock = self._accept_connection() + if not sock: + break + + handler_result = self.handler(sock) + + self.handler_results.append(handler_result) + + def _accept_connection(self): + try: + ready, _, _ = select.select([self.server_sock], [], [], self.WAIT_EVENT_TIMEOUT) + if not ready: + return None + + return self.server_sock.accept()[0] + except (select.error, socket.error): + return None + + def __enter__(self): + self.start() + self.ready_event.wait(self.WAIT_EVENT_TIMEOUT) + return self.host, self.port + + def __exit__(self, exc_type, exc_value, traceback): + if exc_type is None: + self.stop_event.wait(self.WAIT_EVENT_TIMEOUT) + else: + if self.wait_to_close_event: + # avoid server from waiting for event timeouts + # if an exception is found in the main thread + self.wait_to_close_event.set() + + # ensure server thread doesn't get stuck waiting for connections + self._close_server_sock_ignore_errors() + self.join() + return False # allow exceptions to propagate diff --git a/tests/utils.py b/tests/utils.py new file mode 100755 index 0000000..9b797fd --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +import contextlib +import os + + +@contextlib.contextmanager +def override_environ(**kwargs): + save_env = dict(os.environ) + for key, value in kwargs.items(): + if value is None: + del os.environ[key] + else: + os.environ[key] = value + try: + yield + finally: + os.environ.clear() + os.environ.update(save_env) diff --git a/tox.ini b/tox.ini new file mode 100755 index 0000000..2a961c8 --- /dev/null +++ b/tox.ini @@ -0,0 +1,8 @@ +[tox] +envlist = py26,py27,py33,py34,py35,py36 + +[testenv] + +commands = + pip install -e .[socks] + python setup.py test \ No newline at end of file