././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1615980257.5136695 logzero-1.7.0/0000755000175100001710000000000000000000000012540 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/CONTRIBUTING.rst0000644000175100001710000000622200000000000015203 0ustar00runnerdocker.. highlight:: shell ============ Contributing ============ Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given. You can contribute in many ways: Types of Contributions ---------------------- Report Bugs ~~~~~~~~~~~ Report bugs at https://github.com/metachris/logzero/issues. If you are reporting a bug, please include: * Your operating system name and version. * Any details about your local setup that might be helpful in troubleshooting. * Detailed steps to reproduce the bug. Fix Bugs ~~~~~~~~ Look through the GitHub issues for bugs. Anything tagged with "bug" and "help wanted" is open to whoever wants to implement it. Implement Features ~~~~~~~~~~~~~~~~~~ Look through the GitHub issues for features. Anything tagged with "enhancement" and "help wanted" is open to whoever wants to implement it. Write Documentation ~~~~~~~~~~~~~~~~~~~ logzero could always use more documentation, whether as part of the official logzero docs, in docstrings, or even on the web in blog posts, articles, and such. Submit Feedback ~~~~~~~~~~~~~~~ The best way to send feedback is to file an issue at https://github.com/metachris/logzero/issues. If you are proposing a feature: * Explain in detail how it would work. * Keep the scope as narrow as possible, to make it easier to implement. * Remember that this is a volunteer-driven project, and that contributions are welcome :) Get Started! ------------ Ready to contribute? Here's how to set up `logzero` for local development. 1. Fork the `logzero` repo on GitHub. 2. Clone your fork locally:: $ git clone git@github.com:your_name_here/logzero.git 3. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up your fork for local development:: $ mkvirtualenv logzero $ cd logzero/ $ python setup.py develop 4. Create a branch for local development:: $ git checkout -b name-of-your-bugfix-or-feature Now you can make your changes locally. 5. When you're done making changes, check that your changes pass flake8 and the tests, including testing other Python versions with tox:: $ flake8 logzero tests $ python setup.py test or py.test $ tox To get flake8 and tox, just pip install them into your virtualenv. 6. Commit your changes and push your branch to GitHub:: $ git add . $ git commit -m "Your detailed description of your changes." $ git push origin name-of-your-bugfix-or-feature 7. Submit a pull request through the GitHub website. Pull Request Guidelines ----------------------- Before you submit a pull request, check that it meets these guidelines: 1. The pull request should include tests. 2. If the pull request adds functionality, the docs should be updated. Put your new functionality into a function with a docstring, and add the feature to the list in README.rst. 3. The pull request should work for Python 2.6, 2.7, 3.4, 3.5, 3.6 and for PyPy. Check https://travis-ci.org/metachris/logzero/pull_requests and make sure that the tests pass for all supported Python versions. Tips ---- To run a subset of tests:: $ py.test tests.test_logzero ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/HISTORY.md0000644000175100001710000000612400000000000014226 0ustar00runnerdockerHistory ======= 1.6.5 (2021-03-17) ------------------ - Export loglevels directly (you can use eg. `logzero.DEBUG` instead of `logging.DEBUG`) - `setup_default_logger` use `backupCount` - Update dependencies - PRs: (386)[https://github.com/metachris/logzero/pull/386] 1.6.3 (2020-11-15) ------------------ - JSON logging with UTF-8 enabled by default ([PR 357](https://github.com/metachris/logzero/pull/357)) 1.6.0 (1.6.2) (2020-10-29) -------------------------- - JSON logging support ([PR 344][]) - Ability to easily change colors ([\#82][]) - Allow creating a root logger ([\#342][]) - Bugfix: file logging with lower loglevel than stream ([PR 338][]) - Running tests with Python up to 3.9 - Dependency updates 1.5.0 (2018-03-07) ------------------ - `logzero.syslog(..)` ([PR 83][]) 1.4.0 (2018-03-02) ------------------ - Allow Disabling stderr Output ([PR 83][1]) 1.3.0 (2017-07-19) ------------------ - Color output now works in Windows (supported by colorama) 1.2.1 (2017-07-09) ------------------ - Logfiles with custom loglevels (eg. stream handler with DEBUG and file handler with ERROR). 1.2.0 (2017-07-05) ------------------ - Way better API for configuring the default logger with logzero.loglevel(..), logzero.logfile(..), etc. - Built-in rotating logfile support. ``` python import logging import logzero from logzero import logger # This log message goes to the console logger.debug("hello") # Set a minimum log level logzero.loglevel(logging.INFO) # Set a logfile (all future log messages are also saved there) logzero.logfile("/tmp/logfile.log") # Set a rotating logfile (replaces the previous logfile handler) logzero.logfile("/tmp/rotating-logfile.log", maxBytes=1000000, backupCount=3) # Disable logging to a file logzero.logfile(None) # Set a custom formatter formatter = logging.Formatter('%(name)s - %(asctime)-15s - %(levelname)s: %(message)s'); logzero.formatter(formatter) # Log some variables logger.info("var1: %s, var2: %s", var1, var2) ``` 1.1.2 (2017-07-04) ------------------ - Better reconfiguration of handlers, doesn't remove custom handlers anymore 1.1.0 (2017-07-03) ------------------ - Bugfix: Disabled color logging to logfile 1.1.0 (2017-07-02) ------------------ - Global default logger instance (logzero.logger) - Ability to reconfigure the default logger with (logzero.setup\_default\_logger(..)) - More tests - More documentation 1.0.0 (2017-06-27) ------------------ - Cleanup and documentation 0.2.0 (2017-06-12) ------------------ - Working logzero package with code and tests 0.1.0 (2017-06-12) ------------------ - First release on PyPI. [PR 344]: https://github.com/metachris/logzero/pull/344 [\#82]: https://github.com/metachris/logzero/issues/82 [\#342]: https://github.com/metachris/logzero/pull/342 [PR 338]: https://github.com/metachris/logzero/pull/338 [PR 83]: https://github.com/metachris/logzero/pull/84 [1]: https://github.com/metachris/logzero/pull/83 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/LICENSE0000644000175100001710000000205700000000000013551 0ustar00runnerdocker MIT License Copyright (c) 2017, Chris Hager 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. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/MANIFEST.in0000644000175100001710000000036500000000000014302 0ustar00runnerdockerinclude CONTRIBUTING.rst include HISTORY.md include LICENSE include README.md recursive-include tests * recursive-exclude * __pycache__ recursive-exclude * *.py[co] recursive-include docs *.rst *.md conf.py Makefile make.bat *.jpg *.png *.gif ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1615980257.5136695 logzero-1.7.0/PKG-INFO0000644000175100001710000003407200000000000013643 0ustar00runnerdockerMetadata-Version: 2.1 Name: logzero Version: 1.7.0 Summary: Robust and effective logging for Python 2 and 3 Home-page: https://github.com/metachris/logzero Author: Chris Hager Author-email: chris@linuxuser.at License: MIT license Description: # logzero ![Build status for master branch](https://github.com/metachris/logzero/workflows/Run%20the%20tests/badge.svg) [![Documentation Status](https://readthedocs.org/projects/logzero/badge/?version=latest)](https://logzero.readthedocs.io/en/latest/?badge=latest) [![Latest version on PyPi](https://img.shields.io/pypi/v/logzero.svg)](https://pypi.python.org/pypi/logzero) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/logzero/badges/version.svg)](https://anaconda.org/conda-forge/logzero) [![Downloads](https://pepy.tech/badge/logzero/week)](https://pepy.tech/project/logzero) Robust and effective logging for Python 2 and 3. ![Logo](https://raw.githubusercontent.com/metachris/logzero/master/docs/_static/demo-output-with-beaver.png) * Documentation: https://logzero.readthedocs.io * GitHub: https://github.com/metachris/logzero Features -------- * Easy logging to console and/or (rotating) file. * Provides a fully configured standard [Python logger object](https://docs.python.org/2/library/logging.html#module-level-functions>). * JSON logging (with integrated [python-json-logger](https://github.com/madzak/python-json-logger)) * Pretty formatting, including level-specific colors in the console. * No dependencies * Windows color output supported by [colorama](https://github.com/tartley/colorama) * Robust against str/bytes encoding problems, works with all kinds of character encodings and special characters. * Multiple loggers can write to the same logfile (also across multiple Python files and processes). * Global default logger with [logzero.logger](https://logzero.readthedocs.io/en/latest/#i-logzero-logger) and custom loggers with [logzero.setup_logger(..)](https://logzero.readthedocs.io/en/latest/#i-logzero-setup-logger). * Compatible with Python 2 and 3. * All contained in a [single file](https://github.com/metachris/logzero/blob/master/logzero/__init__.py). * Licensed under the MIT license. * Heavily inspired by the [Tornado web framework](https://github.com/tornadoweb/tornado). Installation: ```shell python -m pip install logzero ``` Example Usage ------------- ```python from logzero import logger logger.debug("hello") logger.info("info") logger.warning("warn") logger.error("error") # This is how you'd log an exception try: raise Exception("this is a demo exception") except Exception as e: logger.exception(e) # JSON logging import logzero logzero.json() logger.info("JSON test") # Start writing into a logfile logzero.logfile("/tmp/logzero-demo.log") # Set a minimum loglevel logzero.loglevel(logzero.WARNING) ``` This is the output: ![demo-output](https://raw.githubusercontent.com/metachris/logzero/master/docs/_static/demo-output-json.png) Note: You can find more examples in the documentation: https://logzero.readthedocs.io ### JSON logging JSON logging can be enabled for the default logger with `logzero.json()`, or with `setup_logger(json=True)` for custom loggers: ```python >>> logzero.json() >>> logger.info("test") {"asctime": "2020-10-21 10:42:45,808", "filename": "", "funcName": "", "levelname": "INFO", "levelno": 20, "lineno": 1, "module": "", "message": "test", "name": "logzero_default", "pathname": "", "process": 76179, "processName": "MainProcess", "threadName": "MainThread"} >>> my_logger = setup_logger(json=True) >>> my_logger.info("test") {"asctime": "2020-10-21 10:42:45,808", "filename": "", "funcName": "", "levelname": "INFO", "levelno": 20, "lineno": 1, "module": "", "message": "test", "name": "logzero_default", "pathname": "", "process": 76179, "processName": "MainProcess", "threadName": "MainThread"} ``` The logged JSON object has these fields: ```json { "asctime": "2020-10-21 10:43:40,765", "filename": "test.py", "funcName": "test_this", "levelname": "INFO", "levelno": 20, "lineno": 9, "module": "test", "message": "info", "name": "logzero", "pathname": "_tests/test.py", "process": 76204, "processName": "MainProcess", "threadName": "MainThread" } ``` Exceptions logged with `logger.exception(e)` have these additional JSON fields: ```json { "levelname": "ERROR", "levelno": 40, "message": "this is a demo exception", "exc_info": "Traceback (most recent call last):\n File \"_tests/test.py\", line 15, in test_this\n raise Exception(\"this is a demo exception\")\nException: this is a demo exception" } ``` Take a look at the documentation for more information and examples: * Documentation: https://logzero.readthedocs.io. Installation ------------ Install `logzero` with [pip](https://pip.pypa.io): ```shell python -m pip install logzero ``` Here's how you setup a virtualenv and download and run the demo: ```shell # Create and activate a virtualenv in ./venv/ python3 -m venv venv . venv/bin/activate # Install logzero python -m pip install logzero # Download and run demo.py wget https://raw.githubusercontent.com/metachris/logzero/master/examples/demo.py python demo.py ``` If you don't have [pip](https://pip.pypa.io) installed, this [Python installation guide](http://docs.python-guide.org/en/latest/starting/installation/) can guide you through the process. Alternatively, if you use the [Anaconda distribution](https://www.anaconda.com/download/): ```shell $ conda config --add channels conda-forge $ conda install logzero ``` You can also install `logzero` from the public [Github repo](https://github.com/metachris/logzero): ```shell $ git clone https://github.com/metachris/logzero.git $ cd logzero $ python setup.py install ``` Contributors ------------ * [Chris Hager](https://github.com/metachris) * [carlodr](https://github.com/carlodri) * [Brian Lenz](https://github.com/brianlenz) * [David Martin](https://github.com/dmartin35) * [Zakaria Zajac](madzak) (creator of [python-json-logger](https://github.com/madzak/python-json-logger)) --- Development ----------- **Getting started** ```shell $ git clone https://github.com/metachris/logzero.git $ cd logzero # Activate virtualenv $ python3 -m venv venv $ . venv/bin/activate # Install main and dev dependencies $ pip install -e . $ pip install -r requirements_dev.txt # Run the tests $ make test # Run the linter $ make lint # Generate the docs (will auto-open in Chrome) $ make docs # You can enable watching mode to automatically rebuild on changes: $ make servedocs ``` To test with Python 2.7, you can use Docker: ```shell docker run --rm -it -v /Users/chris/stream/logzero:/mnt python:2.7 /bin/bash ``` Now you have a shell with the current directory mounted into `/mnt/` inside the container. **Notes** * [pytest](https://docs.pytest.org/en/latest/) is the test runner * CI is run with [Github actions](https://github.com/metachris/logzero/tree/master/.github/workflows). * Download stats: https://pepy.tech/project/logzero --- Changelog --------- See the changelog here: https://github.com/metachris/logzero/blob/master/HISTORY.md Feedback -------- All kinds of feedback and contributions are welcome. * [Create an issue](https://github.com/metachris/logzero/issues/new) * Create a pull request * [@metachris](https://twitter.com/metachris) ![logo](https://raw.githubusercontent.com/metachris/logzero/master/docs/_static/logo-420.png) History ======= 1.6.5 (2021-03-17) ------------------ - Export loglevels directly (you can use eg. `logzero.DEBUG` instead of `logging.DEBUG`) - `setup_default_logger` use `backupCount` - Update dependencies - PRs: (386)[https://github.com/metachris/logzero/pull/386] 1.6.3 (2020-11-15) ------------------ - JSON logging with UTF-8 enabled by default ([PR 357](https://github.com/metachris/logzero/pull/357)) 1.6.0 (1.6.2) (2020-10-29) -------------------------- - JSON logging support ([PR 344][]) - Ability to easily change colors ([\#82][]) - Allow creating a root logger ([\#342][]) - Bugfix: file logging with lower loglevel than stream ([PR 338][]) - Running tests with Python up to 3.9 - Dependency updates 1.5.0 (2018-03-07) ------------------ - `logzero.syslog(..)` ([PR 83][]) 1.4.0 (2018-03-02) ------------------ - Allow Disabling stderr Output ([PR 83][1]) 1.3.0 (2017-07-19) ------------------ - Color output now works in Windows (supported by colorama) 1.2.1 (2017-07-09) ------------------ - Logfiles with custom loglevels (eg. stream handler with DEBUG and file handler with ERROR). 1.2.0 (2017-07-05) ------------------ - Way better API for configuring the default logger with logzero.loglevel(..), logzero.logfile(..), etc. - Built-in rotating logfile support. ``` python import logging import logzero from logzero import logger # This log message goes to the console logger.debug("hello") # Set a minimum log level logzero.loglevel(logging.INFO) # Set a logfile (all future log messages are also saved there) logzero.logfile("/tmp/logfile.log") # Set a rotating logfile (replaces the previous logfile handler) logzero.logfile("/tmp/rotating-logfile.log", maxBytes=1000000, backupCount=3) # Disable logging to a file logzero.logfile(None) # Set a custom formatter formatter = logging.Formatter('%(name)s - %(asctime)-15s - %(levelname)s: %(message)s'); logzero.formatter(formatter) # Log some variables logger.info("var1: %s, var2: %s", var1, var2) ``` 1.1.2 (2017-07-04) ------------------ - Better reconfiguration of handlers, doesn't remove custom handlers anymore 1.1.0 (2017-07-03) ------------------ - Bugfix: Disabled color logging to logfile 1.1.0 (2017-07-02) ------------------ - Global default logger instance (logzero.logger) - Ability to reconfigure the default logger with (logzero.setup\_default\_logger(..)) - More tests - More documentation 1.0.0 (2017-06-27) ------------------ - Cleanup and documentation 0.2.0 (2017-06-12) ------------------ - Working logzero package with code and tests 0.1.0 (2017-06-12) ------------------ - First release on PyPI. [PR 344]: https://github.com/metachris/logzero/pull/344 [\#82]: https://github.com/metachris/logzero/issues/82 [\#342]: https://github.com/metachris/logzero/pull/342 [PR 338]: https://github.com/metachris/logzero/pull/338 [PR 83]: https://github.com/metachris/logzero/pull/84 [1]: https://github.com/metachris/logzero/pull/83 Keywords: logzero Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Natural Language :: English Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Description-Content-Type: text/markdown ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/README.md0000644000175100001710000001615500000000000014027 0ustar00runnerdocker# logzero ![Build status for master branch](https://github.com/metachris/logzero/workflows/Run%20the%20tests/badge.svg) [![Documentation Status](https://readthedocs.org/projects/logzero/badge/?version=latest)](https://logzero.readthedocs.io/en/latest/?badge=latest) [![Latest version on PyPi](https://img.shields.io/pypi/v/logzero.svg)](https://pypi.python.org/pypi/logzero) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/logzero/badges/version.svg)](https://anaconda.org/conda-forge/logzero) [![Downloads](https://pepy.tech/badge/logzero/week)](https://pepy.tech/project/logzero) Robust and effective logging for Python 2 and 3. ![Logo](https://raw.githubusercontent.com/metachris/logzero/master/docs/_static/demo-output-with-beaver.png) * Documentation: https://logzero.readthedocs.io * GitHub: https://github.com/metachris/logzero Features -------- * Easy logging to console and/or (rotating) file. * Provides a fully configured standard [Python logger object](https://docs.python.org/2/library/logging.html#module-level-functions>). * JSON logging (with integrated [python-json-logger](https://github.com/madzak/python-json-logger)) * Pretty formatting, including level-specific colors in the console. * No dependencies * Windows color output supported by [colorama](https://github.com/tartley/colorama) * Robust against str/bytes encoding problems, works with all kinds of character encodings and special characters. * Multiple loggers can write to the same logfile (also across multiple Python files and processes). * Global default logger with [logzero.logger](https://logzero.readthedocs.io/en/latest/#i-logzero-logger) and custom loggers with [logzero.setup_logger(..)](https://logzero.readthedocs.io/en/latest/#i-logzero-setup-logger). * Compatible with Python 2 and 3. * All contained in a [single file](https://github.com/metachris/logzero/blob/master/logzero/__init__.py). * Licensed under the MIT license. * Heavily inspired by the [Tornado web framework](https://github.com/tornadoweb/tornado). Installation: ```shell python -m pip install logzero ``` Example Usage ------------- ```python from logzero import logger logger.debug("hello") logger.info("info") logger.warning("warn") logger.error("error") # This is how you'd log an exception try: raise Exception("this is a demo exception") except Exception as e: logger.exception(e) # JSON logging import logzero logzero.json() logger.info("JSON test") # Start writing into a logfile logzero.logfile("/tmp/logzero-demo.log") # Set a minimum loglevel logzero.loglevel(logzero.WARNING) ``` This is the output: ![demo-output](https://raw.githubusercontent.com/metachris/logzero/master/docs/_static/demo-output-json.png) Note: You can find more examples in the documentation: https://logzero.readthedocs.io ### JSON logging JSON logging can be enabled for the default logger with `logzero.json()`, or with `setup_logger(json=True)` for custom loggers: ```python >>> logzero.json() >>> logger.info("test") {"asctime": "2020-10-21 10:42:45,808", "filename": "", "funcName": "", "levelname": "INFO", "levelno": 20, "lineno": 1, "module": "", "message": "test", "name": "logzero_default", "pathname": "", "process": 76179, "processName": "MainProcess", "threadName": "MainThread"} >>> my_logger = setup_logger(json=True) >>> my_logger.info("test") {"asctime": "2020-10-21 10:42:45,808", "filename": "", "funcName": "", "levelname": "INFO", "levelno": 20, "lineno": 1, "module": "", "message": "test", "name": "logzero_default", "pathname": "", "process": 76179, "processName": "MainProcess", "threadName": "MainThread"} ``` The logged JSON object has these fields: ```json { "asctime": "2020-10-21 10:43:40,765", "filename": "test.py", "funcName": "test_this", "levelname": "INFO", "levelno": 20, "lineno": 9, "module": "test", "message": "info", "name": "logzero", "pathname": "_tests/test.py", "process": 76204, "processName": "MainProcess", "threadName": "MainThread" } ``` Exceptions logged with `logger.exception(e)` have these additional JSON fields: ```json { "levelname": "ERROR", "levelno": 40, "message": "this is a demo exception", "exc_info": "Traceback (most recent call last):\n File \"_tests/test.py\", line 15, in test_this\n raise Exception(\"this is a demo exception\")\nException: this is a demo exception" } ``` Take a look at the documentation for more information and examples: * Documentation: https://logzero.readthedocs.io. Installation ------------ Install `logzero` with [pip](https://pip.pypa.io): ```shell python -m pip install logzero ``` Here's how you setup a virtualenv and download and run the demo: ```shell # Create and activate a virtualenv in ./venv/ python3 -m venv venv . venv/bin/activate # Install logzero python -m pip install logzero # Download and run demo.py wget https://raw.githubusercontent.com/metachris/logzero/master/examples/demo.py python demo.py ``` If you don't have [pip](https://pip.pypa.io) installed, this [Python installation guide](http://docs.python-guide.org/en/latest/starting/installation/) can guide you through the process. Alternatively, if you use the [Anaconda distribution](https://www.anaconda.com/download/): ```shell $ conda config --add channels conda-forge $ conda install logzero ``` You can also install `logzero` from the public [Github repo](https://github.com/metachris/logzero): ```shell $ git clone https://github.com/metachris/logzero.git $ cd logzero $ python setup.py install ``` Contributors ------------ * [Chris Hager](https://github.com/metachris) * [carlodr](https://github.com/carlodri) * [Brian Lenz](https://github.com/brianlenz) * [David Martin](https://github.com/dmartin35) * [Zakaria Zajac](madzak) (creator of [python-json-logger](https://github.com/madzak/python-json-logger)) --- Development ----------- **Getting started** ```shell $ git clone https://github.com/metachris/logzero.git $ cd logzero # Activate virtualenv $ python3 -m venv venv $ . venv/bin/activate # Install main and dev dependencies $ pip install -e . $ pip install -r requirements_dev.txt # Run the tests $ make test # Run the linter $ make lint # Generate the docs (will auto-open in Chrome) $ make docs # You can enable watching mode to automatically rebuild on changes: $ make servedocs ``` To test with Python 2.7, you can use Docker: ```shell docker run --rm -it -v /Users/chris/stream/logzero:/mnt python:2.7 /bin/bash ``` Now you have a shell with the current directory mounted into `/mnt/` inside the container. **Notes** * [pytest](https://docs.pytest.org/en/latest/) is the test runner * CI is run with [Github actions](https://github.com/metachris/logzero/tree/master/.github/workflows). * Download stats: https://pepy.tech/project/logzero --- Changelog --------- See the changelog here: https://github.com/metachris/logzero/blob/master/HISTORY.md Feedback -------- All kinds of feedback and contributions are welcome. * [Create an issue](https://github.com/metachris/logzero/issues/new) * Create a pull request * [@metachris](https://twitter.com/metachris) ![logo](https://raw.githubusercontent.com/metachris/logzero/master/docs/_static/logo-420.png) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1615980257.5096693 logzero-1.7.0/docs/0000755000175100001710000000000000000000000013470 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/Makefile0000644000175100001710000001515600000000000015140 0ustar00runnerdocker# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = 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 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 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 " 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)" clean: rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." 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." 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/logzero.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/logzero.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/logzero" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/logzero" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." 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." 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." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." 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." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." 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." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1615980257.5136695 logzero-1.7.0/docs/_static/0000755000175100001710000000000000000000000015116 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/_static/demo-output-json.png0000644000175100001710000010716000000000000021062 0ustar00runnerdockerPNG  IHDRp7IDATx?k1a̘F1șGJ)u412ґCPKϷs:÷x>^6{\Z׾?]k{CQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQak- cЦ=Z_4DC:  eᦛѯ?A o~)zވm8,>Θ$$n@}Ӿ=Di%Lz7jolٲ"DG.]hݺܯ((JWu\s=2Q {>MorW S{{\GFϨzGOnFbvVBR|,=3{}B@r/-M쭬UٰdMgN1o>j*O? 2ѻwM6}|_/+(RBȣamOo+7^1hÄN,}hHl3' "%dzJgtd(0Xr/nC8̃ [|'bk+.}:qEQEͅxv\Ffcߘ_2zmۄHPpy%y來Mvlē b>qfwXa!0+Wa=:;68aM8?{^ V/,CD/#F?#GXbի<1ӦMۿW_}f͚,NBnݺ/Ë/nܸ1EQEQb>r3 J;yq=MIfj۳uM@|yU<Z瘄fdgy 旹MzW ѶMe|ΡO]yyS^aO>5!PݲZ9寮͖mX"'OR1sLvVVVnܸ :e299uV+(Bٶ=NlFRn_++ļ6Ⱦ:b$Rŷcc6mf/ >?;>X   nJ%qƐeK۹pLCc{](`28 Lv0 mo#)>x{^)˖Q4߼yr&OS.0`{yiii*-bOQZZlPEQPޤbiO#{ʏyO8.D*8bgZ:/?08 /!X,_MUG$?P`î@JW<Ss㥸)11^Bʕ+c=qD?˗/in((*􀩏su][tH*-(F{Cpt[S {t2*)vc8\r5޺y32b57ur>H%.=ꈷ¶).pd{(namfڪ(ii B&˜C.m\~J|g3y8 %n/笹rҥܦͅőGUPP"SLO8qs.YԩS\U(( e^z22miۃLKp _Y`Qe\۳lՇH4-X`JzhcA/Rze=̏EvOG߶{@H;~fV"WѢEmg=/,@ÆuB*A1a)m>g˖-OfѣGWX-g=x@~>ow|,Q>׉*( e|IHS<}wqҫ=%8O\-JK^T[ (ʥԀPMʈɉ1(PԧĀ_'vBQEQ  j|XTEQEQEQEQEQEQEQEQEQEQEQEmgKkjG   PV@/Hr< ]^r@|L=O2}U$ ?ej|G4tСDԴkn]v 6 (l1Xw4kjo6B0|`}b .`7N"x¾7GOvR|l=c2}GQdy#,1 ~؏ ݻwS3K.믿>vJqcƌ((PNA$ax5"NgbRolЇ0rh9!X"_`r?> >qƐǕ{7yC [2${"YPp8)PEQJu987r] &̓Fh)"ˋ) 8I::<)^yjl ?o k ,EDl5xh`&vdywLqR+лowB ZsΝ; [fO~G裏zHe((gE~u'>xbr#EQE e`'@N4kHgx=f%q=er@>g3"_Mno}/Ώ2NSx3jV=z$nY-mNU&GgE(í[R|V㨨8y$MYO5g<-//?x  EQEQ~gBYFOT1 vhZ*T--۞ qg?spK"v3py Io "wo*I5H_(QxF=[w$з?^_zf{.6S;vEJr )))Ƙ.]S,.,,&O&E Nx۝"pSR| 1O / ParR/q\\rP L ={UB9ĬrU[:UL,C ɓy% EӾ}{xtĈPEQw  gœ SisYKacb|Ǚ$GZwiGB~7U=*a"Q(]v x͌wdo7J>r=Ǐ'nݺAQEQ@( zY5:6ܢC jGHbdʁlX*yi{;E.Ƿ>+{ 'i)&FnWgƮ1r>EZ{mq;lPZfy[aVpPy7aW_w.ֽnbJ5jTnnn:qΝdɒSN:t((RBEm\aX k-YpPU#;m<#9k;Nr= XicmX#9[{+d=ݺtOg8(W֙qԑi&) V+AW^6ku3WaLT.]h~1cCOMe=W13_#?+!-̧M-$uۜpX%e l؟w?HSRROZcgLyiWa}\Qn֬pPBsf}#]5*(_)T+:eU5+r9ڪ|/.w};AɃu{w+LOE* g@9v9N oc󌌌֭[ٳ_~Lrȑ>GPEQ7JRdX?1{@¹W dtƤ EW,L~kONN@|y5)KiiyHa*&<1p"\۶Oڻ j^φuJݬ:rfR867{ FF5~z']eTTAɓ'^~ 64i;On22h";w޽lpP=/((PeՁJԣ%/N'@z3ըƀ2XD+Xסs "y6n C6Ļ[ y,^h`A/@iV\)os&>愒ei{lJz[  xe2kU(wJs={ڵk͛7?}4=13gΌO>$%%eB"% ?(BMNjV(x>zk,}V8(&T`1gIa!e s*|\t΀4r 5ٰwVp[BSWW@ʇ'`'{yzΟ۰g@&/>ze8@J~#Gy:dKBvvv61N(1uTfF?(B&7]Ux &cՓ18A/:"!'FB| -KAFo=MM=wK5 ܮY:2P6h\r,Q(Nď6m>ojQyu &~Gydǎi׮]MFw3Xzuu}ӂ8w/=WL#). ru %68$,33xʄ?!Ϊ{B٧O<}Q͝2e %%%ntpXRQEQ~BIIө!c1ù]԰!ۅ4-ꎫ\+d9b<8YcUќIq' g$5Dk(ʜ 9xW^i㹏;rWc %q{qXtU.HIo=.Ly~%xCҘ:1;'MI(v "N ?wl l6mڨP*(@( 7x͸l1̙(j5V\)>Jr7܋`90-ݻȥK`8N_hZ< .s(9|"|6vOϢϹwꓒ^˖$vOb"o*`鲳tE($S?zJnw;G7ogQB 4Lzzz:EQEQ#$&VcOIg]>Nj Qb-4 Oܡӳik yy_'nN8QEQ(3V(/lEQEnnFQX(so~((((((((((((2!3]$jG"iB$\ W'_HžF @~n?h8cC. T#)0aޑ\588(x (JYa>΅<$Gg`_gNI{1v`O -Cpa|p1Ϝs̶l;cgyh/˩|1xz{'_'{]ϤGQEQT(5F"UA,eJeo3-F3,E* 5,C֖_$0X'Ru`<٥ ??2z7UTEQb:nl/!:i6Y6ͣ $׀*X9>2NSMa[,ByoD#! Iv~ys3̪!^i;7,c¸"<dM mR a{65Ã)H4~z(ƘiӦ߿Zf'NO2ׯ_7|Wsu}嗇^xqƍkϣ((ʯ+ SuD:·x1nbOpH7x<ݰAqg=}/!l8[e5. "_c++l˄PT& N^,09+|iEUS9vY^H㗮B9sLveeƍ٠ScѢErdc֭QEQJW; i\Ȝfl!ɢHVe F8MBۄ<i5C#9vL䔷ipHCEJk,׻:%lFp<ܘa뭃P: O|ORRRFDP9r$eeeyfvAΣ((ʯ,/5+ݑ`@&֓6dZOpբHvұPaqNwDGf㖋 #1@sπK/\CbNnx$PR[ˤeʢP@ttkS+P'}=ۭZE0??lFy汳ƍiIIBQEQt %R6vf6:AE*0fc[4-ؘe uJ!D ExfG'>:GB9{cTqu=P0gϞ'DEBã#F3EQEկ 8Gb#Ux즆 } )YYA/Jj%2v=(ODZKM@Jg,L:Ɵ/^9 enn.oʕAϝ73~xx,_ݺuSTEQL()7&#yޔ+ [Fi3z;DѸ" {4)IR|.m4EqZ&<ؖm/5h{S#)q_lv>t^ɼznQ(y33GJ|땅R5A.]۴\bzĉǏϝ;wɒ%NP(B((P)4ȸMZ Sm"/JZza:NkܑUXgU:$y 3l gS~m?>Vy7NO5\6J6 ȟ`kٙm[7}lrijѣGWX-ǎC$b^v&!1MJGQEQT(=B^PL aM(q2 y<*D,tyÃ͹nUF wp<(Prfs _'~B((Nqݍy!(J,K4((((((((((((DŽL;{KՎD"I.)2|#=@cg,ye!۟ >4zB#;w$ NFh޼eˊKtСD yoW^ D(ؠx (JYSؗ266S}p̮6|bv|}t\ vz3'mr|%O3×x]x?; 揆Twd?;1> -XgE5|n!CKtޝgBzLM\иoWEQ~?_XI@abl[GVH (UQmӂx1A%ijuXCDA';|Pwn8 e,<߷oۣJ[U/yT(WEQ~B9+u :#^Bi' m^GAHUr|d eMs!öYl0GrrysߐL9' mBXnT, ۳}>y>퇾Vw(((iժ/#F?#Gnb4//o:wjmۖ?믿櫷r 1lذk~g BQ^jᏏBi6m3|Wk֬0gΜgyfݺu?cǎ9ϟD?|ŋ˖38vXxy ڵoO8`t^ Cq ;55C:Ӥ$\ܻÚ^{-lƌ#GiYY+n޼ HfǏ\IXeW\M']vi&J_K߇((PԮ\tG5 SXڐdfE 'cqM8c㊝|#!0,db~^2/dZF,I'Tg2i(DP4yľ:>e⼆҉:u*OT, f'ao߾ >ynfFN>`..\Y߳a %Op—9yJWsdܸq<-))=OƒoFyP>yJ}K>((5ԎWK=ڙJExMcg yҀsS`c-A("=<+LMSR1w P脒 hMPՉKsL1ڔ3ydr~VAˀh]|p!d╇ XzuBy2n %? ZHKKP2Jʖ/-b|QZZꖜB@^z]ѣ%Nㄲ[npsJ({JV#g$SebTYD_q&DfisgF#!LO($ᆪA&^yz _|-ۤM6<ʛ`97=.F#\g %G{ ܹs5jB~wft͝1~arU%˖?V)??2R~yʕ՗0>P>;>((PƑWǺ,S|CXS)J}4=c b,5 'QE\_(dkuQ!cV}}&o`BeEPNl'v*\juӊhjZgVUqZ\Vb[BBb֖jMš6QF tê.I8?~>7~(s}ιs90(vLPrҤIc_w !(d`S>9fA)JB! !g7umG?%B!B!B!B!B!B!?Y̚5r;!WD,ͫOI 4kp_i'mz!|:B!D4!d8)!F;]zs|%N=qDfQ?@sE!/>}:Gqbr!B]F;Gt8K%‚֏;VX/_NxҥKMv {WpyUyօBAc\Aɒ_.]" ݇~Hk׮e7===mmm!eܼyp<;hu$rCC|$[oE4a=: Ť=BgΜI:u^p[KK 1 @l^zK: aΜ9qhtŊsGYs@/sv[sf~p -,#;qDZh4MvܹMP"L1|'H@+hooG K,Gb…G$ӜXd[Ό"3g M' .s[s'eX맡~z:U`A;q7Q(0a׮]KZ!.(9MzԩxkPT,RSx 9.y}g_PFis;q yWS1/!BpLH۷o49@2r}Ğ6j rlk\Oamm-;Þ?(Lls85&eqQh!JB!RjjjHpGɓ'IpUc?6j"(#bԋE΋~]{nyDvժU={?t ~ӟ5^~eJr= r9{;c"+B4>Q)eFK~uA{<7f.zDO4⟳O|?vBq/rnABv> }cB!lpG v裏6!B!J 9JR!B!B!B!B!B!p PKW1F&K[J7/ptIdɒw}"?{RS:LL\O4+H_|!8|'@0[, u@}֭[´_D>V*++O8Tjv~IC"svyOR`ӟ䍧D9J8vXmybE!($F&팻sbB1l28jn cD! 򥽽۳Ǒ}΁q/w9DM J`v='ƍF3A鏋BQAIl_F`4 9׿ugg'G 肑?\H>j \kDe> nJv̙C>t+Vp'#Su$M^N:E .R[ZZIM`n{ԔH?܋6"+D- DaCsso<J a z*9=a DPz~x>ǀŋG^1|u<l#Br``԰a㏙V^<~8Ekjj"=6z l&An:_]]Mh];~NSXϞ=JؒHׯM^̸0Gxn ֮.Ԥ$ak<=se3J(Y";95A'h&J6('wx\rΝ |u=={fJl:l |'ߣE? eY!P{ )(YH۲Lda 3gf_.wL?\t髯 '=BdXIXcY… -[܊dC8/J,Ύ;fˢl7a¢ao\YYY+(ٜgYl IO6_w2AFAI;2d<僗!5CI]]]Aʙ}}}BRqO~~ Cֱ+,"߽{UcAЋelAc  7O})|;^an8a;w/(ѧ,%3(c{Á}AP{dG>EPWOۅBHPaST`֤\.} <7ZdݐM^rqىcٿsJ9Yf} nZ¯WIWT6qB!C947טɖJq&O#?t).!B,ٗerVM,FAaY hJo/]I.!B!B!B!B!B!BS/,p\p 8Rbk8+++; d޸q# TcONI./Wj:^xB!O?e7+qB`µy&.L e|[m۶/QL"P^^"0|ߜ!E!S"By}FîOGG˗ {ǎ Mu l3ؑ^YSB8B.]D;.k׮0ζ6b dXSj!4@'9>"744pTAҒQ}vlڲK&0kwy&ᰉMvYL[4DC] .~;Iu(~}#XD CMM$3w8Vp8LgΜCyn2O7o6ѸqqHю䮏PffmSNk<Bis9 _mʁo?dGP7.)ޟƑ&^zh}/ ޸8WI{98i!"Ae츲Vx/8Bd zFڨmYC'NҥK Y|-l@Dp#(={v>O[h/^$Kt3g>xI%*xw˖-!6vss3Y&xFaKA"> ⑖q^I޼}aG\'Gb…Gz/mTMRB!?0S22c-_#GPdd@` fu/D,!f)JX$ؘak&x"e[5$YswO{d˗k.6l`?:t-‡4=vqHˎGp=8"(Ru[]N3sݻw[ˀl 'xck1-;6ž={H?S۳޸x3JX=0B!Dc]XD8lWoh\B!B!B!B!B!B!v;tqjbds<^biI !$p}kĉh'l"L"P^^"ǔ0|߄B >{#afҧ$) ʂHPM!lii(ܾ};QhgYPul2"޼y& ]gg'Z,/|tb~D#\v$(?C7%>{^qםV&a[ի!-X1y crft,9sw +FSclܸ %===6/tmSN%OJ.!6߄B +W0SG~饗P̠Vd_Nb <(?~8Ekjj""y2 %dس]͔%~SHakkkWW g L÷Qyɶ|iXauu5_k4E;w^꣙Ν;g#`sO#{֭I&qwi M64zr<3X/1bGNCSF i8z]~$(B7 B|?٩Rܴ,{#Pv΃kn_[[ (G0'f7b V}=By)ďEvժUV[84d`cN\N?(<۷o[!"Noxh:9#S|ӹWmG}ĦC #ujjj;NL?\|;7`8BbK}B!DdBKF` @A xj:{08F%3{sZ+02n^̬TN '{g׹C6ܐ -;+ 8T"u׸mTi32P6;ٳ=Aon=Y7䙶##Gt 6u ҂Z[N06kmD˄&MonVwψa$NjVɑpUJ5LI+̚ʬ14'_}H|n/O>b}4T*4SjZ`E&D"HH#dOyp1[fXg@-}e.zm)Q٘[cMNWojgfm1e" @6G̓Dh=8㉖.$SRͪw۵ i*w=6 ¸UUS/W Gn]1P[[mm9yUUpzqNB;ޙ^]Ƿvf7S9s.߽n )>fzg6`Z#{ǐ܉(YmHJ3woЮ,SLv%Kzɦ͠Jq `|ZE$D"Hr[c7~A*Z5۱)f?]dOL" P>ȡS%ҵjsByD|ks5m))_|.z]zΡ}fc)1럍qAރ'5}kZk3lӕch5|ppITϲ?[q}Qo /s._\6qi֩+رE5 xSKl %u4(7zsgfo?@MћXtw.+dC UΜcrбD҉kp87pX\ڵ-E36lbƇUD"H$( |c0&GkBAR_Q+J1~oO@Ĺr[e^H{Bl~,F=|#+s1q5q~㐌ϱQc'&S`M)$#BTӬӸ\2հErU8p(?  5jtdݽ{AZUk񕙶{wConnF'6 R.IZ<NPjJU P$nthXH<):>tRׁxx{.[E?_?B5,mJ'/u@$gJҁTũ֩'['$|!\\ @( R"P.q,t|<ÉGr iUK&9:Ӹ%e:Pb7٨b6s>DX"PNN%U*jaxXv/&\3D"H$S7E-*~Mn[W8WRG. EE 4)cJ|;?#"@ Q|abF%{}ဇё@I&yF !7Eobbւ8H[oE$' Y P4^./$vPBKȁ9(2n8t@wP.fiĻI ;QP2Ӂ #ǀCJz9:P6 nȳ:|^}ui&5JH$D{vp$}t{?tz}=p1eAp_L{ˍo1 Ƙ#P"jHP#PR|8u$ssMaz!!]*aDn# O\nZT&̷߽äFen؜lHIa;g!jO@i\`~($y]0=%χwJyh>Z\@KR&O&Nطd@r) 2%i@b%6K!U_'4W$D"yuzAڪDKhgTނ3^$MN"䭱[ x%x8~554FD}\qjU"Sɧ'[&R(.K  Wm^O Fj\@VG%J̸ (L z&"He.o/R @i\ .r,<=G1 NNg'TVCENQ)+ |éfxljDQkKaҸ_,D"H$zg `AĖ&2)&a[a"7,b8e=r XÔ*}⿬K[: ̺PV9 | Ps0Fx8MrKЇȢ9T - hqq40{_#N'9VȰ l@^բP~8]s2iթ rr2yXnUH/Δ+:j?3+gU>9!%O UI wY˙ثr~"n Q"D"H$*V֝Q HDE$ȯbE3|%U7]"@#G}(6$BO(zX,Qh? _8<\\ ε͝jWOD"H$/ 3бHbcJPYQ$D"F<n.QW," v hXD"H$ʧnP]M$D"H$*W6$ )aY0O+M"H$D"vL~!Gu'AjjkoH$Dx.BkƟt.杀J}ً:Hc Ǔ"1>fJeM56j|y4{׮D"H$hCFh0yt5iH7:]{(I4=-'G+&uqޞDDF5ƙ1±wzˊomJ3-t,9(OLD"H$B!*,ɏ>,HԹLUHt!DO5Α1cې6 EWV]N̬B|JYpA M,(8t?(bn{Ӭ3a>:3Z)CN[^LM{ze7ڛ7祧tE3U-_7zpvDwe7;^rtGjҞo97oD"H$rt{(A&08qD$SO3oTH~SfF#* ɘC ѡÄN; 8S@%f+_$ ~.4 CZ38!mo܌C,)) K\Xʵ3)vXQ xAJK\tc c91Jqs_B i1Ø8,ÇfZg,q,e"PKuV'3ak qY.r"ŝq;tɍ$I@/;shĎ^H{%$T$D"QBۿ/V]'K&hK tinp95ـ Y&AdzW8Wq(Dd̹Mq_d1|gcO2R`#,uy%ll\2QvK1WsBw!ûk%.e(]u8Ldq(I$pqQDt/ \~1s\Rؚ)/]$D"FE*Hmp66o#&6=~<M0^bRCJ\^{Vͪr(q*v,(yC5z|kvn #Gqv:#pC̆~dTZE^vr@'~|i2L!lKu2oӬ|SM)8'(ʃ")_s.6UD"H$֨TW8W| @1z1aݦX&I$pyEÎRTu%ej;x,<ܯQ߃}ȰA}8i (T>:xJp rc؄QXW(QN| ;2Y/١|Ti'Sx:wBIW'%F&L+_Z k"H$D+eV5Q$K)׸Vw&k?/~?JL^]:Pv Jқo8>O emJ Vz$w"$`Ǣڄ iVJt(yˤB3]\u$_$QrFGL^}I{JHWZD"H$S=7;:3Ǽ)!p|xUq] |tF`we*Ad#Pb (𹝓9G9C#J:E㘨1TPW*>/4>չ2gf^ŷurs.19*rTېB8#W4';Sݒ*&p6=eЎdv˺)`"#OI"H$De_e_|EF]AfčGʷz#F$`@%{?n1 +2N'"7TyG+zȗ9_l݆Y86W)7TyS{E x[2pYnLѐ?X-/‹̲b VY Jpęϥ>g\D"HT| asf}u-/R u>~?Ja=,Bfeˡ7wQφ i.MHY4䇿K!ÿA)a;%D9FA*M 8:U=&Ly}+02{TFh'G~cNN8=U++(񸈉S.—D"H$KhD=t xw 3$b(5$WLMI0cn=x'y_0/XA%È=*OUtH-]CRxz*D"Ht㋌:,N>c$8;vyy3/f1D鏍s󵮵h6F:QN5gϩCjH$Dȁ-_K6GjզU ItcdABS$W)AMkT@gBwܩ|MH$D7{K/%/J=Hȣ˧ٟ~ &j0~g厣8c6I)g%S%mγm-{o#?Z^/4tn%{Tlj.5WY=ho|phɞl$%q@aFuu&rpޤ 0~M͞Ȝ\|"q\X{jͻ&L|~1kݗ`B`)Ž_||vZ:lٲ#G>}ZUU(bgg7g77 CAAn133;|%`戈DFFVUUUVVzzz"kPg5AWTHBT B@EAR$E%$( *!U*ݯy=u0;wݹ;;{z{{hFYYYee%o9::JLsy]yp>eХQۇ %%%RUUUWAsD? uuu IIIZn%\ތ Co?=7D]LL I4˽\nO|488HJ{\ZYYKOOG5;;P\\l}PZFO- g'͛ߔPs{/孭4ac ^__UBsy]x"TS2K׳始Cn)766NOOWWW?w~~pO,dXN5Xiţ{Dܐw*y ؏.$/D$2<>>RSSEywwW0 ͣ9%%9##Zd BtAcʣoNj-~677{d~%~///UA}с##e>[Prss JqXPģ{Dܐw*s##ㅂ䂥_t>NLLZH~QH=xtaN/[all,JK0iKKg|a,{/<_`@ j U+ swwLgggwvpp@_oxw,.X###<55 eXgfftA7gQOq}@@!@ EHPI@IRH(@% J}8;[ݽrt윙9099╕l<|0x<)GT(Dl+?Aw/‛1˼ym'0 os><< ؁Qw9xG_,eボaPO"γ<>>*;<<$&K PJNX4ih uq컵rHd ğ``-Fs̗y?\:///c ;.9wSE%~’V EDN*i7‚j0GGG///rMؘ֏0f1C1)bbqSR_ ǿ+v}}Y)@(GD0BC&!&ꔶzi@SOggh'ۋ] OBU]ZZ@;ǃWk#7Nxɦ:--L8zg)3<==z]@ ,OQTdE<'}\Ҥ[ǘ,-KwkdD~1d$gmmm-[9>#%iI5ypp9ػ(P҇F$- $ E5T߷:@9~1# Yl=== ?!W pN'R!AG m@Z0XESYPo.࠭!`*&b=<>@^(M5<߀Wz9$d ,)O%JG2!3#%J@26GN+.hxq@IPK0"x D:JN\sِ8U?99P夑!~<y(@J![^B^jLLwnl@iE%B8?JӪK N]< oꒆ(E **y@ɽ$((s wd%+ A} "&@FiGNKuN|TN &i!SQcF^@;p;Z [ :=aZo333ܗn]=~uESSSe|J,X&*TPL ܾ;{?}EA.r—9WS&kU*Aytk#᯻C)DڣbZ=,H' RTnڣq:3g5ù6ʷA? (ά<==-(,P<{ =8..InrgLa8x~ Adlcz+澕FAwv}9erG?gggs(ŋ4D ػݎP~(-UJiD*ZFބKi&-D *&&@CQ I4%MzUV W>|uzg7O.5.~z*t{&BPz`{B~-V;X Huq׿A$KZɪhvI@^dq2vdצN9u׷Z>ebPi mO~] QsK}glAٌ]m)VQ;=6Ns6DA":{31! aڵkwxƠʕ+qIJ[Lm$[ҲE7mPv|wBL"'2s!?W:ySc3JJ]nykuh8:Qrs9qI6sVfBNVAEaceg6fmtWXIuj^OWNA/΋a{=<r]ș0=uN6RN-+Ύ,T oL90ۀw/a7r>`y';`{Ν0(/ Al 90̀ 0` 0` 0` 0` 0`1,Du!HM.'wΗl.$ò,nO*`cIgqy6Os;Ax@⊉ v }.y \J/ٷ?{ؔx5PLX RS.eD/6/t;]{}rR0_,%2D iʡ Q¹|_By*&JMZ+҂\ Ho<#PHnt4 6#_2w3 R  ٝvuz>GmA9Eг7(s[o};߱ nwqR@sy]~MГ\or{HďERnOm8aP㣔uY*zɢCD/ݣ1U J_^<0}vևNu|m#7dd ,#2kv. 1;g^㞓 =Ơ Ϥ_ĶrSk2_wh5 |ɩAY ܹ*~,u7ekyg/ N}#lcP ={2ltcPF  J΃e7+z* >s6>$ nu9*R=ݶcoPȈk'Ү@bP֩s=w~>W޶g꫼0G(4ˠL|}sj_~3(uaDe^y0n:J`g?' 5?TfnSj^|r\ l#,k8Ơy3z% q@H/bO@x0[f5(J#lX:;|gm;|WZRUHIW[ȳh [Qsvӕ+Wa׿5;K6z JVqA9N~>W޶gl(P,| UsKΠ5WokP~_kvv]<[y>}9oM /pXY>>%s Jz衔[eȟ萵\)n9C6)/N^8eC9mP]qB.En un?BiEz3>=KZpZ+X0x{m]ok׮eW)zA8z J"z&ϾݒY[~:񽗷蓹vܰ ;w?AkJw J=ϐ~5x򼹜/iPXħr’?\K݃wOL1$Vm 5=5~nLtMׯ?r[7#&Ef%lhseQ`>'tŭO*Ȯ$ܢpwAzo -Pw=G!_5ws2ÿg.}/˯!r!?$r4bc T`nQ؊ At]In!̬K,K^ʠP|FBUpf53t~cDDi.ͥ2rUw ?w\,E|ӧUO)dK廌xw H;4lN =onG`<eӀGs^-ӱ+ l:߷{/o'x6&L1gGJ]w==W:3rhvI+q_<.盃sw`3GOV O'iPl,ϕM-S)ǹ? EꘛY͸`SF|Dzf/oWn9zSYG'|~.z]w^|\V_m0cL{ms{9pN;VNA_l8'r8(va9q[Lp֋ 0` 0` 0` 0` 0`rkE'<ľA;ہJgB\^n˫ƒi+NL]> Z$`.l_WAgNe\#nՒ2t:N;S!rH@{ІkCn[n::Ȳ#o)e"$`p[8{nvՌo,w}t7 /"B傮+nZĵ5-`=.KVS+hJ2|BXIWjǺ4/u['_7܊ ,cieP(PTHzw?[$DkM}]EW&fM74b~\db0u,;ĜwpӠ[,~rv_8m !AG oY,V'm22I<d쑽'on1P%rB_z$zJd>͖J6ն߅G\%lxD@;|xhJ)NER.I_gy11}7SE&Ac*5S4y,{:/`;VX4Gr9|ᇎVYʗ[ ZZHDkP q99TOQկ ǯLIL81W^+b+WϪz,2%ל=;q{'լmAiO%j$݂sQR&%^6i-T.Ͷ!I" yd`4`Ns+d1'[)]KJ=Ӷ/Xyg6Qs'kIΠ5~<j%(00r6zYrٷ͝ϙb|O?~gwuWGԁP߮|q{ÿˣE3*OSH6(D}] + 3N̶O{S2f7z|cpv}C&&BMSqA$Itcv(WvmoPnïiz~+_Q{<`p'+(A|AQ^QG~~Ej}oc;|2[ypIy}yYۊ^4mP2Ynvd?|EYJ^ >VK75◾j6mcP8%:bG}*Rbɾ]Y]WlHl __=>1oL\`yܚhsg>D718 zƠ9ƨ9Nkܭ5/4tC>];~uZn6_RKz:9>֚O [N=XZng~歊SOdtP^t`=Nqd2](wE>m&rZ6q+͒7g.kCOAuA ed]dLmʗƠ>zl-wAyxGvݕ~5G; ˯LN0C{.3G;atge01#Wfb🞘cw"~ Ȅwny[G:?vA fQW/e*JmW7(荖,ԯ&d [)#ingb51 _>31V0׋Ls]V.&t?:5iCn13ps3༁nke+d sݱ~ot‡~8çS<衇R2(}G2"^E@/D[92ȧoW6%1{E.-z/~Q(.NLXU;wJՕ_d~Ĭ||".[ug]=/rR8|(8"ϋ :?vA%覮" ,?v}x?wuxZ }>P1O^vQ5x=H\[ignb Cwo8(whƹmʗ[Bϭ8X:S[Y= MWҢBGKXa/jb΍QĜf9Rmtgm=^kbߝ(A?>kt!$Xr~ 4`hr |#.ܜ{["VͦpYs|]i$[ lT۷ko+duI9xuULaejp qYto84y0ztƄ0t{ȆYj.%#pr6; **Рӕ_4~6CXl]"vIfbfrDkWzs(pBJTLǩX|wB*WOk-#Ͻ>ѧoǯNOjmꫯVv$ysJFy ãLM5y"vhçOӳ `kк*3ekL]ח ?aC`"Tk90]gmy^oϯ^]]yp h.U:w1/c۹ b %2"R8ܰ{?~> &>DE?PkUĽwiˏkRC>CZ뜳|3PnIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/_static/demo-output-with-beaver.png0000644000175100001710000017413400000000000022333 0ustar00runnerdockerPNG  IHDRp#IDATx10 -p:*{}= L e e#"A+=H:UB DH@Ћ z|9A2.[{=oλK[}5ZroG@в-P@xU k<( !Wh 7èbV-Y8V+z;$ȟ<`4CkgLb?**_(99Cnݺ%{i޼|^P( ܅(=Бg>w`q>qꌸe(/ŧO1< < =y׬aDGΪǡ򴓧ib~ ȑ>y|xuqC?v )ۍq[(%oݺ+? ~9գGBP8h-нv0rBǛ/#5-Uk-=;chisJP51嘱"4p7ɩե+\.4eКTH3&p3 )?tBVg1q2*qt/1J@H<QPΛ/1\mV44h! Bq?Tk`x,um_w폟b?>WN>Ʌ&"qsoe/)t$МzA8g~}isǗүLM 9qR`';O\>je*cVL]'Yi[< ڭ* //:K,S>C)BP֬Y:ndeeOBPPJ)4FFR{t/ɐ|_[6#hy/])+.ZAXW/nnmGAP(CPn-._} |%=)n|>+hػH|*Ro:sFK?sPv|TG`TNҘԑđJi|9v;ogNRϴtr+_'u(} )D0\x:t:w*(8tR#噑ˎ;GP(6d%|Į'K>_ y :Rؐ vwǯo X^ͮHdMe-tX2K±<x?=anQ(A \^3# Q0CrG&*'zy?ռN897!A&(mGOfp+Prɩ²b>.%$imBFSPF[m`-/\OvOݵ4ePPP޽9 u9n֬ٝ ʵkrK.ЉQpP(bh vԎLI2Ɂd' }lPInsY:fZ?m^<鲸7ßSކOrX1Ic0} 1)dռN4m*&7l4i( d/ Jy|b]~705>gjQQhoőS_ %Ӗ~2{oԨM9ӦM%%c斣N:w*(7nș7(ĽBPx S`InYJ Ыg/FI Xčƹ[77i$&O-@X16{w~>Qvɂa|:%,|HsbxfkEngi㝹ڤȢTI{ZcF mz8  kԬlj0<~LJ%u@lVUkRۅ0? & iiЫ7`bYJɘ;:YR&|Isqckuq:y܅##2Z0:?coS(p8l[x%4Ud!;G$2cb:LyׯS!ǟ`gmjj^Yr˖-lfaey &mD2OaZZZZTTf͚7n._P(&![7៎χU}7[q~lhy5F7#7IS5&&yvMT$;Ybpq5|9miPQ28#JNeJ,$viiyGĥуL`טKW?3q>D_M4P*-8m:l5ֵ<9K7^D6G3s:lm8o>{$O?[;Ѥ$qDar݅l׮%#k4>7oO?eۛV{KLL |vcaBPܛԮױzCnsjϬ0|sX̟IV̬-lد "o\N1zt.=աDےc͋p(#A׎y{4qP(AjKE?QHv0T~} oǩ~GT'P%եƍ& nYFT 8 Bq/r ׾rCJO6][F"(4Layڲ7ikXreqn]'[cX jVt8=?'! >FaT(vxNFBP(VM7Y[WUT cO?r<8Lsym&˧q7[#96aJ 4RW?A)髼t3$7(H5m6eּ@( BP(4`X;K9627YZ]M축p{,n~JdbEi3.͓[D 97WF!5pBP( "UB˜d/v 9h<:jeLb&s>OMl_8c0EW;.oqWjx7(( BP(<#^Sр["\0'ygކ.֫'k?ӨL}n}*,=bKIi|yeI+6]oThoPԴw| h(gMP YeE-L4zHC rF@`>_rYq@w}ȟ<<LW@Kba?*бcSNHM1cϋBP>VI]Sg19{>'cRQMcZkH:8i.ޣc&_p;V|Ȇ>A= kL-ONh8pZxx+>"Y9@}Y8- wL9 xA6}kINjC^x8_hܸK *CP(O# yy㭽另vuQm˜ bzGj4[Ҡc.4عmN{.l%("t; .T³^zH}Pa`P I p Jzѕc{"?'Ep2)^ER^ ~3zh .]@P(ojE,®8ױf:2ZJ |^s i+|.www6_:3Tcs}:B+A0VW6m fb`RuQ~Wq$m?zzihGY #y XaȰ8DDLF%N بZ@PX-]nZ5HWPҵkWxi޼9gs}Q޽×t'''SPr&MjϞ=|_~77GP(vǮz_vwv?kϷlo pZN ZIb4_ }FviC{@q(Aud tAIHU]h;W:rfeqZ.t}YsǗWo'(u},$=֝}[cշ]`}YOѤw#(FDì, _|';t%//JP̜={_MK}y8 Ba0amʊ98-Ȭ߽g6R*NaGwIqػXro1kז[vlPÃrϲiwKuV B: ?'Ro YЦ2]`qxϛ\ IǗ`o߯yۡooӠ%yg3{ÀATqϣP^]nywI&(k׮iZnݘ%skN0,]}222&e q]Ls:jzy@)N#AyAYa}Q42~p}z?{tÐX5gy GbN&sۦ@7JPNyybhbTHUOz5u8F(NRH Jy| m (.P(8 Qx8f)M^z˨x}xq?I0-eCHߌ%ܿz&zufCz]JI|u. LDgt7A dݿ iHX`}Wv; S]:ٻ}e^*NqI͂2CB5ﶋgO@P<=>FR!%7§ܿ#?GC~,#2y%M fŒ\P9-cg\~]@:Cw{FaLp~;#XP_?GMɃ$[~WʢIZn.v\힭]{%j$VEhS.i6BHȁ< -ԝƍHOf.MBKB'?㠜2[ָPtf EvP( حnO⥾yS޲[']~8ґ'C"st֩c6ZT=ћŋKY8BG"Iu;\FtL,qWy]uӵMS֯7YJ.mu-6P( BPg-0_F|~_2i]~5ص faT,Xnڊ8˪)mQOҨ>y!^K]qo\ {iʏ;Tǔ][q("fTӓx= 3{]ލP( BOC_We>FynpRq;EbE8l㳽OiP̱ ;Fe$+ fm[Œ'}N~<~7t;{u<^ƱWNﰦ.x*{AP( BQ=1u4]Y(y`[qwyٮEupb)C&CPUTr)`l(=@Y~-_麐d۹,%X(==63TX|(Lp,HONZ9hbn̻V:}TB^ Bw|kvoVp}1φy.7š/ *;lK6-}^sxz۵-nm{EY@q}V21s[Add1,3̎; 4܆I 4mžp񻅗ո{NIv9:^_y!n6?7mqH2AVɘLm=7o1m7j>luMxeL\Ѥ-)9Q=2`?m'y|e?TQ:u\ L◒@%&p"I:Hf/yih _3C 8Rm C-//:XG}ه*@?T}a 2D?ןKſg:tjk0|fA+MPA{ۖ4&=ߪ5gb}K"]BBU1Q%ֺfS2*!Y-ש b}G[+IJ*"mr274HGK֭lmGshfr(G|x^!}Ap ?x.hUboFb0-s wWBRc_:0_G'2~Z,<=i̭TV-rE%JTɅ%[WIVFi?Q~Q_V?i9wd;62uocm;>oD[ZϷ(ɾo+]MISe񲘢Ҋ:jZMVVIqqbbFLKVV[ CUș\VWkˆ qb]%$9KFH9W+"刨g({_%"2,pl=S!3ěSSӉ~kkݿH,9;ӣPI6w a?@)Uvn_D%۝T8Ax(:pf{л2% oOA?"Ҵ?%Hܟ~ta{&]IcFxC4 js;X,VtOC8`@K>u >ҎdmU1Ggz/Q7T===]]m?ߪ`fv6rO5GD=C@ SĐ@z;@}Ff&NR }{\'K^FN<aL۷==0淠~ʾY7ȎmqwWo,$NFoF^YYX |B(oݺԄ/o>4FcK~_|ᇷoߦgs멩ׯ__+22޽{%%%?ckFb%JIK y90ԾHvt>ewN'޿Zʏod/[|,||=%ݳO_u|s ׵}܄ I=F2l=Qo7^8V))+:;:p4ns[{QnNY>¦2Ď0;>Ү"¶<0P2SN3/&]c=h)%.+8π&uAO, 8,E[ tQy ea/Y9F.~-LK]ޅna(>*L7%aacxB&&UnvgO4&E&dG /hN&ܨ@ "2z=c& ʎps \kZV7x[Z]8|0|2/l,'xD8?773[\,(,T{c/+aUWj\N2:'?׫lB퉬+WDUuwtdfWVV76467X1?d-PT,2D4I Xc_/sjIpMZ7:?xmaȪqLe<`ǧ+EHёezs&jA j@R# 1@DBbJq_[@vvW9t=G=(3Lp+RB<]Lg11 i<g*X=9Pa~21RA=o<ܹcǎG`͛̀G?3.f@ '%߿m D ejTh[ZQ湻3l[{ֶ[-tW[Ğ}m1lhX*f^6gUM-ձjcwk^zGs6eP]Ig{. %Ҁ" }rE7dz:UNTg/jȒDt\_]kii節Lm4BlW/ "ք{ ۓN])Y BmÜ$(Hĝy <kp}Y.h eqo~UQQY8JL8-[\zE%J3evŶ9Av; G-C5:4+|Jn;=w-XGQ;'/t+( yq@uePIQXT֞.?ӝh9ð=Icv>ג5V~N' KCWˮ7U(QSS䫦5[3. ߝzwFs{JKQ&33Ё2:qUykeֱx-, Sʜ k0RJܤ^I| 0/ (0)-eT`u.`$)_//X\:%c~hNʕ@(s)ɝr ?>VF( ### /bjjݻpj׬Ys>l uuurʕE(QD=kBsef{wNtOubws})RO(A{xyy➦NmP^TYM G:/(Ks; ˛OvS$ 34Dz*ٔ>~KM5qN+j;Yz+xYvWWwaIiYNITWiߛɺ;-03dI cJ,PuKT(ah`fbeK3?qn%6>lR)U߳ Gʢ"̜퀀 4ZZZxiER(QR|y\S+# 6ݚB#r\H}&LS3miWdiuyI= .hcULߚuKw5%U>~osµ#2]pm]VQqCDyO%aޞ}! Zlg/(!~Gvn j ^+(h͗8JCwWt9qq< #h51S5x< G |Ş󳅽GM0Yb吝Rnl.6IjNL&.:۸%v/ D>%vmSX9wUكȸ<tOOOLI(Q\8?#B{"jS--R I`Sb pLRvxI~$NJ.vD!+[ٜ1bGۓ\y98j*?x^+,25ƟQi43폜f&spgL?UYn'BwJښwnEG-hK5jksV(CQ.Ilt}O%JMz[GШik9 \qp ~EJ3. WF4W?~;&K4݆ n)ި)Ikhj/,*ԨOv&^RF~$ r'P>uv'MB\ #dHQw߹qrMY!N-x1].+*U5MMi+刃#IȞ^9L `>[Wd /f&l5DmwUj\ڮp Z]Nf\_~$:ͧ뾟Ffw"Ǝ@|<&"!Y$Öxqddkd5ǁ@K I2{hmy׹y Fز[~iyb?oQՎD(QWRsy]UGlsJ!6YzIȒ/i"z@Jᜣ!i`7FKs('߮vRD] iq 2&M4? ޞd?%hʀz ٣9a$v&ոnZ3uPNn9iYx"!d %^Vv }Һh{q'k7Y0xڜusa0|Y?}@iyy|R(Q\Y7SMzZ%s]@LKC6sɡt@Qs1?OHUmD.L %Nf۪JKK5[[ եE5iy4]g,_|rb4YWWW:ZpO-+OFxnPo%eGf7v> u65v7x?ߔiB:A6jLmX@4#Y) 0Y`ycY'`Bn3ފIxgg"aiǗ_!|Jx󝳮EՉs%7|IN%/1g,k}D8n͚5~???^8{ttG2ׯ׿/IOa]|O?կ~u!#J(QOB N'2FJEE怐 v3ʀU^Vrë7D2SapwIvOw&]30wOn GX1V؜+(,R_eHhUGoZq{[f= dbA|.`JlNDC2IBD}7@ ΀ϳ@Gϻ 6+AdRƻ˓z:413D_YBO۾< |ŞYJ!^y&kH] ca1E;ͅdGZF$]Yg=#͛qM4o >~GGǿFkyD%ڼs#דe"g}|ܢ(%(Y8Զܴܓri`6z8U@-tZ򀼵(%5Sw,.++CneSccqIij%OP š22ڲK-T+QrRRC<yPڭ9"JVn?8Ґ(̚|`NS92@= /wpܰ?uْXy o=(87 wr۟%O9rxs^\"jg<#'? VG===Y8F-[P+KZ͜qH(Q$]$Y T7̸VNDdjO~g>eEz[Pn b+R@ $pS`7Ǟ,s:kTR-P.ݺukoooIIN4E[c6\Pg)D~R!iLd k">RO @cN/5s>P"ڻwyrww g31)5rzH . c(QDfGl #ee䎐 @$6 XUQ"==.։ .*wZ]3}&rOiSpjg!tkJ$5׼gKu7#bqYyy´qPBL?>tٳg_iccsg:t} Mb׎;E|7够!'d4 ez/ hRS[ɇ2m&'"O*y'-~rQ*oA%5wf;<ן%ʠ\zΝ;q="kgC8c _RUR)e>c樝O/yiE~kFEt2ntBԇrhs5wLSB7 15W`Ec0K'<]c q\# Yh_5-aZηUfyZ F!#HC+Gdj}ڟ&%}>O7V~;y'f0ռE4=CFoCJkY/]H8/pу%/dP;Ji6S<ۜۜg9eېlӹ@]#'1I~Gn>*t$ i2,M[1`YcsK.ؾkφ :;;˫j4B1me :xDBc'PT)|>,?tmY7R'6isK &aўg]C 2js{tp@<|[Il$*A:o9=DPjeĉ 8@;R:W ١\J˸w8*dS}h}Kgeޓ> Ս AjH :ʊ3?*䣋2*Jgfu۷/,X?h\ViPCM8v{c_13ᔟSK2_ U&:}h&[@Q^)c:tsm[=]v94o{侠}AwK4;t)q,|.YH{>Tn.Eg[01%6dXN[E*x,=:bVcSsmz{kf͟ML#})I7vdŌC(;pm'em*R"季Бh 0n:t:tݍ]H ;|'I}%3$?^l6S/$Pp]'>@x NVJB(w#F d 'X{(_`х+VX~=)8Z[*{R7!;~#OچO}vNs9MqΈxtСC:؄:#,W3 N{,y4N=Fmjt[i;P?\YU|=NI>4d[|)x}g>PҲO}SmmmEŕeu''oycu@Uۍ2_]Uf[2H)]tnB:ta4؄P:  G72^tqKvOi0Hbt dy9زd$U%pFK!5Dk~qq5Oia & #/ND> )NIbqh[I(kJ+/\~wy)1=r.%ZT˴vN1yUOʧg4F9b:ԡC:t]<[A} '$&;|\)/d]ږqxEi¶] Jd \bhcY6f^PU쒊:n <T }sҧPVfy]cA Yn.55u`^jDl] tJ"{-0CW YD|"嚲9&>ިC:tЁf4ÎrqKιN@7qn Z"-Kpq'p W1p[;?繇7,f^'~nGڦ ?jR)gw]y{%L ]v3 S^~7taϢΞuuUE[Nq~o~uẎSZGYDɉ8nU8E- @(/ 2Htp1eV(HeR6WUr9 fJnEH*i(lb/?i: ҆qyRLu/8:/4};nAAA_:c`n\cOl-k`ΤSZv;V5a8k\о̟v#/hTT\ńJ שqVfo:cǎݻ|*I揜_^^Ϋ6X:w 95 4_:? C]g= vŜI>)KL,Bl.gίjX937N'O_ew$O90e_SGړK :˃h([|ʕ/^|ɓK.a쮬җD8o~2t`NaRcܲOcO#{E/5-!蔓'\K/Ra]P482ň9L~ƛ"+) 2YVb Y/ M(L|s"\* {X™,t{PJ_'? ~O(m\G'_:Cmq G.~s0aTCS|9I)K:{T%CgoۦrPvO\-fiZ\I΄S\XX(_sEEE1s֬Y;TTTЫ{{u<NhN챈=xol[}dњ4.[< ͡$c*•yNk~sn, ~cP~ .LmI[LݩH4)0K 6F3Y6l|g{ݻw?o+͊cIK8+[+=mTzJx:hL(@Gx Iia]q~DD6>(^H|a~A9 y?eX8$IǛ  ]5|} #;n;EM57M()&J(nQqW^y/%ϟ?0<$ǝuLΝ׾FA>ÿrR %S`@̯k%S^E7|w0 A.]qe=.C+CCCց(\N۠C퇃1!kQ 68{Y6nnUގ+ˋppj2ߑ2ѥѩ.\oخi>otW& ,Lv <В$hShG2/Ny/RE5s·z'F_%*,5+w!OSJ*$[6Gܢ#:?DJ!R) fɻ&Ѡcb ꬒҠjvE=pwifg ""{ȫ@ 7~y8#mzUA+hav>/}RBOybe+ӸV?隷a["aaaŨn:˜@ J '<&''ǒBD[q!x7 <!M-9d$dH}͍WU1 :Ů\˃ر={_ft4>}> կ~MӧgA(%%%K&%%i_>bС6(|k{=#sfEC1mZ "P1'}Ssɡߙ օuI>JPn*k}<ԑr=YpJ,Y|;kK/P.M7#d@>M0gKHQ(!P j>w||jS)%ZH8I cTD̔Xfz_p>֠c" ih㹶5~i JG"L[X5|pǽ%'<_G;2Iat)X_ LCٝFp|iH:(LX& * B(sbifzc>9 (_P ba.X d2嬶 S__۷ļ˄Ǐ'? }Jv@<PY K۷]A]ƹ <4ΐ]_%>qА-cowΡŅ'ΌT_9cAaDQw\TǏ~~9͊ՙ}nUUgY( mEiju彸Q BIƖAFWYTy6S̒CIwTٻ[nݵkPZP秞~:3ovR唗h7ݖEy0T Z)%9;Ja~wzOs%RqaG:6+&W!֟筯AQP4+ V2T(/Vu4te:语S՘D}CrFʝm.i=R8mp]A9Wf9ºx zhc"9D+]|rpp ,0KA(9"X3C(YSJȖJ(O84NOOp95h@k}ӧŇ]x (8LLʢRsI:t { įnLܒ3fyf f>xxdCKFSaDnGrYaAC%(gòxrS;wyꄺP[hH V,%WT<I4!UJK$x4C*Vե"y]JԯMH)eoi|vsc&A+)ӑ궦*l_s"Fړ&QIsJ3g!J$>?я\bg!CP/ŒPo){Ĵ9':>w6N? O^[mLszk> /O ڃ&mwPB2EA>E? ?PW:`gD~_ZI!N1^}thCF\L0Uz\OyXLQwL㉘&%1}JѺZk#5qtA,Mv5ڙk),ݚ&I,XYţWq> =8ꍇPlh"(#!>v?C &hVED6fFD?X#~%APr CMT ~r7)tkײW%%YkA(9B8+oii_tB4֢Yk&SeqwW%W_]uz53C66([NQ{b9kQ(ܷ.fo(k:7Ҿ!̦5qEyzR3kg VQQm6b@s'(70De#/~ rC?RzQw=yeiЅdݬ*XpY6 Wd}(m 1Łs"L5Т͎iw S!"wLS}a!bnfA$c`Ec0Kv1AS,{:ZAe#LB+JLx3(  QA͜96 V}'< 7H\dΝ+& `eW*#Eïp1IL:]DL˭P$^C ;ZĎ9dU2߿1X -0M'i> hD..[nd8J| t5Όp;#fuc)wtd=2PtjE O_;?ewWk;+yGm,K"S=&{[aUufVzꌬԺYg5̛d`߁nG $`χ_3&w0)?S59rjVNseL䔒?򙢺r /B~Q>)&OMwI֮x 팷P>(:V-G}:sϊto YZf^2r[{Ǝ/ܚ~|pEcnh3و$Ÿ`Nv7&O3z GOp:57?~Sm۷92jŊ£~w+xG4<СcEW J:>d֐2Pv^ mL:4^]}pqI~^Wjڊ6I6+زqA&$7ȓ[*!l㈂<# FP~$_3; R4؞[ Ҫ*3Eu,3s ('<qphVl}K! !gΚ y;ipf>n+t$Cm"cCGiu|#S J 6//AYnWh\KObt)f3:8GֆH/7IF0JRR y:x .]or ? XjOQ업[fmi@WDJ5ys9cq7SӌXĩE:b\riӏ-9<=)z;tСCF%;5k8ޤ ӝsl5ՏyrŌ K$uv[0&&E._IT?qF%I(CLĺ !X90ˋfy`aT4DOF{kSً+SC ۓE}\Tn\xR.P5x"B(#]loN"Lrlq -0S-Ώ92/-66yޤY/t' 8N$; :tСCg6ظtTDjLDVˎ=Ǘ>ƔxB ˢbr&v Z3` N.+#grs{V]vp$;NpA!S8r@1a 4yOjovHFVTz./Rjd?; OJ5&P4G-V BY6BTsq9vظ1Xc&wIP(̏9-vc֙AC%9n+TỮү3e*2.1C:th< ܔ,}A)ew%EgG*P@:.7L+$$wuJI4FVl gI<8Ȑ\ߏ?{|yace,2\dQ^[>Y^QN+B)+#"46>ٗN*J`S팳E8g܏v%TR ^I > sQHl*p_V蹡o ǍBIZ(M ]˱6N#+Dw _>:O_z%Zs)Q(j AAA`q"GGG[N: 6FX].'],8>T噑J`93>'}dCT r?cIwAi9!G"RKٳrcwe 1\IPI ^ȑI[9 뚲(h굡,3%4*B ^w?׮zb h®}iڈ̽mf02"I(Z՜0ei;n/a^;Ï/%{ͦ/OFsT}*<؄bIuju _5󬭭DP>n:y+!*ǾCS .ELS,I9DpL8YR#jYߜQ0;i؟2TZzhn̦ʠ9յ$$$˩ hGvo7ϰ:srWw[AYHIfj4ɫOEɜh)6wX9I&bRBcj>rW_}2Sj{Gj~^5r||@zft|UBIVhQMjo[BuZA88s'OݵE%%E7 c ɫ>w|yj >*9w aVyVqtK4Q)g)Muce%.'~]#ASlH$<47gL&`c 踺PL>+J}wdyu c7 +M&eH#%}Y (Ȍ7>veV^z/|oKw+O ++ǔW\Z^Z>ck֬V–A9._̳7nV`A6)T=L宓ک+ek[se STb$.мswgJJM <47Lk8ˋ=0s ȁ""|_rc^WvϺ>Å#ސKvCI7T"hQ.../D7BJbăm?qsscWU -cQJ"?ݤ$k+O4HAQTKBYUUGz;v v)D,Ʋ% S\$,,8M' &[B~Y%Y}ǕܯF(ǽ6"\""{c :t89^Ɍ;ˣvQ}ir}ԁPρ6qBpCuRSp֌U IR%P)roWP:R$kI:؞azcCu⨮ڜ3Jsg^"-B&|s'ijj&tM>OY529)\\vVbT4 +B4 upfnL/DiFn x$0ITI"#%ݹ> &aY`Ӑ-q*%<"cCQafa]ZFkCHGKY2"lS% 6gI5<@=F}(؜W2:V͉eroQ0f6T qõma SůZ>nEEU+=+fE3Kx&8R"h-s$+K3eH8ו}u>IAN6wc8+J8O>3TI3N.Iξp< CJ(`[WM]TМ?"OrpA{-݂kOqX.$k*#LL:]쉘M2bI7o!}&W}(vH~)fJ"fl21 zjq,`u"EnPJYN()?p; 7_HQ"crb:t脲D()cm UtJAcsqmlraFݕlvBe4Pd{K?IBP{25['\ߒ 5sۼV̜:fYUԲܰ8o i;`ZiT$ `ɋhKh\A쥁4x$lt{H`>^h[59xapdԡv`{T4ǓnvCn"rD%9&yͩ>Ll-m~$&+IZ@CGJC= q}` x蒽!W郘^"K}q ?Ob#KP B|PF300dHO[_ !;Dp`!BQeRr!ʧb.Oh`bho"iz-u5B987>RY{Ҋ8~D0jF$㖐:Ց<a^[Сe2?C0¤(xmk_-&4kI ܙǚ7\EƂ+"(aZ Z2Z>K+?lpbsla6&\tcS^ɓ&h%Iv 3Җ,*G1ٞݖiLs3emn馏0 2Hw~3|߁\3cR|CM~}d4„D@)qBOuPhAJAʥ֞丒EEv/_Έlǽ]w (c2|\C3NP?;x_)M XlzKsXWK9mmKgGJ0'~]uhek” Uai=E!C7,H]QՓCGm3uyڰc #Ov(*PU|y$/8 ЫҼ/&% }f:䭫80@K Nh\SlE"Ig焛m zΉvY-Jr}t~ "6UB_%*q9Yn&;w^TdO  }6KA+*'SW,_şo 6J݄om:wOSt"<bpP\7믳V삻=E,'Ĕ"g :<'>Mw 8zܶv*_]shܔ?q+DB(:S .DZ>%ţ!ܡ6Ķ=aK2_5qGJr+g֗ iMB. UJʍȖLN:G^#Q׆3OvM ]䲭aMؤ3:ڑ,M<9^TP^ZIP>]XPIde>d|+_II wN xI1 A412SM/$RmEd~b$D294A.al< yq:A–eBGjj Ϝ9D\:]!/d#R&)Voʠ~KsniŮ֨xqb j ߷7қe" ao 5!G>Bm1|qe.d"Tr|IM||QR?C2m# 'jOz5 RIt;rTUb|PJFc aƉa@(z>47y1pJMaK %Y]9>}DiMXۛ9 ɖ>&E,,Ч;ߟwA(}@O@ G,C.!.2=rovo+R_=D_5b#6vQ.6h4xR] H:DP9葂`Ѭd($EGYO-J={nanE xS,+(_^~q[& U>ꩼМWG ey@꣝n4`, u3*z1$$;jCGKLelpAH!#EK|!صwɮ<ݛl}cqH7Q;$Z)&dra+oR(è*C:t_1`gtȷ\c?uFGfȝAy2^IT=z׺G*uZ/2TKaN(B9CEl`"#& A8ʝ#%5XK϶Em J>n^ǟ׿(߾|} ,Y2w⬎9{[,/(R@-'暲9JjvTP'$d{˚Ҁ Q"%б2mL%nDD0pC(+{r|:}@ZG'ݍ$Td7l1/WRQn,B5C:t`gϳqv]ɛoBwp7yR'|TݹjNLl6DuOz2%lO{͒l S\5?@L`S2z MG^PQ>(a$ e^O8>?dcMel#?Q,׿wяs Ks%`bq:j}m3C>$# ie/q6Gh p{c?6H&@,/xd/ΎiQT"=TɾiZZ2:H][f{"U+ULwIC:t`t7RHdV6ϚͱG*/N-{:+``ex6fZMJ`T EN t2boT8垺HTIMeq6*3AxEG>8Ts֙k :zҕO_ƛoAV??ɔ=X}5A\Q^g1JLEKi>"')xoK3 )< !ůQqs*[TnDGv(T6I!a,ޟ&l&))-FTU˖$ȅC:t踟`ltr Xe QD?FN O$_Lع/²]"d^Mër,':.O HNFE<;וd~2u3._}dA&I-Nj;vٜNy3E2,3/K)aEowc)v;tUi_2uY$'#َyc,MwI2M(HiRHO'l*8&f(=a]-9HE>_JڻI,DEfA-j>rQ<#A&-c) /\%. ]>nuw{r[td$y>ׯ_/RZ}HWChbG<}),R=Bv3k?<0cUoj갠|bif=>~ %U!=Pc- gi:f!l 2烹ޤ\UnFƪ!kBֆmA&.JvlԞ=higˆ뎟8#b*jEM5m=m۶mڴiƍlkJl()_}Uaf+0V"avvTDJ-ZeӧW%%ěStg]M du0%i kWיښqkL.ɭY20$TnP NΒP <7WwV&C(EUFA+Ov 7|Q&UP!*S.:C%UI=)9Mko\-5Y( 3H*9M*ɐ?Ԡ%tJ%1m<<HLXVj:-On1"?ORT&+W^3ݻw3/tx'xzc0?qɟ?"ѐvu$=M>}Z%7y N%..%[) _otiD=srP-RQ]roPJ'p&V.E5+~9PI& {5=PxЍgR%EHn+CF*h7NL~)"I ۓgEej-fMb/V=M&cj.vu]ªyqSSpJ|, qca&mTbN(iDNlO)bԾD3KZX恀B(VP#U1HvKxdHQ%U)?$[bqd kOu ە$p7"q"C+)+uÁ\螪^唫ZrN¼ֶv)1;ZXy?RXkM&1gM!*Ieb?֑,\)p>aԆ*dGDSBi0K& OF_]Lc8X̻<|-P⸝+KѦ'$pK )%9 P4j>cq홦:D$$U C(`MJ  yd(?PNX|YdAǏu:|E(B(6<<.QrB Y.XUiR&@,6Od2<;\ J[{ߵWJu_l߾]:m|WT*A9z#I~IvF<}WMz*5`wFo!wҡ@4jL9T))ըڲ=Rݵrie],fjYq(I|+d)R gJxq9 򟹵*]ʱ'CSh>ۓ>.L|L ^f".HGEmز݄؉@"$#9s0Ss݄R~\^)+d|<gpp9 ,0:V%'N`#<+-$@,(ar %bWz~YE(/_RnV {eΏZ+A(Il2i9_gQ܅_*:ҍ>+ gbApܫ$7|2)rԹݓKtY ׻3p7 OAȓ-4H4؛` ۜ!^唴uuóK yUk9S~k_#OB<{嗔 ɄPjr_$fqIeAQ!4:iPF!LB= Zٕ'bt|D|𒄉vey)k4ZZ!TƺM7qze;Td2s&B U2O&p %l- 4ݥ3;㷾-{F4֑e~~d X>##'/[LLV勪%1KB쪯ǫa|`)JPbFu#s1B)19ILBy8MwO_N(%k׮*rժU"xp% e) Pf]LJ6M&S%sv3w8 'c&Oskq6A`VlcZm&ڤȍ%Wى%ys)1|={R+WurLG]gCHJ *dWD$P>N٢G1HtȖ́GB0@C1a~b N+!TK)/!"o9nj0.i@X e-ӄ;ʲ4N(CQ5Xd\kX(FOP3ep⬯u`<&~ZH? e5+p8"vCu>ZĂʟ(61Ud %_W[$ΖpP UDNȬp;Xӟݯ[Z>987h=D[{ߵWΒ ͒UBiߣ\.W B;Bf}\M&m\L۱GsNsw4%%3;hE06_IiɜH V9嚺XueYN$KBWTV{=A";hMqE!C ܨ8T`nA*F"ta''MYFH(H- }$?vm(J"$@Lk.-6B5sLN ñ9våUD!bn×KF"|;!`%J1]N<;$NEL, uCH&@:ƫd{ٿ?by4q\2T1<[GLqz C*yay%d0sؕ/A!4(k׮KWΝI6?}. h(Ӥen\@Un5<3B|YMDΝG~Pzv΍KL8)h]U,R~We]Yn2Y#g"saq^qAގTih4j)!eSb$!ƾ|c|a;R]14H*yy['/Lқ>m@7T+<h )=]Q*.':w`1$R9,UMkݭ{MOKnj(1"x@t9u,|X':sGRs9YZ>TCI dZ§/'.^1ryFu6x2; ![|K5TL6]x9k#LkD<ʲ 9&UR; GCrJBd7sK֬[K aZ"%i@{-^=7 II$fHmOa:dQh"m^γʂ텕Zٞ:Rs^CJJ-SA*}ɕUW?q+Sl1iuo4oYը6-T2"3|3@dHRQ =ő>qDA\X9[Dj&hجEmRd$F)E6t&[#%9[IWi"ܧ'ߛ Go6IQý:0bLOVAOϗNtС.Ƶcf{OI+ܪXo$ep?)w΋`%?0ZH4fiS6'a^/NW2$mҕlݾwع rђ涅y9Ӷ.H?X&:Rw˃(f(RQT⸻s|`{+G*VC C},$PVl#ᠰOZ9\${ЇbmD)̩$D3%E7qlN8:tСCCMݗlI{!JR;õ/ǔ¶#ӽ%@Q#m؝ SqK"Rlz>HW8ڪEImʲg,/.͛YXSy~SFIALŲGbDb+ Px^>Lsq|2= G+8)%ƃ&oR_ S'rا?kQ2p)r櫥D܏@$t>FqtСC.?ѱTiKҟ= ! m_- DTY tlIQf\Jyƾ,|"AۡZ# _?3IBhX<,|QYx_q(0 '߯;?3Ͽ=ۿ5ˏ֖i"m}Y]iin_ᠶJSKNy K&(WA5%!o#9 |MQGHwQ9h Yla1Rx#'q٠C:tqTI$֝*RlRJM'Nju\ .!1Y^""ӞL1Sdk2i~A]-uN5UΕafMRM皈I"'ՉX֢n9"9TODhE5N'SE 1oS]rl#e50s%a$!R" 5 o;gR:tq@YP$wL0ք)ÇWsHy9#6%$JĀwE@1rSFJiHRS` Zh_h?bKjJi*6;#sq~\DGXg-q4]gԶ#R!L3ȨQ)uaSsd4塎">9B(=怤"J$lJءJ.NPr)LJڱh`No.KkdE\ "OE 9@TyIy12{HM sWWTH AAA^LI+}IWj"fooHC[,89ι?k"ْNl+}h&6Clof8 v:.SYiR%fWkw{b86O/S;\:aQ!}!)M7B7D8̔xje B'E056}(b"42Ҫ욓QvHG D&6YoOPu5rscqJ8P>yD߾KLQd>lmmedˡCe_&׹ U+=h7$F|:tL"Д逽gi݆7PIr)B Ou&&:HGx$3uz'ģY/D>*ԎZ)Lz$SOgɂ|2ʛX?d}=NĤ5 8$BnLNXe|ȓ R+! _lUdH:D0bFyYpin,,4HQNLĥCsM4;!!>B}:Dٕ;~_}|ΝkA :zJ(o}IW.]bҠC[Q)* rlE3FO) o7 p@{™&ώc="wO &:åf6_C?UH$R<;{Rc9X"1cn}tJ-TI7͊Lun2cm.S-.覜jWNݚ֜<-ͣ3ӝ B;Q)#Yڲa 9lĜW_}w$&}7 ܧE~Rkg4 *UYs@Ecr ( Bo\d kRZR.]OMt&?u\O:Łvsqނgg>@}%POYg5$<$o"INDO~I?ɜB'֧ğ0Zw_40h}!>R>ROl׮]\Ji/ i;8ZE{ey#Y֠C[vjh)+TJ)[}(Cظ{J%IP$q*)SIMfom _8R~#ؤ* G)ҳ#UnIȶ`(͒$H1a/"7$Q53 K.eb>.> }1ϣTjlqacC^91_F|w}sT'-e*ȅxDX}aܺ \G#g>rjGq2|؂_lׯ_u_$\~IW7o2nСCG=i/@ϛ9 b7͆p%^ *#$ xD+ cMj "sEת2oQZF/fRnw), ےMq9hjemDmDV$3"̈U3BwT2‡>kga]:pep)6-Qm$DK,W)ɈSV %Z WA<!D}X ''ǒp> 6f~_<uttemmGzaDӧOqVRR8UإwXXXqq1*Ok:m Z__fxD#ͅ[oA> |Э/r:%*ɭjjֺr&G'//BcbЀM!y2n3tЁ0>#us9L/L lO$ q{Ҕ\] fFD*ńP29\4wV;#s8զ$^H")GKZ``h dbç)5kæؠtr Qv:q e||<}???<ܾ};$<(4cX x[cݓJHu~QZ#Y`dqJb]>mr%&avttW`Æ S)r-Iַqh}$!L8~Jdmq7AZ?߷/ СC N6ߡӥ$z:A͸#m TH1R%j:F$2?o;ؒ"=Baפlc P\37O&MSO=%' Ow^~`[N J,d1i;?(J/7:-蹚9^,p]__= jښޥ}988 lbNL"I/i\|8ʛ1R\KPF h\*"e)t12s"(+>v'%!\p:/`4[۹ ]h\BeA{ۘ/bP~Ç.D"l_x)/?EN-r  ^1M?2|Fo.)0sh["+plϝ;7hUlr<0Xabs~o<.q(tݘ/ J$FxZɁAV-+7w9ҒpiG1>mO, wI7(o#ٳ'O05Ɣտ?RѠqķq8bO)G6&=SEw0HB)Wc rk)[4c1|Y:rXuY,c1LeG4c1%BRD=A| dO HLL% pȗD?AO&4aWضmLNRg7OO#@xIPF> o߾s׮]D}3cCxB5Fw!8QQ9uTŸqh#)M$]p!W\8sI&-XU.fk.ڼyL6lZz*EM,Icr cƌa髾4Q}~BU|\ˏd!Mb+-(iƪ$C/myG(Ekr\̟?Ao߾h\FcDS5СC̗U.$ .8|-G޼y5٣fHLO[8k)K'uVk֬vMNcڏ VΤbgٲeܻw/Jwipر!>8"()Ғ _Vh\F}3cC)N8i{ƍ$ΐK.Ə ~ѢEj &:?~2n:6 ٱcEOX@uq p=&&;x҆heϝ;7oUTDYJPF㈠Ħ%b+ѸDύf1XPXB>j/_d{4[4bߐlWTUUѸ{ NnvARϑ.477xYMO (~ILA/vjbrsN-ee ZZZaX2HPF=7_n1cA ?~*1i;[(J/7Rl@mF6=xuG#Դ555K h #$ UQ ~֬Y_~]YYI1&Oh?~7>v <=D}L>vjkkӃlCzi@#500e4%znd ޷i1Op> pZKrSE|8Fypֺ̍z4,,;*[,z0J>}:cQS(fv$PtBA?(D$)z#&7;tBN-"ӻr=tNƑ6 v.f9~Yoc1ǃx&x<kpe)S̡?|L#f3Xar/-13$Hoa1Ƙ9s\vCf;m@! PP'@OkU=#cӳwĮt]^`c,:|62@಻ 8T"T{BRMVwgMϜbCJ3;,sO^pc>={$GI։ӆ kavfy48n}4q?=~=ф:t([,GUe1kfh`SVh*U?89hq'r<:~UWDg͹w^µ"hNhC(CAAWr}S7MMZz=>}MsQ#7GljڧTᆬδmhPO͋R5x lMs~/ŏ ʵBLܱ8dqSdowV3PB+q)R-ce",ݓ?! EBD(1* Ҫʘˬ]Uޥ<ޭϷ|W;|X{o7By: v,œ;xw׿2k-[)vm۰{dd0|+.&\QG]|:@VIs[,Y%2Uz3Ţ9O|*K&^Mr ڎ>;tڸ5B*>(1ŪnU`SjKK B9 nϕ[{R^dDsⳮu̢<%=uTǣN9kŇ4"{֧5AA喈-Gb4j(?TRmCz%:Ɲ`@|9!EG Jiy%!KIh>9ZΥLC-56OׄI*ѧ//^L}mW"bu|x^ޣb"e]nv54TCinUJy rID>^q}Qn/ Y4dÜI&#\,^SKl Tϳ%%3j\r!8>>s}غ~}0u%m;#w0?L] %+>YY,/8{lu**\9ο7/ YdM  B C`rl^T|=uK Y`PǹAs9P. Ys)k3ِ_ǐ]v\Q ĨMޭ[8 Y)7!ޖU"Dho HtMY#1++8`A8߂{ gbf8LADW#/dgS=Q#x%%s5V:ݨdt]Q;ɡ74|Dڸ },uNVܳo'y%δ$&SŒ}Q%ێkd5 ĶncۍfS'9{|Dtt[o3={8!k AJ섰uu(Vt"fo%æ+ BI-9 MJbigz(Jfnpkk%28vR!Ó0<=JmM-\*H#_Q%-pX 0.J5;!#x ;"s%#|z 4vr+tگ%`W#J33Vw1:ᣴ8{YP [ɜ!44=NObŏy e)pCA C;X`NP$PDxXqu\Jt9!î%_VI?B=,mJF-$uASgJnjBIddRmɏo^P>vvlE&PV9, \h½C=s(Dz+V؛u0x9't1.3.j O_?҂A(4ufD8g)wuD4=~11"r§ulUgu&jT)JAAlSwE(Cؓf҃gS&=B7-$q!>|=Ʀ4(@3>?(6>D 95R%Bv l2?qrigPήuMs^|37hAJں "a(ۅ0'%p;g!^ 7Bi\X)JX$y]'<:i-9k% NOJNHLh2y2>)ozSzO HNE@BI(6GT?_~Bi_AAM9L֕ IjN>ɓqLs'om4 o\ݽ-Y/1 % dpBwt;wDD\%wU2^o.( gJ8 J(U;wzu^;ׇwFt4.J(QLnpABc|x)djPrW"R82pocJ.$I=7hްts1< DBzr6̨7jcBi_MA0#EqNlE\!dl"C2سTlGѿUף.)"C_38~];첃2F_/RȖ.1d]Yh+3|R;Y[ a$}(ሄY=Ǒ*&Ab9J?Mbu M7 HQz0,(, "jQkAAAVP"/jy2EgB<U)oaE&GroA^M199Ц KƏj? n9u!qe8epXlɶI<  4Q :!yAƔ*  ¿TEi$߯aAA (ڞ5AAAjH&®料z^A  vȜo3e!׆?:Y/OFAA#ċO>)f>{;$~'RR‹nhEd0"ާ#4>H4'ՍVj"   <(|^ 0I'Lg5;\3pi>?,c.{FN VM Vy٪Q =Kԧ].^@(4?x>Ayb  Bas&lQ|?C{@w~B]X wR詶sdCw+6EDWp S"M54gnbBi^f*8/p~A)6Οq}6Dú$Ǥt_*$vo`{Rqڛx5ae~ EOiͼmEַi՘m͙s. Q2S]of9#n@P5雏4AAߝFªWa)7)熍5hW )oֈq2¡@ARx';^M:>5Pn )%ɧCʖ-8Mymث &Y'YE+BWrrvxf+ 8yv| uc+U\,u۶+DsѸn!υ4HqpY6n(x1."[gu*VbUքI*Lq{66vF`'ID V[wz,!  ؽHֈ_e|կ'-,Ut_-'x8FS[Qdo@6.[,A{4e!˹q,-Odcq7E٦>qcL.Dvyx?{<2ɲo.ϴ` %;(e}KKl]֥,s!̀O7Q6~ڥf DLdg ׃1A6`8~I?;g"?wXK[s1GAA<#.wS"g33ʻM$5=jm߀%}.,f;*$֣t$ҦT %Q=C ;)^x-z9r+CWn|C1buue8:!;!㋼"g]Q;-PrG#l&9)lvo^f[%`WljqRyP@o IM  2ʼҲe什OT轄P19߮]&Y'NCE 5 :bgS({I?JC6Է's=>E %ʯR-\"\aB^(YrB!LUB!PRF9(q?b=z,;jDDe'u4p\ &)1$˱p-?AApUM>LBU+&4 C UEj%qR.X(t&v7$8'hrAi}J0z$w,8bǢZy","SlJC3B ]bE %.idHʤշ BW;j1B& t 7z&&.;n(8Vd`[))gDz_rEG3lJDaݗP>3*R8Љ8 Ew }嬒fs:C%tPSxξǟ뜓0wkhBB8G4 %wǿ jn2Ou$M$l.'|Sil릁'  ̗iliB}g}9zڍRk2՟DwR!{P"^Ncyᅒ=?7Gl?P(ie"!*I73ޙH7|閈- gg6GM8]޴=$ݫsIFo!",T%vՐ? 3/h>%c_x_o}Ʈ]4J~BJې>jkz%  Z  =D `C量uZD_i|VU!Zݔ,bf2jr0wl^nNBh̏.(P[7vK 9*`&U .pm* fL2kE52dɺң? f"mݧTo:x30ort詶)DOJ*V (#>ʯx\ W.8"HA?a6@u{Щ^՝;d~{-dbw7s !0ј#/x]PYO'^牲.ֻ ,ekAAPQǜœqC"v>^M7Ȱ2&r |ujzIv?zF&Nz%Ϟ^"yAHk   D Y?S9BȪkyF`d LR,HjUV`8hfLO6lDZ\{08+/S*) ¿E#BɋV QG_f|I ?SAAA:TR}}!_pϿOAA|AڇxYg1F+AAAp`/6ɋ&n&h#  HO1yz @AA4qgAz)M}w]Z FAAMm&+i23+VQ[ Y<?/Ρ bb#HpA-hGS?˻9Y1Z{&{O)Zp]+!9g9ϳZ < PJB@H*$@(**$ TR QW{,+g~}nfgVE"x(|>_Pvv^/y r:b4ދ?Na3?g,r>N~Xu1>pT* Z~Ӈ/X& 6wםL&C# #\/5ڏ* Zbוx FI&3ɴm8ښo(Šbmfngn6jv]h4*>^e8b xS,2|&l6X{Aa:ğgtx^?fy۝N~?,pǫ @ }(JL& 'aVET C\^J`z^?>7_w)H~LA#%s\nX\.jŏ|>g0e#-l x\.0 XD%H aL&7`` 8 N !}@I*$PIDT]Hq?wrdlfgggffgaЉ~t:hk:?v(d/`~A~|NA龝TDžҁ? dX,@BAIrR9fXH~|>tazG>_^Waur6M$rBY}zף @`0(k8r<.K49 IP(srɷjcXK4*8bi7 Sм@6X,:\U>m|Vʦa~_GM?:Tu"*n?/a^2ݏOpb78snH$bR)wIW<ܹs2$V_"ow)޿۷꣒ #-r۱3txbY ;/+?%"ԇ&Ɇ?"uTS uh'!sw?+Ϝ9TUF@l| (Ņb+KQoĉd{:x޽{NdzB&ť 擞-iC/(JK%FGPSW7SͧDPp">{ `/i6(ŠqF-nvi2gϞik4-⠥+W+^ʧDڕ@{!cWիWq"'*\Cـr Wϟ?6-{QWɠwe~ÿE_PB#KKhf%A7qz4F@ l[ŬV?by@Y<4!} !f@ MҎaPo0D'=`OÇQgw jr;i̘(+۷o? ~w_ʦG1z2-}ߜDMOoݺ幺r7z=p׮]s{r|*,V f&(y@9>,ŽeB[fχᗯ(A/2Θ&oϳTmYkZR :Z'b6wSʢ/2HړK.݃e!oY3H#5WYk(3b_[ @OJ7olJtd+Mc?TU|9na>}ڭZfvd9^kd9,>W<1#бOO?'KK﷣E7+ (5qS>sْܹ7zo߾i/6:%1 H(Gs1EJNȏuz@pÕIj(jl Mg1J1GJ5*܆өJ`PZ?O (2 ?ϯ_7Hz+G؀(Qvml^z؝,zrYB֟ݻ-ݱx#_Wl5EہTOfQk~@ƣ'LHYIV4? [L/ Р=GLFphpP$2Tp@*Ο QsCo|?l=p>JMAovihOgq#d;w/_$:0љҗn޼e'jM(av+'Ǐji)ѭ͞/T  ENe@7<4yk|z.,B Qs|/-? 9FEߪ~Of:M%c.Q[[YHv$c/ە36Vצft^w3)&lHeypte~ nڶ}%-4uu(o73olػPXleVk6 6i$F4M5MZJ4A߇}zy{3g̜9G A]lC. z90Ih!l22: &'ˤ8X<lYy[$`|Yr;;u;5aYE _? _ZbKB5KM6/tA 0B,%2D 4ˡ Q¹|+_ByZtM⵶THDc HӧOf_(ZYDit4 -"3,R4^~z޺uƍ,o߶PW۾R$ =mJP&t*ŋ1,,Lp~Pnݳq-3tYtcOŗe)OfP&5C&wo*z={̙3%ҿ3J `u ߣ5nSz45.gNXߝ_=EBdpyn޼)~Nkt{{ 1 o.&GaJnhAIj_ G_3{-oK'xa̿|teAxw T j<#P_2SɶsWg J l r>CJ|)6Â|mNn_U!hiأB޽{ѣG5P=MϾRKD_41?zu57IG0}j,O52̋S3kiMro`SRQɂQ&uLx5PGYS_3>5s¿Jk}{ >L[ɔ?{FMX@o#\k&K5;rؠTar23E;Oj }2V_D@vT :AbM޿?-`8U0k^J[~_~Uxn3o~9*Y )yq^Whk\"R_n%c%`=c?IxO:r%n0}*:/F a~o~VTwޙHԐ57|@wS۪̔f;d,¿g,}ͯzmUnѳՔ)[m>(%`n^v}/v/X@>U;sC* }2V_k2A ArI;w?ڄ3q\k^JcPU_gRXWxVtbn9_̠lk2h5 ϝ;7\2(@wJ퀺_['>vvz8qbeA΋ѳ0(9F9ep@}&konk[rr]#Qת~xr^1X |x|j3\)5~H8p@\ &l#,ۀqʳAYЧ J@:ceZ6]m U=ruiUJ[iDBX̍0=JK )y y-!|+ w,^tbώE(~ JVA9L~>^ޖgl(Pa/| w?AYk^ޠ2ӫ~xr^1WnVvc)ymkP pر[7 ː!kݹSr:ڇlR~ӟΝHp ʂ΋sؠl4w U8=T7AǏWPBtrBaEV2zP_3>w=8.ƵFIU.Lcbq W~^͟._]P K͠T("w\Z2E;sO* }2V_)7lŽa>eݩOePVUz3d_aR}݁ `O?pUzx94;I+q_<.狃swW`3G܏V& ,/0e,MOÀ"f+g9YѲ;YrK/y_5HsKXܓF7蔲ѽ l+Y˛xy뭷{N^ӿngQ ߗZn<0?zx99A^uݯ\\;\ktn+;sg/[U9ݔm}(;tdP:lE]Uvل;asN㶘:tСC:tСC:tСC:tСC:tСC:֘Nbyp}v1B7s L%τ6_6ٺYقЧWATCVUśM| p}UЙ]B2-F S8n"W O}S Xwun땗[e?p B(i*ӧOőO'&H֚ƯLl^{mļ,aHY9+=A[;X?%g?>_ؠr;<~$/ς/ůazX)Όt nhsA{pbvi~{m޷dsR.CדH)eX6[+TNYAs\+1e#Zs3gM)25ZI(;^%I_zEL!jY?TL۷-k:O`z ?_Z.gϞ9n@X.Ln5hi!٪A)؛e,ufLrdS=1F21'1כ7o/1Tgv=gʒk\8JĽjV6AiO%je\sQR&%RVvm`4ۂg2'OK8r۴S;-7h;7wHsrE^$dl{u;eV+.]ZD?_L 4~_Nrݻj%(00r6z\ٷ_͝ϙ4|Ӆ RC'Q7C}.ͨ^m$5dj|̫B+K_RMHM ]hF,M2;I濝ws7P^ѧoJwʠ\_?|yO,~W &o 7kQn?~jԥlQg F?NUEn* IIBɐ l''lۊ^4lP2Y~md?|EYJ^ >MЭl)n3_kt |3-[O$A [:>W5XES .;^"6&rmV%o\ %1UF 2.j걵ĉJ?؝u>W&f'!ŕ+W21s0]G&j| &f{I~Ls AWďA xvqM?/tSWӿ0(aG^_q%756oh*Tsh_VS9Chqڵ(#)1h΁JǤiH\O~+]m5µU.SQʷo]>Aَhɦکm Y-PS~#ingb51 _>/gb`+'vY!CX Jv$⸛~^VЧoůJwaP.Ư1ˆt,mHիW7+79?O:Jvm[oV?~<tG§R1n} 2^S(k A(Rn5 =b\b@@>cLmebZh.-*t6|M̹1껙sL4;Gm([ebnmb_(?A4?>kTUrv r)~큞 th~;F|mssm`Z5:Ud'?+dK9>xVT x5n3)OQ wl GP-.!"=-]6 GG1a^XPG"HYj,)#7ณl!w mJurOU mby%bo&f+Gr|̭1.[Q/5T,{ YD_yt[n*yyE>UK~ܶfvnjKkVY{#ͲlZ (k)'6N2S7ͨlrGL>5| mWڼg/zyC~/7=}o;8B6@Y)k]ݻ乆{3SUwjAiIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/_static/demo_output.png0000644000175100001710000002545400000000000020202 0ustar00runnerdockerPNG  IHDR/}PLTE)3(3)45VFӱ9(4(Tw`8/XUʠo#;1A\}mO-ٵZ'2Q*I&2נrp52ȁ:2sL*n"tѩwQ$)4[CubͿྏ͡",fyo'2g&pMaBrťn&$1b%.ut`)(WdcOP.OtG1441%;H[_S+*fs{8>1#)O/kb =m%b{A}V;1pyz(_)[a(N-br!Zm#wxzs!X}h$ l us ~x632.&.0/02`)jIDATx{Jwn'섎{{Ojuؖ^hgU2Xkk*Wl߱Rxf*]vgYi)*WlCg+6֐kےwb|Km\?ǯxd}E׬ KF+ֿoHb;bn%~l% +ۆ!ߐ?ŴR+&::n۩SXJf`Z*;b]ClܲnE7ߟ_1WK.3d !/ n8=㮲S} Z9o;~!-s)'A<"#L2H/+^xK~U»@ix=lWE|_>Mg|9ecAK&׳+&i.J-;;TnSIfk佨e{-G rGNc]|}9HcY9;|25BL`/:2NQJ~(g`o5E] 4IT5}imI7=yG9u [lβǚ̟G'O0>+y%O"i#?'rnheGd_yi)q1ZTM2m?T'v[{}JD'ȰO0>p^y"³h[ HG!G]BxSТO}V:<֌u߲Wg2IyDƶEHSWie'ӯo^ɓx w6[\ VxoS ȞPc<ƓXC+&f< wI}.ڼkaN,j$೶?/tP+vM#ТOɗ" oA/WHǚ>xWcr+_t,C<&wx!e 䎿`:5C`H8ʿ%YtD"#\hʎH<UDOYEFm0ǼТ#]u$!_Ld~jf%e>}WnUdr#B~FkTǙQ|zW*y1ڇ4 gU2_kv!vC6nzee}0_2OQZoni~dz^Yk8RAE+ 1voL+ӷ|ٔ ?{䕩<=م~,0=h7/d?%|._J` 'v7sXWKbw2<(ih4dW*F?Sn(lVpQj(xĢ7B^ؔC}-G!rf'UެZ& \$#l\E,v+s'Tk D{td%bY)6wrhϙ6ڕv,?4̻/f-Zݧ(wE8E7-qB|4cs|ANU!Ԋ[;}Y6ݐcծ4xr=+]Q F@.Sl=9 3_zӅ4ďٔ1uJqx2iD?z& Rq,ϟ4M3m=] <@MJIL}4%80<3ڕ%V.|^7{D=VtJn4 Ǘ[XJ^'XJi<:ul? Olgq+/l:htW"O?1p4qb$]ǯeyrXw&_W`ߤ0<0윿dw&?YWc;JR8 6ʱJhxr(ϏiOux"wPSZ0ѵcw=5JڋE? p-ݬ?CXTcvrfY\ϯ}WЕtz& ^y/h bsV?L[D-U[P0?Tl8ϸ8lK YË`xi O|޹h'vꏚҸio}֝ 5,h~H_<[ ?&"ʛPZSF9jSX?WX-,E%ƞ3/w^50AnrH]n)nfOf.NNMLW{ [Px1?F)?~Sׯ%_^>^`ٕ6&ry!Egچ?2'7@Ie|%na e=5;Dgiu볔NNy:'7+;F)ɿ+sQ4[3o'A)1wǟxwHٮz޻qF0<{cKbP>c~a*B`g+.7JH})bQNM?6e89+D/ A(g"j$jnh#ޏm[:wspz.S}wYOR_g>F*}5dKs^kh;N2~+gb(m2&ol׃1|7!iZKLٓ._-MlOK!t|Elj4E+@A1|->eo|Gw޵񎳞z%OĠ2Z#ZdBNRTس ).(L8RDK~sK~rjZK+Z 6GtɃowq)//27ª7n~/|{"{ #>^땠үh}LnJ? ku>Nf8%MLR a-ҙ2Nv:gA=o{8'2 LJD=ǗFXFx&Ud>Jmĸk ZRT/) &6ָGbQ^ JL&],oE/8X>WewJU]o)cb`Ox(ϫWiE>ĸ"kٻby/)x/. uIoV5?b⥩X|i4= *TѳRY n^%w>?ȕJ`{3ٻRyHõ\s9A@9(W&Ri3D/.>h,n#Ff 0R15UysU a$8H$I$$&gXD~?"RH%1? o$ Gʗzpg*{/{2uF^@mX+NU+]0>dx+2v=SU9T oTFY~$W%J%yiJ׿DcJXs+sHr08[~`P&OV(K۴ׅ9L`|qurDNn_d^㬑+VwػSD5nBD ٴɷ"g=m!j{ߌ'$YjXs^|s2A~Z/JdB?jkDط 4 +a]t oBdȕ ߭l4rRI}w^YJ 5X|VӔ{ErjJs[Ho֋WwF?ڻS-2+kYU-eL? Mm*0޸/2wk RTZ}׻_,I@}ʲ?Ҭt6MGxt:(84Wǣ_nR20ouÏgهxI߫WJQgGte}s>Ígh|-_9ࡿrC倇D⡿rw#YԊ:B5O Ф}b0;bv*1Q {v('S 9ܭ*seMRWiZEMAu:^cxTk/gybQi,yz_I 8_;vZ4j7}g=Ǚ^9.%zbgCTSoʎDX~ކY8D|w#԰Z^9^kCq d9}=*oߺ=`*^Tէھ>6!hT˰ڇ8^qw-ax}iZ !.3fSy0F#0#臫qySN+?&!gg*Id*T$v.+)G-_xRg8d/M`,ku±;:-.@iB'q^8l)(x%[1ZNJⴂx^+ϧvP덿~rl4_y7b2KoI1cwL_LeȧzV] eQKnҮw1_ψ2sbYl fԎSc׿nKŹ'yΚ/{?\@D)Q0RCN~y~+}e1?]f)hT {zvy]WJӿ}`Ja {@yJ .^XM]β`l$f?mX,v֍k-@r g5;HWc'F]J\[z6scBeSA +ϲ+m@땠2ӿ*04H*Ƥ)90YŠ S] -Y0-+M|-ck6t^ k\z/0'HB\y]h\zr}Y^4 yq-t[?ߑ9?W EZR&cBRpUG pZ ۂ)[#{\>6%z]wy b=SAðypQ,881㌬^C]nWcw% 9P 7+u q1&C>*ƠT(JRWh>dU˯YɢNۺRX#*}ca1 J(#)rWAVWƯ}k~>VzP5QXsB%~zRAI ~ǔq!OoO)bǂX`RAҌv??X<fΨX*F/qlT©.? 4.go/׿#1G3蕠RV#"} Tfݨj]F !޶-f*-b$^S'T$XcJ T96pq{v!Ol[Vg#`]PwTwQto?JzVk_'XY+Nӿ aV2ofuD~#wŶn]zΘ _ r]^ʸ_}E3n |}lk!;~ +);PGץXo%* W﮳$]aV5fb'M9\D>*גԫ=B_sWr ֯4WON+mg'> zͫqqfڵaxf]v4}$]>\O0+ze܉_,_ys_4N ʽGa?]Y@Uv4Of#k0.7,hdQ` ~TWuNj};{wD7 瞪StOʣ>+|W>+|W<+'/w\+'8 F솼SQÌR5cJcsԧ 1/C[0j=Ax{!5N*+'Y*~[|/^pi!w}U|>:~u=/?k~EKg;V?>u~u}ΔLS?w#ڛ44pJi-D%C]kp]w0Ҽ7s}oo]ϳ%\#pۯ!y#HS+ʥuWD5$⮒ '//?l#7jaWEn SRz%f%x`n},%G~N'%~=Tj &>TM󖁦?5"a#ft>o=>Ki#9Y*3>'p uU+1+ycrÇ͇8vF52 Ps^ERgFҏ<-]׼KSaʿIۈj@*ѿuTxGLtd+.gjPw%g=zaJ^0-nUt4JsA-BTsjn6<qVS9Zui0{  8 pGy<+-^qd?q]ѦwNz]⿲?ݧyzt_6E ~w_7WL$inc3YY=?^~?y|@g88-}TJ݈ITn݇~o}Vf(\__"6n^y1<_JD `(r\Ѷv/ u[`^~?jK$r\܊Izx?|{ e\~Ϭ+ж] ;xZ˼f跫?݂xn_?_3>^مw?^vuQO;pI;px]!xIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/_static/demo_output_with_exception.png0000644000175100001710000002374200000000000023311 0ustar00runnerdockerPNG  IHDRy<'IDATxہgZ_ (j ܍BY)ZFRRR[64V5XТECC9]]3!wrrpп!f B!FR"-Dx3ԯ!􎳆?oU[ysgUB{WDLoo$8뇥"%;0kW!He`ufٍBOL CJlњ$5c8zcW95= ֎bdܞMKknO/Xy8h6wﮒw Y n; <3CKF5qY2;EJk׎bk8R \sG-q R'zr6^o١wM"'}ᓯYXyʽRdpv §R`97VlodwƸk4k~CMžm/W=BC^ąK@$$7K $ (1H(bW!>M[9HJeo5 ׎П=*k!%B@uq4I3k)ױE1 }R(U.[(K%K(v`mݷo֚*sޜs{3}%?B${A/T[߽E5Be?BUfDt6W`tiIrW.gra?-YuPD iAKLkncF[:-䓾ᔍؑpv6;E[>r}LRкh6ѻe"'WvfM6֔|AܒExF%/p|rJԓ!mLJR{+ʳc*&M'*ˤ-6iQXa>FgX= +7v_V`#X ZcL\]J \|+΁:O%>dW1ms $TN6% Fl&$Ե;&L|Vtέdt|qo Wg:\$rk-6S<agX@k}ž@k"9c&<\p<$k)ԑ,#ӚBSKշM Vic$aa;OTz>_3arzT)mwǔ2r/~9 !j'PUδCZxNv+,d-1MĄ'-u uF[2{>[{3#Q 1&PnN|y3 wYש,kM kkMj h @aQZ׬Z4!6GУ?=+yA_^D$/R(O}`NGo9\wÄ9:8lWM{Qs2KgjWζ71FʕPz/@9('vh/wvISaoa#\v 5gxHx'}A=T@@@5wcax1LIC8ňԅںZ{3\Ԍn J)+B9,r8,,p.I_ݿ{}sqH罯//<5I+l.="&tM3͠wʫ2_;_[E> x/߾@JQR/(h7)8>]|%M:@^mEs^TnXW˺_"@%5>;VDڏ+3t*fȽ2{}6y!充 +igO;Şw͋ZK'߾ yxtm"FzW[d_wI7>9yI\*U"+3 sx$ n bV'Qt.& ?v3ea&m +RaΝs я0$q\jmj+93Ǝyis:LF"? i7(()cH@rkYáͤ@{k|^&۽xMӺh#몠'UU!5An QV˰q_tvLNp˗t5e s|ZZ*_Mk >[E@@@@x fj@ȶdfw/)@"l@O`݂d A 6KUТd԰֒VJ T`}w;g_-s~ 2srn[Bl$vMѸ n vÅ5}Ii x}"b}@;7rVZzB.P FB #j<ԍ򾕼F]-R s; CpA-D+Ry__ NFa4{FςӅ5rG3A'Gf! wtr%CGo ˟މ(d| )21۹Ęgm\6Dp0>fՀӴf 3 MPlƅ[XZcpVF+yO :Èw9+y1j9Ù%BNB#+qߍ #HMKVQư;HihB^)sJkV}|hLmPUwڪ۪#b4hMg~Ŧ{u?\b;忯O )7|?qNm,.NW8Z30Т;i#0GL?zKwJNc>gdvܳG1+911ur0 &N+%Dp "xe?w^אo_rNYjUごݫ@*6頮_].M??״W;\^6~ z4ךo={fA ?p&lF(%;bÎ{H^0tJYGޡeWaLkzPu<4`&ձ`)cpmiˆ'rc6MAVDž>2<$,Q;Ʌ` ;ߍ_g՞Oe/skSIM-/~ybImj}=o9+%\a}~XX]HShML6k~C3JuWJAsҵ~VsrxVȞ#B!К#&+8Է8К5 )r ZDk.7~> .k}?~^9|jM0)}javdr$z+ښSMőeW2K[j9j?,=-DQS2þ$a"8Mmۇ+|BZi"95tWռ M'sÝ<ٚԴo Y\7m>95j Wk<1}o(㭼 MJ#j[ 2rZ'tf+Wa}(ȒZyoe$4?y0$>25͞]{Yq;L cfp52* aۯ_a4fhduHm";KӁְ)WͧWkl샐x7=eW#T{jNB& {@0;=evgOKW.w\ZՋfٌ09j.-bFM >.P.\pƅ ָpŇӚ!KHa]j.*3|hF,雚\8IaB&M)r3 ׂvPi TYDhJ- ߠ `~5-2j\f$$ lL0QRQ~ᗶ$54Ol *˒ fF\Z%GZpw:v+ JBG TNMUTCԩ% iEH=6DTmicw.$ma {DpF R Juf\qPk:q hV>0CP",ZpR!&iO(h#x0Q@.;Li촉^aFdzM} 7G-mh^ߕ&{-v5_^/yÖ.΁i7h3ӧ՚bX-a5BF'5G)gt#QNg㐘^1Un `Lc,I&ӄAT4L#EnI|PCTF3X!U @Y7jtO#y/i,(sbVcI?x_@tn\taKa *I4vJ[>t1UտNwhTIG,$4=rjLD闷YvpmiHbaYc(y9!e]Jl, S;yGĘ4Jđ/)~T\^zqKF}ހ95\kx-`)ȡNͻCKӆRNB%6z툻~d_E(M轛&ӴњMLҚ.ַB#G&yHk=t\d->F9/KF}ް |MX8́9:"qd#hv c8jOHV o'JP8#HL`wN=/ .&lA-W ]|8f'lf9pᄣoΉǯ_ts^ 5,\ϼ$4[̅ufT?jvPC 'DI>^,8 K@'ߚ^18ȦO6V#0&(Q@Ֆ/KO̳5` !Pӫ_W.0NkgG?㕖TUmO|}ǵn~7lNk>3$Q{GX H 4Aa @ȑc3LI;8{}jMLU6Ķ5D4 hK7{gʖq}ؽu,&@h(HAS ZH4 )R khH+2H !ABB^r7v&7t ܜs$s>'}X,P,bװX,sy VڍTAnš'sySOv*Ȇ׈u,H:~ }y)+*Fד9oqQ})+}|\i+sFQ¯ (Bbç^U1͜7п~5[pTYCRnA Aoxa8*$&ldIEĮ"6ǹXG_\Qm:+'z3mwoFi '6)ܼwcш//r<+⸹~~_l|GUFp v漙U߬[K}McZҮߍ

,$_kD*^kaص|q떼Ե`/қSH=)[{1kt>1( g!q4p<HhN"pTqF.|֌[ɚO$Yi}zM ~[S]Xt `2%<މ"YI>:h`ks1qK$Y¢÷$+O^ nށ*~[y+l^ c2P:wk@"'S}sq,{ Lk-d@u}r8v3>7e h/@i^J B(v SBʻ5x jw2w]p^Қqd%/q7$!A&z (,ʻ5x jZ`}Tl@ܒH[Чl>>:'Whh/F1q J B(”@؛4kы|\oi+ζ_^\gLIVk{P Y#ڧp*7$co^Qt(h/F1q J B(”@FEֲFo jO@bA!s*P:*R;@" ֟kXV2 ?x|̋^bkX,b8Lv* DuӚCհ~[wO7.2/^# tPlwnԖLv/Zf;%tm yL'v;9ǓҤToyҭnkH}{WcV+'5:.LV0iVRB >8OWDÃmٞ}FihLx'^³Bf Y9_SO*."cJ&Nkdר}yz +x$*zΛVO)my>M1E'"I 7'ե.=oEΛ~es/^`7yͅipq 2ݏiB'NkFʉ1ht5&8SݫrR$IJyM2Ϫ[$'^3jfHhVVq%,> v%qUI[q7UN5 (^f Ӛ&+R"ZBn{ Ȇ<1s!-~1P4lJEV|\/? {+`(n3{5\x}rWw7axȆT4o^OM/1:R_>'ӼK=U͠gK6yp?6ĭ6FEn{a cX pa,`ܒ?O- Uôz]\ά (~ ܌"7Ϊ1]?4)VTx_}Z3LV\OwDz*ǓXhf lEʁݓ]y7Li ?ȳɳk8Y9O ٰ&6v,>&baX5,^pa"FrBh:}J6p9{Xà=;(bDm|E0r q9}J=7H=wkXz'7Q)J@Pޣ>!x358p g֜x#%~=+-CшAXR xtyI(2`݁}g̀S?!. Þ XQcV6sf~VgWB9+?wBraR xtzȃ>7(2`݁}iR?1Vž X\ݯÝa8,ds%%j$|E2T4£GrmEr(??; |!āðgּ>e' )a䄝)sL9'HNu}j`58p~ \5rfj2&jO+”9I  $isc>C@B8…a3ϼ3o kVJV^j;O #G7ȟW`e 0 $isc>}C@9?@ 6o?M)aE7(?݁AFJQ *"}րܭ#Bo^l {* YgkT#UtbkTTUt?[]E_7F޿=޷akګx=i=UфlMu=SEؚ*8ȭVEۚiܪhUyUE ؚ[y 5(FupcBIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/_static/logo-420.png0000644000175100001710000014133000000000000017071 0ustar00runnerdockerPNG  IHDRŸIDATxàSdwqqeY.nOl\oE'2Nǝ@ ݈t=iw$t}O*Ùph Uš%{~w@ֿZozCbDRLJyrj෠!!T&ʗz(J@>Ro?x yϥ'údHW$w>Hҳ>IOz!o Ŀ2M=CzS*<(Jj7Im}kdeb/"9h8 Vdhc=X4w=!/g<&>$'B/+9C}ja#6HWkOA*Jߠ(Ķs~YCdϋH_/{Ɔ (e)".?,k)5hZg[ɇ?8\fާȶͭ#(#I߶!猜w  O IQDB[IZ|@B.oωHGB9;s5ԩ)a8佬JR|_^DFN75Sk2z()BRs?dְ~9:$ #Ry7:<( A(}_ w_%#jS +$W=DPTaVS9YE(ʷKU,|JXS,ckʺiʩMlnb;ޘ #&- #j8-жHM{;eXϪrIuI6+";f6hWGŔy,&^k!ϿJiJ(^42G %co㈀.kjĺ%NcQiQNKe?_Nrlh+ ifAX boc+HvSY)7}͡BRf ) 2>66֓w=c]Bs2R۹yUtơ!ɽD8ex@ #wVJ!W\dT|X)zQ!)R $|.dJUYǻxG#91#1J7X?htn$>6uk  JDwDKזͽiNF>E(WOsRv'\!DJ0~ qJJ8SR u[CI6igäMݕRx'nʆ0+zϨE[g#/w])E7HPِN){i.8@.`a/<Eԑv(HrI)@FaS7CݥdRwƅO՜uS+ralm`}kk9Rzu2[FqVJQ!)(xQ1ⴰل wz.1@IWCQSv^݊~ '~DJ x_s4Df*4;)` JqВ զp=;籮H=dQ(_3 ?dD;F ź YE;Bb[PVU~}#+GPYOSJ:ޘ&c'QJl _<VzlX)X(U֕(%dkFIs^R!)jStczd'*ʞVc6WAB *r5Ҥh֦A\[3^7|b嵝gG)1.z*?*$EQFZMMpt2Z,Z)i^[ aͳL-]tyu=2I)]}I#uu($L/oEfe orں7M$1Ւ yn%n `Qkt!wR^+xSǚ/,%E(Mo&M@^7o;&t=I)=Yy)fTJJvH8U%yc: =&Eȍl*EqZpiDed[.yZOW9%Y7i)*$EQܙSV)]cx+*:r!lNME{ݻr_3,kOyi?UE(XOYϥѺewF(&p%n^c+xRB:(i۴DIa_״(Q zߩE?H"t;ڮB+na\5{%g;7'J(Q (i{*$EQ.iUǃ \eet>QaoPLLfTtq %w6Zwޅt~^Ʋق=I{OQ!)ⰙE!}؛Ô[ '57 GP;(y}o>?$]HyweNo)I?(u1:Z>(R[J`0m׻vͩwֽdNeSG l6z8ݜKn͔mnރ*$EQ?8>,tݢ˱ *%m"%A+$OE gkh)/J_4 Ćk IQHR[ 2p҈*H_6ZyuLnGtߗĖwJ+-h wG,3J9vD\hBR~9uSJp֢gv#Ɵ!h枣#Bf )x,#dz"RY4a2H<~=UvReUH)ݦb,9kt ESl9QCDI+')=.=tTHIJ 'a s&Й>JjGl4u]qc2-:Cl{ڎC5O^^ul]}#qumx/Ey_nX^]Hmf*dN,_vT9e`^9|n{=7vLۍ|\rNU=橱_ؽHeeUH4oi!l"D71'ʐ)C>yt^^1_g5Aɝ#)ĖDx=N l齂̈Zs+{6Qr [ z:#_ 5PH#*㽨BR!ANfsW!Y 툦r8X"X|znZXOˎ!Y}25! c&/:8FBC;k84S_qlFX cgn4zZ68[^QMF r,?TڎIw>yk.^l2ދ*$EQht2 !>B8&7(09=%,{mp" dT7 G0#mpW?D7{& S 8!/c7, yzMMh9DO9Kp}#2?%`~Āl}٧Vxlao4uv+۽BRW!qRCJD@V@oLm2Y%0"4XGsE%P'kPG Ret(X#%d@Y)-T$%#Qo~(1(/oN^|Hga#nY>9z_mHuA 0LA_m p޻5!)rdSG7.~Hf#eE1M 3=lNtb *0y2& btNEd8,ZkG11Z;¢a*RC:Q[P<|ۻS!2 uhaXά ʛ{=K G܄bގI^ ڀ{OBR% `>ӆSYol8S_gee) d: byAMo aZ5ÈòaR)ː$] M!ɘ~QXPʈH3b龖G CXo f7~vpUHAk~5jA/3"V3ul~qMD/ 416[:n8~4Wk2gd|i#(Ht qd^Cz)sU=IcpfE1sC@FF5q@kкj]y vr':=r(]Y>=dJYKLٙHdmfŏH'$YFqnk8c38hmIfL-2LaffNCe{߻gYUΏg Ko EW5&[-#C߃= 77~4-V8+ݰ)ֺ|ZboCq&,ùHN p2 h -9'jF 95 ,έ‡*7'6ן7Pɧ6 tdE3Gg bgT"6e ,$*d gh1DS+-埽߀=R5CBBA_8Ec6p2%DF8 Ao]y(@!υ"|P((,RAi%D$P__J%pAUl̅'Z([ 2\q!+YVG#m%$l3,).Ԥ1 7͇ j>+0 _N~?f'+#Z#hRt (0?~f "O~HU|_|z 9?N϶"ϛǔ^3U/]s|IH !_܌AoܼA_|b14k"cs#gÕe9gzg~}3 ,ú M#f : Vp:@nnVDs*%@SS#t#ԙ|) ,%l+p& 1)q.DrbY )IeSJ9%<,S徐8[m_]߭מg&9 V$*IJ/ N/"ua1~^[ hҸ_5%!MВ$!!qu6F$ƭVQ/K:P$F}kOV,j؛ |NlBݧ}gI2b' Iܐo&|͒0֘t ɟkfozgOGC7C~ɯ`Ԕ^CF ;:1>6abppC,p(֖^8SiP(Zl,(aV`^'h$FWq>ve|WT%8N"V62TSz2$G:"#(p6|!~$#CSBeJ(_%M8nϿOtTǧ5Q?U !*z?x%OR"oh%VF'#$!uHHHP,'KJ#͜о~]DxTl+AGG;K$cerACC=zKKsLW]]I9 b:3:2nAB|pDde7l hqgwh>5;}#ŞwF"nl>3a#n_%A)=bsM&zKW"dY}^B))yIF/^FBJƀi93>h[!"DlƁ"cBN] sJY8e!ߟNe+xV>^-Ҍ|Q Lv|ʂ~_yL8fg}j_mGpaB.'\7-' /;1".D,~8 pٍES&x}3DQ:^<]2AGOw7˄އrNPBfAii ^/IM $#NVCt]0fdtiqbЭJB[{-aQ#31qwXOҐ̝T8^OZEP (':(THC/ɨߔ2>)T R1Z1rW/|l ~*):~;&ER'%K &k+Ǫv%`w0N=±tHvc!D|"tbyܨ5& ZПO=±ZHt%GW.'eth_MCM~<*)-PZΚ~xޘ WӸ֘;#$ygP/ ,6:5H2V$5'lco#:h&zFe),V۹Qp.+uY!F"|H \|ǃζQDX*(%JLJo.twuYhw\q$+mYHRI(gIT[ XV&dU+ x[GILtqA V\P_|YZB[OLyHoJBb> 4%pq.vgpRN3N7$['g7Q3Kf MN-I_\3δn=΅U- IOc$C-E8\1břetD2!yb'fJJK=~5%#hy# "2s'i@H9v˥AN AHɖp5!.Z<*d/>Ik`MK-=UIohw(! IBO|HD>d^+".DZ$xKå7[A..*ǸG vP 5&҅A<R}PSq[7n%ిGE8J28*chaC>zMhșbH8W`>+QfN!ŞOB"1d= l 8"jY&] )1TcB_oKNⴅ;%%uNHz:_'@i55]\OyZm QOBJ#HHBXCDT;!کD<\&{kKLD (a5Qp18+H:oR~)\݂)=AHdy =7~'.u)8 D(ǥ&dlL`]Wg'6n*O t8XON?r/R `d.[#H DS2}1.&ʂ$Γ.u'1_ HgZ<) T ġ$쨌AZ ܄qS΃*q`nIa>}.4Jzϯ}i/C 𖯻sR'O&W,υؠ%O_\yliMjd葓Zlފ:t%UpD@Y@E 607#h`(M0bѮv%Cd 4ji2ܼ+K@b-n3#*m]o; y ޾~)o:NDe0%ƛpS3ҭ Uƥ?p,K^stI[!)I֓p/J 5iVgD38?tq=l ܆PW gqh ivH%/ԉc1 j3]RnjQa:INXUQvNi3 ]dhi().y Eg4ޖ"t=S|)A # 9}2hB3d(]lb7=ߤ,Yu גۗk"!/Kq"-KY4Jc]i8)1iʊ cTe%sF'ӆYkKK^E(;UafjW9.;2dɚEQ1yMЦq?9}#6H72ل˓k 4VdQVVF%74 Ul) u 5>ĝKė[y:)Y%&߁$(S(f)ϭLZ[R-D 6Pzu\I;OyH Gr/ td!:ʍv-)d1":kNۭ7J@H) 䪕 6CBVON ַ]]M6u/Ky`?`513xʉ;yzU+MQNh!=Ks$1hN*`!M\)+"%jfECjPCGifFϗG-Mz6I%ϑ`~ׅfH>'lۭwaBj29Xw9u"hp֎BV7$KVD"!_#'Q rQ͞S4)|@Gyhj,ղKⳤdXK*-I ###GVb-vWF6ڎD6m|J_1ZMyp:⮵*9Z=^_gVa:MTf\},)ԦH Y|ދcU3EnkA $ӔG ^ݏyLϬ$j5hl%d!;;ɭZ {EuM5R5H@oW<gLt_xs jbYuhy`Ff& Lz\Ͽ<۩R`N;\QaJiOc o"dc!}*dz)΍6+JpCphXP/d5ATM{BBR. *^`%N~P;y`$-"Kp(fy3a~ Q2'҂͛6qoR^A ZlQcm/׮oYDΓ*\hW]ͬ@yy9 wT/Dhmv2wD2Gy*2\G:OP합gK=tGB{ęv925nNH}AXR6N oBEH[!Qs⛐%˻fѳ~QRMt4nOu 9%.ݭ,ҝ>֯[-hh>4* S&c(*16hQANzz:*++i7ϭӊ.62 &X8"&d3OX!d);ҒQFحJp裡 $: aB @8$tpQ/Y=zd_X<ힺa$-;;kF$G.dkFPj-LytD tC;ӆB@Mz0fd ]H/>3PTJکT@%]Rї_R,!WGQk9~oe7 Co NF'W8cvx#l,@*1a!QʒͯLk(hI *\}@4H!NUPb %JQɍEdɡ!3"j< GpIj%:CKpCuItH.vXNj{\')t K8;zܑS Ha(">*d8 d-T؋׿,İ\NS(0s"ڍ2ɦ.s,<[Rax9%' Qkvvn_+߾};VIi@ ieNzޢqp2pzAE.*Y(?gx6 }MHI,Z屶0qNQ[Mef\H7/DdxPvN%8@gMqoo/o76,2rx~@yx,f֙|p)AB9 $r9/ 2 vU jp̛ 3H:X9vN>Bcե*q鶅8:$d5}!Y ʞ p%oۼB3~#^ Dͭ#JG Jw*b\ &c 9yȠ˜l,]ϙ׮(ߏK1T-2]Qdbwdz,KÔ|Vgq(ε'ᢡqYO CXGR3pt woiZG*,ϐ$P_́h=L؅^7D|í=fBoA도 YO*iqY$hli8E F2ׇΔGI30$2'yZd̴Е-q 9~hKr~924', z]@J8m>CJ&Z2.'y[ǝ.EQ>;!piW!Sp};#Y̍G%0 Q!x{% `HCiY5r1~\ns-%v],I TkS9ё6;z钖F,]AAΐӚnɞrAbh,b&Ω4K">Wޣ}a8Gf#Ć9d =P Tz#|BtVw&!Y_@ϔ]rO$L ]P II1,A~ 8ng+Mz+d5п,YI'k)oڽC`QA2RXmTΗU8xss3֬YCvI+\m1ΔqU-oN'o G룱8 KD(Z:vHJi[l)_\ܦ94 }~PjFUI 2"m}+t>O^?!Vd"A&õTdȞhs9Ӂ8.ݭ-By5~Gww ,N>atH4CiXYwA5Jrhb3( Ag:QQHy*HR:$*]ĥh}J^&#%7򤆛`6w&cјΕh9") JfQE^!zU}6|U3*M*37AnE%Iݘo݊ mK8ҮAnN6 N7yN';ۣq#1Sq/Qݜl+`P`ؿC-lSe?oZ}d$vIAot$-'7ƟP(+^B;rF>Y;*Q wĉ T޸էu@.=|pGų(P)'sh-ڥj ?7 L|FrG6T]SBC teHB vGHacBuQLuG傗l;)\L>3(P(6ù] Mވ8  ږc? T6+JuwJ(_ dIijclטtS6yj(M:{Q/jOR= y568@nND7Sv?-uHt)M5 wT-r> 6vNRhYRŽE׷y!x"!p(BFe,Y~U [+Yg([\_:#w#+ ] K`4vm<š /"mH}@ʗ)Ȼ'C)^}X.L\DE$\7Rq109_&%ИjHM<MI(D7mTc(Fܷ{C&מn%8gvKywHP]?th9a߲_j.k֟P,M~w1ۏu3(eg] TJ%DkiٟٳPhMpcjc0$P`|s_yRVGJ-aM+#l?]k^mߣ-ѓz ,!ptG| :6L.FS; `(}F)_I$Ĥt;,8 ٹ 񫲻_i%d8h֟PoXά4\ԡѮ}HY@ZY+3o#J"aGQ[h;hY~_J@4%8ç3P '6Q:Sw+$EY qC15یX՜n|Z,$0%Ųi0*dƀ4Ywf- I 4`DuԝByH 9fNw|6YΗ&ͮ[ysDa^DM]ͫb{NJNV5q&QC2 d (єȱ`s =Gn~ |o@F5ջum|Cg9PtzyʓȒU<{WEۋ3--cޏiPgBr;GFHD Z-***pI?{饗hBe:vF@>,*Llu :J]mI(n? K$ ]B"+ 7.ğ ^48sZ JRX;: /@גlO Em򘠌 = JeO/@/C0jD<*N^+:d&x^ImyHMCCo~h"(@gH6l`OǡRrJܸqC;% Nt((7,,#IqAxk6&0&&/Ÿ|$h;qfK#J8߹Se|@3(BmF;mWNECw5q gu$۔-~i8< #u)N'#Uw]Mc9;=ߐ~D9ox:@%KHLh&z\Wa+`hvZ#Ф@󤁁5;z;!+᳋]Iƣu_x.g{,:*.y|d,YFrQy ~pHYӚM;z$}F??SNMsڱc.o߾cǎ[n\_o>-i:B_Y3Bt^DW?D4ZC>H>JPcM:Ct!UJ%e*=km,W| n&lotWxqS=\;lm b{C 6ըPC.탠ݾRC-ObnOEC,YRק*zBn D4o2H6&LHO Hիb >K2`GE;¢"jNқ$HZA8rBI8Ҝ( 39i 36'";+ͱBV8[;NSA+mvVٜvmyֽ$Zg]kϹ.ؚT=Uq{єXeh{gkktYJ_;v+жm>eT![RVTڔo_}IVفMG5n%BVRɲd5«"ߝƁJJeO{D G3a #xרFЙ9]wQn%W%9$ 5Pa ?| N%TTtr-O/Kڃxui~;eȽr,mmK#-<~_Y%xqgWttthMƔ0?WL7[c+=nea@AOAKCwWG9-mMvےlph;OQ PzE2vdM,ua`S9XMr:zQF!=z#_WU~'H8V }SR_2{lj,1y ͞5[ZdVn$$&H~V,#+# &&*9G5s9ޅD@IP|,M]9/4(wOEBpNsݽpy_u.a/HPٜ`]),],$2M7^_6?B6%r@uV8hO[rB[jq1,=%t^4 ߗoe 42 'BwRo_[4򠱙hd ?GaW{ VqCSSȲz?^{KclIIK'$֮ D:K/SO=bY#p8KJ|VVz 3K{!pÞ={XSr׭]V9HYR;'NUz;fLhG.MUGJ0hS4z<`m וX5QNGw?6zgl][;khչ#Y p69Y@Am5\P) t.tA} ǒo~+3C-͒;dGSr@k }*åmv6 p+Ǔ3CqK+ c (^7; ¹ll5Dۏ.Hme:GwHm3b+zAzΝf1M};!d~XQA T,YF"7#'OTHH\;U!.##C # y%!9U猴x'3B,] &Hax)(Q#xL赡x~ 52]^6 1P4,vv9P GkBx}o%~P9X(rɢDB+0a L7F6ՄO5D9ȳ+Suhpwd}ÁYOM4kKt3(PNc@A(+ tَ<|U'b<΂N +GjjjYK7CZ<.ΉKK;Q @&SކAuĻ#?ji2][914q϶7(wDhȰv +mr?f)nY~*դ |Z:^m@BhaF-1Nr2XN4}uar6PǠj`]joZK8{[B&&,͟gwGCTĒ-so^8^3HCtH%u H\!`i?)L^GwxvKOF &_>Z"e 2 Ĩqs>~hdZ3Ow(r+|*me"|%7vA Byoi,D?q zCcGmzH;({*p!pJt"PS}&pKos l>jwq/[v?2wnx;3y4?^#h8Kd>N)9BXu&ɱe,#x DprgَótEQ]?;b@}LC̴$٩Qy)AUf=/L$ȁ%Ye1\HlDBBee#} w!7@r#6jwTpl/۹*iuoMS"w]jTy묠T'@:A&>XsK%N7"x`4X>ݗY0T"$wIkݫ}(aD0!ԤKi:&^;}0_hYSud`?O(99韀zhP@(+5n̜$i>lϺ8 oGc*+z!=j6Heڂˤ*݀b#FcgTHC"@W wCK`Y.eUd8 ,|,PlvFLH(ABI Dg2#߃OHwdY X㛀(;ro\qk_݌ * Tb۱cr<!`Dtw2RK:aG,qU;򸸕"^ |o4SFLN*1!Yw_c2NhSP4 Pߛ>80^q_m@4./b\e%E|X$ ]AtFa@ ?,Nt;w[%KwuAMtHm@4ðѐ`aK+7T銓tvBo,ݱDzNX KstB_Yu 4EVxk BW&XCng>ADW.7DP WY*7˾ErBKs,q8BiR8f 5ف5d4odBr; 1BtpawO C'D:|F*'}Z7{JY?X<12]lB`䰆?ڔѠ處)ClTou!i%ɧCaKt/:p"Hƍ:Xb&ƻU} ,:>‹_cy.NtCC_7B)qɡ-eޟj$Icݳ<ˮ8YjKvb0ŒBA+9@6D N,auqrgl͟.r9IǫgMғIgD)H*o [:6@ . _b@4FC/db uHM|q0 A`\ON;%򦘤C/5t pjad 7u@#y뙌cACΈi.:$ $:"‹rDhCjjr4dQJOM5'9lvQ ɶdc) "8OnH7:=up :H#r~VC Nj3]z$a`ZUxb,?'Xcï 0J,LtN5n[Bw@ >?jǰ8#QK.V7 *vҵ3y[9nOr͝d~l<VALw΂=BH;]cٞ N }錐 6MgX#qm>d\6͂Pǘkvn2e 6w4''% Q΅S:g=ˆt,0,{I)kb;t\;#!nv`)%;BYYi%)~6d)BtG Qm^rN(JH}ږJR}B!˦!yϜ=c/b+3p(:$0rei.\}R‹rJk1oK`-LrBoh( 8GJ1PZx1g#e4dCbɮh`s,TlGL MH$7ǖQc1E7#8]QUU tB1QtFFP]Q^zlTaJ4/ - IrDB -ΔMt@$<۳԰*^~X꽡";2}44B >ҝfID@IVd*S}P:ଖHtL6N%%R-2To%my,y5VX }{9s<Fƨ77xFtA{@iq{G,ftX f\ffO /-Mdc[eѲnQ:ԑ騶iwcmZ^gF36~ZńeP<T6'L ,0r%:ZJ|YKBm07Y-KwQ3'b?5({bT:le8I>&(]«R%13KhOtLeSuǍ@l!Z4jd';hl2\Yc)Ђ<,NQĖ$}-&D9@8旴@ DTI5D;yf}StVoC"] %ìlGwj $V ӑ޷IC<{3uƒR1"!#3K3Ҥ(GIEps%~#$:R_Z2}Heg¸Eܞ`tC$1&uw:ʡ.O,[h>Z㞝8ꇐ˦xiV(JG`/y= RcFO)Sgb"__+;[:X7=P]6` .(WE:<a7|sC7uֶ9XR % jk׽|G(1=G 1YǾ7/,^g#n 9HL Ꝓ#R2V<5avRlS7Aj2IAz2tih&/9!6Q-3qmPj%F64s}o 92]F9Cc M!u&|< /Xvcbo`4 5Z ٶt>5]T/ؐ7%ˆ<:"K TI7A5!9{ʊV)<1,VNA4~]?BnY;߅CmkK%H)by. b=;w|u/>|%A.yp`ZFddHGi<#O/OP]ݓKy !gZ(+W8Npج#eGK:؎3C !DgĔ(}*l!SbwQ;-./Ѹ~6 =j UQc8wKqpIQvRwG-ҒҊKOK Bכ){UOnm\C0JtLNGZ1(zWVS]]1a>ĺ 4 =xbZWYxŲatOueN\rЯ*L5F Mg pqG6^ހ3bvQ;}G-MY "v- @^GR$dF8U*"qz6h7s0K8&[;!M$e Tfa%nC(&9ý,@f+RS,s$&Bߥۈ~YtL >+d-i?dD 5 Mїx0mMаӹW)ժt^[ZQ%Na}1qa;NɒI2'6@fMc%Y/@[t't6Rk3m*|T=BRrCuh!Sa5zf\nbګ9oȻdǎ {9Ta/S7I~oID"@4@I3~4JTD b]>RL[>nʁL3c2R$$1Lj|8kgP)<"Z( $ 䝡8 L(,s]yDig,#.?fTAHx17_꒦q4Kuփxn[zq\o{>a(喚eߖ,ᡷtV茔x[ߝS%l,Kv7H6 Q^'4jDX1e3PFt14hpBCs-)T 1RP+3]8t]tNZUԓB*ܠi_2Na:>'O'F*oI}DeH)cv#Lihr\^4̀\JG'_u@Ea (L\9΃c5kPbgU _&kgNA) P^z2ϣ+A]# 'mG{' |x:Y) ,y7ރҪr3z6Ҁ\Fip[`ğSM8u!R^s~2}Tɇk_Qv6%rNc~cel,Gv#\dzw;2J}-h]/ieFJIRUF:X^2|VX<?&t { E<j0;_||݀`j:p_ԉj_㱔% @}ɴ*f`RA< ~pRk? (lbo4ydFϴ֠ٮ0iIp[ûpbnG+Ui@PE Vnߍ?{;"S[fP%(GjOrcyUa_m$˯DQd="v,_]KR*P<Փ)%H_0O vӷ~x8AEM]冕Cw4@~4V2vE:,1GK,}VI7Qx$$.Әડt9v$ʇlU*@s!x2oJ۩ytOf=TKZG+iFa/ /;:=Ku=}5(݅YJ8͑r.H`o@Æ+AE0Ul^y^˥xg$]So(!VLUϦ5.Iweٱx2]O9!"~>"$bPbLR!l%J˸w0vĿsy_.שć2m[ LiH,=q̺J FfU23.dutPK-e'bС%QG}ApL!u榀Z f%y4uC F< +:&ԗ=u &>7=.Y@9~%EX;?>a9RѦKu{ %,ffiO tTySLXSs:Tr[o:Gn͡ZS9'ΜƸ?tՀuBsÜl) 6&Zz32]y n \ Li,0TC9#Lfq'=!YŽw.ׅdW3 f 3܄PeR  Ӑb@C='O#@iUd|L|f"7ua*O-5&:#.cgR[;T [p@0KyF0R'@ 7KCزÎ g_ԛ0:j'pXÏ #Ǝ7GcY4ύyxHNsO?|d i@,`ih{X#nzsЖ=&4l5YR\W Ī\nf0)m FO\} L7JAFV_:}n~6@IWibosiw}at!/s|kfAiHlrhgj{n>ۨwUB=$%~5p߱(9(KjHr  gOʪK#1>O|-V|MpM{J|ጌ%=^j01Mk0Yʌ _D?2,}Pfdɺ6K@@Q/-R5'Aչ;)IxaHIyѹBxA~&7ky@*Ý%oIs"wk7Υw%'~Wʰc_He! 8_6,p=౷TcAR*j⹬U9{{g]&cP]~TǁXMco]YURlǛw;C"͊G uʭX1l %EN:7Tf@&AyMWq %8; O޿**qXFp"P{ +WUeϤLl֪oB?'`G8_jਗrvl Z#刺cJ,IHNM͎~QW(A-$ 7+ne.Uww=s*(95 9|7 #ok˛oH&?eWW4s|@?8\kٶ`:tȁ}My^|KJТ]X.LCԤv ǾOJ8\/T84ǘ;;֍K^4Y2 rwG<=WȖGHP3K`(̛ظG3ū0-Hn|GO<ҫvf+sL7: `p ql^ N6 %uYF(=&*(stK ?0˳ >LFBGwՙػZc!w &uC:bCCT7pk}k4d$<ƜbSb7;a#j5 +l\~~| _zK?5I7m:-S7_2# ;MaखRlpRLqn g_ ?‘ _.*/^HL7ARo4k"O2~x'Bd[ERX%Q[}Iz"X%{n@0} 6 =WNd) H2hKp>H;''}lȃR•fHuFڭY # #w"mH8yJ it\3.UWsUS+9(;>_>OkĔsA{6; j#캌@c. `d!QG UJbJwˆ0z套^|3rItO<)O\iKMcu!|niE ~sr(١#s7!Oh{MOcBaN^cJ|:A2\#{R9ro$mUPtZNkύôӔ1-L):ҲFjLtF.΃Hr07;T]:"u;6tB /F(1Hp1Jx'w?UR0ҥ>}IİwvI|BTG҉@qK_ %EGf :pVuI ?!G-?m,/*FG4T$NEp\Wr99 x㬠ǡ'sM,+RIh;>\M:GaůX]Ԣ+b}:K:{]weX@ᦜرF?GxOzqi<\"Oɔm2c]r,9ʰÎp 9,3GpQHangJAI`"W8*aFksHIe\0 d e ƮuCNe각IgH۸Jzhq!8?5u~Nz> 1~ pPm߳Zɭ_Jt7uҚ(#$! !SW^}*<l. guכPN&8꟤~@7J^]rC)md!@3zIЪwH]N|tD^oux*%|1;A"TS/!A%(QmTx^TlV[TRUYBQH28Q>⫉*^? J Cl}~S50RBЩe=@F`$Z /8 7>f~vEAI N C(&ʄsc4kz@ԇ[攜tCCʺ9x9ݚFX*΂4 9k*Uk[;f਻a2)Džq:z:~ڱclS5jIa_gȜ:UP3 QMIT#< U׳,B.VSId[<~_$u==,$JTJjiJF*:k|Jw|26ta׬9H/P ЊyZHjB5ܗ'@B_š >nw.y&}'2=ܒ2jnRIy x(ʧf?NF<5bB$Q_ZoUd:q)1'ʈH(!zX($DyTܚzu"cL @7ґ\e>%\WRZ#mᆬx.Ju}{&#\9=JDC%^D6TsL#];ZKiVsH).AMPjmmf-ywONoG8݄M1=!T[d3A9qY ˓eV R]vS˂[+~KG3ݑЬ p=HI`s,2p_ V?)d8N 67K擋/fR cUمjDveޛJ>VK3U#Y(!Kn~]i_PIܷ1֏;NE_,@"%:Aj]##pVRr<@ȡD@_Jt WDq:R\=?z2{*РtT"n)+`&#up'!#ؿa?uS2:LD4NDTaV-K*<=MX[`uep|~ڞJ.YArɃܸ>H_o2FȺ "~`<# 2Ӏ~Cj!ɟT-|; 5RA pnB$& 7]%j׶bFs Cy='⣅w|"N^NmWEGh`*;aCߥtҟI%TߐPfCtAaW~ìDw$+an)1AT1 e]L%6&U>fCT8#+ZkrˉP9a J'd64:)7NJBD(<<̪H9'-eT^"hdRWU !?^߿ߩ*jhhTDDuUj`iAD@Piвtu'S~.X-.C7 )%$$,dD[<C]I42T~$' aӑtgO(VDTv!% A>]>v kOv7*2GX %J<w ', ҍRI_Iq<='Ag6AP-/P%xx.H %IsK\2S&SqJ HeDƔHNRܑ( R9jeWj[|zE櫤 e;(D41zIE%CWGT) F j`8 pOd "]Ǐ3fg$ud#%6{$aL UϩI)oԸdZCMz5E* eHVLډք$d"|O9(*sHie&" B&B*RoۧDHsWw UА3smjCKAD]ARCz3NLw>ӛ۪ci!Wdwꁕ١ܓ¾"<S-!B4V_J+ӎNJSf}%I/훿.5ZH AJYw|f:śA*]= Bu>E5>% 8cFf3En RQ^u"U"FiH*y* 2 vnQJWO5^c)=G祟ns/)&fѪBJcPFB;[*y&~ " LPN[6K˙3yqԁ HVoFHP1?>At+jI+d\+$!1c]u&##JѦMT-抪ȸXŠhE3}L2{-YчT7P9NϧWyd*yp8hRD)r,ߋ.+ 렦u9b#GNHq Ư/)/dp0\! J֢* zq*wmpsI⒭`^9f4D}0L:Gz?&Q<3$%]HlZIu4².!V/nX0mՑ^;JJZ%W3<9K^QF2ͅWt2pXUFN{\M24CuGYs!Kv isdҜ8@H1{"]]SJ'?Ok%5LDeR*>] R:%[#DJn,2BObaMNz@@Jzr2`+ )Ƒ<>j5r4r *zNY4.jH"'òʚQCVd4P e**8aږ[TYe5n򕯨?O.{G{rzJs=l\2ھ}[E.%=|H9ݝt?'d2<ߦVYKì%sʛ|MjT{kxU25a cٗGt;wm SɧIVXv€-T%|4_f/!dVݹ4=F?IRH %+r=q=1aK7fL w>>eZNNP\PN\f^ %FPY!=!y !"@^.HQpYV ,;ғRPڻw/vPANgbdƦf.4烌&-эLi-щNtXGℌg:~>Cs'jSȣI恠.|8*w3$%;)덙?Ī9=LMۦ2IQO ]ziwPb?,Me~6RI_I 4%111ňd ed?^2tsOl8?H (QP:@Tqh'?7Vwvq$r J^k@HͣM6 Seee(tR$wn 3gQggDtYd$Im&f8 l;[OG[6ΰr<#ryHBXaP+r i?(r~"QT(5r!yyDJ EMHo"+/ĹCPaAX}ZZݫ\`^8.KF1 @o!|^b^7#v֏XLCI#a-9L n)T\G_gSqoTMJOBJclDod:cvP ::&-b"liw][*y@$x[n3bmBҚ|lfz ;ޛUTV{w_I~~i&]v){ui(Q.!4/HnQ)7+N Y~n#>#|sȜ sJD3EĒjZ:Z*J<}'IR;)?I/#HϽsZ 9o撞#\"F#;O\Ȑ`0އ:@߉)ޜk50+ZIm!v e|[Q/ VdXl_qd*UQ=%O?̤u !__rEmܸQ7rse&d9$Gmldڙ!{0mex0! wZHge;KHihWfRB_%) 122:#p&"QjqBQ  9-I0&.>IH gXeY%0[$/H jVr~[:SJZZjjU1J[|_zݻyQum**-sF馳2BPbPC0꡶$L"&"$mm^ҙ~+QC5ٟyIoT")ے ȏ y2-ZrU,4b}l\ˇ gՉBK 9$* q*"C ;p]#E}/(:""h)\Lkx5h`{Dy,Ĵ+OuW|)1ULlTp+VG`V`w5kT[Gԩr"*]-E45:dzF00LHf/[%D23CD ģt A ($!&|pL5 }De69,@%UHV-YtpRf=w-3 WI6 `W[kb&6jDLp4qVF^'%@$GHj;}hC+$n~Hgx+i;rUS1'n/Rv$CUŽ WNZ{ZZ[O4\6fl``pw[1ʀOlFE *VC쬛 ݘ3$$dd,v|p߯5|cpi1qB'!KD|AH[D乄$;f{RWpŒ>p$%=@ҲM*\Ǩ00ۃ>u8`/JamjOUICEj]I$َ:TF\2V;n5fj4'Clw%y!I)GH~rbuk:֕Ntj~ ׶HmYF0mj]KCkyh#-j-OmiQ:$יw1{:2Ա, F 7=A8GiM}Usx#~/D4ACxw ;je,*6vp/[<ͧ52>"}%U%١HZ#F\#]Q= u@HĈg2uچW)?uDXHm!jҘ0Ƈhgf\ǡ+6yUz3pU;+B-'dc+ы/t TRØ)Lpڛ9}olDŽqpE:1´]͜)Ǚvy2jQvNB:xܜb(tQXǴDi(9sy y]vI$V̈́D H5h 4ۓ n"hLv~g"&J1&pWdso ևMc(F85>1ʙ\^s 6Á(aW)6z1SFHPGpy/3HmjDPpvvs!pz*9"İ=zU.LiGd*;N3Kr#%'{d`V6R?%%PuZgҤ<o#Δ@iOKFc*B  #%T.w[-39fԘЄj@LBJ0`= ^#b&~S~KPS))(TnAl k'keEh#bG^DU~٠+8&kr˾ ɉeC$gcşWrzz|Cx~ j|a5`P _PAx:@zP#^ٻH.F&vmck۶m۶m۶Q7u}NӋLO7=[{nX!?M^KxA\p8l"Αo[ol N zĺ0Q\L ݌Y-~:[ScŹ|>c=؜*DJRJtcgOtzn .;*fnNlM&=&¾Lj̾g4pU5i ΂w3ͮٶOMtGKmuR^cv8Ee1 Vc 5BV԰VW\ uɂw8`N Ę QKfS}RImO)s*ABU9LvTR4oш(Ǣ8 f9.aNdJH7Dͽw9ݸMv.q +&Y̦h -`k!{+{7,y֔>ϫb04RQetAH u^CtV `(Jc̩iBgVTetGM[@#?*Ne*8  uu#k ucUr2AouHř`K 'y:ݧSn[ƦڬB<{ oj֝֌A[(^+ɴEit(@stsل0h=0_0Z)-/`H\{Nkg Uaւ=6}N+?RIk̐ldf:L7u'dzkzMpSGNa57,|ufi3GAdgz5ъ;ބz& pBT*He[ڈi!PٱFV\PPhݹnlL#є%;' BN]_7Mt^ϧovXSEʹh۬)G*bP~H5*J6Z8GXaL[8Yut6@@'uhFSbyx NeNWc\/I?_-Qr\<2cs"  pG4a `3kvI!1yaV)w|Af.kUeIP@U1MI!у={mT~mmhZmP,c vB6/ۦO aMF HauzpN8(<};,gah ~NZ$v<0 Mhg[S0E7u1?[˄} 1s}+`UrL58,CMS˜UfByӑ}]3,ӓ,4uLcm@ ‹Bυ.==A}Zxb{zO`27­3~Ǿe11<9ʙsaM)B>0+L}6y9jW6FN=ajZt6XQL24*Ta/Tl$ِ*D]!s>;,'CGdOkMڡ s֔}yq磟:3 m}"*ӚqƳX@rScN,m x'~x WRRuM;zQ}5 qַ~ZWRU-~ ;XvXf#lzLvDay6>'Cެ5Sx;/Mr/ck ~c;M(8p "i hzkAnrB5[-uӤe5ჄsJe‰ϵ*:B35AK&T#GVPH֮Țvz;yz5 ѿ@rn l!93ל+/5xR`JG`C$`w谥: mFwL?63 -U3qɹ&87><;p-,P&XZw&*tZilPt-ң&}ך`Z* &Aj%' py 971 G3z8܅t NMȩSz6jCYbzISy*Qט sH5aUQG-l䤂6[EGM*~:)EuWe_ sɹ:0~,8rʫ N5YO8jFs}#Bn_8>v@rɹ0 6Qn†˃ Nx ߃܈&䜛p;~5֔in.LcVj"Nj{;~ey 9=ySy|TةZ.F/uj;8䜛␦T9ehB@rq~˖__9\1]2,pXsɹRSݻl .^?"\ax1}susL͊bs9"\asӎ3@+ k(ogX $B! $B! $B! $kc7DIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/_static/logo-big.png0000644000175100001710000054225600000000000017341 0ustar00runnerdockerPNG  IHDRաuIDATxAYv5(]q>3+,3q0ß2xI ݙ~޹[H2>UOnKar |`=$UR)9> .ʀpx %ФB H@Q5_ODDDDDDr04^lF`)6@]?SK@v10p&x(T~z0jB`07 ׽p8 c@*` 0n0wh,9X3^#Žj0cz)N`7p8N!"" """"""}CKp98A0JE6[ʢL5 JSS-&&pM&C0͂~U^_<ۀӼiHͷo  y5CPU33 g 6sf@(ikܾy%Ëjee`d *5Z%M&Ul .LPsǪcc-&&!F,T+!p5r`C{>8p>|xDDDtPDDDDD laɡLTk i,2:3at!F9SS$8?6zf3ʹ S%!@jrMs_* ~Y]pO` ꙑ@0fr pUB+ײ:8|!qj)w( 2X8=-+}C4VA*^[͂I8DZQpoU:> \([`3I, l\Xmڱ/bfT% &ξsΎ%'!0%2XƓ2ᣧ9sn 3*T̸ >m""("""""іAز8/Бk }_NHw\c#3pܹ!;{^Fh  )y5^=rjƛ8tܯ` L~(pH)(,ome#}-C#8p\ⅣfxͩE}]KԻC698@V1?tNp(VAY6|1Co"" """"""?Lp`03<鳣b裡׮*6?~;DDDPDDDDD^ীwi>3h̐+x{:"updT0UByUd^=ĬP_F ΫGۈ1S?y}O93u' Qם;x<¢jD@n4r[5u(Hr,Ȕ%[O&E!%ذ2sɩ%;c!O3/ *8{~CO{8qz<`\]Hn*=|  Zj04w W&^T'ETw?m* 0, c5![$3#@J%#cSw/<&+5| sȼ """"""w@'`|6 AP`Iw`i?Й{xՊ<3h\BK˱,y!;wYf\)k_ƹDDDPDDDDD X l r,&ϡNoOz 3LM*i ͂j8f\1RV KzMvY %Y㵚,]h"`*T@a, db3^vq,J4-DDDPDDDDD:!1˞+UB]E Zz{: y xr'O2:61=SNLd{or&i 3+V&h%B kC݁`N䦩E8=KA.lE 4[Υ9!%6kKK|S׸02S06ޢO""" """""rՖO_6lBKpŋzZW:EYRs !`az,T+1*]0ιqΜj=q13j /Cpƪŭ8}vڕ9,<*(*L/8;sF`\YXJֹ$k?=rk\N~ț8H[+u@sp˖ p疕,ިg<afEbCx]<=mfɝJGE_xf&r?ZNu3%w'Hub:b})Q&O=? )+qDDMEDDDD$  #.UcYhܱy7 ӷ3y=00 ~ݜ9?VAˇ@3X تN*ɹ! }:; )9u1H/P[H޽ >N` KOfŁ? py@ j #=ܵe%.!8!eJUPz9}vf3e\Rf<2yQ j3/xh"s3[1x]㟋cDbbcrp:G>ǎ\/? |%0| 9uXUlٴ%(U͂g^KUs[gSCVFzjFb)ϷqjqӚko sm d]X//GO}Ne#_("F """""rO;S`rᯣËYr7oeYP73^˪3;صF,ā]iG@m-Oޛqd p0;W+1on vz=ٱ8YvE+GDD^PDDDDDG2lAgVd%_ex3ʳ sQ}q 9M+#Z8׏/-Ğ`lnハ,[j9.^d]뉵=$,Lg\y@Y la0Ղ:lZub} z*H)fgZ ^ze_xv7-j9sj]{F])U P$WyYx9]P\e]dĎr qz~f7yΥLDDuEDDDD0ՂzX+YrNğdYw:gg.J屺 UsΌ;ܟX]lx{,kH-,O~;|<'yEDDDD1'NP&H 6Xײx΅ u2̌/U<;=1+w0MO$纩E~2%M'f(Je'k6Zב;:;1&'['_hp)=PDDDDD?`98T ,[8@gX\fsO~FǛ0wL޲F@S70fj`Grz2q%sX|^D ^bc\oDDDI x;# ^ڂlf˪e0f0l99odf6=p9>/rYB3fp *V'JŶG`3\gk#u;>LGOȶ]ǩ%|-"""""w"9ܪt߲H? VhoF,vec.8X 0T_1F&t|yQBr-CUAJ/M`c& VcxK,"B/0#'O_y9K1S ""rDw1 ,C=Fr`uebKg6P|z:@{>=,j zۗN|<RJ 4 sIu :Xᒹ$V}`΍‑l!֗8Rs)oq\'`""r,9@`IqǒmC>nn`]^s/%@ ,6acNj`9fYV_;@w=XF =c:dU,c" s=Y`VeoxHrn εdӃe@Vq:/h12BDDnRo> aPNuT hǿ/<:aaB`֞N,!4Q0u13jy>"Ŝi-<&s 87 Jg_Ƣ>LX^;VuǬ$nΎ6>WF-DD&@0P&5_Y;0V Y32# & :!؅T;U$ I j|:o>S10[rfʉGvY%5K|,)g+[2j[ tOȳ0E< """0WKP{i2 |g ^x3OSxqbS矢y;rp7RbePg 1 { & 5qlZظ0,!)#'YHj}yz=U܍qmKiCDDtPDDDDO+:WUգD 1 2hFP,=u!#31Ye*ᶡ8NrI-޳,iBUo{ 'ɹ9jwcy/xe9;9uz,c6' ""Z(6wn.. ‚7{0i+[inyS;-ʢ+y-(3dvLp[ƅ)6u"sAb|g?K1,!Ёf;0lFl2wxhbD9PΝCwtfFƜ{KF' 8)O$V\̖Ms> GEDDDD~59_xlUdӘ,u@0#A2,' pF!w^OTC=ե t\ *(΂bfsG2n[i\EXAs` z^ YΞkR1DDtPDDDDDߏ=̢HT8umF_@8r%,,[gi]x c;H,d@![u 8_,!du̠(a۾8$f1 [,;ב[Q+?_/hT}<:#_:ABE5@kl;)wެL49|] v vr(IפHHOH I=%,P菱's j1GDDPDDDDD.G̢YősL\ĵ`:Okt' P,e\Odn w^À,\0[ 6)b$gTS2nHtuչs*rRb6ކ̎ہ_n <:ҕC\^o`\/bpR,Ld4 d'9,wsIJRd,r3033 <_4]kJ&Bp9SYڒ:S3[r~y/{O#e 5l`lܼ1 @#0O7f& *#G2Dj-Zߔ?ŽSbY}6?~9 r**_DZ{beI%`WHEDPDDDDD:U|"\ڛ@J ڈ R'6`!׊"r~n+g n."" """""3tp &3>1R伵0j+q08:u+% H+B0%hH}})}bq(HjXFeU/DDEDDDD0:A!H b'7`١#3 /Hv[iw0 ; V>ln;E@XF 5@/L6Fv tw >@10F` ߾PHy{6bXn,੉YrOׯ[g(KژA'/"/םZƁ9\\<h'uy FϕeڝUso DDEDDDD>X?fs9Sf鼵6 V$غKIҡ.ǘszfV6YH1p>>3H>+'> I*-gllStu|`"""""1:8TƗN  ǂf9ro%,k0Pψ6<\JUQ&831hu8,"~Č @r}/uDD> }1d|B;H`9'EsOZEveN/# J@)Ա:Nw Ьw8 ѥYʒn pH@DDDDDFLEn9Us cHr<[)|u1ҦuD8V7dτ[;;w} ky/\ NC2DD>C𵹌a#&ލ q͗V]E0o]Zp5kN80ݟ/?]u-8YFX kח{ia,EI7 ""(""""A8gGק3yw6XTZ?x UU/]¹I:V_-Dv Ɓqo ©o-=`uH0'~^K)9 7NwQ CAŌzA#'F:G*t!ؓS?BQ/7`JĠmbR"+O-@F/90qʒn=@ߠ w(Jj3 ;3|Kp?~^ق`X`vظdaO}HJ'-z:xjlkWPt{a["" """""9/ ZG7g2nIe{(x[_}0)&ޢ|=Ρ4KnF,%J l!Wܝ, 1Qtj~Dwܜ Ԡt*`uGN* "(o9ubd,})`hS+B"# {GkB-sUy 0fcdzjs8Λ""(""""ہo!9 Vr#c1q0Vց{֧@x)J%G瘚 FڸyIΡU31s8 O;b! F*Dy @!&\   Pi3x,:OXFZ%M^eNx/(K0PZ9cyoAjRlT,! qΝ(x̀"^D^vዳWس|kx+)9cL5ȉCa|(g@Cy/7o,"gN7vW' Xv~*Q9<ɽ#6V11R@WCCU1p@mCtgpT`s(VC!H2!me|bLt3S;%ke4KPո>ъF廏L,I:Xk.0 b9X%x S1\R z KZn;rxτ ~(e{ӓ\<+PJcb4|@ SC$rOX9e{\o:,$Z,x̀5gaٱcN *#W.P"" """""'9OEL`f9cʝG1)cdrb`b=d5Q86&¾K,WfZXWRJ׀,NmDDEDDDDN:80P1ΏsxU>TbD (#_} 1Z` W98;87?n?y(Jnj>2X,G腔n5,UDDEDDDDN M0h 3UXS\|<7x5d5832` w~#e9`'Y,m`@e]tGS" )1r<JלD)cv(w'_EH-0z&&gl.nQ9Q15d8Gêa2]&Fs&1M0xX>`̈&wX^wV!}ebz| 11@;>#"(""""rbdpzh#w0qwpm3MOWm0gn<0R2#q 0zŀg"_ @.Ǎ8A)2X5^8dcw^3"N8"Ġ O_%R20njT,^Kf0w;| @DDPDDDDDC f"{A H`ܾuM%K88wp~<M߽gᩅ z8YDDEDDDDN/q$,30:\<df\4H w^ kMZ":Ҋpm20P5bbWxжeXt*_N*WBL"| FDDPDDDDX; !:09str~s"Q6_Rn?38P9Zm#9PD vPƽ5M'*SWl (k@wy0Dz0V[`v d1eN 1`gjkWܡg9=NLt=ȱ !:L  ^3p/7ߘL r EA,'ˁAcn8{B?mܷW=ZV4Ќř'53Y٠1Gk@5]CM}F#Q)3.ȀL{CA"=\DY^p"}*nG7z@y":=|#L' 3`Ys%q\6!9+c1c1/%q*sԈoOA  ,p>y‡)h}4uqNR@ Ⱥ_D]]J'A"<+~ynF.;U.#6Y( 8?a1@c1c>&GUUZ1*BIǃ>f? ,<ƒ)It'Pd<_"T2C,̷gLƂ$ep1{<"}]i79@ ʅQis:g@~ cc1ƘK@1 dr/xW h9p*  @@d9V3& CBȥE總JǚR[M/\:̤vPAcB@ 3J-hĭ l0l1c?'4j|8bE@Vš֕$ATh:~ %+>FO,vFBeڭqce'5B$ 01ha!i7Y^_b16h1c/T' <-!;`5W<傉ZÐ AyTI@ڭ!r&# c,4c1K jO9#GH/a(+ u9, h۰ɉKפW.n!SREU^`%4s NRd\<-0Ϛ⽣n=B1 1c)9%*tjЪ'XoRSBS'|?';UЋpU9@ $rPy FTi5t[IO>c1c1/1s@i5*Њs$ZHD쏧n82,W.N@#{0 2 ΨBȻw FfBo:DLHcAV"rdd":-@< Yޑ^;/m PEX D=TaqN=PFp 1 nOJoӽ!@u(%2-N!Uۉ(p+cA 9(ɕ  q՞/ņx2QŦЩ' @Y)k[!F.qdgMQ<)<<7c1c1&*D3ȳ0OWʸDY(;@ٟM 4[!N{gЪB0בԻ-Q^qvY0)HM@D u%J HS{0(J}6JIBW eǵ0u!P} `&V?2.= Ay"!BCR98$Xێܸ쉑 & T MF9*pX1 1cF\$%h|B? d&A+PEv9j@8:M!υ0 ayi stZQD+Th+, "9 5Mk:jIC~Z"$NIzor9nRKBfe*1 ^Qji'"iI&l@Y|. %H͡349 2 1c1rlG=Adu?2*ʨޗz)ܸ,)컼sP˅<㰃ltk-;U@#v:͵x% 7a& td\@ݎ7%KiȹAXn}l#K-ϓR=D`RBN'\ LNFO@A^4wK5:s#2 $ú(C߽X݊Q*NH°w"mG[yѮ tҳSƕ"ŒXAP(4}}D`8=x:%X"iT::yQ? υ1Xh1c׀/pB*@ o&W>܏iè/pDcz45jB=p}q풰>*ϘQ@w뎃·ށ2**-@HD`w0w,:^_rtB #N`k)* (O$*,6A ț/erzOA@cc1Ƙ>ω΁`R+=M <J8qz4B)\^n^v\Yr4Ƙ D Zu;?9!F%c)7~ *ˆ$Wp" 9bT{;0>|y c Bֿc1c>i\_L^~S)\yU~ξz9@L*pޥ̞@-乲]G ZN z~_ӁNd0̃rzO3!!sЙN^_߈ڋ7ߝSS%< "D|Fl&lls1h\0 G^xRi /<5c1c1O W)R["2 @}F2( G9w#\YVW{!kBDuaQ7)`8V)\݊ƮR2"TInL{pI]p-ah7ay^dc)pD*͗AK@ソl& p4G0~x8cc1toRH&l w_ߌ *M)ˎWW!`jcG4{^c%{U*!}@"DxjTA9*;Re,ܛ]nUs"S$ H>G".O3dRM>#F E ͦ{1@c1cVL-eHy{+#dCz ҢpuUxhT1b'"uY A#?RJ)KRGa\@TRpGէ3gZ Bz'7B=#50)BU}zyugQPNwgRT:WwXc`,M">Mw]1@c1mj XfJPp#] )Kyqy1ߖ 8GXSBo!*"%iPɩB.df?cy>Na*gNDe೅aD,d1)Jp[;}6QP!x\0_c,4c1f~aNQ^xrRƘS[3ޝ Dxj*(3!2}<[ ?oqMd`>k{rw}Aq}kc1c{πI y_w%IEJO_مΝ ̩BTT9ȩ% ?(hLK?g'6  Gvvlsbms8;"c,4c1@W#p|;2.-&D.6s6z ÉT{O7TTyf4BݶpVCN/eh5R f "(De+E߸Ay \ys [;=>Vuv jMno*`c1ƘOk? q@a#|fBv݄<䙐y;4V hdJ̷"koD焽!V ?r6' 1cy Sx~΁w Ce0V{ԇٱE..PNR(g T!* T(չx}QXNLkwr9O];ȕz uQBUc ƒ* DH% m/WXqD3F|훷X]'s>/ cc1d#l/S!ҜGXN b|r  }MspXvdmKP)|c$ #j um5C 4qRJg0Aw^:5Ed3`( aH5xzn%  B A6 X14Vn:uՄBI T#Ku(U%fa@D5| \>iWǍj>_.= Dx=OG^0 1c:'15.G B<~;þSYރ>OWE⩴"j=&'R#:{ M GPHA9NAx&$PUV76q| Nf`;r'x)"%N߇HE +Jt%Q NW|nVˋ]3:-qe 꽪XFA$}T!Zү׾q,Q~x1@c1c: )L T7e"I?' #w7խ֞{p/ɧD ȴP mP/vZ9Djm8$F "ui J" 詏?>^o}Ȩ|2|j^}/Mÿ;q*$2G*?%J$PI1"J HEHI) 7)!*,gu[[ :&KK ,ϳ{O? APN j16#VG$a|t_zO=1L r*$_Dja(JUD<[K Ro $p̯;үx1Xh1cLm}:|%GTQxNd}'BoDe ~p F eEV[ݽJu"Qk@B^htN1>#*nݺ~Ŗ{* !(QȽШ9AQ^IE%J0v=&2@/8 4BfVNQce^8ǕVV * !*$4,IB5 PZPPc (PbՃ$XC8NN^ph䈢D`&"uұެ\=]( DȷEY[!yp7yc,4c1?~'+Ƿn[0+U=?H( s 9&UްA(#Q=ehy7XsBcssxLqj5.\b~~U}_u⹞L(P hjj9jj)ʳ tf&(Op6HE!~C 1NBF='2: ^̥y_Y٬d%0 XA(TjhI 3ZahSO@>+@C2HDāxH t#;=&8A'1@c1cj(P9(KfǀŁFE^AѥK61::TAA*p"(zs^Ν;ZDfP\vB<+ܺ} #& !AG N$V\z^VUhNݑ9iEQQ" OE ʴ+8Ĥ.G9HT/q(+dߺ_*&U>c,4c1]>L Xח;/Q}!ZM&qA^jT#{;L&Ypx& CT{)л|29ܽB,.-.qt Ex&@Q܁Ũ9//Ez.(\RG$FR xb~Cg,;Ty:oʿs3c'JƋc1ߟ-2-TyJvo>smD" Q&e.1 ("Rc'ayTuUU랒=41F!Lktks9h<7LđU#ڣMD#*9,+p=^.W8U1iE,CPJ1IG{TDJTx**F{(?7 Wr.-ХըQo4zNJUMƜ9`g<01c4=@ hx`h 8`liڥ;7sVEQO()bR`+(x./"IT()2p^^ "!gs.{`hl69MDߣYXyWRB*;;;H*bk޼qV^?o¿4(pZߦVPq<+Jʕy^K2s B }jyA^ҬU8R B$u`eR7M ..t6v5:"b$}z$6m`Hi4@ _s22"gss?M޺u^e< 1c}-9M Ǻ@΋gL5'R)>)_NRfMzV}Y:o62<տqw3b\F$Ƙ6TEQ0'8]*#%Ar(:?LbP%xP2p4#Ƙi/˲9cu}5MH:4d-pv#M9ZFDN~ %20b?&xqx/8&Ĉ/_ _C@~s=Kwhi5kH6]Ӭm ;(1!(nN m,whjTUM Q|L\]es/s'*c1c~׀/5`?Dp;'}\b:/AW.oeΩ*쮪ֽ#OEM#_"sUZhK» sll3gt:y U=x*PY}T" [[lnmRU%eP7e:J2ߚ~̓V9aF HYÊި`7bsw)Ha,3 >ڕfNQhT*߬ڍ4] Bԣm5?&{xקW\P h@Ynjԙkpii6 x/^\FDf~UY]IߝmvU YQ/pcc1o C_n SREAIeu"r"xff3,~E){ר!YM&ʲLק`0Hxz9Vc)޼yV{*s.}u bțRnҬrO ( sPeRV'1k;}n0 QsBϾ~^wBTY UB`k@Ha5Bˠ|rw]"JIh6$f*M\NiwBߜa-.siB1m".F%ys81;[~x`pTQ}x31c1X7a|?y(SeoUFeFxg9;ecLAY!]MYQ,i Pp`l j)8:ێx4,=˲u9b(HD%`؃|oaFT@I]|:yOYgeiˋm\^UsE)i3r*.{CʲbRT9lY0@c1 r$NÿP#3Z| Ge^{5|v6TմYwum5xK.Cɶ,ӂY0x+˳g*9sΥ~ag0 !78otP_POi@UPQ0+*(zQR#eY7cRq,yRR@u֭W0+?;8B} $P=?$9/T8k o>2~2*;|_&Q @9"v *A5='i6q6LzSZѨ=T,S(^IsʌIThjp`yi!m!^Xhc;쩦SPDDIן "2 Ht#sW l>`Vw߽T mNƘo;c1~"*B 9nPeE#}/r bDi2OD8mwoE,CUL!?>P i92#y‡k{惵]޼6>,B#!tpR2,**e },FM$Mt wMz#g'"4ȏ߬(0ooSA5T~XY@GHqy.Ml0:ZBAB<#My#nMlH ozѣ9ڠ5ަ?_IЬ(IcDDx&T$i:0ZF7շ12׮'3wrKҤ_UQ˜qv`2"n)+{1*?."@" #ʏ4h (5~!:=:>9zʲD:/ ON%ׂ΂ATyeaÊH(责TS| DXE$9 Tgދb5W{&c4c̹,C?w vTՓV S9|-L_p*+;^U@cHy׮]>70MufKE~? Gts̽y^`HX_O"o&J1ש%bTz DcĉpD2Têeo,i?~m޹߼`0(}ӿ(*J(S6' 3{%cq U %PDH@Sdߨq ܉v4imw5clc1i_ ,RU@AAUQ۪yb8AttQAs }Пmj ᤤ? D^`к̠y Tc:ʹixT"S0M߉YXOGqU,tj#¼,gǀ6zSicz[8sUU*K5LG}}#Qq0n=o8*@x*9ܳ3෿}U|榡ܓ>ÒAp$w/tY iC4"2 !DTv[=BTʠ( GJিq.ȉˏ$ZTPQ@ %" NJ DW/P׀w Ӯ<1Xh1 ?KOM3M6A*ZYkqeCYgӠۮy8yd* QU9N% IxRM S*88avʌ @=̕+Wgw{ )99R8xx,w6!Υ`/iGǀC[yŅtY)$`<Z)~m&8eO/reCTe ґxǁLR4$FIm BN^4K2M@hǼ1{1N@"TAS1uBTNrNt'ϳsiCܯws(( Bu%U)D  pK)hrRj4 4(rzOc6c~*7sǎ:9&a,k5"@*D8(('YNifLx7mw/Tj /.mOC©toX{aL3_ve~ "TNG T pċ>1a8w]J"[g59 ~s[&B&:Q7[,#ߪ[Ocf'1ɾkjU@LREoP4`o/pK CQ6QK=#›vF| 电L%GOԙLON1;;K_U("hݽX}}g?վ~iVE߳P$ Lʑiq"6@0btLJp'no wa֑DfV3et};';?A#NRUCZ.(_88W3(CTi5LNLި)qWFv}e఼<'@4zϳ6 @;#otbEJ /V#1F FXHr\n(-6ˆ˸{N/?ۿ("1dԍeuO(1_DQK$I9PyS UB:t8U\OlU! 8"#"1(ʥu!?((  6a;?)\s4Z06PO ۄ| DAAb:G_O: 5vtػcԒ?~!)<]WGUU_9|S82y)(Twݔ|EAA#EB-Dn Qkֹ*!ۺ5teFjc8KTip^շ"lɇ ' {AA\ ^cΩY8bIMg~ɖR:+^?ů5G`-X*+#9kir毞/KF+t`hЪ'UEѦ '_jņفrt ) pTbOv ߆oNT"2/Qf&>L9S^k[Ƭ1QTՇT-z݇W|nH lK?;p2 q"cDUEVRZ(Wn1Y[VAq^})mD=I;*s?rx _ٸJđx{ `!  6~||WľYdvAU#6nJt~yLL NaPBWAfaT98͒H$f<5/ㄋu4A""$O/:OlE3(E+2ȒZU[uq^2 0y^fJ KYL( >*Qp)m;걢|"`ӇK9E\DaS:^4F% ƾ*~`M!rpkVyQbo' "웟Co%wJ=.!g AA EY^C*"o~jf-Ք߼w`-: "@\3agZ"K$gG ]E`  B$VWW9xfQ$+ֆ·N(JPEX/bubarrsP`wbrÜs T2k#B FÌZ!Àn &c/\ pPQ(vc,o'ϡzLr8n{S-?ia@ FPj׀ AATRુ <DEu >nt#}i-PؐcP;9?)6b6H/`-EQӎ˖+3FXط!\V\qDaju~9ΩӋ G'ήsfT3=n Y(ňV1MӪ lDZ? {T8xdҌ s0(-a(lg:cϩ4rGp>HP6S^">J St8sPTj3aZŗ bKm$7lY)nE}8 ia W BAApV{$flSđi qB_R QfjVȲQ܅LOOsnKKKPNՑ"&>0l։zWՑCuTSg;LM6yk}Yrvǽgy,Zrӆ8T#Ɯ*l77?ՍpJv8Ϫ2()ȶ(siO>Ս[Մ+@ӈԓjX8G KǨtӈVMD^4 *LO`9EKUzI8(e]Um,w/R \ `!  |3In!URaYg|G1JVO"X͜  'T)I Exrr&ۊZZ^ l 3BU(J7(Cñ,["Xxh7pq㤪̵*8L|şvZ@;|c1-FՃ 烿] N73`~d3! ̒D= ~^]OH W_Kr1߾lqezgL#a#G AA^_ŭUO|߃wou~CDE a tRL-X/t\\ ewܹ?uv.<:(TӪc+F"x/;h2唥YDǪ :bu N[4 /tU!ԉus}4?#JpjB4GoFU?áMX:^sWXe}J'yX\ ή82d;ZFaF|X[~FćۥɥG8UvLytj{UXL#?DZ#ZF # KA˄ibx꾝,.snwIe2o@,  >BEiq f;ܳg#g>HP*22 (/ "onJ`DFu@LeY255z=6tsdW88* &2.f-ĨnMMN9_@R(K۰(4%N$AZ4W`4,8~jY{|3}DFnhϽ̷-12"UMz,˪v5-HÿAYÖ`S+НY1*Jb'2BE("#~WpWj+αl"r Uaf>pT M"_ x* \7P^ԉE_gǸ"s}} [l_/s ,yu<7tN,pry4Dk7ko/g}/Oe"ʵ`m0$+Jۇ"StZkie % AA4ES_7ݩ8t,/ClwUK|PŬdk8D<7n( 4={ _а2SWڵu-iqmPD&BӋ8:@ȿ~]Çvr{x^yp?G޵cڷﮮ9uvxpLh4U+R9r0PJǶ_n!,?NV-"k)Z.|>Vv|n-!vl^@b 0 (0-R$1|#}`QZ#%m lIMG;q8m> $I|FX5!D7U/,q8#\Ͻ0WYZ4QO| {P#y;G2f,-w9~rg=pV"e85fz߫%{9̀r|PG$I8Ak)teWE< fU-tS'O8Χ_^bi=#2 ,̇k_>j3˰Tm:(h;' ApAAg-_O>o{cLA0@j [*,lX:b9>mUuxСj*aP\r.) ؈ l8WU |c332Cx}LO5S3Y\^B N Kם:Ek&Y(U)%h17TյS*7uZķ%[T|%g^^{G$\{"#G%Y?wv eG*(9rpoV'.  "0wB?[od?3 8> ۀDP.@=Rf؀Vm"h4U"ۃ333UH '{Bl\!*r `\" pPPEۇy·֮3|iRZǻ||8pq`!ڰෞ^`[%`JכSӨc BAA|sY4Ư|}|gLˇ NUnHB=1>Bْu¾ *>SUDWey^vαoMR+*T!6 +pzqUH I)4b0rCNCG} _ ř5y$EaMU}+1)䥽 ܒ[e!KqP؇~"B٬*.GQ5*L$-Jcշ:;g~(Ϟ\C\R}rI|oWK|_|SSz- ϮgPTJ:+Dx}h_A`AN?&Q:ݨԃ{=0"rS P-Y=MG'Qt蠯DY F1 (~@|Ш}o{XxpDTmЪTauYVn(zBn >ɬr*_5h6Us5 m[WKFFU~3^zF={!7?LJk[?`dWk sKp^b{ > 0 |+<;7|/_n%mN#H DRa_3'Ѝ,xVܹS85Hxөo9d@ <^U(BaC=Xx-X=fC_9H"*5&tA5M>Ҕfs·+++UksЎ@Ǒ[.: ॉ]~qpE9=or}( ˭DzX#bv'Na Q}}B@g{̠vCA܁`AA?܊IZ;9z/9GY:^AЩ'_5Q6/ü7͘N ơ%F(@Ж?iʽ[ME97XEbyg;8.=wqdp@$Na6SrgVDUO.#~yi9;J#IqW@V뎽-uV(2,#@=84_Q:p53|z<-\_i Ag9Q-Ej1iMM 0 /?D7{(+w,z}Lw^ v=̇~>t Rg]3k~^ G#|5pHE~/$IΠ'd`.n׉"ٕ!'@'MPXh&*eYZέ0լ(3qHeCDQL$ZjOun WEp0([sp(x3,m{*q؟F~ۏ:ǭbN.Ye(ʝj9Q[ C  -dEi>{g4a J Ї}+>UI J?#9ۀUfŁ|0@l0f9PT&)FY3DTS=I.4#ʭ߿pn `NjpUe;D(8=ZDBhT78GǾ( *P7ӖUWye_{~܈I+)ũ#@35~P\j_=^yF֪a ycyɓ' U^\O[Q|&LY^^@^<{3_qd|u D#bo54h5CsDQ ˙'\`<#E};]{8޶\yoaxz|*n\a~%7;^~W~N7W8_ܑPukiv}cr/ݾȀO xQAA]_/h_X}<~n_q[N:nkbVz%v72^ױ(eSUՇQZAOѠә`~~Ǐ^d`aE쬗xvvpTbNsC@JiCQnf1r뿿i37ۡ?@.؛&5:[,d)KyB,ʘOUZs·>lq G-V>#)ϜXgamH=FhTCMnI(~/@Q wn2hF!Z߷c/p$&?| 0AAl/k_gnf~nz>$2X7}5_ǁ G`ȹ!묰 cNܪ#L/  BOZG90χ {:Rf֩o)g+!xv=FQ.Ljr9Bρ@T%u0 |z뿑{>wG#FkF" lKxVF$1A՞  Bf&Q𭗓xxP]&qW!acQ%Fa{  X,RFN0Ωڊ㸪 k~bm 8窯iP D@84%{(D};&VPBJ"!2B^: g yվqx -FZN[5DVMET}^8ʊ xނz eάI#̳Of7|_eN\$I 7KaS̶rP$HAo ѳWE173:uf3'܂1ʖ  W7GUw`~;gaU lT:珥C 7*>4"JbC>uH9뇁$ZSLLL0 |ݻ8yr٘VGhTɉ&kk-ڀ_9Cw$) 4Ӕ,/6Muovա*7*iDQcѭWUt(W怵~js6K{^ÿ)8&RE2U<_uș!S'Oq3=ȣOn#8U Ӭ]Uo>&+CL$\A3xÿPw11ݠdC^1BAVm`7(vZ/zXg)K:Wrm^[Ii4f\LHZI;*@c~Z?V^OS,R5)Y"s6Kz&qήС @ZPZADXX*ͥ>t<{'q :3İRjh^__g'1 <2kmuU/e5O m4Mn|gf $  (e}1լcDPn%I"헏.G\=7+z0I5~ #  AA?o73 KU}O=o:DDUzFJ?;XXdt#ժbD[O J#mŪP,{# gOU|04q*hľ}رcZ#^&&'Z>dkeM %1:f"L7""8D>D2\\#IjUUDriyS5e*t>}Ϳ֙"P@DyYJ@7*Fh`ef& ;ZDk#T%`! `s'& TsmGx]a?#@Q:Fy(e |=Fh֢+V%"S_h4A k.hC(8tj\ݔ`Dqv휢^KpKiǗx%UkZ *O5cDQj#CSM&eT^7(U6o_Wǀv1C3z^Ͼ\7_,O}+lqlaTU^FN}G'=ܨo|Ww45YF"@ 0T  +$7gw>ַqq g}:(cdEAQnnnR t6`ϩ0XVd٨ 6UՇ ;vV{Eno;~z-B{/j#C\u 3͘(CVW,0Y9Jۦ:(X/blS$%I~ө*+٠ u,㘢;787Cpm]?}x+8UjIV6F~ fBmNP DJT  IxݼI >*bC)U!M Z'oȱVpvR*{R7a nWe_QŃ>ȹs >8=H,[ݻY]ɺji3~@')Yn)C=s U|'N/!@Y:`Lk[AZz-TgIEVU\\Zs?ۓD͖$1eY>ʽC_<3=3S>9_~wۘlQ(GB>plE4f[<_U{fy+1 B-5pv3(ݕ[Xybp.O m :Fd|η}p5;oЬsSX욪Lc*w3U;1l`n4j7=}a[uC4fD$M5Y;xAĉ5AAOJ K^+v?{:*OPNx~-e2L&Ο<^8ZG|5žSs`FRX"\J#~0,9:dvVUO#N\bus={o HanAUZ^Nv*P;w 5 G fJ6Uhi윬ˉp3m6['؛dzz悶߮oK_gj"Fp= ?F7,}LC굘ZpE-. 8,vD\85-,AA¿K7+s>R~ @锢,f;X Y('/-p7ކP#iG%9TW*@Uf%u,} kN[FY t&tq9Wf9"T)4APH ).q9Ξ[Q^~?cy|㬬 MUXUzYɠT&Z͇ι]ZD|0[SvPN*=װUh4绿#?_~?G~T3~(YpfPzjpn[㻤wSZ6]'B&$A0 |'ʿ?M9=t5}賮 r?%&1bU3hdXcq`0٤q~]tiʑ#pYpcH^hXv5Jvy^""Kk>SC{JRXhV`O97ˎ6ϼ|JG 9٘{$bH JhZ!ioxo$+myAl8 5 1P#ޙ&3ް$[MZ혲(/b  hnn6ڝ)7 U71jbDP(^ ]-;<PãyROSu&ea)":A  G=O: *U UZ^ԡ<Lj\m#VG=n!z 8p̧ OԘL,Xi4RO#31}3oTZw*e4 oyd/K{9u٥.aĐ$vL]9 pODKM3B$:~A)ƘjƫE(M_; Xr]{ᡎZ̵yp${v^ `vׄuʮ:~`nԹa۬'8jZ$'7U#Gn>_|7ИkbzLQoA(  ^  Hᦅ0'Ѩ%dE;c笏2Cֆ#Ñ7~^< 2rz cv$EQr1/cy}@*#C^CcvGv7}O{<Ȼ8SiT?o; V#ʆ(|Xéj4|1s :aoqdVi,#B dSAm2?Q{C2KFf iS*fwxW+;O} 7qaYGmFJQzFxJyG! 7X#&P{#x˃{"׃\ vF FtG?7* ĪP}Bp#C3$R7*RU_XJk}swXkEypLt[Vۉ~s~56'1U~ fʮ6Ms߁f~EFՀì(PiQoqq ZTU:Vpu1@*\GL0PUSeLF EC&!5LE\SMAk;DޕހhN+H*kilhb$Pką<(✫,?pG ]cu{vn9[?)yIo"DABA)Q.?A IU heqiWP -G;Qrd XSOeswV9072#0\ {+Sק$МmQ ু:%i&j*M

UVܻl': {z2sser-遴S#Ij "1i3`pg(Pj`bB`UT BAoIqsGwPUS 9]m]?-$2t1N,#C'oTC?~_lnT?~ <5ު?:_:Z(2l'1$Aym8KNRbQ6KڭV5@eyyٷPHUḯ혩;rÌ'<lO!Aa{g<~`p}+07l 8~0J" Lb|'"3MT`/8P]#S<%Q; AAv8on7ٍ u yqu_^ xBJ>T Bp'CF,ӂR FU`9k+8ֲk~( `UxaKQ>NObiʩU~sU[k2[K~V8y 5Un@D?c KKKt{]@z͖Nn^u\$L#DM!`{jo.JrQGvw?ۤp/@AvUNf== оê?N~|Ld@p(ĵW8hN{_APRA  _?_dw<o;l_ UBV ^]0#Hcj&8wR{C"ȸ 0~z1>uX9?{ZMs _ZMd`F=ឃ;i4jE|He~cc bnqU87pgKwjȜD@µP$VԷV_ 6:<~Oo@ 7U1 P0 B'd{=HjOQ~¯;o}8b8O8{з]Hh L%%# g@PYk@V{fYFw}眿ȑ#~0HYĢ Kç, #::k%1_x,W [,qD+oQU^燂8fϞ=y! [sn#23{vn7(˭Bg^Y> >WiB=MP3(/ 3)f8NPiw:p4dιM?Ls FD-.A@p۾R99Y芡e_I+֩CU 69{@cp!J]NA .Z/܌BQ?Ǜ܋W)~N}`ϷNPF#4D̪i[#_*n7xo9=8{B(kE581Hp15{v13ݢ,-K"y_+@R#nH`q(|aATTZ>03=Md NoKšn,4#HЋiFx4yۑCoxn&UʠWoDjuaCDq lW 1P&A!; C y[fGUG?%EiQհ_mF (R]UZWS1{F#jJiU;p4|zA:ݪs.&荌E~/aC B^'ICA@fMY/" xJ'NLLi}8p?*ttRE_έC@uNyhnzs۬ yDYMEUR`SpKHh6ADhՉE/zaDA  ug U8kxji¿8U_ үTS~@Ui+Fd9x0TU~2ښZK3%!`,yn-E}`C{f Ë~yz b#k5"n'DS(IT_-MtC\Y჆jJ/i$6a{Z1p!'Ͷ'9̽;;USg? s~PQ0&tU 0&ƉߢU#@+o9&&1\LjvRla)F"u AA¿S7*dvtZ*Yi{F#Jk7UAp)H|lTaW#co@2U+pU!p8[6v㟧 ϬRSj8pc-˟|'iQ>U6lV033C0{ԩMGgJU^3 FtO?BS5[73CaTרvso}^Am 'ÿ8Hlؠl7`u? (7i@.nEْr AA o1ѪovSHSUOuzDU*0Xݺx4nT|01n㏳g^?Ph/6Y 윟2=_$8/|Y^EU4~c_BAC>y$M}8/,,PŦL;j(=N M_> i|AW=C;L4ST>SEoRoK.?&GSOp5^o0?@>QBD؀r!֩lMo4f[H,\LRkIjn@0 ~Eh5R{j`Pt(ހAp%d 9ZpkHjo GDȦ`;AzG^8_gYD__XS B}<%IRZ6Zfj??3} ΖVy]EvP@uņN﹇|]\&8ȃ{1? ,Ǖc.g^c_?0@naO"@>Ub@ RQ؇u~@,x Ɩ:FJZv 0ALw B7 /C7'GsϞiJP'`~EiN7*L5t* X-+ˆ@(C2,//Wm@5),KZ&vxN?ǹs爢_0f%c9.َx ,9unGajO?w^ƛfEqi"@b``; U+p?C_Ѩ&/-/U]MGaۅցB5Sśi3C apt9)>KDaT3AP6f,*YIp䥥t·l(+f%q,wjn7bһ "l)$[ZD@X6MZ*H5ZFӯ Bx BJn}x :|o^Vh׀*-3fW\QJr<,KĄ++|`h0{S_zE}ŇI9xf%h7b_DZ71[w9(;vॗ^Z:H)kC.ϼ*d;+빰0u_ 呐F4ME}%s8q $epSJ jel(@U}Wcx3DSߤqRO1 1ߖzBSg'x^o/LuŜ:ZZ~?uJY%AXw𷀉 !f&4] zyF.@V9EA }"c޲ZZ˰'24=S߿^xE1¹pv $@,Qes4#r[+EljUU/ |733o|R\pOجpܱT(ƈ–QD,ܱx+ q+r膢1t4>S10 )I-&a7Qk|+z/+T 0Ap' F'1;ټ?ߦ2u(H Frep_{LZTذݮ'o+"vZ_1[-|I}{VCl 5@/3=xyb^69S;wrlzɞaq$ J!2 덪M, JTONLШ%'Odm$csFXu gfY n@4$"".7q?޾A n$t˭H?QFZǕSu Bx B' J"Û]Sq*c?;a@ۆHVx3 }6]j#sJ<HO❞UƘ*ćz-NA"#Ec߯o}8U,Kk6LLLsnkkkgqdIfy]o/-:bȁ5n/o5Iʥ$" r>w mzרžJ׈~AoAp'AAwέ~?&p:YAV,6l+zv4Xp( ÿU}Zk}r ' YKǾ( l EwQ8'~wnnݻw1?c!@,˲z$pr)Na}WU!nʰ(8%cPn?qJH}ȧ\uJLI[5+} @7VmeKwR p   n@i:C8ջp?e! 4kzs\q3~z*+~U{]EQMHtcb\~q!Çy<x; Dit_E1QDeCRQ-U@:˾m:ޑ-A  &nuJ7CդӲdu8J0L"A:q5B,YDW--/STD Q_4üz)vo:RϫkZZ^byyW#n(M8X%n+)yPP, @nj4e)#~]B\KH/0@ˇ{"uȀre"8k)"(A0 Í(#CLѻ'f FP#*ʕ8<4gO=êUHynCE,GGDQ0{*N?nP. IV ~_8SO<Ʌd{wz ua^>R{ pv 7*Ll@nJROj #ԧ|tt{6+A̅- Bx B@0K;#PT Y^6"G:q+rEv# QqJnTZC@ ?lK)QW(JTTQQZ{k^\UVE >@>CQr1FQV gOD(@T3]I'@ul0EadvL.`VbLt:G 7VH9T⫷ ujC `A ԍvN{ Q(#/C_pSUb#̴XGgNlyb|pO5\UȦpNU/S=],X[U""EC.d/ UFˇ::m8~&7w|ɽ+rqlV @VIk w'(ΉJTU _S|`>U;p+,:|EZkz%Ah8D9wIXt:D F ^ϟ_XXY8|3#* BQ*Q݀t8<I"$)7l=EfBT(#`SAXA¿nHowO0@2ш}+0U*4cS=j%o+$"T*@ZUaE6`眯}^~e q ,Solj1k6_8'x,,tVR &6Ġ Qņ¸p%JG!FNg_\Eئ `A[ Zd'MG8S9FOc"%p@8s=QMvkkk*psίQU]_ڪ\ի!!M_$X +(:G-Mxcj5~/a7 u8UJjm@1M AA&kW|mU%m}hm6+qce`ȭUv.!BA!~ ur${ww$Eܩ__QA$FkD"l(< 8|hp8@UCĈy򲼤2,+}j5S,ΖܮTz--VδQQn'Oya1FzP QW  bbzs~_z'K,$-íz:+}+x?>f AA|'mox@D xQFtRD@'zL$%V)vߵUY!G?wge%qƘ Ym'}@6K`""lZeE%n]Fyw!BA^Op(wA9D7,:VX6FyfV ^w~]N'DAU}-(KK@D?N BXOc^BKb~WN2 $"21Bi +V o bܮTFV1,t(PT:bEܸQ)eFoʧm AA{FipN2)J P`0s~*ے;C'<1SIID dD2-@k%,k^ߟ@ߝGy_W8b1>)?DwQK#pw_k^X~iN/oր>js 46/4rB&u N|'#gv(ߡNZzwSjlӘib"aQ! PGotSCiT7d"ApV+7U2j@U_k 7VUXPUɋqe5 5Fl @ Ϯ=?|˧8DWTql|uӫ/.g 6Kop[@DVI &dag-NӇ']D'0}x(_UWgݿB_čO7f_i_4ϯT|=M;H% BHEG`qe~GR3R/]&'83J s,8|_$+&MFRr\'"UXX9*$TUu*,,ũrgxjDb]Wy21$gay'vjgzOUvC?#u^:r "Dخpۃ2I (&jH$SK5R EP&Ehؤȷ>4AeDHdPBl}ئ `A뤀S|7=9w#j d3&6+("¶XbQv3Ӓ<~sYi֖~hdƕMC"VW|ye G>p\ C+FQ;SYeSf\? 󁙈z/c;bqϳl~٩&iNqa'«s,}_[5Zֹ}N*:f k2FkC^P@0$HPPWZFJVP ن `Aqq߾F%A׮ǾzAVZDBj;9iZprrzbUew~VR%M?==+ Gوn):"cطs_~ZtSBQZnIszKf1x KNr/҂?uZ F8q]S{U)~㏑MD@@6 *Pթ$4a}q[X?|m AA7}\'V#YK(¿Ɔ=5usY}Nbٴ`:)>a`n.  ,lEj5@U}Hj5zpJpU4)O<=;&yųv3TP( -85'; 槛L4|e2oOO}"m!YXNNňpmqs>, B2/)c uD߾G!Q="Š T* Z-&g>pm m AA{ȍVX<~n&X)TO%"\ D`DJo:((ހ^:ȱU8[er0Nb7Wc6#0"t`V xffEJ( ]UsŎ{x [t!C=W؝[iUcnᏭfJQÌAc3>n?o u(ϵ6de}op!Ι6̲> FA ln.F[r+Q҉EFLԌgWGDtf'hO9INm/ A  _ Y`')/,vNrQ$X @o¿ :FjX Fj"\853@1@EUx"\<(K$pH5q⋆ZsSȡYcK:ץ?-ÑA>kk9#HF-F4iLլUAdo3J AZo~?ny~3؆!pېn+liqց\8MhN@c 0g"EV "(uDBUgjfs/."b`Qi)BA$x]M6%w~3A Fka )"G'09qXpShDVE"6*SSSDQ EInaa`8cubp6VoWU?qٙ -L[ 'U%/{=,9zzӋ=VhsP𵖗='"իin/ NՎSКj!d+Wȇp4>٠3O a2N`sO ! 7:eUZsW8 Vr ЬEO<; zL;M:^&-~<499GE寪sJ ȇBFaV yۣ{y.',>{#{}R98`\pRSv뜻J+Wz,X"X9i0g+m`珓uG:MA  \U%"cߨv'(/BU'f\'CvM՘m@4" u9IIbq`΅T,q-K ȦffkFpD ,Y: wo{t?olQZGQZTd>ST㇓r 4fz tg(H8\ Tg&uBp! @cͽg9uvcgAy}¿3-5SU}s,I+<K>Ȁ-ϭ'Kj1606O%0pKX=(B`A_ < jw@GXb^z3f-a \YT#j&, Ȱm :{:9V |U;zf: :<v=-dӤLu4Out{eawn7B=!'c]gDqT]s`Ϝgq΁`#q AA? xFZi~ꯈ0 FyIw0$?DDы"Q˱ι-ۀGYnc^!,"UB/.(Qf*L<{CZszӶnqg}"1(WqA E^`Abo_^)!8>αzvgݶ?ՍA%B~Y5&<_>sg7F o:A  an@E}(/dyw84b(*ܻ̔hDuN"u^1vaydˊEq ?WK5 39wO'!glV#)z}o߃cnPj8s~6wGr]k ÿrTrE"B6}Oޚu}D9V| +ǗG?sDIL]gb~~ 8z:E}x@/ ]PGs"opA?az͞aJ󫏵JDdPȽ;|vbE)K#n0Qp <60EDQP,F8 ^>kADql@>qMǡa&I%"]aafrȑZsVߤМhVߴYGu8rϜb䪿t =r AA|p4Kfn?U9YQn ƈ#TS 5*@ p?}p!@e  sQ4D0Y X'>Rpdt͂R U.1Lt{K.9}uIx&2XA @8,^Gwx'0$CA£' A1~W#jŠ j$%9ۀFʅHD"H>,RXs/'4&ZWV\`bˋ,@-A  &'oav=ܶҷ/jFib6Љ1BX{ip0`jrrw|(2LMMh(ʒ^^0S Sr"pDH8U0ѩ35`INLgOTPZǞ90KZpYGEW_axp8X~NB?PkH[5_)gbø8+,ZkkC1@ԧ cڧ9) NZix&c_p=d=-#JcZSm_>CÂ/-9J0 \_MG3ٮc{.uG w H"C= 9j2W+x_#% l4sjig @lc<' SD?bg$Pwr T t &TZ8bzqIU*PS9_ehp=\/Ӿ 0 < / 144&>pM}eD_{ ugՇce^_=`s?J~N:Q&ÜzW<[%Bo0du " ·}Iq-F"^\`:3Q AA`_ Si;g=EdFU[)JJRS9j9G5"ǹƦ6,4jJ(h4U4 fff9z(qsgxxF$GOYDBU{몪ID|%/A:ցC` `A7w;odMq9EiA !GkE[ ؠ}j<˪6`U@D|Sլ,p^} Sචr$ 쯽FEDCw tT5-L8&O6f((SxJ&6<`ykgȺo1|%oD@gZ5%i/an'Zn+O֡(b$~gG0 PW~@mLC0F%rkgAQZDV:T 2Z֊X~j* <3է\4ѮcĘq?AЯZwGuqȀu`>0$BA5TՀo;MwTϡ(K BoĆZQؒ Yɤd51|oByU@<`׉+'&&@ڊEĿ߮+BTVC"qorfƱ0V(W_S ;&;MH.aݨSzʎ#-vv 10j bLQ^r1" Qa7 7NcYp*Wr*!z1P0}AFQ\ZZZEDoǎt]96K2BpeFP XXST8qvڊ5JМiўD~ThM|m6ȶd{H5"ȇV'dŨPA"(&BsEcYM0JWmEK>;~Y19 9;%BAoXL_ܳ߾݈u~?UE h! YḐ (Ю,j( mV?sqcljjw/ 5ˁvI D) ũFB p?m¹iCR[|k:gK( QәϸC9h);vENFg(W " \ObAI?NqōokЍǬ@y_*QMDF9gx/!|C BSWs=T}k]On?TO-mW9*aGd9Oh@LD<9!I+\o?/İnL-#+\^0B)XDh$D=Bf Daˆ"$u>/JK[LlE(PkiL41'ItnwXM&tKu&+c'  MUT[:PkԈkoN5Pe*gVAA  AUhc"g^:e} uCdFRCwghhUPhgR v-~N1hN4`z ;{w1tf;4: _"ڳIz=ʼTժﳲꅕ|}CF#~ѷGQL,J'q(vB)uGi6jt:Msps^<[^EdB.7!Yzgww0i e^02!`Y֮'>HS~P0ɴk3\L. B[#4sDds'Wƾ/s؀r5SfGY;R8/x `Ay fS$c©r D=7* W{ zesWM6 pCY>hoV{ G?ʩS"p<6CpH ZLo0uRPJ/pUIq*kCTs {ExJw1(+g cqD$M|lz{dQ2D*tӒJZ+= DqTD C?1@~?bՓ+֑{HmL0 RNse[KA&B#({w(`#G~ DooQUo6KKKi @'{alQ:.#PD>5&5N782X9yaQ*[DȊ-1ıp|7A+pi+QU-g KwKw6'[ԇq+L\sy jj({@p f\ެʽ("}ꦶ\U@ɑ~cd݌;{Ս]_aHAWvr).A@dz\Ȫ""8gG8dY ۿ (KU 83ˆ(0Y7 V݇IE^E FC42~i/pzI8+a+QlxK)[Ɯ.cxu}ǣເ_#?%gnBeÌSK,\bYo" F~0-/L%d[c,t㋬\b uAKTTU|"ڢ~?uz,|_:O{miȿ B0 U+}\Ul377ʯLAPO#jAUP#rl(n |~oZ->OITUK#Cl fLU*;٥>Ƙ7>}$?,ҋ Ne[VEɗ^8g=Ma/n=+R^O~ qnתphe'VD?(cmaS,,,Y(yh {CT@X0vW#gt{,^fY9ή[_`,J<1⃼(qNOpG9ɣ+}^DS` {!dSIA$!-|a9ۉ2 AW&+n~IFI8Fl^'NOOc%|8;__a nw1w.yǮae"0*S+/rOk:o{t?3uSV"BzOp:˫CȫNRV`ݿ&Ei}8J~K'8FE\FI৹_z =;)blN]9UPv_3+`qik-0^>3\}&~#Hd>tN.|U'*i+,0*Nj[ xx 8|-A |xT4>SnXUVm} #0*g3Raϯ9[$} | _}Gϋ/p8 ¡ W$P*&;eu:GA1iG1=&./gXgQa9ݩs88Yq{e|*` !wA֩vUcm{Є(KK >pSX{nq6 jgI=1V`W:TTb |tN!|C B !/,O>w<82r[`m8bTA#K~*V ]fզAU$??/cǎ/} yrޒ;.#p ݑemd}zZ|GC@k}^mrD.)Il=߫Wۇ2FWC6?#RZ;ZHd8D wl7yCWgLc[KU1?OAC}ַYN9*AXVgK=  aw $}¿4üA'i$Z|7Ś6$㘅z~P0vC@Zr&e46u$ZsZ XY/ʀ82wX" n!‘ SD~i>֟N?|'ͷ? )jSu 5䇇csw0Ȫ}G?$)#awȨ?uJue;/r+Z~~zNSLj嬝^%A*  )QC^Zdl[(/QU GdjbOP7eYS?S<~7|Ą9CQ%c]ɞA2#Fu+ د̰^J'$F>XB3K9ܪ~Ys[qdcCV,y1~G9u–៪R29;#x;=Qα9=w*4!uXM/_-C`2- w h3 pP$lIb&'y.vԮi3MjI=%Nb$.G"KnӠ=fr甯>ϓK}>s>/,<{U1|6oܭ_AA]?ԯif&v0)ňp  onreWٳLJ?0[OFQ/ҦVy4e׮]>(Rā K3lb$Rl/d?f%XMhSLͱn_uK,Jᄻ*đN#V%Sm&9uf, '85DUZ"#cimjwRS]FYC$؊:8y`??1\ğs##"|~akׁ7`ՀYttND*yX{GIQl#<Zpto"[s$fڤ5¿Gi+/miQ v8KQ1"P%K Wz{ #ix `A)ુkTZ3AMŽ AKïjz( wouuu WVVx|Ӕ"ϩjUH333޽{yS} 1͖\)[Myv=nCH Zo$;gM5QfFgաֺC,X鎐qH^&sQdf}~&(F#un64;mrڲGj_e֖|(Wx ?8~b}8epO9,H'~ZuM'`"JC#q`1s5">i'Pr0AFxYZ}qkqNoaJW k$b7O4,A  .~`:Ǟ vu( M8k vuTTuyw8u :1UӾ0'7Y҈!2rj@))x," #b<>JZD^:{"sϣ,h0?b5ۦ ;S|^QfF~k71#jS%֖&&^~{9LLOy% "LўS݇_|~s'O]pK7·8~A1>OI)ԯDg٫AjNLpt{2b,9݅neu8=WwI  +? | \UD<~'%k5O| FVSM^*f~鿪z0HU9F<FIө3 iP8xj /%dFč[DsUXE~*eybf‡ʝMaIn܋ nEkj$)S 'tZ59UGAD,/}gvt9ì?,UՀ"|]jݻ1c[  >c>Pf)O}+8#E>_Ǐߏ-(=B A[QPUN/Dl3eqȻ0'q?26:!+ݪzNgd_6'ȱDOݤ~̸ gz G~>}':0_ AA+p?ר(-f;|;0ٮazsX A*&G{1F6>$cw!}o~~FeϷ3U1-?ECbp +++>LnGcuOekpFI[r1LM}nF ssQZ"lA?Oۻq8s[Wk6/W0'>}M _jKC- 37xDUA$qbZl=-"մ]rAo1ԒÝ1es+2&?k^˲Ja4La,κra'y/c_3\ l^Rf%1R] |y&p8A  3(`|gyAo!5 (߱~Z~Gooaٳg/:w ->יӟ4/qpЈP*U(y1U>cu^"ʢ(X\\S U-O͎@@ֆ(؉s,-u1F؆Wjb`. 6 ;@ |R4Z-fW{ji@ 4񕤳;v_k4Z z#L2џ,`"^5?AAQD|5q#!E~$W`s4PhaMN(vKxNVEs@imt@$̈́L zLci¯ YA}rȷҡ0J*cw4^ c  Z\#uJr߾s Mr r*Ty"BQ>p h<FU`YLNNl-9x;C=DU`9V-c,>q#8Wg=7}ǐf8厥@$0Ոeј{EUӁ\uFalsQ.! D157W~s3_'ƀ* زk4>7xM}>D OΞ_߈?PR# Z=۴Ϟ⡀P}#gp )JuXA8,+Q'K/#y:ġ{'W.6C:ADJ1 oG! AU4k잛mAp{&'1Bq~~|#y`0B.~ᐉqe8RKS॥Ma};>HEmo{ۘhŢ<CjFqٌD="̱g -N^f;,-iwv\?rכ߳ US|mscMەqXh *˼bP)T`!(f|rgE-ZMx>Gz(c ?g_PrR6.r]s _(@0 qT!M"3yay1*J +1&1"T--Bk{. k|eK[98q8 Α繿FDڪ8|SO$ɶ#Gkw~gPyv5a2<>aB35ba}V}{tॕuanE!#1He%랃x~li/ ڦVEs_*&K~otwNU+8dQ믜o><{C oQ8OPjl0Cyu2F x8࿌n8P&`.%4:D!| A련NyJx eAlWj^J/!2P|۷}5\:˛E6eYjVz˹sȲl^UD ̇~߿ITuۍU'02:厧 FfĨTLiwezȇeqkJd̦ЯVKhSꍔVUN3fDp!u!eĐ|o|B (bbv|8!1fWwl0dm~6ހp?_6 Z3 (@/p!/Ț- [ Rf2 `A:TS-FyIDAlG?ïjR7!4,K?{{0_ԩS><&"8: #ppEbW)(p7p11ȕBb3J,+)Ji1QlpNN,A(|[oi6szzc0Z;m\Qv}E( )j(1q-Ra . 9Y^A "]Nˀ:yz Am~F͑כs ؎X`ÿ/'> <hpDk{Qú,rm zIηc~6Y[o~"*>vT*wUP1VJGnW5E`6w\9窽KZN/Ah xzfr:_|:ŕG4Z'&ćQ-b2/YMxspU_a/e" ;xA AAhm:5k Lz2"|[mA^L)rQK?a~~W`]gWq _CUՀ> >:?|SU?Z?UՇw;wэT(7ߪ4kY'j|hAQNX|U`35VNnʵ8^}Ek!__gbds<1=]]n~w/n:O? |x uzfڤi#!nCPq00gx )gk~hTlD9%}NѧF`~ 8< *C `A IjIuEJȊ `_;^Ll@-oy Kap#~o$[NdUU>SSS|'s劢ՀQ /T!OU~>CAN83<Ih/ +΍Yn _΁U)X ? \7u$NLv|7ޗ4MZ%a%ց!{'{uaگ1/\&<$[?T/z|FU%VՃx+F> " |Y7 AApz:90sK9Ei!2j_ceYr3\nʪV|MM>l۔e[~|8+\ksZ-}E _^I,mX'܍@D "AxNa;:E6i03;GQ<_ww! :w=[l!0FO=#f3{TÇ~" U B+N1l, C?Xb˺F=Jί8ʀ7vֽU"|'p - & ; | ӝ;g(_^A\~d#TTS?Sڵ릅9?1ovvؿ߃oϞ=>˲ _/j#Vj*y<臂lrՔ4J@XUTAvVZ(na'@ǁQ|7w3$ʹ;R(ʖ(6䣜bT(#EpT1"3"NKUW*./umaTY>ˀx)A0 ^#p*!2-+KJk/[A _Çpico޽䜻"o}o5_x1ć$O>-" [ G& 2'P@J [Ta"pӃ?1ah0t~bf Wy&IrIŨr Dd + yPco??SA--0;rQAYc "%l ա7% <ŔA. &QNϘsg.ڠJ8Ճjw1@$e$p 8 XBDJ@+ր BA7A`A^꿼 2_= AA?8lr^o {]1SNmJTU?0h7G~jڑzaxa-@)wP wA wG1kD   (W&lM j7ev<}W'>T?~)^ϟXr Y@A@ġ~5Mؿ^tSn JdUz_vnkxX _x &i͇o|mOә`pK[0C}ph@cxg2rJ^ pRRBԩzJH5k>/TEwLD@#P:_)hK;#֥X>C:oF!  |ס,%#׫2sKA$N6yxo𶷽n˭rݪᅈJ 痪rq?ooAr+~*vA#U*V)JJǰt#\(įyaZ !".QM^.7T9ftvMQlQ}Wև}>ˊq QvdbyOQU#M!m5WFAvVF Cf 4&|ՠVj:Nbz|`D4? t AA<|= D{CEXx=Q^bUCeA~TW%F*v޽){=5,L?w;"`ZÇ'?22ՔF1ig G^*#*:~<2>$Fz=EhOO\~U`ϼu{o>_V(̵k'~EiD>]^YGUهCkP=W w`TApqQ/pM@T!^>0qDD>c|hobywD\3WM! uֱw~NpaQ\AD>I"E. !wWDTAۈ*8ks=:^={WAZ]͒؀k#+Jn?'5w61Aǰўl\INժ >Kuj픤Jڹ5v6`A,|% ahD">.X+ i;^*s#rP>nfѰx YJGV(S3]`.]36-"GcLb$2eAU%D۬K~Wo;`Nk<:9C *tMh{X․#>f| l |}D9,q!"#+O#}&8^AG*z37"# k ¿M `4c-?c ??{?}㥗^BDn4ع9Ǘ%/)ă >Ow_wQU}_%6 r)O o&2lE᥁8qm Xc|ХNW嚨u܁gWXTߧZ8)SG؝3۴}:#"?ۣF@v"uG~pY\郿B_ =Hx=֛0X.Zdd <8_w o/=DZFH{mǃ W(E;7/RLu> 8*`pr@ A]pzxf&đ!C?  ^ N5916+={-KZ9q_|_>۷o_U_[}kZ_ |ٳ~oQUWcǎm4jpK 8U%/UF%{ m\-+ N .@1^#W]x8, fr૎f'tʹ1a;b)~FY:R+kgp!;or`XNRSr+tUxn_"}{鋫-U i?4P0 ^s$\:M2;ZT: 6ZP{O59ދa(PU뻾W%Iך0|vI[Wqj8|0<}QEQ}Z?us=]6TU۽{? d?9o^U~)A^:2?!tp!&ff 0#*Wl)|P,q 4 Cbî ʹf~/"a3̪iWW9tԙ{hPʙ_(Ӆ=OoTU/|8džDƿKF`Zv ?&@A0 ^S_u=uʮ6 Ry*QAF閆_;h7!2\|w~'+u ",_ywUlu$!ѷos<*U__ _Wdn9phi֝E5^qKoþU@n{ƈ_AM$j-}fg33vv(J{!NCk0n#FeE}=) 9ōC824 ZB-{ (7k{JMna c <~aΟ33p9fl&T}=+Zrv}wrUnR}ΉEJۺ"q8HkSU+Oo8UUVVVVVV67aR9"AL%̧^h/M@deee'8\!9zGS .dvxǹ3sV=wq׎t:)]"P(t0ø+y\.;w&""79Uq1h 5C@݇ "$X7|]QRjwV*(ϷǢRXo`!RSр9]U4| ke+$t"3SHg\bfL@Q3h%h>̄&.ɵ!~&Ե*]lݨ|4w`'ܪ|̕:xp6تv!{xGџI#M I"߸$O&k-|ߨ5>y5Bij*8+UTVVVVVVV7Y~_WES{ҔUDt)-FuB@umc!Za@ysm/:WIdzpWt^'&&x.dpךrf Ln* Se>t?.?@ftt+I)R)79_ SGA5}+hA_.~iVG@YW5ﮓn{כiy Hw^y\\J:b1sr.R/7^m3%Z:Y8k!$~VVZYYYYYZ@>_^񏣿ͥQn=ܜ{7%I+?H#: 8㏎2OξWU{ ۵kS/s8s;l|͐ y ė8:>ѱYTku>傁j]z/&okqS]ËE1 - z&7U󥺤Px׮x;qZRt:<~Inp"T{(Wj\ *qjZ9>ӫ,Z5ݦb=*1ЗoUAz[Υ%+++GTC'5p|#!"[.tq": `5ibYrJ~%#(gg 5'aeeժV}=ƄL/{%o*\% g~g${k8ZLۥ[ukCDv'HW!Aݻy[g@Ϋk:2- U$4(y!~=#:u*W$^x8N nN,+ciBҖ} }mbmN{uJ2- Ck ]~8yl~TUqGT_lyө86ҏ;qޭڝ{Fl!sg 6R"'f17_Fc |1ݮ[ϕ qlt3T ,^sҩD !Bxa++/&NṆRk79!ƪ.|*I:X Xsۧu5gffjvqL\~ ].JEsa0=-UWQ<=#i2\]W +Y6{8qz !wlAXB+@uL86M8YP1Ď7:xaZ#ZR&t?VFqW~Roak6S-HD_HcHnbBMWmǵ{7cz,p' z~TTh~tm1@_3e,xs}gUS5.U/A7ثu B R0:Y¾ˆt-n Q&eFiL\$ܰo``?s?Zf״$ʘK'_ǔ[ 97==>` 7z;D7ǝ`-BYG5݋W_}@oO`'8rZK B㜋88f.)41)c0фht-E $$Q_RZtQ=O*y݃f;}ޚX>(vbdB+.h ><݃0ԱV# ㏔߭W%aWT@lj #O.s*@IPCxE!LR7.I'k\z<6:zt !LӎȺ0$CW-5-$$0u_mϱnM #kcq\2 cuuQN>72W桗a$*S D4`9 "!я]L\F%acGQHB75STைٹ S/U?hqyWpZW'#b1+;yO01!OaعuPu VcsMi[ŝSGň =' Tq2 I)=礊]}K?h^m'g[DAy^G]ECm1C0!i UU< ++ .u._" Ttċv^rCVVV%rʱ)*c/CHR"*Q<9L3#p"?;Ias M }K_:!D ݇t1}ڵTE\c k&!:g1)N U qV;,zxi[>2"TobbJ 5SA8ϓ Ž;6=Fv95qWJc kKWqo.0W.i<7Ms MvVDחOiN%lFz~P"c7cfi\_?F(N>ЏmE3Oqg񨊯TV& `>J tV`F+*ͯGTjyWs)Ŀi0\!h3gee/SA$ w!#\^Sxj&! k@7|mP<655Ŵ`*j+tq.@Ӊ#tdV,w[laAnn9r_3Kw`X5lL5qY|<19kip}S5de/ؔUhKD~S*榦!^zI oq!~!p,k?gJNvpA;+|m >*UOsZ7X6xI=^Ő W{`> Y⛈2\G`;W$4ӉͿ7F ks}qٵrNٞ㄀8ĝ:T|Q1a`eeE, wMTܣb)1>on]9CTCoT'ͯpA8RK7MC9b/kNtKVVVzt R816 إD>ӳyQqM7꺃lc۶m x\Ѓ##[g#H8t䝵 1a̅K޿+SOqL ܋S9. $$T\7oތÇرcv|-![*㥨=Ӄ%kj719~0?[cӘFSGox aPqS| /Sr}8kxG{ jQ>c w'xÆv膫T|-R].r8x7vL7۽*2*aǣ2k]}Mৗ0齼qnL[Nՠm~g-"{ 5ִ1hxF_eU#YYE~eekgݬg|Pp: Lͯ._W7*E]r_欬f0d2=zMr!*T;heeȥxSxuFlv\89&*4T C]<w/1v||?}/ߋU?Η orrG~Lez8߸z\n:َ/0A&$l Rta·cPc @J:8z3a^kڰ!8S-ZmMbxLA搵Oo?ʤ kG2o&7&c4;B26(VdO߽*BO#D"Z~Kٜ; 3>owb)w *>rN52&(Ng ~XIXYYhu3;yOik&@-JO%Rŏ߹~߶O\+gee/sl c#B/9iG??"Bq R`Hr)x]oΝtaYp:$4m] |)H2y2ͷxzU2,s~<r˭|RPpF M<#8Z` $7U3qxQ,U{D\HOqZLuȱz _ΖO}TEQ=mJ$Zw*et_ik0O?Ot>gL%^ˏKx\Mr_k41npc>}"N*5lk*4;8nN8>vwQ5 <MպvqnZVxޤ>j~a,/ ࿨Y,+T!GYo/[ 8xWD{$T7u -C98+ $Mm.++en(#Y 0bƋ*[{yquSԩSlAxEsܥaA8Z88>Op}P`l0 `8[3nKǟrL>,r.|=Nv|^$@F]~F]>B?!rS Y#pزe j~3yr~-QzRpfCC?7$C4#laEӉW.cI{m_eS;?22΢?TxK# *2 4u&voToui7>y\ջө+u >)Ȧ~*ImB$ĕЀGs<Tμ0;_3"P7T5Tpiv3.M-qXYY.]e_Wn7f֨H\]CB>6;kM׿ހ$T~w8OE$꼨@3Y.va>\ ^l{طsxU4ϕydee%2sR ^9}=E9v7hǴ_uw#]b16KFXFI|:hٳ{.XO~ΨokYLݽ[d=n;/  9[jX3+nByuy>=t1͔`5 .?2~v,rt0) 7:J Ծ9`7g 0X<> \@)0a1C8X `lB}Ux _}FEͦ<ɸ%Bvyiz6` 4hS!YǯRQ4c zg@f&k'YYYheu`^c@>"u,;*4k,Cm/0ʕ5LΕQzL2ݯ~@e1?|= sIea* A_ۅz+Gqk zpC@k.|ej(!ϺO?4sH?mEmpK҃zL;N`!au]3N(uD/ak?.:"I,9?%.>|< ӂ%OZs>ZGEC͵ ZEBc8=Kdvӥ79ضi5:T׍ZFETfwk5뎏@%#+N?Ԝu$?d_ hQg*Τϩ(eeeSo;o؁%Hj3Զ>]zˢHi"pl _B(p9':֍8T,7Fk @^_}^wvcQ`&5)Neee kv oymCN{awߥ7Gy?fTc~"xxĵTaC@I0@&P18_ɵH( A$d&IKՍOx>;T|RCӀI: X9ygU`Ai^r7_];}nrj. r9BuݝpX-5c,{cF坊1.&3U3XYYY?_*#dc-yz [>ĕ[+<櫦pvx.tʂO~x/on5N&eee`^wQto"sW ,ro. I!vnyZ$7!Xn=?NG&W5Z:sեvKN 4bcqA'@;Im]OtHb$99SSWP8~zÒcfpGƖhs=>fӖSN:&$ 8Pq]Ms*~C:<* %n U~%5/Œ՚[ ܊6$Щ(U=>iZE" ClA2h?7\\PiG}ƚvTWӀ%2G Sb9O%ĉL%@p[%u|H;#xUQ࿩j9_ *QFrq*2$ЗOcfcv VTE\]!6k7MuZ8*^0*V7*./vv!>R@\Mj.~nRZljEt=H07PH3ފf%3mt}pÍ7^) Z|;8uꔸp"l#c+.;B;F\rMD/xǏ1Y o|#^Ww#ît%r\1շ 2a&aH㜤JI%trt8:tP[OTtwx1^^Ű`Qȥ#w.XB2Xd9aX&V駢IWg_TK݀QZ&1XYYYhua{Rk!~Cj]xȧ:џObb#Pj^^Fnt]}lkWVVZu ե1I]%1* ?+K Dg#7ߋ+RkU.JzqI%I%#T[B,#;:\ϱf! AD9F  CSry+@OL̝b}?6O<ρ!_S{|dwCM*Ca](6 d_HYTBE `BgX*+9@;JՆ~ 5tET>_V񢊗Uƚn1E|g׺̓YmI_46~"--of#[R/X=`ncNy|u]|P\: Xԇw\Op܅h,Ic<쳄Y]t\I]{hhlp۶mv]xπo.o];%i$X$.@'FgZ3a[ tdBGstj6#9x!.LPQƹBkM;T\b>f3S6D2SpgsZ]k4euqu4sUxV!XЊ6}L*Fyf0BPbTG1=_CTV7] Q罛7d>ak[YY;]ttM lzB.{ߊkuYY]R طsϼvJg!$RQ|/׽m$;|0E0mVزЍ:99)`N^Xl]7K>Gk.# $+!S9;KWbZss}~[e%W+/cbbj6c!* vSo *\t#š2H]oI$P|];D&庆^Sn~oS!KR"c𰮿GnF_r3B.dJ4|c qM7u薣Pۡ~4_IB֔^#q_T:" țU|tͰK+/Ik,(Ͽ4 51͗t\k&$a#06Lުu#+++ mUƖU>RЗמРn.xOjЗF_6#g1=_Sc7,YUd(cu9?> P+* B*P'i'D,xE>PNgA]wV81 ]\Rz#ckWzQȵچ5!Nrs{YYYYh1~ $ӸP?L\}M?t'Y Z>1YF(.0gl*S8=U⇥)0]/PHSImee53_+̦ȥh,밲@;Fn4c]?& /j ЎM8Zx[ERݻY@Q`@5/: \$wr r[i(v>&Џ|m8''&d2ct<~BZ5Mmpx=Bcee:wcbf5<u:>?'Ș͐[tI\u'_Y0IGşiǟVp_8aઃ 8|?GGD><,xq8p4Q`:C}i<鹚|xt<;^p[p t:2uځcbbB弸vmnDJS x2d98_$tοVEt~n2ߓ"$K)$L5ͥA0~k תuz8:zcokZP#>uj2x{{aeeeE*&҈:AsYS^: MݒYᎩP#åc Ñoq}`Ɩ19V4yǬy(kQsu{5\bk[Y(6Ev\WWtOb\Ը$K#߄Պir *D5Y3*]7].rq &f5jeuvu"ȧSnwQ?w ~(dԿ|8;5#PZ  $x˦w}7zkxѣ{]zz|3 (Eu΃+wpŵQH/:xjk c]>6ۍs]vq=G mN %;g17}Dcq!骬ǴZq%q׾5PGN=5zڂ=| `!7 {<7z| 4X~b{0cd^cZC^Npvtl]r\M6GUwMV9@&ǖG2-{{%eJk}HfKQDR+u*G8g։ hܞEgeeeeU b5b jo0 +L\~8_ (nj'i0.EM93}Η QW]j_eZroNc ~'B_ؚVV˧ڵ|a\˪X qVVV?{%Gÿ&[V@1iɼ e{絽yafTqO~OQ %RΉYYYYQR>U#9Zevs{EĈXS_$-OUVLHZZZϗ-ϛ1;&u6ƻJijמ}oϟNCevU 12f?v?P&DVEb߮6Z\4' K~|uۘoY  vXXGc"?S._=[QQQQ U5n[m1]KD!Z3lԒhM3VwxbW0p&آTFʛ^Ns".v2?4+=4sTTTݵR4 cc.hZm@`{YFXYyp9V B׾W} rԕe> N&.ݺ35y kfa ŗy6> 2v7MЎw?=6+lcvdYc>sX9kN9/\^?FTBY4 [XU\; +=׫'iQ` xUykg|TӨ%ex%N_b0 l3[94 .l7tXP=lg'p"0̲;G(7C2^:R_ΰ(9W=Hޏ㠳v}W>KuWF4aH4XOba`cExgaGNsfvްDtz2( :,פϛK`LTml~kvogGӨLr1Mc, @ ]oJZk٦BԹsxg2"^ʔWU>Ϭon}6r@_Vry\DܵZ-./l"d^={cUoy'8z?_Žg_ د y1;ٮ7U8<+`<ʜ͡ ~#Qf*ǖP69ev9E[`XD+؂r4b;e6=onh*Лh\Z[~{zW C:4 <"D@VQ`N,n@H@5>{wk[o?ϦTTT6lBvī{VͿw(x^7n~OjҜ'~΍fQdN'x%N{Uz ǙM~&%Ibs#H \ayn+++&¢|vj58^]a=^)F}ҒݾbwTeF:i{IҨ#Ϸs~1eYib(w!˼v,q& kNJOH$qѶ '}@$C=N2#&;uܳj!ZB {s>xpv#NwHmk:V+fTTT<LM8Hv8,ÉpQQQjB/g$Mq" ҄`wal&rCe Cn,3aMozMܼ|i9.~>}\~Є˗92n[=nEv&A8I0n T_!`?PFLk(>7~{z,#r0AO.GVfdr_["w8VXB/gK(cJo8n!ҀkBL j'[>z5N5H[24xtf-\l!]7&@Ԇ#/[1ժ# ^M*QÀ.N_\D "9?}y@^,{s .Ye}~ۑe}n/c+ 0,(Erz4,cfFwZtu|Юw흰( gïlB-q<ސp%pgs@*,^md~?+#C1 A= V]/_#=nQ&@*E0yN[s#PKSk 8qf#ՇxȽrx\tQUL***(XkS[nsm{>) |qONҞGҥK튈hO}U][ㆌ؜~?hMʍ.Gkn<ϯ.b(_WR;D fG U2G/IC`Lv\fno@nCOW@]Vz##SU@A | _p0C~{Π"?n@8|Wk1ʼZ] Rŕ!g;oO(T1r&"Z `݂;ZJA?xp Olijr""dEU~mo~8{ʍ T濊8Qm4#~.Q6}? SМ;R_5sj5offƎVE&|1'toso8 |7{=e_aX]ilO(_%2MFl AU-o;2?1gFp8nu$$ ; KvM׬OonKpc>YSR(e9"bS.0{vVXxj79'? lEEvf߾]-( L[eyt}zؑ"0*ڃހno+F.{O`7[0Bîq¦7DL?Y] ;U&F=̈́8Rt4a- Au)>9r.,.SOb&)$&tWQ +X'X n=j'o穨x865@7RRQQQ12#n+4F( ;̀?1+; ex$ Nǚ '`kZ&,iN+ GeaaM syȀ/=|¡ġ5NM=ݲZ(ώ<7LXCo1fu!N>^(dSL A?EEEE-J8<w Ak z+l %qH9PvVnt#{ޥfB$r+(%d^YgKӘVN c #7:&sr׮e>y"N,b م5j&>MEŝ~`Aaf~ÿr2難2mCq`WL!pW B>ńmMmi 'L49FY>`8G #á}9'^߄?U B]>IEEE-J(TA|{?˨ET| 9`:ZAC'3@0TA=x@-5 `ayha!!( c`4ZLNͦ8@78`mkDB[@8<:[&\טr~d;Q9GO.{1>&෾F\"XbwHEEE3s(G\_Cx`٠Oh|Q[d)9 F?OEQl ﷣,q0|8M+FqQ)ّ9?o5>i>Aڹn}8y,x^$o=wbnUL wW-ڭcbB_;ڹn_y[N?b82-ukB1 5GQǹJ[Oz"bt{WPKkr$]҃ FgaiHqB J, LdQc!ME1unHA"`'X\_k@f=ڟF+ngZl;f&|>D׋ac0****֢VFF!7B:}+<!!<'IoW}'2[`eeUAd;Eb\?OX :-=|8!y?; 8AEEEE%V`# U3F"]S^LSuZV. C qJ-Ek2q֏ B,1!pYDz%(%뾧ݬ| NܒS93tCbcwO~?2**n3v^M ؿ4NذX6}SQQQzp N l0| pwYby(E< 06޻]w XOqH>54`/f:F57H| W|=#l YǡSiPe1Μ9Sz1pώ<ϭgnNz\Pq;枳5sb3{L['-yzxcb,Jkcr; lr)jIE>bJG7Bmmi!x2O7dae`EX,<3w GM9+z4X+*px)W4]P7d~kZp\;>Gyk*S$ (@>}D B \@1 7`ʯW;Xp :gyfcv c§|\='/qfv~67kI7[_|ĩ8yfO|.7n$5DX X )UTTT0j ";2-q%~ 3->ˈju^7FȆ"h42'?ob][2 Cͦ %qY8 ߍ]@`O2٬1ݮ&sZ>dHJ3Ul3l{Ş&sq?j -o0](- C  j3]tL2X8~ K[5/&π?KEEE%VTD;!%M0VW>vW N eE0'a7Z0tsƋܥ!g{v]RkԚ5P֠ aH`'݀a`Mvm=WpJ"έga)(Y F1@G9us+  Vv=z%GE8 a+O7OGr"Խ TTTTHnvdDO~_y4Q"b⽿~Fp;ۺ|K_ iCkw)<9LT$ xE>PeQƛ^qnؔ=y'^dv~[ .I8AU Tf~?.Bk "E.`h#淪ܘSGպ1>U~ |ǀh' 3׿M?| JEEGHEņb"#(JrEZ#AP%y-gPC84m$,6e,.Mw8]+2za䡶CـRlaJw$hi ؂8OZIҮy3rIPFC0#gmu;#"+QfCY^ZTTLw 'ܾ]|sd?-F7Xj׼QG.slCT xSaY5owÇ333cn{Fx0dǐrZyՌxln8a-sp0&j~Yg ίdiZZb#{wӪǨbcf FdYN9^k7?2P( !|>~q9_Q\S}_~7.oĥA****"qT䗀]^-h7˽qip g&ksNB4!W!-ƂU/)bB)z>Zby>ipB0ϭrPkƟK`mEG3Q'lK-0D +'Kp`o-)teJ.,##B+ZȽ5;_{+.Xff0?k z^{YO#ATphͿ~3 nƅd<' \׈/`X)=PK΁8f:V/:+V8>ߧ59gapמ)vO7i5j)Y!GFe 1?A asۣ,V}x x54F`b`ʌiUyayoB{-NhiYAIoOPQQQW#3)JqogQ^/_8^p08'/D  &N vP{YV~JPV-jnKRdRps򣟍tnթQF&#F JD f³'/8CyoKpkSQ{;_n?z`1`XTTT\{dar2L>ȯ|Y+F1c >>ףA*QU;9s=ٳgxu{u#>'\8[:hDk(6+w=pBL4S&[Ɇe f9S\2lKVqIvM5m<<zw\F啞e{SS-N_b1(Bb|÷A(}KJ,2)rGu9U%LBҙ:a2s i+D&=D****\mBJYs\'X10ңѪoGPYeyے2/AfbsLS&)pd見4pNrT=m[=u|Kr{LʲߨGHj rQQlc`66PWī&/׸o\m_Y=ùK+[o$3??;WKz$94jyyGrY{;RG@u Ot Șl&b4Ze8@!W OBEBrh&8 K]֋ۣYOyᄻOr"..F>  S]SsSM+}QБPScj( p=Xx(3>%P KZhEUms0C8'k3fBo&&9[PNYL4r!1a qdA wSWyN[dTo;ALǸanVJv?U_EE Q{!F A:oxeqvv . SMW N]¥e:ԝV2S89+R'&ĵk7A|lWAq_ L&RP(6qZS5TTT`Wvs 5[IvO 9YnsOgKsF!o5e\=$Bn?g~AQŎ"" G&k68t!iR[ۜ۞ ч89p6m91(tgDQD0ل/17Ŝd>g_]z |4ag߅ 8}͑$ a^B2 rbcq,"*ΎO$Ufyk?sh c!9Hq}O-q@ .;5Ъƒ& JJjn^H۷8qgM^ (' ,[ ot}$^O~5#^vn;ԡDι|S(SP%C\r^h3xzE!n&ԧD,EH{j'$aJ@+***"D+PP0/MB:]3P"\Vj?{F`5Xܰ8'bmWoxs?C=4 k F8(2/ m609d iPCҁg" G]O6bh˼G^SV<]kPPU5>:,pa 06raqп|KJE ً@UmLɲ67B7 KRd;.Nx{jW2+z$Jkt.GGU.F $bY' land1I]#N  }^3=ݪ1`K߱Q,xgX\\m%!6;pCb!WZxe6 B uK411UQnIJ9]f +{(7s CRc f,zqo.uZ3s//د}~2y4QmKqjyy'|P^5Xr>AD?'c1ZVH[4!3Q =U^<,Y"jf4L]7%3vFcfyҖ!^mz~omB (D͍\41!&GiɺM>?y_\‰v8֬QW_OdOUk";~< x-RXO!FIh&j@͙3"ETG>DJJſczÜZL,[ F88‰`(-TfEyF'^Y5Fء9 vP+`܈0tԒ@ֻNh# kBȎKkvgOYKn{Vq8RQ*żv3YjWxaF$Fnpq`W3ykz l=lٰc\88/oeЃĵy65~"bNǹka#cxs]Tg"M'yFm%BZ3 yBw3LWnU98| B4b#dn8V豴bE&v 0W;4J wP3N_2Vtuk v̩v7g/rܼA#2D~ N'+.' N1Ӆ;Tܝ=MBEWALEEE%V/Y 2H|Ჳ7Ƃc7Hɼ-Vlr!tBh_@U!m0ʙ_"ect&dj\2B-TԝXK|3o4 K:&j2Yy*3WNYS'|@LzN_>QQ2Qh*D(WPhݮxIc ^=$.]8^$vp >)-[I:EԘ=i{-crX1ڈK8zh9k`EcB JF\®e vB8E = KB͙lDΙ`:I5wQt;(!߄_?#׀0ԣنsZx,,iQblD ӓua| GQ9j\L/'MI?ߩ^ a:A,Hv TTTT`m8VZ @L4,GTnGĿ,WF# @X4Fa @Վ5t;a4V @I6YY\1$A+2A<7i" e9_[<@X@ gO9q7'@ӏV0 hCruv  NE6$ib7c3dL|E쟱ߍm|Q,)t.'Y tV<W}ÌΝѾ7#t=8l xDEEE%V~>x*3GktX& Z|fM_G x:T>kf5e,, h7c6t@8wNq"EokؘWR:0w-`$͘L߽ȊSTTTT`BxrḲ j!SO;@w=\WᩮAv(Bl0e8R[P\ݚ6ꈌM(`$zԓ(5zPU( 1У&L6rZ8rU+sxe=zuG#.IMM$9ٚ7-8 '(Qdv"Tt7^vʹ8zmb =;=>DaTUe>ո5o$_q͓.?l-ˇ,#tp~Y;Za$I/&Ё 6[F\z-6WѼ5mVIΝgrIw]Eybut쟈GX1 FG\2Hng.o"ZJnh-zƳGs#:7`Z{5{ E6_e-i)(e- A؅ #{|\>;ҙOA0G:}}F5Xqg0FIhu s!vJ Z N<(mqÑ$ wvf ( % ׯ:b>td" zU.xxudXkçUOx{8;¹%l$DU0 FV#I|RQ1b1gDfo&6B6+T9Z<ՙ=~ZؕAqanŎf=}m?IFJ5"\qceEJFؿݛII͔=<͙%+I9 ^^29˵bG?eS [QTbJJ 68(?g%rABkE8|׌":f㩋,ͱ٘hp9..r]7>Se3OWruGR?n$=t_đ.k?$ŸZò-gN:{eqi^dD 1L4xkܱ[&}$"_|PQ/mpR85 d>^$+6c"r@ZHI ?!,Gn <{[.]l*zOwMdUƟ3DE`X0dsP`~0ϘnIȄ@@enMg'.,'sP vd~?]S_IQ b-V{иV^`c{aohn=67=BD8q"h崙'SGg9&- 7pg4\Tiw<{g-_\w(eGN8d @c0 *":c"lfΙRw%lQT-nSi. eTLfT)I$nLRl{([w^kvwK/:&.?FJohg&jLċaؼpqvNnPV5m:H)'πx<΂l͜ȋq;a5EXqo>d+,[S;Ȅ`4UNrwmLgp6RZcāN9?[]eHQ>/k!"<_+u1w%i"Wť].lJK+ziaB!>(wAT@q{,û9i3+tzCݮh.WUM@  ha`͙^uk(*n}D7ˇg LLg|BI&ܩ%)HWY4 z*( 'n"R7˫sh㛃aFZq@\GDAqhqW ;f"Y7(CPP@T8ZA#Lb&NfT Aɽn˽g8ܣ7D .fbzeHG&m#X @"kbq5'EG]gsԡϬ[6厝v8 ˵BvlxMD ;ʟ U&\?0ȿ [ :F:`TTTT`)`ě#4WS,SS Jgl.kl(/,flK @6v xx~YU!0DpFB(R#02K>+!zۛXsM}P ++bPӳ-vm2 ܶ\UNΰՌ݌a`x6?s[;Gjnwſ8鋋.t_qiz9Ce-D<]yP;|֮.6 Q\1e BȳU])8dй|dys7WM&M"/pǭP%j%46wFV~G!ǿp wPQQQ wl%IDݰ7ɪFG yH˙9&FTsPR3r8 E v [.]hM4(gcJpȽ!,UK؊ɦ xQhl?QYXp%.x3nƏN|ۚ#'.@0Xlnԯy!^ zÑedV4ĿQ\ 3Edg_XYTu,GD35/G`Q!$ۋڜd+Wpe,mRrhXLxxz .CU%EMK҄ɽ3LOORPjQVn ^[f*qJlwrIg2u;Osறť#qo>#ޥ4h ff"E3K+{QB9db vlnS5Qq?'6v<[0 8gG/ RQQQ wvgl9ݢZ"bbN\O" Uyqe0-PmWo4v+e\PdnE*<', p3V$PC_XsN4h՘ /6l³}6M|<ig( r}Q&_HFێ3:17 t߮*K{9"'O^Vxo3e" 6R**^RqHزnud"B֔]VU>==^Zfnr-򡸯#m`&kN<.-{0IvL3 έ qIe=z?@{<~J@ybB`c+@=L5nn$޸UWC~==<Ew,+ޔZ+Ủ'!FR**^Rx D]k/A (mlN\>:c0moDB-G[!SA񛼞t[;{o޿ƆZ:'V3 ֭oD@_Pf5k µwZnIdc!!~1:ɹ̾iGG?<.ιG x a8g8q9?NEEE%VTE kǀ#fJW9dZE=ġPbn<ީj$jnppR+@z-yf7[Э-_WP&6 VU89/t^ٴBe(`x{,GU٨ bdBtUcj:Q2٨&] IPn{Qnx /.pB]dB϶őH%~x쟙w~5 e9>RqkB7geq sb.f͡_3'Mu+yŽ;Ӥlɯx)f*XpFV`MMWër'.,r{&F6'\T05û{_l`1w=&>6ীzv'j4kNZU(\_@co\|9Usn UZ̈́ GZ3mBg?$XqG ob/Bux,UiT=Xc)c(gs8J3P*\6&n\%XdN-?l*qH ^PC% v vd֦l, aC`'bوTQ$aҪeu:QO1K].-0!z] ̹hƏ7#!i*^ \DLx}{y~틝,C =<Ξs;ďk4--R**^zhYRaq=@PN_3!S'p;eqN^oHh(ܻ='~bN9UDSGeTvHm%~.I"Z:Z {|q/| Z{$)׍"9~C`2>(6`DEE*?<M@h7Ө1g\X6L dE@u"nUF8 X_~◃hrJ[/ X & hL4JFk84rzCǟ"c. 0yFh[-iD='6UBeZڢ 料] ˱E]ЬG_ףIGx*FW$ɅN\V&NNᅧ 䟻ıMy c5ܽo-+*^йb-a`zrB#yE;18ވv^^~k}\9c_/֊Q! mĢQX y,_z괹qE@jMb{G?nD"At驦ז;}%_P^"]q`"Jۑ " |ujd Xϯ S5b gl:K2"<O_\~I5@Sꭚ dKuΆFH@X7^b0f 3])0> (l;YOrgpg{t{^uVڹT 9M"QB]Z굳:lX*D3G^q/ LX&4k Nd50o 82hJ9*Zhstz ubS>n$``[Y(uc 6}V Ulg]w(N`kQ,K!!SDTA)>(S4a+vEĎsG(s(|ex욙mbk;fk-4vIdaf*r? faƓ3 ޝ簶ţ`#õ4abATi&H=_1wI%@0qL:0mDt B#|X"OEEE%VܑhFi 6Z (/Yy W&9J`?{Awٝб297k, Gj[>:1'cC#t%tz5"*6.wJ PLj&0-CrSqTƲl1r|Afor9 oԣZiOyn5+֒7qstC[7ʋ,CD 0@\BGB/sfJ9Ԇ VN{tj+q{ZVT+*nWD%A`jK pO>i-NZFܿz+ۡǹ3E9p>fm?9r-x%LC=ξn\dr"Wm0prI֊ق ,^y/ΐ$iv5ZLV\EoO?G>A88MEEE%V"Jlj l i EdF ) Bb9@XMZA&#uDd?ex8#)N00@6x0I$ruF~mY@'BeYAF@l9}q(D#Fܛh։k'^\N]mv1&/;>|`,FR';m)/@Q0C\ €_:K;RQQQ w?Idm(U1o؆E [OYSi ㉀|kqO)vy=_fe~W{K J@;A>8H2=~捬WЪ%L6S}yUuGYΉsp}h4َ8 .Qb8WǘՇxAr29׋dr/*(B7w,G0b;DLfrr׿կ~5y#−'¯<_/r,/^sA"F+fU{N20D@Un Y)G>4 ~9ieYf`{[m"g4*. |0,@8 O*~m0.Zĭ͕ըK)o=@;(Qf#ݪe-<:c@D8U`b$]ms (q2xJo;k1zk=<>w K8(߿BEEŝN%V ,p?^iN6jJ3yPga`(ʆϾ^ evp\zt-'V5$D̼'yBc;1*)"kog֡%qD#Ð( @Ao`/"&.wŅ+亚U/69'O# 8qp6OwI=Ƚ;aX ]hG(7)Qtt{sO$-GG1s-aϸ*(opI԰1ۍ8b=qVeo$Chy?ݬj Cur~)>< hܽ(sW0'pses@ < Qqn[***ĎPkշ%y ;V ykŻr7 D`0SRȱl5\D@bĴcl`Y9WV22O7lkŸXX#Z@9x}Ano^JIdql4qMXC(2aGv^ܒ٘z\\j.!ƣiH->E#')T<|W!0};D+\ftGQzy^B3Hn˼PD@X+ޛ7e~{//m8L3u\@ ,}U2AZ UȲ~nppoZX%Vɔ&ZB7)G1fe.xp @[;Ƀ Ŀٹe?gyӫOVQ2Dse#\Vȁ*92VC~͆vLԮ ;>vt}9 ;P a#y9''VdmA3RL7d{0̕f❰82gXhEEc.vG"`Dië"Fx Zv I' F. ̝!0L BE(v(2g _Gfs1va..t\h_P$ԬG39[]śeAo/|=G#C"2,c ^hqDk4nG)EQdylwLOO155e "FqʠxO|~ljbDrODLR i+*V `'D4 v(ؑn.3}S&oOsK;y z姊7B%;iMmwM‰2Wra_hw~6Co*B'l+MC.-Y\D qoJ|%βk0f8Qp=F:^h@[臁9N#+I'x W7E_ +ZF-7Y#׽ւr-5~"{ |W"WevĿMqϯxfnov[bsxA9~9>.<;YoTV3.XqˊQќh]Di  -aEljvkk8Yij4TFȏ 5SZ@o4 9z]NAf8@ B;00A0*;PK ;Vtl FBG?lD?>E:*Μ [֓ď[rkd~KB?+-2/k)|A򕯴nGs?~ 8uY<ܣWVqis]Sea++**ILv}MnJfklD5%\"z6 CGNP7_9hpĥ07ruKʈ,ԫ9.kQC?b nK`=f޸pp刋P p0Pv5#x&%j߃"xM Pk4 3g$qHRgȥ=uPvIx&M|*ܓ?}B WC%pT *,sk6ƉUL;_+"~C~c=Ɖ'pn\ yǟbq/+5js`Ov=YM ̽;^ HsUkjcQcBxp'OGM#o SMxZ}h7q-觞#eA~U^r.}sQh,C W˅l5p6# 2CS<,(![ qsC #4׫3 J̮[Kǁق0 hM@>RH1ʮܪsVa6@!j9n[LM Z_H'"(ё`{,Bv []c Ґ@ hs6{M|z@yU)P+Aʬ)LO:˝M9ߠH\,F-K^@;W뷾.~zDyfuPAD)0 ~4 Dx9{o+&gs\:~(eH "2eqqsm8-܀a82jqο0Gm0(Fd#ж6B\q )G%J9f"[9x.gs.N tcx)YXuGY)rs߇*v8xKWD)'.(?0vspxwAx3,bIvCqH`_Rl X SŎ̫ r Mh1 LքFbcM(7 [~vUR+MV1U=o ilkw[8Gѱ`.pL+ ח$xay!;B"bzZ8!p@raIAsֿXޗ ah8v'zsFam3G4p7=pRP5/_c#dWZkr7?瘘-ſҕ|Esu::w]  <䗹p  "{-Il!qD܁lئݬTTFBȿYdgX3T_8 {$'M0"GNQmͿkv7mop4̘=uhĮAg'oV'&'EClϥ'wC C0 ܢLQng6 A@v(DsoN\wJњשMt_\cadiaQ,l<՘(WODAo\3\O,Oľ 1A- Ůo pg(aQo,#kI(5~82ߎ XuRr(H9&L`A#(?"ʉ x|b{k۹I`Hi\FNf!";#9Y0K$`- >\%ΑSK|ƍ5F//?/^jkFUÇ?߿mΟ?oο~s yƨסę'ȩ>yU+EE& ژ] ژ.hg_~ '-1/V(QU9ij:'3Ro`M)9&Lg#{N1 P/Jƒ rq$wve3u25$#TaӬL944ǵ ë)gl0b1@aG( yD dxfȋBEE%VT"V<$5ռ8NIЄr5ZKqkGPUFn(D `\L 40qHd[N Nj1Boϵ./ \9zSZJ7vX(#1ݷNd!u1_}|<$9څJ=!7kK@(DB&AL6h#PQnSG$/-  KQ;foKQ9J>ǃ"]6!JMj 78qH_P-f,YAgn#q]΢A7Vd_tcu.'@PH C#Zj ~ƃ1e'c{6:UAsnȠ0SoOo>UӒP?GHju趑?AGOt*.E/" SN*tZ%P:PSvuY=~Q`RQHG}EZ-:7cyk["ZZs͒/Y^a_K|۳r( )4pAn&F4-t!<(`8EK( {, 'T|7ihh8r"v׀/fTvFE9(tB.9vdT`to`tZͤQȿamt9!Irx$(,Ϸ>Y -V?R楍0Dq41 }R,UHGl8IdOPVaz$&K3pJX(11sG=RKx vnOnD;p8Ě~Gy~BĠ=ן?x j?-f糺jGQ{"e:bxwat&G} DHՎG+HEfgiW'ޏz,bڙWz_p~T#Jã쉋F.CQ_X]"ⅷ 6ooc4?wW<=u#U{"3_hZn '$a)Jxf-E.J`{{mTK )>8'DCF7t8Ҕ|2H@vnO=JCC#'zDql#e}&Q^YTF_9Ber0dQXIrr `uclr?iMp @١DBIK8L* Uc;AA0w[e%Hժ]4)8i]Չe5 \ﴣ׊WQ}ӎ?06^񋀿9~+MT8u=NxlJF}!4#^-}~կ;;2k |vY)v[߽{RE1kwؼIAՀsW;(vBpPjD:Nj`\6W.,p₭m ; -޸;Ns_ӧH~ Fu㰈 U ۨ[d " KE 7*)1Q{4PjZzGQI@,7MRHsktE&G]q@0[(.XDpp @b:W##ƅ-:)-9bIP ǨسY,Q"@@`SGmy'7OxKKO/^~{gk%IbexBR `;"48>x, ɿ_9EaO>&N d3Z8llc=nHٿ(BB N$a8/v (] sm8O-DQ* 'aus߯Wi8kgCQο".vy6>6`yׅ2XjĉVo 3 ((8w?`#s*6u[s<* j,-e/殱>"jE{msmONL֣VV21LҊAaN@CCñ FJ*>I$6aQNXQѸZF~Р$ Lٮ8@VVlsD?"DIcQ" -rm4&𲬜xܩBe1&]'Ǐ"WZKMYamEZpN*Rq#o>L Ʊloucg]?ȿ=P|_l{vJpı/0 FZOôga7{5̯u~?!N}c6f+"IY,˓9/DPbX6u}_ i8p(#L>_@_~E(_㾔VM-ӜwlnzN̯øy^k Jm[qhxfCSKI@nh]‹|VJ9IDίn4ToPf%|c fϰqCDӒ@&TFAaRފ>N3KxG$3w1%ւsY%(Xn8^bB`N;:ۦ H8{eD`6#Jm/]݊^|c^^jƑ@Q\ ﺈsUUN.V{Aj_D|dm;~;w΄YGDLd~C2v䟝͛7KRD*[pnݺI:!h@<ŅO"'iy񢴥qLr<6Bz:od0MZ&qsԓխ6bmɿ gY~+]@kO} Pɹz5J(wΖzJ9OLjvFXyvTYF\&|%V K]zaSrm^`> lZ$햝G}h}EZE5"ۥ>`c .g TZ|l(@Yi N{3o뢏Ӎa x".;H:eHCIjdrq}=G ,߹QDHbk)fԿf<ͪVgEՎSqI[v?ˋ.-ϱeP?aY?iDP(ɪEbQ䇥޾(r??o#{"{WkoyD~tbi(d%∕gVLF&R;>;2SnYn o{6A`q\UthcXz].9*/2D8  n oغij*-aD읆x`c[l^'TiyGD {BF*8rZN8Uk{BͭQ;kj%8_'vR(&G~H2T&I|8KK:ǁ9mZvlD$liRA"ed0} #6F%Q/bzgC=R>̂ɿF>8QBZ֗\x//39tO}MD䴜ȓ9㵵5K>{;j*D蹜xd'dPBv)Rs4(5i^&eέ;1Uq!pZd'NzD,]wAw?̋Ϯ0IpNL>NI~榉zՍ!Mlbc~b|۞$1Kk 91Z{kCKR4a|̓BՎ(=1pIyfE1U;i !czK=n*>.?r-Mj/-(,>z-|:ZC@8L`N8RZC9jD̊?~&*"b+«ZT$]9H1M>?t1DYcE)Kшĕu('NY=I,%˨D"+VEi~ 8c4s18@OX\=hs-BIzPnWP_XOw~&AKJvJG$窝?~0b?}ਙb_|z<:nqw}M!]| &Q;6^ 2nw0"{=«|9P[7`2=l4(Ƙt}l;DZTT/APjVO"P@,j4% E#G: ݎݚ(B};#ͽ9-נSR mIKx{(X30K*Jm QP, D8ۿZZbWK/Y9w*EQ1ܹý{LZ}ʹxĒOiR#ݖbpz 8e0LZjN퇼0\{&CPқ[Ô׮k8NU(C A9D߾@n ֘W0/-38ة,$(s+Ո}\ :}\`X6%yq$q=ˉ˿LU%!Tpq TвX"cnvy(@? laoYD6eYeg볟 0H$L}dU(Qi^vNߤSJi}V+9,g4q&[Q@\Y`sĵ[@kx jxg7rmI?K:|ji_߼?|7G#%,vHuzh=Ύ_Q,t!L$w"e3П}Cx׫ka98—3~{.-NX:ыp~x}T; l\Tzv,kW6悆F6 M{I%K]ڱUx' [Ѝ!KKM:m+8?BVlcJ;bqe"X\h0U=" "A ,>̵j5#a) W-31yR+7C1DC(©*&@%u[ɡUHrb ,哟˪]"]'@nsʕ3+(2|xlVcҏV✛B"+uF}(UNE/Bcq^'ZKN5^Dk1f~OKKH\~W6( @._l>/D->Oڮ;GX7߿,&.>B<+p(9B+"Da<98'uC>߸hKs8"6Gpnk+K]+Uf*e›2|]P>044o.2B=kXwK@T ]2qbnSM͟_`"!o`&(S#n%{f[ݣ m{?<}۱2Ok&ߗE$8fLBG+ YNI544 ]Р6iLJ#/QӍ 0J.58T%p%ZW眵` s)FNb2\!%8KSmJ.ijMȽn>D۩~"8!N<!y r;/Rڴ[ɑ:J/YzZѓ%MnqI@8YJt|O=ԙK=xS',31w NZڵk fV˭mqcNF{۱;پQ?1E+,-vswwM qRKCG\Z k[#+p"kN":I-"6n2JIFv'GlC/ {E`Z;$}Y{PpОEǖBL1(7 n-ϗs|?wy$Oywl?8ß Q$O&hZtUU_r2Ef$/+©B C6"$/N`w{9pŒqMx[br|VQ9*YTQCTr7Ǩq)Euc4E.'Jf$>U$7!Xe@'@d%W,ayTw^3WJXxji:ETl΋/_kkg wO}괵b{(RH}Pz3ZAPڮJR4qT)Њ%\#{0a}VT.9m B,wC2('+i +ܞF߸5]2"\z̵&eQrhЙY:ZR \zƀDy ȶ獪?$(3}(r jEy&Tw.,@PBGNK"ZQ5QQ7(N#dS1DU]`q.aiFJh2ɗ?&|${ "pz|VDHl_pSW* KN*OEdp([J]GDt^B^?ΎPEQ, B%(Qoޓs Ò^+0NLBHBm(U ^88X]]_S8tv2ksQ;#.'}"y,;~N"D4P &>KKܻZ4+,m2 NI-%.:rg%|c_hPme69ǙH`4.)gT#+=FaA:D^8mMoy.tL$ 5$XA/T9"PfaAY˿#ADs4kMG%D}o}εN@sјk<8=Z^Is|[R{,yWV/{p˗-iJblZUO2nս_x_="{4%Jã ϧGuGH|~8$y?ϔAqnY^P5q|Ccj&F5jvJske#O58xW|];]"u+6[/HrmmR u~R رVӉߠ ei;]-eP~?Ë/\2v (EiGYSK@^]wp⒍>yI)!(\}~M4 @ L"G6H TAР߼$dv{'wWm[9ydbt/Ιe2qQFĭz EHe}CYD#Br`q{CqaVlE.LEJ]aJ%(ȤE`93l$VPjA"3GU-[۶Qf?y(v^cj)[Yxc&-ۋm-C< f`3MCC#`~ , N`"vB,'Se&E{kJ:p@(aleZCmDKG NK-;&g(A[>/NhÈ)tqfBCi6&oOC[sX"P( 2PHM5^Ɩ%ۈsS;(;^GSFC$f5r%C'DbTI{He{2jj3Ie6fzyʲ<բ{Oq4MC_׭[,8 >Od`ɿ+D 'AVJy'H#vToQ\#&pNS|u9! ޹1Uq441s)rB8"]_d+ɱ`DH7SEZwU܎mxlb9ݿw FO#ټ B,1'%"ˀgF64|w! ȀI" ē ˫2?FVm{9%q"d) 2XnٝrbkuBP1>̯u"%piZw/&X~>灟|5!CpLaU{xɨ^0Rl7_(lfB/RZ w1XK_qFVVЙN,'hQ*b-7SK*GDqR+6LNF:-Ʉݓm Suy>o Sd'xo$eYY EKqCSdbP@R{0ؓCK.蔴h=DQd 8U=U)"lll*WK7x.EX}t\pk9*6:}4b8!K^ X!ihhZj^@BD(Vd :9!"cB@>LAY;"[ F..xRBU5f} ~\U% ;vF_?ƙ y 7? VqY1v]9K84@O?k=1/\`/n5 YfJN;1$B&BdԋVDBh\%Ax{g[rv c\ibL v-Ȳr::XjW=ޢHvAy^zxoU|_QP%AÞܩ';ʼ!<(IH%!?Qڛoi-$;L9gʿ``O'Ñ-C (_4xX]M7췵7C0>:Od ¤5閥A@K%hQ;s`c@wKDQsϬZoywP> yȿ~&pq44%࿱G.%,%֑?C4 i ȔQiayt1nLh9rNQ?88+z<}\/d\*eG={Pq r{f'wEK:^M&Sl|"ݎ춷Y-.Պ,vьZ^!/:Ci_f[6eqQ0<ʳiZI9\j^Khhhh`ÙM*{{)1bJLy BۏCsaPJZ-6&RތvbkʍpRyU{Me`2Dbi̧.xK -Zߎ`lm&Y;u0-^}Ɓy8;qib5ILj9;!uKvZ9;W2o'Hȳ|ObZVshPD2ammlI:y=܋W ӂ%PZ2 F~Yc1S"' cM6A{s}w -* ύb\&4:aGE:GL F> *J7p?Vep%5"z.㫀F~ Cߤ8E&&2 bq9?򼨤 &uIdӊEU +NysTj(ǣMx]<=/-PV͵F@h0fsmң@P򩅎dDk³Q RZǵө)7Y{ȦK $ cRm]w,T;FC8OtN^GU֭[61, @?KR]zƚl.r%϶7yC] mb;PhhnZ 1;78B>|l)(rD߄`H(UYlE5BAw&}ի7ma!0"]qk vnvPCq9|y?gp&S/[?E#N,U*AʪZKT磈b5A!˦E)E85G:sI\\DU @ J:Jl10!8)Z"!L J;&g* !@Y2zLFZxcM|c,MRsڇ9u.CT=]ıvtchnh~㡡/"T(X/+@)`>QvbTn>#ևi=I+AU k)E~ƭGb{ǂCddWΑtZ&gKK^eP&Ȗ9444F=E eԻʼ]r2ve `6viq¸Ld$6ֹ3SZ8֤M=Y*4Xisr=eQ3}Kx8&ᰩ@C|n3{"`oUsuvdz=]Ϥ8gY DYH`*k#'*YPN2*st{-DGCrvZgnjCs6TeeȞ:wܙH)}joѧcڞVtabܸ_}:hhj6J4]JE^&Հ3yhǀ{"BOf|Sό9D-n~o]80(ct{朥gAuHKC#8? ((tzWpX>5ICncXjUƎɱO(rL,pB#ٵ{ZnMF_8ס׍PKlBdiΨ?վ r aGQFҋRsbrvT̖٨ptHATwm6e"(8aQapVN,(qO~uJ>H;ӆp.b{)O ׎KO;P&nݹ@o8>RneZqWmx+PРKZZ_F"BG({H@CFnoq׸ݪ(āp L%\yz(GC<l=pRw "yNYuDpduـ%m1&E@wjWLBPN ;vj7OθzݱSn@0K5JgsnEݡĎءj m|4g㭱3$d]!S;kEvı=vgk;'rz_Ve9ǒtopZ)"R˿cr2d ca#5a~_wݱo d ihx7G 0B1ZbQf%U⧁>EDˢd: *q[e6:)/jwM^lݴsՠڱ#o{]9g/LJ.8%י Wl4̋ğ QvlrP=.3D8[w찣8),Dl_<{e&z,[&,ld1ZhUɔ]^[q[-OS=Xka >a)w}L+^'4MP>JER9D84.S(:#VTʿxl,KN+!F"R}."EDySI^W KmO+f?TՃN&O<8VA.x=leZ RrI~;7SP=ܪ1wo~¿;uGW?&n|b 9) ai~iFU( ۧx͉=A/Dc>m~faPCwBy|+}hX{ qO5Jhnw g'&ׯm8{h.FJ<4T"%ͺwx{^/ߥoqlE+qnȳy..YrN \n[P@3GCC# )F{;,Umğ|jB޻q!@^Au"Pc2_y{y$G`EK J#l_K=\Yy\%)!>&@fC)8N)2ϭFU%X۞=G71ɱQVY8@(KTwɇjVȋGojoܼ}OM 1]]Z縉؊?J,O ]oڵkrMB$%jopΏQX%Ŷ S44x 3uw0O,Y7q44\G`5*P%G>\c6xkm{GA#n<\ܶf~88gJC^k\7X]eVcoOzqtz$=*IHTVGʢd9G U5Yf㚪$3!rbmRi!lV"0-E*ւEn߿lcV= #s /trŕ.b J8\vZciJsD^މ"Nꗏ1>ET+ѺA8X/e{/_'Ÿ@Ϳ7f;n B0a6u @b8?IMmr.5f 9-$LC(Wo#^]Zfq΄\Yyټe ~P?Iv%٨}xYmG5ΑGy6WMUn||v !0J"k ^Hݠ[P6 H:l) Nvi v(js*'N 3;A'{"1uz(RKɿW$Vzdeu{\/wdG兖;PCD@+!d1͡U{yD^$ܺuˎӎt͔[&kJ)yJ4B~',ck%R}.7_;[_Aⓨ*PZO-y*tWtuѠ/ihh_xB(qmI8@g e8QeVi<,5P_ߡPg @ 9y\Uzt֚!9GVѠ `sԣ.BMM6,]4ۊF8T~Sxg.eO& N4Vi=eB뫿zz?k?NQgAh/s}! xιh|m [h(r_cD8Lx 16/.Sm!N~MUUVuYTz7 P0?`lC <{9zZ% uO~4*ZV혨ў0wqDz`|w7wFTnAf'`CL64?,;+E><@`XFZ%&$ߪxB0QYY}11xPh I+=N̹ˋ-kn[sHu J YN6[ZpD-6l>%eԞU *yQ2 $9ؒD 8ըKAoo?‹s,w\\Tސ",Igu#:um_D%{m`]c|7ae^`0U)U~o#NI!>R {} X|1/F(Q+&j=2 !DT??MD=(dÌko?'X0[@ms.,JAZ -AKhhh8 8Ju{hGwJe8.("L`?:YX6]e2[5d[{nQTw*=/Eu;U1&?sTt B?Վǧ(#㴰_dJBn?1(4љ '&8(l%Nh_  VU8Ǟ9=G\lqlY0JegF64pw} "&v E%eVLޝ'TAvlT7:2t[1v<^Рd,L%ATCu=0JlF@ov ! ,;swׁܰZn;?aa4+IfPT.b<#N̳k7Ϳ_ xQ ?@$eYtN[^4w=&Т(:+d_9 ^}U677%[}[Ƿ#5 Hzܸ69>\M|MC# /T?os/p+Eld"2)olR |d`$݄]12\0EACCÞhx4?h]Um]v̓D(x"xOPRlTЃ4v5u}NY^>NlLb񨶑j9܋2F]@W8BȧN}>& dbv!Z+FsENu! >WEz;a4 VƋDqL&!#~&(J3g$7%0˲/?'ȿm4;a>7nY!SW#944e4*ݥ.^@"ni~W%{?)͆7>uy[UX߃m$\}?>PŻBgm?sg]DCL&Nu"ډ¤UJ}$tS𖥒 +8C Qz-n߾m?P|4N.ZH_"bo?U+Tp '&߃?^7@w70=xzy#.=BxmHo, {"B944o,_q {m|vaR'ԟPC\df B`/UDd-5Qd%;qJQ&6UAd8GByyRnePk3ӏ:1K,t9%D R)MV ȭLr ):,u2iĝVU1MPS |€t$`E~g쟱y?~$)A~䟑B(^.=f5g33-~H>P 9q!?ww}ӻi/tUg_/~|R77:1"bI6$x )8w,~%!8+L!LǞz=D#n2 `$ֆ뽠p+ ePK?:1?FQ2+0M@*;b~&FcKC"kn""`Hzҁe,T|JB[1q4mNԡ{82tw_w< "4|/<ژt)lmm5_5&=j$XUmY"bΝ;+vISsY+996v$^h_#,k}v" }vIMYοAy$JUr)IsV @]D鶔v߫-UɫR 9(JG[rG^8N IUj:S!So)kYZt'IȼL^}J( Њ#ā["DgN6444ZHpNS4-J9jPʼ@4P贼}LQs괢cYQenq g6 LZT{Aar؄G0#qےYG%i BoS滶ODEC<ޘc-O@@joo'l%~NJՇ,˒4M>/N3Ը@"[,ǩIFM$0)*/Y賺6`?xP |o[:JC#7Dݘ>y?k .9V@9wjR )bP1< xQZg# `ePl_^i1׉'k2trG"Rsx8(edTm6G~n@hx"X/K#jW>ևBB<ER6{:wALn?9SXى'pΨX#Ddy{Õ+Wt:Z-${oqhLO6)q(sɡan8_ڱ5dmczcd* J44F~DS d[)"3CCC# aPV'm8{F=*‘#^ b/&JD<+IӢDKJQ*YVevg !#!ЋpdcS/}`0I+TVL޾$ V=#LUJ v&ƭw眥%@l㳗G=.EqxTU!2DŋY\\jDZIAܔ _gr$~}BEx<>5a;g,Z NÕ+(G-G7v<4.U!4S7&wro;r*2F&?#+DoO \Kp!Xmَ(,x\N v[PtJtȁVb./bTZ8,2)WuO,e>$rH( ehhLXJyY9k$G%>g}m+VOZɾm(K.LM)ϲP{,;oRבR OnmbCҢs'Y1<2Xmo`c~~$I숢|&axZ_V ;á Ͽn"}eK@y"QZ%%]g-IvWUm;2_gffffff1333333\eu&mqpFwv0dc?-J2Eʿ"$Å&A]պ_Y:Duh2'㒥߳"h6 V_CR|W'1(pb˒ 8 @E?$p@8V\_WU]RبQUV}f~okƤRZeԫ ,TU7$VoI6 3Wv[ $ ~Vx}@Jfx$`NEuEf-l1g%sGQyY Mv}s~Zs,Y_(3ܬLn5=L`T2D dfkkk7zD׳V^]-s?Z3X`=T,$G~D 3ը"o"iI*HeTlߋiHꄦ6Ix,/O{ :c7:%l[E8.g$q6!@mb@5@O6*? qhpj"I6$ܜPYWjրp{YYgTU#kBؤc@[u`0/SR/%=߁Vm樲}A/y [Ph12/1uleMo({3u%I ždd60Ifprj lJjVurNwo{{Mg3T Ԡ Orb8ɸ 1VNJ~qer*kUsVQ ~y/k`QAD݃M&SV620]G> [L$WXAq|+,D`̣b=ږ Fi!ҡiC-V1gLR1MV1G}Li[[P}!5uxIΣI>e9ZUpT /= ޗZnu U 0:2љvӴ- кn$.W쟪&USk&LcdBԉ:BiW>kQ霒A&+CeGkpQb{>WVSKLVmWuX"bEb sN\IkïjTeBPaA-Uk"Sp;SF)haɿ|q8+*?l^B|KD! Q+~@VZݶV^A#a:j[+/_DJk%I^C d@M&ΆvxzE0dO] R'3hO@ʽ& X՞V^4b;ВkUV]v[ {Γ8C1-ULhd riJb9"ؒ/ V5HVF$$02b sW9 ZD$=X@Զus4N٦I(]ixXk;^JvD XEIU³, ONH.s;I^?K8qVXV{]m ks5Āe`SW `ac@\I[=|T6X^KIN0iCm$m%/aTAm^mӤsYb̬hd<*&3J[L M :Asj@ 04h~OH@VWӔfEF>&4$` HW o< d"OV_&YƸ #1ہ> mmU.e~.EI Z}(l7 8Ν#_eV򕒿*q"A-c_,BZ`ݿ4^T98|l: +{Izۚf LGZÅ:kt<lv`d\-'>N.i1~w]3k#*~f{~Ѓ2̼ga0FeBdf V4mհqpq=opC˝3ۮi 0KMpNݵ+,D_k/^$PDF3 cT q'I8QPP{TԊTojĉ1O'^I:ד@ wLU 3YO@ McIsah*Z7z% eS /!"pN.|489iy@U8ش ! ewO:GTg С̳?/1MTUhۖEBfS}q,j&fVU6bYWo xqHJҲj `Bb ذ`:bw<YUm9*Un[K{>1ɀ) $9yEWWCC\CB@zEv'C1x2l4ՅJcjdžZ4h=)YI֨{]b4xf2ih LD64Gsp F8 @T'ےa Y+MVn$+Gke9zfyhЏ`jU#Te&8cƪyF_zlYo:0̏U+cÈQEoYn$c] ޻p:I^vy̌q:Z!O27CNjA10 $V9ؽi&[ea{0``/l[M YQBh$i=.5¼=Ib.fxo)ζ#>^N"P8鞁VV=V6ϗ|88+p;I/I=yK$m jBa٠vUDDmKjQ 10(+1qtYk9ŝ]fԭvF+%uBҵA]^iyՁv)m;4ͤ0V`=oK6M;lZ5LT j88.gEC='g, s^ѣVQ0`ll:65@ĭ\hWì,ɢޖ t/96Rr0_e]eifnfm J;}]̇ۓ]u/c<{MF)W 4 u$ eƉ3L%DbD0N,knBʺ`u@]P 4!X/:d[̢JˬP &5wփg l[m qi\ *.88 @Y9 -tҎQz26t% $!3NrVq`e'ګeU{e?4r`*fL%R(|{Z0 }lb+AEvjAzǶ4eo 7z90U)%<5 t?^ŅDjAH},1=I?8 }N0 _h\wJ4,7BP34 iʪ;{,.Il{9^`\cl&ExR֨3o|88.g{$NSt+1 /r "1c218MD8XO=CX>{ rvU\n?6y@!$*Nٝ4+Pg0RR P AFN% c=D͸5*qfjAVl$?(y]v= ɛ%B$%i$_ 88.gyH~.EVkѽc޾ю1tҴ0&6uV&N*&fyAv ^ZgKL^9ªAL@20JWo KȲpLՀ.m}!P_ASv,صتPMk}Υu`beAh{@Hu3SMLSC̬G5ɦU 󣇱v^sG3|W3z✓&nMamU`VL?` I"cm`3>u QD zv _@@GY}ͷ[3pqs*xH~")VaV!EA+U÷{>g^u'ك6A/S|G$T߃whپ+]XV;W,0yӞ;?!2M15T> ==4AD^>rZqgfts~E@cWD;D[uU.hkq/2lWmέ2$LQh^j|bI{It^.Dun?qH$OISN.^+MaI8̿*{9v&OC-ʸm/MDXvs|^0} CEJ>Dࢼ]M=q2.XulC~N2ܙhn"B$aK!1g$0N*Iy?"A&ͬ70*rkG2YLMbkM;7} 2aBf0dՄaycr\I ΞYC^CNAe>u<ԋ!+t"uް8ML$V&h1b0%̎1 Znw"3b5Am+'61FW &k1OIJ~ KtXU=k ւNOGROߏLN*Y۪ĶXb蔜_ޚ득כ{?I?gʿd8qN9̤k%5I]v@&1Fx2$NŢlS{Th|*@ |,lADgT.@Gn+}ɧqq l=& ,Vʕ$ 6LD`( hUKvDR*F5[g6w&m H,Ȯ7m̓c) 7gyTfYXѪŲFjXTֲ 3%\|V%rʿk76Elnhɾzk}keefÓRm\Ӡ*kMڄޞ@ eMJ>^HDINQDBK?RR3bg":-:ɿ_|%װ":)Z2P;E3:*ƵcyV'qq\:sljCo*uܩ$U ڋ{K̢$ k҅`JMy<-I(fV[M #MnnPM IӶpwOHO4UJUڀf=dA?s\rwq g^=Z~oۍAwc`R ˸&\N*uy ;b68}G[?zoZ79XEdM>?cS^A$!0:z; 1Ŵؾϖ(g8nhVw?/&O8q(Y3w䷛V@;i EnE"ӌj'†dVEnDŽlzlf{23[zd HZYz?tΝ]}BDeǵkHibP`mcнөz6մR:nTarY10A"pb J@Y5:bǬmA Ѷ7:"͞{hoY/lҷٮ;{T^'dv33EVF;6ZYzqD`GeCc:-7z^u9/B]E`)i X< ,= d58RU0`IIE$7M~ FnۅV?mDvR I\8Z@SD*pǓFRcl՝ y{L9!_ZҎ8q(u2U YNȆD!yI *@IDtX뤓 ~mXUm[Ycm Y'IZxpncO =Vg{湫x6͖*W,V%9͉!^u%"Ѷg3"0GZudҴLV5h~Q/j!>onnNT@sɿsZ< 35 W:,I,\( g`ԁB#"’H@D`$|u`4LkTeZHlKZ? yo)[_iR$fr\<ӊvfYְܲzhuSrZa%﵏n)Kh{F~%8tgy^N/*2Va;{f$mT@4)Hԭ39otZthBUL#*iPb dqnhff {^!YK]JH6|#5I/K&M5 WVӖ`/XFp4!7R2;&_+ @1 gx 좮Ȫ뤕MؤҖ:՛LnYD^DI@ -Z Jn7'`\ַuBmo៓] #K[ g7 qDRL{ XcH8$&5|?H 8qSe+:uvc q* ;%Hd5LeUL2ڪhoC+f+u+켝jl_>SzmF:z^|& ֹFW_̣Y"+~Uv% oZUIdl+Lf@t+l{#e*l?3Id,NG vPxb-6h6gC_o&&Xis!-Z[%F28q'笵1<:k%|L^_|d`EQ@*!mD= CcT*H巷Gw^_702 >  >I)ٔ*a49uh-8M T \ sPl@80=&nX0Lۃ1b4ߋeZՏYu߲vك8 $_뱝$88 @qM7J&y7IZ᷉!|dmcqYg+L0CL+hܧ(  w#-|2f%%=m|sTc4 ks&$3zY 6d!d!J(蠈^Yu u%.&a*J[`*sH AE/C?2>HĮOJv &y?JŸ./XD)08qF|U >dopMBpVVM{33ﵼSpGJd $%i.!rVeÃl՟IPV5nnN71ELbUe! @6tM=y&`NHauf1(t8L hpBܶQ_>p\cAVk}d͒&yqq8c{֦z#{g]'gj|WMg8~-ښnbccgXcmvcd 鸰/&n S\>CmC=[$T fA"!hUHی# 0a\V"*Pk$Bj߇°}3F X:!QՍ%n*aN\Kr˟7[?qq\:"i}X9ۯLg0G˾$lMOH^ Ğ?b 5Is6a}ȑe DQ:vgFSKRVM'6Gl' '3 Y ak Ô  M csTipY%I ^\h )r`wR6ܬpcs&NkɏI~RrJǗ|Kڂg$ 98qg_+*<`놉þ]֓YJDp扎{ʪ9emU"JM ~hR*~ L[""eQøMg>h?lZVeuJA#01 mBԽ>2ۋı!&FiQb} Yy$ c#0٭a7h괣P7is0w,9v?͛$AO>pq8Βؐ<,[\7ixYh?̅}Ne"^U7$OJZʋvKv:No#ߐXlrCctbd À ?NUrLmyKbN|bfmO}h*ɴx`\::Kh' *5EdB2H#Wor*|UY^ɯ5$|Kn`&I3m{ :8q$k̸̙Usn&H%>VW@Ie*"C/t]"%A{D}w_(ɏc~٪M[ #zv[nV}-ݴo|d8tqr[ϛL+$YI-gLzI}U"f$YmeXȾS6sY2ӥU%8].Z?0!x^|ܞ+:l6'H"P[M3[HZ;^=F&,\!04 㹫#Il/\mow* !ip8oEi]88.qN ` S6&x75Zز8ekkrKϲJnbo{>&yU-YJA"j5E@UǤnMWyk"=m05g_a43yM A88tqSϚU&UD\|kMN3Ѥtfk_jC Γ$XN<[Uk z!'Y h\@YAOۃC;ONIl+?iqq8kCg{zmH'dxH򋒯|88Bv[ yWٞg]5 e"9U AÌqXR 7nK4UbcfE~[w#6NJ88qq|? cؾWgHnZv7;L >l{ l-Np+"< dF0x!:4dZ6h6! 1hE`BP;J<g FUϽ4yƻ$$88 @qqlwl\DʸFRnMH~OdZ/lÏ &Pp 򈵞d-׶,B2бJFn +RIe}lO1n-YRv0Hv߿'DY&(88qq9YIrv9oqJ*l1ġ){mjM>wI7!:o7!x~v h5Z?bϵJ[Ȱ0aj"p41-j N(=Em&I^dtmm|K&pqq88Β9kbN>ˣ&IJo% qq88Z)yདྷБ`9̬/6L[sE sW:&e0$ "P@g{ Yc<`|k@-r8=`E$ϵm۶mv:5;m۶g&_*og9wV`wqw7wtܪׄ$!0S:z\iO +5: \Rˏih8݃x0l\v7vv7w1pz-uNvr!(*:^r~aӱ0keҐ(?|۝ю\2w9wKwv-j.8{-x_V!0*ZgF'*J3wwW`Ww7n{ 7I$ws)-Sk{V~}9|*4tCҸTXx7 tQww wwAwzMv,M8zjYM&&Eʕ?Ϸg݂v&$}ݖK75$~* WV~V"~Ɠ2x]OO6O=}P {M ݵU6tV;rTG?E$|ϱoE<dӑ0h½νR {ҵ 7પ:LnN>䎻nZ^]==Pؽ= d ..Y LKC9x%C`U>7s#Ue=v }tvtJkqr/v7Yh=]rAǿԝϕ4ֵ6D{(^qR?6+c莹w4?^ic${[zLWhP׺twt<j%:oNLYWΞ̹Ѭ;~>⾫f;%&NNRIv8ɳ^sŃܵ܁Y^27о:qLsZ$&Nja0_cC>n.uv+{_+ONG_g667]X3PURu|%x_n'W54:vjGulz+}]]]8TC@;<!pwuW U, u[|6=% _N TUx>>~= K@p]ww9S84U$4ZN 30jiZ驿v+վ~[z$A\f?]==]hxQxcKPeU)U{;m ;u!.㱁_ׁC/xUf;>@.8eYOOw0sgGv1׶m۶mvm[5ڶ[789'J3W4(`vJz8;sVhZ@ nHc\pktK J6>IwSfLפp }FJt tO秳~I 007NObF @tw:>MS!KOUS@tB%(xv:-U JR{.Mk*1> :@+Cj>`tfz>jǧU qjS g(핾J͙~L5URc`|;6N'˝{I` ` ` 0@vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/_static/logo.png0000644000175100001710000017141700000000000016577 0ustar00runnerdockerPNG  IHDR0I36IDATx10·-бw/qWr,ȀN,oI@ҋ@]=dTuГں5kJ`myĺ` e@(gm~10@q*|ޡ7ɑᯓ/6mRc?|z{o=Z\1c%[~=m>{3jF.]-^' ׌x10]KJA3ԊYdWh;ѹe3\/A؆a-ӊ&- R4gkg|ۅ7lR~s]Z'"l5 `U=nG+,|#PkZjn, WC m`WՅY7^K&iGˏ~b,aRtw;57vhw.T^تm%GBTjx{rudo[n61{y0UZ[U!pBfA`íVypird7Uv$贒Ǫkn9B;tei| '0@Q*cfJo\~>J*6BhyšIs㳺#D`nҫ s՗S a~AX ZΕX^ K5X?FL%#@"Z+WHcSe9RVkt3u'x~JyKWKF굶g7kCof_Uڢ87 >7y*X fZ_5ӫ\<¬BjZUenvF \\i%z R2 Ͷ8+-\yZǏq)mj&`<߲l2baQ!yRKCIۄ` @NeS;UWt;8G/rmV58!X ૐ?8 hM-n#ۼlmj:ff|?>t8&47:ڢGv{ F GQk&] n&oR!X>A87n[ټa#h0@ɨlu䛯xZZv&yC+t[nj^6 f}ܷlPkjIY l8V\XSGlvhgVFWz@z6|tc&>`l۫ȶbըz~*&T`幥?i3{Vy"B_8ڙ j3 }o⇥ZU!k=?Osv /b+4@[Ty8\f~^ڥ5˛Vh[~xQ2j-<[+ha°*y 'R XE #{}F x==ZBSpSf3 \zU|*3K-pgf+CVCFP`~[=qWޗgiV8lg#SeY$9B%#( q ~ >ksPgU`3^[{I"` p Covm8Hβ ,+:"U-`Wτ&f5!]=m DžXT `J+_pI͸V+7 m:SBqGabF~([i>w;VhU07炱~#@SGMB1p{)ShBgm՜*p$d,Ĩ&jZ߅ޣFP Jw`Hkb/Oq~Zy뇂FP0;uSoƛz{k?h*~$ȸ @6VbΊRP[*j=.t}oDLğ+iKtY#/eX>#tPu0g_]?:gmi>'߶Ub-R5eX'#W+x޸ bT}q>͋]g=T7!b I>D֡W[`;BV׻bKXmtxn|GѪj'wV7`/$[aoS&Ou:~h#tV' 7!-NS`$9f*A['5OM4@RyK=ުO"ɟz֏A/f |eX~z.ʴA`_ဝesC*p˰Rs՗]U`O 3|)nmyXHY3`$7?틴?ٽ6 pN]`aV6 Tb2럇*I0"ZVwmj 츖_ifS|p(!.VX_uA/GWw,P˳q"?Tڠv*V<-lK^&6]ڟX[϶\= W|pm]XJF@,ɑa?(@g}T 0ȁaW:+/~A,RW ʜI+=A_-qi Nu _&v%~I>6?R P2bpQi;r+G_nǫyns`Uvw0E,<ǃO kDî }p<]g}_uǻ: wI`M<3iV?tmZ0s 7|m_S͎_ \e0H`:TnktƋ9sc[齷wAkt͍(=`-c?WC"Z\? -m0@ /={+ /EuKu*6Gex)y7.?0@^BmmS~~yXg LGMD1a|K}?ߨu|.=T[h#ڠ|ߝ^slqI`ЇaZ-SiN ۠nWjV@*DV4zUK[j z荠87$ ԅO dtz\߼6'[wbEX~7AKH6o//~mgtf'ҝR+-vR8c,"_'_(d0@o 6:}amx*Q_OSGBNQEXvn9` ^/v{?=kUK}we^sXXuY-y Tg> tD{2 UXmk[/&jPQR2`EfxͫÚMr~Dae z5MWst.޴ z-6KkS3'9\3|]K=>@rPxqjmyՅîÎ6ⰁXԪw9[ϙ~|SH0@986;M]_M#EylQ5t|xkXԦB}걏tĮ=xIU*z>;[txiUhGkZhnR!W\U#= QIazȏ^xYso_4.dx8IUÄ :P{SOoU(9 *?WUgqT;O0@ 6*46dmX?^Mo3 X_-:c+nb|eaM}FI?EXw90@`UpR%R!,fu: h> kW?BiX/UwfkF`m ZQBiAU˩ i'8CfsZVd ֩xmðms;UZ&h0@<=`UyU5T`Rp"- o& oToe{={?=)$@gUިۚ /7ZWG"W̞,``;ʫ۳9_Zmgd[[BPks̈́bWUY?x }n#Y`w1 BXp5NW0vΈ%v/3zV-@ `zUkfI\hg.n,}5=`˭n\~~5;T?`iGN20Duw ']z-FS|?ܟ}Q>+ B*Coe]Y-ӍO(`@ViЫ .6 n]nNz.AY߈o-;&=G}WȮVǩ q`F=>f*LKO۰YHZi7wتB/`٠u9v<q\MYKWK៿ҭ/O {ɸ˴(b(7fn[[N-) ǘ^2"`Jj^wg(&Bs1h-y4iG}7W-:x[m}u C#IY h+g viW|mz_ &|IG Awg|T%U+Ty,Z4-36騧kq3R7eYz!lvAp>9sjY`;5]gj 06qݸw\Ƹ"7pp61%RH9%'7}zez~/ vW^ſ-,zYYĖ GXQkgBӺLN?">|Q7։?xSW7Œk t_ڣ31P !n(3ZaWdTxC&'Vǝŋc] dJ׊ΎzMĥ..;x{xgַɋ ]\ƼK.5M.*1Au۟,_CB ͋넃YssׁG6g)1A;Diih9p@Ǐw~|j7MqUyWUޮB p^nK0 :33CTr%cY!8`ʯ ^hK.:ΰ1[hJY%R B ;CR3W]Źv&89]֓XU_zL??!+e%E{)Wp{on^?tMKdBt= 0~z Ŗ5Ƅ=m- |%˺hK\T}#נ6Gt);׆c d 35L$RQǛ/P !Vuߪ报C!wUjr/ GEOw_\UYiRUԀ+uQ^^3vW$ϵ$ʭ;kvK4XT {nn/++\ +OHA _,~d_勿E> =*ZX5?/1|}"`B!ĺ\mYٍfRwvwuAl}flt)ÃUi!>*m,H{[sTse'ō,qk(ǔwe ^Hm:=wSDyn\(Du~r0C;lC{V2T+|xcŧoiQ#,>X /VqK(B4- P)>tuvޞQUU,$ }Jpv148d1;fs]'J/&\|>Q(>wcyfTvjS F{Iqnv8{nxҧUTU)_gjxF'k:v>\9\q~]?en`Xc7H+)B&B_|WClɫ!^%XEfI0>nEյW'хfՆ<`ʊ ñg:!dѝRv.;Dݶe&~/{%IVm* /LlV^%S@5֣\m==xp&Hm*yb;'ygO/'MzyLYaz?sܿYMdJGU|bbj/׍55\jߩ͐\^+N4ƈ郏6j/$M Gt[``ˮZe3B!8Tg?B%KTQM["eX`PRRM]]WWciUoIaڝ -f+ Z&DaW 6BXӶu}߾}xdhv?oܱJ3B$o$N+R1_,!ӠVx)L!I|4r#wBtR[\!jv`eW)RWRVV`&B"o#^OǦ>w{RJ~U>>#Nn7:[^{}z3lVtf1]ɚJnWԞ48?A<)q>Nqux{swGĹeY])64 0!\- BX!hsc@Τ,,{B2C]Wm~\XB4}flVz`%W.a5ҨP/P׀-*dnX^R`:۪ ĭTbV5ĊKL&bjtu]*#lܺK\j Nfh{-̷%| "`B!dqNџ*%87hᾘ?5{%DW.$Golq; `EX Mi;}(_:ҔgB W;R 7ޘfzA[s]^=+w[ˇG$/%׺TMv9yox a!E?kâ'aі쾃!P/^H^h*RT(5E}}fU`Eڠ%Uebdx).fv~=>Kڒ RREV lq7ţ^k.'@U⏎fG21Hڵ)ϵ&E*ސB^'1a)M;ɟ`wRp;!B!$$ E[:dTtJ $C. `QE|}[AqfF !7cݐLͶ$]}}({ X\ɇG2,=G1f!ړ#XC\ wC(B"!í(KGK JzIZhҁʯ?:V&K6f돔BzȇB ;:2-9/oK_jOod6긇՟t 0!\bY|e{"K!ۤ/w5߈qff'Ǖ] ng$ *H:]J~^WK rɶK$.5ċ:S !q/Xa? Şg9i\o~sn8PP0Toڪewy5IҙU ? s|M"`B!$H,_$͕3aGù?/Z<_w Xuutȁb+ث$S֣J>jDju ;Ԡ ݻݿj`$iϖ}7]\=588wVYV=Ʊµ-?w7uP !9g)7a|qC*ccjrkr$h|s e wD d۶cQPj/ iknVڟ_|vhE8{qvl1P|qHû>x꛹=Y,,rG |X~vLuP !(6gXrM۠MOOR|#ͫڷ˳D[ңj0ڢ0̾Jn|=rltl|dĭq~~O{ Ðp9#"O!FT/SCv8 8 B_[|?ˣDF8 l6hCN95ْ&:LYH li֖*-Gr۠G \d5뼎---7mFJvui5(T&50*ҡ^ED~ְgmЄL!͗tg/y?[ ZZNNNq-ݞ`|[ <m ~CT5 4559coOyC5k0w`U^Ti!EGp`"[CF77iЄL!K%} %nW\ðWlJz\9b@bq;oQe.QïJ]qtd-QB-66¢  x|y>:-?w8T?k4`4B!R| jvg}_n}1%iAR 2I V Wuuu~hys n[~QE*!`y0l5B!sAJup+v_7V櫫{ gϜ/9` ,TV آ% dOdo$Zi /3lGuy۟_BdU8!kpaCT|oFBIwp7{|B)2>5qIN'?6~*pwJw)+ 9Akhs-ި ൎDqږk [ݿZ![ݓ]\}u?_"asZ2 )708 0! /DcB KN. >rkɓ-˟_.ްgwsM߃?Α9Mv_GGm6744B@C>+K \uY;_A`p"9ՙbuHL!7 MF1pkʁVYÝN;/p CT^hKF+/X&snwAC RwPEҐ8`jD_3t>R4ؘK++*\(;, Fln,~Fm1zG(B)ϨYKB Z̳s33`Hk\sVv:g^/c=?Yx !b/?}녤J6c3Vwvwtt@)cႤ|/Z%NoTs/++5K{ :T )_kHD* :Pn;O&BpWF1Jㅶ$SV[{aɄSjXMVmU>_?==R#|@mF_uс>fUA߅SLӮ`C*W~7LEk>B67JkSLxfV9]U.H]6`Pr"߃xfnk%Xm>_U5Em3#k}9))1:%KxvBD 0NnH;>*? f 0!/AgO9ӱ\$.7ӽV圫 yRW" &BXVA*E%X ºٗS5TՐ0<ߏi 8XDt]`0ӞZ\X/vL&XA*rfDv`'c2 )x oL3]$eovv^}jXwb"rG3Se5\V hENB)a`'AS~ܗn;R) P~ZsYI9mOV6-//WW"y <ܘ,0P$0 Q]ju=vuD_@cP@J0¬L1h`t!XN~uI KEb 08Z /}#vf)nl]蒾a^m$l{V;bY" >>zkVeY?`3F5 $Q-2z1"PT6Ϭs p2` 0!.ޑLdu7޽["kyUsJpssZ$$/{K5ǵrs C\=7$??150$?+p$>+4ïL U&@ z30QuuKe_ۼ[Y&wDS~w]䈵+ᶄL!dɯ"U+쵙sJ̌SϞ=u-LP?p Tf5/ܓzZ{v`VСV% [_!^ *ʯUmK?.Y ]~3) f2CBY򋰫/QE2Fh5ٖ$*+W΢S !,ueVw86GYiVϞ9 Ī6ܾ.GI`ZZG[kvl#J;!I^ UZjn^R?X$HYO-Yj[;W7_P !P~Tle~.ŋN >yVhTk-kV^jwV!|mFװHIV]YQadK{\sĈ ;:CYe2WRIh} .μߴ)`B!a&_#UiA~ؤ BBMLVY[wxs>P+[}h*`м:$3K!6+Z7Nv@~)`B!a(_ k!"}ҫ+jM[VjˈQBb\T \r? VDV'Q[No&ͷ&?>RJ\ϫ>*W5ܗDBrv.=xppа,z`_H{_Ũkfs{{yGA]"n%5Kg)R|WTHt֙ RJ \Xo!B&/̡,a.R [ZZؘS O>j>r䈛$NZ7=PcpC5ӠC/\dq*4vGϯ:siN1M=1Swa!L!Ke"SM尷Gmc}^4 -a@`Y<% s rJ_cP)B"l/7*b5#K `ޫ3!j Z-UJL"&mC~0dK0MOR Vh VhY=՞ sO=!;,&L_yj(~7HwFU8XsH|U`o_qn`.ڣUC(TL(Ыw{RbEjGW fİ cc >15I2ڵ"Im>qNeJ:f le>8}" y>X]pNʀ[F NJ=M΍U`/Ҭ=tv&  0!Po"LXjkXZ$O.Dp$R={,zoxl0:.W bqSSc6DXϡ|x42%h!:6;`Ư37MF$ /+JWUu tnH- 0!P~q׻w/ TR rS'&-ᄼw[DG & <~:-=V~U=i8ǺZok. -Dڂf8RXVcAJx º'?')?I=kL&sh\*ٸokSҽ9rģs33 Z b1) dw]2ܗ#޳$1ْ=cnвmUW!1Πp`Y0ʣ&_)T7KVՖjろ)`B!a8LDEm٦j(\`d577Zi.]~^ Ҩ&r?߼cבk~ º1AG,P !X$sDt3L ĚmIR灱XO,$-8V@%۴MV_n5 "+;!/+!kLvWwG 0!p䈕_" O6:% >hU1a<&V0aָO~~ݎaOx]]a,¬YN7Fj`yP !- Դ\Bty7uA jJ4*ʪmʐaaT%.DA[_ DX޿)՘5>WVTy !'QKFp* pidB"`B! ^E/ڝ??9_x m2K?K] F׋2۪ Jk3PA[ns3n`1 !RP"-Lx[${z_GP !W7' -kw&[6SݹkޞS(r444>ں:^k3Z|E|Yx] ѩ_ݿ; B߭Q0/ӝIv'CU-$![f&''K-ϸ-Aj}&ⱶ*°> g`Xl:X۞߂* 0!д>#$bNc5G#d$X0c׫+sϩV@Q[g2ʹ%*麟RI;]P !s\2dk Hx5/ Vf!£##R대*W\1 \,]o"ou'z`-!pҵB&=O,f_x!`Ba3ɏOjEt-ChBd:"m9`9>7<_)ss 0!Po+7g7"[:42!Z ekUQi(❁`/y޶|mkb)L ]Wxc_IJYLܼX&`BY[ʣʔgB^ڭ-m)]>++0gZgΨ,ЫI0ڢ!K [4^gBĪX U%?H12}"B#$jClKhX F3W s櫐N<b%u$:(=iA,<1Vԩ7h[ vYVmB./'"7P\0f"s^_c!Z 1h75^grQ0归qoHV )1КkH<]ܖP !doKy%j5Xm8#k9`oAXMR ,Nm{U -+ o~z]!XYz]NU=UiL|_{IZ8P !;-K}JՎ$L5MANSB X/`x2LKbF`BYoxz/!aV 6YaKKF*A 9`EC>B^3d:?-), %b/b#B&=l,KHMLl^`5)ztdD{tkn_;J3<|5R`(Vgת/v"s`BڣHԒ]B(¨˕IVXf~}W"gN@q|'<'å QD|f-]H+pA 6BRۑ|E%~۞9a*OK7C]b 7 SYP2! p2;\;ۡW(BXp#9NyDB!~o0bKx{<>`0>6gθ #G\'ǯs~; 3 ,t?{́HZ^X_mʨ*8"H|fBX૟.1_B m+yAΞ=c6E"q> 2 25ص  0>cY)ͧIv/+ 0!@f/*?5@B̪,% ]] CB? JZ=aT%*aBpbՂ #Ъ"~PM3( uGs(*B|𕧫UӱH=ړc%nii1O?&>CVTTy՝ QŬpW_v VigJYP.nWNӵJ9 rД{(ZB(eKaї uH|bj*uHR~#˪0fNJ_y90`-+ 55b|4vg2 /*>/BF~dq$F{655-k*БrZe@OX(qvmP6L{8$^牺ɝW{_ 0!P~ΔX{TBa6hƼ ZߥTe4 k S X}&|1;mfU8@~9-o^x,m|%`Ba;¦{!uHfmH=22 Zҭwἵ_7 +,Ex!uwjkqmRtb4T߾)/Hx1ɴg 0!09gw(!FmЇ;; UY_tImV7 ,cG9Mr$mio'-XuHI֎~ǧ6]b3qoixjLB&V#|px5ɧ6h0>6ghA f; }|^Tp!WkˣC1Oe}*6RߣC4oǕX}A 0&/ tjnmХ%^۠'''AOzߦύPlݙ^܄Ŝ+*B ]Ʈ__3D6$CjU{Z=DU !<O!PƂmЍnkk3A_p s^ y)~.:++ͪo 0!P~c܏Wr0P!/yot6h37\G=hXf^})G벙wpk}ŧ=8B58VY4ڰL7:36;OYS !Rebaj/fzexU 'MYqڰgڠJ bumU]`?EB/'KbaM5|&b8ïK/u:z8UȠ{d{ jOFK52ʝlw&>2̅rՓkmҚe&L!໑Xj$79 44 Pngwyc-Q+jH0{*]%˰=)L5T',R_pU_ 0!,-t%Ly=M3°/x?_Js ojq~LvtёbuL :) ~ 06sv咋|}&^eF& 0!,6S !7Ҽ6 ]]p[ң ƚ5^1+Em^E AK)J3eW]}tXNwi( :B:"nXDü[3AmhI~+Ww=m۶ U"JpRLg,qw" f$.gb WqKMqlYFdyΥT1jڥXz]yzK`wLs-krhvӫJ/_?Ip޳UHs*FbfݿqY< ,/xԈs7nVVlT{O'!$qV ˫̪XAʰ8b2m+ -=h%*=m+>Z Da⋶j]¹Z;ƪoKѓK>!r$ɪ/",UPWFޫ_7N~O>9'` TvXK jt'L/ 00 Pё6 +`Zr %ݻ :y$cVINd L/w;Jlʋ`**TǷ;$TL+HۭTDĮlJ߾3RSF 9ԁRӛYaX~4*_u#[0 /Ɲc۶m="VŗQ&ZV #%6w#|6-%4[W">^S4vmT%ƪ Gs}qaSWϱB+9 HyV>ڜHHY}o7^-?&sĽi $ 05ᅵ8ɤaX~Hr5׿=z46$B85ywBnxI_o K5Cح$"Qx}YbfF_K5F3 psw~~ Pa0ڸ655AB]A>7$?Rq BuT?[F,`H+Ds֓_\RI|C?MH)ڜ?ɳ$ ~#r_!V-.ݝ#޽Ű 6<1;/ΐpYG4F!^s0  pXU^4ɫ {tWR;Ĕ؟~ɼr\޿HR761LlEA% k JmΨB`_Z $'N\ۓ%hO0~ԹOoXYB3*z 1]bXx)UvMYqgm17R ).,Rhˠ-X%ffaM z?w0,3oFEi[`8R>ի_[,;KVr3*Ѳ텖d׬wb6X:h ۲m;j~Ϸ;Y{XaXl?'WaX~o7y-8_U?m+g{Ӵ65l~`+.+Ki+:F{&TwCQ%YkⵛvNffa<_aŬ-vB<}A~1+3+9уVx4jd0T1zX. dv41Mg7O3'#);ŵƹf.6oafaQl/ð"ӟn'gz)؊T[[[ZH|YXN^;/޿dULķ ]ө ney# XlyEhg5N_Ft=ono/3 0/7?t4aaX~`N+ C|Yf/c+[{_{vg ?xê0W}iW柉ԶWX"3}zn^](j6-ˎ$s.*/Uq{_`acXTB_3maX~/ho@ո#ga_CM%Xhԯ ++*Va %?7vزchٹj\ ۟w𑊬mTg\EC@[癯5J#Kcu 1 0hS9S}~_&N&D3^,ޯj޽kyn~A7 ,Y%7R^vk I^XCw*fMXcAzuzφf2b;*#BQQ°3 8fteP\e_F@`ܺu+foc}O۠Q}Uyo -K`7qfOθ-ecovW=e& ƒx}"\)||M>~H#Xq pXU] c$*Z毿ZO1mѸ݉'LHIS' 7x*I^+ǃo^ŅN]߼$?1'̅N{]ֈ[uDx= yRӺI,]ljp0 Z_0 ˯,=`vr|*mm2VM%Y[ܮ\_ZP@7|!|b|TF ^~\?)wF`ffaT] /ð*|%XjFX q&ä)*xX#m"J/V$kkU.4FCCb}, 0GOk'iaX~ !܆㏦m$ުmϛnbsmbQ;& O{OVcEOG%2k,hq@@7 3 ðw W0,hVfsy*h}qG 0|@Io) 0fR3ޫ_7AJ:Gg]^Ƈl0 o[IW3b2aﯡm޽{Jm5Z|1۾!@  Mt&If߫G 3뀪Q:P:3yVHjeWe S`aG^ٽ kX.`_Zj/^r=;P?}&?JopPZtX}tgFEG, 0 *|\_׀_ MJz;UKپ}xRty&Q"0Wի_-6?3嵚?9&Phx{x1T,[)JT@ڰ3 ð\ș_9^/zJ\"?NʭnO htOz&-*O0;~͐qTU+ _:`,_z(!7I-U^ U+ho/ѝj!F(}:Gʶ)S xo ͝ QC۪%yP'v'xIVuu$B-awuu{Oh//^(د+›7]h|Q˺ 7wD#Le-KIcUpЪF=)UyD.5ClGxQF[3ZښJowPe7%%Fp(1N0j)\e8^{, A R%7*?񏆷}ф>~8Vĝ;wtof}:tHÇٳb6",G*w{|]vkXܴ~' voޅW28 0')zSk+Wy=Ik.Ҍye;Uj"4z8a륙hNҘ0oo rgֲ0xentG^̷B vʫe=ryXB??ZdW!,)0?__zL<:N~1B3 ѫo6_0$O>4\^^ڢhFLQF'mWr҇mώV~fzq[%6B:$RJ>kwJuu bb4Ƶ@W aQm+I/ |H:z?B|&"JOHѶc/n]1@U-fZ9O9`ӧO-BUJj UKEXSTϙy%;t^) `gw V: B%1B@jT=(TQM*`߰H4zEG0*ᅦra_AU/Ll JU_=(N_ ܣ}[TAG̽8޽{7i౶7owF*߻wmز.Dvg TgG_U6OCBK3m')qj}%!+h;֓K"GXEK5ӺquWJlFmRVyYG4Ek9_>[\2\aҘ0: 4r3,d϶Ef ҊcS!5 P+\tN`kY4m)֭[aja"~T/*Yc_fTx! jkq, ?\f8K޹Pshx~2-΁s, (SڟM |YBqm{'bvW+xjTڠ'OL%x$DXnۤÇB&!,}r$ eٴ f$P$6WMf`F%J Bu;B\6d"gaO>%aX6ëʊ %?e%Tke6覦q4hKmci&GJ%H.FuEXCd|߯;)K_yأ oI#Z-T &hm6 <Q AӚUB\q+#uyzce1 ~~QҠ"K%dem8yy4Aa4-fcǎ:ZCe+.]DkT\1Fuu_#+-a蝼r`RM^/Y69$^^`,U_Ɠ{{07$5z8\0=1a$\eu۠At+VAm! %lAq,uL1Wھ}{D~C󿶀UqK˳2Xys3%(!Yv.BjV,, 2,q&«_.Yx0%2Ls?CsޟUk2-aWjsLj¯0$Y[NMzĘdX=3Q;̾I/yMRS7E惹-aڟC V )]~~1+Y0ľXNaz}C¹;v' oAXUuGnxCHkLvy^ݼaNmfXͫh9s҉0ڢ*) è]q[b0ș:>^%aì1;Xc7`TrIi, n/Dި@,IY,IzSsyVZc -llm-zyn)Ìl |Y ,a'VҳTb!JU`i8{f~xeF;o۶HΥYzB\euGA]nDp}>:w,M)DX[4L`ݕ-XR9 ø$߾7UKzvf+T1lE߻{?䗒}0+6h1=iֱ /^06&9-Ҍ/W|u6^yOP+ީ+Kz0 {[!8]J4$*Ŋ.蚶MK$aos^T7m`2 f`)$&v\ÙðˁX{aVr*0% 0ZeFWWWKK{eRTg V$r|H U@sK/ði#F-sQjcj/$ZTwOx,8Ǽ-v$&UTCZ)d8kckF"0,*Ug:_Hkfٮ'quuuAzc&A\8V,rò 0:m|^^/Xa 5_}*y_ /9V&5̰-&C5aTc >?KjU`jNgaVXF\vmܱxMMMǠzk*xL1+KowL!6n ҙ>8U/7,Uu;\=Tc+l"m|x^g۫:tvcZƔDaT~] 0k ]/Z7]~u좢4Qp?}Axm pKK ڛVzGFI;{fOl/,beXY[w/d{kJdwW7wd ƶrl71^]TɲuD6Z5I^:F{?,Yh?0ZT N, 2@_aY99U2۷oG -WK 2,)YZߋ[3iWnwFEv2S+t,n+V-Ɗ"Fϖh ^*) Dh7E./ ë|<0W=*pX֭޿l "LX@+R!X]^GkbHoa gTɶd_'ުZhuq PK)3 jxPCX$ͱU 0 'Atm}c;jBD!ȆV*pfG}$?&I*!jcEhqKU]# FPkr,0ӫXl,цw{_S jK4 fxDCX,+ $hRy޵cX=-AuWM*ommR^+p$vZ=8UfWzmEUXkx W YLFVߎihV^F;`C~pZT74aQq$aYaa0oIl5o;EkK%W}NFj^i¬xW/ð˫{b]uBYE )_]T4[xP3kYVCm|a 8lk‰j$8&|򉮈O^Ls<eJ0IDc"= |6hZ$wwEWN,$‰}rTnf >+_odQax+b=&\۞I~1O'#KaVHpv<׫fE<b)bXYI~du "D,9ߛkW'\K4S|aw߯,$ղ0gC&[;ŖK'#KO)6<~b;wn'"&^?ì0׋}FsCVzGW$3 ܊L k2 /%8{h(N}^ܒIҌ q4Hcܦ ѻ5KƱWW5ڞa BWJtqD3AN/0HXf+tRK0TWHӧOc/Zx~[lH8?:2OF%ϭj/Z1kř:%* BVEݻ'=zgnd{'|Mc9:Ezܫ=*oƀ^j/Z4wY5G^ ,0T%JBQw`5DZQS*Nhjp;L`b ? H0fjLa/AXXr0mVhKO}0% Uj-׶MںŀFX#ž0mW{~\j7g$!W]YtUh/)`<^' "|rmhh=~}[ΞTz%$p,ŷwf%41-L&im,&0p2YQ<S̾n 012Z!NQls BL-R7T '1,,*3Ibe% cW/c9rKgz,'fMs]9}x[W>9~jh*TnopҘ6 y};T0 ]p8+`׮]֌0ڞt[Y EB,Vwgv%?9REFtpð$2CjeoOȾR<=YJVhh n+#.lqιk6ǻ\Y![ d%Ym34 è$@wm̴u1O2 -Vݹ:0*ÐZ B ΁ qu5z" g@%ɜon-em7k"V8C{X;[dv8R.ba z֢j!X$n`= N5Z4hD հ,C]mn,1=,[eN00LaҤC۷o;wBP=m[Y@QyLߨ͹e* |@9 F}#ϯݝCUHAaXV(.]+X]K`x⩲_jz[4Hp*.n~T4:ܐjD<}0;)_ׯQ,# s$I)?`ٽmxRY` /&{͝!K ڜ6gjo@+ }~fD_ x]ѯ!8a эRKu%0Di$T牴7-$XTJggv^6~Kv3h8oۋ/>?["0[0Zqn/qRwtt&;+7s6m!UQU>]@ۜ/+mvFVhj,[^k~ hqa%9u yd ][b(Z5g}e\eQd5`viTnΡen4;d1bV0LW!R mc[GLLs\_ 7Co.n_lω}xaN鱟ׅMVҜ|[^)  V>ZL:Ü0 ߉fEt ,qU~!vWnB 9kdnMXh!Y\M~uwCMo۵q;ܭ!,_/$z" n._ Nh+ }˧^Fv;=7s'=92_{}9z;mhk3I,#r+i׈oekq bXy+eZR= }t+edI5c4޳@<9L~1k."d9 ʷ0 +pѥt/;שK'$T{oBș+,**dQ|j33K<=?TQqӠFHx?Ͻ6&0Z@Sܼ۝5FF~s_!6|Q,xkx* m%Ӿ)8L7.MFK4)aGYڇ SL`Oq0w6.E 3תDbsUؽl8М3 QKϛ xA__g rV|= t 0?( s5ڝ5Nϥo//($xD0, 0DZI2uHQ+tuT]=U6G4k3ĉtQqj/άs/.'}aWb[ r a ab-Y8frbs8qݺ4"׮T}wi =╗ABm.w}uy)mwL|{@mA5LUXY%U}NOED3:s'``Nq*_TcBy3whX7KtQ NڛsgBy3Mzvjsmd5f40*O1ijW$[I)\0ZQEC7EuJ.[} yΏTswk"hU~yez Skz, }>+ k7f;Obf}QVhV=^GzTɑ"UYiݑ4Vd躒Y 捳#vŻcc}yҳ(J <1vS[UKEY.q!QŨ0IJ0X}O0ǫ%&=Z#m^4A~:5B~]VS^[YMr.U$;%MRHV&1wmb+79HxU9X@ð r3d_wVRdդ8кmg*h-7w`MVXcd*.KbxRh.5S- 0{UW3Wڊ%Dύ[Ѯ  \w􂨦(]s)o^UH '>+K6ND 5RBt`0p;Β a Q7~|l;#FK/qnrJ|Wr;&eU is+H,8/ڨuid+eo_ūӆg(jw8) 0`9s8!8]6KiGzR{5Zi5ɮɯ\ƺ'| @Z yOf`4R=U|ba"7Г`mΆP V_Gd ý^}Ug _5k,)QOG *I[ǏQu$]rJ5/6Mևs+Ɋ%T ok \% g5h`iUnk!RS6F4HК Z(mVb`b^6y@TtI%+C 6W v+l-bk(8aE?9B]n} '`0y~`hFHoGQޝvg I',H<:6'$q. 24g6mıq{Pc[Ox<:!YH쪶ETۗBTBiKd$`p&$U`g)JHdWJ@0M nڐYT_.ZK'=fz=}~@j0^c͚PVOWuiq*ϰS:'<^~$I׷-PwjMع!_Wzm,X/䓜"X]͞.5T/!oX_z$WڜQuU\#uٞ $ahIXBiw0kfw1-xM pj/ 0XH*oYIHG!ZkS[R/qRzK ;qs|ޱWϗ϶] >U2=IUeV u1O ]BT=UܹP|иƕb{6x& N{ʍb_Zqjw!I݋'zMxS<3 0ovW;.$٢{/ۢ4Ѳ}%ڢmLUU!VxfIB!guP_Z̰x0 \EXyeAhپJ\m/ۜ/U/k h׷*˰i}{*%Fojv2)iV '@~e'Ke*̸—8Z*VEc0tѳg/ 0k$Pު[Gڠ)$r5GlI"r[PtZ4]I XLHi7gWY38!hސ)W!сOVJw DBh,ha*pצk ;f۴\}>M򌋡9BzBSB7w~Q U':gSUJ< 3n&d+e!}&{O!Qժyѐ(l`es dE`i/n/xr+36@H\XeMlkeЩk]lKX`%xDJz2*$WIO| T)cJp6[neE۠j0΁ 2hq?}2z%U 4;ڢ” _uޭvALܲ.g9aۭ o.nCIѦi 8+_޳2/@2! sUXq+Q,>dٽZfKX"+( 0_:֫,t,g>ISl^f0&XhtC4;᳛b,qBEu4`k,[a2/+gّxVcx㥪8W oU% *}f벃0,ꒌnYWOg6&^?^S|5@$yEQx_auwXp2¡5O.V -DzǴqr$YqXR幗_ Rh/.RH$ԳKUhç ŸoJn)IGWt]|-&x=cN:gK3Đio>X՘ B'+bRKݽ\y v:*2B n0d7;W+{U/fnM`R Fݕ1E|E獓s$.$R9rX9XT=S1GoRV 3΋ R²hCAl)xj{ec-$kO~% -k)Y[39(+Po[{\szVX`J,P5J>wq,W)]o֌zϒ3ױ$ g\һXWۧF(2+UY& %\٢c.$h ѽ@(dN?(`Axt+k㮎FrJZ^ ymeA5q6n(@…tQ_L;F,IhBi'Y+sn|EenwPd6f6*FkriAX5iT`(EZۥY_UٕD9m p  Vs%WR˯ccڼUŬqL_:0VT rbt|@z4> | _l֬z4dVQܽ5KW:#NJڃ8.U^:30높 Z6_MnY ;bs6tw0e]2E8 S4UsRװ 'j4F*¦U8gt%MPMj0 V#%zkkPR}%y`%xȰ]u$ 1*}]=3 tZ!tvhf55=ˀ-Q3k"s%n+=P~!FJvh讍O ء}aE<_t@.Y%>psBqKmtTD`NWAE -oWl] *披֎<=C*<7;Ks _: /=WNJmEU_$ œhTc"#>n-Xhڷ^ XE/ t[4ax$\iZ~a͟ FۇXp+3"zAzhr'p驞.}c!Ha) ,<\fصKi\;AP$Kٓڂ/0: Ig_2D_m%^]e'LJr#5ڥ=輗¯p7W;Joݞb϶א&駟/-}ģkXBs8-0KHem`2>6"lr_ÓY~.JiX;{X(:ugV";~s 9H(IBwW:֙#j8Vk":Lh"KmiZu[{) s4W}I{+)KőL۷Oɋ\Tu!r;%{o L{Mf/:K.ݵ1SI۟IlTP9/_,. z-wkyVEo/˘0,!՝Tג+T4i~%X9!R5Q^/ 68"uT;WGź$Ẽiz`'@ssBv!5 WGTWWK x-p0oV"9=;&#bΥTCA]n֘.HOfJR &Vn}CG 1,%xl+ZNGHmA{ca/rúY V}ծ~t@և x6K2lMa j,1=hNF۽znmLtf۠{ʕLg?}'m ) W=H([)Xk+Kt|A];uIjpˍ"Gs:fgo0}BܿtZ*uف2,˜v]~8fZ?˯_#xFοaz/Zw-m~yວ"3dCrMXpYabXe&m+V0Rb9x4Z 'ceky!6u^KT{ wi[7-ᷪMEm.G;O>بҘ2١;3Ů|[~(Ҏބ~{3,˗O=wQfNF`V1Žth׫4/Wn ܪޡ.~wWȲFWYFD/m*ǻ;{^BEC>9o>6-KkSKBuGF{|h7a7 rL\/H  v*}ZC&~_g-Hg6\=DAQ:n]kk-DS8VD8\Fc@n+ \X.\@y_ u7nǶ mXq3.l8>*ɯw#*Z0KW/S)-Z9%w?hZ?a.Ł`0JVE˯ihպ[q,Y=ق *+p(sZ&V~dW/@ o\j%o@XP=doEbWTuOm޳U1Ӝ)-\0$21AWwH;=U%wh qK;kfKEUP}jQe&悩nCb??CܟESIh)ME+"T«-X)!9DH+@[7W=}V~I~=JS8- ̨ @~SiꯑDBٔ'\th.[#Yܫ/ s.Uz] 0 pXu'kz$u:_w#s0W قZ 8=3Em+]_l5>PPjK@1<^=VK}A #S]+ϟ?Od5GC2,%IyUw%WIG⭬hչ(Iyh vK >^$Ũr;!<``0[y3_y#ifGHD qe-<F5b)IgBVm/Q R֙k ![ĥJJ?DW_yCxǾ!mmn(N˭Ҩk-a| 2!h\P~Aݞzs,NEěwoΚ,o1KLb-TX wFuUH]ӣӟQٍU+T eH q?htyVWh:|bH:*ĶZ3:3dna[~ ,Y ru/hU*@s._#vT56xT+ۮJfM$=uJv~-Tƪ!ܫi4 usXD,0˯/~Y~;#^q\h{7LaS;5@WCTc'·y׊8@#T4ioYs,\bոju~'Hp%^0Mq0%3V*GuU`=YEyЕzWe^, )dT zq."UuLbKS~s)M뵟WA ab(J 7-5H'BVqYrUg=zk{OܺuK_CI-kyΏ ܧ~%_ucI0˥g+ο+5FU Y:LuR@3YYy3hVb. az,'j)d{` W,~!U}yhܒkzx+FWŁQ.8?aQ'4\ T#HWBf/.d՞Y=Nl0n.bŴ7 ?A$ lu| פD`9ѽUB^h:^_[@ ΐ I\5/p1I!s(5pk'LfNoim卶B3x4/]& pU/>}:ׯ\)Ç5.eLrw/&v<CbH'Ӽ0U^!Sm3=;ZV⊫Kd.o+w1ڔRZ}Zv#aKa*c' ӨBI2$+I'U^"ҙ53IUUoy Zn#U]nΈ!Հ2e障WP)Y_.iіL+QZ* T `!-:+< T=nvGY%[}iq\,?gg \3˯ˁ:c2gYuZh~!j2DV4+#Tee]¬P&1w|M5 hTƗMSPc6mq1ǭ~%N_2% >&avE! mBrŬ#k{> oDî$g}j{&y<3_ ϔ֌VX6b3Q[,n%̻.f*hҬKΓ$b-s( pRpBնMV*]I)AXю-?^кn&l*csfeq+myVB+[hϾGWſUT Nyk'xkՑb׮] !7eޣ9\eWު)AaR_ jtN(YUҟ!t ڛTѮ`q8ƞvz*_$<0 0KU`TYQ||I8lrɩR@ҩq,V QaC3SHlVjF+<>Byfy)7o]?h/+׿5n~?qOķ ׆ W^VxWtlʰ]FkaY8ژ lf%8_QQ5dK BtquiMR` ƊIfw^JWbP!Ny``sKBMܽeL,QI}Qa Vs(hCڴ1AKxv>˯<+ƥW^J/>BMnf8*spAkWyWqoSS'>Kđ#Gb)*.{Wni>i+X[Z_;<L&W&ǙK딢A2^|F%z#9Mj,\&Pt+ӵYGx r,>DWO*qKIhTaY!ϫ~b( ?G{PŘp;kA8s8+=zV&͋/&UZg!DWyߐeU=;0yeX[Z*aәhX4ފ`Vhb 1`Bb.Nj@-$QK$fAa+r\Mv.Օ_5v*J+az$=sK7drd0ayzs$@c6y^9 qjwa<ڛ1ϛ8ҫ+$ڗwdu1,yծ A 4km-;Ž[E#5d.XZ[,\+ I"!sSFg{gzcɷVV]kW_smCeXY?&|\*M|_?l@Hi⋖g_CXe6B1G8t>js2,\F_u'Jg*9ۜ5|8&2m">9J&Ҫ'=R@os [hqkdn 튐.Tԭ-ڢxE iq_oE~iuh1ZWgh+?kr Iur48)И۾_Gڊgê/BX|zª DTùzYCPWgu`y[: *.V1,\̈[]QAddCI:7ϱ+\^z}=1y-h|͑zzK)Υ)x]?je`Xd<.vb6kifp6թ o8P{7a?2˨VYBI\*-3n*ݘ&rK4/dLiW] fXY{BcnT I@}L.*O*c&pa@.%)' eOY  ~p6uRYD8cҌ_g Ok{g;9F˳ߛ`ˠZ߾ bRϽ.i 7̱qmJQnF], Ok *[,сPG@@J2Tew:{aYਸ਼~&`AP-J"u+8K@Rq`2-'^6v1&ٹI4&#Vhy6{voש n\۽X߻>C̮8gt-ƱN~%8@s *S38da_7T 9@{uL.'hUa622fLfI~Ww]jofjvMO?4i[ӧOt=Gil![s|T<@˨ fݝ 1XJ`F8;XfN$-,>CW®ܾ'3t,̰j(Hlc55 vV!ĸOGXDG9b `*t0M11׹}PZ Ey}hv*L32,6$I+Q/gޱV@/D5y.|Mܫ=r,{*=MyUdK|C,I)!I-#r3fy%Y)aOd̚ pfw8No*Vbg``;Vc9%B( >Fja6x{tðx| <%M8Cy0/VJ1TU %T}D>UZ5X*`Fz*H̀+ {_y>Dz ws!r`$~*uQgnW٪urP(/c`|ՑY~'_T9)JQaX[ ¢I. Vaj0$N(̌Ռ-p+_ I[3]_}!Wwg^ qZ).jmZksr@ҠwTn֕#/^pU~yޗo[X~WV!A 3YĮ^C:F *ᤪ QłǘaQmT#$sgtMKԫ1d$è h-+!6#\ H( Y$M ϶8JR3I'f2p6%fmEmƐS*2i53'P[7E,or+Q[ ,_so"'=3MkS}gcdTU+r+:ԶWI<~,˜~loIx 0'C_̋FW ֥ڂmCB!q_T!x,T)ƹ h}I :}aĽTh:񫿒9rݙ}SX<8Lϊ H6hࠈeFXonx΅T1J;+A` 0#Ip FGm:7K)AC4)qtӹi1 ƍ3 Ǵiҁp9[W$/BW(7`#+QO>$"gΜT}9(\}nβ)Ô 0Ҡ$ 2 ;b`Xy=bg1iCb8e6dVB&X|O!-[nw T!m"Ԙ3FM|u*N c`ZX{%>}:y,n 5*N C󶔺4@ BexCsP& [˕jsRUm_v)Jh7^k6>pRQI&j}sƱ>ٞ5 /Y1%zxx83q sg&oLU_&)[@ p 0K0>ԠDg*0 ES:or 5 Rm.g+TݭG3lM` Hք:wDxU*K-w=$_X3ģGt%pX9*fMR.Ȓíx֗I*C,S`af F5A]Ʉg:W[˙ [!w#/N~~Xttt>v^&U+lEmnU}C,SL"B(]yyaNR 6 R3I #Z5!.ˌVj-5[I ދ謜N-FW*;sY`-űWݐb߶rK"|]_MzyS%vVV`Ӟ|BQ_XȠFFWDF̰ٝ$[`jڢ6d_9gb,ڥiדgTk!$xAXFNZ٨ܣ=j/4~7*RWʅyp/:Y^:g ΘEB{BܫP bXINO, 0Kpu隘T*¨I=_B*#ȎB j.҂nW{FeL泭ěW~\{$fnA0DRXPU.x|oD׾\;/k{^ 5a/sU 灇4DC p34!Ê01uǚ%6*TI )F"VIy,3ވL]AvF$m\ޥ[̎݅Lg!E3Uy=oW}"s-2Dmt;oPnF8 KpbE1aXY\d~,YnG9!mfHڨK_V C;vƾme?TxIx}gs\م< /vMƇM?+%8$ pt-0,<Χ͵)D HRjIҍ9eHsTH"@S(h&\|@ȣ Z1n*R18>0՘ 0-:Z=Ƣ] ڦ68I.>;ׅbfDWxR;GѺqh*NuyӜIp` ]2 0KpƠWT2$_a$ :wI f٨N+ 2-3:(|`sPFKaDز/Y'#%ӅX5_UTzA~|~ǥB4<0*50ðwS5 :$Đݿ~nK3nǤW|kp(G`E 0Fs<Ѳqo'6t咘tl_L/~WZߝ[a3D|ڽżL)xN³|!CrpҊ@26wL3>ƺ9f7dRkg˼O|*`/s"WQ9wTk48n HUNU DǶ%$^߸Z?wV>JL r"mD`d6w<X|^İ3Vf>OwA_5ќ2\5Vl91;3$lFWI+^I!dhn4*mdJδ#ᰇİWYf`^ԫ1!fi$u;, *yrSUJjYʹ81瀹ڋzޝXrJ-uBa4>Dדi_5T PYId&aRFguDnF{4*H,y]٬M^“> oĒCZE@ >\Օ]s؇ w{5J ð3&+", 1.$K3KҌ~ٟ%aks⵷_WqV ;y,ʅA_ +͸KeSžSY|ɶ'{oΉ"6%X֒ 00 0#Fõ ,`C! -PkclOAqU_%U]3t0|Wn&YBAGr(J2m:D?03@(jކtJcvM;EsXUކNv !5a +F2zS[?T +? UC퇛 U\^؞r׵Au?}@Fn9exG;z|aiez!1xJ0=AXC&zr 0 CAu jV=JCWA!׮V(/pIyΎ?fE$, B~!곻U`@~V}%p^怏Χb흩 E8 D< 7$֭N+7bI |?^ TJdy<Yyԩ+9kqWBe|-kW9{daX&4z31VcSE&&I`~ި8ai A۟JU`T}epaX!ZvI<O,nydU}U[;R$ 1QKb7w%X",U]hm3 ð36-HH9DWJ y2hqJjc0-XV;CTLׄ@~s'e3UZc"Ҕ*2|Dؚ c WQ"Uo_ffafJēH$BhThH$_,j).hNY_kc5a' 0@SGYT#M sk">81ڳ\[0 p[c !fBۭ jgAsgGZ[e]ƤmCUdq)D 2Jihv ~x-h+Mq>ba)|%NOGA02s ֡IĈN)JALTK'B1L2!ЉUBtoj8.H#.F?)5ZzOy*`|. 0, R(HfB22څU!yvI//C }=B,F^Orᵠa:Qe}]Q}9g[e l9 a眃=#!cq$đ8gtՔF=VK[}'0> 8 s,ϫU!^d圃o6fxv꧜kyz=/UYS#l>Nx@F(ՙbž3r&_;gwo|o5ۚiɄwo}TMn""HwAּL[fG_]/Q5-C[熭ѹC7 >×٨ܪISΆgҘBL}7ޚRLI[MS{o}X:NUq4@> ƣn8Y\5 Ù33}L8: jW Lj,SDu@7:L`"qh- CmŝYtw=2ϔg%'vڜ'MkO#۟WIݔg:+ZWog]ӳ)7c pơjw.#8+"6LWawUL%; ?mX̴˳.9Z}ؐfL>?wzgn`E@4w_<; BqBY&4MpVL[Gxu e}:ܦ8wն_y"謪ÇCp^˦ɏC1J YNPl?~+ӛ 5-b=bLj/76*GڣC׽qV`UwŲAT얉ʬf)^)T8-7|:)k 0b[NZ戃q~3a3b'2nW<=~kYMSP2i::`%ᚩp>40&Ww0W%]׾I@e6JV1o_&M- :s0WϬ|(G*- _Ȥ ] ojW/, #W}MmpڕO<0wq05gG\Yuz@W5%3Z)jG'5:O3=w 򕙄քD =4@@ ;H 9'a0 qM /g_gL!V֟5XC``Y<> ' f":3Y{_~}?W} bSNi"y PŦ`J*Du.3bU&3]CkH(9螊}P㢲gv 0֤O3}8[Zc`Xv&:'x]]u9\};@_'0N#u+ͻb |~Ls SSS`~b5ZC`Cq5IϽ!0y b=3؇5 k-ï$Q_wk=k @5fsW/?[>/8+ c9|Zt6oI 8#\ERx_MqnymRV5ՠ<$`6!Gߡ ,CO30h`Wj 0n9 >`^JL``2r $`2u흋E=`/hqox0 \0 HL۷c@ ! X'\ b|<k~/`!\~0X#< @ @ 0`p` @ 0`0` @ 00` @ @tԓUIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/_static/logo_1000x500.png0000644000175100001710000040222100000000000017642 0ustar00runnerdockerPNG  IHDR(-XIDATxEAFMGpwsmU$}twUt]i~.L6rwW&}`^ZY5h/LKޗվiWUk6q>5N7kH>+mRC:' Ӛ6mL[Ӟt#iimj~[]>Sy$]Jӻ>[t:]qUbd!v0.3333333333{p$vb&Y, twI=%ڎzSO(|EkJI.!1ߝ`~T(p'B,ωQA(!L) ' ]9v9&ph1c1L A!FP:sPOAX'l(3 JNo gUJS<>cLM`yI""UvNv^~βf+#/+Idx%4&pc@7c1=(#,PQ D(`U@EQKa*8:wlw6μT[J 8 'qdY@5&ى# Vm6VJE;˙_X-rU͌6Y(o_c1cy0B Lkc@ rDUDhe%>>+z(rVy$=2+hw;ޝལ&K yr7n.lAo |ແ1c1ƌ3Q!0\ã#њ0栄#]Z97+ȹHTypϝ`zzL'Ph(8q8߉;",/-7YZ|-._kEI N^O1c1$~ 0G s꺣|ydpi!B8*TzMICsS|s,79eXBuGha1@7c1~,PU'pj_w@TXl)bg=S)EH}$ @Mα#<+Xy"+-w ph1c1ƌ!># J >(hˁ/_ QaOsQUA\p!AQi9򕯟9B3s ; 1 tc1Ƙoq|g! ށƬPPD]  1B /=1G!*jpPvµ|su:Y^P9H~5 c,Ѝ1c>T oBAvkSaϕ18HPM(nS rN@BO EJ7DQr{R F EAac01 ԄA!*=8X)xk.Rx*VTsp wmUA(JpL.h$)8njyޗ1c1c UЙGG*klX; !h*NypFG#¾!PM JWz|SI=e<{;WT DR| :KxX/寿sBp7}cn1c^^^^NtGyT30S#ԶUle(Jh_\aqr@I"Q0R G(!@>[* qp /,'4*Qhq`'ҫ840}*7gP6{ }_c,Ѝ1c3'<|x.E,X&ؿwLRHJ7' ",+h63WY^i>; \H * w~rĄ=:ҥ͛^~2=PiD5ґ2}u_Yc(M48޾p/|,ou(?n 0 tc18OO1B^F;ϱ#{axёkB!Dvf3ֽwB.C}yɵ>sT@E,P Oܕ@tL@,xTRVxoeJp7@c@7c5G |xKPO8~xGCCu r<+ 9hgKK W8{ZT^ $ 8BׅG&/wa浬p[_>|G=rw %d(2 . !r 绾TͿ~p2 tc1Ƙ3 K98Gq5NC{.K_;|Cd]u# {<),(N3,|Sw<!7:\% |>ҍ1c1? t Jp+D'۸Myغc=j\_?RzNMy?Qv/^ 6Y'9>BR;"ԏ@6s47ֶutc@7c? mc@-T9&&xZIqNPUODPͬUE$/4g]'/ a"ž~S<ӃV2~3g"]siܓ1rD>qErs!B-W{*k+9!n.H?)_$xyZ7^2U1c1f*+K"@atc8!% bT>,*Ijw~iNy՜$a <ߑ8UEŀwlp+/W!FUHi4T;;+޸w+ (c1cو;c':0BB|9pvq@Pso=T2 =AAy~_?:ht#Wok,,4pnMc1cL Ov );кQ(פユZIz}i<{ UGUxbʡZ Qo^O4r%qC7?2=P)WQU jݯɲst{q0Ƙhc1< Rҥ]@%c4 HqUOE* sKIǺ*3F3_z/|m<$]HԱJp7G@T80)OUHN̑vnVR>3EPDf0ƘXc1"Otgy;i*RPJRcC\ x@;%@$r8\u#⫈KW@QU@A#׼w*_9wFVxIp}Yy[7"mBW>)Oxw?x /ov?c>n1s|#~"Pe"B&u@NNA( TA\oǻ_C}jH2j|O{g4fV׶f)/"rRW"&T<)PMG~:eψ#*FWHIn;-%c@7ċ0]%L pFѻ8V{p "룊Cd} #x{]_ *8M{㰿H/k:p[pp?Rz@*O PvsF_רVvx c,Ѝ1!$/~0:槦U!*ht3'yA(=SFnD~c_*IB?.1Xc1C#x~.Pg0P>u̳ؑ8mndD@y-!Wt v4>Hty鳳+B3*#SS,p_ڲClZ2DjKUfwǁ/b1c UPG~I (sJtH_W&d E2sxm!H]qρaG/>) !%Upz+镡ga#]DPkP43Xc1ƜU-A!xjjQ٤@1(\_.{s%VqnDP BdD(s*m~pxʑ]I = ~|rYҔn?K0Ƽ1_wy/OOxHB;Rp8/CCb,Gebv »Us T a"u.'+;vLF],(DzHWѰ8vCQs'Pt P tc1ƘgvϝHشC#7ʇrl@Ѽ @Iyױ}~իc!¾!o FN TRzKX /#}r≓A c1cؘ7\aN$wrP(HP>!AN!s$}בSGyGJ3z%pv6kcCVW V&8$DFk K>}[ C|c,Ѝ1cp }Iww$UpCGC\jN&җ(V_/C]ă$<,/x#<}0ۼ b`$S qaO&pFKJE]5Q ^=uZBl5 f> 1c1 |{{c B܈#F:Z XA$9/?Ή4[ B%-Wx['8v^4Zsxrt$fS18G'0 tc1ƼMx;K߉s"~*|4G\ P/sbT ēLO ns[-׮EޞsQr[g.*g/OUYb6lu޽s1 tc1Ƽ~Tw UO(HdPrb-AWɉa>Q%HIw4 a/dۜ@+S޼XZQD<o@lBey{8vd/ Lc1cy)/a Ug_$ [IP 5R4RR"'N³Gܖ8Xh*_ Ω±1DZq!Dnprc^q!IyNh D@y,#*Hs/@!AEB:gB ycL(-w!./  q>2vZk!F^z;<01c15/EԴĄ uA@6OZy[c{Q>8?sBovnuwŽB-ǧUJIBoiA]:5^S>?y.cn1Ƙ;ΧyRʽ H1B=[ p;;cm |F(C~]޾xxJ`кe@ />NT}c,Ѝ1yݗt8U-//}]qp/YV3Ǚ3D-ʗ.D9YAIfK9s1.SBXl)ޱc!#}CBmqUp5bQ^^R#[}?`?1c1[l OM{j^; )@xX R_~4n*ߺ*zpdQM@fABB>U^p!2Xc1Ƽ|DШ*Kr]% mep=̩"yن8v,ؤ//.*WnFDEBм%UVp^Bd )Cb@7c@E85(A&}tg۷|zg^èw3!PySM@uEcb@$"/f^E^c1c LHy޸$ bvE^_IZ-ُ#FJoGn_XgNuօTµH+SDv~XȮ#K!D8DQg1c1g@P>ύ8P(VظHME4:8h(U<\qށahnzD/x{Aār pc@7cL^=?$(Hx_2/ طw=C%͛v} {x]P+I"qh R zJT =b@7c9<ݽ>5CJab 6}S#?m™}QH=u".j+"ՀˠǁkhdO# tc1Ƙ`- Nx QBvмogdJpf&r?H=w$pfՇp{ZFG׫DecAzcn1s{|πP5S48󂣇3B6RzϭS80"RWoFfv7AаjbTj qV1c1U@﯀s<8C*i@T'צRmov=z-8Bqj̼.@qk=f ?>>>D/41c1f8#5G%|`A9O<>F6S+KJTvLPO!IWnFVvs]Xa48S{Ur^1$c1ܟ:0IwׅD :&y.%8{Ƈ %F\YTˎC=T?"=xWgUCXpJXnqT'ȎXM@\Whk篑C+SsptDyJy ss" 05H}}zX: \T;P@K tΡ(\9!®q@sApc1c+Txڨ@ #F%Nt[Q{i@'P_iv}f> 2$z l(Vs0T V#a#z-@yAE:`AUQ0'fyp.߈ zPv6Uw)c1cLw9jyWh$U» "8ZMi4!Y51c1^DwO70L!P0PJ*>:$LtVk(XλB= =quFy|(WW"+Mp"(K鼷^_nmlܐ@⤜+ /@ q'8{"VF6f:mD_ׁ%c,Ѝ1c+2߈6\!YQD@C_ RP uVdžևCBTb\!1甦ƅC{ܕXi(+M%{p3jɭKJH2q)eSATAA٥ȾIO+QA#(vEen pr@ʹ]2"ljf&s+4ܜ]& xݜ(Ǧo -1c[@߶mr'j\YeXU./FZ JE0XC02 Q^Cf2rU>c[g|[}~\Y_*ށ8"7|{]F`*@BPU^BN%xPv΁ Z%%P1*yh63(Y*++MsPs*;F Ig*k1 [~>c1I?OM;^9&ny7Yh7ʍeeD:jΊ0'21b߈p'd/FV:>`WB nJ ~_PM8}QI'0P (v$z'!FVW[dE{第b6x+ƷW;~\av.C,lrl/b@7cGG9mA+ ʵ|32׀y2G6D|HlLYntB}W ˝h߼pn3vE#;~7F' %'縫զn{ՂWeߓ*uߏP;A)B}5S07gg~s%\\Y7_xc1c>xV?:þA"B@~)WF4ZUzOJ*xisPЀ;Je T#s8F/\y=U-_3c1f/7!ue&b;,[VCb3CPD /@'85{ӀKI>hN,+򜥕&g޺ƹ ׹1L G! U81c1ǁ <U㉣zgQGQ.?<"=us2;'6=n)HJ~ՂD(E][o\bfvic;4V׀? + 5c,Ѝ1csN"*j'@ @} tc1Ƙ>W)?yI_5oيbgAQsAm,(EHT;wB@9UpUal1G@;)!}I(F_'Y@9Q|uoyKWfYYmeֹ{ x0c1-$cN%q2B6UUBdis ]Aa9G#o?6qk ժVqk)!1CFt<(Wq5|2'M*@aģ\2׿u+晝[&*${}VyOcn1E9Q^H ]A^-7教y6 I6Cܹ$N>G @ [ߕ;sX^Y?+8' "r"Rۣ^zhOZ*à {W2j)2ПzP16J h)@ED\2$t_NYTȉIz\IUDTSQI8RQQ EMU<UIn0fgt[t;mf$tuuӮѪUS#D1}(N:op NyU;*.j#q(%ZB;8.ϟ/}fS @ sY}C Ez+WK kAT„ܖTd"DۄҔJgWg\$@J)}5Ā"(:]Ss-d"Ox{W}-P@DPqbH$4v"@T&R^b"ROeUTe)xE vtMsf-;ʹMSe9*W 樷xa jYWK[ N+"1&㮁m;DM$ .E qΏ̧^^{0 =@ Wc9|ST\ZWֶmey|"vyw8Y`Ro3ṀcFxV;??OTʕ!r/*Hyn~Rzh\$GTHk ZB9"XZ,cb\2_u]A)MK(eL&O)*x["lDt; Z͚g,.tXaikK=U'% onh9re]]pGPau)P͵-T8 Q $E\ݤ[]n,װA=<(ı+G??}fk=}A@ poCqq {ܚݥ\rPְ!+;:eW5V{eD^=g#.\8GëV$ zbιs稼2;:O[W*EU!Q䈜EmSZ:VnD8r2ɢzENd 6QOP fJRXo/eaCY{ݱvQ_MK1nGBʕZAK@VL&blpG#-c|1(u%1Ŀ/cD8 "A@ pQ^4%CRn@Q% YY)=(+G>K4mSV9Ro9tfӤPUe5+?dYNZ ΠރVwT=+s<7jYayC;u"SaM3ȝi;ib U,ͶYwy=Kʹ( &[pcmAu"Ws"18םG^F96 N$M؍x7q#QKi7R:M8QVe+e)+S&8'/a4Z⡃ v[Vkcbϳ6A$Sߦآ][4 G)e<_ZvL9Vf4ݪDZǓ օ\pNޓ%yQ2f&㯼~3'nM[@ $@ xB^'"^`i1 W,/Q $^$oz^ 'ݻgժjk;J@WU5}~Zzh14^s%Y6L^/,,Le_D{WS+<"X8*ٿ4l4v|^1tڕ>qֈD,i;&=lʕ \P>uIqVnޢVM<E\:D]JΣyKMy_AXZai|ŅYȚ%Il{l%YeB`*Ndr+y^9ԙK< 8Ͱ|J@@ c!0KmY}CYWn2JQ( @UU&ϓhd9ySKkSiV2nu¾ U{ЁףzW9FV&eDi-yl)ee˕ʧ0@*x'Sq1j_Z[1qAlI0\$|ٷԵ׼U'[k1vgߙ`Ч(=M%d̸SWBb7[ۼ|**1ө13b۲ilo)ie^E^/"LMDN! G\Ʌ˛'I! r, A@ p b~x U&Pas^mĩ_)"BeVI}jȒgϚWUeR<33",uܘ~lefRn57;ǑGH眭 ^U5x"8G;F˄ V =Ϯ"v=/*^ɩ [EoYɶB#gjw;ƹyb^zֈAe>.7`YәF})}+ǺtxTԕŊk%o+$8Ɗo{?]%FLۤݪȷNAn);VF-I4vd<08'thR!=b8lٔ׶c>qg= az wpO{xpD?MU< O@`dr . pjbnZ{{$zJ-#T;/mp+[ ZJYgfMDNi7l~{QLj8QDOWOo9?3glnXonBjrlY@ z C`q9?f8E9u۷ 6mYs_yDdG39 2DJ9vLyg#% `eC$Jh<3_HaP(SA(+J_<{N_?;ˊ8fGsys@N F^Ľ491ATRxxqQQT}7Iy;^EsW]!m(H'']F FiZFEZD}*D'xvo [81S(K~3XhĶ045cNRKZ͚ ~DZu,(<$yWL } 0M˲?Y$8 G㉠g&$˧{m5!@@ 1Fۀ(&]9iE9{>|)Yr(HUvӚ2"R+oS&%rȱ;KMM=&EY N@&Ry/Ǒ898޸e ,p;D {@ :ǁ7L,iT>H8-m_rzN'5c3?u3WU㱥$I묭YJ07h:ĿsUJ;Nڭ}*V,'ƫ4F倯~([|LևYN>IAV!zh&`]G>:"׽G[ZDgʒjeƠxR8|lQdk6V`h49*i1fssrQA'GPt"c+R$eD qu~qpκ#(j$10*o (+%Ak;O^N @ oZ0P337Y;,;V7nd΂Vp8p=K{Th,t X Ϥa9 V/Y27}$IIoɣ "l#0@ z  %qН1YjYmשT"Pj#Ҥވ(ua`]Qc^s/q}-w=7Y^%mk&vƭ]5ׁ0~<=@ R~٤[.$i tZ5f&]:v=Ov qNՍֵكݶQPD9ı1$n\dk=acs^9VVi4JmMd|*W_C,i4Ǩlxle&YYKX_`Q҉+.z5H<\#+^q&w*O Gߛ T@ oKwK@ Gs |o& &4۪x{MAMղi.88MeT(SKk2;3cl߱sLs>wpE}&2w+gfj‘f6Os:IHx摽QhX' +9!@J_שPt}ۻ:kKsyGQT;4.#ji|E:\IUYNVVvf]z1uQIɬz]>5o.C$Ҽ;H3JϼLO Xh}_%퉿C '@ |~ߊ{WtI=3^aeKUyW;ϨQ&Yam!l .ry(hNGvn*'Lǰyo֠y<$ILGo9xfp_9T*'X"ػo@3M i 8uOeTUy+QԤ{%vBZ{G^Onwg=1*N@-uWlC"ݹMᚳi0^y%+<%L轂Wܦ;O& [pmFc' Dvx*N|Ҽd}SE~'';)=(3߃7@ &#@ >|@reE L R6jBUL "Sێ=e} !ހ3)=p`&qlEYS+.'Ij)Riksb eY|mUEYȵ+&9=rn*KQOly=^Mxjy΍+vӓV|{{}ņRzp# UniU@9i T^mɖ^w{_H{^``ܮ3t4҄E87_~l6W{;?Ts_@mMp?{RVVp`iM>sO%W+Ё.o Qv(=D1jA{ wx;D |+?.*fs#{M-}bJZ̥Mo;rYkA ]it|7k G̷k7I(+ ]Ddd]A)s5O#Q {+e;xvvuF8>we+WYg1X+ QQ4f9;\^ԙU^<ʅ>翴8vvkPUdYsBH+9\ղvKQ"źzF(7 Qar$(G!re Yi[6M iĴ Zl5[Us4*vLЫ>Ȏ_O4L3 bKHOlU (&M$qQ)B-v=mN^Rt ~q@ z w wUlpퟷޝf ^PHh)ˍ"F'eWI</]NIxu\vj☂9$M]9[DH9y2a6 3<|;e-OXD.ӴymkkvUnhTzqp3!"!ogV\saslEb@5eObGMP8 #OVL]z W DŽH 145[M%xU` ƴ+ZQk< `:`e^6A@ 0ǁgtZ̳ ukXn=UcG3KTt*^ʲ0)Χ*+^\\nE@xxvc$qL^E~x" */ֱu}`pW5 I&1ZBzpyMDk ַF|s玘*7G) E_R)Qtm(OlM{. F~VQ]-8gRjomqnm`LQ85;Vߝӯm؁=*6"xUn We\hRt[;kHkGGs'o`WG@ ҚS 8]ǗyKOHN޸*izfpw,E)KKIBG|s( $ӗUKY$2ɫH`{6,F vFX*\8){lyY_ӗ( 3'ӽȗln%8v Z&*_|",|žq)\ָd+* t?z?3!/']E@;"QkI4N;Gı]Av2S4>wIȵ[j7A @v9!"=ȓ'j8PE ܯ`.lU]?f `gffQU+o/, /pI'= ߾SϿ8+jNx{x`0fLG^AHz7dL T1굔:DcE_x },;{C3E /C.S~zCqN!i6Ws|M9Mݾ>()x?ygNmW%^-cШE|#KHkD (ݨ;nGK^~hׯ&;^mG p@ p~;ӷ!Ӯi}Փ|i7R ?ءTgR2WU,+rE#0lwUu DP0Iwf\زn7Rg8zxo.SzW4JbWp;/\c/&~]*#Dx*ޅ{Zovfx77@ ?( WGV/(fJBMI*fbY\EcwzCV("u*Z<@:t1Ӯ]O@ pKyOU8FT[Y[99i KҚEtկiOU)qL`MnUT^C϶| gG62`R>EyLV ZY{G&Z yUU(P#݊ˮIVV1.T 7?unQN~?Ŀ_޽Euے9?*+ksdqDx(}K]::Wó@J .OSYK3MAC=TxpQZHckJGUUsynIë[ĉxLlԮò[݆IJlU0n =33M+}?˯^ͩ ]s›`7S:P$Ve]VPPJwPzSObsSK3u8QUG'u=q;ā]oİU4AggiZ34<XF$8KfzU{ᕳb=4G ^mIK9xPa ̽bHIs=%<"-Gp|"U(+IR/_Ě0:N(<<o>z|7|3-s8'|KCD"8(v+Ȋ{4Oq@ z gGE*&G5;W>{ WC@QiDj*@͟9{kc@PUrュxh84i衇LHEpnPTi5V}%={]T#gGq4kȁrL]EکK9IgS7NaroyJEUfVT8QdN=~3w#<Q|n}%Em c ǒ^l2ꭑZU SRT%E'2T$/IL:`s[-W&Zݎy7Mza'TU3Pz`0f2iҩU:(/Q\-r䄙zDQz*s{C&&)>8xF% 8Q{nĶ?I[8v$(=;iZ?,SkVН~G]qfmj/co7^3GW=Rf ~'ˊ3tz,/>}+JeJ27B _Sѳ9-x0Yb]-" JT=WQ#y3}&ꕊIyY=uut/z6K㘕F NRU~Gֶ6C_( nݱ9(wfgk)յm"bQEuM9dkcF#IDZ5޳i9jRwyRJqN86sDN‰|7K^g<՜}[%rbrSRXFw;jyY,=JC3ʬ䗵JEA+*_OutG؁Ќ=+J$9nv}8ʉ'LN#~a): bqCCkl*8˨VѪ9$Q$t6f&DyH5+q xz"wMTJ$> n}/j|[Ep yQo;*4j :9o@@&=u\ul2Bm[@{sYmH{+Q%떖^-D ם'NQ" rGiX2h4mu $nZ QfkGwYY2DnSϭPzN e 4q3Y$(`Rnt:9wƾIWq7Ja0./^bWțv?tUKҔቧ᫿{p Iw$.48ME}Zф~{qa*9o$Q+3(n|O)ފW?~ǏAUQ5l2TvGxs*$b eDIfYj^UtC< \p8v ~\$3?fmGS uNX/ԉdEI=I, {5"n.gmֈ#GQm^9(x_vwى iy^p]ьu׿JA>뗷 i ?'[4[-nԄ>ȱ?_jŷ("pbikޙ|9*_!1ߡr^Gߐs kݚƗy@&@H:jN:@nWeyc/Θ/bDj"^V&wV;Dh'%kmRcÇlpEqd%A`>nOҕ$qkʛ* /m7(a DlfNT=z5ewo&PUJ9LUa͈[?}I>s>r.q;iq8jETQf#Q%`&4Zh &q@ r*U孤Gu{V=1A7nӽ]]-ʒazH19-EQO; 1AS/T3v[G(LR.n50QUf: &Wc?]d4ΉI).bkjDM̾[\FF$B\>.d)^]ܴQ+xr"]$ۖ#(_X_[c7}D,Kd?zoQvP=m2ށs@09W9@ r~{Xn?qG-Y{w cd"B*uڼd/LM&эaywʞZιQGC\CAOkyq9KżPiܾ llv~D[3k<}bcrިGcvJ:7"9o<;#1/oZR߬'?*sʽ/m4=ؚčc66'#bTr5 N'U4 fp?ks~>ee~X_]e%={^KđlyU{DOƯ[A&ҙUTٍziVsn6B EB<{G9S.+%/K+dF?mGvݯ=ElZ  sJ@՛RUUXZZkJ$qzP*tZ5;ɉ0JkOǮ54l3pWT%țyQT<}0GUIsAd%ǎp@ z [sU%^s`EE!Le܎%⌋7zcf&=}VZE0} UiƨEHgSEq{>m%.5D"1q^kF9acד$?+Y۶8wdmYQYsWzu#izEvEacՊn86]Q r{ qtksn'fpYD&ŸK=;?CZ[bRGq^ڿS]mpܿ)QIn~)@cK"K+0Gl @܊{x>Q&#;۱RAm">D|'xBL#jc'XJ=gVy&{lomnw8|Zn˼f iq`)"[{ k3*F+q,wS6y \e{ً$K679V׷#xꑕ&gLy6?賺j^xPpo;G镣m,(5Bvl5"^z~o>~Z_ ݿW˿̟ERHHci8 D9:t D=zm:I3ADh{|" &TΗrKrG=fn_CBP(/[7#z( K;D^xpk%xe ԝלÝ)zY&R{x."^',w^10=,QN4FX®D+3 Ney4 _x /vWm߻=<^ki{VV-ưUl✳vVKyO'U*s@rpsrg+!1gNo?NxU+W妩*e\>WABD(ڿJQur-/Xԁws$oTc.5H)d!B =(|ɹܣyI%pSBnɈ8cc8bc0d{4xAV&W~h:L:4y摽|=Gyej>D8+8;L8&r1z Ve'".]dRa˳ҪH](*-wCKN"GC<۱[ʞnJ'X(/nY\G\9ǟTk:_^i7k1NUe5B@@ r JgC69'y~zmֻuҶmAA"G_x&@ z  9w9[sި|lιschw|70)njrKWͫ~!@+&`P@cL'PU+umd",,..MOlgHq ],PV~g`F^3Te2KM~Fk Q$vC&I`\p9KĢ5$=F,l̙]O|[ɝ(Dp*_ȒrRVڗVUAfݎ7K9}$]w"tgI[5P~-QRo'mA@ _~nQwV`TMˊAVؾ^'ƽi|:e&@gV%#" &O>$N= RK#흧n\lszÌE54&3q=TAUX\W Li6[Lg{gcs*xU%n*JQGD@1| @A&߬MΗ߮T*U?zCcLȋ EUH"c\ե'CHA*DQxt3Ӭ 7~i_Lu]9Wk`޹];Rڄ'pL%_RnQ^ıe.;k&[Ñ5x3ƓY\!6]Ý@5& C+uWULzi?@Q8qO_nڶcyCVXLBl O`TmiR&|c,𹄬Fa᪪"cf]$ϼδz<:7{~PSs5cLg`Wt _"|yx_D{zyr)ghV瓫%Ǐ%aR`^y>y~㯰3jPOc&NX N@U-5oڈ]v7v칳9 ]Rx 09kF54MJR{N,|}NRq'vRs{7|=vG'BDxyIZ vmEDU)qQ4PǸ}Ǝ ZMOE\81@ x_q,_aZ{fzU*UP^8Ks% 8p3c-KUe$VongiRuUeU,~juN|XRWSֳtMN]= r啳 G9|{[x?&/X]Lλ}K'cX[[ Hyra-[;]F3.~K%7yN̶R6xl zcy*3fgN$حo\;D$B&; 9֪$mE/Oj I3ACUI|G#(vhepDŽчjI-%BStfLN#rR-X{̋Nl:Q^Otm&rlz2N'Ng?Yk.X[1GgRYsln3 ~p"~d*Wy?bz9DvynCѰΞM+="gT5 '"G;I/[EBJ 4W[c'xUbq "D"8i/ž?R?(yu"ԣzLdځKbM{ Z+Ae'fh :*E{% JQzynݯEJ3*YSpnF)(A$IذoHK67Ft]>+Xɻ3#1WK8mc bK\Z©u.lx7R8r<qf`D6|D|t:=TUes{[ϽE(;vK2=NPP~UGUv=D&j_针S_-jkTEuPDMCW6V-\#|JZOv(TEJ$.Az0fǩ=vd=~Dbk8fs4w q$Ќl6:ݸR*t=%W""yni˾ٻw\:>v1?oN;LsrtEǿ|{x=ëǡ45v˪j1?7q96Kd"nZ&ʪ"/*٥: /VpQPWLNo'J"V z8a_@5v=[kH5|ցA=:ǁ#7J;LJ>j%ܯLUE٨T:(UXL IGř|=TՄIJ`c}f8~GyFn  (N&F¹>dQw$@c46W_'gWUx{{UGr5bcDzA@ pgM@Ƽw܏8nf9ND(IWL&II~OeQw&ԓܺw3&董=z'Nc۬7J勢YdvsoHgZ.]uqe+U m)^ybqP\,čݻ΋n&q-W sXZyju\v}Y#% &^%{$ /Mn'V8~`<+JGјA̍4LfBUp(vg;$}80IMMcb'"[{LӴ 6ʭھIx{ U5v}EG .^h P)<dz(oF  oxA="`ǭ9=j1"NbHk1(NHQA؉W{\+"L@ z ?ovNֵ}\sF#E fB \EBg̥%^|0Ogolv) ;ӿ8"]9UUl{OdnnޞyvN>m0,c]ϻJbUAU9wGIۂIPn-ʸ(ɯ{|I#EQE\,J"tUE+%ԁ2bZy}it'Bf(`c{r. rc7%N" D@דki>cw9@ z ӵGnfyܣ_lƷI>-褱C]@yxbf"I4qI>42*,Cϵj"2]±(IxO4)~lG?xG/b[^=Wx㼚6'rխ>M({moråZs-T7c=b:27uyN&NDg?@@ C6V&(cyȡ{Q^=SrTa[kSm4sbhulޖ&)&ڪ})7IwQU'C8BLν3I}O=̓'POcm| {^l3ŋ9As(g?CQV\W/sx6 +o{SGU. 0%K0GU{(|բJg]I:AA<$ルV#6yz.OxxfB'%2暔*{]Ll_:6˲zL9sDdz_s:  Ny@UqsOgq*Py ^ԫ|9g#T!ʺđ}nC?/lX= *,k'+;$ڵL5۾.o@|oFUWEoP/$f>2sh.UQol pbw@ AT9/f9,C!xk.냜kJPHkza "ᰲuk&N4MY";Mi'(>9Μ=˨iI(P{{W/莲Dʫg׭}aɁ.s ZF=%^-<@&)~啭Ս!/Zcmkh57,F-:9s UHhͶ@>>;/-{ʼn8+'DhR^ZyH =)I-vy}8'TrswQa?r9as3=Sx!Έ}Yv1"p"'3syv:W$Sћ':UoLilf<!4 KM/n+Li:^92l36_GiM "#{U(4M8zund ڞ&D<#]'I=V~ Y~<E|;8GnoBZFƨ藑 / +GQjljceUEe4j5Lҽ8{"C{wLub=-] {4BDHb!nGF=ĖǑX$lk1NDQ^PѸ +0 LN$0A‘s|&®\K> (W#BhC&r֬zfun 8EDhQT 3tldˈ."@@ \3*yT깗 b^y 1r4ިd\DQ!ubZ RLKc7 lwtaaa33(KCbS)=PUQ}a6s&iH (W0-uO(ˮ0^m6Wvqbin䥷~t.@gd7fZr;r^&>7jFf Njs=kE@ z /f$$ǏaBW=)MO"aL#bK#Ģ̦=,1/ [ISd ,qnXn7]̷9w3m8/#SDaBUyKuBbKo?DX\* ɴ UN*I-%m7^f򖉶pL? ng>'Ot7J @ Fm71\Qz!&E.M4zƹgWŵ0E a>87R*ni @U6n-pjOJj:3F UT!ˎsN9?VeGyp<ьq%:ppyJ7{#.mpT09iVc*ל1JuUԀ.; @S9 _zǴW_9jWkrdmQbj:qx8~.yz`{H =773*}۬s/Z!xbID-CORʲRw"B6SIarnc (bnnޤud:(p䡙<=J]gCn 8c}k`x\¤LvRن5qWMX)|{`df!- px8]E?6WG+ܤ9rL(EU>W2%>/n LؤF۴9xmXȶƜ)zm">/A ? |j>H ]O+U@@!ĺLVj9'uVl첕gzpHјViʞ=˜0SSKcY6zc>EN_$w?vͪ+W;+\*>xDȟP/=q=i44&is8'$ˊ"/Rʞr~2=Q%Ũ_8a55l'L{}1 1׉w4MkgW_ګ)%Q} A UYkY(rvn3. Fy@hHI$&LDYnKM&eƓ2sn춹9Z#ϥْz18&rJ$pS: T=5;ws\IG(+;PV0WxNUJz|JknROXIdGq2)"jsMҋanφk}/lgcT ;1/FP/iG\t "@FFNY&*\g:]wQcr[ @ qnx23DR(.$r͝qZu,jcyN^}Ngډlkg/^7>029hŞg2JEwqʍ AvU2T ?8ϯ~Z6Ix2Y WEucś)vp##댾uaZ^ف*k,8px+eVƬ+FziL\K^WsPlYg>ND2!M =7#nt|:G,*^~QzʼnSv=b0KE̤Byi5ֹ_KL9u4'Mg*"r G;X)Qp"lxU 0I-_kf|ث>+GIDgi}36z,<&#ԫ-[@UA xROL[ -:g6eQq~EyuR vܾ9-Qi L{b%3-6w=uu򱝼8ۊ``b(SdGov @J{Qcz!}CK-/"*")N4%F8C @ "zeͱuYN@ `)栘Jf=s.g-ʲ(r1`̌]γ-g?k2-‹/˫`L?lKDLΙGR/o / 8v֑ǞO+¦ ΤEAgWU>sD  T^Y;ƹVZQ:\$pIMEܯdzZFFQ,W/\vNJ%1;R@ ,7#gػ!K&yY1 )@@S K*UDYHK'JӴLg]K78}X~/bϞ=|59)ѷB/&Wk[ tI;Ξf8.pIx^۫l$dԚ wC#\dXƤGW$yQxk}4|(g9 K[2 op"pؙF{Y} [up?wiWf:ϴ;ro!+Q FJgPGF( fMfۤN_?ֈ1ENo:nr\ WQon+5NW1r?-rONFj";*zݑ͔!+J VvZzwDTZ0]8g'li{2yNư9Ve0V1.qTGxc %@ ysL݃n!"Eic%8"++*`6XLs.e):'Ij2> j*}{~VVVrEZâL6W$M^?uvN<ЈIpNPJ¯8/J^8iTyMoHzlRo"!xul;~39@{昢R%|jvh Q&'NwM~ݿw׈UJ*9{[+\.ا_'sT,W]0ьU9}a3>$/JoUiCyT^c}kď}$[U9py6%I>U"B}AcD^]Sk™q`0M7&ʣ$zD\K&MGa5b112e Gfq詣y9( I`@@$%w=!7*K-~W>zwҟ)G7B?5ƉVW-$BCUY;~?5&7ݮh4*~4Rޖ8/sDȅG.+%$RUMOd}{p\Nd: Wfy:Q_86H]WM!hi]wgxY]dN5^HNwvEcڜ9L~֧J"AND,th("%VAzNDΈO!4c@N I iq#q$<~ mGJYS"@Ux?CE~o)+^-u~2'#gIg.nʙuKGJNDt~F{Nv-M?<3Mϯ6'OJh.qnҗ+|xgyV+/c ;;_DSWj*+qκrʬȫZC \~t$@w@ ȹLoV%|=C6gGc%l 92"ADw>je"B?Nc|`W9r p_rquW^*Çy׉=7I W+cۃ̶ MV@U_}Izq-ϬafX ^^^]3N7OD lV|0m]fŸ@D.=A zn穧w}ThbQ&9Gy0ܴ\DLݮ~A& \8^vD !B{CDwNiFw˞+G^+?"?~kEWSDxA!AgB^' r,4sf8"C9 ?rEJ&rR?x~[ɓVEǎ㡇^}+^9ck yUȟ[ܿT^YT{Ue>ۼ8z#I[yÜ78}a`g`;=5=8c$r/|(~&NLݚǽU^ggqз-=` һWOՕb8'gcP ._`i5SZb#0z#)un(A\-^J H@Rn}K]像޵//=tl 87<Fa>MEM~'~?q[OrTծȏ0F|326rAZrd^jE؁E}{6%ko_D䋩;ᱣK;G=T]"EEQV։ԅM6#Qkԙ_{??k/ű S O}u>~Q& c߉҉jO TR#2ߘdP\^߲ax~k#ʄ#^)2/SUUV0(6tyHj UYGV޻أ*K a x[A E`+|Ⱦ9q q"@<`5Ie9V~GL6S/w]kw!PS|ӟFuE8'BL j i7-uZzV)G1=`uDh4阜W}%&씍hٳg-=jEA6SP`߾+z.7#]*97xe;5:1y d%+c~b6Yyd&< sJE4=L9FOpV4)4ı&LAi|Qz{(v/n2+ yeMĤt`?Ǟxx_]4cS蕶AOL ˿~OIWw_5Zltu'ܘ<P5X7Fpsa31exDNSy6TAUfbVY,sḺ<Yhs@rjϮO_5 @@ |rCK$qt}& \E|\YLasͣ(_}יs< lzlR&I0E:'>IƕϮ\E"59g'z=ﳌAVٴ$]'1.ճ9NĉIYSϿz ^NnNf&=fFW&d4.m{dv{9"'ȫ䥕N@gnVd1qH$g$zF=A(o_^_ ])4. " @@z؞qL"J>DN~/}`"/o'seۇZGG" E^Yvmg9|0v:gΜ&t.\0W;dVQއ^J/WGgϭseYG5O6ZGU{\cI:(*?-mwyd:*KZAgn|ni=vϡV`[Ds??NeL}km/˫WJկR;zLHHȱU|EE9.myE|K8}>kVDD/r!y^>+OcIgOL([8(ާ+ʼ4!/F`LQUK"<)&Uo3%u$1ڂزf?q|̌0g 9vXedH#ibUkUgzuhtj](uot߷޽C$D~ݘ8vmsB1ƈ⼙ vy Y9\ tꦯU""6bmnnsET/-٘5 ~sDz{K_UW]̝W<}v>OHg:>z+uDT+ҴFe&Z#u[`~ I2ٚ&)hj%ŋ61ye3cOO3:9AgkA>|K^cdtÇYZX5ҴmJAP#S&" qtxp.kr=B .bA1i Q,}+mז4uH;,}.q7I:smڕZŜt ^9=G_.or*yHt#H$:^Pwk_z\sAWǪ 8?Xh)3TWŹ.*_SfScGUb\Ee%j}gνK®VnNdS!쮗 0fnv.yyQGIo5kT*) Rl0_"N-V,(%MR={o*zٲ{'#N/Xe~{h/.;? .gu[%Uk^4ơk+.|ncxk: c[$%(/BVD@؏c9xJiD=D8"L7-X]%e>p'%MI}}۷8Nz8αlЋ?ZJUTW<_E]w2:䤿nWZsj{UG5c# 4==AzzBV= =@щqaANcZ٠ +G L̷FZt;]ڋ TsB}ĺ"~KMܭ$r1ņ$I=su)/r8fsn`sgsD@D"ȷ[yٳgF:*e/Dꉊ󔏨88/s|| }9A p5"b/,,hx8=Uܹ}nϫ8kԱo7c_I@'vWATGZz0yH@p+% Cz0LHj~ *旯yA KటCѤL6p{.LwaF$DEf/xMk6!x>fY$J#,QD@D"X~pmӣL6#TLp݊=wa|rr "b%aaSG܄FMdWV,^ׇ/\źQt?MzKmƺ2_Y{Dž`8HR #5(y)mccn~p4}ÿ 8rDyx9vqQmTٴw3[Ʃ֫a8kVᮥ RzyFӵp6|Z D#D"(#H ³s8嬊^^Xq$91+yRŹsϪӚ*İ%a ‖K@S]{;~I砢K-8 3aQgv k}yf?UWtt>gH+>\K45bM*Mnek9vIGLtR ,sPiÍ>Q&g5=)/:#^;S8A=HH$9y ܺ/Z=['i֫6~=DNS ;d~87e<ȏSSSv:~e®ozGvW$ c~*,M,*쯿zf㵜d5n[x]0(g ;Vƥ2tz<ʑlA S9KdׁN&yx٭e#S-6Bkz!*/3 ?@w"Z>4FI6U 2W/V^ExhaV_ȷ|u(^t}i>188.HH$ sI&Guϻ-[D"I<\iJҭoSEEp_e]5 NSM{W}NŽ0c׎?n]g4g+ ΄[8ڗf#iP"'oy6VNQ׀+/E.jJk /52^ĸ^fby]M@!fwmfxRa T5/Ħ+,^أػ17*G\Lɞʳ? ,DD" r`Fǝ!07Anض݌A{`i@oKZK ID@D"ȋ7*a(SM'{}5H$HG|PNH!]C4]> d-z]eq< ?Q3u{ݚvz*Ց׾z};XϹ(wsܢ\L4rF>3~z!eyi)x/6z~,#o9&wTZ5tTtb`~=K +u_q;W?((rblm(XZvJ rGkAci灰#zm0 z ڙt{^#Nh^$z$D)qk<5,CyA/(ՈD8_='Λ Qce??^2dBpOD #B)OO?mC=dsW:^{- Z*#9qU&!_hܼj45>s9^vGR9a#ns@ꬿ8L`H \<"4Vg"c=ATКIi.Cޮ&K'Hٲ򜢟!4=CHH$w/g^kez%f/HUVs1s?s:\Źsn]]-MOrMc?tǎoo5y {/i.%\E֋\ApTl.,^f ǹ.ayx! >}2B<ව˥K;p&psVHdKv*beԛdneJqkZ ض3/# -QORo̙Ϻ9թϊcs3"p̛6Wc解a"s9}"H$qJ@NO4[ZYqϳ`:DVqޢ9Xu񶷽Mg+.4sկ~Jُ9vRa@E|K_Ғ}+ޯ={}7N)#Eq. Kf, <- /Czj F C< <À.Qq+LXRt<}`O`Kg+= -ofR)-kN$MF~ 4>u}`< &p7p3p'XFDp9l>"y9\pDD"۫l ,g$H$RI}עqAT}?wy'EQsqbZ_DRv]T \}Zez KU[[I(sz"XV8-XOy/rȊi=fZH?1=]6XtYg `)%xHxN_Ȓo"M23FYPՖrBAf=_' r[)tqD\7!&Noi#s+Ja@M$!ШU,~l{O:Ȋ+s/vH$ɎnL7sf{D"ä/Gua\P~~7Cg-qt::zЋbm)*w\roez_]uw}i&u]v-k) /{mVG[V8?x/*ėcia<ϨU rZh_rm3'[Dh+lNGC`C_@$ d+u"*ʥ׮KQ5A>9dbT'(c ^~g"w"w\0=D"nKyQc /iy7pD"'l7D-?C?ěfg=9louWF ?U$+_љxlJ߃@򗿬e&Ee7o9} Ǻ)@,m u!v\x+ 9y[ M?#8ڋ ijVZO$Ε[_"*XU8w8Knχ: /-x2L3e+DU"ӫՄR&T7^ABR蹂NGEy_g2p$ z$xFmu'vn3g~=DsRl2X!]֒SAj6JEKӃ%KjVMYH|umxzx-Xn@efj;乇pU">jW016PQUW t{0;11V뵪]@vy´_0L;=u`3 ZyWkՔjb||XVauz;JZ,'m=DlJqnex!#H$ x%Bǰ́:^8H$RqR{sL}:&vq@^\\>R6GR=#lٲeXPضmbDwuUcciy%} U)*sK92ROZ6mnE\dmwF< ?3cHb/s;"|Ej"bAnZ.j*ʟ[lELxC2~?12]W.żk"pD"Hd j2Ԉ98ysQwf?&Z ?N3g{nn.v[e]Sn%k_~n3ɫx m;O|[;.CߧG-Y t/^7,ݞ~N}1k#6f }m  iJmfj\gb?<əeG.vpyש vsǧZ KWJuG5[Lt5E&Yܖn%&Wa9v/ccb`\@\Db{$:*6:Sxϙ7 WD"qxCiyR|jJkz+??Ԕ -"@m=7hezQ?~ R[t[uɃV.q;'?I]o^ a3i><-58IM#@r4 G.p|nmX3ғymEBAzJ?;>u=aA(;o:.1C?)n>k_5K+ ˴UZlT[y:D|8zA?g3dnxujwI;fOs3,j5uе\E r{f絼}|Xw΅w;1lK.Mp Zү[šk/p{HsW=\$zű{+ 2— Ύ8n |8H$*IJpI*y9Q-?&=DDbnj4qw3X@zJ'~xfin=[z/~ χ@W|@kdYu hb(l4I˽vd}FKifi%W!lY 4 yaNExsK 蠋öwA̛^n &ApO}>'=jy%8 Z.0*a`wzR/GB| 2HdltshڬڜQ@GD#Emi+,,<=%;`FJq.&nm>߄85Rvuuʄu}:G躽:*Wڣ~1va;Cu"ta]88o;/-ߺ9S\sx]eQ4->osZٺ` ,K=PigoI)ԅo//}<#c䃌qzeؙ7"\jVٹmlcɐUJ>N80cu&F<9!?^GP^Jֳn0AN 9-Q*KRȋp|:@H$ H)k5ہ7c@HƩRz-p^{R Hd-j+6*/6 E~q1Xþl:+zC:_cL- /Q`sЃH bZwavWh tÄ^sY)u p 9}MlѭN:^ܵO=*֭l^2k{xA8ԩp[+JwrFurB.:a1oO8_ /C͞&F8?vjCG3;| W gϑ{~ qL5MY6|{ !EkE9G%)ŷmJzu&Rg.*m4bo}g]/w2K]ϋ}˗åK~?9D@绁_=/'Xo={NdXa"HQ֍6On4~L؈DDk cS9|t^CJ=s8ܫ12p4 _%K._3VAo>x p"ZׇЏb]W^p2wyAqn W6MW?9rDzezzꬫ AhcW/~kB#d8GGZbMtI"TmC&::b.:q?$axʟ禛nRy^]k.A:z*UԪVѬ*t~衇zBt;]Lza3۪$^ = pag>_?~n_s57.>~/ z5tH{)F4$Rv0R nN^i2"+cgaL,=LX@_326zXuYz}Z!+I` UHͣ/=?~zk$o}AH,|W!mJ^0Ҭ39`(  ›3繉\Ņ5\r[o?˽7kb]qA ?A$zyLxx F&ݮ$ }taiy+J%wlz0 y!s ;"\m p)KJ!"8.N"K49BQEmS '+Ĺ:??-b"SDΫ8W/~Q] ̃Q]u]*U$[v?*vu.Z>t}.H6ćky$q&ui=>}u{k9GDݡiIB;s446aP)&beP$5|RHHYxo_( Yl"j }=8BW .IOP1DпOgKGi092ըbxR@vS>nH8(Tg6昫S'vD&Q`Ųlc/NtϿDyQ4YUli*VԬınB7_tlH '_F'ySe\xML9CΩXDaTheG9>n]N0&G~7񍥃Wp>P۾/0cʆQQkWeb97!u]Ż>짎G>гn۽5z5T|E/kz<~L;)tvhN6|~{GDabbRpA@EmӞvhN } ׵nO{PeКn "vv3_Ǚ0VӜ=~߳{$^ԃ} @#Mf&Zk5BҺڅ q-ULPr7<|C)m1Qyς(εCgD9'EDiYgQCGc4jwau6O_*.r6nB˄sK] G%u‡~z-Mw5jwfyGD"/ ^ T74jf{FpuH$*[x6]y)7wq^qMZWDj9UWѣ*lu{[>aT(5-IWZ?|ͪuѷo߮_r}qU,e:z~}zpz_>}ZZ?uyVZ饗1uՍ{"9۹9r7*6x93,s7pxxfʎ-js+cgߓV-ST)y͹ssm3ɓnCFOR A^U{z!lw,Idy~qD@|𯁩7-[b4'[M#P%ax4MkL;Q^m]qlmW0t4e?:Z/"&YXt#5^<;rQNGW]Gq"&:# K4GlD3YD[yrs]TH8_*mWt{ԾR*z=r84-W=7=^0JՇ\/ zoT$IȈ j&|*ҵ_/ E߷9>p}"4>3̟Yb{;9}>QNy/we۽cɖ\ :8VΟ斬R3MTomefL{}31/>B8棩@C%8D"= +'F5t&Z "M^T'|t]Q1H4oHy+^t_Kݞ_=q0hЪUQ~Uk0E&A˵Ur>e~0&R#Y-?lc׮]Uk&Ї2\}wuj&??}mǻUpLx;4}>V=mVuz g(?_/ +i OQXpY\٬r549J^f/a-Df 8p'6ۆF)4=r?U}x]"(QYAپVtVƚx/,&`+992 &+i@9gUgkDEs=O{8=os,ovK>"J$"7hPVMO=Ov׿NCTة=o\_cFPn=܃Zf~8h9 poo#+W\^k۽OO5t{]KKMx{M ^^D2 7\1^4 b?| 95|SG9=T; 8Ϣ6;;_H-MO7LI05lcfB7$;f4 R#@H$ZK`+Y :02M#5F͌pز u JDAKDk|H#_CZpZ2o~yy{$"H V=`_C|(z0XKܵ]ǭ(?;Y%4M-w [)CJn"K/}z?Cuu]*8^g>qmj\g*JeNG ynw&{ lB$~VMYfB{g Ԗ-* OQ@7$ν x8̝vH$ ȝvsvp!Y;عyG8pxQ{N(qQI_W6WuN֙1b$&!6D^`gf͒Tdl|y*x?O*JչVZzHW^ٸ [-EײzH{%7rÝw3uΩ0Wt642!wuc=cV o@-"4M"QefMӣ6g/>0\2'QT&YjXfSC{x>T7D"QGWկz :ט.?] 8VgjV99UYZQOn+?1CU=?mԐpjG^k.g>hB޿}pǨhy!\s]9z}5_ =Z.K^sNz~ȬaG^E¨7u1fggWceܯ]|,YDRIV+V>3bc@elmў·!q]rr [ /B[8<5As#H3d K1+˓D!}x2w8gSIofb3G_˙kᜥ`0ZWs'hm[G-DNd4H$""\k3_w K{_v7v2uϚs_4̈́s'=&kzz@uZ1hꆫVBЛaꪫ4NyX]a}:@])~̈́0JMUQl*Zf?~C<9߁T7+J-^䛼I簋ӓ6I+0ó<71}͔mN(q[zAoPet[y^8,D@ W~s٥SVt6pC.!#>Ns}nm35`|]_Z;'db^yEVD8{M-GDqx=ppJokR_OdC_ogRT_r%<#<*lUj+Tg_/" LPĻ:å ҝb0$~+x.4;*\BQ6K]~Ƨ!?G| ʰ׊[ /`mUF5FZu'[lCt$ta rnrsaYWmVx붻*~8+P\xH$ X~=PU< zE;W\op\'RGp~㉇a\VL6y"G(zn:n/=䝵j+Ss/q=x&Jϩ"Ț(#/(\)Ȫ "7_z{]>z=׿e;#\-;e*εL,"[5\U]ǎu/6:6M܇G}޽&ރS=e!nE|X^\aRÌxzСg}J|O]|2T)SM&L[>ޤըa f.n_[?[zg?Ȟ[ rzYz`b9ӥ0H&Ƶn5YSFъ`W_,̛(WqDxyJ] Xz"4u6N?{-S4xOZ%]RѬW" kD٨0j`rN(Ƚ8"Ȑ2=%&pz?okﵴ'I?m .^n- ?K|رV'\E Zu\g:7kY:NCLk(!9^ߟ>hZ‚\9\㫋fg>W[w00E®KY'Ig[an377Xbz}/m]n]Q^xx;[Yncf兒ϕ "&=2l^͓-KF5S4Z+Jlbg^@0\6!$8sq!cW[=h}[Z@ _X+_6M`@$r`F۷LZ?U~y䅉"kl']'Σ[U?Ju.&km}:\Gn=x=T_qAoZꮁq&?mA̫r,ce_)е^Ct[}doSݎ thg/2a~S)_# 36Rgj䈍G  L\VNyE(龹-R%G"Qײ]RWR4=³j% h5*- O^dԈp,HN ?vVb\JsY;\f'ٹy/e{χgwT'y10)#r%;6$jJWqՋ_J9%q."os"·EW_mAt휳/\tMꢇmpr-&ڵ\cH׾quWgw^/`>|Xr·xW)?*]DjڌM#L6h6jOUrkaoʳ܄ScAU;.ul9p;ǁGD"QHW[[4@w0`PV[c4k@DL=eLe)Dyqfʿj3b,ޯy9NG 3H|XoXI vo߳uE^$q^<].H$ h@\ x kP%_j3(,-/'WE@9vncU3?,ʅ#^,,DPA]&9aqt3gǘ]܉|oݬo2KJ$@'[eɩ s#*nmAb HO{six!q!|nt X7 Dh5-Wq=k8>ϥ‡*E{Y`( |#}-85Loe z <ڦvK7{ADMbO3gzQ$4.&Dmǁ>D"(#U঵ tA(I@}u="Ha%9zBir`8T,uw*;_D"QG@e/lhy?t7wsËgbm& 9RF͜zR;*ʒvbTN{)Y,B~QOiV8F$rz&Os"6 5ުVljbWy/+ԛéMr}i>wAUhX\/^]78ܡw^}^q~h98יAalnHVr]H2_6?."QQI+عuMS$ xY#pmnyJYnCמv#҂xe=KD"(#RVCRq^5/VXUV7+G1;߷VC+=0q_QK)OkmDR[ξa-'~o]ۨU~nl =vl6}GHE~ؚR}ɶ)l+>tz-AI+U[xw "$iBVuxd޽{\Gi2Z殁qX{ѣ ^q]t r Zy7N?~Մw .fOL{׊ȏGUViT4=%ý_{,nenϒ &[#}=ͽsKg 9)E{<n"HQ P~Nad[)jlzj#+Doo}EFhEV')s.Jq%ii2~t۲Uj5]`HptEu)s,Hğ v}e~kJ{{x雾߳~&|5B9nsŵO~nn_:*5]]n}/&gff}׹躨(7=E&SAVKW y o^{_Kf;GmqI¯"7AsZj{{QW*$& 5g_΋ D"(#ek4ݹՅl1gOZ_cf3G,. 3y ,B,^ ֪Ui6Z^MU<@rMMU'WtD"Dd9Npݥ䗟&M#_7Ll+g4񅎈з{zuι;Tkv*ce'ʧN {r*POw=V׬CijQ3- /<>Uŵx ֵEmisEyo[r';(sn~H$[]?e~QFmpu>45'}Ͳ=˽̇M+Nɚj5Y"pN=u=-RQC\@="+ l/6knzpZ6wtJ"7TAXC:}xG.#9[.۾m4&7C|!(~pZtZnb=8"rJz,-cx!> h<`{K7܏ib_&ZL22 CJTtZݘ 2+G﫸^'}=6 ݯ K;H9|򱑬zpH$ýk].<'wtԱ}sVs@wK:0nÄyc+Rx1,K~OS칕k*#9j su][`#IaxWi_顁W:{vp{͹bc8=Kow"Gl6kCS[y(qzYF%I ggv\b"(=p!ySi t]DS!ima#Gksуnߧu]ˊSWQA>2q>60rgI7?rtus VW zv7 =#}ǀ <0b-%ISpzaqo6*( !TnbⲥTVY; \ +k,)V[xiźI'ڍ. z)O5Mj<{R{ArX?yD"3'Jp&*UB!Q*}HYaơj]DLtr5;y۸7'I"O.IJ޴*9K_YD,q饗` ~ڳ񇄹hSq}7$羹싛 OO֯Z#Q eq-\~ SDn*$a16O1A Ƙ#ԣ?XAwt,f=7 #Q֠WEE"*$C%Qg3@klk_7"]ŴƉs:f̈́7oP}u,mu As"8G%joi| WeE!I @Π0KN5"\{oagؾezj*0O,g(@gL/,wm MVr/%s]csف}زppW#rvy\e^$oimyQl=s"]BηHhw2:WI&p㉉i-1qrp!=N?ހGBW%.~Zq% D"'?:سuq%mecݾ EB2:͏}I+u_sJ\q("yWq:#}Htk kpܺnpt]9]t^jc*T +o@>E]EXYCe^\|MbVjtNorKއ)'lv>r`{.ǣ6 t}?I{GUt9cD"(У@֙9Nn):rΦ.᭷BEbnjDsPOUhP}aXh$Mp+. ~.8YB 3G8ptFÛ[P&"MoatnMw^c吲AgP](DpD"~Ov[ȽW*GYMon.Մ Ifя~} 17aN;q?kik })Xg>B7EpO +Vo9ᜥ_sڪ4tBӥ1J.{qaVDG5:jt;z^ 0z.6F_|Bg?Y/t^)VMȏt %E{q UD/³mJu{ܴ|D­IBt?LoѓLa]*;7Oef\]W9K=wNv"$A9  ]Q5 "/#^v874;eAH$Bq#y^pR:B;%$){|cyvj4R8vzaatrܑ{hTMx83e6mմ/r[ [Y8?#7xR^|q||AE6رcH&}P4/2݀K޽㌏6HI%/f'Ocbm|w\/ēm9x|"O9 // kaQelꘇ9]S(u;=X{f+@fdEDYH>V=3KRVS,eV:A(#Ѓ>6RE$8"HtI8 D0=2l.O`Gg{]Ugdlnz=ԁpr80^MS&ZM+ṠNZ p7.|3/dsxGx =6&0>VZ%D82E࿟v(_ҫS~C}.!]:\tr$Q_x=rJP=k726?Hƣ=GyQpo9 Sƙ ZvV}#[z䅵Ȋ=̉qn L3%(vm5_8Z8ܥSDvh ^"W)JFVXA^RQUJc:̊555^#!]Z͸߆R/E@IWԕfR&;Fzb 6V2@o!@8`ai4z tK2ݮp]z^BuksSa?ydL77jWƳ'E6M|;7P;z1+W=c;.0%,mKyY\)e9A "x;k5-#fsz}0f2X٥ ǘ3KCN34#smw-'񝄹02S+ qU$i;'*yx ʻ}q)%%fgW~FL:`Å>ѬԼBzp#W"U4]dBЪH=U!|BV#b:F e1y;ʄ,@3+Pldy0a^]Xc4F I""Uo֋(eDXҒm;n'?kv\^\>g53LMosU|UUv\lu674xU|`{.b<Ǿ/3Bpayyg~>>QݜEH6į#_!Xf~] hU\Dz=wequXUs3+%Zʹ8~gU^˄y T4c80Nr^^::n~y*s8/W\%Uei^ݦڟ~_"GcEK=1K 1:Pjjj^3.0犉PDBTҨ{#pcDgM*&BN^`߷nvB"_Z׭Jp,6 'Sf-AfYeV!Mݞ΢ mۍ68{ul޹=,`i"rj^g+I xԈ$2fy<ioVI/]?L&JwD_Xr;YZZb:E}~O~[9O<^al$ *(FY"PV|Rq3&nFtpޑX"?G蕸zwq1q9hQ9%vi`}HgEjI@⸎(LGYWUxbv#f2U 8o{/ՂL]Q(F<|!f)O[9qGi^ƟUp^dIY'b;βVkjj菧Vc74/l 18syH:t4|'_9I>Ks$I:O؜Do=R n|"Md7Z%*DkLֳ6˃R!}OhƮˍ$bn`)dѣi4ch4?[ƾSK`c|n;߁sWwy'_G/>PL%U{"S"@'?~=):&ȡA=#NcT`h}jjjj cƍqT\цRX]$@6 ƴ:ʂ?^>(#sJ+R{D ,Ax[oz#[yd&vzE?n``"Z>c&C]j@BJ+qS(.{1&y$Њ;\1 E8z˽'ɲ Uaj# 4Ŏ`c0%+ f;)޻m^hB:i5-x~ȋ }\Z8{s?#Kpxv| @ҶV@x|Iij5Mnmucl3¨zc BE*F˓iQH#nU蓬`0@p .ꧺl^QDBu6*^U#(>qcB @P-k9zFlr{h(q~i4pW'b49BMM@8 Gr2~?lw35+W~w5',EQۗ0 W0F.Ë2 l*󱝛*k),(Y݆ }ɴGf3F̩;e.^[QoMq%qbsP!o[8yCc P*zg@(Q\Ҙ|@jjj^m$/,q$DD3X{>4.N~M/+NnRcr2u ǑFCZxmvOYV hA۫_ V~(xER4jw SgRSSsȋ@4"Tܼ%onG?{6vEZ{t<N?[9syyS?&_xD""; s2ƴ%CD8GHӄy L eqT)w7׈5Uͤ}d"XyMMm0[[xbor'oF?sƃnov\{|[5aۑH"RUʳ,ڵk<3B[8Qɔ^AMfq /,:l~/s0fP-oQlSLтgRZGڰ^::uk4{q⨩Ȳj|>&ebb;K??(&M$Eqhi*O&41Qir4{<\_QilҪZ*J(Ya]Iyscs-~D`exv#p9zM~syqc "/_#y__珙,F.򅅅2VH/Ћ& '9u?Msr0ԞV+ec0K9|*FD*Ɛn#Lj6 T bgw=AnwϜ_Iaw#I񁹙_NSJ b"845 Nzkjj^\ izts/}}(Wt :eی@PPĎ=dE( [42{% ww~!$>`K+8BQUx;b6FDD7AvfeG=qFPo6Z$i1zGg82?"G8P@1;UhϷY4|1=O<]NcQEUiZv::8(555@rv9nDtqɤ=hDbb;X϶̙$f0Si`mH{/. ʹbNPL " x͘$ߪR+"cymD2nHbѠ=vAŘ^̴x w"4 VfO:G5 ,E(vKfaQ55"0EUEҷ]Ggar\ /w-}-Q$pΙe|:,gϞ0{u6-(of]F4]N"v/"br܈sBD&@5mN6)ZhkTPUn {εb}*֭ۂD>}$ )ٌ-_Ԝ!I@zU<-"Xa(cbdwiAsmgsW,,ܖr%ʹO}w}%`}Ϲsya~UI(ʝ(-r9m q+(0LHHkA0gqWkɣΊ9OԆ Qx6f(O(Sd\xxwg~w;B͵qlATև&;&͆`;kQiOrea WWXZ-wNW{ 8m.&irՠwǭ.w/ 4Vla[ĽwBkjj^/!0 FDaUtHHcƼL˞J("KѪ `^'kLGSVo0N~#AI=&q!daS 2= ni4PrP"DG=LӒW`YFײ[i?g{F|QG#-*"bȩ}\]Y='fMgYqAM SP8H%2b_{8ugK+dUEM>g},L"N_^nטVf VDS~j6P:BPhƞ0A rCjGՉ8b?e<2 pCDY*!a?J0e8lc8AP'\eW ZpymƉ1-"n7ڋiy&b=" 'LPۊcT5O}8]nelIXʧ۟H7`)P(^27AAdSu?ȗ]M2SfZ [)Sc:ˋ}^YDw雦Yw!5ѿ>5;qt;6B T`ƅpuyȅk<5nzFMpQ(tIU=87<5]\ \\X#F1 gꙧ{vy@P&Oy,EUM%($^$P9 H%cAlri#'+tﲺGߚlV7FѴps\nl+:EP[s;Ȯ]>>z'df2-&~`dm7hx{#Z兵9ɗAu?MsT qIk @oS~%ă/󡦦F `F.vPaBxZ8fmNBUB I&x쫗3óM. g4㜣N MatL{T5s[ЛTk-x0L2flvz\VԔ4恓s~ 2vj4g:-~Cوm/jzMx]P@D4Q9;"/ jn [8>.rw:P7 !ie8-Rm 77=xS{.X鏬2~AG4 Ѝe$HāCiNMHI$tۅ|) O<l!IzϴPۜΙNJ佅> iMYM"nL(|98KLwϱ^Lm e{dX? F,/~lv,Y]09*9 i>}UGo~%7l߃l mxAsMgoTJq=MZ[UK<mKyC&ŪRC2vIh/YNWvH|jXṦƩRYۇ*NXOyP*:P8%JڈÉj"ۤ, pBPwuJ(pYk>|UF] "m8ϲ7"|udyƑ?g2#3[aM)T985"1d`s"^Z]:;WaR*Fi>TZIL3Mn*@^'9}iO_kPyCPѴ KJQ1HpimNorlV:{$IJ`"|)"͒ f;qՓF#ks*s&6 P㐪2`6i8TPhǂ/&?HLD~;I@ 3*GFKﴛ)4מ$Mg/.s:')G}% $2BTI; F,NRn༣f2a5@LrhxfM e9aJяĽP@{Ǻ*+cdӌFpo`P >F,NQ~EJ\Bz(RP;+Ia}l+CfMF){?"VSYpya+ͼσmLx8*\/(rdy}S'H(([ C0QD85bPizϽwsXN_.:dj-_ňMnLL`"ʁ0AfYmjO=}-L^"Ř1 cc#*g `["uFsđ+i%k8b^`0Ρ;Cnm?EJ~g̓m6mu!g1{_'\h@2pȧtfEk7 ΉBn x3M6qN9Y̴i4MG=tܪOp1_Y~[/D+0U!Wh n zJH{ T\Fȣ(Vjjj^SvKӬsЊmQ(Ή@yk\[ﵹU@y0[^/maWjr/L8@$[UwB9=tÍp3a6h&i'g4/][F\ߪQtZlV(qz2DQA;y.,ڔ6N_Xȡ603F*FT^Qr0T^iow.<瞿x۪n9%@!2G_e ZlxdJ-JlXQVpzyj1Y:6CʽfA7-X2Ls"}n,7|+@LQecY[_jDafyx(\`qyNaw:ng-rmqcN (/s'\Zz}*B|\Sjjj@j^|Qv]FB۪Q`2Hbu3/8.8"e*!24n3^!YU喈Di'9)E8v.7%mC6{Q8BЪRzuyk9dmq,yj8Ԝ!=xkNEogũ61J;灨(SV*KKɥ+/El6FCBPk$lTb$Yec03 ɸ ,[ d(]/[5 Xz"o2-lK-Bj vTBpϵ:4Y 7F8zu*P" ^"'K#ˁUG^A9;Nx^:k9:ڳ箮1n 0sDw6y`2^6j$CK\эe@Xo&( ,,S}^sf >w~6Gהʊ| =/h$LʿfЈ#E@׈wnI\^11,0~c|FAqT3Z!g26Pq5kXM} `b|8nB{Оqmaf86K(;m쯮 7o-(fNʺ< au gՋp٘ͦ`¥56ks*ln+TNн=wLPCNeMp(A8p Q3D~QUKoa!W`W(u>u0.Q=4ceI؂'֯f`'qd,.ȋ (Mpq| f\)j!@+֪NuB0jZXP-4-ffO"-BнgJ?2Ǔim9^j-:EwkzJ>Y`'6 K968snxsɊ`#qgxzBs`I앸MTˋƈ4FZ%X([;Rsۡó8u#h8-mcc`~zOrG8~tK }>y܃Yy:yP 곜y=/VQs8<Ӣ.7T jC-ZF5v3 \3WeV N myeٟ{I ;G;$ƤiPfܩC&1>qbE7@!=Ξ4"׋s e2)JG"go+TwR ,We`]݌mʍ|:%ED;yBJF~&&Л^<Dlsum4l,[TLx= Il9ܜ<ܱ]ӗ4*`g^ WN~L7G!KԼw۱6TɊ Ԉ$ PÇz8NmO{ǵ >1oz8wk1^ `)q2,,qo ƘhJ85a\ַ p>۵ :kʶaei͔=A{kEQUUg{<ؘ(7C̙טN2'-w`g/ཫF3j tL7fgyYyATWWz- [^3dtMsPG ݄ )1Li%jRBt0@Q7\Gs1dSS +?m.)B+ Uo4+,\Ibɭ,"[-As(!P'i!۬'mLH_9bz%rjzNhĉ߉C͈٦̪0+#]]cqud*oN;^'IVKg髹0< |8.4 o "XQ<>@uFI9n\E6d&Px90s݆eJԖn0Qdq䈼cف+յ*^Xu7σUGMT;vf;fT;F|"BP:U7Zil"Y޼Pz]ZX3nw,F꿽FXj.k*wblUׇg֩i`yThLsdYnaq 4sxjHmyĸ] ,d{Nk)/ Ue|Ϊᄍє^6[~8!b NH_ sG92K& GUB;iF̷#ɔY4J}gAp8yg/1WiqA"u_~{5ӘC3 :s"J,齑&׹2b`84cw!ns}y5)D8t֎c"_ϸ{ jjjj ܈q˒Ti6㪂Њlq QWB9R \)BE^#a ٙݼx3ȖNݠi^yH 9'kżZ ts!Zf:)3&v9 +-w :6XwnOK8ӊW#ᄃp5/WF_^.~D0DthCuq4șW'M\˨Hsy^{aDRcBiRr!:81Nj}ecjd}kC,܀Z;(vLfoƎVl+8'ĵ5Bc[r8"pP 8}b.]YeV? aZ55 'Bv]N@3&UVYHXZr:g5z "g;?Ԧ5'/_Z`}}Ĵ3\U/z;#s6DeFS'_<p?Xz ʞ)G%wZ kDZ$KG5zD[\N/)r\%^t0wb a |<§ϳziU}🨩+Xʅ6ŻݢIiO#M@7Uŭ&Dw|eٶi^Wo79'[q۬jzf_%++7l(TQ$jz5_\%Jε~3UU{t28cymŅuF|t4X8 fdM[<{v-.s"2P׼u:ңAۍ\ F &41i8mܙkƻm2bv*{ .-r2"5 7&N F@:/ʷ}"Inq5p. ~N _d`<9+fcX/8aKAZ=C2\d[!XVQO>^S! !s; p?gf~w߶~ 0 ɻCvfvMI $I.}Os-%cVzb!pus #wU@MM-k5ي%l:/tXiFTs֭ I"qnjJj8GDnSD z-F z<ߩ*澲;Wh[fU(.zg/F+v/Ny +*|H=!4hIGH-nj.]|^"𦇎oLWIavnBP;e1F)& ET!h@|sԏ药_]`:gSD\e^4xG8vSښo2ᣈĻz2'}"OyQt_ײ'Ƙ+EC O;>P_SOx oX֥.NA*'im7p]kO\Jp| -t4]|(?{,λ,CW 55@E '16IԁrȳxZ\WWvpO f0[%ݾgn Vo~Xv\Q䷭R( 4#%vT-Y7Xc;eKez66"BJ6+,o)P4:k|p4gY<c+ l)"yŁqnF|" 3" jg:1lX>yO ~#qJq+KPS#m8'IKSO_l*2c O~4!J~jb#@qO+/*"O${rzPP0fG8@f͹cƚx։`gZmO^ixOAyQSS ZMijq0sW ĥt/g{Yu%4 y>q 9TU>0>ʹ<*+lKPAU=A_/`b<0e׍Ibo}LXLސt[)sT;츩x' "6UV7LznBQt[wv:Oǀkl_4_o\,G(J-4g(Q RA($8giD? Ea9G׳GyAo|f:>l$cLuE81^:5ǽ'g=*V#챏vyC$3=i˲@5w.Ek >{Sn~SYMpq?eŷ? GBΉ.L JE.K9"ʡ%6iDQGU~}qxP19/w,W A7*@6K؆YvB+[BUͯt3-uU"R](hn;-읯DzuEyA@nLRUn Ul@@DmajD{V<_mޑ6<.@3MhU%|$"y'C^]cmcpUA?@DO+~Nd8KEC<~lpxqԈ`=Tj} TUGcXDe*C(<ϭR~!y[;NC,c;9$cS?/}8Ou  >N IM}|~7ē5XW 98\y=6^O"+G6כw@Rw +l9ᔒ_ j7^d\/5(Ir _ ?t\%.NrHT sוr ՘mvf)}*?wy;$"R3qma(O|sy(_lИmn ja3ge—p73O##TI3mZʹPe7l @Xj{p^wE}9T]D9΍0..Okjjj*htC}n7Mrz^h%~_5ey<)jum֧Ns9Ǖ]Ռŵ!W, &(B,m|V3(m5^#֎d imQ/ smy BeuWU& !TFÇѣvKC̷iy(-6xqnvT׍9gSW~ӧsWǎq=G?~Qi.,qr'oνa[C{Gk\ n͔ǞO\OHx.=m(ʔnѲ^w?\d\=Nw.:k ?q|X'va+js5BX>X H ܈@ױd=Hw'JU5OSs;[ UÜ*Q_;zVlmUҕ} (fJ{ՃYlGv)Qr r:U'Y.'Lnb_-4wEvG$AQe wDYY1bED~6$.k6w_贓~W/mw ykOGNh|Z(rc 8?;h⸮D6`(5AݎǏ[*/{I&.\5O>jo/^Y'0;ӶG{k[z^,By](zD]yUu_DΙG>du]؎'9qlf3%7:+*X*U&_ܻ'J4+ p6M\X97'#(H%McBPhǏmc;w`: \E c ~^J^&5+Ѐ |'_= -lz;3=/ $}`VdeP-{G="h86#.\Y^J qdGe6 ǚEI%=*!!"P0AosaPU=ʅQU1nsI˷*JrܓYW6XU}uX#*X@DOy'HݏZ\ @[@ܗ>=5kΛy T4Jmh*Uo-?;eEQؑ9/5>H-TYp?(ssd2Cs=wXYaG6z䬚2zq}3W-$v'l&fn6bBM'9exJ*@$05baU~  [/Ps ia-3u[ '"ը>t R; t<,8/9GZ҉) KkC A+yYJ3ɇ_>.a{+5l_Ueu\F5xl{ r{ow^BDHF>ϰpsϰxI.?qss=fڜ<#=GYݧ~۩vP՝ǫM ~KKx6U8eVL@7>_~W)xwu~D~F.N8v1[d)?~+{{^O{cԸfaoU(GvRc0-LO4G&e?S]55@z\@}6Bzлs}W@; .]g_k*Y^G{݌=BsH.qF?QvDRE+xMq$H^XT8g8箳z:mArE*l SMsrePP͐嵑vȀs "IVx~6oً3;;Kvݴ/ I@Eֳ s_5Vn~sKǸrJ5#@!ɐhڕ/r@ۈv3i'gQ !6DUGsaG F,/:"lǓ &1{Qv]<8Y %+_jjj~'MnDGlw*GA)zE؁G@3[M،6O}.j=ӬY+Mr癉ш-3ժ77؎Jv&/vFA"& g<8Avm. n*G~k|Ȼ|>ysN,'viQu{r쏚G="G?X^!ǀ \#ߞ5xe?#ӥ9Ԕ ~D@Jvw̱{/rn E]gOqw[һ~WQn5"PMAxРBbRP 555@imNc?U2 .X)Ǒi6f&K6Z`!hJ9s[M9{DzI\G1  yfǏt9>cvw({SSnKCCq+/~pNG>7uR:'(}~<8ψ aWʯژU(Y@AMMM-7l۝&fsU (Vq~X8b'MgGY~]f;wxCD 1ŕAƮ(DIdqB*yap=%ڽo}x(3'ķU,l}f JJ9lcfSz+Bʕ[^'Y܁\[c/΁wgjvcVŮ}鿴4Z摪}/O)o~VΫp%'*q~0qKӟce:ڑO&6|s-;i+G*zp Q/~⌵;qM4[jq~|䭾7o1[nJJ9trOquqr]OZC^w=@̶Uիsj䋮pt *Qz&E V?޸J4%r'B܈d,bjcv Z7/6-h6%`@Mͫ;_"&NV*=7qNUؑo\4YiN 6.ǂ iBIDzHpevhtNU)Ğ vԌv畵~A)11׾?G(fDujWcc|D-O/ܯBl &+8LWJ `Iiͷ Buʀw-xxM;AYXZyvL7gst5Nr̓1z@6=ӌl֒YDg5+u_y+u'kTZƫ9F\F" eo>YEM#Tx'd~vzWvKwLh֧evUhJϭ]p9(/lǶSamv-(WD{U>rI|pwr݈Ͻ\BxxhmGWC(ⷜx)ɘNL#X/o.mӈվYEzM]A-6whvʰ8Hnvc TvVd"e+"&2myQTϪ-ģZ$ \%CyӼ`ymF{o6(mvUl`W9lhR97D(\Y`",(VbDF)ȵ}EwxGjnpBeo")ʨt`sEa¶TW- ,' ;koj &^8}LO><1Mxtur!v(Gp=G*Fv<(־6.PeG0_^<6$]9s>X{R}mmz޳,#J|Zh"åW0^h*}>Bj)ޙ`U-_Әz#>YVo7E,sjH$˫iJ9*^ ۭ^+sVR~xTmß9q{f_1_uI7}1=tryq:49ye# 0c4qlry+5No&ЋFwR3Q-lN;UR/ `;I3(zS{"U Ea!aF}"( άO O<yL@1j&$ITOre)XW8W`c\>{'.pv`#]Ve}w8xK.Ue;& 9((&#u.' -_y6VqU˹(Tȫ_to'u]Um6t f;8~c5+LY[l>GAyxFCxSl\@TTGy GN9y=h E3!p R!af{'ȁ?rԯ+uضޞiت{-@;+z76fOEueJ=H,zKk#e0 XK˲#╡JYUb}܄++3Y(r͐J%֋" !'SBr<{]]:'AD.Eޝc9O>;YD^Y'9q|ЕDwb aOu0J6dxÄ睊s˗/! [__CӍeFKW_|).p>fA# TۃCͭ<'X_LSpf: )E>8a7҇^?P|ٟ~[EVCOSʐ8qGU t7/uyJZRY/jƈqDQ_ L&Z80Z1Kc# &AV MMiiQ fiU1ب_ ڱ>9DNql8Wvھj(^BKq=E9;2m;dn\{-ǁZAwV XF J;Uŋ vE]skx/Ot;샋W?|宿;Nx'9|k?f:gPUYQ(q|^Ib};`/ozӛyqs5s>zRlF#`ߎ8-r5*ŋ . q8# bY<J&ȓ؛P?<5ɋW=k1VDޱLQs;{P8's#?)_=}xeWU.X ۍ\,_4{EW=&Z &js(:?ڽd)f| !T.!ġ(?ə t'h ?/GwC/Z"mP n6py4rkA3RBm&j%~uFu˔Msif,LDz%Qn(DʱguJQW^"0e.!";W$,ARJF`EMۮ$'rPVsrb,x/5Mؕ8J1fNѿN(_v#4c݄E*T{!޳x~"3e٧.hjӈ.IADď/xosv& Wǁ˃Uk)&ҋpad}8~~^jjj^ d;T8&i4[ "g<Ǝn4<Έc*1e6̻t`]^Xy\ܸsˏjWmiv+XKDon_ߝ \Q 0 bl:ά'ŪNiշ 0aLUͶϬ_rNmCȡw8[8f8-X a8Q&ZfoW~ͯ5V*"bl'M;^x<6;h4i"&U.pYS9#C!5Ad󷿬K`"{sqY^"ekk6|U,*=s ߅A "gy Iy罼`sl櫗W4-:`}m_KU* um޾0CRQ왙JV@z5GÉ5"˟iʹEAo_F(Uחי6;ebb/155@z\~N"3!iĠ 3R( "zk%DxR\wʤ_x`?eiml}!"FR;,Λ*;Uj08h[Ep6Du;$KUA!H ;}sa+ "a^6&7K$4S=ǃ>hw87B {_2[ [D^M%  [3nʱOMy^M( KMr 9=܄@*֞/Db^wQN βX8ߡ&&G۴IZLy2{ 3`Lmީߣpoۀiߜ{fE^p4-s'1s҅EKpfgmw˗qf,&1^ss] DAx6Z,1YAHݠk 6+SidJk_XE" `Z"W? iКiת6F$L`3B1.lؾ h&.{ ,Ap!`BM9rĉGu^e'/ ,/؍Ni:P^QdZ$Wn) >CDm[_ ϛX*W^9wJʊ\/2( s"0o9B娳LM6Si^m`Ȧq'}C(v~E9<捯9fNEEc_N6:.N+`m0D=E<]ZPj^4~-я.4U~w9S!-Pmu۪4KH'T(̱YrycM _~㗄t7.`"]؄]GCw$zҌq#sf J5EF#;ZQXĕ/SzZ|6/XVqL8R=L\Ӊdj%#ci4DJwy;]in( 7ҷILu '  g@[\A휈VV뎳*=K*γ,Z/"0/mTDLE["I";6Ӗt6gz9qB쭽 t"T cs G6#ƣ)yaUnAXXs{SG{<|azq*Aq|`vw@R}p4UB>(A`ojNÂܲ.4EЙAİ|co }Nam;b7ΛHa"}C܌-m6b6aDL I'. |-^u|.^Bjjj^3 mPpLok*G!X0Ia!3 k6"r\m6qh47&Eؕ"+X_KѲ/P,[{[KI^7>EqL{_t㶢#-,"K{Vv/cш { QUXN@AgkY5FӀA+° `hQp"yg^2q^߮: gEʏWcbhCѸ8 R|G^vVCVL kkCCƣIYg#aW8uNr]st[ˆ6g&_l ?R= /57{PE0M\4iBasLrp1OtOڜȧaq%̶x]1YvcB!i5#LOS t+ڟP r=@;(l?< <[=I[*[h\$sUQ5NKBX9HBQVʳ,E*l r& ,Mg>5#LFS{fBHb_]^lBe rM< =/y{dZl;' T}TIi <4@ F˯~!XEF jhQ/plh>>Oz;kON8Ao}$[9`=kkkr#ф zًDe8Q bx ^ dhG@PEEU3Un0k(kCYǀ$+]Y.'5i7c""ޮRّoyӌ+UHmP8r A /95⣮weXg?YF\G)ГVRNx0|kG(&֧'q= 8Pg 5?8P O"'hXR`x@D'2AAB8`hQD$0%5+?NƐd`=j&҃b"=W YM("ބK[ yaL7)ǡ9;GÕ8f xmbzFUofj8'\ pHn.;ͤ2 .\@R#JP(JiT0*1? ;#8uP%ilXv/( UGÅyPfj6QU ,#e#GH􎩞GQdV{DKC}@l((e  1=A>g>r$HNPGPyڍ;LG"$Ǥ;UB^i>dai;k뜻ơ Gnn;5޴+xWeL$c}0aqekIἰ*_=K}Ӭ8J~į?M%߈xgym*I3*DqdƐ#=|*c].#qm6>v֛E=T#)Ezb %uxcSkw2[^t#Ys"B`;X = i2]fffffffxpax 3LumbJ4#{Xlٖ!uVȲe%eJ7( 8и΄QX(.4q^ޜdT(i[|2qmmzm943cmx"8Ɠ`B=99ؕx0IetfuS%7lc$" *"BOBjE55ʁPuo'Y9s`cZRmHG]ȑ{g&Џ<7"}} *8A~¸2ծ?U $d~9gm>aJ9ݪzlxo9Xe@PG\*\,I#ˁh#KRe,/XY鱱9un0yv#wd+Kzpza/w kw2r-jy.5qƄJ9:4NOJT%,4YZpB5.ѠVGdFJoT}ny{~ƈuL8 uUcQ+0\5If<nS9 =Jôbq_RFKK+[!׀}?&tdaHpPB Kt;o1Je*aw5ofsw.+KQRt߀$L+KJ˺YP2Uo*rwL&ei5iDyHuhDmM (0ͨP8GVxP褿IurZyW&J)"IiP89}q.@it)Cz=b@>f"q69[}6 rvQlfSD. s;r yÄE偢yM[YB lnqkJW[Øt Ҽ7) ;mḑiy+܍%iĺpNbP3|t4(n0hm@ыM+psmǦBXqsՈ#ҋqD?B[ZpZ޺qE~~isKĨl瀗DCBɦUHpH]/:Mo1X(Isڿ_Ͷ]g,s%Qޓ`w\#i Mo|SҞ6C8J'3 8rJafz㕰7i Bq͹ǧf7`Y:>;Q+K9SU{.z.LQ)sa.L*eX4ꠍ~PK11y1W^W_8v n z A%ʭ}ccknN#ŀ~J]re&Ļ`L;{y .,s~u1Y[Yq2os7 ǥh}Ήmz︽6Zæϗ m$1g" )' lPOj4JSͬ &hM v6m)*w26SOkѠ2kCAy6pZZZފk9)!1nI;DWtfvc=sT ,YҮ04Dv39#vDVZ2:d)9靎7YZrX9V&֧uȻK3W܂bSm#r|q.4bH7bq[\ʰWs"={";œjofsCw5`2ƫu='_ FT&H_ ui_a\9Ua/y3`:Z)1nSM;N{H>+TMsZ(B'^e-TJ/SV^`p" t_).|9z<+=f"UUr:Vv^AӐLE LAf[5ٞ>N׍28 s͇CɶgjKаDVd6l>6h2|SR_58--@o/bjafE>0yTgiu0yAJt;PTscm,V=D\$D0i^`X18Tʀ9:E7d:sUMbtRR`v?[u_缓g0fq&/ ݲoJY>&~UJœ:4W?eJ\OKL`Lk5éW uō !0,%C䞥[h4{tV5NRϪ^DBĹJ##’xɒ+$z0w4\@ըB&(raF|dZ1LxZpsRn`\~' nyCx<{PUsϝ:`Q%:gOʪ=,./6!{"y` {EKK qq0Z` E_rGѨsc-Xi>xU@ jz"MSV>W@q"bBOѤ/s6%%ҔPCGW9ciiwbwȼususn-#6Rn=U &M ko=n;{|bD!w620]Owa  +Y XrhFs~9\{綝^tqBbH_'8}(_|eaR;[ٯ%gqrcAk+jr@(+MNN&|^Քss m.+ͭjhnE{.sĨLmq^ޜS )cN7yz8Ytf{<ܲrgW*54g%fU=ū:?(yR |} ^L}*q{,H !+_|F螕jz^^x0HMVS IO@h3SC":J3*^ztx;<@r\vy8G=`:\m/ Cd6d U:3L@o:,]^0;ϵ"r`ܿ~iS|!"8[섪jFy^kaRx Q՜jw9TΉ o"+络_X`JmAc,tΪhjZ|8t^Y&&t۩1QOzy8CFbCVrgӎgD\yUD3On= )i'ͅ =r/hI!oya~8}Fk&'zFȫ$Q^n7 LQBgU!kzݝ>Oh/Cq 9\:GUȹˍJ%VRn}Veq8 "My MR`6处$;E ]Վ,źb96R|F#XfRz|Oۈ*:eȶӝ V Qx:+$fGAgfLs+o?x:R5(sܹ~D)~3{޻69w։vu]#"/ˋ%Dg' %"" /8+gw'dޙ(w8Z ܢAJC?H= PU[w_od9A(>ڂbNI;}7*W}Ƙ/\9;nz Ԝtz0?a--@i]uq BtzF&8ss\z:o8@02Nv"23V-7Yi2w=Q#ܛ~nk]cy)OgruZ1NnYC'D e97q=lT*$&m9G8O#12WS=륶T[*P}֟}7QUMYc4}z\㜛8o 8k xOwᩤ+k䒮hsW,F[AW*PPF~0qνXK' s =Ȏw֝w{7y&Ӵ~1骊Fv/tmgJKK+[@m=lrNu88i&;Rds}x8]usE Uٍ_4V Qxvu}-YrΝ*$""scqw=/w8}2BQQGG#D_3Nxw6D`bڨw [#uK^M*4DJ,G 9!u#ηSj6ᓺk)AT =OiO瞍ϿkCD_K˻jREUe6F6#&+"YM*qbAC;#U֭PRssC޴  lB].sUDw9k7yKo n L<3_;E}T"v>K}&J EDKK+0Z6R050<&G ~0¸0 1ID"a> Nd6=EܿIw-ē,yUb"& hLuuՄK9Ka>nT־wZ]yL 6/UU.^XOkFG||ߋGfgKKb=;V Ǫ&L&pD51|j AnܑeqPŖdb⼮fzUriqkQ1DRp%&)"rR_}Uq~>twQTg@i ![7xĨ9'8!7o -PDO=^*6oȿ&%koܶTwIAE3h`)+"-"QU?0/嬿̳kM""dEfrgɜ9RU_JKK+0Z};935XTcb;嶣M۶{<_Ź>Br4 v>8JN`u/c+ZArKg Z(<֟Hw&}?W}W9"r"q~ !pbt:FGsΧko "-@m2DolNP|P2?VTo|;'KP04Ĕ.z >ӒBxVUn w{Y^syͩ_yC|_x8>--r2Zm"[; o$_x\"B.J J'! YCnR9ZZYEĹX(wM% )qn9G52֚P<7tū`+46AA29g"\ꈱ)4\(BT̜߬. MBHgÉ?(XJiT)y?}82n߾?g?'$h4(yn[Hs@D}ccVtH8q^xaF$-c8;yN[: p9}h?e؟ o?K'Mu5bS[M\j"~wSkVޱY}t++t8HhcFe*?ԴKs]Y|>X>7\qs HeXw[+qeVL:8fwAW ;hCP_D vc$mnk yZ{DsK;ZU4 a{1w}fI'D9 Ի6co^"F++ˊ RG:>B8uw&] s?x WE\k{^β{w3zJM8q͜;ZDɴƭ ^]c<)qCK7~N$"g/s qI\|" 7_@,#z,N~ pw1>tUbG#V\zr*ԌlΫ]Jnt?'ǟ /T)!"+w_S TP.JL<&~&@uƓqFXWU#H2r1>D$yOl*W&X  s/`B]8p/$憂71* o9/w sDUΖAsC&QyD0:=ɟ&UP8ֶ+X󞮫y~:\s~7oݞk7sm"rq޿ߢeD{YN.ѷ,5{xAkETX+"q/\GǾ7򢛳|RN򒌮zUKK[4³z㆛#Bt:(PUsKjwBwXmHLRrT=[t<]b焪6ibۦc=N`4lp(!@,3^r/Hq,WA0d $Ĭנ4ԡf. smd}za?4*;~&iIj>ܐ^Ri9ts?'H!mN`0( 5mFcm<ٴqQ@~!,PZ1&cTn onm_--bg1λ/nL~읾~{35޺lhZ4q"~O:9J/'k_dҖ<`K~"XD K=wS_9& DZ%s;%w@nw<5TV>-#~7㴑$̛uP@s(Ϗ5\Aϳ=CT[119ф:U̹!ۇY/3{4 nA~gUx VkʼnˇחM;h{_+~__ڄuo޼~β^'u[?Ac$|r|±qrD웷7MoX9~7e!CY/:x~O_ oᜳͷ6*<ȯǽӁ}B2jZZZS?/d<ҵrC(QM* w;l^ 3b};PXRxR|p"Z#v?M[r})rw༰a4LD'RHD0سḶr{PP6O*9USo8&U=9uy>̙ wuvLƚW:ݜqIR!=ߎpbkCKK}G0gKK?/uo}M@ωǑߜR=0--:l"}bgi*ogxz5`GzAYS, v3֔eJnTi 0QE:7Tc;;o9R"صYb.fPEnXs8`84M}EI9=9ҷw(-Fэeޙ4 e~i苾S*EQgysY&|Mݏ1Cq|'wE8."K#`o9ZyH"yi{c<sH`#,#Ԝpjb9-UذXdhӊ иW'3U--g\7SVy ǝ5]tU AO,M([vIxppSCQdjtsxpx&G17$KT1NiīFsgFI#E8a;!+N `K첦uC^$ asqҠn@%[I֑eZcs:ju%hqS1Qr&ė|Ų+EO&[G|9o6SUh"|40Ll=Ĉ)'倉rYٔfD@ P.PDXo~E--'vê,<---D"!oȏ)-ȷVV͔YQw%[3u!Ͱߧ^疳Gs5(&ʽ)9C`FD[0GނBT 4L`v9>t>T^&yqc. 17'ksJy [uH޺0JHaQU`nɣ$ĭl\MvH. hUeBׁ|#.*&'a׏'UedZ6{N3{S2Pށ/DbC뒨T hi9HV!@iiii{[?koGq bb=@/"(b}'NMwߧX5siVwgPorPK{7{"Bi%ELNA;J~A;/ "y R9'̕7qesjnmpUNN"rƴ̖H,+p2›>"y ‹p&D*M"&]8Q.PH $ؼs[z\Cfxe9MFTG .j 6L3(r[~EZ/&g;8f |K˷+6nrzK+HG_x,C0ieL&7g=Km01ِS&%==b@V(AhuTu9[)΂YAISeBg0Uߜ1JOExp8'2QmsUmœ 7gGjpHSb#B?KA҄pqS@oi?J[ e'- D-Mį=y9Agv^'n0M `vUuX3B 0G@Sĭ'rxpZFa((9F{h5&G;ucl9ִ閸7s/.sV|"0-Mc=A?v++鷷*< ܷȌ>)Qn×Ι;d+76Gܾ=cJܮ0$D8;=yv)z-09-"ߘ,N;ۈ내 VȡĘ6TvD&as݈L|žܿ3}S1;}X wԎ1 B jpl6v_n--/6殮-H_~VMAI%]'"x@k,]IXZ'"JU)6%3/9wurgzX#FƉ`1ytlDX\8;Ƚtf.@?Հ@\>JcwrZqp`km0NkR^suP7S,I)qW C,aAY}_3>jk/k[u`&]:™M}źfJ/c3y JxZ3UVeuȿ -- x-m6w M`'7)!L4k+bi 3LprVv;e6e2 bP&8[e 9өpEnpyϔ&NL+V|r|m}Wo3MLϺ@|~drQ pJ-$gVrGd[Ljt uB@82 ``ㅼtC?S,SRi5BڏM#_J[ZZZZ}F#"ԟgGg13u4sDĄF5;$ 0:'V-"Yu}vmB;"-O¡H>) vqbbTEƣW>cUZe寿yq7 }]Rrv8/JF ǧ%(]~DZZZZZH"@bOጱby\DDτ;){^op$Eۛ>}9V6io?r[>Gu]>s!)UpaC?cX5o_]5 Jc߇^A(4(NlR5 "$A} <: mDPSVF{꽂l$HʡmV$4~4{{c?x----@oioHʽtR]= "]81rpU݉pf1ܪ0?v=} 2q.r<)3N2l Yu-$eVY[|q ߧgw't湉!|f\*D04u+'lŖQ1}.p?uw ܶ`?`¢49x$ jq`\Z >z[l[H+c0T Ũodcp %<e2<\LMuޓ5#p4 "`BQKY46_@͏ |dc^WD qͽ^qpUvsKy,-q֛6ykLա\Urfvq 3[@)e*+`B I#G4e" %Py{prBzTI0$!*w|bC+eyi/>x| pinyfmQب\xE:CPg[;~t¹< Q;]fiڛO 9Bxw ----@oi|FڭXg KS\tF>U'!_\M@gV[g NcO?>oV/~ϝ\ 8Y\nCfc?=um*]~z#؏IS)pIb#99}[|:93׶g۶m{m۶mFXU&[NgJ&J2of|ZxiI&$ "1~[5/J;݁A we:6R%+l;?,-\aA7UwѬߠzÛtiG+ƅ1򔋢QSt޲,TYaԷAwn$5C~P5ei]lbh!`CğYoȵ$\~Ȯ̙ySަ&Upa}axQN.yQHWc˔Qs44L)=8Д~I,T326#Jve$b[>oL ]XNu~@$^KԨl$"A>Wn#-;Zraf ZFFnf:L[a5Ž0*󬽍`qvn8H 1zKBqԔ37s` ^j6z." MX{L1xUqIه#! /_<#^mC\ 5朐 GT00ʎ Z>rN<2F~hcHEH ȋR;BZuf0t#iYU/SH #L;Fw x@9 6ԬדʟNEH417EUn8m_p,f]Ogaa0.W^ZEƱ"kl541sŷLo'I<4!콮}4JCSvi{xԘQsvhKA;R;(Tta EP T yuJ6[Zh6}qf_2$g;-ά m;6-kd0LC<Sh̆WoP G\<u*N;G~;Mz@֤$4].Ҭь/Yti Q).sSn;\}Ҩz ӗ3Ԁ, wǍ?5{cf<շ!0 0̠Ɯj7Q=DӞ!(5Du<\2rx:s|iWN x/ED o kF5\U{%/A⽜8 7\wFgr5ϾxZZ띍&'%aQ]~>^ute2gD"̺/4>8cagdE-n#kg s_Rud:8J =;-f(7(J#_mcO6q21kϼSѰatèS c7`}j`;VNϱN3BI( Až {`%ı[AFMp(p4|_x]qlA8\M´PZk~RV:ۚr ܉=.) X6/z"̈D#gL>T5aIǽa"ą^|ṮmkSb#8ջ߁LNPSDSQL߿bkoT af ø9C5h̘vPa4Oh^d3ocꮾjY'mAҵTB(t0 3a\M]b-*H ?g?jΨ[l__ߕW.VK$Ib,F\nw>*Er Ds7ʫHa߂C Y44zfl,p$D,vsʼH=4TyAJ~`FsLoDk:O>G+< Q՝l[GK 0 31Cܦ[u5(4<161M‚k٠)muKM9F=YF:`S6J;j;rܚ92!Dn}i2)0ѐ{ X!^?\tCmU?/U53fΧ+cĽqd,Mn D֋bdР,KL~ꝹAwTr<0 a8nfc\O-< FjKT?vat02v7r@MTnU;W9{/OH0X ƅfn Ǫ$VSKGIJ顾|m#Y4aohڽ4_0y^˴LN},ge#68D`]DՑ?\,CzV+&j H'wV_Z6󒆵!ogz[V/Gy7@uF 0 aL˪+T~kШs}郤TMYǦNW iw@tEꊏ= z&Ewhh.c## ڜs#})ٞT}>O =TR*| 0 3aD4 u«ؤnY%ilb<ᯨVyޒ-M]Y1GYW&6I?EHL4ޣ:b4G0Ic' {40I 2;0Ԭc#fK[UF޹:x`ֳTZPI,2W34;E&}ocSScMWE&~~S27>Ou^X,mډ,x0 0n3VS*O~5K82ɥa^c$3bטVJ"GkG:>?6q6Ss`scfhr3>u#FCqkK9bSv#2;ǎ iKZWJ}$KDRNzoBaS`>K uϾn죧X`3T2ܥsӡ:̟R4. 0 3aD4MqkT數7"! wHiױ.Y6:4IAu+uЀ*J]aO`J瓁9͟}hđ0ĭVĄWvݗ4M$k$udBNic〟xfG3{W*ϋF%nEs4NMZqkaa0)u8z7TߢE UDBT7д_˔9C94RbI|$A./؎`h֋K*8FǾʬtys[D"aaA7 0hzLivU,G_3gT?EԩQ~Dwpy~ aE8F=*KODΫYtr=T뎮FþG$l :I,]yGaaLA7 0ሶ7T=ݔk"r=/~ i kmy/|IR٥y`vKH 9lA_ ;7\9 >c`طsNpr}IfaqD aN3* Bxt VFS=iTK`ԁd`U^pܛc|6aH(DVzcT[.;uODj͚$G=ps`ZksՇO 0 Øna,ѐUiQ=%*;@ 0uk1ű0f=ƫsYY[^oqN1C=ħGޡ{{-RΈaafЏaժUR]I]Z<SEoiQe5JH9NcDBV=]s4y+帶`%RI g{DU"j3BT %K<:3>FG"n!N.Yȶ~TQW$ڽqmT/aa̔A7 0T{T;^I֫gY)gبv_oeQm00%^4Paa0 ØinaMuUs 1AB$9%IB.LWg>Hf3QmhT\4ԷG׻^Z'O%.LEO;I$9%IP]CXg7娖zMOe}Z Z6G/_YH$$Iy*ѕP U)7] *}-,e~zSzO +BP*%te*ːѦX~A 1KW<'n1$I$%]J14sz)rJҗ'+8XkwPLjiڛMt]^JwS%2 ݗN I@$i']Ԉ(%DZHGQy:8qHҟ[Qӣ~5"B?$IcK"=< ňzA:GY/G}P/A72Og@sK)KcB$M8%I}to裏;UycX/E\duw8!'l$i$Iy6ҟHeF%Ho\+Cї7t\HhKE4#`׊qV%= N;Fca77sIv.It}z6=qcP*QOgG 4C^KߤC$Ɂ.ItMzsġ\B.s~>G^JI$$I::݁E׌UttHI4-KGÏsI@$I &'Vc|]0=12I@$I+iIC*$Ii$Ig.'Ubx+C$ͤb׏N$K,/ J E.}&&#I.I{>"w^} ׏Ӑ$I3'̛_8,ItI+rzc 櫥*B$@EB$mǞ.o 9{y$I3%TB$m=B:\^LO|C$I3#B$muM7:<$IKZothCl$I_q$IGѧtz ݜOT$$I$ISدA="t@@A: :: @y`%+T+IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/conf.py0000755000175100001710000002051200000000000014772 0ustar00runnerdocker#!/usr/bin/env python # -*- coding: utf-8 -*- # # logzero documentation build configuration file, created by # sphinx-quickstart on Tue Jul 9 22:26:36 2013. # # 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. # # All configuration values have a default; values that are commented out # serve to show the default. import sys import os import sphinx_rtd_theme # 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('.')) # Get the project root dir, which is the parent dir of this cwd = os.getcwd() project_root = os.path.dirname(cwd) # Insert the project root dir as the first element in the PYTHONPATH. # This lets us ensure that the source package is imported, and that its # version is used. sys.path.insert(0, project_root) import logzero # -- 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', 'sphinx.ext.viewcode', 'sphinx_rtd_theme'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'logzero' copyright = u"2017, Chris Hager" # 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 = logzero.__version__ # The full version, including alpha/beta/rc tags. release = logzero.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to # some non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # 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. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # 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 ------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'default' html_theme = 'sphinx_rtd_theme' # 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 = { 'collapse_navigation': False, 'navigation_depth': -1 } # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as # html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the # top of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon # of the docs. This file should be a Windows icon file (.ico) being # 16x16 or 32x32 pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) # here, relative to this directory. They are copied after the builtin # static files, so a file named "default.css" will overwrite the builtin # "default.css". html_static_path = ['_static'] # 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 # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names # to template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. # Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. # Default is 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 base URL from which the finished HTML is served. #html_use_opensearch = '' # 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 = 'logzerodoc' # -- Options for LaTeX output ------------------------------------------ latex_elements = { # The paper size ('letterpaper' or 'a4paper'). #'papersize': 'letterpaper', # The font size ('10pt', '11pt' or '12pt'). #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. #'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass # [howto/manual]). latex_documents = [ ('index', 'logzero.tex', u'logzero Documentation', u'Chris Hager', 'manual'), ] # The name of an image file (relative to this directory) to place at # the top of the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings # are parts, not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output ------------------------------------ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'logzero', u'logzero Documentation', [u'Chris Hager'], 1) ] # If true, show URL addresses after external links. #man_show_urls = False # -- 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', 'logzero', u'logzero Documentation', u'Chris Hager', 'logzero', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. #texinfo_appendices = [] # If false, no module index is generated. #texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/contributing.rst0000644000175100001710000000004100000000000016724 0ustar00runnerdocker.. include:: ../CONTRIBUTING.rst ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/index.rst0000644000175100001710000003172400000000000015340 0ustar00runnerdocker.. highlight:: shell .. _index: =================================== `logzero`: Python logging made easy =================================== Robust and effective logging for Python 2 and 3. .. image:: _static/demo-output-with-beaver.png :alt: Logo **Features** * Easy logging to console and/or (rotating) file. * Provides a fully configured `Python logger object `_. * Pretty formatting, including level-specific colors in the console. * JSON logging support (with integrated `python-json-logger `_) * Windows color output supported by `colorama`_ * Robust against str/bytes encoding problems, works with all kinds of character encodings and special characters. * Multiple loggers can write to the same logfile (also works across multiple Python files). * Global default logger with `logzero.logger <#i-logzero-logger>`_ and custom loggers with `logzero.setup_logger(..) <#i-logzero-setup-logger>`_. * Compatible with Python 2 and 3. * All contained in a `single file`_. * Licensed under the MIT license. * Heavily inspired by the `Tornado web framework`_. * Hosted on GitHub: https://github.com/metachris/logzero Installation ============ Install `logzero` with `pip`_: .. code-block:: console $ pip install -U logzero If you don't have `pip`_ installed, this `Python installation guide`_ can guide you through the process. You can also install `logzero` from the public `Github repo`_: .. code-block:: console $ git clone https://github.com/metachris/logzero.git $ cd logzero $ python setup.py install .. _pip: https://pip.pypa.io .. _Python installation guide: http://docs.python-guide.org/en/latest/starting/installation/ .. _Github repo: https://github.com/metachris/logzero .. _tarball: https://github.com/metachris/logzero/tarball/master .. _single file: https://github.com/metachris/logzero/blob/master/logzero/__init__.py .. _Tornado web framework: https://github.com/tornadoweb/tornado .. _colorama: https://github.com/tartley/colorama Example usage ============= You can use `logzero` like this (logs only to the console by default): .. code-block:: python from logzero import logger logger.debug("hello") logger.info("info") logger.warning("warn") logger.error("error") # This is how you'd log an exception try: raise Exception("this is a demo exception") except Exception as e: logger.exception(e) # JSON logging import logzero logzero.json() logger.info("JSON test") # Start writing into a logfile logzero.logfile("/tmp/logzero-demo.log") If this was a file called ``demo.py``, the output will look like this: .. image:: _static/demo-output-json.png :alt: Demo output in color Logging to files ---------------- You can add logging to a (rotating) logfile like this: .. code-block:: python import logzero from logzero import logger # non-rotating logfile logzero.logfile("/tmp/logfile.log") # rotating logfile logzero.logfile("/tmp/rotating-logfile.log", maxBytes=1e6, backupCount=3) # log messages logger.info("This log message goes to the console and the logfile") JSON logging ------------ JSON logging can be enabled for the default logger with `logzero.json()`, or with `setup_logger(json=True)` for custom loggers: .. code-block:: python # Configure the default logger to output JSON >>> logzero.json() >>> logger.info("test") {"asctime": "2020-10-21 10:42:45,808", "filename": "", "funcName": "", "levelname": "INFO", "levelno": 20, "lineno": 1, "module": "", "message": "test", "name": "logzero_default", "pathname": "", "process": 76179, "processName": "MainProcess", "threadName": "MainThread"} # Configure a custom logger to output JSON >>> my_logger = setup_logger(json=True) >>> my_logger.info("test") {"asctime": "2020-10-21 10:42:45,808", "filename": "", "funcName": "", "levelname": "INFO", "levelno": 20, "lineno": 1, "module": "", "message": "test", "name": "logzero_default", "pathname": "", "process": 76179, "processName": "MainProcess", "threadName": "MainThread"} The logged JSON object has these fields: .. code-block:: json { "asctime": "2020-10-21 10:43:40,765", "filename": "test.py", "funcName": "test_this", "levelname": "INFO", "levelno": 20, "lineno": 9, "module": "test", "message": "info", "name": "logzero", "pathname": "_tests/test.py", "process": 76204, "processName": "MainProcess", "threadName": "MainThread" } An exception logged with `logger.exception(e)` has these: .. code-block:: json { "asctime": "2020-10-21 10:43:25,193", "filename": "test.py", "funcName": "test_this", "levelname": "ERROR", "levelno": 40, "lineno": 17, "module": "test", "message": "this is a demo exception", "name": "logzero", "pathname": "_tests/test.py", "process": 76192, "processName": "MainProcess", "threadName": "MainThread", "exc_info": "Traceback (most recent call last):\n File \"_tests/test.py\", line 15, in test_this\n raise Exception(\"this is a demo exception\")\nException: this is a demo exception" } Advanced usage examples ----------------------- Here are more examples which show how to use logfiles, custom formatters and setting a minimum loglevel. +-----------------------------------------+--------------------------------------------------+ | Outcome | Method | +=========================================+==================================================+ | Set a minimum log level | `logzero.loglevel(..) <#i-logzero-loglevel>`_ | +-----------------------------------------+--------------------------------------------------+ | Add logging to a logfile | `logzero.logfile(..) <#i-logzero-logfile>`_ | +-----------------------------------------+--------------------------------------------------+ | Setup a rotating logfile | `logzero.logfile(..) <#i-logzero-logfile>`_ | +-----------------------------------------+--------------------------------------------------+ | Disable logging to a logfile | `logzero.logfile(None) <#i-logzero-logfile>`_ | +-----------------------------------------+--------------------------------------------------+ | JSON logging | `logzero.json(...) <#json-logging>`_ | +-----------------------------------------+--------------------------------------------------+ | Log to syslog | `logzero.syslog(...) <#i-logzero-logfile>`_ | +-----------------------------------------+--------------------------------------------------+ | Use a custom formatter | `logzero.formatter(..) <#i-logzero-formatter>`_ | +-----------------------------------------+--------------------------------------------------+ .. code-block:: python import logging import logzero from logzero import logger # This log message goes to the console logger.debug("hello") # Set a minimum log level logzero.loglevel(logzero.INFO) # Set a logfile (all future log messages are also saved there) logzero.logfile("/tmp/logfile.log") # Set a logfile (all future log messages are also saved there), but disable the default stderr logging logzero.logfile("/tmp/logfile.log", disableStderrLogger=True) # You can also set a different loglevel for the file handler logzero.logfile("/tmp/logfile.log", loglevel=logzero.ERROR) # Set a rotating logfile (replaces the previous logfile handler) logzero.logfile("/tmp/rotating-logfile.log", maxBytes=1000000, backupCount=3) # Disable logging to a file logzero.logfile(None) # Enable JSON log format logzero.json() # Disable JSON log format logzero.json(False) # Log to syslog, using default logzero logger and 'user' syslog facility logzero.syslog() # Log to syslog, using default logzero logger and 'local0' syslog facility logzero.syslog(facility=SysLogHandler.LOG_LOCAL0) # Set a custom formatter formatter = logging.Formatter('%(name)s - %(asctime)-15s - %(levelname)s: %(message)s'); logzero.formatter(formatter) # Log some variables logger.info("var1: %s, var2: %s", var1, var2) Custom logger instances ----------------------- Instead of using the default logger you can also setup specific logger instances with `logzero.setup_logger(..) <#i-logzero-setup-logger>`_: .. code-block:: python from logzero import setup_logger logger1 = setup_logger(name="mylogger1") logger2 = setup_logger(name="mylogger2", logfile="/tmp/test-logger2.log", level=logzero.INFO) logger3 = setup_logger(name="mylogger3", logfile="/tmp/test-logger3.log", level=logzero.INFO, disableStderrLogger=True) # Log something: logger1.info("info for logger 1") logger2.info("info for logger 2") # log to a file only, excluding the default stderr logger logger3.info("info for logger 3") # JSON logging in a custom logger jsonLogger = setup_logger(name="jsonLogger", json=True) jsonLogger.info("info in json") Adding custom handlers (eg. SocketHandler) ------------------------------------------ Since `logzero` uses the standard `Python logger object `_, you can attach any `Python logging handlers `_ you can imagine! This is how you add a `SocketHandler `_: .. code-block:: python import logzero import logging from logging.handlers import SocketHandler # Setup the SocketHandler socket_handler = SocketHandler(address=('localhost', logging.DEFAULT_TCP_LOGGING_PORT)) socket_handler.setLevel(logging.DEBUG) socket_handler.setFormatter(logzero.LogFormatter(color=False)) # Attach it to the logzero default logger logzero.logger.addHandler(socket_handler) # Log messages logzero.logger.info("this is a test") Documentation ============= .. _i-logzero-logger: `logzero.logger` ---------------- `logzero.logger` is an already set up standard `Python logger instance `_ for your convenience. You can use it from all your files and modules directly like this: .. code-block:: python from logzero import logger logger.debug("hello") logger.info("info") logger.warning("warning") logger.error("error") You can reconfigure the default logger globally with `logzero.setup_default_logger(..) <#i-logzero-setup-default-logger>`_. See the documentation for the `Python logger instance `_ for more information about how you can use it. .. _i-logzero-loglevel: `logzero.loglevel(..)` -------------------------- .. autofunction:: logzero.loglevel .. _i-logzero-logfile: `logzero.logfile(..)` -------------------------- .. autofunction:: logzero.logfile .. _i-logzero-formatter: `logzero.formatter(..)` -------------------------- .. autofunction:: logzero.formatter .. _i-logzero-setup-logger: `logzero.setup_logger(..)` -------------------------- .. autofunction:: logzero.setup_logger .. _i-logzero-setup-default-logger: Default Log Format ------------------ This is the default log format string: .. code-block:: python DEFAULT_FORMAT = '%(color)s[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]%(end_color)s %(message)s' See also the `Python LogRecord attributes `_ you can use. Custom Formatting ----------------- It is easy to use a custom formatter / a custom log format string: * Define your log format string (you can use any of the `LogRecord attributes `_). * Create a `Formatter object `_ (based on `logzero.LogFormatter` to get all the encoding helpers). * Supply the formatter object to the `formatter` argument in the `setup_logger(..)` method. This is a working example on how to setup logging with a custom format: .. code-block:: python import logzero log_format = '%(color)s[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]%(end_color)s %(message)s' formatter = logzero.LogFormatter(fmt=log_format) logzero.setup_default_logger(formatter=formatter) Issues, Feedback & Contributions ================================ All kinds of feedback and contributions are welcome. * `Create an issue `_ * Create a pull request * https://github.com/metachris/logzero * chris@linuxuser.at // `@metachris `_ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/docs/make.bat0000644000175100001710000001447500000000000015110 0ustar00runnerdocker@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 goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) %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 ) 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\logzero.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\logzero.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 %BUILDDIR%/.. 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 %BUILDDIR%/.. 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" == "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 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1615980257.5136695 logzero-1.7.0/logzero/0000755000175100001710000000000000000000000014221 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/logzero/__init__.py0000644000175100001710000005451700000000000016346 0ustar00runnerdocker# -*- coding: utf-8 -*- """ This helper provides a versatile yet easy to use and beautiful logging setup. You can use it to log to the console and optionally to a logfile. This project is heavily inspired by the Tornado web framework. * https://logzero.readthedocs.io * https://github.com/metachris/logzero The call `logger.info("hello")` prints log messages in this format: [I 170213 15:02:00 test:203] hello Usage: from logzero import logger logger.debug("hello") logger.info("info") logger.warning("warn") logger.error("error") In order to also log to a file, just use `logzero.logfile(..)`: logzero.logfile("/tmp/test.log") If you want to use specific loggers instead of the global default logger, use `setup_logger(..)`: logger = logzero.setup_logger(logfile="/tmp/test.log") The default loglevel is `DEBUG`. You can set it with the parameter `level`. See the documentation for more information: https://logzero.readthedocs.io """ import functools import os import sys import logging from logzero.colors import Fore as ForegroundColors from logzero.jsonlogger import JsonFormatter from logging.handlers import RotatingFileHandler, SysLogHandler from logging import CRITICAL, ERROR, WARNING, WARN, INFO, DEBUG, NOTSET # noqa: F401 try: import curses # type: ignore except ImportError: curses = None __author__ = """Chris Hager""" __email__ = 'chris@linuxuser.at' __version__ = '1.7.0' # Python 2+3 compatibility settings for logger bytes_type = bytes if sys.version_info >= (3, ): unicode_type = str basestring_type = str xrange = range else: # The names unicode and basestring don't exist in py3 so silence flake8. unicode_type = unicode # noqa basestring_type = basestring # noqa # Formatter defaults DEFAULT_FORMAT = '%(color)s[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]%(end_color)s %(message)s' DEFAULT_DATE_FORMAT = '%y%m%d %H:%M:%S' DEFAULT_COLORS = { DEBUG: ForegroundColors.CYAN, INFO: ForegroundColors.GREEN, WARNING: ForegroundColors.YELLOW, ERROR: ForegroundColors.RED, CRITICAL: ForegroundColors.RED } # Name of the internal default logger LOGZERO_DEFAULT_LOGGER = "logzero_default" # Attribute which all internal loggers carry LOGZERO_INTERNAL_LOGGER_ATTR = "_is_logzero_internal" # Attribute signalling whether the handler has a custom loglevel LOGZERO_INTERNAL_HANDLER_IS_CUSTOM_LOGLEVEL = "_is_logzero_internal_handler_custom_loglevel" # Logzero default logger logger = None # Current state of the internal logging settings _loglevel = DEBUG _logfile = None _formatter = None # Setup colorama on Windows if os.name == 'nt': from colorama import init as colorama_init colorama_init() def setup_logger(name=__name__, logfile=None, level=DEBUG, formatter=None, maxBytes=0, backupCount=0, fileLoglevel=None, disableStderrLogger=False, isRootLogger=False, json=False, json_ensure_ascii=False): """ Configures and returns a fully configured logger instance, no hassles. If a logger with the specified name already exists, it returns the existing instance, else creates a new one. If you set the ``logfile`` parameter with a filename, the logger will save the messages to the logfile, but does not rotate by default. If you want to enable log rotation, set both ``maxBytes`` and ``backupCount``. Usage: .. code-block:: python from logzero import setup_logger logger = setup_logger() logger.info("hello") :arg string name: Name of the `Logger object `_. Multiple calls to ``setup_logger()`` with the same name will always return a reference to the same Logger object. (default: ``__name__``) :arg string logfile: If set, also write logs to the specified filename. :arg int level: Minimum `logging-level `_ to display (default: ``DEBUG``). :arg Formatter formatter: `Python logging Formatter object `_ (by default uses the internal LogFormatter). :arg int maxBytes: Size of the logfile when rollover should occur. Defaults to 0, rollover never occurs. :arg int backupCount: Number of backups to keep. Defaults to 0, rollover never occurs. :arg int fileLoglevel: Minimum `logging-level `_ for the file logger (is not set, it will use the loglevel from the ``level`` argument) :arg bool disableStderrLogger: Should the default stderr logger be disabled. Defaults to False. :arg bool isRootLogger: If True then returns a root logger. Defaults to False. (see also the `Python docs `_). :arg bool json: If True then log in JSON format. Defaults to False. (uses `python-json-logger `_). :arg bool json_ensure_ascii: Passed to json.dumps as `ensure_ascii`, default: False (if False: writes utf-8 characters, if True: ascii only representation of special characters - eg. '\u00d6\u00df') :return: A fully configured Python logging `Logger object `_ you can use with ``.debug("msg")``, etc. """ _logger = logging.getLogger(None if isRootLogger else name) _logger.propagate = False # set the minimum level needed for the logger itself (the lowest handler level) minLevel = fileLoglevel if fileLoglevel and fileLoglevel < level else level _logger.setLevel(minLevel) # Setup default formatter _formatter = _get_json_formatter(json_ensure_ascii) if json else formatter or LogFormatter() # Reconfigure existing handlers stderr_stream_handler = None for handler in list(_logger.handlers): if hasattr(handler, LOGZERO_INTERNAL_LOGGER_ATTR): if isinstance(handler, logging.FileHandler): # Internal FileHandler needs to be removed and re-setup to be able # to set a new logfile. _logger.removeHandler(handler) continue elif isinstance(handler, logging.StreamHandler): stderr_stream_handler = handler # reconfigure handler handler.setLevel(level) handler.setFormatter(_formatter) # remove the stderr handler (stream_handler) if disabled if disableStderrLogger: if stderr_stream_handler is not None: _logger.removeHandler(stderr_stream_handler) elif stderr_stream_handler is None: stderr_stream_handler = logging.StreamHandler() setattr(stderr_stream_handler, LOGZERO_INTERNAL_LOGGER_ATTR, True) stderr_stream_handler.setLevel(level) stderr_stream_handler.setFormatter(_formatter) _logger.addHandler(stderr_stream_handler) if logfile: rotating_filehandler = RotatingFileHandler(filename=logfile, maxBytes=maxBytes, backupCount=backupCount) setattr(rotating_filehandler, LOGZERO_INTERNAL_LOGGER_ATTR, True) rotating_filehandler.setLevel(fileLoglevel or level) rotating_filehandler.setFormatter(_formatter) _logger.addHandler(rotating_filehandler) return _logger class LogFormatter(logging.Formatter): """ Log formatter used in Tornado. Key features of this formatter are: * Color support when logging to a terminal that supports it. * Timestamps on every log line. * Robust against str/bytes encoding problems. """ def __init__(self, color=True, fmt=DEFAULT_FORMAT, datefmt=DEFAULT_DATE_FORMAT, colors=DEFAULT_COLORS): r""" :arg bool color: Enables color support. :arg string fmt: Log message format. It will be applied to the attributes dict of log records. The text between ``%(color)s`` and ``%(end_color)s`` will be colored depending on the level if color support is on. :arg dict colors: color mappings from logging level to terminal color code :arg string datefmt: Datetime format. Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. .. versionchanged:: 3.2 Added ``fmt`` and ``datefmt`` arguments. """ logging.Formatter.__init__(self, datefmt=datefmt) self._fmt = fmt self._colors = {} self._normal = '' if color and _stderr_supports_color(): self._colors = colors self._normal = ForegroundColors.RESET def format(self, record): try: message = record.getMessage() assert isinstance(message, basestring_type) # guaranteed by logging # Encoding notes: The logging module prefers to work with character # strings, but only enforces that log messages are instances of # basestring. In python 2, non-ascii bytestrings will make # their way through the logging framework until they blow up with # an unhelpful decoding error (with this formatter it happens # when we attach the prefix, but there are other opportunities for # exceptions further along in the framework). # # If a byte string makes it this far, convert it to unicode to # ensure it will make it out to the logs. Use repr() as a fallback # to ensure that all byte strings can be converted successfully, # but don't do it by default so we don't add extra quotes to ascii # bytestrings. This is a bit of a hacky place to do this, but # it's worth it since the encoding errors that would otherwise # result are so useless (and tornado is fond of using utf8-encoded # byte strings wherever possible). record.message = _safe_unicode(message) except Exception as e: record.message = "Bad message (%r): %r" % (e, record.__dict__) record.asctime = self.formatTime(record, self.datefmt) if record.levelno in self._colors: record.color = self._colors[record.levelno] record.end_color = self._normal else: record.color = record.end_color = '' formatted = self._fmt % record.__dict__ if record.exc_info: if not record.exc_text: record.exc_text = self.formatException(record.exc_info) if record.exc_text: # exc_text contains multiple lines. We need to _safe_unicode # each line separately so that non-utf8 bytes don't cause # all the newlines to turn into '\n'. lines = [formatted.rstrip()] lines.extend( _safe_unicode(ln) for ln in record.exc_text.split('\n')) formatted = '\n'.join(lines) return formatted.replace("\n", "\n ") def _stderr_supports_color(): # Colors can be forced with an env variable if os.getenv('LOGZERO_FORCE_COLOR') == '1': return True # Windows supports colors with colorama if os.name == 'nt': return True # Detect color support of stderr with curses (Linux/macOS) if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): try: curses.setupterm() if curses.tigetnum("colors") > 0: return True except Exception: pass return False _TO_UNICODE_TYPES = (unicode_type, type(None)) def to_unicode(value): """ Converts a string argument to a unicode string. If the argument is already a unicode string or None, it is returned unchanged. Otherwise it must be a byte string and is decoded as utf8. """ if isinstance(value, _TO_UNICODE_TYPES): return value if not isinstance(value, bytes): raise TypeError( "Expected bytes, unicode, or None; got %r" % type(value)) return value.decode("utf-8") def _safe_unicode(s): try: return to_unicode(s) except UnicodeDecodeError: return repr(s) def setup_default_logger(logfile=None, level=DEBUG, formatter=None, maxBytes=0, backupCount=0, disableStderrLogger=False): """ Deprecated. Use `logzero.loglevel(..)`, `logzero.logfile(..)`, etc. Globally reconfigures the default `logzero.logger` instance. Usage: .. code-block:: python from logzero import logger, setup_default_logger setup_default_logger(level=WARN) logger.info("hello") # this will not be displayed anymore because minimum loglevel was set to WARN :arg string logfile: If set, also write logs to the specified filename. :arg int level: Minimum `logging-level `_ to display (default: `DEBUG`). :arg Formatter formatter: `Python logging Formatter object `_ (by default uses the internal LogFormatter). :arg int maxBytes: Size of the logfile when rollover should occur. Defaults to 0, rollover never occurs. :arg int backupCount: Number of backups to keep. Defaults to 0, rollover never occurs. :arg bool disableStderrLogger: Should the default stderr logger be disabled. Defaults to False. """ global logger logger = setup_logger(name=LOGZERO_DEFAULT_LOGGER, logfile=logfile, level=level, formatter=formatter, backupCount=backupCount, disableStderrLogger=disableStderrLogger) return logger def reset_default_logger(): """ Resets the internal default logger to the initial configuration """ global logger global _loglevel global _logfile global _formatter _loglevel = DEBUG _logfile = None _formatter = None # Remove all handlers on exiting logger if logger: for handler in list(logger.handlers): logger.removeHandler(handler) # Resetup logger = setup_logger(name=LOGZERO_DEFAULT_LOGGER, logfile=_logfile, level=_loglevel, formatter=_formatter) # Initially setup the default logger reset_default_logger() def loglevel(level=DEBUG, update_custom_handlers=False): """ Set the minimum loglevel for the default logger (`logzero.logger`) and all handlers. This reconfigures only the internal handlers of the default logger (eg. stream and logfile). You can also update the loglevel for custom handlers by using `update_custom_handlers=True`. :arg int level: Minimum `logging-level `_ to display (default: `DEBUG`). :arg bool update_custom_handlers: If you added custom handlers to this logger and want this to update them too, you need to set `update_custom_handlers` to `True` """ logger.setLevel(level) # Reconfigure existing internal handlers for handler in list(logger.handlers): if hasattr(handler, LOGZERO_INTERNAL_LOGGER_ATTR) or update_custom_handlers: # Don't update the loglevel if this handler uses a custom one if hasattr(handler, LOGZERO_INTERNAL_HANDLER_IS_CUSTOM_LOGLEVEL): continue # Update the loglevel for all default handlers handler.setLevel(level) global _loglevel _loglevel = level def formatter(formatter, update_custom_handlers=False): """ Set the formatter for all handlers of the default logger (``logzero.logger``). This reconfigures only the logzero internal handlers by default, but you can also reconfigure custom handlers by using ``update_custom_handlers=True``. Beware that setting a formatter which uses colors also may write the color codes to logfiles. :arg Formatter formatter: `Python logging Formatter object `_ (by default uses the internal LogFormatter). :arg bool update_custom_handlers: If you added custom handlers to this logger and want this to update them too, you need to set ``update_custom_handlers`` to `True` """ for handler in list(logger.handlers): if hasattr(handler, LOGZERO_INTERNAL_LOGGER_ATTR) or update_custom_handlers: handler.setFormatter(formatter) global _formatter _formatter = formatter def logfile(filename, formatter=None, mode='a', maxBytes=0, backupCount=0, encoding=None, loglevel=None, disableStderrLogger=False): """ Setup logging to file (using a `RotatingFileHandler `_ internally). By default, the file grows indefinitely (no rotation). You can use the ``maxBytes`` and ``backupCount`` values to allow the file to rollover at a predetermined size. When the size is about to be exceeded, the file is closed and a new file is silently opened for output. Rollover occurs whenever the current log file is nearly ``maxBytes`` in length; if either of ``maxBytes`` or ``backupCount`` is zero, rollover never occurs. If ``backupCount`` is non-zero, the system will save old log files by appending the extensions ‘.1’, ‘.2’ etc., to the filename. For example, with a ``backupCount`` of 5 and a base file name of app.log, you would get app.log, app.log.1, app.log.2, up to app.log.5. The file being written to is always app.log. When this file is filled, it is closed and renamed to app.log.1, and if files app.log.1, app.log.2, etc. exist, then they are renamed to app.log.2, app.log.3 etc. respectively. :arg string filename: Filename of the logfile. Set to `None` to disable logging to the logfile. :arg Formatter formatter: `Python logging Formatter object `_ (by default uses the internal LogFormatter). :arg string mode: mode to open the file with. Defaults to ``a`` :arg int maxBytes: Size of the logfile when rollover should occur. Defaults to 0, rollover never occurs. :arg int backupCount: Number of backups to keep. Defaults to 0, rollover never occurs. :arg string encoding: Used to open the file with that encoding. :arg int loglevel: Set a custom loglevel for the file logger, else uses the current global loglevel. :arg bool disableStderrLogger: Should the default stderr logger be disabled. Defaults to False. """ # First, remove any existing file logger __remove_internal_loggers(logger, disableStderrLogger) # If no filename supplied, all is done if not filename: return # Now add rotating_filehandler = RotatingFileHandler(filename, mode=mode, maxBytes=maxBytes, backupCount=backupCount, encoding=encoding) # Set internal attributes on this handler setattr(rotating_filehandler, LOGZERO_INTERNAL_LOGGER_ATTR, True) if loglevel: setattr(rotating_filehandler, LOGZERO_INTERNAL_HANDLER_IS_CUSTOM_LOGLEVEL, True) # Configure the handler and add it to the logger rotating_filehandler.setLevel(loglevel or _loglevel) rotating_filehandler.setFormatter(formatter or _formatter or LogFormatter(color=False)) logger.addHandler(rotating_filehandler) # If wanting to use a lower loglevel for the file handler, we need to reconfigure the logger level # (note: this won't change the StreamHandler loglevel) if loglevel and loglevel < logger.level: logger.setLevel(loglevel) def __remove_internal_loggers(logger_to_update, disableStderrLogger=True): """ Remove the internal loggers (e.g. stderr logger and file logger) from the specific logger :param logger_to_update: the logger to remove internal loggers from :param disableStderrLogger: should the default stderr logger be disabled? defaults to True """ for handler in list(logger_to_update.handlers): if hasattr(handler, LOGZERO_INTERNAL_LOGGER_ATTR): if isinstance(handler, RotatingFileHandler): logger_to_update.removeHandler(handler) elif isinstance(handler, SysLogHandler): logger_to_update.removeHandler(handler) elif isinstance(handler, logging.StreamHandler) and disableStderrLogger: logger_to_update.removeHandler(handler) def syslog(logger_to_update=logger, facility=SysLogHandler.LOG_USER, disableStderrLogger=True): """ Setup logging to syslog and disable other internal loggers :param logger_to_update: the logger to enable syslog logging for :param facility: syslog facility to log to :param disableStderrLogger: should the default stderr logger be disabled? defaults to True :return the new SysLogHandler, which can be modified externally (e.g. for custom log level) """ # remove internal loggers __remove_internal_loggers(logger_to_update, disableStderrLogger) # Setup logzero to only use the syslog handler with the specified facility syslog_handler = SysLogHandler(facility=facility) setattr(syslog_handler, LOGZERO_INTERNAL_LOGGER_ATTR, True) logger_to_update.addHandler(syslog_handler) return syslog_handler def json(enable=True, json_ensure_ascii=False, update_custom_handlers=False): """ Enable/disable json logging for all handlers. Params: * json_ensure_ascii ... Passed to json.dumps as `ensure_ascii`, default: False (if False: writes utf-8 characters, if True: ascii only representation of special characters - eg. '\u00d6\u00df') """ formatter(_get_json_formatter(json_ensure_ascii) if enable else LogFormatter(), update_custom_handlers=update_custom_handlers) def _get_json_formatter(json_ensure_ascii): supported_keys = [ 'asctime', 'filename', 'funcName', 'levelname', 'levelno', 'lineno', 'module', 'message', 'name', 'pathname', 'process', 'processName', 'threadName' ] def log_format(x): return ['%({0:s})s'.format(i) for i in x] custom_format = ' '.join(log_format(supported_keys)) return JsonFormatter(custom_format, json_ensure_ascii=json_ensure_ascii) def log_function_call(func): @functools.wraps(func) def wrap(*args, **kwargs): args_str = ", ".join([str(arg) for arg in args]) kwargs_str = ", ".join(["%s=%s" % (key, kwargs[key]) for key in kwargs]) if args_str and kwargs_str: all_args_str = ", ".join([args_str, kwargs_str]) else: all_args_str = args_str or kwargs_str logger.debug("%s(%s)", func.__name__, all_args_str) return func(*args, **kwargs) return wrap if __name__ == "__main__": _logger = setup_logger() _logger.info("hello") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/logzero/colors.py0000644000175100001710000000426200000000000016100 0ustar00runnerdocker""" Source: https://github.com/tartley/colorama/blob/master/colorama/ansi.py Copyright: Jonathan Hartley 2013. BSD 3-Clause license. """ CSI = '\033[' OSC = '\033]' BEL = '\007' def code_to_chars(code): return CSI + str(code) + 'm' def set_title(title): return OSC + '2;' + title + BEL def clear_screen(mode=2): return CSI + str(mode) + 'J' def clear_line(mode=2): return CSI + str(mode) + 'K' class AnsiCodes(object): def __init__(self): # the subclasses declare class attributes which are numbers. # Upon instantiation we define instance attributes, which are the same # as the class attributes but wrapped with the ANSI escape sequence for name in dir(self): if not name.startswith('_'): value = getattr(self, name) setattr(self, name, code_to_chars(value)) class AnsiCursor(object): def UP(self, n=1): return CSI + str(n) + 'A' def DOWN(self, n=1): return CSI + str(n) + 'B' def FORWARD(self, n=1): return CSI + str(n) + 'C' def BACK(self, n=1): return CSI + str(n) + 'D' def POS(self, x=1, y=1): return CSI + str(y) + ';' + str(x) + 'H' class AnsiFore(AnsiCodes): BLACK = 30 RED = 31 GREEN = 32 YELLOW = 33 BLUE = 34 MAGENTA = 35 CYAN = 36 WHITE = 37 RESET = 39 # These are fairly well supported, but not part of the standard. LIGHTBLACK_EX = 90 LIGHTRED_EX = 91 LIGHTGREEN_EX = 92 LIGHTYELLOW_EX = 93 LIGHTBLUE_EX = 94 LIGHTMAGENTA_EX = 95 LIGHTCYAN_EX = 96 LIGHTWHITE_EX = 97 class AnsiBack(AnsiCodes): BLACK = 40 RED = 41 GREEN = 42 YELLOW = 43 BLUE = 44 MAGENTA = 45 CYAN = 46 WHITE = 47 RESET = 49 # These are fairly well supported, but not part of the standard. LIGHTBLACK_EX = 100 LIGHTRED_EX = 101 LIGHTGREEN_EX = 102 LIGHTYELLOW_EX = 103 LIGHTBLUE_EX = 104 LIGHTMAGENTA_EX = 105 LIGHTCYAN_EX = 106 LIGHTWHITE_EX = 107 class AnsiStyle(AnsiCodes): BRIGHT = 1 DIM = 2 NORMAL = 22 RESET_ALL = 0 Fore = AnsiFore() Back = AnsiBack() Style = AnsiStyle() Cursor = AnsiCursor() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/logzero/jsonlogger.py0000644000175100001710000002117300000000000016750 0ustar00runnerdocker''' https://github.com/madzak/python-json-logger This library is provided to allow standard python logging to output log data as JSON formatted strings ''' import sys import logging import json import re import traceback import importlib from inspect import istraceback from collections import OrderedDict from datetime import date, datetime, time if sys.version_info >= (3, ): from datetime import timezone tz = timezone.utc else: tz = None # skip natural LogRecord attributes # http://docs.python.org/library/logging.html#logrecord-attributes RESERVED_ATTRS = ( 'args', 'asctime', 'created', 'exc_info', 'exc_text', 'filename', 'funcName', 'levelname', 'levelno', 'lineno', 'module', 'msecs', 'message', 'msg', 'name', 'pathname', 'process', 'processName', 'relativeCreated', 'stack_info', 'thread', 'threadName') def merge_record_extra(record, target, reserved): """ Merges extra attributes from LogRecord object into target dictionary :param record: logging.LogRecord :param target: dict to update :param reserved: dict or list with reserved keys to skip """ for key, value in record.__dict__.items(): # this allows to have numeric keys if (key not in reserved and not (hasattr(key, "startswith") and key.startswith('_'))): target[key] = value return target class JsonEncoder(json.JSONEncoder): """ A custom encoder extending the default JSONEncoder """ def default(self, obj): if isinstance(obj, (date, datetime, time)): return self.format_datetime_obj(obj) elif istraceback(obj): return ''.join(traceback.format_tb(obj)).strip() elif type(obj) == Exception \ or isinstance(obj, Exception) \ or type(obj) == type: return str(obj) try: return super(JsonEncoder, self).default(obj) except TypeError: try: return str(obj) except Exception: return None def format_datetime_obj(self, obj): return obj.isoformat() class JsonFormatter(logging.Formatter): """ A custom formatter to format logging records as json strings. Extra values will be formatted as str() if not supported by json default encoder """ def __init__(self, *args, **kwargs): """ :param json_default: a function for encoding non-standard objects as outlined in http://docs.python.org/2/library/json.html :param json_encoder: optional custom encoder :param json_serializer: a :meth:`json.dumps`-compatible callable that will be used to serialize the log record. :param json_indent: an optional :meth:`json.dumps`-compatible numeric value that will be used to customize the indent of the output json. :param prefix: an optional string prefix added at the beginning of the formatted string :param rename_fields: an optional dict, used to rename field names in the output. Rename message to @message: {'message': '@message'} :param json_indent: indent parameter for json.dumps :param json_ensure_ascii: ensure_ascii parameter for json.dumps :param reserved_attrs: an optional list of fields that will be skipped when outputting json log record. Defaults to all log record attributes: http://docs.python.org/library/logging.html#logrecord-attributes :param timestamp: an optional string/boolean field to add a timestamp when outputting the json log record. If string is passed, timestamp will be added to log record using string as key. If True boolean is passed, timestamp key will be "timestamp". Defaults to False/off. """ self.json_default = self._str_to_fn(kwargs.pop("json_default", None)) self.json_encoder = self._str_to_fn(kwargs.pop("json_encoder", None)) self.json_serializer = self._str_to_fn(kwargs.pop("json_serializer", json.dumps)) self.json_indent = kwargs.pop("json_indent", None) self.json_ensure_ascii = kwargs.pop("json_ensure_ascii", True) self.prefix = kwargs.pop("prefix", "") self.rename_fields = kwargs.pop("rename_fields", {}) reserved_attrs = kwargs.pop("reserved_attrs", RESERVED_ATTRS) self.reserved_attrs = dict(zip(reserved_attrs, reserved_attrs)) self.timestamp = kwargs.pop("timestamp", False) # super(JsonFormatter, self).__init__(*args, **kwargs) logging.Formatter.__init__(self, *args, **kwargs) if not self.json_encoder and not self.json_default: self.json_encoder = JsonEncoder self._required_fields = self.parse() self._skip_fields = dict(zip(self._required_fields, self._required_fields)) self._skip_fields.update(self.reserved_attrs) def _str_to_fn(self, fn_as_str): """ If the argument is not a string, return whatever was passed in. Parses a string such as package.module.function, imports the module and returns the function. :param fn_as_str: The string to parse. If not a string, return it. """ if not isinstance(fn_as_str, str): return fn_as_str path, _, function = fn_as_str.rpartition('.') module = importlib.import_module(path) return getattr(module, function) def parse(self): """ Parses format string looking for substitutions This method is responsible for returning a list of fields (as strings) to include in all log messages. """ standard_formatters = re.compile(r'\((.+?)\)', re.IGNORECASE) return standard_formatters.findall(self._fmt) def add_fields(self, log_record, record, message_dict): """ Override this method to implement custom logic for adding fields. """ for field in self._required_fields: if field in self.rename_fields: log_record[self.rename_fields[field]] = record.__dict__.get(field) else: log_record[field] = record.__dict__.get(field) log_record.update(message_dict) merge_record_extra(record, log_record, reserved=self._skip_fields) if self.timestamp: key = self.timestamp if type(self.timestamp) == str else 'timestamp' log_record[key] = datetime.fromtimestamp(record.created, tz=tz) def process_log_record(self, log_record): """ Override this method to implement custom logic on the possibly ordered dictionary. """ return log_record def jsonify_log_record(self, log_record): """Returns a json string of the log record.""" return self.json_serializer(log_record, default=self.json_default, cls=self.json_encoder, indent=self.json_indent, ensure_ascii=self.json_ensure_ascii) def serialize_log_record(self, log_record): """Returns the final representation of the log record.""" return "%s%s" % (self.prefix, self.jsonify_log_record(log_record)) def format(self, record): """Formats a log record and serializes to json""" message_dict = {} if isinstance(record.msg, dict): message_dict = record.msg record.message = None else: record.message = record.getMessage() # only format time if needed if "asctime" in self._required_fields: record.asctime = self.formatTime(record, self.datefmt) # Display formatted exception, but allow overriding it in the # user-supplied dict. if record.exc_info and not message_dict.get('exc_info'): message_dict['exc_info'] = self.formatException(record.exc_info) if not message_dict.get('exc_info') and record.exc_text: message_dict['exc_info'] = record.exc_text # Display formatted record of stack frames # default format is a string returned from :func:`traceback.print_stack` try: if record.stack_info and not message_dict.get('stack_info'): message_dict['stack_info'] = self.formatStack(record.stack_info) except AttributeError: # Python2.7 doesn't have stack_info. pass try: log_record = OrderedDict() except NameError: log_record = {} self.add_fields(log_record, record, message_dict) log_record = self.process_log_record(log_record) return self.serialize_log_record(log_record) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1615980257.5136695 logzero-1.7.0/logzero.egg-info/0000755000175100001710000000000000000000000015713 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980257.0 logzero-1.7.0/logzero.egg-info/PKG-INFO0000644000175100001710000003407200000000000017016 0ustar00runnerdockerMetadata-Version: 2.1 Name: logzero Version: 1.7.0 Summary: Robust and effective logging for Python 2 and 3 Home-page: https://github.com/metachris/logzero Author: Chris Hager Author-email: chris@linuxuser.at License: MIT license Description: # logzero ![Build status for master branch](https://github.com/metachris/logzero/workflows/Run%20the%20tests/badge.svg) [![Documentation Status](https://readthedocs.org/projects/logzero/badge/?version=latest)](https://logzero.readthedocs.io/en/latest/?badge=latest) [![Latest version on PyPi](https://img.shields.io/pypi/v/logzero.svg)](https://pypi.python.org/pypi/logzero) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/logzero/badges/version.svg)](https://anaconda.org/conda-forge/logzero) [![Downloads](https://pepy.tech/badge/logzero/week)](https://pepy.tech/project/logzero) Robust and effective logging for Python 2 and 3. ![Logo](https://raw.githubusercontent.com/metachris/logzero/master/docs/_static/demo-output-with-beaver.png) * Documentation: https://logzero.readthedocs.io * GitHub: https://github.com/metachris/logzero Features -------- * Easy logging to console and/or (rotating) file. * Provides a fully configured standard [Python logger object](https://docs.python.org/2/library/logging.html#module-level-functions>). * JSON logging (with integrated [python-json-logger](https://github.com/madzak/python-json-logger)) * Pretty formatting, including level-specific colors in the console. * No dependencies * Windows color output supported by [colorama](https://github.com/tartley/colorama) * Robust against str/bytes encoding problems, works with all kinds of character encodings and special characters. * Multiple loggers can write to the same logfile (also across multiple Python files and processes). * Global default logger with [logzero.logger](https://logzero.readthedocs.io/en/latest/#i-logzero-logger) and custom loggers with [logzero.setup_logger(..)](https://logzero.readthedocs.io/en/latest/#i-logzero-setup-logger). * Compatible with Python 2 and 3. * All contained in a [single file](https://github.com/metachris/logzero/blob/master/logzero/__init__.py). * Licensed under the MIT license. * Heavily inspired by the [Tornado web framework](https://github.com/tornadoweb/tornado). Installation: ```shell python -m pip install logzero ``` Example Usage ------------- ```python from logzero import logger logger.debug("hello") logger.info("info") logger.warning("warn") logger.error("error") # This is how you'd log an exception try: raise Exception("this is a demo exception") except Exception as e: logger.exception(e) # JSON logging import logzero logzero.json() logger.info("JSON test") # Start writing into a logfile logzero.logfile("/tmp/logzero-demo.log") # Set a minimum loglevel logzero.loglevel(logzero.WARNING) ``` This is the output: ![demo-output](https://raw.githubusercontent.com/metachris/logzero/master/docs/_static/demo-output-json.png) Note: You can find more examples in the documentation: https://logzero.readthedocs.io ### JSON logging JSON logging can be enabled for the default logger with `logzero.json()`, or with `setup_logger(json=True)` for custom loggers: ```python >>> logzero.json() >>> logger.info("test") {"asctime": "2020-10-21 10:42:45,808", "filename": "", "funcName": "", "levelname": "INFO", "levelno": 20, "lineno": 1, "module": "", "message": "test", "name": "logzero_default", "pathname": "", "process": 76179, "processName": "MainProcess", "threadName": "MainThread"} >>> my_logger = setup_logger(json=True) >>> my_logger.info("test") {"asctime": "2020-10-21 10:42:45,808", "filename": "", "funcName": "", "levelname": "INFO", "levelno": 20, "lineno": 1, "module": "", "message": "test", "name": "logzero_default", "pathname": "", "process": 76179, "processName": "MainProcess", "threadName": "MainThread"} ``` The logged JSON object has these fields: ```json { "asctime": "2020-10-21 10:43:40,765", "filename": "test.py", "funcName": "test_this", "levelname": "INFO", "levelno": 20, "lineno": 9, "module": "test", "message": "info", "name": "logzero", "pathname": "_tests/test.py", "process": 76204, "processName": "MainProcess", "threadName": "MainThread" } ``` Exceptions logged with `logger.exception(e)` have these additional JSON fields: ```json { "levelname": "ERROR", "levelno": 40, "message": "this is a demo exception", "exc_info": "Traceback (most recent call last):\n File \"_tests/test.py\", line 15, in test_this\n raise Exception(\"this is a demo exception\")\nException: this is a demo exception" } ``` Take a look at the documentation for more information and examples: * Documentation: https://logzero.readthedocs.io. Installation ------------ Install `logzero` with [pip](https://pip.pypa.io): ```shell python -m pip install logzero ``` Here's how you setup a virtualenv and download and run the demo: ```shell # Create and activate a virtualenv in ./venv/ python3 -m venv venv . venv/bin/activate # Install logzero python -m pip install logzero # Download and run demo.py wget https://raw.githubusercontent.com/metachris/logzero/master/examples/demo.py python demo.py ``` If you don't have [pip](https://pip.pypa.io) installed, this [Python installation guide](http://docs.python-guide.org/en/latest/starting/installation/) can guide you through the process. Alternatively, if you use the [Anaconda distribution](https://www.anaconda.com/download/): ```shell $ conda config --add channels conda-forge $ conda install logzero ``` You can also install `logzero` from the public [Github repo](https://github.com/metachris/logzero): ```shell $ git clone https://github.com/metachris/logzero.git $ cd logzero $ python setup.py install ``` Contributors ------------ * [Chris Hager](https://github.com/metachris) * [carlodr](https://github.com/carlodri) * [Brian Lenz](https://github.com/brianlenz) * [David Martin](https://github.com/dmartin35) * [Zakaria Zajac](madzak) (creator of [python-json-logger](https://github.com/madzak/python-json-logger)) --- Development ----------- **Getting started** ```shell $ git clone https://github.com/metachris/logzero.git $ cd logzero # Activate virtualenv $ python3 -m venv venv $ . venv/bin/activate # Install main and dev dependencies $ pip install -e . $ pip install -r requirements_dev.txt # Run the tests $ make test # Run the linter $ make lint # Generate the docs (will auto-open in Chrome) $ make docs # You can enable watching mode to automatically rebuild on changes: $ make servedocs ``` To test with Python 2.7, you can use Docker: ```shell docker run --rm -it -v /Users/chris/stream/logzero:/mnt python:2.7 /bin/bash ``` Now you have a shell with the current directory mounted into `/mnt/` inside the container. **Notes** * [pytest](https://docs.pytest.org/en/latest/) is the test runner * CI is run with [Github actions](https://github.com/metachris/logzero/tree/master/.github/workflows). * Download stats: https://pepy.tech/project/logzero --- Changelog --------- See the changelog here: https://github.com/metachris/logzero/blob/master/HISTORY.md Feedback -------- All kinds of feedback and contributions are welcome. * [Create an issue](https://github.com/metachris/logzero/issues/new) * Create a pull request * [@metachris](https://twitter.com/metachris) ![logo](https://raw.githubusercontent.com/metachris/logzero/master/docs/_static/logo-420.png) History ======= 1.6.5 (2021-03-17) ------------------ - Export loglevels directly (you can use eg. `logzero.DEBUG` instead of `logging.DEBUG`) - `setup_default_logger` use `backupCount` - Update dependencies - PRs: (386)[https://github.com/metachris/logzero/pull/386] 1.6.3 (2020-11-15) ------------------ - JSON logging with UTF-8 enabled by default ([PR 357](https://github.com/metachris/logzero/pull/357)) 1.6.0 (1.6.2) (2020-10-29) -------------------------- - JSON logging support ([PR 344][]) - Ability to easily change colors ([\#82][]) - Allow creating a root logger ([\#342][]) - Bugfix: file logging with lower loglevel than stream ([PR 338][]) - Running tests with Python up to 3.9 - Dependency updates 1.5.0 (2018-03-07) ------------------ - `logzero.syslog(..)` ([PR 83][]) 1.4.0 (2018-03-02) ------------------ - Allow Disabling stderr Output ([PR 83][1]) 1.3.0 (2017-07-19) ------------------ - Color output now works in Windows (supported by colorama) 1.2.1 (2017-07-09) ------------------ - Logfiles with custom loglevels (eg. stream handler with DEBUG and file handler with ERROR). 1.2.0 (2017-07-05) ------------------ - Way better API for configuring the default logger with logzero.loglevel(..), logzero.logfile(..), etc. - Built-in rotating logfile support. ``` python import logging import logzero from logzero import logger # This log message goes to the console logger.debug("hello") # Set a minimum log level logzero.loglevel(logging.INFO) # Set a logfile (all future log messages are also saved there) logzero.logfile("/tmp/logfile.log") # Set a rotating logfile (replaces the previous logfile handler) logzero.logfile("/tmp/rotating-logfile.log", maxBytes=1000000, backupCount=3) # Disable logging to a file logzero.logfile(None) # Set a custom formatter formatter = logging.Formatter('%(name)s - %(asctime)-15s - %(levelname)s: %(message)s'); logzero.formatter(formatter) # Log some variables logger.info("var1: %s, var2: %s", var1, var2) ``` 1.1.2 (2017-07-04) ------------------ - Better reconfiguration of handlers, doesn't remove custom handlers anymore 1.1.0 (2017-07-03) ------------------ - Bugfix: Disabled color logging to logfile 1.1.0 (2017-07-02) ------------------ - Global default logger instance (logzero.logger) - Ability to reconfigure the default logger with (logzero.setup\_default\_logger(..)) - More tests - More documentation 1.0.0 (2017-06-27) ------------------ - Cleanup and documentation 0.2.0 (2017-06-12) ------------------ - Working logzero package with code and tests 0.1.0 (2017-06-12) ------------------ - First release on PyPI. [PR 344]: https://github.com/metachris/logzero/pull/344 [\#82]: https://github.com/metachris/logzero/issues/82 [\#342]: https://github.com/metachris/logzero/pull/342 [PR 338]: https://github.com/metachris/logzero/pull/338 [PR 83]: https://github.com/metachris/logzero/pull/84 [1]: https://github.com/metachris/logzero/pull/83 Keywords: logzero Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Natural Language :: English Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Description-Content-Type: text/markdown ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980257.0 logzero-1.7.0/logzero.egg-info/SOURCES.txt0000644000175100001710000000133400000000000017600 0ustar00runnerdockerCONTRIBUTING.rst HISTORY.md LICENSE MANIFEST.in README.md setup.cfg setup.py docs/Makefile docs/conf.py docs/contributing.rst docs/index.rst docs/make.bat docs/_static/demo-output-json.png docs/_static/demo-output-with-beaver.png docs/_static/demo_output.png docs/_static/demo_output_with_exception.png docs/_static/logo-420.png docs/_static/logo-big.png docs/_static/logo.png docs/_static/logo_1000x500.png logzero/__init__.py logzero/colors.py logzero/jsonlogger.py logzero.egg-info/PKG-INFO logzero.egg-info/SOURCES.txt logzero.egg-info/dependency_links.txt logzero.egg-info/not-zip-safe logzero.egg-info/requires.txt logzero.egg-info/top_level.txt tests/__init__.py tests/test_json.py tests/test_logzero.py tests/test_new_api.py././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980257.0 logzero-1.7.0/logzero.egg-info/dependency_links.txt0000644000175100001710000000000100000000000021761 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980257.0 logzero-1.7.0/logzero.egg-info/not-zip-safe0000644000175100001710000000000100000000000020141 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980257.0 logzero-1.7.0/logzero.egg-info/requires.txt0000644000175100001710000000004300000000000020310 0ustar00runnerdocker [:sys_platform=="win32"] colorama ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980257.0 logzero-1.7.0/logzero.egg-info/top_level.txt0000644000175100001710000000001000000000000020434 0ustar00runnerdockerlogzero ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1615980257.5136695 logzero-1.7.0/setup.cfg0000644000175100001710000000064200000000000014363 0ustar00runnerdocker[bumpversion] current_version = 1.7.0 commit = True tag = True [bumpversion:file:setup.py] search = version='{current_version}' replace = version='{new_version}' [bumpversion:file:logzero/__init__.py] search = __version__ = '{current_version}' replace = __version__ = '{new_version}' [bdist_wheel] universal = 1 [flake8] exclude = docs ignore = E501 [aliases] test = pytest [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/setup.py0000644000175100001710000000275500000000000014263 0ustar00runnerdocker#!/usr/bin/env python # -*- coding: utf-8 -*- """The setup script.""" from setuptools import setup, find_packages with open('README.md') as readme_file: readme = readme_file.read() with open('HISTORY.md') as history_file: history = history_file.read() setup( name='logzero', version='1.7.0', description="Robust and effective logging for Python 2 and 3", long_description=readme + '\n\n' + history, long_description_content_type='text/markdown', author="Chris Hager", author_email='chris@linuxuser.at', url='https://github.com/metachris/logzero', packages=find_packages(include=['logzero']), include_package_data=True, license="MIT license", zip_safe=False, keywords='logzero', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Natural Language :: English', "Programming Language :: Python :: 2", 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', ], extras_require={ ':sys_platform=="win32"': ['colorama'] } ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1615980257.5136695 logzero-1.7.0/tests/0000755000175100001710000000000000000000000013702 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/tests/__init__.py0000644000175100001710000000007600000000000016016 0ustar00runnerdocker# -*- coding: utf-8 -*- """Unit test package for logzero.""" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/tests/test_json.py0000644000175100001710000000445000000000000016267 0ustar00runnerdocker""" test json related things """ import json import tempfile import logzero def _test_json_obj_content(obj): # Check that all fields are contained attrs = ['asctime', 'filename', 'funcName', 'levelname', 'levelno', 'lineno', 'module', 'message', 'name', 'pathname', 'process', 'processName', 'threadName'] assert obj["message"] == "info" for attr in attrs: if attr not in obj: raise Exception("obj missing key '%s'" % attr) def test_json(capsys): """ Test json logging """ # Test setup_logger logger = logzero.setup_logger(json=True) logger.info('info') out, err = capsys.readouterr() _test_json_obj_content(json.loads(err)) def test_json_default_logger(capsys): # Test default logger logzero.reset_default_logger() logzero.logger.info('info') out, err = capsys.readouterr() assert "] info" in err logzero.json() logzero.logger.info('info') out, err = capsys.readouterr() _test_json_obj_content(json.loads(err)) logzero.json(False) logzero.logger.info('info') out, err = capsys.readouterr() assert "] info" in err def test_json_logfile(capsys): # Test default logger logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logger = logzero.setup_logger(logfile=temp.name, json=True) logger.info('info') with open(temp.name) as f: content = f.read() _test_json_obj_content(json.loads(content)) finally: temp.close() def test_json_encoding(capsys): """ see logzero.json(json_ensure_ascii=True) """ logzero.reset_default_logger() # UTF-8 mode logzero.json(json_ensure_ascii=False) logzero.logger.info('ß') out, err = capsys.readouterr() json.loads(err) # make sure JSON is valid assert 'ß' in err assert 'u00df' not in err # ASCII mode logzero.json(json_ensure_ascii=True) logzero.logger.info('ß') out, err = capsys.readouterr() json.loads(err) # make sure JSON is valid assert 'u00df' in err assert 'ß' not in err # Default JSON mode should be utf-8 logzero.json() logzero.logger.info('ß') out, err = capsys.readouterr() json.loads(err) # make sure JSON is valid assert 'ß' in err assert 'u00df' not in err ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/tests/test_logzero.py0000644000175100001710000002421300000000000016776 0ustar00runnerdocker#!/usr/bin/env python # -*- coding: utf-8 -*- """ test_logzero ---------------------------------- Tests for `logzero` module. """ import os import tempfile import logging import logzero def test_write_to_logfile_and_stderr(capsys): """ When using `logfile=`, should by default log to a file and stderr. """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logger = logzero.setup_logger('test_write_to_logfile_and_stderr', logfile=temp.name) logger.info("test log output") _out, err = capsys.readouterr() assert " test_logzero:" in err assert err.endswith("test log output\n") with open(temp.name) as f: content = f.read() assert " test_logzero:" in content assert content.endswith("test log output\n") finally: temp.close() def test_custom_formatter(): """ Should work with a custom formatter. """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: log_format = '%(color)s[%(levelname)1.1s %(asctime)s customnametest:%(lineno)d]%(end_color)s %(message)s' formatter = logzero.LogFormatter(fmt=log_format) logger = logzero.setup_logger(logfile=temp.name, formatter=formatter) logger.info("test log output") with open(temp.name) as f: content = f.read() assert " customnametest:" in content assert content.endswith("test log output\n") finally: temp.close() def test_loglevel(): """ Should not log any debug messages if minimum level is set to INFO """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logger = logzero.setup_logger(logfile=temp.name, level=logzero.INFO) logger.debug("test log output") with open(temp.name) as f: content = f.read() assert len(content.strip()) == 0 finally: temp.close() def test_bytes(): """ Should properly log bytes """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logger = logzero.setup_logger(logfile=temp.name) testbytes = os.urandom(20) logger.debug(testbytes) logger.debug(None) # with open(temp.name) as f: # content = f.read() # # assert str(testbytes) in content finally: temp.close() def test_unicode(): """ Should log unicode """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logger = logzero.setup_logger(logfile=temp.name) logger.debug("😄 😁 😆 😅 😂") with open(temp.name, "rb") as f: content = f.read() assert "\\xf0\\x9f\\x98\\x84 \\xf0\\x9f\\x98\\x81 \\xf0\\x9f\\x98\\x86 \\xf0\\x9f\\x98\\x85 \\xf0\\x9f\\x98\\x82\\n" in repr(content) finally: temp.close() def test_multiple_loggers_one_logfile(): """ Should properly log bytes """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logger1 = logzero.setup_logger(name="logger1", logfile=temp.name) logger2 = logzero.setup_logger(name="logger2", logfile=temp.name) logger3 = logzero.setup_logger(name="logger3", logfile=temp.name) logger1.info("logger1") logger2.info("logger2") logger3.info("logger3") with open(temp.name) as f: content = f.read().strip() assert "logger1" in content assert "logger2" in content assert "logger3" in content assert len(content.split("\n")) == 3 finally: temp.close() def test_default_logger(disableStdErrorLogger=False): """ Default logger should work and be able to be reconfigured. """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logzero.setup_default_logger(logfile=temp.name, disableStderrLogger=disableStdErrorLogger) logzero.logger.debug("debug1") # will be logged # Reconfigure with loglevel INFO logzero.setup_default_logger(logfile=temp.name, level=logzero.INFO, disableStderrLogger=disableStdErrorLogger) logzero.logger.debug("debug2") # will not be logged logzero.logger.info("info1") # will be logged # Reconfigure with a different formatter log_format = '%(color)s[xxx]%(end_color)s %(message)s' formatter = logzero.LogFormatter(fmt=log_format) logzero.setup_default_logger(logfile=temp.name, level=logzero.INFO, formatter=formatter, disableStderrLogger=disableStdErrorLogger) logzero.logger.info("info2") # will be logged with new formatter logzero.logger.debug("debug3") # will not be logged with open(temp.name) as f: content = f.read() _test_default_logger_output(content) finally: temp.close() def _test_default_logger_output(content): assert "] debug1" in content assert "] debug2" not in content assert "] info1" in content assert "xxx] info2" in content assert "] debug3" not in content def test_setup_logger_reconfiguration(): """ Should be able to reconfigure without loosing custom handlers """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() temp2 = tempfile.NamedTemporaryFile() try: logzero.setup_default_logger(logfile=temp.name) # Add a custom file handler filehandler = logging.FileHandler(temp2.name) filehandler.setLevel(logzero.DEBUG) filehandler.setFormatter(logzero.LogFormatter(color=False)) logzero.logger.addHandler(filehandler) # First debug message goes to both files logzero.logger.debug("debug1") # Reconfigure logger to remove logfile logzero.setup_default_logger() logzero.logger.debug("debug2") # Reconfigure logger to add logfile logzero.setup_default_logger(logfile=temp.name) logzero.logger.debug("debug3") # Reconfigure logger to set minimum loglevel to INFO logzero.setup_default_logger(logfile=temp.name, level=logzero.INFO) logzero.logger.debug("debug4") logzero.logger.info("info1") # Reconfigure logger to set minimum loglevel back to DEBUG logzero.setup_default_logger(logfile=temp.name, level=logzero.DEBUG) logzero.logger.debug("debug5") with open(temp.name) as f: content = f.read() assert "] debug1" in content assert "] debug2" not in content assert "] debug3" in content assert "] debug4" not in content assert "] info1" in content assert "] debug5" in content with open(temp2.name) as f: content = f.read() assert "] debug1" in content assert "] debug2" in content assert "] debug3" in content assert "] debug4" not in content assert "] info1" in content assert "] debug5" in content finally: temp.close() def test_setup_logger_logfile_custom_loglevel(capsys): """ setup_logger(..) with filelogger and custom loglevel """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logger = logzero.setup_logger(logfile=temp.name, fileLoglevel=logzero.WARN) logger.info("info1") logger.warning("warn1") with open(temp.name) as f: content = f.read() assert "] info1" not in content assert "] warn1" in content finally: temp.close() def test_log_function_call(): @logzero.log_function_call def example(): """example doc""" pass assert example.__name__ == "example" assert example.__doc__ == "example doc" def test_default_logger_logfile_only(capsys): """ Run the ``test_default_logger`` with ``disableStdErrorLogger`` set to ``True`` and confirm that no data is written to stderr """ test_default_logger(disableStdErrorLogger=True) out, err = capsys.readouterr() assert err == '' def test_default_logger_stderr_output(capsys): """ Run the ``test_default_logger`` and confirm that the proper data is written to stderr """ test_default_logger() out, err = capsys.readouterr() _test_default_logger_output(err) def test_default_logger_syslog_only(capsys): """ Run a test logging to ``syslog`` and confirm that no data is written to stderr. Note that the output in syslog is not currently being captured or checked. """ logzero.reset_default_logger() logzero.syslog() logzero.logger.error('debug') out, err = capsys.readouterr() assert out == '' and err == '' def test_logfile_lower_loglevel(capsys): """ logzero.logfile(..) should work with a lower loglevel than the StreamHandler """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logzero.loglevel(level=logzero.INFO) logzero.logfile(temp.name, loglevel=logzero.DEBUG) logzero.logger.debug("debug") logzero.logger.info("info") with open(temp.name) as f: content = f.read() assert "] debug" in content assert "] info" in content finally: temp.close() def test_logfile_lower_loglevel_setup_logger(capsys): """ logzero.setup_logger(..) should work with a lower loglevel than the StreamHandler """ temp = tempfile.NamedTemporaryFile() try: logger = logzero.setup_logger(level=logzero.INFO, logfile=temp.name, fileLoglevel=logzero.DEBUG) logger.debug("debug") logger.info("info") with open(temp.name) as f: content = f.read() assert "] debug" in content assert "] info" in content finally: temp.close() def test_root_logger(capsys): """ Test creating a root logger """ logzero.reset_default_logger() logger1 = logzero.setup_logger() assert logger1.name == 'logzero' logger2 = logzero.setup_logger(isRootLogger=True) assert logger2.name == 'root' logger3 = logzero.setup_logger(name='') assert logger3.name == 'root' ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1615980253.0 logzero-1.7.0/tests/test_new_api.py0000644000175100001710000000767700000000000016756 0ustar00runnerdocker#!/usr/bin/env python # -*- coding: utf-8 -*- """ test_logzero ---------------------------------- Tests for `logzero` module. """ import os import tempfile import logzero def test_api_logfile(capsys): """ logzero.logfile(..) should work as expected """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logzero.logger.info("info1") # Set logfile logzero.logfile(temp.name) logzero.logger.info("info2") # Remove logfile logzero.logfile(None) logzero.logger.info("info3") # Set logfile again logzero.logfile(temp.name) logzero.logger.info("info4") with open(temp.name) as f: content = f.read() assert "] info1" not in content assert "] info2" in content assert "] info3" not in content assert "] info4" in content finally: temp.close() def test_api_loglevel(capsys): """ Should reconfigure the internal logger loglevel """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logzero.logfile(temp.name) logzero.logger.info("info1") logzero.loglevel(logzero.WARN) logzero.logger.info("info2") logzero.logger.warning("warn1") with open(temp.name) as f: content = f.read() assert "] info1" in content assert "] info2" not in content assert "] warn1" in content finally: temp.close() def test_api_loglevel_custom_handlers(capsys): """ Should reconfigure the internal logger loglevel and custom handlers """ logzero.reset_default_logger() # TODO pass # temp = tempfile.NamedTemporaryFile() # try: # logzero.logfile(temp.name) # logzero.logger.info("info1") # logzero.loglevel(logzero.WARN) # logzero.logger.info("info2") # logzero.logger.warning("warn1") # with open(temp.name) as f: # content = f.read() # assert "] info1" in content # assert "] info2" not in content # assert "] warn1" in content # finally: # temp.close() def test_api_rotating_logfile(capsys): """ logzero.rotating_logfile(..) should work as expected """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: logzero.logger.info("info1") # Set logfile logzero.logfile(temp.name, maxBytes=10, backupCount=3) logzero.logger.info("info2") logzero.logger.info("info3") with open(temp.name) as f: content = f.read() assert "] info1" not in content # logged before setting up logfile assert "] info2" not in content # already rotated out assert "] info3" in content # already rotated out fn_rotated = temp.name + ".1" assert os.path.exists(fn_rotated) with open(fn_rotated) as f: content = f.read() assert "] info2" in content finally: temp.close() def test_api_logfile_custom_loglevel(): """ logzero.logfile(..) should be able to use a custom loglevel """ logzero.reset_default_logger() temp = tempfile.NamedTemporaryFile() try: # Set logfile with custom loglevel logzero.logfile(temp.name, loglevel=logzero.WARN) logzero.logger.info("info1") logzero.logger.warning("warn1") # If setting a loglevel with logzero.loglevel(..) it will not overwrite # the custom loglevel of the file handler logzero.loglevel(logzero.INFO) logzero.logger.info("info2") logzero.logger.warning("warn2") with open(temp.name) as f: content = f.read() assert "] info1" not in content assert "] warn1" in content assert "] info2" not in content assert "] warn2" in content finally: temp.close()