pax_global_header00006660000000000000000000000064147644032230014517gustar00rootroot0000000000000052 comment=9b67a3f2914be966c35dd8f00bef19d01b9ec68e segno-1.6.6/000077500000000000000000000000001476440322300126445ustar00rootroot00000000000000segno-1.6.6/.editorconfig000066400000000000000000000002151476440322300153170ustar00rootroot00000000000000root = true [*] indent_style = space indent_size = 4 insert_final_newline = true end_of_line = lf charset = utf-8 [*.html] indent_size = 2 segno-1.6.6/.gitattributes000066400000000000000000000002431476440322300155360ustar00rootroot00000000000000*.py text eol=lf *.pyi text eol=lf *.rst text eol=lf LICEN[CS]E text eol=lf py.typed text eol=lf *.ttf binary *.png binary *.webp binary *.gif binary *.jpg binary segno-1.6.6/.github/000077500000000000000000000000001476440322300142045ustar00rootroot00000000000000segno-1.6.6/.github/workflows/000077500000000000000000000000001476440322300162415ustar00rootroot00000000000000segno-1.6.6/.github/workflows/ci.yml000066400000000000000000000020011476440322300173500ustar00rootroot00000000000000name: ci on: push: pull_request: permissions: contents: read jobs: build: runs-on: ubuntu-24.04 name: "python ${{ matrix.python-version }}" strategy: matrix: python-version: ['pypy-3.10', 3.9, '3.10', '3.11', '3.12', '3.13'] steps: - uses: actions/checkout@v3 - name: Set up python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | sudo apt -y install libzbar0 pip install -r tests/requirements.txt pip install ruff pip install mypy - name: Run tests run: | pytest - name: Run lint tests if: ${{ matrix.python-version == '3.13' }} run: | ruff check . mypy segno segno-1.6.6/.gitignore000066400000000000000000000002371476440322300146360ustar00rootroot00000000000000*.pyc .coverage .[nt]ox/ .idea/ .venv/ *.egg-info dist/ build/ venv/ sandbox/out/*.svg sandbox/out/*.png examples/qrcode_text/*.svg examples/qrcode_text/*.png segno-1.6.6/.readthedocs.yaml000066400000000000000000000005631476440322300160770ustar00rootroot00000000000000# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 # Set the version of Python and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" # Build documentation in the docs/ directory with Sphinx sphinx: configuration: docs/conf.py python: install: - requirements: docs/requirements.txt segno-1.6.6/CHANGES.rst000066400000000000000000000552251476440322300144570ustar00rootroot00000000000000Changes ======= 1.6.6 -- 2025-03-12 ------------------- * Fixed man page directory. This issue was introduced by mistake in the 1.6.4/1.6.5 release and was reported by `Johannes Kastl `_ and `Michał Górny `_ 1.6.5 -- 2025-03-11 ------------------- * Fixed release notes / aligned changelog to the mistake of skipping two minor releases 1.6.4 -- 2025-03-11 ------------------- * Fixed packaging: include man page, source distribution did not contain all relevant files such as docs and test suite. * Moved man page to the correct directory * Fixed PDF creation: `PR #144 `_ and `PR #145 `_ provided by `Mathias Winkel `_ * Merged `PR #143 `_ (typo in docs) provided by `Marek Madejski `_ 1.6.2 - 1.6.3 -- not released ----------------------------- * Release 1.6.2 was labeled as 1.6.4 by mistake 1.6.1 -- 2024-02-08 ------------------- * Switched from setuptools to flit for setup * Updated test suite to work with musl based distributions 1.6.0 -- 2023-11-28 ------------------- * Dropped Python 2.7 support * Removed dependency on ``pkg_resources``. Segno uses ``importlib.metadata`` to provide plugins. For Python versions < 3.10 this introduces a dependency on ``importlib-metadata``. 1.5.3 -- 2023-10-25 ------------------- * Merged `PR #124 `_ implemented by `missionfloyd `_: Remove the trailing dot of latitude/longitude information. * Merged `PR #125 `_ implemented by `missionfloyd `_: More lenient check how to interpret empty or false values in vCard and MeCard. * Internal changes: Made ``writers`` module independent of internal version constants, they operate upon a matrix of a given size and know nothing about the QR Code version (i.e. QR Code vs. Micro QR Code). These changes are backwards incompatible but the ``writers`` module does not belong to the public API anyway. * Dropped testing against PyPy2 * Changed default Python test version to 3.11 (2.7 is still supported) * Support for Python 2.7 will be dropped in the next version of Segno because it is no longer possible to run automatic tests against Python 2.x. * Removed deprecated statements from setup.cfg (`#127 `_ thanks for the hint, `Gene `_) * Updated example to Pillow 10 API (`#128 `_, again thanks to `Gene `_) 1.5.2 -- 2022-05-25 ------------------- * Added support for `PEP 517 `_ * Removed PyQRCode from comparison / benchmarks since it adds no value anymore * Added more properties for vCard see `PR #106 `_ contributed by `Tobias Udtke `_: - cellphone (TEL;TYPE=CELL) - homephone (TEL;TYPE=HOME) - workphone (TEL;TYPE=WORK) Signatures of `segno.helpers.make_vcard `_ and `segno.helpers.make_vcard_data `_ changed, but in a backwards compatible way. * Changed default Python test version to 3.10 (2.7 and above are still supported) 1.5.1 -- 2022-05-24 ------------------- * Unreleased due to packaging failures. 1.5.0 -- 2022-05-24 ------------------- * Unreleased due to packaging failures. 1.4.1 -- 2021-11-25 ------------------- * Fixed Python type hints * XPM serializer accepts ``None`` (transparent) for dark modules * Better docs 1.4.0 -- 2021-11-06 ------------------- * Added option to print QR codes in a more compact manner to the terminal. `PR #97 `_ implemented by `Christian Oudard `_. * Minor doc changes * Added more test cases * Updated benchmark results 1.3.3 -- 2021-03-23 ------------------- * Fixed `#95 `_: ``helpers.make_wifi`` and ``helpers.make_wifi_data`` may return invalid data if any input contains characters which can be interpreted as an integer. * Updated ``helpers.make_wifi`` and ``helpers.make_wifi_data`` signature and doc strings to match the stub / type hints. 1.3.2 -- 2021-03-22 ------------------- * Not released due to twine issues (markup errors in README.rst) 1.3.1 -- 2020-09-01 ------------------- * Fixed: Stub files (type hints) were missing from the source distribution. 1.3.0 -- 2020-08-31 ------------------- * Fixed `#84 `_: CLI ``--encoding`` was used for the encoding of SVG documents and not for the encoding of the QR code. Added ``--svgencoding`` to specify the encoding of SVG documents. 1.2.1 -- 2020-08-27 ------------------- * Improved API docs * Added support for type hints for the public API (stub files) 1.2.0 -- 2020-08-18 ------------------- * Added ``QRCode.svg_inline`` method which returns a string which can be used to embed the SVG directly in HTML pages. * Improved documentation * Improved code quality * Switched from `tox `_ to `nox `_ * Utilize `flake8 `_ * Moved metadata from setup.py to setup.cfg 1.1.0 -- 2020-08-05 ------------------- * Support for `Hanzi `_ mode, implemented by `Shi Yan `_ * Fixed `#81 `_: Wrong character count in Kanji mode if the user provided the QR code data as bytes. * Improved documentation * Improved API docs 1.0.2 -- 2020-07-30 ------------------- * Fixed error in Kanji encoding: Data was incomplete. Again, discovered by `Shi Yan `_ * Better test coverage for Kanji encoding 1.0.1 -- 2020-07-28 ------------------- * Fixed wrong information about character count in Kanji mode (discovered and fixed by `Shi Yan `_) * Fixed `#72 `_: Encodings for ``helpers.make_epc_qr`` may be specified by name or by a numeric constant. * Added support for `Netpbm PPM `_ images. * Documentation improvements (also thanks to `James Addison `_ for pr `#73 `_) * Removed "version" parameter from ``encoder.prepare_data`` (does not belong to the public API anyway) 1.0.0 -- 2020-02-14 ------------------- * Removed support for ``color`` / ``background`` keywords (deprecated in 0.4.0). Use ``dark`` and ``light``. * Reintroduced ``segno.DataOverflowError`` (inherited from ``ValueError``) to indicate that the provided data does not fit into the provided (Micro) QR Code parameters. * Documentation improvements * Although this lib made backwards incompatible changes since version 0.1.0, the changes should be clear since almost all changes were made very conservative with backwards compatibility in mind. Even early adopters should find a clear update path. This version marks a stable API acc. to `Semantic Versioning `_. * The initial stable release after nearly four years of development. Happy valentine ;) 0.4.0 -- 2020-01-21 ------------------- * Removed deprecated functions, modules etc. See `#56 `_, `#57 `_, `#59 `_, `#61 `_, `#67 `_. * Deprecated usage of keywords "color" and "background". Replacements: "dark" and "light". See `#60 `_. The deprecated keywords will be removed in 1.0.0. * Minor performance improvements for writing SVG (at least for Py 3.7, YMMV). * Documentation improvements 0.3.9 -- 2020-01-19 ------------------- * Fixed `#71 `_: Dark / light modules of the finder pattern may be interpreted wrong if set to ``None`` * Removed segno.encoder, segno.writers and segno.utils from public API (fixes `#69 `_) * Removed segno.colors (part of segno.writers now) * Documentation improvements 0.3.8 -- 2020-01-15 ------------------- * Added support for multiple (more than two) colors to SVG (fixes `#64 `_) * Fixed several test cases * Removed ``QRCodeError`` and all derived exceptions from public API (still available but not thrown and they will be removed in 0.4.0) * Documentation improvements 0.3.7 -- 2020-01-09 ------------------- * Documentation improvements: Added several examples, fixed docs * Fixed `#62 `_: PNG serializer adds only those colors to the PLTE which are actually needed for the given (Micro) QR Code. * Minor performance improvements 0.3.6 -- 2020-01-06 ------------------- * Backwards incompatibility change: QRCode.show() uses "dark" instead of "color" and "light" instead of "background" to define the color of the dark / light modules * Backwards incompatibility change: All ``segno.writers`` use "dark" instead of "color" and "light" instead of "background". This does not affect normal users, but only users of the low level API. * Changed the keyword for setting the color of the dark modules from "color" to "dark" and for setting the light modules from "background" to "light" The former keywords are still supported. Their usage will issue a DeprecationWarning in the future. * Added ``--dark`` and ``--light`` to the command line interface, see point above. ```--color``` and ``--background`` are still supported. * Fixed typos, improved documentation * Deprecated ``segno.moduletypes`` (will be removed in release 0.4.0), moved all constants to ``segno.consts`` * Deprecated usage of parameter "colormap" (introduced in 0.3.4). It still works but a deprecation warning is issued. Instead of:: colormap = {mt.TYPE_FINDER_PATTERN_DARK: 'darkred', mt.TYPE_ALIGNMENT_PATTERN_DARK: 'darkred', mt.TYPE_TIMING_DARK: 'darkred', mt.TYPE_DARKMODULE: 'darkred', mt.TYPE_DATA_DARK: 'darkorange', mt.TYPE_DATA_LIGHT: 'yellow', mt.TYPE_FORMAT_DARK: 'darkred'} qr.save('qrcode.png', scale=5, colormap=colormap) use:: qr.save('qrcode.png', scale=5, dark='darkred', data_dark='darkorange', data_light='yellow') See `Colorful QR Codes `_ for a description of available module names. 0.3.5 -- 2020-01-03 ------------------- * Added support for colorful (more than two colors) QR Codes to the CLI script (fixes `#58 `_). * Fixed Read the Docs build * Improved documentation * Minor performance and code improvements. 0.3.4 -- 2020-01-02 ------------------- * Fixed issue `#54 `_: After last change (see 0.3.3), white background with transparent QR Code did not work. Enhanced test suite to cover all possible inputs for PNG grayscale mode * Removed interpretation of ``addad`` from PNG serializer. Contradicts the claim to create small images by default. It still belongs to the function signature but will be removed in release 0.4.0 * The option ``--no-ad`` (CLI) is still available but ignored and will be removed in release 0.4.0. Removed the option from man page. * Added option to PNG serializer to provide more than two colors. Each module type may have its own color. * Added support for EPC QR Codes. * Fixed bug in ``helpers.make_vcard_data`` function (the "source" URL was not used, but the usual URL was added to the SOURCE field) * Better test coverage for the ``segno.helpers`` module 0.3.3 -- 2019-12-29 ------------------- * Fixed issue `#54 `_: PNGs with white color and transparent background were rendered as transparent PNG with a *black* QR Code. * Removed test environments CPython 3.4 and 3.6 from tox * Improved documentation * Refactored source code * Added test cases * Fixed bugs in ``helpers.make_vcard_data`` function (superfluous semicolon in birthday line, check geo coordinates) * Renamed ``utils.matrix_iter_detail`` into ``utils.matrix_iter_verbose``. Kept ``matrix_iter_detail`` for backwards compatibility (deprecated, will be removed in release 0.4.0) * Moved module constants from ``segno.utils`` into ``segno.moduletypes``, Constants from ``segno.utils`` will be removed in release 0.4.0. * Added option ``verbose`` (default: ``False``) to ``segno.QRCode.matrix_iter()`` which returns an iterator which provides information about the module type (i.e. quiet zone, dark data module, light data module). 0.3.2 -- 2019-07-15 ------------------- * Performance improvements * Added man page for the CLI (fixes `#41 `_) * Added more documentation and examples * Fixed missing charts of * Added PyQRCodeNG to comparison table * Updated CSS for a better layout of tables with a lot of content * Removed deprecated functions ``encoder.score_n1``, ``encoder.score_n2``, ``encoder.score_n3``, and ``encoder.score_n4`` (they didn't belong to the public API anyway) * Fixed Read the Docs build 0.3.1 -- 2019-07-15 ------------------- * See 0.3.2 0.3.0 -- 2019-06-25 ------------------- * Performance improvements (evaluation of mask scores) * Faster PNG output * Faster ``utils.matrix_iter`` (which improves several writers, i.e. PNG) * Deprecation of ``encoder.score_n1``, ``encoder.score_n2``, ``encoder.score_n3``, and ``encoder.score_n4``. Use ``encoder.mask_scores`` or ``encoder.evaluate_mask``. 0.2.9 -- 2019-04-24 ------------------- * Fixed typos * PDF serializer: Added support for stroke and background color, initial code contributed by `Serge Morel `_ (pr `#52 `_). 0.2.8 -- 2018-10-17 ------------------- * Fixed `#45 `_: CLI does not raise exceptions but indicates errors with return code 1 and writes the error message to ``sys.stderr`` * Added experimental ``utils.matrix_iter_detail()`` function which returns an iterator over the matrix to distinguish different dark and light modules by their function (i.e. separator, finder pattern etc.) * Minor performance improvements * Removed Python 2.6 from test environment * Added support for vCard TITLE attribute, contributed by `Stefano Borini `_ (pr `#48 `_) * Added support for vCard PHOTO URI attribute, suggested by Arthur Reinhart 0.2.7 -- 2018-02-18 ------------------- * Fixed dist package 0.2.6 -- 2018-02-18 ------------------- * Updated and fixed docs * Added PyPy 3 to test environment 0.2.5 -- 2017-02-14 ------------------- * Added experimental support for Structured Append (divide content into max. 16 QR Code symbols) * Internal refactoring (i.e. segno/scripts/cmd.py -> segno/cli.py) * Added ``-s`` shortcut to Segno's command line interface to provide the scaling factor * Added ``-b`` shortcut to Segno's command line interface to provide the border / quiet zone * CLI accepts unquoted, whitespace separated content: ``segno "Comfortably Numb"`` can be written as ``segno Comfortably Numb`` 0.2.4 -- 2017-01-31 ------------------- * Fixed `#33 `_: Some Micro QR Codes may be unreadable due to wrong format information. Further, M1 and M3 codes may be wrong due to wrong encoding of final data symbol character (8 bits instead of (correct) 4 bits). Thanks to `Nicolas Boullis `_ for the bug report, initial fix, tests and patience. * Fixed `#34 `_: Change default error level from "M" to "L" to avoid surprises that the content does not fit into the provided version. This change is somewhat backwards incompatible. * Fixed `#35 `_: Check of user supplied mask pattern index was wrong. * Fixed `#36 `_: Wrong placement of codeword in M1 and M3 symbols. * Fixed `#37 `_: Generation of M1 / M3 symbols fail if the data modules are completely filled. * Fixed `#38 `_: Optimized mask pattern choosing algorithm: If the user supplied a preferred mask, the mask evaluation step is skipped and the preferred mask is chosen * Added more internal checks to ensure correct (Micro) QR Codes; provided helpful exceptions * Removed ``writers.get_writable`` (replaced by ``writers.writable``) * Added support for serializing QR Codes as XBM (X BitMap) (supports black / white images) * Added support for serializing QR Codes as XPM (X PixMap) (supports colors and transparency) * Added support for encoding contact information as vCard version 3.0 (``segno.helpers``) * Added -V shortcut to Segno's command line script to show version information * Better test coverage for command line script * Better test coverage for M1 and M3 symbols 0.2.3 -- 2016-10-17 ------------------- * Fixed `#27 `_: Email URI is wrong if CC or BCC is used. * Fixed `#32 `_: Don't add version attribute if SVG >= 2.0 * Deprecated ``writers.get_writable``; use ``writers.writable`` ``writers.writable`` closes file-like objects automatically (if necessary); replace ``writable, must_close = writers.get_writable(filename_or_buffer, mode)`` with ``with writers.writable(filename_or_buffer, mode) as f`` * Added option to PNG serializer to specify an optional DPI value (thanks to Markus Ueberall for support) * Added PAM (Portable Arbitrary Map) as serialization format (supports colors and transparency) 0.2.2 -- 2016-09-21 ------------------- * Command line script reports Segno's version (``--ver``) and the version is also mentioned in the help message (``-h``) (`#24 `_) * Support for creating email addresses or complete messages (``segno.helpers``) * Internal optimizations and more correct minimal version finding (`#26 `_) 0.2.1 -- 2016-09-15 ------------------- * Fixed Python packaging (source distribution did not work), again 0.2.0 -- 2016-09-15 ------------------- * Fixed Python packaging 0.1.9 -- 2016-09-15 ------------------- * Added "color" parameter to the LaTeX serializer to define the color of the dark modules. * Fixed serious issue `#23 `_: Segno creates invalid QR Codes if boost_error is not disabled (enabled by default) 0.1.8 -- 2016-09-14 ------------------- * Removed ``utils.matrix_with_border_iter`` * Fixed `#21 `_ (type error while writing to terminal under Windows) * Added option to serialize QR Codes as LaTeX vector graphic * Added module ``segno.helpers`` which provides additional factory functions to create common QR Codes like a WIFI configuration, a geo location or MeCard 0.1.7 -- 2016-09-04 ------------------- * Changed API: Added a feature to increase the error correction level if it fits. Disable this feature via ``boost_error=False`` (`#16 `_) * Added ``--no-error-boost`` to the command line script to disable error correction level incrementation (`#17 `_) * Command line script: Internal changes and better test coverage * Added tests for issue `#18 `_ * Added PBM (P1 and P4) serialization. * Deprecated ``utils.matrix_with_border_iter``, use ``utils.matrix_iter`` * ``utils.matrix_with_border_iter`` will be removed in the next release * API change: ``QRCode.matrix_iter(border)`` -> ``QRCode.matrix_iter(scale=1, border=None)`` 0.1.6 -- 2016-08-25 ------------------- * Fixed setup 0.1.5 -- 2016-08-24 ------------------- * Added QRCode.matrix_iter(border) which returns an iterator over the matrix and includes the border (as light modules). * Invalid (empty) SVG identifiers / class names are ignored and do not result into an invalid SVG document (issue `#8 `_). * SVG serializer: If ``unit`` was set to ``None``, an invalid SVG document was generated (issue `#14 `_). * Better command line support: - The command line script recognizes all SVG options (`#9 `_) - Added ``--mode``/``-m``, renamed ``--mask``/``-m`` to ``--pattern``/``-p`` (issue `#10 `_) - The script used an empty string as default value for the data to encode. The data to encode has no default value anymore (issue `#11 `_) - Added ``--no-ad`` to omit the comment ``Software`` in PNG images (issue `#12 `_) 0.1.4 -- 2016-08-21 ------------------- * Better terminal output * Fixed issue `#5 `_: QRCode.terminal() uses a special output function (if it detects Windows) to support MS Windows which may not support ANSI escape codes. 0.1.3 -- 2016-08-20 ------------------- * Added command line script "segno" * Registered new file extension "ans" which serializes the QR Code as ANSI escape code (same output as QRCode.terminal()) * Removed deprecated methods "eps", "svg", "png", "pdf", and "txt" from segno.QRCode * Switched from nose tests to py.test 0.1.2 -- 2016-08-17 ------------------- * Updated docs * Backward incompatible changes: Deprecated "eps", "svg", "png", "pdf", and "txt" methods from QRCode. Use QRCode.save. Methods will be removed in 0.1.3 * Fixed issue `#3 `_ (M1 and M3 codes may have undefined areas) * Fixed issue `#4 `_ (wrong 'error' default value for encoder.encode(), factory function segno.make() wasn't affected) 0.1.1 -- 2016-08-14 ------------------- * Initial release segno-1.6.6/LICENSE000066400000000000000000000027371476440322300136620ustar00rootroot00000000000000Copyright (c) 2016 - 2025, Lars Heuer All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. segno-1.6.6/MANIFEST.in000066400000000000000000000001061476440322300143770ustar00rootroot00000000000000include LICENSE *.txt *.rst segno/*.pyi segno/py.typed pyproject.toml segno-1.6.6/README.rst000066400000000000000000000144651476440322300143450ustar00rootroot00000000000000QR Code encoder and Micro QR Code encoder ========================================= Pure Python QR Code generator with no dependencies. This package implements ISO/IEC 18004:2015(E) "QR Code bar code symbology specification" and produces QR Codes and Micro QR Codes with nearly no effort. It supports the `Structured Append mode `_ which splits a message across several QR codes. Segno (Italian for "sign" / "symbol") provides several serialization formats like Scalable Vector Graphics (SVG), Encapsulated PostScript (EPS), Portable Network Graphics (PNG), Portable Document Format (PDF), Netpbm (PAM, PBM, PPM), LaTeX (PGF/TikZ), X PixMap (XBM), and X Bitmap (XPM) etc. None of these serializers require an external lib. Further, it provides several high level functions to create QR Codes which encode `contact data (vCard, MeCard) `_, `EPC QR Codes `_, or `WIFI QR Codes `_. The project provides more than 1500 test cases (coverage >= 98%) to verify a standard conform QR Code and Micro QR Code generation acc. to ISO/IEC 18004:2015(E). Unique features --------------- * Pure Python QR Code generator * No dependencies * A lot of `serialization formats `_ (SVG, PNG, EPS, PDF, ...) * `Fastest (pure Python) QR Code encoder `_ * Micro QR Codes * `Structured Append mode `_ * `Hanzi mode `_ * `Command line interface `_ * `Simple, user-friendly API `_ .. code-block:: python import segno qrcode = segno.make('Yellow Submarine') qrcode.save('yellow-submarine.png') * `Colorful QR codes `_ .. image:: https://github.com/heuer/segno/raw/master/docs/_static/colorful/qrcode_yellow-submarine.png :alt: Colorful 7-H QR code encoding "Yellow Submarine" ... works also with Micro QR codes .. image:: https://github.com/heuer/segno/raw/master/docs/_static/colorful/micro_qrcode_rain.png :alt: Colorful M4-Q Micro QR code encoding "Rain" * `Artistic QR Codes `_ (requires the `qrcode-artistic `_ plug-in) .. image:: https://github.com/heuer/segno/raw/master/docs/_static/artistic/letitbe.jpg :alt: Animated 3-H QR code encoding "The Beatles -- Let It Be" ... animated QR codes are supported as well .. image:: https://github.com/heuer/segno/raw/master/docs/_static/artistic/abbey-road.webp :alt: Animated 4-H QR code encoding "The Beatles -- Abbey Road" Installation ------------ Use ``pip`` to install segno from PyPI:: $ pip install segno conda-forge ^^^^^^^^^^^ The library is also available at `conda-forge `_ (`conda-forge project page `_):: $ conda install -c conda-forge segno Debian ^^^^^^ :: $ apt-get install python3-segno Arch Linux ^^^^^^^^^^ :: $ pacman -S python-segno Usage ----- Command line ^^^^^^^^^^^^ The command line script prints a QR code to the terminal:: $ segno "Comfortably Numb" To serialize a QR code, use the "output" argument:: $ segno -o=raincoat.svg "Famous Blue Raincoat" $ segno --scale 10 --dark darkblue --border 0 --output=fire.svg "Who by Fire" $ segno --scale 10 --light transparent --output=miracle.png "Waiting for the Miracle" Library ^^^^^^^ .. code-block:: python >>> import segno >>> # Let Segno choose the minimal version and an optimal (maximal) error >>> # level without changing the minimal version >>> qrcode = segno.make('Up Jumped the Devil') >>> qrcode.designator # Returns the QR code version and the error correction level '2-Q' >>> qrcode.save('up-jumped-the-devil.png') # Save as PNG >>> qrcode.save('up-jumped-the-devil-2.png', scale=10) # Scaling factor 10 >>> qrcode.save('up-jumped-the-devil-3.png', light=None) # Transparent light modules >>> qrcode.save('up-jumped-the-devil.pdf', scale=10) # Save as PDF >>> # SVG drawing the dark modules in "dark blue" >>> qrcode.save('up-jumped-the-devil.svg', scale=10, dark='darkblue') If the content to encode is small enough, a Micro QR code is generated: .. code-block:: python >>> import segno >>> qrcode = segno.make('RAIN') >>> qrcode.is_micro True >>> qrcode.designator 'M2-M' If this behaviour is not desired, the user may set ``micro`` to ``False`` .. code-block:: python >>> import segno >>> qrcode = segno.make('RAIN', micro=False) >>> qrcode.is_micro False >>> qrcode.designator '1-H' Or use the factory functions ``segno.make_qr()`` which generates always QR codes (never Micro QR codes) or ``segno.make_micro()`` which returns always Micro QR codes (or raises an error if the content is too large for a Micro QR code). .. code-block:: python >>> import segno >>> qrcode_micro = segno.make_micro('THE BEATLES') >>> qrcode_micro.designator 'M3-M' >>> qrcode = segno.make_qr('THE BEATLES') # Same content but enforce a QR Code >>> qrcode.designator '1-Q' >>> # This won't work since the data does not fit into a Micro QR Code M1 - M4 >>> micro_qrcode = segno.make_micro('Nick Cave and the Bad Seeds') Traceback (most recent call last): ... DataOverflowError: Data too large. No Micro QR Code can handle the provided data All factory functions use the same parameters to specify the desired error level, version, data mask etc., see `Segno's documentation`_ for details. Documentation ------------- Read the online documentation at Trademark --------- "QR Code" and "Micro QR Code" are registered trademarks of DENSO WAVE INCORPORATED. .. _Segno's documentation: https://segno.readthedocs.io/ segno-1.6.6/data/000077500000000000000000000000001476440322300135555ustar00rootroot00000000000000segno-1.6.6/data/share/000077500000000000000000000000001476440322300146575ustar00rootroot00000000000000segno-1.6.6/data/share/man/000077500000000000000000000000001476440322300154325ustar00rootroot00000000000000segno-1.6.6/data/share/man/man1/000077500000000000000000000000001476440322300162665ustar00rootroot00000000000000segno-1.6.6/data/share/man/man1/segno.1000066400000000000000000000235251476440322300174720ustar00rootroot00000000000000.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "SEGNO" "1" "Mar 12, 2025" "1.6.6" "Segno" .SH NAME segno \- Segno QR Code encoder .SH SYNOPSIS .sp \fBsegno\fP [\fIoptions\fP] content .SH DESCRIPTION .sp \fBsegno\fP creates QR Codes and Micro QR Codes. .sp It can be used to print the codes to a terminal or to serialize them in several output formats (like SVG and PNG). .SH COMMAND LINE OPTIONS .INDENT 0.0 .TP .B \-\-ver, \-V Shows Segno’s version and exit .UNINDENT .INDENT 0.0 .TP .B \-h, \-\-help Show a help message which lists all commands and exit .UNINDENT .SS QR Code Options .INDENT 0.0 .TP .B \-\-version VERSION, \-v VERSION QR Code version: 1 .. 40 or Micro Code Version “M1”, “M2”, “M3”, “M4” .UNINDENT .INDENT 0.0 .TP .B \-\-error {L,M,Q,H,\-}, \-e {L,M,Q,H,\-} Error correction level: “L”: 7% (default), “M”: 15%, “Q”: 25%, “H”: 30%, “\-”: no error correction (used for M1 symbols) .UNINDENT .INDENT 0.0 .TP .B \-\-mode {numeric,alphanumeric,byte,kanji,hanzi}, \-m {numeric,alphanumeric,byte,kanji,hanzi} Mode. If unspecified (default), an optimal mode is chosen for the given input. .UNINDENT .INDENT 0.0 .TP .B \-\-pattern PATTERN, \-p PATTERN Mask pattern to use. If unspecified (default), an optimal mask pattern is used. Valid values for QR Codes: 0 .. 7 Valid values for Micro QR Codes: 0 .. 3 .UNINDENT .INDENT 0.0 .TP .B \-\-encoding ENCODING Specifies the encoding of the provided content. If not specified (default) either ISO 8859\-1 is used or if it does not fit, UTF\-8 or Shift_JIS (for Kanji content) is used. .UNINDENT .INDENT 0.0 .TP .B \-\-micro Allow the creation of Micro QR Codes .UNINDENT .INDENT 0.0 .TP .B \-\-no\-micro Disallow creation of Micro QR Codes (default) .UNINDENT .INDENT 0.0 .TP .B \-\-no\-error\-boost Disables the automatic error correction level incrementation. By default, the maximal error correction level is used (without changing the version). .UNINDENT .INDENT 0.0 .TP .B \-\-seq Creates a sequence of QR Codes (Structured Append mode). The \fI\%\-\-version\fP or \fI\%\-\-symbol\-count\fP must be provided .UNINDENT .INDENT 0.0 .TP .B \-\-symbol\-count SYMBOL_COUNT, \-sc SYMBOL_COUNT Number of symbols to create .UNINDENT .INDENT 0.0 .TP .B \-\-border BORDER, \-b BORDER Size of the border / quiet zone of the output. By default, the standard border (4 modules for QR Codes, 2 modules for Micro QR Codes) will be used. A value of 0 omits the border .UNINDENT .SS Output Options .INDENT 0.0 .TP .B \-\-scale SCALE, \-s SCALE Scaling factor of the output. By default, a scaling factor of 1 is used which can result into too small images. Some output formats, i.e. SVG, accept a decimal value. .UNINDENT .INDENT 0.0 .TP .B \-\-output OUTPUT, \-o OUTPUT Output file. If not specified, the QR Code is printed to the terminal .UNINDENT .INDENT 0.0 .TP .B \-\-compact Indicates that the QR code should be printed to the terminal in a more compact manner. .UNINDENT .SS Module Colors .sp Arguments to specify the module colors. Multiple colors are supported for SVG and PNG. The module color support varies between the serialization formats. Most serializers support at least “–dark” and “–light”. Unsupported arguments are ignored. .INDENT 0.0 .TP .B \-\-dark DARK Sets the (default) color of the dark modules. The color may be specified as web color name, i.e. “red” or as hexadecimal value, i.e. “#0033cc”. Some serializers, i.e. SVG and PNG, support alpha channels (8\-digit hexadecimal value) and some support “transparent” as color value. The standard color is black .UNINDENT .INDENT 0.0 .TP .B \-\-light LIGHT Sets the (default) color of the light modules. The standard value is either white or transparent. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-align\-dark ALIGN_DARK Sets the color of the dark modules of the alignment patterns. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-align\-light ALIGN_LIGHT Sets the color of the light modules of the alignment patterns. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-dark\-module DARK_MODULE Sets the color of the dark module. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-data\-dark DATA_DARK Sets the color of the dark data modules. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-data\-light DATA_LIGHT Sets the color of the light data modules. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-finder\-dark FINDER_DARK Sets the color of the dark modules of the finder pattern. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-finder\-light FINDER_LIGHT Sets the color of the light modules of the finder pattern. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-format\-dark FORMAT_DARK Sets the color of the dark modules of the format information. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-format\-light FORMAT_LIGHT Sets the color of the light modules of the format information. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-quiet\-zone QUIET_ZONE Sets the color of the quiet zone (border). See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-separator SEPARATOR Sets the color of the separator. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-timing\-dark TIMING_DARK Sets the color of the dark modules of the timing pattern. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-timing\-light TIMING_LIGHT Sets the color of the light modules of the timing pattern. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-version\-dark VERSION_DARK Sets the color of the dark modules of the version information. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .INDENT 0.0 .TP .B \-\-version\-light VERSION_LIGHT Sets the color of the light modules of the version information. See \fI\%\-\-dark\fP for a description of allowed values. .UNINDENT .SS SVG Options .INDENT 0.0 .TP .B \-\-no\-classes Omits the (default) SVG classes .UNINDENT .INDENT 0.0 .TP .B \-\-no\-xmldecl Omits the XML declaration header .UNINDENT .INDENT 0.0 .TP .B \-\-no\-namespace Indicates that the SVG document should have no SVG namespace declaration .UNINDENT .INDENT 0.0 .TP .B \-\-no\-newline Indicates that the SVG document should have no trailing newline .UNINDENT .INDENT 0.0 .TP .B \-\-title TITLE Specifies the title of the SVG document .UNINDENT .INDENT 0.0 .TP .B \-\-desc DESC Specifies the description of the SVG document .UNINDENT .INDENT 0.0 .TP .B \-\-svgid SVGID Indicates the ID of the element .UNINDENT .INDENT 0.0 .TP .B \-\-svgclass SVGCLASS Indicates the CSS class of the element (default: ‘segno’). An empty string omits the attribute. .UNINDENT .INDENT 0.0 .TP .B \-\-lineclass LINECLASS Indicates the CSS class of the elements. An empty string omits the attribute. .UNINDENT .INDENT 0.0 .TP .B \-\-no\-size Indicates that the SVG document should not have “width” and “height” attributes .UNINDENT .INDENT 0.0 .TP .B \-\-unit UNIT Indicates SVG coordinate system unit .UNINDENT .INDENT 0.0 .TP .B \-\-svgversion SVGVERSION Indicates the SVG version .UNINDENT .INDENT 0.0 .TP .B \-\-svgencoding ENCODING Specifies the encoding of the document .UNINDENT .INDENT 0.0 .TP .B \-\-draw\-transparent Indicates if invisible paths should be added to the SVG document. By default all transparent paths are omitted. .UNINDENT .SS PNG Options .INDENT 0.0 .TP .B \-\-dpi DPI Sets the DPI value of the PNG file .UNINDENT .SH EXIT STATUS .sp \fBsegno\fP exits 0 on success, and 1 if an error occurs. .SH EXAMPLES .INDENT 0.0 .INDENT 3.5 .sp .EX $ segno \(dqUp jumped the devil\(dq .EE .UNINDENT .UNINDENT .sp Prints a 2\-Q QR code to the terminal .INDENT 0.0 .INDENT 3.5 .sp .EX $ segno \-\-compact \(dqI am the walrus\(dq .EE .UNINDENT .UNINDENT .sp Prints a 1\-L QR code to the terminal in a more compact manner .INDENT 0.0 .INDENT 3.5 .sp .EX $ segno \-o=yesterday.png \(dqYesterday\(dq .EE .UNINDENT .UNINDENT .sp Saves the 1\-Q QR code as PNG image. .INDENT 0.0 .INDENT 3.5 .sp .EX $ segno \-o=fool.svg \-\-title=\(dqExample QR code\(dq \(dqThe Fool on the Hill\(dq .EE .UNINDENT .UNINDENT .sp Saves the 2\-Q QR code as SVG document with the given title. .INDENT 0.0 .INDENT 3.5 .sp .EX $ segno \-o=a\-day\-in\-the\-life.svg \-\-scale=10 \-\-dark darkblue \(dqA Day in the Life\(dq .EE .UNINDENT .UNINDENT .sp Saves the 1\-L QR code as SVG document, using a scaling factor of 10 and the dark modules use the color “darkblue” instead of black. .INDENT 0.0 .INDENT 3.5 .sp .EX $ segno \-o rain.png \-s 4 \-\-dark \(dq#003399\(dq \-\-micro RAIN .EE .UNINDENT .UNINDENT .sp Saves the Micro QR Code (M2\-M) as PNG image, using the color #003399 for dark modules. Each module corresponds to 4 x 4 pixels because the scaling factor was set to 4. .SH COPYRIGHT 2016 - 2025 Lars Heuer -- "QR Code" and "Micro QR Code" are registered trademarks of DENSO WAVE INCORPORATED. .\" Generated by docutils manpage writer. . segno-1.6.6/docs/000077500000000000000000000000001476440322300135745ustar00rootroot00000000000000segno-1.6.6/docs/Makefile000066400000000000000000000163551476440322300152460ustar00rootroot00000000000000# 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 coverage 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 " applehelp to make an Apple Help Book" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " coverage to run coverage check of the documentation (if enabled)" 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/segno.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/segno.qhc" applehelp: $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp @echo @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." @echo "N.B. You won't be able to view it unless you put it in" \ "~/Library/Documentation/Help or install it in your application" \ "bundle." devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/segno" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/segno" @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." coverage: $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage @echo "Testing of coverage in the sources finished, look at the " \ "results in $(BUILDDIR)/coverage/python.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." segno-1.6.6/docs/_static/000077500000000000000000000000001476440322300152225ustar00rootroot00000000000000segno-1.6.6/docs/_static/RAIN.png000066400000000000000000000002361476440322300164620ustar00rootroot00000000000000PNG  IHDR33 eIDATxc000O~le رn~=q{tlm4H$#"!$ g=Ev^ ׾C[?<_ا'?Qsg=@IOY|Oַ89ьo3+KϽ)k}om@wo?׿r>꾉zE~J*P^-_={x t5UNzoUcj\> Bfw0'lSEBΏM֔]5C3Wإٌqb YM*s!ϼ!ȐPsE}{_td(NA%3IJM[XrfJk}z?On Us sÆpcYwo$]I9+&C裂ߺ! BnuR!ϣMF߾7@ n\T*7,7 $S!^ή$|Zd0&23{swA,SHrbfw0(j 4/ hCm@sci3FrtkC,'xOE:)!rIk궲 bX*ŊBwh96 agXNW{`fd`" H<Wį? +⾤ȣԝBX%m'H'˩l؝=&pݑ,MݫAK%NrxYK$ dRynj{>,H@d0$uOBB0υ] Tqw[Մ Ϫdc)_ށs#x/&Q͋؀#+ffTUmѣS:^ChAzY\;̰l#"@l^y@i:ᯨ7NrǬ?o v%V'}ֹL"n巩_9_^߼-Īϗ`G}&u +0\ jCh!L)ٽжj&:a婰G?/~Y@sB\:qXAy` F$&VL ?cM|Xs)[x?F9!njXdW=A^v\aSLOtR9/QeI`cլaۀJ~l0(ou•`(13ԁt6ȹC5*=H {| )ǟix対Lz@RD/d8o $;"?|sie˘(. =&%5SXqDF%o+R >jd]ģ'SiM'!ޒ=3.!i._\n~ *oU(rrҥc~C3zx C=LSsJ1Wa >1,ZSSduߵtdMg+Z+Q:|սcWgbL.l-á)SLKX޷A0F]+"~]5G?maf}9ɧy^6l|Qz_Z5\!>*$r-yg<넨ќ@g{Fö4{Y$EآyÌ^pΪ&]_8snJO@\#9O(Zu9֬'hu[/pK c N2ys$3(.m}un#{j%+^3t^L\hG{S3AWb\7|V&;]tqڃ޲&זB=Tӛvpwۧk~-4R4~Z~tϠKf ĉ+O??_)g-`"֯)k 7kg :(`ywo?g#Z! l8l9$GL{}aE+7uUsIG2gsN C^/ɒw#m(TH qpڤŭpE., "OBasAfdu&-nVt ~<,>/+Qk]v< îI[<7*VoOkqoʊu{R[~` %ܭW7^B:TCC.ϘE/q!.7RWd@k?ICQP|+{Hc cWKy,$%z2XpF iRWEEw .9$r=U)mL$lmp=A˵ra%Ы*l"wYa"ί԰@jv)GP"[RW&j=k>K B ^μ[m3&h(~H8.1|b%Tb!0^[ڨ7P)B:$ɴZ,cwQaqK?c7eŽH6rf?rpC}}3]z|+v1֞{8@\M#67κGUQVۂ6~|M˵.Z3*)J~"fc/(u׽%֗\sR_&"m^؝NorlsM: {d;{ꝃFLmHgE$UyGP*pOj:m9{YyʫהļEm#m 6O^%>4mBтG(l5ip)05r7Uu&6[ͶԢ5P/%FzS^yҔw%| & Q!oz=Z~gQ:x~aY2Lk“&!_KhOͿ/w%\{lr@!†7}Poe Жп&j}? IOݗ[nF]yGCXL1>g3/䓳/&R^uO?^U%ϳUSmuB?1a^ccJ~-f'@uffD,q+¤XGsf|P~h$M^̯N"UW_821 װNÃDHD.96t9Xɍyy/ +$ԗ"V >b`g8JIa<s_zmX J[]q1I6f+ srNU"dڋ`PN@J'0>151,"EVg1o}1]`mCd4IXR~Dtߏ,x?vV)WtE6*bE ړ+H|EA(G?dAO%o4G8xӘ=b3ٗSWkt&v~n |9tQs)*ǐcިO% 0ӛt\JT[<Z!P3^JIa!v G*NӐR#WRf8?t_@`$*U<`XϜB5_ąϪ%%v]*DV;K"dpEm&Ё], I͑ >(Iba۲K/ rW/')c8uq->+_j#_Rȫ Eem G+>nbc+:g]p.w.>vdOQc 'y*Gx0{ƒTf;5ELyQms7w.vu~Xѿa}.)WǃcyK9t’'3@Z|PJZDSM;d\3zQqȀ@Miz~g$_y{.K+ D=IuxT{Q,;Xsy;qpOѴ? #  {j6%wNu>:Av!Xg_O.sjCW:?aka03ofGa?7Cf ϋ~ֽ)a,Š_G7o"j$!m{^ߝ(ewv$ºՙ>Z>~:ΒјgW?5G e/͋Cs+%&)?l;^QQ9 H (1i@9} 'Y\aPs+ "چPڸDpBŸ^%1i^3ﲮ{h p]+H[ԨV935K+}ϑijM7RB>-4M )YB!?x~n_$R] Gq@bq$хt Fnr] !n7ryVB%!ʚ}vyZt0JI7 $#1昃9F]! I+%]ubi )XhF\iRT~/̃c_Mk|]{o&M{h~Pf7(EB$Ae-946`ҫD0o/pBħQ[ 73-6J@{ ϊLIK{ 58i9oi۵GV2vV*”2dk Eya a2!j2=tă7D' ;XyPr6''r DKvfT ?&ZE A޵yu>79Ov+fDYr+c8G}ȷ VwI|Oh_[_;J$~gBq8b!5.;Zs ]4~v;R !|,n:?^1[U?9)lM{ 0?7!掩!mpZ1AXteu&cC ;#.G.OiBFwJׂB"P|UYZ1j^C/\y\\*V(I , hw~& $Y~&`q̹7+it6 oiILL U$Mf=7Voyz:T_ikn$<;_ ͽ\ ROv4fx6?KA||,SocwZ>O?vWN~ B8;4[5)ڝTrE1@~^2y]ixr,C7aF <\\)3SPkz [%'~M?v7ۯ} ,er+ ֡'#T4N k<*9krD g73Kh#2xR٦Px@. AuOF[ vt&&C3vѩUD2Gous@8_ҟ"z/Ps*mzmS!z{|0yAT_@2 Κ§aNjPl@ Aqԙ M9?F$ڛ!F-yI~ڈ@ANMF BALPHX0BQ#I89*n(>fx$k @<-? 7ZXTąy.TYQRG~\`>VP8 VTZ*>m2G_DؖSC_:KG0=G`/ȿs?ʿD!6_?y|k`ƿӤ@?yO?2w??`?uȿ~7m@o Oٿooۏ񙳎R{.|ۇ9?q_Ǧ o,+@[~Rxeӿ:翴x~C?ȿC_gP?Uo?c?f[7WOU]WLSi ptaA֎BlE*H$#Rp q?9SLofX [r7;%z2Q ̏sAo*~Ht,f97hV6w}UvN6`G RP`G,uRnd.t8'IbvxMV?z?7a#iF NdJex_.[c2DH>rgaY" %n֎ 6?R+شԫQJ,x;)Y;pN3)cH8NdĽ8.XsQ4υ{{d<*J/6|}ign9\{?4_3 -CiBI5gB_d~ 6n4r88f:&'xL'6¼GĶ8\^ Ɣ.[̱l0;b9,k|8ʖق()}gGtK>fvc#HM0M,l^׽>I4}bw>oY.1@Z(1:IkZxYe/2Cͭt &全8xF%_ȁ+IZZ>ڧ 5*Hgi_[;;̫#2s<ߣ4)aJt{epZ{XC̼~b>e3)b1DS;J6ןeYU*WWn k4vwʣeߍ ΰvgKiN[AzEoWeHLҐp EqF\<$bnw243^E6:~i+?-M`Uax."Prd?K㙇sҧ:|]cO3(ZRz#;UͲF9y?ၮ`̳oV t샜!oѶvD5Q?o\'upT_CB[2SljeW۟9KyR?T4.C M^1 ]?a(E8ڿq=bKg\Ydb8;͙gYW]/(2Vm9!9BJnז@}j$zY8cb{[%D'`MԿ $u&MH8g=)ބ! -'[}c1햱͓Mǧ2(lA].Nvet[h =p5< U&kkkU?ɹ"QNS?EnɆ cwl6hCK#5dHfIyП;[ VB!j;&9E R/7.@jk +0T0TJ5N\W-U[QBKS6qA4f/T05n}_<8TK4d:ӿoyQ`E(KmcK~&F`dP˳Xy/m.JfvH%q3d 2Le _'%J'u%P}IS/w븀{ !`0’?,+H6@oxok픸i4lT+"lőZh0k h q@S)Ȅ% "_/Ո9/'h}%M['W|mҁz TR@ #(09?x{j |Jt|oE,3>~e+jl5 V~Z?&"eF?zK÷Y9d JA~I/zX&r w @U-\XKȑ~oeNnqot2]ma^ՠ)8dq.5:V,( Ŋ)t:(Q&[ 왫JZy لU"0͗ +Z\Q`%LPFgT-sĐ>`t}.Bw+Ov!<ȱz,A9ˌt1喣`H?TRA$PPd-)04OLį MF2FIO y] 4 F1^xEKcO ߣ4F>5 K@yV1hHIsvv}.]gByz0:)%Nd"c c=AYTd~UVjXw%=4:VQ"$Yl&(r[xj7T;t)4|R=[([p~K:᛼fsQcP}ͺU|_4*h͊5í# t9 6_W{Q(V Ciz;ܖsQ@\DRX3h~ydim{Q;~y:^:Ϭ^):l0I#A$\Dz}qz:c9]f`D?=șt|+!s#F\&UӋh>/g 7"T8~YZdoPI4Zr½g9B, ln\_7d1Yބm%5,{Qۛi6oI8%Sbbfsg:? _Mܝ""TJ K:ZVWpgme6i=y0iAJ{Q{P;faT{e?։|_6L VzM8P%pdn&Q5;.TEJe(m lS::}[Z)He{CIo ww_TbU XRd{K2}'j ]W{O`YAȝf/o;x%cfVҲES3f%jFe\#+}MCzկf C7* szv\m8tB;ngt; X~;Am *OY\ug#},Y?fw.AfրX?B!ic U+rCb׿'=/frg^`m@A9z'M ͷ~i8y3^A` 95, krm#d"S90K/݈ʸs)E6 g G~REbFP'~] SaD * (>Ee F(,nb '##B\p`QIz.Yq uI5&آK3p'Ky]<*lU"0nW9KW١7h>je8M{3IE37e:~ qZ5٠j ;\g ~R<8uw}C.ŸI1iJ8EhFu2آWw_Pg76M_]X =_=cN`9oc^Я/7F;2sfg|Ș@-I$Ho~H?>˓ Kh/?`IzF֭ʴ/rfdv%UrՉ/R%HLdl68&aV2  w#[흝{a&1XFO\(Nղ]E y`k@6*xcҼk\ُPh= 8㖖3zu#S]P}ksw0ߒcԫfs;q;g f(5[Xiu,~'SL7 Ⱦp-5OzPy*d,ɃcRīq`Vxмqq F'x^Dփ6 VL]}~"єzP\^ :9cM+K~X,q hBWSzUX \`F$[,<8\biP#Nuґo̪u2x)GO!r>=g֨8Xާꧽ8/ )%,{=g&˳ʰg|(P^7iȡs[ D%n\<崤j~ŚE{T0mq}?F36Kܙ 2=@oM!Pe'!lvDT;>K&7#m,n^Vg-o#{ ɯZNE^p3zraK'h| +o0 mML:Y4{1$QYCböh-s/ &W"P~FrHL.@ÚUgϹGUk |$$ bHJGbfX|oJGyugcq;OCa[_s*bl!. wEg!\ UJHu\N6}H4i F8[/6/DT*Ռ>TMhr*on_7)x5'AAp"P!tL'!LMwܐghB%&S\f+ܞ~PD{_ط0,vxG0cxyhT3)wȃ|d߃#=^&崀Ȇ!ٜ/\ϚXo&E2ֻCQnq@xyqCd#gS%j.;{ U[Oa6]",߶&$!X$,=/M^aHs0 W'M-> ȫ e@ Rk]<"I.ST I1/ăsy@~W0^@ą vmQ7vi: G/Bq5Ndq7Dw.瓩YvfY=~ύ͉ Oޓ$ ɟLqĵ"ڮ H?3m`Xmn:M RђhtAm"֛n{{ j^;7R({`a&jkn\&zx0Ļi(F4"hppRv<`)Mt۠tR%M:0CTb3x<)=x=CTʅJkd^Č9L,y<:[䒬.57Ė`n3}. $F X.&4S}v#Y -Bo&c^2Ƕym|= KA Z,0-e:17DC1'BGdŠo\HȽ.| k@>@@;cS g*FlF R:2ho@J>ݧY"0ANMF CALPHb0BQ#I89*n(>fx[CSְ<Se$k] =QvӀ/Bˊi9TĶ؏VP8 L4P*>m4HY$ؖSk~4+b~3s _@O37TyCBſU_?}?_?꼉T_5SW'hG =GKXGۈ[JJ%+q[W9[bv_}k~#O_`/IAwG??~v}-w(s [@`0Υ<+`n]b98Yp>iK?lqግ_V߂Vx ( E R} z+DWBH=*: )}˹!Hn+$%y% P +^`hju#BY7 pB5~Cu8 F3S}:Tc}urbU lty/4;UNW7lq.7#JWq)xfZߩz-C$?~824 :H{qVUj X#cJP/o5ȷ83tX6wǘ;:Q 1ާU6GuqN3Vkcv}Gګo ){>5Z'L:r^AeoˣK0ΓJ%sGv15L|rSH|-A{Z<(+Hz>G =ImuQh>h]VS\bDm`Fh.5: fۈ?B?:?X8],ٽw@`h!֊'˲@@8GiFxq,/ԯH; Jk{ %_?^|Zl~),^̲Lo599m4@7da?K` ADQ`߰؛UyIR .#8LQU3˹mԈ@{B oGcIUOk|0> YZ0=a2T®p-#"o0K!O`8Hbv.M,Hrӝ~˝fxQZJ^o=c֐/qQҊ/R8βE?B1T<f(V. ,;ޓ[%7|AD|>;@1XVm|b itog'dxJbU0d1N_*`QR⍗k,oЦPbNBVYP;h)5.<Se}_F*`J ol3r)99>`2%O$C)ζÔneiq7 xk@b2q@d<]728w?+ 6SR0 ceTQEf}"Bq&HJѤ*_bHa$>p1iP^JaX$XoVLZfN;%"EZ-Y٪tq݉'kJgi4aᗸO3~z xyg1\Gυ;Gyue Qz_yAm7<߂ꪣ=7Ү4}Mq'`8Ξdˡ. ,Κ1?7>?bpz0OMm*=6/QL7 R36.f+?z Y -#I@Vbu)nPax}5&G^R`h:a[ Mڼ._Q ]uڛf==P-Wt rL$KRZ=D`iD~t2@ɏ-`[Lj8%MZ3&unp#*f}O.aTzXzFihOԞ(J|~ ͱH^M"6ݤ̋bӥ%~dN"osT2.>6}aSNT)5o-w YmdsQVe(,+Dv#, 6 X̅2B߈2|P Ũ6>Ɲv~y&=d%'ʸ2^٘`' BnD,oowS[DikL-k[']\" f,5#>{]tmm>T ]_L 2)TtU ^X: C?HL@C|p2{|a)q1eн${9!ߏ35SA?Oqrnh>ri޷Q}kydvѨ?n!*iJniM%Kҹ`gjaډǠ!5jlJ/~i.qzO,k *uJks|&\es4sOLhnR*4i򕠋.pܻ2pk8ph<{Z5U̦9wn?D؊HH aox[;ƕ(כֿDž=e[|RP3 f B BCthgu+U ~`$زi>EPM#WN a<%՚K@kB>dS+?bE9a|x|#.}8 G+\o6`=k^^OUdb%q RLt?ß0ڥo b;1Ɵ̓m&Ar1B-:?t,ݨ#l'n'+wiGnݡw>RP ` {&_o| G5%.`vz\tJiOщ+ͥ ]-}|B{tf+[Y*,}Ƒ#zW5FJd#OI$b5^ϮUyWg&4 ^uQ"k{NRXoW%M>l3&* jf)տN)+ 9_j*Wu>J~Kh{)gxI HcQ4rY= 5޷Bu+!ē`r21M!ng61vpʚ#q-g:nwB6G3KhC!714k7\nJmDm9?9֟?$Xz9] E0TBd Oۀ\RKuD;[<,} #|΃Sѣ&WÙ0AIBsw Ie2,2$tZ0BvvN*[a {blE(Kgobj̕𢞄%)fmlksYf2 f`R[;ܵLAcrۅ{:bZ0$xuZ/=S?~  0J- @@q0/!)n:8:,UzQα{4[̪3 Xi Vy1pkJOKЫޛsF5,􊠋B)׵Ȃʬuq@Tͦ}n&pr4fObt&L%K!cu f[E>'|owNi~RHd' LGVg^2]){0tFvdOZf}M9ѥy풢)o&2%v+Z%Zth%-Y2R׋+ה)` kF! RAɿa_;S j&9eٷYB4nuh& צ\nƖB̠06Ǘ]YBb=o>h_3;/0ʼ? (8OCpB:0  {欙:32ؠ-:8 oK:!ظB@ 懾ʑQ0ф,j@h"<.{Bukx4~6)B#BG^:g(%dsh:Uƒ(NB6o~8&!jrԑAyKE.O=,0I.(Xlm졢%QSv@ qkW3}hOKLWLo4b兌uD"iIDx"V z,g1 t5`_/Od nm4}E`? 3!İpd_w~ֿNHK~nꃕ2}U>ڻFk#llnC8h<>w$ѽ-wr't,mQs#o+V q5)A:f|0ׂ_jO>5Z"WxVUk4yCK h:@*44٦ɓm>JlG9]|_ Wmz-F9e39tt~ Ej_$={ks  ʑ2|&֘Ϫ%@ڥ?M\x +)f\ovE+_БF::ZY_?T01 ._o=&^ "M)RHx^UJ䳹EF.3u7zB 5hAK wI,`QrN$ĄϜ!ɀ*2 M3) oG`k;?+@ @D0(2#Y+ @\ ;GTA]ŁG =4y$,2axFB, Rub?s' ANMFrCALPHU0Q$IW{ ψ+pF13_%Id_N;Қ7n=`KY6 `Ѳ8Ҭް'm;SSVP8 ~TN*s>m,ICؖS3)ǽ~mNa\P/ɿ{ ~_+o3'ƿW_ /??7?3oonv q 7?yA y(s<@?v[՟gC伤U޽@M3?/3ǿeoL}2}.{o?|o"]`A:9D!?͌jEaU(N(mzc}<8lÓ. I 7-ҶsNc,gwfK[G d oWi`s %~ϷbIwCe,ߤ8H[V0YgPznK}Z%OE[Л6ٽ, 9ߨ1i >*0qiC̏?RL#\Y$?ҿ1 Ǭ 6=ԽHd]4YɍԹ%z|Etjk~ ?eOޙ220\P7OMiFGiIuur T3[]3cJO 7PvhPk׳2f8˚^]Z2i_ͭvUk_wIS`IQȌZW]Ym*he|Et$+M5@ ;teMOTD'R9]:%OB3K@P4l @J{W]+|upʃ e 3fcSjvlTţ̓ U*}so-IkCJih"T6HT@coc0:bܓjfHYEYh>=x_`1 .+Y "wR >_aEsA7HR tj:ydf0A](K67}WX+[Kx.r&N7vGtKB;{د.=xO]:3K6G{t\š&]~ J+pOsgBUJKɃ=8r*XbsCw6ՋE8q`:_}E/` ].m:H#gmMNNjhuT2-6BOFюO@l 돀/ 7hW, ]?`A9t6*E %On.Խ28P2oK̀l+>)r+(g',+qk1?F$΢h0zn0"ثR>o5F>jt Dx@Swk 7[I)8k*I3Кus $2 AK>Ւ*(<,dVǡ؋LwFɰ6Z-ly -)%A5X(k+edԑK-4蟸//\auk>]P^жeSh*t@-" I4@h :ਦVcz/}Ɓtrl{rK^ɨz s(rdn62kX%̧"Ve(j,?g}քwpyhaN%Lwjv+5q/U|G:Ls'* y􏇓G1o/auU#& .Ldp旟A:]4w3_܅.aZ__ԉ|%;ܩ(C1&Js.:P_T߳r] jԉD=m8?lAJeՋ n -oˉǶd< {-mKU:>0DvnP2wkV>$˸Ψ/ Q1ܫ P5)<;ʮͫ8x˘\\}ծ`Od"nAN|1@ 60~¬֛sRБ #U)/($ٳv͗CaԺ%,G`Zj?Z7xWǽpq,u $U"Rqufʸ> Y Jۢ[z_d,`?oua&@K}z|!DJ?ѰƢwRC$ݺ7v" yZ"/_,ڼlAve5j1rc)s #!6e-9w4P,Gcx"0Veqoݡ e-_c(Q+kX*౎|R>D^ؖ>Y_a̕m]-bCӀJqע-x#D$p$ǂ;&EaYuELARu6sޘmvK ҊonF[ALǽ?_kX"H ;",8%@e&t*?']6.[y 8^8T#_^_4&r(b1^p`:O#zKoq `bUZwFf=jJ+^"]Kuq1S"N5ZZמ1AVAkI5iQB$ykV ;ktojkⒼ DN5qv @$>Bm&yS'a!\ԭ=dk):g:NkH^|h`(Ie`~- wz>W (rkJ1 7u`O]Jhm)$+A^{q1Ƈwx.If7+G[4OQ"EI37 #wÈ|[&q85Y('J{7jF3!:F K^8cW'f>Gs7sBwo;5dnŅ/mm+g֖h#pߖfהdRUg?pDޚxU9>Pv023 O`c0H9=J bnq`n̴Վ>nANp-ʻsO<J2gANRt>IQ.Adqb{Pk: ,+ts]ĬW۽f>rPf"s&jJ1UD _斘} ­|G0 P,|H_?Fz]ł3{–ەrLurݜ.Jޫ)]-ΓՀODGtAƧ|-R)#^ȕw"U߈Y! wy ]_~Hݒv@BqyJ`B &?`X*M=0=tC⯽_wvhNCzW '_|yuMG -H YXpj b.( DDI~ߎ'M٧ ,`aQUza䨗*URQ>@Z ZPte$Kׂ4SbÒ>ޜci?[׭yp;^ImaD0RDوk`!c*.ŕT3y  24Gq5n@'܇"?rVO_H"ힼ 5qC. _r' :jB)ah=jd`/61uc\AzsHTjf }8Gw(I '"u*F,mo\o"iP:d1IKڥ.AҸpL~u*>o8Q@v`TW@KŠ|-F)1Iw8ytaT{MX6Lc0:?l{IB;ovΦ"9S+=RGb "k*湈° 8φIkNUPZ04[%{{7EqIhw9 #ۜ bg:: ֑b5\gt.[Wd)Vnv_ 9?>Us`b5r.O( k%&o%z|?d1%q7}w:b> Ҽ'v+\sR{/;ƺ?^-eg-&<)\AaЦ\"XwQ\. JB\).f[{Vg~[$Sqb3%oNǷ7w8'\@+MbNDi%BmeoObmE}cN͐}S?q2N:M҇>v|w[HD%~ ,GN)#pxbc x/ժ-JrryP0r?0lhx/Ԣ-59R!"^O5@[KX1Jdcf-{|^3XM\M2uuia/y ]ௌI/oJDG6@^-W'x9gRց vOǴrN }Ę+oͱ ج!3,ulJ>N}[.RG%HQY(]Gfv$)eIǐϿM^1j ރ#ChY\I 5Jͧvّ/!ݏAj={}&8nr N]X#L>c͵Q3\*q;PX̓`DqFi`>{{{s۞pA .u3Ѧ% '$m.FsMހؖSg#]w_o9r1~m-kG/}8__׿{~@_b {Wϰ??oә k??? ;g~L_"l'}<%Fk +W?9~L~ >> E?spܙIz4)򻮐Iw_sF]}Bϑ ϓo_~+/u&G#79UKLigKOh3OYSWnpDq8Q~6(etwrQ1;[e8ZylN011$ꭧG rN6 y/ĒV^c!}0֕6Q국NķnSbW @*S@sP͓cw{!gHR,- Ҧ=CkyƒX #^&c`[[YΌER~ٚJDY rNu;\(jc'D='Dwu6vYTk;{]^AR=I2m1)?ڵ~WCDyIfݥpJԔ0K~*YZҗ+f?ӷtGrjzr&>5FB*F@4wpk0BAPbQH/ l7  +Ȥ7Gcۯ;l_%ZgTDh9q)P ǹ]ҍ9eq}nK4?iDp:Ól3 h2u95p bxk;dt,g s/^Ɔ+E>qC0CA:6XE |nXxZ\+T0XW-} ;Sk1J>0@` +s.8$o_~o;yuX8>LޞhV"skHsw_jH`i#v&ZSoʗwG` $NxwCޖpD5;>^ qNuj1ky1o =(ҾOrbwU|gQ)'(Uڦ PBElwȠv\ ù.;S8 .qKd&j+mΫ@Of5QdZ:_l]?W/?^=u ?Šy4]>@Fw*f}_=W ΆzLV' 7P;+cИ /H)yUψAQ9^5 ``m<_8@" m*wqt,1$l;JcSf>tap?R8ۨ LߨQu&a#M?,RxSDwM޽, }f6'}t`6GҰ4UMˌFw xӼ6L&h1^=E.=_BGYA0H/ X,jL"\@Z6Oˊ >,~2e/`K\ʼ-dh-Ρ5%&vұP&3f=Sw"Gfvoz rm*w(K=Щ\Hhx i圪S8EuXL``9:5(,9w601'ӂ{2BaZ$Uѩ&ӻsQ%]A{dz@YpfGyYOa X90Z#y[MM_Jjԏwkd:ՖW1m2k*Y:DH!_,68;g`j酃 d4i9Y1()w0o <.>EK ) `IaX>_/VϊPϷ(!iy"u5)4y-o_)stH[ZAF>2G,0dd{6h#G4 Nu[@ @$cF /ȑ@T\Q wn|`6!*LpTIV>oyPfk̵3> ` l+@VּuWuWuvwi4qYgE8y^v|1iqV^Å,/UpH n\48 *!ڭ8e2(Z|8.K1wsa6h{'uEJO!Ոg1 ~*+[4f ; +g_`ztz~ ^ g O>NDĘfG{Ik3LE`{舙<N"eԋ$Ź4gd%&=(pA`N$U>ޭB.lGݤTsARyV$` /<uj ~j=A>yGܴ:_s{de%װ(AF0}xIu* kyʫOIXm|>N&/.rxAC 1C(6b8guRf\+tm17T&i"շ 'X,FK9g!{`2+'μE;+ "rt ޥz_KR]a>a<Ŷ:q=r1ey]F545e/7u59 pg/.ϱZ-gq{l[JS5qR,S+ Npӫl0yAO3NRZYYI(i6{F5)D5D{3O\:GAP~'w̫chH(͓3Zqq i9*DD"Z$c;($g]a)5, nMksjHZP^tY,_'x߯L9 |x-5=R28H҉4?th$wM沖~,+Z4&GhAWe{Lz@=72OeP.ΨMb+H@'ݑ=xyU)CY%.>`?W |:=ɥ$ml4NQkh\V16hp_N2it6cKhhfR`s4F4Mmd2>ĘnΉ[ۊ@TTN[>ANMFZCVP8 BP*>m6H$#"!$8 e=/@,w/}g/w?Wkoͼ:??s=+<5?7_M[Lɯ__l>ue$fwUÎ$=/>> _:; o淸'/w= -K7858]44Kq%ߦI !c_q9(iȃCΌ\D O4FN#:e\ Q"[ x۷яșz54 CÿE=3Gej_TmMj^ Xۗ_~)e2Hkp[A#ZnF:bhT.q78nq78k"A4i-TMԠ/TV _媒i:\@ 1'_]U~(4nݒ )RV0wJ92na,F07a+q(waB=U~+% Աѱ!)rܮ"|"J]KZFo`f[݅>:/p`)sϹ vWwe(T9hHqbkcMώ #`u_Ҭ'HZM?ge1IRЖ/&/= b X U2ŹLxŘ@p/uP0ϽU,]jxPbQ9ˏa1[$l2@| CRfWPaƻSWM'Fr&yk?Ec [??Z!I$ɇH;ˋHGu]x|gSaz`F$${S=TY>Eiϑ6x!X&AY;&>u&Bs-eS@V 1ذvuD_CV{bmp5 Dc j2DA.V`p)bRN#z ^ h,LRʹfG=jGZI$CdXm, Rς'  r#J+2*L17!%Ѝ5 ʧ󞦃x,G;RN@q:(\3[/@E#roil"G c{#%;Ġ[8Q;Pid44]36J:EtpQ_Mu NDBcgp"{SL!h=N9F[LZ^fJ"q498[V̗L70^IF ErڽYG[.%%^-LB&;蒎^^D@ϦsO$""|AJ5 w[q&^iFxʱ/RT . %^OF{[t[<% rTLOfW;2&m ( wB9px(w )Y%0cb=^(`'֌r)dH!*] `s~m>Z4[,%M'3 Y!>Ļ[KAjFŝ <_b#j?KK Jrt䧂r֤H1Ç m\%md?(BRlFEǙqkmCSk>K`Y". ΨbPj(fK=y F?ߵj)fA4K~R?JŲ }U*ptHdgbw@r1Ett,ȍ0gƸ0zyps7XaQkN h@QrvdXqgW͟imU/% %Q2}0LNgoo9pV/#}_g~T~/{9\o}5G!P#ށWKZ鲛[r2U^08abnCO4UF:F~mC*= 4ey;iS7ONGwaoL sY`/ݔMD^Eѥ< Fi̐LIH=Ml IP!Sh Oy$֗ntw׀l7t,Ab\UOy/Qw^3˝&}sԍGڭæU.Y/Kc{\<ڟ߄o/e᠕<\'{nׁ$\N~"aiu.ڔQ}<=kT*&^;m'=G{ ~rCԈB 9Ng~ Wg,qgd ]ZF*zUn0 c,X*{}jW$D0;)Ϟ78bN*RLVu-N*aޠ5fc^c"w8dytsY݉R!o NzRNa. :5_' y++{CD^aK܀JiŻGsVޮkm_Tyc'*dAIF'Vfo3Lm/T5͏`muvɫICLpuߡj7L^u!O-ܿ==nT.>]Hav|'(`7WgfۄCz'[ TaC ThLK}d~cS@GG0w%&B_C /-<B,kFTZLߌlW:IкXgu/2 >ǾArK񏹠O X\.wv@'t64g Ƅ>o 4vZ+;$ef$[v2r-d2?G#Hԇ6ѣL|-վb;;aRy_wA'{mmj34R R~T sXA .5@Qx ,z z'BW]1'o:u ^zF^5̗Ǒ10A, 2a$+g7pM1qJ_Q78Hпk?otmFeYY1o*yc,Z=^hyz@&&jHr5ntW geUP"r̽~-gu?>|gǥb m_<$W=UgSQO6kN.O3 xv_;y}-4.ws)I0UDeI8!('EʏJ'޾ؿCN H`RM䢀#ᇞrCVJL%* c>0ZrqCGoS~vLxn'5>K5{bvp2ՓZ:iiJAd&ʐ4;d<ȫ~XC뱖 }:.nVQ#lqg9}̌ys:AQ5l84H 9}>Iv-9&~!kt\*^2a "Ase [?5؞Ȉ*d+jxaÁC Cs^G9˼˓t_KoKF.s|ahSOgqW K'}NFV#ё{JK}!z*\2p/ߝH/%e^@-j:XLLۚJC]-\iTtF=[Dnr^bNO>ٟAل߱H@Dt`Qk@/Ogͬ߆9w M0BFv;_YvN|on XlY7ӏY O>l~\6>͌EeY c@~/ѧ&S<]_p7? صȏȯn/g Ŗ%J*&'kgCS>D6lhJ~,q<^V& (mwP&M#^("dpҒB/sVݩؠJC"}bZKL.M﮳g_m kM>- ΝLʓ S[#'L՚ujd̑ϻ/PP5K萍'h/'JnVy2 Q=W/ZڜBC0i$-O:+~SFڤ{C#mzDqK"_4+R㗲x'F~#E.4&DI[&<Ã5q|JqqF& Qyak# 0: 43c 'M8z}3Q_f7=/O4{L3g4FMSAV H"11~z6Y7EޡSo2X߄nZeOЃ{ZG^AC$,Lhg. IQۇ~ҙTf45.fzY׾:# [ߙzs* JAeNTy=FS [zKh8|dc#Kl%;4(XU7oԿK PiC?@+w 0m&~Jie"cF}lb_zqG-DL*#ˤd(/LDC)2-ǫ~p*Ǘ) I H%|D+?f5frW'\l@"jWX鹈gf)ȘqCf>+'I +y RF7MCIŐn䉚UsgG_u1FR/ -C K,E;S]k}@qӿ\+|X?Ӭ ?m* op?G0 hB`SR?hm^=M?qq`ڒ-9L׾B9MJFytl+ԋ${~cAӔqGNH/AȬ8#@}lu!̈́kY^ُ8~ nl\(ļ!  L5ΨcŹ##(y];XcDNzd֝} ڷ.*ԑ^w ;[ ? cąK/;%W>%8*J;/pns;Ϻߑ$dϝ7ģXlf,܌j΋ؤσhaPWh^WhL;5u Zs c>俧s ;h5jfxr/` j[{`C0Hˠ-Mz>r> Syt+\OkG~^mx> E7MPwiIX7l ?ƃӣՁrlXOn06u;9mHLrI_7sKLTR*i>m0GA`̀ؖSXgSa_h 'aYCo`/? E?s) ? # 7`OK?ӿm̐P 'W4#} 0 poM1?>ѷ@?~Uo0v;_Կ}}!鿴zhRr,*GxSO(uxC_ϿCgA_3砟73/8֨sOߘݾϖ)LvH& !b*Ő* OKΜ=&szׁgh cs47ཱYMⲘY۠@Hd֊SI;v`+ic-C[1+l_?im3]6q"[` ^*li#d7f`#}0z#4edMsMڅJ~^ͧ啰Ew \wi2џ^3uE˘o1ɒhodZ^ x xoJ6jjOܫ^/)8XO+ ]T򈉹WҘ:h}"^^t2q~ (bҐ=E 73_g,$XZ%upt@W JN P TJ0]Bĸv4A`쒃-Eㄴk;^ r=u OGNZnZ:6+]Jmafte+~2GO5m^%P JӺifj\oձs]w _wֻ ҷ7)05;ウjvY]XZ_sQ)Xer𒟇pp | 7FY=;,b,8;/#7"F-uѸlj+PC3aLngtzݾaEs)j,E R1PW\#%RM1U"kyvin~e&S9m&;‚KZз@z=Iiϒ֨[3|jp; &$E-hjU55KsK ps]5=%E:<:TH"Ņ7kظ M R *3C}P1I|G`<;ut+<`\.1NޝrNcdq~v d7`0;' M{`WE,dayEYh.?[+BQc"sNv@ލSm} GnU":Z(UiSP P@ꇽo9,e晃Kw ҊtHcF3Ή]ɇϖg*n xqt]^ a?{L qDWh]W[smeiJT°X{#iF?~7Y '`ƀ} ;P[a)Tti}Rʊ-]7! ͈W, HGB!94daU@= 3LڍJ%2jV/r yuPB*FT~3K@E!'rZG\aBG>0F5D1H[<<~7繵<H3}=]{33\3ϛ^;x'-u1=-xIm#l}"!bس#_`Yp dxq}mT W*/p뭛#΋h!Y1l\( u۬+[eFa=4_Hy[>gPqiP0lDJF WR=zV U  @Ak76^sHX_EݻfaqlR/x#X>.Bxcc)mie? y>06}G,5uhjț!QvO:Ao$19gfEjI4"~8:A9? b:[]W$Dz&v1drѿGW+=MqzQ sqҵa˧xƠa{#0mH%vʶ'q^amްUy<.Ұ4e*Mn9Ԉ Ǚt@dIZC_ח"6?eLD_)nC>,~͠c/ C}W= vu*(,7>2ĥqI.*jy,ogsg͈ vjfcJثD=9E.ub=shA  +)Y^qR|3bA Ym0,zl(|5[5x” , ' ,4)'٣f+шm)i:o ZMNih[fvUke!̺.84@ٴ18n9w3KZM;q+Kwxş$p֞Z.DYIY_2TQcLWD- :9j)s FQqBՌ!]R{z7{~.1^|H^, ?a$ .GwTO9*qͷJ3' 8)c&k'1>q4,wu5uq`Z`(^(nghԽS=M#p,?`F?-k9nK83(u\7nٻ,EaCuVeV=hVƔdnBJX?lMzvb1bt=f-&+1ZD;szGĊ~iXQ!-Hʚ~u `2$V ifdqL<BnLqe"_=+C8A%E6ӿC7hdZcP=8s_*z] Ny7pahh 5[<.΍ƃ܉?fFa/G; 5:t,'LFP H $K"eTil x?mco_n;Q6j%wُTexs4F]ܛJ:jlo:8U/ 0cƏW\u2"1Ņ+ͻkC""-2!"{8iXsANMFrBALPHY0BQ#I:9*Wඍcg_HwRma:]DҫkP]_0SnYn)dPVP8 tO*s>m4I++ؖS'ċIo_~dO~)7> W?E53 ?s /}]77׾O[W#Wh6?~*Gk-I ݸc?x?叫럑ޠ){?NA5H u?_?Xf?4Iurzz//OtjU忱zoOޠ~7'?xh?~?w$%,$KѬۢUȓ܊G|3Uq%5kCIWy҃Ak1x+x7 ^ :l@u`aEu8(eZ.Ԧ= ˶sTȟF'۝^3 ,*.$VuP c(0gY\||z#ǵ!0?pk>M;dfEBCcK4~0GoّhE~ipļK1 8@+z@?9Äd0o\(6g0T28?x]O}chC5snk(xV)+B |^1 ([^`6ů"bwZ&'+g<|)X@ig!{ݰlu{augtQtF7ǭύ@iu~'ȥXR :F.5e$'µoiSHz ea0D& P>2MN5fFXO+/wgۘBS-j]Zk ]}]@C;TDl8Y^4}91]IBXձ?:=V"?OxdI1+>80Eቿ4m L'v0pWJ(Eޓ'rƂmZBR ֑2$nQ,XAgz16J@)gߐ]5DsbYW$lNvYz-0[3~/+ +ZUNSDlL_NA~v^cpXl6_; W{Ih ۉ̈́+N+Qw M6mfKurEp'A6ю 4-%w& bMZQ`?<ծޅvCs٘'? ׅ|$O 1U }lF!%hC8ٰ,1|9i!Ϳ֒]V@}q[e?*aV){EQ1tP9^SVʼnܚa``B6ZS^t U0[N7ߜz>EJmavїtfłr;Ѳ/?(kf=ːZ dJ? kb^FWw%4m+"*m" :E;ёaAB8fTB6p^W1$B B fZo"QF4˚d&?(x(Uμ;}6Qs"s~q|޾<r1]>(z;krJ :adF-9a :xJ{_$č,053ql.&N_{H6"9~789@ےYh HeJsw?wai} sx$Cl6Otl ,AN}pg} P;؟d WSm$l3EYޘUwg/3fP\@5K\lSUpC_E0*m8~Bq+jkuy F|~p}~ѻ<> L~G%WsVrV16 >c34xYt}GTi]DY= 5GȮGbļTIN39% ɻYjojp!by>X U\mشf9o391$ Kp}ؕ |c7% Xv X:Y8n}&հqvts*w$: ;9tYvt狳+yTdDhj=u7jC&+{_T#iM$K:'M 6Bν;Q_ q woDG'I-L.NF m|i鲥xgFX! ˘V^#]J\I5F[eݹ e Ŭp Mi5-Ǯvs2tA1ppڝwG5w&+ԆQѽP7Ir~d,H>N@ 0`BQTF/ P`Jt-[l(o@d+$K=t^ȨʇnK%2B8v{|*jvV08~s<~E%S]=}}qn¥wEЏF5AQ;¬,y__T]'?-A,'U?Lj!ΰq`C.r"9œSֲB6nM'BِR&\*'J&p:X/HA/Pʄs{%At>,Uâvx s^8C8gzlL7~3n.}Xs41~.2>NJp:ӆ^}AfppݿiA%ь 5תZoڤjVt>-Y_0__ Wk2[Z;=MIzd' 4MMPrYVk(A,9Tlzuw|X_a$m>2VPK2d?pBj%;&mxYGNI:4}NQPOT[)^×ޥݻӍɎ=lqClm) HzC}gIM9:mB3r+G9 Xve2JKQLrF\ Ɯ!WD._uN? _g!7'y{ׯԎk$­p.AU)gscYU%Ф։w onb&rphC7{^# PzD¦60gܐ(y{,8 ۗz<]  @u_ ub*ft$Pq4E; ^ "y}boQHrTa7unq/el ",5Qs^ȂG]Lѿ`Tc^aQ swOˎ ?[{G9<)/X/tE3]}-WbY+[$X]+'n4Kd=Oȏ7Rn pG4zXag~x TTq@=yVȺTPy3CO D_@ɶln;B<\0ztut0Q`ߜ iK z s$V֛=o* _}Nxy.ix&̰y;7O0Uat"NP$-Q7kf_s6!K,_55C{TI tF1 "! 0Fg4nyQwua`y" [m_zȟȃLWJbD&?7%$EX^ \,m%xBRB[k)6icMh?3 w]FAq8($BHBg n .t#GUY% &yC-R 4jʷ^@-EGyJT'. gcWM=͋e}k UĮ@2 f=o} MJ%}4|D˼J$f_HU?[o.;'/Ox?ع/e+gy7Z%Aonca47I @DmYdn8vLG׬I*x /g5tq{Oy! ~#V'xYЕF9k/5t|-9IO $OS+o9H{ꐠD;&zD z[gvL>E BM- Wnk7IVj EFj7ˉHwlImP[$*zHOaʉm6 :DA6 Qd;` 9q5`q∴(hw!0&4dT@7H_O3cż~2(av(c56KT埑Ɍ['l mS,} 7Xj {!47MMnE2Jlf-4J^8&BD"Bd wkx-ȥH=Z@R ANMFCALPHb0BMI2y(m3<Kr)WZ\֔s#.FGZYY\[Ysʗ,BZ|A\[ѧ&iVP8 tQ*>m4H_DؖSeȧ?Y+e5&?F^5kb?h_۽}kGP?A~>+/맫??m??5=!z%:kH/34ɅβLp$".eȓ)t.%BNT^z ?ܤsM7ٴ:rI/V̛V/ч]oY NJm%h6V5U P u#LIg-wšap^FBM̺Y=}@DwFg5 ,/vKٝٞw#x5@ !vvTWJ +cO'\+2\n` fWZ{pҕjc)\t\ HϪp=Fi3=M"7PY=iMlpΠ?"]Wgfby~U8~Y `ʸSҴKjiUcZMԭ{8^iio _8dV1eTeN@}3Njqx6!z>`ADve-)!ԁ-KS}{,^GWz6GOA> f{-?zi14x#84 6?ʴ˴zldQ4.m?ʈ#IkX(8c#/ `s~(6RVXЏmNCKK$'ɈZrFXXZռ|?u,c{g53EU!꛽;lʩpM ?-XkL0d͒6ރ˻z.ɎXywSZ+)YII+ʔ c}xwe9KUW9 Xɣњg^&F edEh{cf4a2d@b9_6E)S -c>p{Q$[m|,Q8L4 ,k֫75p%]cKЅH.qht3:pz<1`&wX56d7.0vhΗ嬈Od<WHހ9 NiOҮ-kma?+*ݿh2O0oUTQtvj#>||D3#!TVܽA%d}(=\W;U/e@h^{jᥛ#D}[HNݘ ɿOo2#*ѩ0^n"KESGZrcmTIFPцOzG ϧ jJQZ- #[ nK-L6y吚΄C,ْ8rAո`.L.HJ W6\{lAsgMmBUu$د4E(9)/}W!q ˨@so*?4-'CA ~צhm0_.nyLLOIv hy>uDd,ua N\7cՌ#p-&˗h[k^ܗoFĖe18xy /b3nn.ߨ%t@qUޚCiV<ְ&Oh> k]K袽OWThC.Rb>I^8 \%R1@xnj8:S&e6”L (aP+ IQݷ:k}6u\9r{׼ucA !`1ZMpkX_"@Z?eZ;9(HO1Uy ubbOW'c!nLؾBJo[!oi1%5NI|ťJ3G ~27iln1']BntM\9W?0YRO +@6S g+^`K =\!h`ۥ4&/LMȈ\oIn=m+pr̙yP̆^bu h6ϲ} UfFUf_<[@z,[ti0݃rRpZ"yV^Zcw1߮|:"jl4ogs.NgD@.Pe45 B7^TPdT0k{.GcPbfC.?_|ېy*i\e%.k nPq W}Tn'ຊs#CrW]a> #bN~c3-vyr^C[Z.ָhaWZӑPm3J(T \, 1g6Cdf>;zےK'7"z9{vb.6vV]:PY( Qj&t TPW@GkΈmlXb*S[ f8,T=@bJ GyԱm0d݉AVU3Xb,/1uߣѥaa[2ݘcF,ȽE,0s?ex;%,4>OaHv+c߂8"7a0ֱ?PiA[ jCb iVͅpu )8P>9ā^<ӱkv]+0CH%dmO#;ٷ6{fݛ In5؀Eʌ|_#v{'CԚh'*/jv.ȹeKčJ,L󈝪Pl,=vIȔ@o:U;3!D͡qyьo3;3 +嚂a͕/TEs`\i0aVK;/e{ߎypÊ0K6kg6L NΟIB1`%zm#r8q)CП ܯ}f5 X5zs^:}jee'.kC#cݹ:#bZ~y,]MW ׅ| [>:Mad }E%jjw'oߢCKW}u83%Uk!kAMD(/j"HM,hd7j 6^┞3-L=gY<=ū<:? u:jbx'-P}r|V'0*_IE!~OޠO۬uU/+20.^V5 "\b\ /O,v[y=ſVn i?r|D|cS GuuHÛ_lr`GKl*< X^c!8@ca9$Hf{A 1nFK82S: _{k`Cp?qQ ;sWLJoMźHzr'NPWEBfzs^EgMgݞbw%ŕm&y`/$YJ roI3tTQX=҂<w[2&]IﴭQ"+be"=zҌ)<5ĊU6YFcg g-4Aha4G[H6덄S4&}HxLs>{;{=Ɛ2l14ĹVg\ ںBBZGGzhc'L8͝FuTTl1^{6?ysby JWf1ٜrğEA#*i¤i*8RY ۵c${`{& rhubQ̮K&q6qF/;/* )u|I'ZF]EC캀-1>K>*@LIJz1OLp'م>9 %{ئV+W"pBOa/Aɖfk0Ty0z|Gʭg :y~y'MHL@N}"{R`Du~4ɏ^+WŰVa#űKr@ϊ>BTC6Z9UiJ-]tUEn=]="x8,zI:eK IyNGa"5GU\|LW*n~`Y4 vI#U\?"+C`qui6fMu'k{Ja)Qb3b-EQ])jm!uM1k|4*)}Paxuh>28].勐|v{+U"KoǤkRmg6Q۟WSiI>.q$Njz?(@?:|SŚG ivZ3,+V%}"p|bxok"3Y6­rr)[ n?ru{gÙ?ʷ9\i֊Y+WOZ n-}sSe/D"@XW ]7"Mi(K5 [MHxl8/E5v$1_mZ, !JWu/DxT ːANMFCALPH^0BMI2y(Wm3<`KrXsV*1uw핿X5? }FOٿrԭ)Y6OXVP8 4O*>m,HfؖS5ȏckwVH#3?N'Ύ `Jׁo⿕ƿ@fv镐(?7 `6;)tlކ>پ 17'Eͣs׷toO3}7<_KP+#G_W^|c'{q'?G|%O?Qz77&x)=&YCtfbi|JT!w~Ru2䰟Thj< '7>]vM> &2#X]Yu>!4b\ڂ2u77JØm~z,B>k@hTK{cDgQk4JJS1}<Г@Ax%LǔoYwQ=o>pϙ{]uFiAqXx6 VCsW=m6cɖtvuKBgroIT\~|'D?kJ)wtpmX(Pqprc5)(N+eOC x]naq>)PV O0AQEB`[Uzk0V G)$YwQ;~{?G@vw&x6ـn/&Cn aUsSz/Oc/'hǓŁ]+ Xw`q] (kr7=Ucsl|Q5&;3 4{|gl @Id 5aIx r c.]0,NTX4LX)~𖷞iL!ioS{*uBk rf۠?3puA`1zt(yŞ8 DgDMذ[6UF@%Q-`Y0jU#Oޫ2wZ|ѭ5JUDr mg5F蝱i{DSTNb̑u=]m$73"5B2p?ͫZ,Q -Jn1ۜgp6N* 8/7F_5i~qIaaM }X@T3 BHI:9T-XK\z :hC,v:/:NA\FiJ6 1<SVVKs!wiI-i\uZ4.{g籸,r&z&m4>Y*#K56圕ʤ_I:DSU.1jG_5\ČE/K/4IGGdf-n ^Y®ԁk8j$ױqnX.<BJ*ɡ9t/Z:0%6;w,LZmnY/CylgR3d:G*⇼=~Z|1;ƮA#ҷO93kM..sOkԅ>UGu- ry5/niG we.dLlubBæ;%gƹuVhof.^ĚET.Z"Gs*=z:'N%ۺBޟ:gJIlSiZ^j;d+O5@~#gT {|U 7LFAZB߲i!FrEO݉r>7 8@LSmc&-+0'٨ vP &γ(X$6k/pN\Mx-1~~+A ^ =,V@l&`weS c(]9O=Tƛqq!-̓X߄镰HOu6^~fi[m"KOL(sD?GWdˉVĺhdqX?DwɦmkߌP<@le#fNXHf=߹?}5]CGȽBs/X8zfm4cq#;5T$\R806o^U`INַˍ]a>.eœmϝWF~ց9uж[-xT8y,O;((,O/Չ_\jN-RM:^w2/ύ㷌1MP POO[d`-wdb&iҚRG':W@':HD 4q:e8^h]=K\9i6`,T6>*dϮj幟zED?ylY:qs4oԯOeW\ LlZ$VY-;XMM%?D$-Obώ#/` 꽘"b%49k}8?#GS"ݰUP3rs#IDKV0Aܸ kl4EyD9vKt?{vϕ;i}Do KyOƼd䥞z'w $Q`յQ{R!@)\lY'EWbD@*o(؁YD 6(ws b&98j"\t5szW蹛HHwDo'{BD# aWCئVx`aŖ٠)e{uñx3\' yC;:q,Y.C  瓴b H r E>}+=wkx{G w&.K?Y9W`\.=c7g^+V]AiևAT_d $!w/^O2_ D@zI§U0T 0T%W0B`]k<&4?담*PtEe R Fzr9u_E&FGsu`vPÊZ(S ~p ,а!N+B5sJ#bAz`>} FO]q:`og kT%-iܺN)*(4p QByWpLy[(v?R|In?2|.ؒ!QE*ku4WswUo݌ƎtfwayA u\ʃjҥn^ \`J*[j{Լ;x`G|}"UsYΒY=cdu{b"h _+A[O9ɲXOPgL̏r-vۡU" ^w>H=N iy+Mb&CxJ}S 5kx /AD~ӸdWYrPVKZm*G9Wn ;&j`?` \4C8ќF W 6W)& oRᅈ}{Hoel# aGELhy#ƾ*j6 "d%šZD )HMq_4twy#ˍn81"1x<2`eܼP|-9Ĝ$@Tղah4 F27F8ޤ:w( CڞZz`N VN҉+W%S^U{&n} C`-&ܞ-[7켂9yXfN]`&Gir|?'ANMF4BVP8 O*>m4H$#"!$ e=/@,vFP=3A?s`{ gjM ־>?d@,PTpK?k&k?fE;f^~{bߨF% xk?~jfL_ÿ{=#[gRvWoSW'?­e7҄Wi;M& ) "&4!aҽk#(߷rxaDŽc钿إ3[Lb'<;g`iAᙦnP&x+f:' ê?᎓ H%k1-1YsPֳF\J+:S:ytNljJ*UY9J&5-﮷p*EoٓD`3}Pyͻp~"]Z1d dt迧I(Ҏrw ,LI1 V!jVE;ψ*{—LH:FJF=O/ h\ yXX mPƄ6 :?3?g+컿9'䞻\&4_}'1#9}'tk;1Qt$Ry6Fja0_s' pk pz57`#8`c NFikq ϓ,0RxE?>f!u1R4-'v7}$p3 _Q\eYۇ({5둏,Q0wXF'||׶Ua| J8u Z:Ywx} ukrI:W^6sb D,0mtq: zɦY8a+M0|)GWxߢ)lwVh/}Xon7Dyɯ6YD}(>FvicєAzzaW2?f$>j`>T <[!h<01'҅-ν+7}! 䫂wK4 S~dsmIxpq ǰq4KS=Kġ&za Cårq yۯ64Cy^NsB[66[?g*@.šx6R! RCBIX(v =:Ont!b2@``Jl2VcΝEӘS_ yNRSXE-T$W=msR܊ӦL^F3d"=A\y[)uםFjT _4#no$^ߌ8(7Rxc,idP |x򡅚ۺ-dJKxK!VlІ hOz@(ʏΎij <M^2 Tp=2p D~Rl>ũ[#}e ϿMD h]eKk;NϥxB 6 RѥcSupf$X*h¦'f&؞9(dF.^?v;)cEZ%_\+oA;,ōaA D_ڞСxc{3Gṁ:e7h34BrϾ+~-"ɖ>Ras#^Jz&GHk! "pkۡk-:94l{85ɝ@ϰ[j4ػվ͵:.dyL!>;@.䦿v-7;\zJ3U(z1KgN* WMTlCTn ]#J˄N1l8Ӌ'EPeHC>vIrRcDe-ƾABk5d}ga xϳEZRdӁp'!XrmDbmׂoEi5hg"{+Q:U}ZQQf6]~Bu,ˤ=ެnJ6/!OgpNm8 z(ȁӽn]:tUzID|,G=g dLH&dO߉/VM)2xqb?z\:&tIf"]a?cv x+RI!M& L2xPr +h**;t7Z{ct-F ?޸E9E? ɞOp1y\!uKZ qxƟlD#xB d.+>awN{Jhs^,(kq_5FkyK(qP'4_'ޮY{azE烩A@2J! K88:RU`/V4L%Gxsd9i'^l?Gؗ'5U Y/?pzkrϧ. ?B%BU'e=jA *v;qN~  tXUiw~gaV 8OmE>F!40m/-:Of8¤aI$݅FƃӔwKw7Y9؝_Irzu o|zͨ9w(X֤ض6مGM$!a VOIBqZf4_zV]FR%|2kZl֖2*]7O~Ncb@ZД J\ƹ ݴf{(W˓ʁP<;#V{;ѧ ͫHmc AjZDj5qEoAvRK.EQO9ZUk+.>*m~؉S;K;P[> )6iFH8\$i{Cz_5#G>J{uu.BSIHt@ȷ0U.6VB?[{},LDCci.dCbW~ cƱcpYPbkT26nN~u?8T q!,TO5I?j x]~P0eXouⳇ* Ṗ{8 IKBoz D|F:qah?^Ӕp#**t}wD ⇚sk#x[{BxQ2\ ϨqHuS,g\?hUV*A+᡽l?‡~Lfq|b |1@˾^ۏmZCAi ԥE|Y pԵ^ࡨJ$47j9җ&]$E`IR2nf⃔'ӼJpF3܄d5/ g>݇[+Ӽ~ 5RnZ26|gj )[ESyk&$ .?N6+[soUzxQB, u+|z||ԎwPJ&^6FZ׎F7pmf_42<*Oț't/!\_m m[ XzPBeV8NRy?qSbl̷ Nm} sǕ:Q4ꪺdMcEl;~-!w-Fo0J,А/}a[~ϨAݸ^`-ŷ5 &v(fEMǩ!ARPDNY:iMO_Vc%?57ҵtF7 ]Cx ,up˨C a_y+p֟8KfF91V0ex̽*u,]-|B ;(k/XZ)7<L1?@`liK{'ޭNU>Q&RMQӤ{JYAs }Ԕ39(%'jJQ')S⚾ѦNk6M _)M[s>Bَ?kӎHX/ kGULD|v-t@{qGyn$3 I=Ĉ`o@”+]@&/cl{~mBGv`s8n j# r.O"4D+^οPn;t$yȱWLzAuÇ7o+xW'-۟W?wwQ0r:RFs]U}1a3m?-8?,E [M3 3?Z(Mc5 Y| NW|u i{[:jq6ӟ/9|.^gWsfd3[$UYS\G(jꕢOUN)f1 owV ׃zaGFT?Ao6 ځ*g;_?^_6_^vAWoN C|e- Gre4sO?Ybת-Ͼ ]< k'< }y`W9J1.k+hR7.G.Aјn 8Պo71}ZK;6;&&d9O7 XAUEywizfFXwG7UⶤV&(OɣmhsNpq%Ǵ1{T:bJqU&[ { g/>'~m4HWjؖS G Sz~S#{gO'ֿxFoRE A>7go`?Y3@?wD[?_Wߟj?_ !O_ ??n^D]C꿳?u~nrGqC?~zw̯oy|_?Z,}y'}93tz;O%zMڙ~o06S'9[؃0}J{DdNIFb4p8+~h!^ ,#TPRPJt?lYݿ9fx}=;nx;4]64M( F#zU=2"ZQRq3篾>IªcC;Yj{7 ˲ |f4V b/*k6(5Efb u20PZPX HR>LjDdBz2D̘|&nمx &?k ɺtqy;CTuOaߣI[k ` ޒ$G<ݤROUJ7;lYu'Eoefu5$KB#R|{#$,P!;$&ȴR唕=xT`P,݁Wb΢}5.!W.„{DɑMzgĆN<&!'jR+Wn8DC L cfFĭ_Wڃ/ms f_X/1 Eڼa[^K<@}h1kl߮LQ .-YK84<ք?W ^AQBf~5t_|eK}5$ԞaFٗ)p0&RcdGxdv=DPYIP}|I1R+]0ЀxHu]Ҿu'bȶ9t!bܳtgOqT9dgp{%ܽFdj XY#;1eZ%[lG N:[*};ysVNt7o>*1l p˗ףjݥC*N"sk!^qj=eUf<[0f GvcGBl9؎\*a$bvO-nvѰlOR -a.bbف}YM_'7eFXw<*b?Wx@\GP@V?H2bS'ϲLk3s"OYs ɢ OC/ UcV|C"N I1)\q/?"N[vWETj["г<J!US`QXlѰ{Ռ:K# ZH~gH x~x֠"meud"YO*䢋l\Q06incl-k_/I!\Q $ywH>aM 90Y9!K試t2ʑKtOV1ɄC-_aV8pP]BP4O,'Iy#zy/G(k6H,Cs(^Ty ^ryZ\嬱rCЩ-dR$|'hݮ*ϲ5U\,L!τƔ.(^U[tGkrRiq *{gix*%JVgt!j@JӦ9Wm?tF|i{FѶ`E6Osͤ!z,l55t @0kHsrx Xۃ;JɄhp&wU*ҹ9gD/CK  7_2u\VO-fK6~  !w:E$}GLI{W]G@z|QzEL9HN lqۃԆX+hӱ#b4̤\ '7~#e)dg=>НNkLmy-ʮ6e #ׁ !4񋯃 3}F9#QKd,2\ҊZ NRTMΉ`>qU?vCe`Yޗ6Ȓlv4*ݮ57=qc46:,t}4܎3ya^-c*Ei$kDvzͱ7R~7%VYs`&9r(cxb٣& 1( <<8Se!^NkP)LkfFa0Ngo(~mÔs ꅆgk :dd;H#x-\h8ȃS<'|ZrožYt Rk)ﻻ#TpEkܣg4p$`Y8+L} &P<-dTBB>vk^o1c<_whU~c( _?U[lwje2=Ψ i-x8mQ(OJ3ho ˺lW#7F/^Ǩ%_d T6M'd* Ќv V %2Ήr ɷ|fOyE\kcP}+\,Y5ޗXYn;z}M@nL'TY|c7d7s, a i7(PAMjb6d!q{eX!5a CG3<ވO$|p_ AU  Deм2b5^lFXr (\w޺SN]dj{^7Vzz*Xڀv-=g/3m{KaIvZc7Wx8-2m4HO.ؖSp/d_i_?nߏ^G'h8?|@i~bGg7/|}0sk_g_~K GhG;~c?OO ?mֿۤ7?N~_> 3WRxրu9nڹʮ-ec}m]_obj+1Kw#/G ߋO_P>_W0g{~gOὦ7o/7B״ETW7nO'Q6̯XE$wK4dOa4pԄY>*$E>rœ}I4PH) `<;yNeβD{]._ʘM¶%vT=9MGI`ͅWC$A-9h3hء$s}I ukj\&ѮHfXAQG/̬ |rV F^×ܷ2B+e+XWa %-tz#{:z x4/e /S,8? pS=aqs5fI4Zcf(Bjgc/+V࢓2GЎ yɪ%|NF8B_~3T sE¤!(">B럗=N!ڊ~0EuLQ^[C,S:!4vؕLo5O'Ϝؽi޾#^E7\9FٷOP_0C^Z.7g;$43i2K^#zX>|]F4GnmСO=9Fv@;Hi_?שMϣH3c[݊D;K8,"A'(62w/^\ٞ*._$JFw J*W1g /s/4"hwyGnqQ"3Cz-/P='jfkHTgUzV%ugQ o!c? <$Ȉ? zjSü}?a̯:|*]{fx.-9+)nG? $KnuL-_vicSz},>kp~z2Q 'P[nmw>(E=MΪ$Ι$|*V vҋ~pm ;Spm+(0!ܠ Vg$`^N1`Q jsdؔc%EEZla[5H'Mkf/QO8Cj.ceo Xj}&L\:[kxU[']1ȣ(i;zn8qngi˴'"cP.h:rrx8,,xTb}bP8׶U{*O>L6 g)ƴ1[fū\ƍW/#+v.mטS,u9Wm0mF |.H?: g`FiQτxZ ޫ՜f443^c^K],l"oLǬ'܅B\^Nd[&`1jiq+ޯV*^[7Y!S;[ `RN9]Ub@v} m_N *; З>''jZCwYX)݋VyHS2|5ts>!s {~pygӯ.;@ၲbijC?TÊ\`:\%6B%s ٚ?/~ݿ0_Ͽ@;˧PE`'&V9ԥ*S&}^u1($6}AR]8]^$+q^l '<0?|)"5[9#4uv'ġnodmni|m˺rAdq¡j?Xs /d\@(_hb:1W1Iڌ#`WC 0yΤ.bN7*51bo|dT`'qa]E}HO2]ʼU ivS榕[Kwc1,b%rdr6)/v3֣^;pq4Z ),{ذ |د6흉Xt, ejE}V5`-p>\%0c ~ Ŗ(I0( $ . cJcNXT=nB,G1ζAsGaf85S yK|NJ:Ḱt߯?cbyj; R,VMxͅ\^:,G+nИ4dhaG \,&kWd\W˛FN?@W?F+nxVӗ$N_bCQT^% Y\wUKtEh{H/μ^|+4nWyll}+) `濏7vWf9߾F.05vmgmXhԨ<=N82qF*Ő{E4u$.eԘB- xxT)=;P065_@ |`%=\"|A貒 NB2o7sGOx"~V$t "VdkS$+= \1JqG/QO"&1rL+l|񄲔) { DkdB%Eb>)>xxe"#AE4g ,u^.9eYF2xo;cՆ:=KLzFFu|Of)}F5]L/II׳ebb \1ᔑ#o-ORF#3ug/VO*$0}+?|+=O)*\ V0ν+[`+WI)kЌcZNj՗w2iT63V,5 E{JQT_D>50myK+ƪ}jvBA}-謢?4W('ΨBKU3vpٞ5uKB)71Jŕa3Vrpp7HxXORPJx{CkK:l?>125Q-` ܨLTt[ֿ:1 ƺB x.kLɛ+PܝOpse#[;1p' Kz_TvBACSJ>ž}mIoq QR$h e9c $7Ƴ \ozoV[P6aVDS[^j~\JisE|i$V&`]C̅:ԅ:蝲L~PҕۯE! tt6q$Z%B;U9˒eln9GTz,pЂDX8$ɝ/oHPrZ;UN|5 j(EPo`12ĪesDSa(쉾gݻl#Kf)D̎w8&x𴿃^yEY?">ƫxӺ.ҹv% |a,k-n8}jq'*`/ղҜ/gmn=RGu8TP#`lq`˩X΅dS\#jӦrz pma)<]X3J i{=).ׁvI׹!m[\a5KEP_x  eU+G@7dKʴx2DY. E.*Jo*K&SL a+L<8o Sp0lG P^9f|CxozNd(,9q 4#4sV&oDaNܝHs<F,rTPy<.кX7[B$GҒ k/q(Haِm@0s^G],/SUKuɆi%϶pd٦C`7UT,Le2i ѼÌtΊO%I«wW ٸɫ'xP^7Q^54c9Zq@O~הK,!f$+a`Du8REU9[]ػ>uHS8'R4[](mcAv1zxeB37;!$vZiV(2v>IV*mQRc݊uH^!拂Q{3\PU_Bg$Q"5˦Tci&aoհDt?ANMF ~BALPHc0QIGyF"m$I$k[0-oe(mf Rͤm"}Xյ9o>=.M2 AVP8 tS*>m2HWUؖS#U>w<¸_*?cȿ|A/. ?;} CcH$/? ~ql*<mZpuX7Z|H7\$Qx:g9-KPxu¤Spkwt#@7eES jm@1aMܽv"gҒ&,t)?4$R'Zepw >jNf4d9d'eweiƷg~>W?cBtTӫk9')vtAH7tO!b WnB,g%kn&pabrȇ'P!PQš"sv%31- uTǸ7o0bE.93Ԃx,/G`9p^]]8kr KO.$՜D&)?r05HOԡrX TQ.77C+!@~uų/򼡥ZH\ǎ#! `S0z8fBJj6Q˘ieeSU< Hw+'MM :9ʾ3q//j9 Y`L9C7%8hv,ożiv،]/g`FubQ$)8ilm7**1r'5 w,ӪƫqbA8֓!(.p7G֍2L2ݱS/K ٬i0o|T> tX A&LC8}rչumwgZ?ϝ[+< |A|!ȶP<}ظK}MԸ@s|)1LP#VUr?, ?Иؓd{<`'Moܝ&+> P}r|ZquIlPhNz#&[m?ai H_`a%]sʯwԙ U0w!ln}u :hzv3 ZH `PY~[I``K&mzzSaPj BjК-<7&V(ф;XDO9W8j.KMXl)i{--uڼ8HiqRlu [4_(kCxr=@ٶT;NΤq;n~j.o.`k,Ԉh<1|! ( IQ٫mp.yM* !]MdVmp\7jfvOleE`(I.dplgd #2ΤLwP?.MH^7%YKFNVs3Ǚ?O;`C(o`;mk̸\cNlX'Z% [?F1+&ʞF0 6c$lO5^dCd/_iB Ʃ<˪Y<[ IIiHCqS~ߙāű#sBM+NtOVX& 0Z#! B`l$F$@N <=/G\kH]b%JO3-'|vch?a:KQ^?Or5z\ay$8ވVYAa߅! 4}I+MRD _9mFysJĮ4R ]A[Yk^:}i5VW~__m5^8?.D-{>l$ݢդ\UHsmx,Rp,g b~ybz&k̓~]䈅7K|ER.n;q׀ ȱ_?#H9Y2p%E_@Lf^Onl,C[U͵ga=SAl+V^75&)4BX?apg\DQ˯UqInpoʤ:D"jX m!nV/Gem giϰsб-:Gヤ/:iˠMI\戮rl)gwj(Ө@%ŭLUh -2D *&8/Q<-҄gV0 iĥ{n B|8n i`^)xNtr$#&(VTQ2*Hi.OO. ?7Qg8ZÃWR2S?jϜHGQ;poB|@{Z*^?$?l<\vz2ktm/ϧH=]7Q6cICWJXtK9~tP0Nt}.֛h]:@LqQ# ǕC9 WbzJG| Z&y؉_}pTMݞGq/txyh 4}ƨ/%bH4ar(7뛃-WK{`@ugᜓgYV71s&lq=P. M,%bY_nzⴚ.c>pk*t)MљM\˯BM$=.7,E`}RU-Hvjp@Aغp[Mw:%Ż>kO =&Vd῏=EDZR2юv(7RTLhE9.,Nz项DAsZtΥZes!OJۂMWRXqfd %ANOz*4M[DDwD+d'=*@%&M\qfiQ041(S>whvDv$i 3O˔U lEBOVD^vX lCk(Yl)Xk;%7Jn0=pj7Vj:雥p #Z 6O+ЌkԊ8Ju,i  {,/Q`q (lJx.K3¼6bpFx -IN>L$.b+{'*_ow:VkEӽMGLj S\&_Rc'~hޢX7N!@"]WE{8O=@TJ1J"Ù$V`n5 Vzʩf/@^ܡxky5sX5A(g>n]~.°mcF8ɉ }P{e3*ݻ`}`;g}~Pv.˦߱<xջк]  8 Zr,KŴ.;A Q$< U#9#=_F nPOC4&<(h[ Hú:E@ac8 z-'C|sA({YĘqZf}z]pcsnMuqQ~^5L흰WXnpZB6 E=8Bg-4]<zVn?>C#]қ ͍msRݠdE8#%<-ض? Ĥ IkbPgEUv㚾3IDy_2xJ3*0 ծAC>/[NN+KMޔjlS:D!]8dߏMhH̫ k}#~0M ]ҚCTZZjƝ3?-u߄74u͘7ߌQ%XP߆_uFa pMģgЃz|X,"Fyoί5D$ T>&s#dRTCG<1XFu j⣫ժnO۱`c3h;>\M`ulſ^k]~xk&EqrhL,$(2c'pEĮY4L-p|L7hUT?$8\LN&-DI/^Ă ,q0K+Q+N{̥nMп K{g*tv&8$[rWI9M~b'SXubUĥʙe"Ɍɚ_ Ho UpT'V#d|Y/u{` ʞqm @:3 }7»dMBoW/#JI}up*3JNIWvfWht!ٶJ͒H`ڲu)Wg/Z!O`K*vp'7+E7hώoQXȺ┸0 ,Pw#bR'[Jf[s9Ɵ[e&DrP8hnMFA[/ͧm~EN A j2Da"G}R@Zk ߚHHTvg~K[LӔj(Bxjl/ɺ ƝH8.zzA x/neAoR!rFJ>{UKcd\/T 0- oANMFBVP8 P*>m4H$#"!$ g=Ev^ ׾C[?<_ا'?Qsg=@IOY|Oַ89ьo3+KϽ)k}om@wo?׿r>꾉zE~J*P^-_={x t5UNzoUcj\> Bfw0'lSEBΏM֔]5C3Wإٌqb YM*s!ϼ!ȐPsE}{_td(NA%3IJM[XrfJk}z?On Us sÆpcYwo$]I9+&C裂ߺ! BnuR!ϣMF߾7@ n\T*7,7 $S!^ή$|Zd0&23{swA,SHrbfw0(j 4/ hCm@sci3FrtkC,'xOE:)!rIk궲 bX*ŊBwh96 agXNW{`fd`" H<Wį? +⾤ȣԝBX%m'H'˩l؝=&pݑ,MݫAK%NrxYK$ dRynj{>,H@d0$uOBB0υ] Tqw[Մ Ϫdc)_ށs#x/&Q͋؀#+ffTUmѣS:^ChAzY\;̰l#"@l^y@i:ᯨ7NrǬ?o v%V'}ֹL"n巩_9_^߼-Īϗ`G}&u +0\ jCh!L)ٽжj&:a婰G?/~Y@sB\:qXAy` F$&VL ?cM|Xs)[x?F9!njXdW=A^v\aSLOtR9/QeI`cլaۀJ~l0(ou•`(13ԁt6ȹC5*=H {| )ǟix対Lz@RD/d8o $;"?|sie˘(. =&%5SXqDF%o+R >jd]ģ'SiM'!ޒ=3.!i._\n~ *oU(rrҥc~C3zx C=LSsJ1Wa >1,ZSSduߵtdMg+Z+Q:|սcWgbL.l-á)SLKX޷A0F]+"~]5G?maf}9ɧy^6l|Qz_Z5\!>*$r-yg<넨ќ@g{Fö4{Y$EآyÌ^pΪ&]_8snJO@\#9O(Zu9֬'hu[/pK c N2ys$3(.m}un#{j%+^3t^L\hG{S3AWb\7|V&;]tqڃ޲&זB=Tӛvpwۧk~-4R4~Z~tϠKf ĉ+O??_)g-`"֯)k 7kg :(`ywo?g#Z! l8l9$GL{}aE+7uUsIG2gsN C^/ɒw#m(TH qpڤŭpE., "OBasAfdu&-nVt ~<,>/+Qk]v< îI[<7*VoOkqoʊu{R[~` %ܭW7^B:TCC.ϘE/q!.7RWd@k?ICQP|+{Hc cWKy,$%z2XpF iRWEEw .9$r=U)mL$lmp=A˵ra%Ы*l"wYa"ί԰@jv)GP"[RW&j=k>K B ^μ[m3&h(~H8.1|b%Tb!0^[ڨ7P)B:$ɴZ,cwQaqK?c7eŽH6rf?rpC}}3]z|+v1֞{8@\M#67κGUQVۂ6~|M˵.Z3*)J~"fc/(u׽%֗\sR_&"m^؝NorlsM: {d;{ꝃFLmHgE$UyGP*pOj:m9{YyʫהļEm#m 6O^%>4mBтG(l5ip)05r7Uu&6[ͶԢ5P/%FzS^yҔw%| & Q!oz=Z~gQ:x~aY2Lk“&!_KhOͿ/w%\{lr@!†7}Poe Жп&j}? IOݗ[nF]yGCXL1>g3/䓳/&R^uO?^U%ϳUSmuB?1a^ccJ~-f'@uffD,q+¤XGsf|P~h$M^̯N"UW_821 װNÃDHD.96t9Xɍyy/ +$ԗ"V >b`g8JIa<s_zmX J[]q1I6f+ srNU"dڋ`PN@J'0>151,"EVg1o}1]`mCd4IXR~Dtߏ,x?vV)WtE6*bE ړ+H|EA(G?dAO%o4G8xӘ=b3ٗSWkt&v~n |9tQs)*ǐcިO% 0ӛt\JT[<Z!P3^JIa!v G*NӐR#WRf8?t_@`$*U<`XϜB5_ąϪ%%v]*DV;K"dpEm&Ё], I͑ >(Iba۲K/ rW/')c8uq->+_j#_Rȫ Eem G+>nbc+:g]p.w.>vdOQc 'y*Gx0{ƒTf;5ELyQms7w.vu~Xѿa}.)WǃcyK9t’'3@Z|PJZDSM;d\3zQqȀ@Miz~g$_y{.K+ D=IuxT{Q,;Xsy;qpOѴ? #  {j6%wNu>:Av!Xg_O.sjCW:?aka03ofGa?7Cf ϋ~ֽ)a,Š_G7o"j$!m{^ߝ(ewv$ºՙ>Z>~:ΒјgW?5G e/͋Cs+%&)?l;^QQ9 H (1i@9} 'Y\aPs+ "چPڸDpBŸ^%1i^3ﲮ{h p]+H[ԨV935K+}ϑijM7RB>-4M )YB!?x~n_$R] Gq@bq$хt Fnr] !n7ryVB%!ʚ}vyZt0JI7 $#1昃9F]! I+%]ubi )XhF\iRT~/̃c_Mk|]{o&M{h~Pf7(EB$Ae-946`ҫD0o/pBħQ[ 73-6J@{ ϊLIK{ 58i9oi۵GV2vV*”2dk Eya a2!j2=tă7D' ;XyPr6''r DKvfT ?&ZE A޵yu>79Ov+fDYr+c8G}ȷ VwI|Oh_[_;J$~gBq8b!5.;Zs ]4~v;R !|,n:?^1[U?9)lM{ 0?7!掩!mpZ1AXteu&cC ;#.G.OiBFwJׂB"P|UYZ1j^C/\y\\*V(I , hw~& $Y~&`q̹7+it6 oiILL U$Mf=7Voyz:T_ikn$<;_ ͽ\ ROv4fx6?KA||,SocwZ>O?vWN~ B8;4[5)ڝTrE1@~^2y]ixr,C7aF <\\)3SPkz [%'~M?v7ۯ} ,er+ ֡'#T4N k<*9krD g73Kh#2xR٦Px@. AuOF[ vt&&C3vѩUD2Gous@8_ҟ"z/Ps*mzmS!z{|0yAT_@2 Κ§aNjPl@ Aqԙ M9?F$ڛ!F-yI~ڈ@segno-1.6.6/docs/_static/artistic/albums.gif000066400000000000000000021565751476440322300210430ustar00rootroot00000000000000GIF89a((nbWPc-ޑ^ϗ!)U$i_.]a%)!V[a*P\o 桞YϦeߟ^kV.ioe1(Z%˴ ǽ cڧnyj{/kVâ=K ;9uXFGGGUVU'%%+564vwv*.&ȒjhjL( O6MpKF2'L8-NnF mfRm6׏$&dz55jXQYPGpW x׮49Gm'pwz % #ȍGxqɸmguK*&SU3n% TfmI+nV pe3wNroW1*$5ELw opիYOsvSp ʰ% G8E2f v 7PɰFȐpf hPmVdjoƮR1UTͷ RPSYflJGX.v10O ИPUUUfQΧoͨ0w{9PtմM'w.зp3g2jj2WfQ񺳬PҧRuTj6+1gwѸ/oM5tsxs.WI1 i+&(7цE1쪐0Ή̷OI1FіZIyt0ʨ/l022ʆxG|42vaCF2l!$ƍ!0v#‡/nq3`0o9ҧS>Fڷs;x4f(ohOF2dĐ6nĈ!1dȈ 8܈8܈8܈8l܈C1dȈ 8l܈C1dȈ 8܈8v1FT3hİzkV[vJc cɖ5{mZggЈn\sֵk {1p;n0C!Cl!# 1bȐ#6lԐ#@Ԑ#6lԐ#@Ԑ# 1bȐ#@Ԑ# cĐQ2bĐ! 2h̀ 1ȗ7}zӘ~|׷4b0 <0@3`8|1C :bXK2bĐ2ȑ#oܐ2J7nx 3f7dؼ2z!#F3`=:FL:} 5T4f5֭\zudA#ڵlۺ}VtҘ#^k|Т减?l舁-;b8!#2bX!#s͜eȈ1J:[ː#l2bؾ-CFݼk< 1̛;]1[1ܻ{>3h8^ۻ?|6tĸ  4jA(ƍ ur#2,^(#2< R%K@)#ʕ2\)#̙2dS=}ʐC?`E:F MuؘUTU^jCG ]ìVXe͞E 1ܾ1\uśw 11`3h@,CF ƍe<Y2,_Ɯr2<!Ch1b@ZF ]Lj!Cƍ2lƍ }ߐ#F0A#r4f]tխCA#v4f^x͟G_~C|/1CnĐQCƐ!#E6lԐ# 1>ʐcH1Nʨa.eȈ!s 6lc'O1~ƨaF 1bȨaF 1bȨaF 1bȨĆ4f+vfc-۶nvҘc/߾~,x04b NLƎC,yr4b`LcΞ܈Q2bN-CF2aCF2b!cw޾{˰1bȈ|y ;|&2b`a7bĸa7bĸa7bĸ!2t  1(&TaÃ?hĐ8 1fԸcG9ΠdI3`TeK/SΠfM3`9DK`# 1ʈ 8lȈCWc 1b1bȐ#2b 1bܐ2nƍ1nƍ1nƍ1nC C`=F ӧìukׯa^=F ۷ìwo߿> 1'1FsϡG> 1g1Fw3hȠa1bȐ1d԰a1dȈ? u܈=tH 2"Q :l!$F 4nĈ!C;ب!#F 5lب!#F 5lب!#F 5! HΠS3`HJիXΠW3`KٳhӪ=;FpìAݻx;FìA1bȸ!ǐ#7AF !4d#%5 7jX-BtĸQC 1tٱC2 qㆌȓ'!#F3`H>FìË>Fì˟O? 1101A C3hĠX 5G!EQҤ )c2XBEB!# Cl7dDe5vDHYcȐW2b%+CF ik 1Υ1]8~_3~Q 1/1cȑ%O\e3hܙ EAiԩUk3hĠ] uox ɕ;nC%J!FB~ء h`Sd6QLb!Cʐ B2b0lXgЈa"06rȐ"G*gЈ%0fҬi&Μ:wA#Р4f(jtJ2m40RA#֬4fuF1dܐa,ڴjcĐU0ܸCtڱ1l!$0f舱V-%\a:2F.]1j̀ 1fӦ13h71h̀a 131ҧSn:3h <13hĨo Ϡ!@jȈC e4l# 2bTK0xɐ16JzQƍ2# 0~܈#%4 c Z;ب!#F 5lب!#F 2bĐ!#F 5! cΠmZ3`u;CG sֵC {Πp`3`6|qbŋ7V0j 1bܰ2bĐ!#F 2bĐa!2t 1 1:z1ȑ3t82ʕ1t̀3 1jڤ1Ν<{ 4П3h8 LΠ#ԩTƠ1֭3h d!C6dĈ!CF2ʈ71Ć;dÇ 1ߠ#?~c7ba !3|nCJ8lȈ 8lȈC1dȈC >13hx ԫϠ#ܻǠ13h8 ۻ?Ϡ#~3`C 1 DPa 3`<8F ìQ 2tQCF2d@)C-cȀ)#L7h2(F BvиC2b!D7j!#F:d!d:Pb1d԰a1dȈC1d԰C 3`!UF1d`ͪk^ʐcXfeH6ncȐcv+CF~e!81#3hĈ, /Ϡc3Ξ?Ǡ13hH _Î-{6ڶgϠc7o3`>FƏ#O ΟϠc:u3``Fec| ϣ7c={2dĈC}1bȐc 2(CF 2dPBcD(b edqc0@A#FI4fPr/aƔ930pA#FO4f:hQG&UztOҘj4bdպk4f;vgҘm5bĕ17F]wƈ!#F_# 2b$XF2 ˈCFe˗ed"s,Yd} ӧQ aϠvm3`=F ߿ ǑϠys3`D>zuױg>F ì1 1ЧW} 3`ė?F ì c!#:ؠÇ1d8s3j(CF C!#Aa°b#aœ#6lԐ# tԐ#1Ҙ4bHJcXgЈׯ`cИ4b]KcpʝKݻtgЈ/0 A#È+AcǐgЈA202kA#ϟX#ӨcA 1b˞M[F۸s!#kք#F0kք< 8l܈CKlȈCc4b_OcgЈAcИ3h X  .dCΠE3`l8F !E$ )UΠK3`̤Cȍ9{qCKȈG1.1b#2zk 7nȈQ,\EX`bdW`\H='>|O%} a\CtXPS9$SPvF  $h #F cЯ13h 0A#FB 6Ac gЈq#08vdH#IA#FJ4fpr3iִy30xA#FP4f0z%E3D %l1hO7`Y#>UI'OyeDJ$hɰGP:dT)H 1lxJ)H#x ɢİ|Y Ȉ!CF Ѣkq 1X1Fl3hİ}wn1h̀ 11Fr˙7wzt3hİ~ ۹Ϡ|xǠ1Fz3hp z:@K<1£Ǽ`衫19ˤd˫cȡK_$O[J0V&5;d =rx1*rĈ1ȆsH잂7) e,ܹ 1dL>=5f}Әy?fg?p_Ә?@,h „ Π!D3`Ph"ƌ)Π#H3`,E<10p M"YP`K xA+|!# )mfRa-2t)HAbY(Gb6rҥn0A#4f(l0ĊA#4fl2̚7syGӘ4Wn}zgӘ6%,0@GQ;ZEK1dPdU:=иu3e"D0)H@s(IxĈ!1d԰a1dȈCFF2b`" #gЈq%0XtfL,gЈq'0xhPCA#FR4fpjTS:A#FV4f0b%W3Ld1䨓2A 0Q#38`8G3`'/AA!h8p3e 58Ō #d3`X9ff~"9}R3 **S&-2d ,K1b؉O"ewx(`ܔH@I#cȨaF 1ʛ?/CFL*? 1ۧC@CB3`<QD-^8F ìRH%M 9F -ìS E81SZ$K`̑IE!3Q*GE#F7ҥ#-7̸un$xD1+C}83`FFϣO~={4f/Әc?48 ΠaC3`D8F ì 1@1FI3hP /aΠfM3`9F ?:hѢ4fPiSOFtWfպkW^ì1 1ЦC F[Ő;#wRo1?`LF Çu! '?^r`~f5ij1acw6t _^3~`D;* ?@,h „w!Ĉ'Rhq"36r#Ȑ"E$J+d]/T-bĸc1b怩BKb#ʕPMb2'R|qKXIbxg9r6Gr.^:jw( PK@311Ȓ'Sl06s3ТG.m4AeJ1b\)#g0 9L0: GN"ɊK`Y tGb2hcЯO"9* M04xaB 6tbD)VQ3bi+L+1*9#9`ڴZ+b̓#F "RtEɀ'OW`86(@wn $ILM1bȈlX1ƐmZM1R5Cr{o^{p` 6|8/8 rdG Qܱp  TzȈqZF)4UfPǏmƁgȐuѓJ'l\B mR$2d0-2bĐ!%)9b D:>M= (wxĐ[F ޽c\8cȈC`d -յ2$%0`1#NMbk1D}f7g-h1#`Z2dA?f ÆB(q"ň>lqC4jԠC4tPRce .ZչAc6o)+^>!th+Z51j)L&)`ץPeoDCF^yGF2DF "oQjW9b) #Lj,9ʖ/ȜYF2!*1rf¥ M̺ƅ34*P`"*hbAШA2egQ&7Ȯw?`/~<ϣ/?F2b/c~2#4i9FA|#-Đ8Ǒ$Gd89eʸqsJS0Х 50FdĈ!#F #8&#F J!#G9fY 1b;$SD$Gb;2Ц!m[1bHK2dʕ 0r (1ҫ 2bĐA~9lĚ'=hx)S#1dÆ!Ea2b#^0`JF :$H"d`%1xHiK(hȈ!ǖ2b֮_Î-{63j!dZHqrd[U0`@l@ A-FԨ# 0jIc &M7r1uŊ&h *xr?dCFÆ1bȨa1bYAH )h܁D5\l#F 5l#F2dcK*m#F`D 2FUUg%1tJF!ʓ'PSEP wH 1r!CF#~PqcǏ!Gx5(ЬV]8 - :bȐAe 8|BA,1dAnj:dĈc S w 9 n# %1>5wrȈ^1nN1r#Fĉ!fSĈqɔ)XF2¬a#G e豥(c̱c A8 M;d㇎5|%F #pPHR'F 2bh*#Ǎ2bA$G9,۷pʝK!:dc 0?2b#Vpd!10"/)5}cd谁%6tĐFS? sDzAQ *50ɖG ͘#$PD1dYcسg{|41$F;HLmɚ07bĐf 9bĐ =4-'EQ7#F 0c 58Az:,8(æ:t܈ѳF?Z`,eSQN:F ;$F & jxaN4`{Ȇ ^Cf(%>~ };̀Q08x4@9Ò2p r,# (O`õAalЈQm2bĸd&fS$q<#F 5lب#F 1ǐ{@@2V;$qbaA:b1D@A1b8Ɔ(h@`ϝ@=bPcF16nQ 2bE *Wl%̘.gԈCƍ9xĐ3P|8Š׏D>$H*DJq+X?(KbqJz]q# s,I 4O0bLb0!q1dĨ|M̦LA3Qj#WˈCeĨ];=3#U(#0Hj#ƍ{7!CFwp>Lvlb1!1bѣN&una   4xa5b4t谇&7n06>h a8懏50XfԴ9F+1b01rZ'.Lo$IҤeC#9bkʈVF,M/) $9#F`1d6\8=dp8^tsIJb.CP1bHJl4hѮ5h1F=(iҤ 1+ztөW~{5bt]I8veJ> |p^`XvA#&Ĉ!bdIF@. u*2$9dR6SDI1z#h |0t SNA$ԩReXj\B 6k`%OlNt rH'hU :8YbdO&71a#GdZ`x :ѤK=F2nܐ#ƍZ-m(C &Lj*F2Na(Ύ1n!#<$9)'ȸH[6=te9(Ixq4L}-1,C@4i{4sㆌeȈCDM$HD" -]|C 4c03+ 0p, R1dܐFq\'vĈÆց d Yr1zsCF2dĈ/_~:Xp5)1ƈ CrĠb 6nH ap!#F@p,ɓ$Ĉ!ㆌc*THe>P*`q :NDǘ1Nm朠Bre ETsõ 1d B$I'P Iȑ;:MX!2rXú84bwŏ'_x-~`߾}%7bĐ!#:vC @;Ġ"#FFT#v,B"?`@<1󧌜Cw7Qx 1Ph 1S%I-?JtF &1bl!O1lAUg  M FrȈTFF1dȸQI=rȐ#رbe#F0ں} 7ܹt1DH2z#K AC3X ՄG30$HM9<j &1b8|"rȰNbqMrQa芙+rB1^!(ƥNJ>J1{Wʙ7A#ajȈ_*7bdh a`ئ aI2 ]uŌd|JJ9dĈ!C\lk#F 2bQ'4CPB{pqCF0>UTUR =! rĈ%bC8@F9z<<CTxĈL`MSP!'b㍞. ȅ(QɅ[#<\I(gJb㇎5|#?~#>~0a 0#7 8raYV*Mȍ9䈡PF9,a#G2b`#F g|cd&el"G3l3͚6o̩s'OKPQ)9zL1r #2*!Tbc,+0(%ޗ 0%, B$1sŏ Tʘ3kO &)@!  D9"(G10ʴ%ƍ!0~4  YbĐ!c,wȈ158cz r:CI 0`)c &6&F"=bc>8lȈCCh Ҥɍ;vhcGA9 5tĐd#Mr/M2jU#G* R X #0֜OW1N ~}qR$ AĸqcEL*TS* $@ƜYzZ67BFH1 PGC`\p_wTd  *`xFk0`\Ð 1$̠c8s bř2d,|UA2z䈱]FgNUT#F2bL!2148rG"R!CF 9-S >jĸƵCfP"o'^8qq4"ERzĠN]F,2bl߮w:>`Ȁ  6tiý:FnQ~B0` E8AXR 2bȐ#p܈0pJvh!:bԶC0,;^]t>ޔÃ\{$R`\$ɑ;jDR , B'r)oH1B$G(昻dIJ1bѣ"9rc1bȨĆ$GxtҦ 7h9PWzR+5ƍ!0z 6رdˊA㆐>l 8lȈ !# 0` 5@tĸ ;rUt*GJQ(@\ԠQM9lR$GxiLj$}J@#GA2bq9Rzc 2b<# T0p#F kp#F8q>85%J 0`HFF 1̀SN=}'/&11DF2laF 2bĸa[|rbX ĸcmC\3`ČW1b$$21byu8p؃$7ct 6Ԑc59TBDFDc! z 1װaK1dI13``Ď!,1γ9@Ï/>!cJCFMrH1dfMVC`H$A50@9F '̀3rpu)I$O@Q'?@ڤhβ.zl#ʦ.0!i B΂1t̀%'h9r$I#IB$O٤hYB qW.D&8`lWaŎ;D>`!տ‚c7:Z`x/f81 2#I4kVs$I@ IzTORʤ.Ĉö#wT!G:fI$j@A$ɑ2O^ݺt67dl.#w7nȈQ^sF2nȠ_ 2bĐAdqDd(hP ʐq#1&Ҙ"ƌ7r#!:dnjM`c%T2rȐ2lm e 56<(ҤJ ÁiĨǑQ`&#S'(vzUsҤ.]0Ũ*uT% Mv (& M#Ct؁ 4dĐaYbh#F^B 6lFH#IaC e_~21b䰁##<`# (y#Iz,# "U0#W #`ިA$() .˭N2D!eK`,I#s2Cc:u2b`.CFeH+ ĨbQ$ !?uTnȟ_ƸA㞌2и cĸ 10bc0@9dI'QQ#FK;`F+FYf lnб >JAiS0~1>Jѩq#FW^eȈ1vl)MBF$)K]]ME&J"DA$G2x!$Fc2 Gre2bd,CF ϟeȈ1!g\|1F+I 11ȍ1492ˈ/0vЮ]F 5f?|yѧW~F csWGF eĈ!F >`H$AB50"J 12j 1BAd7ĈŜB@GO8sԣg*{ã(1t̀CH2nAժ7n `޸!huYFD,EP"A`,@Dr00|7bC1dÆ1ܐt0R^ͺװcQ#7vaԍ1x#F9bĠ10 0~1‹W!1ˈ! 5dĈ! cbx &IQI2L6)THϲ7o*ڳ8Cѱ0p1*9bĐ2 1bȨ1b1bȨH IeĈc'a$R=DEh AXT 2h#6D 1ջc B !#3`,fcȑ%O$#F>|#Ǝ3h(mZ/=bn-B6dĈ!BdX1(Z)JQ6-[)JQz-VWGBd-@nĨ1ֳo/c6dĈ!;dĈ! >v0x0F; "D#_̠#c~F葐#eǣG>֬5bԌqCǍ4l$(1iRK6uj5bT+"<Љcș11b$GLFqse԰[#FhȈ_1&<1c1s"DH(Gb)}vl:jCF !:b!Bt0.7b4C1W'>=bt7bc(s+Lbq!DȎ0t0F y…3txX+Z1ƍgԈR<,㑃?Fx)#f1d#m\:լ[^F9,"NM%p1bܨAEGu1F4tXAF ;J*)>+!# JQ#Ǎ&MnhB&:*)hG5X@Xc1ctPRC"1,ACiШ 4tqF 44Q!5hܬ |CF 7ACct|3~!>?|@3.ɘq!!rCK d!@hĈ)8`cL ;lЈ^F2rֈ 1XHҌ?1`AVʸ aC8)DK#g֑ KG*IgVpYIc9fM6dȰ' C1 @|PTR3ę1u3b $P(FYg1doƕ F7  rq@F4lPC !G|x')^zȐ~ &2z4+T0`\!80ЧW ;`ća 0ðq aX &u(AF :nhBԩA:t b"0BIƍ6`\ɒ%7bĸaMCn` Ա"{fXʴӧPJ u;hS% &=bAg LbGA?`ȝK8{_8`JXf,&JǐcȈA27Uc9dTӨO!CƎ%0`!C0`!C.0p^ȓ+_\F0`O8|hǁ8vӣCF2A߆B|0BMXȞ0.dC%>FH#B9bȨ(22!#:ZY&Mm AZHK+yp@1ʸa(9 B$ʑ(Hܒh2p`m[;d؁ Cv/!;vD};cȑˈQ /)bXQ4;v̀>vȈCF!p!CF- $L P2sѥO^uZᅖ&uߣ=Mbĸ1b9}K@"~(h`[ b@B )㢌&\2n={q*10fҬYs ;`'Bq( 622TJ[d`rCǍ=5@~rv-ܸrCF2r!#F ЇH=t 'Sl2̚/#=n#G#|\I!#F %q`#:Z`w/1bd?1V`֕ VpuBMQ#9Å˞=M۳GIɡ39rBP@3fFP0׷? ;dĈPFc`]9b8|%+Z1ƍ3>!#F $KƈϳYȈ*4b1<{ T'P1T La1ː;F=tEҵ% F\D :l`; ;0|#78~<2bĐqCI1h̀=ܻ{ 5t8Cƍ2bϞʈC 8Reg_~!G%pAA݋&F Dh5NBCF7laCF2b!#F 6p`"Cn+w.ݺvhSCF7(c4 b NC0CF2zlc3>!Q02G/R![mˈ ȐGߟ 0X  &2.}zt2d؀}6Tc| 1b1bȈG"f2_%\!C!+V`CMKXB\cG;dĈq6dĈ!CF2dĈ!BdgO?:hP@j!#F7njUUe _z DYzPVZ0Q tYeH|z<u>ACKLhݕ 0f1Fg34;v̀-mܻCF 2dĈ!F4b#6EeĈ#F(A NVPas'S-bf #8pY}{>vȈCF 6jȈCFcĐQ2h̀Ç#JH12bĐ# cI2Iv˗-0K>/1rT2F"_9 #qHVo1J!#Fuƍ##F /]򲅖K`[6nܰ. xaի&ĐA2b(Ѧ_x  %JJ=F^Q *P5 0b˞c1d-߿oȈ ȓ+_μЛϠzu1ǐ1dӟ?#G^јO"E GA ZtTáCeSG 1\$%FYQdI5bĨK1ah#2tg Ac UBg^xV(@[TJ&=bӡ}0ޝ;1by0f(Ѿ e!#}cWB /rĈ ,~c\n蠂m3c3#Ȑ"?ڐ#*Uʐ%L2bЬY:w'Р>gԈC J2m4F v*֬Wp!B,,0ƒ Vz6AIAlKUK!G˃G =(册2zбŋ'_b`af6nܰ3 aeڵeȈ!v:HcXfO}}ŨAAF,ڷk!DF2nag舡5dĈ!CF 2ʈP1d 0fбA  V8 ͖+Y+U/nhB36fsTP+n#1dCF @jȈ#G ɲfƌ;0 c 3`1cǎ0`hSCF2ʈo=dĈ!q =)&3a&M =*(K9i[ujիS!D1d԰a1d԰a1dbC 3`4wztөW>F !>pؐ#c0/#Fz2bĐ `b '_0H"0 a嘣XA`,,,2r)d130p #G1bȐ# 8p#F]1tHYd4P;dܰFlb85ԩ=ʈUV1G38|sh Lb1e 1zYF| 1dĈ!6nĈq6nĈqBd#ѤK>:!7bÆ1dȈ[n1zǐ#>`?NG0`8b%bp`IeFdqGBH=dĸ/#F 6ph#KQH Rб"Ald ĉ8pq@`#ȑ2LDi22\ƀ kE`Đ2˖1bCi 0>1dĈ!6nĈq6nĈqBdC\uśW!:ba1dȈC1ː# !3pyƎ3`b0;[C Ⴆʪt!CL!c#Dz䈑\F 4lب!#F hlC<6l̀Ɛ6~CF2Lj!>Fr!PF2b 0[M-p уǐqC1dR*`Ɓm6dȰc7 8`!M2Lj!YĈ.G2bĐ]F2d!c|"FB ^EH#H8p2b$pa !FqCF5fиcGAG'QPe /eĐCF2hgO=JBG:fHO.RKI YjNs1B$ױg׾{w߹Ϩ|y2bW/} 1dĈ!0׏ c*3IO!C⤈ƌ]q(رKR1B2RX2b#ǞYW1JPtȈi =1g"1W'<ȀfnNhc6=H䆎S܀Ĺp 0 <ǎ#XF1dHr3`h̹ϠC|1dаqr噫1bИDK4f)PB'V#FA=R%J F̙#H1d@i10\qI8`ܴ#4nĐqC2영"E8QuP.Шˉ+_V3#F 2bqC2ܺ!F+.Md5d 0pd9bĐ!#b?~Cr0,_ƜYfΝ=oA#hңe@ZcȈC0l߾D"@Db`(:4Fr='#F A9!CDDHbH1Bԕ 0?##0&J4nH0F Z4]XRdX 5@hն|^dHr 1^ԤI1h2>#ѢDe 42b@ZcVbͪu+׮ZgԈ!vl 2bMCF1Ĉ! v1b8d%ې(=8\dr'N|Y1bȈ!G2NH݃(vȈ1]2cg oȈ ѧW}{Ϡ!C5dĈ! cĐA0F41bȸ1H a̰A1hǏu8Q&R_KOQbĐQ#L2bĐ!#Q9| 蓑(Q`[2b+ld˄FGoqL"f8)$1f|cH m! ĈABnȈ!-i` ?`^ckذQCF2jذQCF2jءC0+_μУ;C8lȈCc|y2ba{@tĘOPA`߯Q 1b0I'`*ȵ+GYlaCF2b!#F6p#F(rYs;p DG @e<hG"Qb "'A`l Rĉ"A`A g$F &6(v#F t Bid4>vȈ 8l܈ 8l܈>1iԩUfkCt &1bȈ; 2b !x :` 2n`zZp*2bĐ᧌'ɐ*ɵ+G7la#1dȈC1d!& 1t"2b㣍1F A  Ea?e,3H"A` $B|#F6p!(F;~XB1bȰ,Z;dĈq6nĈq6nĈqBd0Ċ3n1Jb8c1Ȉ!31dCƍth ca# :j7%zȈ߀<_{ן`RS1d԰a1d/# 6ԐEWaƎ1v1QIV)#G E8)F n@ #0 *0DZٰQCF2jذQCP9h LbFR>vȈCF 6jȈCF 6jȈCF ;tȠ1FZkٶun\3jĈ 4{Đp1bȨ ŋqcF1dİL ͛,"C'HB˟/_Tr1bȰ}w9d XN0cG;ppDG 2n1b"A #/_9)R$ 8@p% A r?20 #F aa#6A`Xc1d2ȑ2nȈ ,[| 3̙4cj#g4L TDcȈC-0:} T g֭a"4Mj`u*TM1ڭ+#o{e89̉0vĈmjYЍ=$+E|ul՜4!0 )‰ݒH-%ĉ<)nnx8`XCFܷː#x2b?_ۻ?Ԉ? 1(C` 1dĈ!  >EI 1$Q#FM EM#vȈYs eCh1L1j֭][l3j[n޽}C8`G qȈ#(OxG(Ш"#F  .\.x!#F41dǟ_1dQ*qc0:TCF DS2&s 3WQscKI6o̩sgMC`CF1d Mt)Nk̀!u*ժVbͪ1#6lԐ#F.6lԐ# !?`;cǎ0|ٱH85$91prV.]RCFLdF#6lԐ#1d##`DZ#F0P  1bԈFmd $o ߇1ƈ!#  PPk̀1bE1fԸ1@Ɛ!#F6pr#Fpr#F;|йӆ 6` PTi^CJ(Dv$U!vzXFF2dĈ!CF2laCF2d#1bȠ01d쀱1-6tĈ A @$ 1x94E蕱Ǯ2bĖ=vm۷e!1ː 2b$yϟטzuױg׾{Jb^>lȈ,>lȈC0!C a2b(\ȲB`zȐrڛ7Ű,b$=p:##ɓ1dĈ!6ĘIsf#FrO;dQ8fԈ 0ȱH2S%"`T{&!!1Ҫ]˶۷lìAׇxeȈW_1HC8MÇk̀ǐ#KL9 %12k֬C1Bh"DHc6l̀Aƣ34p&99*˓,CU#|V5E+سǐ#6lb=H*a!c!#@+bȈC1d̔æM&LbYc A%ZQEg(ԩSQeĠJ1Wa`@=^bekD8RʑBz,S4g*DrĐ!#2+fҘI<$ː#F/. g;d3h`mǘ_xfy3i9sH!x ɕ/gܹr3`LCF2o2ďQ կg{C~ iAԩC 5!ć8lQ2h46rd.تUFSI̹H1z4Q" 1bȈ'A9b%A$}R]1jժCJr/%1w 6`ΥKĨkn]:h/`:d(l }#cȨ,f26s G.m4O1g26!Cf‡1d Ah\"ҧ5E͹H1UZ(1bȈ=7dĨË p 8Ĉ! Z$Fg_~e2x"ঈ9H#FJ+c1fL3iΰ#FN4fc1d0jTFRKyp4F3`TzkV[vlXY2TMs怑rCFJ Wh1bȐq# LnqCF^Y+i'a! ͛9q(ƍPN~Uчlx cmI1rLG2d;07~94b4wNc >vȈCFvcCFx1ט}zٷw~|g%ۜ7FHy &L!26azH$6lԐ!!6Аѣ2_P 6~x &-ؔĸ!)J1z0: .u%I"EȈѣO1Z֭\zFdì1bȨaF 1bȈ7{cQc >8Ō;~ 0Đ#wXFF #{䈲K/2άaG7aCF :#ą8sCF 3`$b#J@Ætp#F O)>=0ڻ?>4bؿOc>v# 8pؐ# cȀ(#ĉ5fQF=~RH%9j%J=x8'ך02bC'ex81bȰ1CTUC6X!# 8pA#F !8`"DoTW/0X04bFLc >vȈ 8lȈCe|C3`FZj֭][lګp;yаaōD& 6lԐ#6lpC%0aƌ 0̟7?F 7Ǐ2x}8F ;p\" `'Æ4f(q"Ŋ0fЈq#0>!#F 5lب!#F ._Œ!3F0n̩s'Ϟ> *t(ѝH*#2Bcj -z44bNMc>vȈCFom;3`.|8Ə#/njΟC.}:u?pȮ޿ǐ!#y9z %G2b/CFeĈ!O'ACHTPP BtĐ A|DЍA4AFByqeږ/aҘfM?f ?gЈ1(!0!#FSMeD15 Wcd1FW_;lY?vPm[oƍ w)Ոo 2bC 7UrP 1 CiЌCHB`=2b"fldX1e"E|f$Fq4fPϡz4bdNc 0lȈ1| cW/=k̀1~}׿ cH&1Ç3jĈ!ㆌeĈE`!d7d\y 1b0b8q!c@U)QV`bō6M8`H]-3E)//1Š1ٳ3hX˖ pΠ]3`!DF1dCÈ X\cǐ#KL˔gϠC=Z SϠc5dĈ!9`D&G%ȐA2bĐQ 1bH60!C0a 3QC!@XB>8C@zH|2f旒 Ҙ:bLc gЈc0|CF (eCF 6jȈC9cԘOA%Z:b,eSQJ1UC0 1bȈQ62df(Fldȍ1z q 8vȐh 8vȸ1lv$DF A,2#m癙"Wq;1t1o3h ^ ɕϠ>`z#&hر®\yqR$%171Ft3hİ~ ۹Ϡ|x3`!DF2طw>9dİ_c  < 1:ĉ+ZQ1:z1ȑZj8yR2z!ƒG[pH#N1z$P=҅ 80!CTZ $֭9 :hE/O/Nm$ܹ4f|#4b>c0lȈCeX9 :ըgЈ;3j۾;ݵm<80/U#r2bd2I:`AM#1ˈ 1ʗ'__~2l?} 2b(#F~#7n 1^1V]~v 1̞1Z3jĀ#iUS}# … ߐ#ۜ=lY3faȐ# @  E8I' } 11BdĈ!# խ_qCF ^x͟G_~C|/13jHCirR%-# 1dCF 6h@._°!C6o(1~ز=tnJ2 "o^b`Jc^ cfÇ:dĈ 5dĈ!CF2dĈ!:b4c1ƎC,y24b`LΞ?-zt4bNMc֮gԈ![ڶcΝǑ#9d.CF2laI J.2vȮ}53j/CFe$ pWf EE2c?38`A0fЈa 0fCF9laCF2dĈ!CFl!D!0`Ɣ9fM7q֜A#FO4f:hQG A#FS4f:uFW*#F2z,#GrȈ61dȍwY / ;dpaÇwPX Se&hQ%3d140PV54bĖ]:bĐ#F8pؐ# 1bȐ# 8|c ױg׾{wgЈ1<0ЧW}{gЈ1>0Q#Fe#R!#F  a̠aB3`4t8CG )VC 9ΠdH3`49F 1dȈCF 6hĈ(6jȈCCe# JDO8L00˜a caء#F C`uvF vui6mݤp` Lc >vCF 6jȈCF 6jȈCFk̀qujիYv 1hצ1Fn3txp1t̀q 171Ft3jİC1dÆ1nÆ1dpCFeTF ${0pS jb0 #!2d؀Ctĸ1ƍ܈RF&`pWG,[| 3&K3`CF7laF7laCF2dx TZ5֭\Π#X3`=;Flۺ} tΠ#^3`;F1dȈC 8܈C 8lȈCexZF>o@ :H LI#Kq!ݼaQcĉ!#ygHԫ[=;uC`xCF7laF7laCF2dĸ C@ D 1>1D3hQF1h̀R 1L1J3jĀ)Cf2jذQCF2jذQCF2dĈ!C1dPB$}#7EkY c 3`E !>` aЈpX`… |c ?vȈCF 6jȈCF 6jȈCk̀Zj֭] 1lߦ1n3h\p1h̀\ 1?1t3j.Cv7nCx͟H5P CI:_~ac1x<)L1B(q"Ŋu 1bȸq#&oܐr.k̀!s&͚6o̩ 1~1Ѣ3hHt)Ӧ1h̀!u 1b1׮3j+Vfʐc-[nc+CFv$ɛ($xD%†#N1{ Z5NHZ0^!#F 1nߖ!#2~ Ə#O|9ΗϠc:u3``>F޿ Ϡc={3`FeȈ 1CF!#FC1D QhFGAGn`#K֥Ks)#<)1p`g2hؘǏG"FS6dĈ!#Fժ2dкUF_lYgѦUm4bĕKc wgЈo_cИp4b$VLc ǏgԈC 1߸!sgϟs# ӧy8r$J#I@r$ 0pֽwo߷D!Z'G2*yFxĸ1]Fu1dа c1dPCF7nȐ?1j̀aH A#Ç4fHq3j10BA#ɓ4fXr :vب!#F 5lب!#F @ƈ! \rĈ! 5KbFУK سϠw3`?D !>p# 8p# 1bȐ#F6pr#F@pr#F@p% .b0 G!Cڐ! )U"#'GR*&:%"8`q QN DG2ba7bĸa7bĐa!2t Q]yW 11a3h`c1h̀Q 14o1gCt 1bȰ 1dϦ-6dĈ!Æ6dĈ!# !x5L &a`L^ݺu2d؀wK Rsa"ǐ!G Ɩ60߿C@;p(h :bĐ#F8ظ# 8p# 8|c*Wl%̘.gЈa&0vA#РBAcJgЈ)0R#!h*ƙ34b-k!Bhc!:bЍ1F1b# 0.l 6fhq"V$QL8p 0T|&ƖFE`nzƎCp 0vØaC1baF 1bȨaF 1bȨac4f;Ǔ//~Ә=4bЯo>4f 11FB3jp(HF 1dTcFet 1Hq2FJ1tfL3i RI 0p]tJ-1b4JSNŁFV["#F cɖqCFZ7dĈQc sֵ{o^wgЈ00A#Fbŋ7Ac ɓgЈq308wEF2lqF1rѣ 4hСDJd%5jհd%5j% 0W~{vA< ,peɗFTƍ 0׷}2bĐ0@2d8P #ĉ+Z14bxHc$gЈ2ʕ,cИ#4bؼIc<cˁv(iBĈءÆ;eQ#R\5rHRRrv(T->JQqt ޽|w %AǏ>`8~ 9ɎmȈCcȐ#th!r$I1N!#˖2dĈ)S6oȩs>}֘c(ѢF"Mt)4b@*u*ժV^1׮3jĈ!ㆌfϞqC۶n•qㆌv+ ~޸!c0†#Nx17d@|ㆌʖ/c ?-z4ҦGϠc5֮_Î-[60nAC @ȈC1dȈCF @jȈC1dȈCF 6jȈCF @jȈCF 6jȈC1bȨH 1ƐQ2bĐ!#F !F# 1bC1d԰a1dT#@Ԑ#Q@p# 1b:TF 5fPiSOFtWfպkW^ì12vF2dĈ!CF7laF2dĈ!CF7lF7F7aF2dĈ!CF7lF7aF2d-71d c$\F 2dĈq6nĈ!CF2dĈq@nĈq6rĈ!CF 2㏱?FaH*<8CG#JHE:fqȍB~!#ɓ(ec0cʔÇ2bĐaÇ2bĐaÇ2b(]T>lȈC >vȈׯ`Ê+c;dX˶>|ؐ# >|߿cИÈ+^̸:bHL˘3g1CnĐQcSFC1b˞[!:b莡C1!Dȓ+GC1!Dسkνw:u#:Ә0$XA ˜A#C%NXѢE3`l8F 2d YI)ee 1eĠCM1tSO1ƐQTF I.eԩSQeĠZ*UYeCaŎ%+ iծe[qA]y۷0a:h`1c7nQ4tQs :tШQ :h`5k:tШQ :h7oZqA8ɕ/g<9 :hԨAz kСF 5h1y`o ϧ_}q?,h „!3Pa"ƋC6#ȏC(irȐ*W2%̘1 a!3v383-j(Ch!CfP:dȌZn10ƒ-k,ڴjײm-ܸrҭk.޼z/.l0Ċ3n1Ȓ'Sl2̚7s3ТG.m4JWn5زgӮm6ܺw7‡/n8ʗ3o9ҧSn:ڷs;Ǔ/oJ3?,h`4hԘ!Ĉ'RX 7r+"$%Mа!ǝ;I[נAƌٴkА;ݼ{MƌkА<6cF%2[^=ӌS접!CɏJdؠ"daCI9$s"ĆmdhG D'h!CD 2R$3LACJ-]s%3lެAF=}֠!CPEE*FM֠!CTR .hV,X5;f C MАa0w,D7MIGIBxXL]!K(2<8q#2dZ#RTՇ[2AdM ڵkА[n޽}M kРQcr5hȀ]tխCQcv5h^<05# ݻ 2˰aC !*(O2lA"D6xȃG- ID?F9"G <d%Ad GԪ@z "c'O5f ZF"MtiQ5f@Z3bAC׮6+v,ٲ4ؐv-3­ACݺ2xAc$ /v!c0ƒmF 2dذ!c h' 6"chNxH$֭WZ!#;w e 2+P`eȈ.F֯נ!c;wHh/~# سӨ14hA| 2ҫe˟iԘ 4d $ċ5FlؐP?ؐQQIMlȐa#S'L&jxO*!Ć 6d8҄9BdDQdRDM9Q >P P LVadeK qkАQ.,3,4d &L ĉkРQcc5hȠ\F5oyF 2DQci5h`%4d̦mJJdȰqDΏMd nj l`Ǐ&P`C ( eȰ!)#2&RQcƌ5hF"G,irF 2VQc̘5hШ1&4dIƌB-: JҨ1)4dPj 72rA$2dcGN2x#G$2lҥ 2d#!2l!0b44$d8:FX!6n5f]iԘa8gԠ!9t5fP^3sAC4j(o<3jА=3ӯAC! BsĆ mscC $4hrQF;{bÆ6d4)Æ !Na2hʸP:j#F(#Ad4 2VQcFV5hFcɖ5{vF 2ضQcF\5hШ1o4dK 6< 1r4dT|3fH̙FFhѣe@Byؐ!#Q8CFnݻeqĆ Bq\FQQLj;ӍsLAL4e0Fנ!~|5fԷ5hP@5f 5fd^ iԘ1|ygԠ!}{5fė_ 80e(Í qd舍FdÆ A 2l!/IB9cCaĉeШ14dLL ̙5o< EӨ14hԘu 2dϦQcmܹuQ iԘQx 2/_N )2˰aCu2l#2dp$ 6&ِ^66ېQ~_e˄(h1=t/{ C2x$"ubFe֠!CZ5fW5hF}֠A …kАX1&5?Yr&Hd\L ΝkАZ45Qz3Eq<G޽%N<@<ʚ2A@YCz(ȰaCvAAL2{֓'"#C|44?ȇNhd!P 3"ACÆHԈ(q"Ŋ5 q#3>AF&O֠!c%KHh)s&MHlȩF>֠!c(Q(kz a@wQ>4QȚ5 8q%J#yH6J2eĉc(QȫWF6" $4z2hϯ$9nT iԘ1z 2g׾{wiԘ1| 4jP Ǘ?~4jп eVXPȐeM^?~' AG 2ңG 6ԢG 2bqd͈ iz&?ta |41#ɿ}RÆ28 TdO:Bm̘c722ҪQc۷5hȘKݻxΥQc߿5hШ1Hd(^̸ǐ#14dh %N52Bˀ?x&i]F (qNDEXEqF!#MA&:\Af[?ꕆqBnjjcƏ"{? 5f $X .d!B$5fLX34nDG!E$Y#3TACKPDY#æ >qzūX(iȐ$M(=zT O(Qפ$H8=z)EWAY%Jk@FUJ,P.J$ %Ǎ"~ H_*9Q234oDgСE&]33TAFeנ!mܹumFנ!q(q "Í! zL'M<{{wFʼnRG5PdY= d/'J(Qz @2lE7y{dĆ2ʛ7Tc5hxƐנ!#~Yf8C@ D`4̀QD-^ i RdC2L44lJ ɀа5m3$CNCf:̐ E Ti72>5TcT'M]֠!CXYfEVZmݺBFuśW^|kАX03 ACb4j̀ -Ө1C4d|m ҥkАZ53\BCl4j }Ө1C4dGN ͝?]5h iRCvݽ>|$2̟7BzbC41E|ш9sh"Ph!,+(RFș3EEs% yHSҥ.e:"#dcq$HԸ$TǏ34d MINB*u*UM@Bc+׮^ +V,2΢%Cb}Ш&8qָ/AD qpf0awq t@C֬eݚ2P@¥J $F Ar$T"UJMD("ˆ#B9a $GD+ƈm !}:֯cϞ ޿/~Q,JQƉG(= PGC %M+XSӪM<2dbC (=!e_0񁣍 2)"KFOB eDFQG&UiSOFJ(qҔ L֤#JYB G4iDCң/TzD& i$ _h(+m%c _*52``F*kwxнwo߿>xqǁCeM2#M izD҃zD#M eD҃*x@YՏ)DF4{DՏ ! *Ch Ɏ;ȃ#DIZȌdqJ&u?b]"1|'֚5qz wUKЯ6I$ X>r 'O#DǍ$h^YH1ө.\V$YzIAV (b̘!E**\ TAcFP+VͪGFJ)mЈ51w 2_#L_)##H(t*# oȐAI[+ ez βeN.(Eqǚ2P(G]8᳦Gb]}!$(QzT !tM$2) 7nx-"8~ PB )t$m$&OćI=I9r9&P6Ip(%:bc!2Г/vPACJw=z "F4^z R4PY#*^dPDN%4(2#L+Ţ!LQz$  4Qz*SfM(QzC_(=z "8QzC (kzJ >*&N=֤d Y_:m( 91՗-7V)Í/BBa,H'R.9Z -uhmڤǖ-D* 9tȁȍ$t.̘Y5KS5Qj(Q#3\9rDz6d@#N#$GdL5PD TrEH3,^$V,J2IG 2?xG=ˬӃ׏GdcMxX爌 iz\QF :z<Ǐ>|hCA *@nhcǏIphb2ұrRYyTcƌDȡH8l2G>Evh0Ic +m>In8ȑn̘qɠU@E pJ <ճ3V>ZA@؁㋏$mِGS@ؐ\ذ!% InQ>ذA'E$ tH)TȈ;(e#5PFq(e&N?Tc?v3dVEI=%EkxW̚QȀ [QF! 0"rFUz/_$A8r0#EJCVtŀ$8I$G$I|#EJ$7CFaR̘1!C%MQzJ]=z!Jed('. 4T#Bdt id(}22d~A?P0.^Y'J42d%JT?~',^(%J ~쪃Ή2 cDGBG3,B3t( 2iK 2`P3~,1Ê6X16 1e6 ١enj?XʰGUpɱc@84~J OݨCdˎء˕+͘ *fؑ#%\tPFI+GdȠEnj;n Ǝ9 AǗ=1a2]=VsDfȐVxC=DS!xp5qƎ TN5Qz "#MQz{BǞ~zDz5kQKQKBba%Dc<#F!E'QE>j?\Ev2d %UWѡJ,q#"1+ьȐaÆ yC% 9Hx96KY$ N8.܌'E*gMQxQwhDz`R5Nqք}lTT*ZE i = Х8k#@Wa] zq%f)v"xY#c ͊D/7-BdGk8EDU{Ӑ,C`%?fD -SfR$ -;vhՇ 捨2㇎3g,[nt1"C11ODʔ$w($ k0)ϝ{e@gT}R'0cLѨTҤQ4Jњ4eʶjA "i( "dS (+k!AL(A4e$RzBda$ 1xȐ!JLX@0[,Ǝ@_,$8nҎ-UrC˔;qC!f8 " #бd!K !D62p"DȲ0t 9O(3f1)'C N$-2p YaQç 2NCGd*DId282"MthxgL|;AUQYyg >#hqqCR!!t ""89Rxɐ9t,^dǎ3TD #t1dKn΁& BxȐ݀q*cO,*hx@"I>R%I(| ݻML6tƆ H8a% y8+U`(xD2@^30z|C0Cu eDFGjȐFI761ӥC2dRJ،L|х 1Ipȡ $#[1qC.f3҅ .UvTy4cF/Bd Ҏ3v1cƔ9K$Fܰd )tܸpnj?(Bi8c9z FM *CnCG%BdȰ$ˏ*~buJ3fu0N20vJ&X# a9"/}ȋ3g*KP1#^+Ҕ!#(|^ AxY2 @A_A#EL dd DhmMzFxȸ-FHgL';v]1$# CJ !_:tA;<)#;8_ѣ3vpCǞ: )F$mCǀ+W,5oȐC=%J CC%TqB&+o@i  X`")2qㆠ1AG BTMRh|(cV9D)J3ʉ PzKč AxbS'=G$UN6 ɐO'D|0C-Wv$L9h{BdF-Æ BȑH>ln@r|ɐ!:f@C#qҤ!-D$Б]+9p`2d@3m6/D2!Ć FrhE"#CƝU9n`"e 3f gS\GIEpRX2R5^$ X2Pd(2Adqd!NTId,3BJΫda &!##n2mN@|i4 2#7rH'O$8rءFKn2`\'I{K"rۢ3noh1B9tA #H#a 0cAbÈ7K#1#ʌ!C;hDOgKWQo_14 Fm(20EQQdd!cDD&O8q&#F6(Lp : reSn`iQ#L:DICbQ"SfLQ5K&̘1e afrҌ34dAeƌX 4F38r#Ș={)CǗZkjGZiܙ3/?p䕦JN`-#8hԉ䄇*?!÷1<|!t:O$I"rcVcƌ.Gd8bC '2tBņ )XcƌL(Bi7pؑE W̘e$oܸ#QTqcnj?t1 JرdnjSnqf#jرd:tH.:А㏗,U`˜#6INHʈ K'nj_jʼn͏mj "/`~TQ"#H2Bd0>ƒ h3fLG NU~(34b| |0A'njfqFaM8rĆ<a\ *9n9bCJ#"L1#'mP#;\a㊕)ZC)Fɐ7n1; b,+St 2cƎ!9gC&g R%V|E3"C RM2W^ t!.@@ ;|l=U=,XCJA&'2d'$S8C fJW:b=eO1hM)SCNHqtĆ eaCFj!`ܸJ#1CG/_|P9nBEC"lb -CEɀ%ZG3vt"Ԓ7,ѱcɐVtQI8Yrh !C4xÅ RF.vؐ'A8̌ )AĊէ쫅Z 4 61"DRk!H*6dXU=>3 'LD [x #U}ȸ7 }# @_fB$m`2h/AXpXqfɎ]89Ȗ-@0$G%7%;vqЙ%{aE0)$2;nÆ #vCrL#8q9%G.`1c`䉏$E 4hI .]⸱c/BdE$8rn츑Ƞt}1cG"CzcHG3~HiLUmPcΛf Br'>`" X9搎X8K#:Blde5hHƍЪS)4hHqtD2x܁Ǘ={1I=hd !U֭0" ޿aCJ 8aBdH72Fsq#9 'jjA2J"9 Q9dI*Y@UUm$!?40 2P'9{Cg7Qr劚. 1`(iR-jRT3BCF_6drG]6Aɥ.RlȐ<9AL8t8r(⅊Yjqr)WH '60W8 ?;j 9n$ 9n!#1x{ :vG'/8nqC:q*{,7t)c9Tٱ㒒>֬AE1P:`0BG 9"#FB%ɡ6pKÔ c/ a5#KY\ 52Adxeի5hUM9fh"Ć WfPcC۷c1a#Ǐ70Dnj?r9*XrF!P%K4np1cF_X1cFL1cFL|c'Lr,51ѣ?f(ClS .Tlؠ2dƌ,drcS<q $\9f̐`Ċ !(!)2Ud ;alG#,;fP#3f g3Db9YT6d|3lK5 ɠ)#H8ݰ͕ ojrE <:Ä7fȡ$9~̘qc~A^x!Ć f( 3~H-7f䉤-Sf'tlؐ9fq#Ǎ3DϸhǏgB)62ES6 1#˕#B<9FqFaLX1؏Bt0%w57P 3\4¢cJ0pA :@n -1RƑJ#I?qcǎ3vnj;I%ܘ*^A%Tp#Æ 6Hh1BCր8СK hT0%Iչ 8p%GFW 9 c$+7AȀ2=d)A>l" m0(L C"$Xɒ7rSL7ӧA8fܑ#3cg^xƍ 6ظ*#k#1s#1!"GBP1ɠA>p o#1wI]̘DȓHx cĈFhXH%r&$'2J61=_C"u D3Fde/9tQ'"&Lac|COnh>p!z&Hć 7nRĊYTxCG,V ꨢJ:`3fL1d3<Ё$6dD2\`c 50%%rċ3xNE%KrrƝY>`A.:I҉ DČc%E 3K:~rLK3^c &u (ǣT4c?^4v޲0WА!]F%^8ճa '9r\!͛&ML!ƙlȈOf<2d9N3QAcdc.Ll/ڐF'1c 0Al(a Б!8D =dd!6lp&ʡ":(q9p\" 0"Dpܘ1H68pPa )SpHa㊕3rP!C!7n1ʙ3Y~̐OҭO|ءGC<ٰqʌ)C 9Fk%U4!?ԓ!Í?!M?L!#!]ؐ!#>Pd -:fQ$ s0 Llx#K2l!y5䑥8ȐJ%pH/8J3r\投3\a#C7n1"Er[ѧgȒ1cC0uʌC<ِq?ؐ!F?ԓ!F?!Í?J!H!C0%CF P8nR\ԼAb-Р4aAbCߝRT;0Nd@I <ǘ)(^ICFO2ʠrc 9nDG )b7,:@1vUK4&>TǗ/mڄ䒎3ttre3t rKIoCGO|qA8~̘C!]\i2d Jl`ۖ654d̕AINndQ2dxӤ+62d ucRdLAW/@y "ϜqOB =!<)0J#2t-Æ 66d '">js( uX!D+VrܨhQ8}'8r(iF+Y 1e2fҬi 6daÍBmaH $vqFMI2dU|u|j%ICqL w`e!hkz@"/2x9F'>$Mx!H,Tdp! ?" ‘ [֢s[Ȗ$"uać'Ÿ0%uȡc)7r1eƌ)7oϑcNU+/8r$Ǎ9naǒ3ؐ  48І  $#)3v8㇁ 2SgH&)r3tJƇ9>p4DLj2IO C q)R'0!* [<`9cy$ңQ ȑƖ:OnzBd˖:>beI:D|.,&>1cƔCqy 9n2Eˍ9nȁŌ#N@2 Rs C7L$Bd7~8 ˙7w.Æ ӥq6e;v! =cǍ-@IAO0AG3X|0!ƍ9,$K9lqZL7ر !21?tXD`7r丱CG$2;~l@dXfF͜5`F옱cnjVH9"C<ءC9pQCCʪ/ՠ0Rd  ʬ'@fX>#KH(!1tԀD)rbD~7HO$1^J] ~7v((?j:vȖ%P2dǎ!r\cǎv55d3fP#C 7WdٱC;tTѱC5j4gCXem`HZMАW\l\iL^$MC3Wd1΍)3fH)2x@z ;f̰E.UAd ֭/)K%cƣ!Cn1Cǐ*;4A"M6oy3ӏJd *Æ 24!LGԄ1G6EvCÆ ?Τ8rܸG>b#+:nlF;nX@: (A@-;&aƎ:H0r!,IRʔ*WTyAhX!eH;n PU􇇌 `8fܨdɍv'ѩSؐa 'b|a L|0Cdž`p#_G0уFĉAć"8PƁ&>pp%  7n# D|HC_rƒ!Kv/[6<17رeذ (oL HAIǎSPaCʐ3t gC\lQ| x  dCXrË)Tr츱dnj:J\!爌1IBCXZ0ё[9` ܈'xؠN#1hl ĎeQ#YYfT$#y2ƆDOc 8 XΔ3 qcʌ~d$6ȁ# :p|!UvR!U.q#ǐ7nADUD%Yv!{,>|0-~h.| @2#HΝ۰!c:Liɒ!Ct" ;7vȑcɒohȔ)~/* ;Q%;$E̵Qq pv<1"02P B .TlPqŀɐ<2e20(a^mp`rc : A冖@0˷䆎XDucȐN#-eȎ)on>"S{!7T7^ #Ć 2Ȝvʉ!6dןN=l [nH8H" @p1"E$ɱc:X .ʶ2db'ǎ?t( 8UJe$PJ*Ն Xj HWP @r1.H(3$]L,yoݘ !2daK_|p2dȒ70*U$&[f-Z Dύ.GdȖmcxdۆW~%ɡJ/O|Q$О@II(C7r)G+:xta:~Xڑ-WF2۠2d7rБ'LH' 2$NXEtǏ9n !F#6(qFB X y4CN*2e5HdX֬S#I!7"[fl:c Z>rrdC.]b#C99h#î fWPTqcx6Eǡ"9tANRIH;vȑF.J2]1cAA98Ad8  7!:_Ā1cGeȔ ٵ`Fwŏq'ÄCVvhGL^PsOG\1c"I|1cƎ!bFµcƌ!jȐa#"Eh#',7F";flCL$?~\!C9U!cӖ3~(aTa†A@KϘ <Q9!B ,RpCǏ?r$6$BG3~1lCǎyx1*-c bQcm4 Wp gӮM68r1@H1g4drnjE:nj;mʌ;P!9h#CFF7na";f`kzXIFB%3f4 ]!c3!R2<9#2t˅ʏ3n$6$!„ Cu؁ TrС :||56G1cƏU0#?t` &бC &j :dѡ#E1cF+6d\aÆ mؐ2$7nl@iCJ-Y0 @pĉ#ǍE|'aM !Kn(r̐!7t踑#Ǚ"9rdD (}h$91өE ?DcDbƋ#"VtRi3j/>ܸćEr[1!G@|m)]nL1+9p\/njg^xm!Cz՗p0ZnHC? 9naŊZ:#]n" "9 YDC`9cG;ad3K;v9&NphuϞHjC f^zE2BaCF>HRʍ[ „ 8 bNJՠ'L|Aȍ@$)R$ǐ%;vlYԍ-8r؂cг^PxQ+ -;.qcɐ;fB刌ҦONzi &|8cǎEȭF+Vt0 Hbaڂ ,X`ɡc!C`_2dɎ:H!7BIn*rW"9n,rH7I"2mУ 3\p)bnj9 YReǎGLE 2TJ2h^3=Nd- (2lJV\H !c$cG"O|(BJH*tr:&aF38p$9deG?CCO 9pIUW;1cƏ@prc)9pFɓ2h4iBCK44!͛8qaÇ4y#!;4"-IBcDU68W:fQȐ%;f0e 96dȕHxobJ #fp2"a2!LUFC˘e3~aBdK%nAfK" ByKZ-3)TN*6lPIM+3,5*@x3fГȉ5VtTl3~ђw5F PG2dh2$Xt)b6ڱ#<ܸ2D$/+E1CG"CQ-D 9ғ Wj#2dUQ:Aƪ#j!UdȰ!D#p!ƌ9|q|!Zd R0AȎ@-D Tʌ]N ߎ*NAa#3v nj9|Ò*gp% "J~hbC M~P"sѡj2z"VΌC!:IqD .t`ߞ=dvJ9vR!K _5# =2\SeǒtxȰ%#2F҉5R#CRȰAǞYZ;rq%%T Cd 1tx-9HD)R#I:t '/^a3vqCJ9pѲL+R1dJАaY&Mh,ÆТG@Ï?r2 >X)r%H"7adDF<`h#˗K"B9vLђ-/m$i-V #I8G7 <Є1 5gt2$ :v81+Z1#E@2:z(G>#G"9na"Vr`DΝp|C7npy#C#^nLC t,Ǝ%^X`ƒmؐXG$"9Ch2؜!CewqRb9HQǍ8P"gȎ7p<ʏ;F$*sSˍݽw#x𐑞 Zn$#Dpȑ"D|3f$9rɑ&Ν"D"qC刌&mx2cƏ;n1ďjȩs'Ϟq #<Dk`phђD R|Cnj@0! R(RDnj7pHU SsdȎ:pC2ΣaC͍);~1cǍC ߆8`J~P"aC2`CIذ!% 8r1c$BTĆ 62  2ș1-=I1u ]S\aʐ7n1UG!Kfф 6d )3Ц6G!F$r#6$3r` 6$R3t! #lBG3t$D_8rD/9vcƌ7LYĆ Ǒ'Wܸ?Ȑ>}z2R.͘ Iذ!% 7f1 hbC MvF lrv:cH,@n"KM 7n1c7nh1C.EAdب'@fȜ9ʀL1 Ϧ9fVI#I')RX#V$:p#Ǎ9p#*rC K\T3F2lHiDK:v踡cǎ7vLņǐ#KL1 %JhYF Dɱ㇎"80#$@brϕ#2d Q҄2" B"1C2dQsf ,|a [nQeɍZvMyTdO2Ali;f?V蠤#'DIҦM8LQ""E  8D$F!)ܰǏ!R "M$]tX2$7n,YƎKSQN`ń68(+$> Zcl`֭ BQ,"u$!#ï ](;h䆎,C0 E.K|A <>aK ԩq@R;I6Iܸ@p M$DHy @pɡcUC>d O5gfr#6d?@,hP&|(GC+R$Ǎ@22F,iM_y2FL6$8hF!B(zcɐ!@h "uB*V*k:[IK9G7rԑICEp!#I"Vv츑㰎)SfСJ@!21v1c >|ั㴖I 9b gӮmm &|U$I*BX7nh"H4NȨn:v<^C QCK80ƒYR#.jD`DŽ0xЉ&!rmP }Iƍ8|,*G8X(RĊUܰc+:t,Yr#G#)6d-zˍ);4჉ 7 '2*lXcɖ-ńKH\E$G#2p p^D 29nhq#ǐ%vرdHh;f\0˞@8n  ٳy!E -HCIpaQmr (bEۭrEI*;v BJ:2%2xrəSv  1>hŋ5sx(Æ +Z1#F4cQ冖-8raIV34kڼ&'Bx!# WЪǍ3fX2dȒ3fX2dȒ3>ZR$3vDڵh:m2c&-26IbCƝ@9n 71c:v b+3f bÆ72G&2t:SR;fXbÆ"Svc#Bd?<̏;'QSJnDˌ:pxO2 Bؐ#rf 3dȐ%;fرdȐ%?f̸3,ʉ t2c+>nu[e +mHBņ GBdž%9nj:vB+VfBņ%9n0yCG%Gl²cƌCnrLfX5F\uśo1>bJ-[1 @pYdʕ-GA 2c ׮]sc %;v*Upزv O"8H$m$939#ǍK>CǍKցֳmpDzBȒo,ɽd?~\!c8Ə#Oܔ_IrX2d7r)2dEd!~7x#G!K$7 xŠ .EVAJA`"[LPY%.ܸ6IrВUnƍ7v̘1EG7v̘1e V£Ȗ_.2D ;.]!m[oʰF]w޽;v̘c:ȡJ31re20gּ9C@J&ʌ DGZQȐ%ZpXF!'PZZFsX :@pdϱ9n7ÊZ7r両| p-,9nqcK 1GdhȱGHIIв1˗3~cF%Fxɳ#NxJQh8|0UIHK1dɍg<hg0I*$Iˌxw+Q:@HB8 DŽ:,qC*CTƍ%Knҍ:|enj)Kܘ=Vt̘1 Fȓ+_μs5hȘN GD#F$I"F .@pG.Et" rܸㆎGHK*d2)@$IG 8Hs  \BI# 9t1 ~PeǍK=?t< p 3V冟+Wda%9 +P;/4daf2Νk( y/Hd &L&T%4dLAC24e8|0!D jpp#C #^r2 T츑CǏܸD tC0رH$9(s[H 8”)UذAeȎCv̘ !@n̘AiV^rh㆖)$<`s%ǎf !G%?~4!d&aYhҥ!h3fҬi&Μ3kO%?~4!C&?,5F?Ȩ*dZo!<رƆ 6ܘ2c!B,C˔3~2E#GTa;f0Ǎ%8H.RlF+V~] 2lȰ-%4dAI76dѤ ˑxrc 9 BDH D 0 -H\2cƔ)vСcǔ :n1eVrٲI1 Oӗ":t8yH/O ,gCn(P*KdBB\ I+Th!* DTN!zP92(T$-3ʚ=6ڵekАW 2ڽ[׆^2ʰaC`Bө?vCK 68DNt .v" 83gj8P#~؉ˎ,7̘c @r#!"S̚rXZխ\!x ^<ӢJa;v)x -@q(ÆCcC  4q+D>Zf|#K %MDY#ˏ-]֠!CL5mެ)4F|qM'2"Ć F CF#F]Ś5 F Cˎ);nX"uܸ̱⾥) 1) @A6=PA!imaҎx c)(2d)P!i4n߾(@qi#` ͳ(]ti(2C4d|^x͟G^x$vnqcɒDp)BH\0q$L3yb 3f쨃bC`|` "Cȁ(pg 2dp@ܭ6:ff] رm Q62tQco5 ^qɍ#iRsѥO^z$2oG"gǔ)Zn,C,l!ZD$G 8 bE y3fLL7vhBkeB&DF!˦qLH˖(l44*cٲI2fp*J3vACРH(j JҨ1)dPj*֬ViԘ+ذbǒ-[ j"scǍ!C,ѡ- -sC7,cЧrF:~б L" 3ТG]„fn]زiԘav 2vQc5h(Cr6lh9t6lȨ.Fڷs;Аa.9"gȍ9v̘E$ :~̘ ul}g%SvpBϏU옱K?2dp 2]qeLF 2XtR W:L@iFP5h0zFKf!jT5fTz1W0H% CHkʠѤ sidqo^{7   WhɁCnj;nnj?rɅ RL WXdƌȰIL2xh" '2q"C8pd4wJ\ADͰ*E1|4d7O kА>3 ,¸P q YTAd8|%2*Ҩ1#ƍ;zd 2J #6 #I4udnj9|0ɵ#Jr̘ TТhdXǏ&6dȰ%6x H F 0C\2dPRetj5cIDt8 Ө1#4dXLƌ͜sbGdʌ-Ab =ٴDn5f <ċACFi4犜!9 hƎ7tЂV$) ;~XDI!;eؤmiΐ '!C>} \,Ɔ 4tp+@jvLGǎ-]֠!CLYfę =iԘT'r)Q>N')@U+ %JhK e͞EVڵ5hȀ׈-ZnX;\XǍl}z6ȅ :qCo1CG#2<aÆ 2l8Dd@n>D c$Cn!!bE -@p1C4dX={iP+~qcy+:~̘1E 5FxȮ};wh*)#(O"E!#ǏX m !2 FQcFEShW9m |CM'2PT2%3`ƬACFM7qԹ&3ACFQH,ٱdgP#8=U?~踱dɍ:f2Ndĕ+6dիB!' *gCFBSO$cFg5h=ti2hԘ.ENđ#wMFǑ@"ysϡGIױנ!{w$Lٱ.xɱc'>CǏ:_Ǝ*/)d*|Ӥ#FD@?<Q -4Lc =P-Dܘ24dɳO4jJtɁ@)vp`䤪&J ʵ 5f[hӪ]˶Y$5fȝ[xD7e_c\ݺ!"Ǐ*7r1c!7v 񂄇#BdMɏMd^ "iȘM[ɏ@ ȭ[GN l24dHNu4jνF!v؂ <QJ\~TQ"2hԘ 4d $XA Ҩ14dL$–)34h*;(3~,Ǝ3v,Ѣe'2tSɏJd %JMqx`ʰGҗk!gd!#|5fؿ_xcƌ_>#C 22D$W24Clܰ!$-Ć 6IN<ɨE! *Cvcƌ:tRUV]bACXe͞-%2Ҩ1C4dK }<  Ө1C4d<$֍:r $9l8f5AC4jHz53jА!{63nACF:`Eڞ!vH~ 9p2ƍT92b$F CȤ DZ(nhQc(~@#` c@E A *d,(od!2$X6dȠQcC5hȠXF5nqF 2DQcI5h`҉AԴdǮ-< È4O5fT)uĆ) x,@0` U~޼0ͤ7M1A2d4,(W@ RLŽ-vŏ-$1?~QY @H @jH*W`5kJАQmܹsӨ14d 'N ɕ/g> ѥӨ14dlNK5B&1x4c 00; C0P6ظ9rč#GܸWb e8 8H [б)Bda-Sn&DTS*C(MVXe͞EVX5f[ uiԘW^}gԠ!C`5fF\ ƍAǓ'L $!Ma *T;rH4 G>D66d@H>h2L@0a%Ii… 6l !#C ݿ ǟ_4j!p` 2"QcÆBQiԘqc 2>t@pa$IZ3 &r4ƕ.]ԼaBKJA`#=/r2A`#CF/]0`eהU$ p:`;W0fÆvmԃLkPJ @2QRc2?6 hx h( F模!c JА!{6m4(!c73~AC4jH|93jА!}:3cACyT1cz65ǐ9:ː\ǥ7Gys Ȱ1 ɰ "02eD!Ɖ \ȡ  !fM6!GXҁm stX`1260 f9vH0@FM9vH0@ 07tx!C&?~(1nݹJvP"/3ACFa4Pqc3А1230gACFgFH1bcO4s6c<42Ҁ7G(eidibɒ"ܘ2CX P$#MP BJ$CF` a \Aa)y0C21c~ ad1c1cl41 2l4C8sG&@iԘAh 2*eӧPJXiԘk 2Š eǎ,)3!\3XiTM8!9r$.@0 1jeHk0@-A tpC0`[EĆ < A1 ` ׫gc<@ɨ_ cld41clHFB 6tH kАqcF9vH #kАq%J$}T3 7oxI*͚љĉ7o 1jTȑ<bF &E [tqCˍ>>Æ ɱZaNxȐq,RlȰaC׮^ڰ!c,ٲemؐv-۶nUkÆv֥Qc߾Y,x0†Ve5hȈ,YInyC#yq!C053S*1rĆI,8+ oqcɒ@QZj)r"DB 9bJgr/~<ϣO~}yyؠQc?ȯ?8`3&ACFC2l9r0as# QJ91:r $l0U9prㆎ%Kn("zv-!NР"Ć#RQ _;lYgѦ;&#4j̐;n]w[ e:206G %S3z}ԇ!BLE'"mYS "(%|=@= 0` paB 6<@pE  #I 0y%+3iyS@N;)hPpQ4u jTz[vlح 0{vusֵ{;$H ɓ)|Y9 4ѣ6}@jXv vli@@nxM`@ pyr˙7?~A 0 @v|x{'0 @zp^@$h$P @@ @*Z@@ȑ <{ҥJ 5Z5֭U 68vlۺ} 7\ w|H  (@ 2X`X`,0`` @0@ x.t~]ܷ  ?>+  ?@@ $`@ Q"\L  0 L  =@ @ @ ֭Ve @ZܾuK`@u(W^}ͫ`@… 0 bYdʕ-C&0 fZh (`@  0 0  @ @^ܿ @"L B@/ `#ǎ? &O `%˖.X`X`X`X`X` WW`0#>L`@Ǝ y2ʖ/cL`@Ξ 0 Hz5֮_&0 ȭ{7 |9@ @@ @@H @  8$T! bE1fHA @`@'`Ɣ9&I`@?0hQGPT@SO jUd*@_0Ц @[ƅ wлW@_} qc D8~ @@DH`@(QpP `HL AA   @*R UTUU+]@EK`@mݾ`u@ X &0 bƍ?0ʕ Y<N@- ,0XР@XР@X`@Р^=ܿ ,@~ p"$0 ÆB 0 q)r&O`%˖._@͚ȩs>H@`@  H@ $H`@ HР@ HР@ HР@  aH @c Y@-:4N@-{6{7~@Ə `9s@.}:Ȯ޿ `|$W> 0zu {w? }{0~п_(@(Ç#Jd(@3I`@(S\`0c  %0 ѣH* 0P @j@``KV, ,X˶Z X@w]@@ / 0 O  4x06$0 @DctHA#I4+YfԴA8hPCpK jTk lXb0 ض%0 @\{{7&0 @brTL`@͛9w`IuvM`@ }wnݻy.P @7~yr˙/W'0 @vɗ7>ط'0 @|P =լ[~ ;jؾ=ݼ @ċ?<8=ԫ[> >ʛ?> ?@@ $0 Bq @F00 @e 3` 0Ei UTQU+~@Xe͞Ev,ܾ@u @^}  @ 4H @ʕ-S6 @8 @8 @8 @l @  @ōGn ]tݽ @x͟G/ @`@(_~ p A L80 .bxр i AN8 @^H@p@$0`(ѢF8 NBtV`+ +v,ٲf*`-  wͫw/߾w  x#^ ,yr 9 `A^` hЀA޾]` O|9@N`@(};޿׮`@ 0 />'0 0 aC!F8bE#@@@I'QT$`@7q"8@gO?G iSDZWk0``Ц-`  @P @]8@ <#(qD@˗3@Fp@iӧQV`@q@0wo߿AǑ ysD ;_@#8@`A 0>,O !"J< ŋȑ C@0ɓ(S\YA0c @`@8sɳOJH SH:X Š%0 ٳX˖p ]; @+&0 ǐ#KLr ϠC=zS Ȟ`@۸(  X|У+ h߮`@(@ҫ@O? $XA *@CXq5$I`@)%d@MsA,eJ`@QP*nWa @Aiծe۷[y _ &<ĉ $O&0 eܙE if=ر Pt& o'^q sѥONٵ '`@(޽} @T0 „hP':P"Fp8" `$ʔ*WlЬi&Μ:w@Р(jtJ)PJ`@Z+ƒ@ڴhvr.K`@`03n1Ȓ% ̚7s3h(mW#8@` `6^@‡#8@80o> `:s? P`^o?`>0xaB 6l@ pc0``H,`  @P @L8p0EP @R pAS@A (l5+@kٶunܸ {o^{ۗ 0|qbŋ7PAdT|sf͙ t6}ujիYvvl٫ x`РÉΠA7w0({v۹wPAɗ7?ٷw~|׷$@ $H` … H@+Zh@x2ȑ @ ʕ,3̙4kڼ3Ν<{\ @58P ֭\r5 d˚=l "tڥ;@| 8 >88 p ͙00 ѤKp[~ 5h 0<8<̛;=ԛ {ܻ( ˛?@ۻ= * $8  @@(PB >Q" ,H` | $ `-]s @@N=`AEETRE@,Hp@]@pXd]@@-mK`kwXx@  y$ Zj֭S#`Ɲ[w$4` (@͝?]t D Pa@@x ^z    ? p 0@0`   qQ >P`` 8(`&͚6o̩3@~N`` *Ujb P@^ @h@n w.ݺvͫw/]`8@,, ؐ"$`@40MF]z] @lƝ  @@h tխ_Ǟ}: \@zݿg_@ _~ `ABh`B 4NB.P4`8R%@p͚ȩs'O", t(F ` u*ժVb@ 0 A΢Mv-۶n]  ߾ R$@ 2HXA X ./ -AONz -`l 0h&Ui$ @U<0 @x 8/zxA A <`A @@,^$0 F ` H @@J#hlx ` `@E5j@(p@\5  0@V6@ Hp@8P @0@`‚ ` bƍ @ʕ-Snf< 8 h @-@j(HA`@(\?>[/`0",hP @` _? `` 0@` @H N`. 0``@6op>9"MzN*V: `V^+ Y ,@[,01!@K`@~AFx1C^ ?-ztN@0{7޾(P ƍ(`9!(`;/^/` 8`H1ƒ(@@@@ITeK 07o ?( `&UiSO.u@@UB0k(lYg&Hm[ B[wo_{"@   \A0tiӧQ7P`@ Ď- =  (xqǑ'W D d>A W$>׿ @  `E@,`#P ɓ(S\y<@@A*]ʴHJjjݪ;V @%`X`/0``_,p!ǐ0``@˘3_vŁ 0aA8Р<( ,8A00 ȓ'w `A  p "Hҫ_~`0 0.dX40 Ǐ (` (`  (`84Ϟ0QF 0  (*p`p С@0]y(``P,V (r4o9 ۷o ^h@@0P@0P$0PԫW { @g@@(P@<`H B*Wl fP``4@2m4 h[[W pNG=Vnz`a 0xE $0y$f̘y 0hPC(0( @@SHAv 40[@kٶu@9+A@`qbŋ#.P @d |sf͛8X$huj @}[w @@0yr4wzs$p= t]@x =)x~|;8@B~P@<` … :|1 X c:z 4)@,` 'z< СD u@/ TV ֭ `=6Z8(!ܹt  8 nb x ɒ<͜;{, `[ ٴc7H w@$  @]H A > }z/@? @DPB,H@<00  ,H@$ ,-]@@@@N TP   `   4`` 0k ,@ <Y@s ZhҥM3p`]P  p@\ ` ]v E H | @ ( @ q"E qF) Hr%˖ p@` Ϟ> ʓ"A(  0 ~ ٲ +vk; $`` 0P@0P._@A $p@` ֮Y7H@@ ~ H|98P @0`;޿+x`A8p@ (P@ @E иcGH'@@s`G 8p`@O:`(4X @W_  (m[o8p`@80 @_$ !?.P @ @A48 @k ĖM`@۷qƍ .8q@ 0}zd׾={?@ 4P0X@ Ç#A2p@ C4$\ @0@ pϟJQ$)H**X BŠKY,X+[ ``@x˷߿RP<`Ǐ 3C gB` XAc˞M{r o @XpУKk Oӫ_ (?(DPP J CA5n1@!@ `) d H @84O  ZԨI, JPl׭  [@iծem@; F 8e <gСC0``@0 @d0`` 4x@ X u8@ HP^y`@ϧ`0 02lpP p "G @) x f < (j(R8P @0 @0(PAh 0 ܸkn/`8P @h AȒ# 8P ̚7s`@(p@(p@fӮ=ۀ8 09tn4 `< @  @ @ ,@cF ` @H#C @+hH@ hP p@p@` @V[ @c-pvԭA @@`0 4vrs 4h(8``<0` ,8` Dy07N|4WO`` J0|x 0``@80 @~8p@ 0@B 1D  ƍ(X  ʕ,[\Y@4kڤ9` hH 8} 5ԩ 5kU ڵlۺ}@t( ޽{  8|X;~À X,@( @8 ~@ٴk۾{z $ a̛;=t  `A˛?>X ?,@  L4@P @\xA=~LJ\&X`B5męSN(H P$>UTUF ]<@@Xe8m7n `}@p (@bƍ @,  ZhҥM(P j֫8x -  \p \y?@իxv<0 x8  _| 8 @  p`a  q"ŊQG> @NLr%  sf ~ x0CE00  `*ժS80 `l 6`,H @Ǝ y$p@` ֮_mnȭ4 |8Ə @Ν7```@ p@`  @  @8 @8 @ HШAA`%/LaFp\ @ PiS:U@UW 5A_; Pv 0``@ P @8P @0qcnj p@p@p@p@-@m @wo߿y#P' @ ,8aױ@0ЧWLJ/@HAHA C 0p2*Xp 0p`@00 ˗0]8p`@80 h 4H*Xjݪu`@,P ȝ x ˷߿~A@X( @˘3k\@Xͺׯ @vr.P x k , @|_Ͼ @,h A .dذL(@ lG!ETpA1eΔY 'A *@A ,e@QNZj(@ׯĎԮe[p 0`] 40A&\aā  Pe̙4H i kرeώ@ݛ Pqɕ/g$8@ l  _@({

8Ō;n@*Wp@͜;{ zsJFP j~}Aٴk۾;?<̛;=sx>x 8>zx ?X @@ @-^ĘQF=^,P H @R )@T TҤ4`U@|@V-8(@<@}8p`@… FX Ydʔ80 @hҢ80  @v[ \0@r $H __ @^4 @/b̘р PL@> TAF"MԀ@*5@4`^0 ΢M{ր+ ,xp`x1ƎCl@.cάY Hzuj( @(`~ @ O|  }:u@޿@O/~ ?"0` aC!F(qdԸ# 02P 03AG&U@@UP@_-P @Yg(m[oƕ;n] лo_ 0paÇ'0A! 8P @e˗1gּY3@> @iӧQVukׯaǖ=l{ >xqǍ@0ysD>zuױg׾{&0|yѧW?ď/׿ @A XȰaHHb2jȱǏ CX@(S@pA0_(͛8sA  @*`P 0``@Xj:Šv 0px; x(^X`hY`0b@Р Q 00 УG/pA p@` 7 @o@ P PLXq #GPɒ8P @0M6 p@p@p@$8  Հ%[v `[.׀ P,fرcP8P @8P @0kخ ` mܹo @7 @8 @ѥOn@(p@(p@x(4Q }0?4 @ 2l0P 70``@00 ʔ*W`2gҔ9v`B 8p`@J&`RR:ru 0ֲmv 0p<0q `2f3ТE3`<@5زgӮm6n 7{(8ʗ(P ҥ(:p^ <!h}ӯ_@ 0hP6tbD p#8vdH#I4yPEH0pgN;ysp@K6uSTzA[vlXcɖ5x@`0po^{{w.,7vrd|9w̹@I6}vv }7]@ X@8 n@w@ɗ7~p@~P 0…80   ƍ00  ʕ,Y8p`@00  h 4 Pp @A Z 86m 7` XA;~ 9;{ـ P~ ۵  `͟/?`Ǐ p 0p 0  * H >@`A&T!"(bE1fԸcGAZd0` P2(e 00fM7q9A &UiSOFUZ@Wfպ;vlЦUmĕ;n]w(P @_p@`@pp 8p`@80 @iӧK8p`@ׯaǎ=pp='Wy 0=о{|yѧW~ė?>} ?0@ ( @( @(Ǐp@(SLi@(p@rܙӀJѣ8P @0իX @`ÊKlY۷p08 ]o @8 X@HLY ̹g8P @0׭ ` ۸sm@(p@+_Μ Nسg7 @ËO> #hЀA4h 4h A 2hЀA%N84p!E 9Td P3ϟ QI.etLZժ+ [YiծelΥK@yo &\aĉ/fܸ@%O\y @T@ `ܹuF'Aɕ/gsѥO.ٵo}ď'_`ߞ_P_@?@ . ` B . !Ĉ `"ƌ7r#Ȑ `$ʔ* @%̘2gҔ:w'РBu(Ҥ hPj*֬T +ذbǒ;jײm r-P ޼zp .l0Ċ3V0 ȑ80 ̚18p`@00  u `;7‡ʗ3`@ҥ8p`@00 3`׳o=+>~0` 0 @8 @8 @8 @8 @+YtfLygN (P ( @jԨpkV[v,Ȗ-k@ضuր P P P PT|sf͛1 thѣI 0 @j 08 @h @ݻyfp@É7~yr : p{| p>p`00 <8p :|*Z,`}Z\Ś5 e͞EVZlW80 ^}p 8p`@ƍ?y\0<Z4FMA֭[6lƝ{>`0@@tխ_Ǟ=;_ @@^8P @0@~ p`( @ q"Ŋ) `#G 9& r%˖.Y @6<~ *t(ѢF `) 4H @Vbj@(p@΢Mv-[( @w/߾~ `0a N<Ǝ  y2ʖ) @ΞNNz5֮] `6 0p`@޾>pΟC.}`/~}ϯ?00 @4X D8bE1b@@GY @I'QTY@/aƔ9ԹgO=0(&@@S:jUW"h  0lЦUm[h0%0 @_ @o>Ǒ'WysϡG}ױ P@{wO`@(}{G``A H$0 ÇH3jȱ#Iɓ" ˗0c@͛8s@`@@ JT( PPիXjZU` Y]˶۷m80  ߿}00 Ǎ00  gM ׬00 ۸m;X@ @+_μ @k'0 Ëހ PȟO_P8P @0ŋG PI% ` K1_6HsA%ZѠ`tQUYnj@(p@Ԯeր Pw `ܸ$O\2l\D.p@TfA 0 mo&0 q`ޜѥO^: = _< >_> ? ` 0l!D hر(idI f@Μ:w'@Ҥh)ԨRF-P ֬Zr P@bǒ-@jײ@ܸr@`@z(A &0ĈX@ly7 P@3ТGP hzg6ܺw7#8@8ʗ8 $8P  ;,H o?`>P  p6$0 @D)VxcF9j,`@H#I@+40 @̘ yg H 5:K jTS kVt:c pmZk٦-nܸ {o^ p`(qbŋ7vܸT\s9w挠 0 @jpi׶};x&0 @p0~˙3` 0``@۹w>ȗ7p`Է0 <xXX 0:( |IA4kڼ<{ =J`@L @  @\zj@ʚ= 7]8 6l@(p@(p@:{fp@8z[ ٴk@ |ċ r8P @0 ܹ @˛7o@(p@ۿ_߀@@ DXЀ x@(p@<~dp@@r-]@L5m@NtE@ҥ@j UV| 0̞E6`śX`… ` 8p`@80 4X F=֭ [lڵ @n> \<]\P@ݽ@͟G^zݿ/P | A  `!C@(q"Ȩ? `$ILr%˖._Œ)s&͔ ȉÀ>{"(`(ѢF"M 0 ժȪ^ +6΢%0 ۶+vͫw/߾~,,Hc 8 e4y3Ξ?3h  z^&0 ڶo0޾  |#'0 C/P ֯c^`{޿/>@ΣO~=<`(&T@!("E$@@@IPeK0&p@@O @`G 8p`@O:`W 0``@80 @Yg0``@80 @]w0``@` 0 Ǐ!;V`G 0(@pP(Vxb8rD`AetI`@3iִ`;yh5J`@K6ujTR80 @ l pmZkh@s!,0`(x``6|p @`@͛4H6}uvM`@ٳp7xxpÅpy8P @8P @0|xɏ/UP(P@ @P0 @ *Z@ƍ2ȑ2%Z@̙3Ν<{Y СD @  @  @\z  (A1 0( ޽| @;@9:4J@x ;ٴk۾}{0`̛;=z 4h@8>z  ~,8 PB  @D\8 RH%MDRe\,P L5męf= 8 @(8AM>A @`@]V̞EV K`@uW/X`… FXn(  (@fΝ=F`@@-@ڵmM@}@GN`@͝?]tխ_Ǟ=@ @0`̟G^z,H ? p `!@H`@`̨q#ǎ?X@& r%˖._Œ)s&͗ ,H  :F"MtiQ@:V  uMv  w.] `o  8Hxq  y2e `3Ξ=3h``@00  `6ڳ,H @.|Ə#O|9s.}֯/`A/ H~={0`> p@ @  @!:4 @1fh@@9r  й GPiSOFTW k 4H @gњ5 @oƕ+׀ջ7 zuף+{A8}~}8p`@8p(,(2jܘqIRXɲ˖80 pP @ѣE,H @JuXjʵWKvh @ʝ;@x7@ Lp(^\@ǐ#KL˔ sB- @`@װ @۸s}A@8 +_μУKN؟3h  @|ҫ_Ͼ@' $XA .dC 20@ G!E$Ir)UedΤYM9uOAg"h@ SQNJuY&8Р 6p @5жAy60з_:`  `cLnA 4hA 4hG4hA 4h@ ݻ0px,gn@A0 p@ _yկ_?$P Dp @,@A@(P"F$@A@*(h L $ @$ @$ 0 @$ @$ 0 @ $P ذ B $hୂr(H@AH 3n1ȑ`2̖ @pТA@WnЮm((0p8ڷs~Ɠ/o h @A` 4X 6tP TxdH#8@J+YT@3D8p<8@@P)(jԧ (a 5P<)_L*="4Яo}6  4xa$8lp6TH9v$64+E(a.R|ذ >x3 r(a!@ * SRÍ.Vp@ VpذBCZ !VlpV J8lkÊׯ&qCbŋ7v8 (WÇ 9thѣI6 Ç Yvl*6pCxVAC&8l LWa'Bh!4wA 4h6$ s00 ,Æ ?x1ĉ+ZÆ?xaȑDh82ʕ,[a̙lx  +[9f">l 6>Aլ[~ ;j6ؾݼA8 ""ĝ8x؀<aUÆWab$xb!4aD l A R|Db )H(! -_|Ç =AhҥMF-Ç ]ڵ?xА[n޽}?xА\r7xpQ%@h!$HTI%4E=%J.@h|HRA"4 PHR LC oxpCE \`pCǎ?~aɒl+ fϢMv-[>l+6~A x0†=a1c6@ʖ/a3ΝA z4i @hH:5-zh bv"Bb!@h q@"X` Z,Y"b,~=|ؠ~! z`<|ذ FaCE1f`B=|0PL K4tyO=zh9swtb )RX&M4bӦҠz$GE<9"G6tР LKH'OP1$ 2hа GACe"L|мsgL0PÇ avm6ֽw Ç Ǒys ]̙"D TJN@"E)h(2P"m_1haNA*7B \(,(U:ZO[tq…Kelɥ`Ԁѡ ba͛l` e{mܹuoAo>l ^ ɕx;Q`0ņ (:Ĉņ (:0ņ 1ņ (`1b1bt.4j1 ц cM ƍqQ`Q (:A D f`vAР>l(j(Ҥ>xRÇ Z~+X6-k, l86ڵ>x7A޽;uꔠ02jDd m1`$#-۩GbjVRAu֨Qu!Ga 0Y=1B Y=B4B\B1b5j" @  {!4Æۿ {a@l\p>xА\?AtR|t@ī=2ejrQ.Aw/]5B#Sb1#@ju0bD:hdG jrEA@ꌏbĠ"zn3bD R4 ÆF?xРtB*u4`Æ^?xaٲ4Æn8` lν>x@ҫÇ 𠡾}6Ͽ>xPР.AC;dtѡ5jF!ct Yd );dٲC 1:̌C1:0CA;t11:,eS*;4LY?xիĎ%[4eq?xa]Oau1bt1:tAHI~hoÇ =|paB 7|bD6T8vACH>l0yeJ>xhACNKiC Tqa.qa.qa bt@a0:Ԡ=1b0a1bt@a{N#pFGl؀CPl0C4@a I{u4vٳi׶ y{x<|p7@bCtөW@ƒ=|ȗ_f ~Ie PlId PlI0!6*F6F-qĆ (:Ĉņ (:PE"FA(0:Da1bt@aD;iH(?48}ÆT?xЀ5z 64=Æl?xaܹlH ._a&͚6ozBϞ>l* F2O~pbGKh҄ ),1G#ʀ$[2R~hb Xˊ4`!xKF`J&?XTbG*Lhd-@hHZ^A Dxȭ{7D |#Ç Οa:֯c>Ç ޿al` %(Ċ6lرDDj" !dtCK DH88q A9|  !R̃=#PxBU@D2AbWa~Y6eAqΥ[.\6Aaĉ/f$OAe>l\ E.a" 7A0$РD 4p9 '8sRС4B_l _<ԫ{6̧?@ <|`>lh 'Rh"F'Hl "GI%>hb 6Xy"zh *'xH… !xCHl Dq$>|" D?B< lp Szk4tc?xpضAC\>l{ {zp46ŋ7vrl8 ,[!;4ؼÆlx  Tz!֭\z Hl86ڵlۺuKt=|؀7aAT>l ]zA4E+m?xWA^>l {Abƍ?9"L|YfΝ=lBҥ=|ؐZ5 .\6Qb tHA7%,hB8+$NxBr6<Bx0QbC*T|XQ)KZaŠ Jl qƒN< A4 P"Lp!ÆB/b̨q#G"@h)҃ &Or r%^n"ͪn"Cƛ/NBI &\РC Naj8lؠEÇH!^""8Pe/aJpȻa !†#Nxb 4@,y2ʖ/cAņ Jp-z J;dtA !<(aC .4hp6lPC)Tpذ ŪCQDh^ stÆ8p _ ϯ?j8`A&T>8*0f\a T BCI@:@%)R a4pa %6|A +VTXab/74hc +Dh…6;4Um[oƕ;n]o]`J<"!డ !4D^" k=R"E =y6l$!@Ç R\٠I"p Ey{Pl`" Ra ϡGƒױg׾{w?V Ǐ*RѰ Xkq&Ndb /Hļ@Q Vv:ЍB z5a+Ȭ\ABAY h @h($>P,_@hⅆT0B 4C(KvF j0!Tl~E+6֋Pĉ^Р p` `"'HP(ذa @DFQnh B"4cCLhPBC%J @Nh!LذUHpA7@h0&^hBL:B{5uAbC`(ac ^4 *Bh"%QA:CR@hhoUֆ h+T8! Jv" /x'pALᰡ~ )DhدZ/v: PrD 6|A"@h!^hEG<ȀҥK*6̤!M 9u!"&(Abʇ-Pbt  :Ԩ*9D.$Rh`[ q5xQy!B <ذC 6p'' 4h@lƃI8Q4` Bm )Hl͡ć]4 'N@hF4@ W"E kQ^2kB} "Lذ U` "TpE6pEd4 ըAe4 !!8@ =B0ĉ pa2e "*8pĐ/"@h( ֆD3xHa„4pĉ&l@ 5T!a 82cv$ 70!BVlP !DB)\ otRy+Hp@b`bŇ,CBPa^Hl؀ň>XGQj0 ` Ah0Ć 6lB (J.@h/44i2DJX(aE&8y"D 4pƒ 4h (WAs֐Ѡ *h0B86l&8pX+6lX!"<6l@`"J tp%6tD -^MKdcC+Ѐ=;+Jl`I BH#È BNhxŋO!\`!?+$TTB@$6$BI !4hkY"ZvА1D4&V(NАR$6lLOLXٰE#\eʆ VLAH8a„ B8J(%JB n@Aǎ`tQ-orA^)Hl ! aÆ+pذ |S 1EE5:tIÍjYTpSbCa#1EE66l0yCeP谙3 8pذ!RP“ :`_B <ѠN4h"cF`Pٱ0fC&?@dנ!D s?< B9B ~簁C7HAnAkDi2rఁ I8aĆ lpడ˖(Ft $8lعϟ?7 H9(]EbqD69"Ċ tTICbY6Ń N!BFtЎ@:e 8)6Q2̈(6p،bBo@卋4Æװ_3(roؽ aH(6l@A"ˊE0:tBCZAQBEF(£`"Z~Pl abQl?E#PI D&>`C#FPq G#OL|@a^؀ E6l@1H<' B0e #:cF-@6=Ȧ7a Pa Pt8bI ~$1_(:D "JFذňFlaQ 4BܡQc(Z4h1̈OBQBqd 5xaD(6,!F6È Q0!aFt0ņ (Ft0ņ `t耣!t1C  Gt0bF5vub5b|H1 htņ (:PE3baÈ1btaÈFt!b(6pu8 @Ј!F(P耣3B. @pd.]1C-ta @pd 8r @Qi%!B Pt! !BԈa$ :QitÈ Ft$È P Z9Npf!ft# ɏ!#:Ĉ Pt Pt!IАc;t!3򾱪T)F#:pc #:t1RP: aG8X% &~6stfN:cĈ>4gO6k4Y3 `ZȐbp!vR!Ç&+F(F ՜$\$I2g--zX[7) 2cΑ(F%Z|ȐƏg ,Lt3ƃʢE\ft%L.3pt0|aC#DZN~v1:<0a0:t! (,K ;9h"} MFSQ#&It3ɘ3k ,4 1mIpyHT9Ӈ \;s[>c:[-9h} 64YS `t H4A#5}ִ9dm*W.f&P:x,*Ft8}zF#}zn`˖tdݺgСÈ@8!X5j F}z5(BXРlV,O4Ѣ&s!~I4:ӤS&MlV3ДR͓'hЌit,XE":|1,XM:IBJ-E`YD75@d={6Ѳ&؜0:AMYB*4OҤyU,KL DH#F2XA\(F4aAD/'NMhf!:(6Fb!ohʕ`AfM8 B 2-X2aa\%DZndID3MXҢ"E!ZP! 0B!a0h,"̇ d̞4QDH zI%H!L !%>(B=Z@\B 2:A @BQH aB$HL9!65У ->:с2:tCkf7@+ڰa&BhH B!B w.]!DB_CHla6 &aC 4@ap!48ؠ 9A 4}0F 7Bs.V Æ8A6)AhA7!B{/4aƆ9l j8-$0 ,|tňI\ӰcG _]AŐ!*8lAE РF %4ԹSJ+NР!Τ!CLLٰ)S*L IW耣5 _A06C$m[Rh ECllqC(8q"ʼn6D *"@tAC:$  4Ė=۷qo0wo AҜ𠁸%xlPl؀î3d4d׾]C686p(A=4 bC 5QbEI'8lXp!%lEE42BBJذQÆ0_rHAC *Dhع cР !NL)6HD'Jp዆@@8Y@ha x`B߿N)qB"dtC(6l@aF=4h"H!vaC @ a aD +Bhͻ7H/!@asడzu/A^hAC:B!Bpb oρÆ BNb'BPL\"D "LlX"68 DIT.1 n8p0!!BXa6la!+! '8p0U2:G(P0cL 4 +HlAʼn*8la߿BT0„/^"M|*8lÆ 8l ],@h@IcP*Jl͛o6lĊ60 7æH"@hbw9\a*NPa*Nxh,dt &xxAD&L|a7l+\ FjXǖ@~0ԡ :@aC :ఁ6p(j膤J7X!BԨRFÍ!%6l+Xna.4e!1dz`ʇ z9pذ7p(a %LРFFvbtE "L\\aWĉ%4⇌dBp*8lPʕఁ "4hBv tAT`t(_~,BhhÆ9`>s +@h0B ="(rp"5n##H2=4Ԑ%lpaC xn+zhp8`RA%$6lPCVZ7tʁC c9"Dx[:t B a68t!↉8X܀D :vC9DЀɇ ,[r!L6ؼ z|AJ!C5:t$  4Ć zu"Du8lD z(!\+HĨ*a|{Æ *Xh8H(ED*6X9ٰ͘4QT͑5РAjs;nz&B]AF"nhAņ Jp={9la @h"nj#:`H QhȀQI 4h6p@Æ : J:tCFѣDVpд)Na 8l@sC "4p8l[rз/"^AC :9C.D')VP24opH Uk,vP1vIx",$8p ɓs`a s(AD1!Dx]'Jl Ks6̧  pd @2$f„8lhؐ %rذ AxȁH!n81Ab 8lhÆfr`& %A^AC7:9CG/YH)RCB "pذ'>p@ 7XaĆ *h i:HRxpAʼn6l *Rx"^( '<Р ?(Ptб$Ժ"!4Jna!B "Lla /Ĉ4hP+6!) L7|pF$6p8$6 (:`ZCÆ4xaE)llP'l`C8la)BxM wxа }!&HNcN!4Db$LA %Nh;Vć %RhP Zf 2:谷 #ZX0Ç 9$ް 4D90BLAB&8l 9\۷=0A!4hA1d4$OA9D0}:c簁PM#A 6p 6|A(F4`ҡÌ"Uh(BņH L@ VR 0@S 2: #gX@Ň H9(ݰ.@hJD'^h E+> B(alؾ Nlذ5mPb AhBˮe`!5`f 4HaC7l@„4na 4"D T$.TpذC"=zqذ%O[Jl 8lPÆ laCHD"h$ȋ!@hÆ LxB2#4'8lX!B! ѡ,)h`Æ 8lؠ"$J۷6pP" 4hAcƈ|¦4H8lA  4 ℊ 8H"Bl" B)B8Ά%L8q2Ć+Bh6pɐ|:X$ "4x ēYlpB7lRH„ !BAĈhAƖH! Hqbʆ&\HƒBPAC '<aZ'@?::ذ (lH;4Jl(a+Dhh< 7 Q!\|!R`|4(OAb.B   HlPD 6pa6p8 $\8Q "ڠB 1AР ;K"4a KMlA N؀6kР!)Dh1aN p{5hqS P46pذHNAbCjթ9ٳ?x%8l`"D8O !R؀54>l($LqÆ 6a'@X'p00D6hrpCL !4h NC RcB"L aB NL؀6khB @gP,@h8 " 6lXBT 4Xq1 a(c  nx+ 8l`C |8 @ƒ pƒ&L|ذ88 ѤA<C@8OkXaE.N6Æ9pذ&Jl(+ 6<8#&"R*A$UV6H!…'40„ " !XtM >q"6l" ć Dh@~PQ lրc5MD B8laC%4< Z%B'+~%""BHAb6lPA\ @h鉐 &Bh 2:!@h,_l >xР!/UAc MN D \|p֭+JpA ؠ" qq &:B A 6|`ᆉ)CnX AcF1$BF0`S!Bh 6laB;0a6p*Ŋ._p 6CPa R*" FO%.Bh1d4`  )la,ٲn( n*¤ÈL P$H ~CذÕ+.XDc )8l("!BРA#̸i ]|k%>pe $A\|P„.< \(!JØfРE 8lpD ohH 6p  )

pPD4'N`"G$!  ԀlM LYe i9lؐg @.u6l(DJPذ-4,ND.4XD +6lx"6&! :txBk/zh! 6p6 ĉ!Lp`B[rqI RPď_B%s D'H0!F<:tR LCB 'Jlؐ' D<)Q≈'lAS)H1 pt$2dQ[l&Ța6p`6ԵI %)h 2&"?܈B spaC)C&yp3)LٰJ"=&VЂѡ.+(ѠE/Ca)J'Hl?~6lPPC 88|pÆ+Vxa6payJ進ƛZzPajڬi#'6bE 74h+F2~bT6pu+y!,d˒FL0bD]sȌ80+ aѡcF3fAC9IdGnjI1'ȐF0 B1bD3$@q$~f9GF1ǜ9Ij@1C012G[tCƌ9>ZcO@]# @j@afKРÌt@a1@aÈ=a*ҥC1:t;1pذK(6bϞ6aע6AS36H!6b$&-0b(Ka ?6b2ɘA$4aPl(P&4D,d (6l@ѡ&MZ,!#4a6ldB\6R2B6lhL#[6l@ѡh"Zt2g]) Z4A % @(£06a2C Z0ǟRPl؀CJ{@(Q׷oʐb W5493@qAh!RX%惍 Hk  =iM ht1B (%A 7R`) TV Bb6ْ4ȁ 6p̘06I%l|x,$8 @4i" <* <<&Bʊ%3c -xtc#F #oL(y*HL|03b67)RfNDK'&8ȑjRD*d)aa%Æ аhaH%HVUaA":lyCElK!d" /$H a %!z("BڌsEErTBᰁÕ0Xܨ a@!aڐ!.X02dAC U<(!:H"nh" 6pp9XA"B,1ƒ4tC $K,ɁC <&D̉%J 7B" 6p8!ҥH!74XmÈexqㅆUJl86Z$7n(FCC0:Ԩƌ79XI"Ld%Jpa:x%F <!j !Bh 8ؾ VР!!^"C&9<8&Jl!;yap'q^ RdF BQ6laS6p8 n0% =ZhЂG2rAC$*JlÆ NqÆ 8la .Jp16pX!B'Hpؠ 7pذ  Npؠz'BhBI (:t8R&G S(a"6la6p8" JBw 4!Ì?$DPxĉ.ma  8pذpÇ"@hB" 1^ +8laC 6lp6la/4hAC5:BCQ1JHlPʁ NqÆ 8lкaE)JpX!1f6pX!B+6P w9pذ  Npذ+Dh D (:t8RF Olؠ"6la6lp%6l@h-G?X$ 0ff !(0C6pPq 6pఁVqㅘLJÉ+Hpఁ 7pa'Nఁ 8G `DPAF"!^ĆRnAʼn*8l憛V Q„ -:9ϓ40)8lʁÆ T86l`B"(¥24Dhʆ&Ra7l 6l()ǏAcF 6,vѡF 0fHqRLCb˞M{ÆY"#&qĆ+_D 9l^=BܸBF2rx"慘V67p-*!@ ҤjDA %W6,ÆBpa'Dh"h:,H>l1eΌa!4 "b! &4ܡ8Wara_B[!n8ɲy7/ 7p 0!@qc bD 9/й3DPz 6lЦ$ /4)*( 4hxao N 7p`y!@LPH#<B*8l O 7p`{6pP> @D1c0A$ 7`"6nl`R/X%!"D`svÆ8`D@qÅd H.Tl b7p(Y6p0BDJ40a`6.8p1%!4hA"F( <`4VÆ8lAܺA7; u8:rBC6la sa68lAL!\|`6Jఁ IxD XAFļÆ Jp0yeʓ6pXD0ѡF.4HAbCPCݰl0mZknD @hƌ#:PٱG(P1-@a'N|pC 9t A6v]"E.L|a,)R{'>l0aÆ'BhBF:1#)\(გ*8l} 88qB NI E 1Æ T8Æ*RP!#&RA &>lH!4hÆjnAʼn*8l! 8Xq @E*;b0f8CF.Tl`"6la nˁÆ LР! & "LpذD  l&6xa!@AC p&Tp`"6la6l(q%6lc"-:1 waÆ %NĆ'@8!~ !4طb #bx 4Ha 8l'Jll`"%6E Mrذ4PBbV$NРA 6p8%JHD%8l[„!BhBGHaC 7pCGȆ%9pذÊ r4LPre͚%R>9Pq…)N0q…$6@%qB!4#9xĊ>HÆ 6 Ċ8lpD ~[('!4h!b6l"ʼnH"E .N@Npa 19BUTpؠ 88qbʆ8lHÇ'<Р ?(Ft0"` ,BG K|`ʆJanArĨ"a.B"0HcHb$N"č,dt # 7=h"a0(QG9la OCh3C"/4hq 8lPD TА@a$:IBCa^JlqcBlظt 1o`"ϞDѡC #dX谚 *9Dpɐ)poBBEo8 sذ O/ICuJD8aCw9PqB N\b‰%6l(aB!h bCsy!GC6(\aBŇ$JpK [(C"/4hb b@ӄ )6lȤA*@ -Ё 4hÆ fu,*llP⃊6l0-ZҡC #dX03pS8lX,Ґa)VذÆ xx"ӨOD asɃOBhV"=C2(  Bd .Tp*yB,DxXQb{/A4!eLxР! nఁC %6p0AC Vh Lh%0AĊaiJ8~ 0bTXh(Æ. !Tp ")HpPD=4ȑÈ2XH!I2`@# %DZ '=4Tᰡ@a$~HE Zn qĆ 6lIJTI C<Ia /^3͖P'8l(q" &$4pĆ WT yt&Eɱ "N a&xRNpBr"'NxРG 0C "4pGbex7l @l2qB"NHB{@~сGE:A 'B c/>)ٰAE ^pFDSllE 3i ax)AgÆ4q#D/B CHp@a"@hĆ *BhHaC ؒ8B6lh {5AG BĎ6l(BH "D8k" ^Р#:(BCl$$6Æ V 4"DxѢ "dtnjl(BJ-]+F΄АӃ 6pC&\AR/4<B!DcF ?ѡ0fBĝ 4q*h{ @ &ΐJ8ƍH6p% \hZ Bq :A$ 4HAb6pX! ōBr r>iE$f Ba,)N@…݃A| xtg*9@tƆ r(Q)@h GE /4`"D 8єI,ae3a& @(a'"~!TQ 7` / u!BpaĆT C΢ Q%@!" -tt #7B 88lp%ƎkB/4hAȑxF "VlHA%*JLn{p"ExpeшGʘ@!)6@nD MРᅆ^!~< `0bD&;v  3|!AÍj葢nhPP 5 Q !BdWAPrpB "i9Ӄ &Bh"4,ѡ-@h'!Rab} )\0 X!FѠ!D w9xID)S>BC$BHA !%HL!QϟmL!4аZ!BAC DaD&;vF 08!zhx*"@AC ȁ"4h ToP e 5ݢI VРA LIA duٵoF"$74hA8 LРˉ6t!RPl؀4DhhآE04XCr74p! 8HBJ R!LpC|Æ $R` :V" -tt VРArֲ bC 4Х E28ACHx"|aȒ'SlY2))BB%8B%8xAÍ!%6lC #P1C'^hbI94Pa8S. H⻆'Jl(oD 1HVp!" $V>]4+V%D D!Г'+LPrr'VNh0yĊ >| drpAa/<(ɒ*6XIE K6ujTH|0qC [El:ˉ")1 /NA;dt5ZB-BѠA %Rhp68BC B thļ!C%6lzC'Bh-"B &:pAUHNР! 9lP" 4ha^p63:!Ƌ РA Kpp < 68!BD"TpA!BР#Ftb 2J(eJD^hG !n!^p!C$mpE 4hdÆ 8XAd =9|0" $q4 mC. (;Z(ࢃ">(PK(2Ҋ#B@ArD#P\r5|Ԡ9b 8snAϟ@ ÆH,b!>(6l@A+J#PhʅF  hӪ]˶۷pݻx߿0:L0'Ɓ#F0jԀѡ˘3c0FlMzR^ͺ6ȞbD:ѡw5`tN!ƒУKNzu 4h߾P:Ljѡ=Pp@Ĉ0`t?bD#ƨ ;Ĉb ;l1!q njsflA4̤ B9EӧE1C8f`4g1bZGYƈ"L| [Yiծ]kBqw00bđ=vΝ;t$,V8p0bD0:L1Gpa3+;{cά[jkXm3cd8fH!/As"L|^݄ ٵ{wcc$X!spt#FTvx? ,h „?x'\p CIp tM2\F:čۡY8:.ʔRL `vL… Cp Å C tCptQIYs5k:3fF̚@bТG.mi4nE.reI.P~0ׄS,BPp7n3Ex9UrIsIK uw(?aOa4&-Xd(4DQ`y+¸"X?xp8v$ACH>l0y2LN`&oh!sS )dx6Y J@bCRK6u*T4T "D Z"$2Р t1b4Р e̙8lyi <{j֙N-45„Ch TZ\=|6ʚaڵ%oAG=Ё/BР66`Æ;~a$I&>LiB.=| s&M6orؠS'Zh*T(Ft`Ç N8a*ժVb: ^~a,Y6Ea-[޾-D v*DDB%6 Na1o` /kG}*6?n( 4@F &9XA 0(cGKpذ 'QjDF-'^h)SD6p(' ?ACQG&Or:6l"^AaD,<|ذƕ;n]pE|ذbCaoP6DVN&y  ,BhÆ&Na 9pذ&Hl… h"'!4$O."B8׭{wkaCy8߰Æ T8$L?6(\A#JHC6h =@$6冗JpPta$(aE'8la 6lp6p Z4Y Ҧ aÆ %NqÆx~𠡯߿kaÆ9lXÆ NqÆ8|p3 D0㇇RAװc˞M۵rATl>qoÆJ(  (:0CR`"6lడ6p8DA=Z4) * aĆ %Nq1~G!EjaI'9l`Æ NqÆ 6lpBO"dtÇ I~SQNÇ Y~W*6 8ea[4OLr>HÆ 8lÆ T8+Bhp#D&LFyBi 7lk z/{B>lh '{P2̚7p칳$Fѡ!4@Dņز9Юm{n6l(aB 7nh2C=40g$ 8l ڷo qǓpĆs=a'BhO #: ?x(Vx"4t#?xpXrprCL3e~pg:BCP ,Tl0zCRK9lpʁÆ VpUC&I:tBCذwLpذ8p$>Ե{o$8lwpxC8lpD 0>l I{ujիYoACl>l} y{P8s0~x6lBCt2:tHO4xPaȗsذ kGm^h "Vpذ%8p1ĉ+Z! 9xaH'@h8 Ȉa̙ڻb 6`"č*8p (:`ZCÆ@x aE'8l$9pؐR&Bhق 2 4Ag 6pذ  LpؐTRM>uj%6\5" 6pX e5 aC#<|Wa^}…=|ؐX?b ,s BV|AH0aC J "}"6lAx %8l 6p0B"X B a 8" ܿ_|9H" 8A%6lpBÆRذ)>lȨ ?za$ɒ&OnA˖>l) 6ozPa'$TH!"x >!"?fȑfD|D 6laC)VpPD*lpXB"4B#8 8|0"6`άy3Ξ10 $6P )JlP℆ڶ5E,<| |#aΟC=|ؠ}by%>( ⅇ6Ç ?xA&v#H wذC 9lH$6|c TР!DMR 4hÆ 6l a" :hQ@UxѠ! 6pBCWf 6Uo=|0n]w7|o_6Ç=ذx'Bh '@hpaC)@hBGIаZ`aCN40 ] !Bh2C7/4D 8l J|?^|(6p(=:(6l@Q (ChaD&hX( JE-P:@eBAɓ>lXɲ˗>x@rAϟ"Tl:Ê 4I \@D 4`ҡÜ3d@hĆh9p DB*%6| A-ЁG 0Qb" A .lO>xATl> PР%6l \a)-4l\%8$TjBK$8 &M|t@Ea6,-…Q~ YEе%ĎuaY4Ad0a&Bh#:Pĉ?xر$O\4lС?xPڴH8Ab $dϖ Ć %VBT:tS ɉ0„6paC 4lBw"&<Md EPo(@ aC (CV@.LL%.Rx!LlhaE 2gcK,<|aҤJ2R=|`ruAÊ!Lp(BڴhAذaE BhЂGoCYa%6H1d7"q- EȲ4jJxqBذ| $-xt )4/!4(Q"C`}Ês.BF?<|`ֳa=|lX!<`)"xtp CBh =SLАsCRc2:͛?xH6}4vٳ?xp H8+aD-^=|RLaʕ6" 5mBD DС+1=4hq!Lp5*^aҗ G9bAZRذÆ TB^+6lHA`Qjƍ_ IaÆ4\ B!!4hXC2&h#D40a$R p !S(Ҡ  z4IҡO.b̨ 8P NX ._RcĈp4Bç_@ȃF5aTBժtс6 f=|ؠv-۶n7|a.]6~= JHc@!9č.dtPU Bi+8la)4-BU4BM|tACƉ a9s8a:% @D1bDD4a}!$8@B; 4/b r0B42cĈ2Xxb4dA 'Qze4ĔApraÆ)@hrh =4ń ?fiƄ J"@h… 6p0D 4D TT.M!RbCK%6$`BCc 'Jppr4ѡ.nx/Ylp a"E&\0 $6pB'R_ň>Xxy4Dױg׾ {|4WAha^(C5ha0kT,A4HDÆ 8lX ^aI$RhXNdzhqㆆ8oqÆ8lRS.4hSC #68BW$S8lP!!l6! J%a|HaXAb(F A@ z „ nAĈ>lh 7zP#H4 aĆ6p(n!3MР 6p(ZtR)40qĆ8l N1eFƎaÆ 8l& РG6la 81p*;40Æ 6pb6{PaG`z;`Æز?x`v"4/Æ?xS'ITl΁Æ6>pB :ÃL`>6l(a_ppC Ȉo4TBD 8^a$TdI! .BmpC̘hp!DxRbCР82ɃLtR7T+vÇ c~mZ"If9B5:a1bt@aF#FAFFAG:@aFK@~xa$"4Lr%˖.Qa&4 J#K È FtHڡHE:taĆ (:Ĉņ #:PE"vaÈ1:(ҢE#FtҢE#F(Ң#:@aÈ;XҢH#Pl؀bDEZat6#F6 C-t1"Ư-~1C-tHaĆ #:@PfaDh/~<χal< 1gּs>l= Qҁuaǖ=v0j{7 >xqa谜ysϡG_Gױg׾;1:tÇ ѓ8}{Ǘ 0 #:x(P:̘Dŋ:xxC>tƐ@CR:bƔ #:x1cF#:tI2c xT7:tȘ*CaȌ@a$Ɍ2:PaFhaH|MӨS&al(h „ 2dYEp CD6s`A IaD# I`A\`A*\`A IaD# I`A \`A IaD#>0% C#J`DD б)CD 0% C# I`A I@@ڡA \`A IaDD |@D$kx 7‡/n8 3ҡC"xta Pt0,ta P0,tt1;xt@`,X06aD,X0bD,XP0Ha Pa 3GĈ#:tb#:蠃 #Ftb#:@e F蠃 #Ftb#:tbC3~x o^{/ aD Tjp<ņ (Ft1 Ftb#H CFGt!#:ȐcD(6l@12dq|D2:ѡÈ Pa Pa Pa Pa P? Fņ (FA#!CFGذňFr>l82ʕ,[t4Y0C<{ 4С?a4ҥLƈ!ԩTZ5֭Ra &>=6ڵl۶5!Bܹ-h$ FPaćT ˘1 2|8~,Ç 3fÇ 3fÇ 3fȠ#>ZSy-c Ttd 2# >!Ç2xtF|X]ƌ@d#x>d1 :Ș1 2|踯È >tXJ(K@PB >Q -hŏ,X,vdC%;X";XŎ,~b?!BĎ`C*_?X,X!#E, d"ZRBHaC?RX,v@,E ƌJ݉~ʿEGGG,% ) UUT%$$N6 J)66264rHoMF tU֌OIG/W%m8ɅNp/Yg g Rxyru $xvRYo1Lwe lfQIpwiii /ٯ* P{Pg ǵ҇m(o0UTRU2r- w tg-J $)'ov.WxO3fJ8+Ǐxt4vyЗ Ш /GR9P {k[Oз-G5E-oG͸p8*69H"&J,%}jkW-HMհTWe9L( %ζ,VvЗLJ-Ϩo-W'J0ηPmJ-ԑlI,i.pѪ/ʩ)ňhKkzu Oɻ8Ը N(ѧPkɩy:EQQ Uĵ̈KZfnLw ypUx00Tfp5(eZgΖ+RfQ/SVwSm,(zQΈ*w,k[/n9Зnvp4f D%P$Qh/Yijn/SgAA*\Ȍ#JآE3jȱ%-B,b2(1#0a@1 5tYϟ@aѣH*]ʴiS#3PQAիXjݺ`Ê"KZX˶%JHExhE-ZhAX!=z"ŏ,d#S22,F"8TxfkH)Z^ͺuc6BE۸sͻwo*FP0Aȓ+_\УCobI0~ٮ#EÇO-ҫ_>:ңǔ)=zLqb Xxt„,h`b &XtƖ)4jlG%D,B )Ud˗*PaM9uٳ'%ڂ (7t`QFlRڢD-R #6-Ċ-QE)ZMV[?z RwKFc_'Pĉ cIS F )Z(r %ZhQ(p ]iԩU^ &dϦ]mܹs@QoK@8AEG:8HG %H?'UԦ(TU *L|H e͞EV-Y#*LE uafF%J4U{+ϕ7:RNѢ)Z`sP-Z` ;-NtA!$<Խ1FD,8q" D$I`V;h"E-JDɒ*PPab%K(JB6oiB>Pab(Q(J MJjҥ#E ?z`c+׮\S+Vl-JqL)ZHcc KK5l8h͚D\(RdAEʖ/hrFP%>F*PH _Î-ۄ %nF*PPab8q(J OBΟCnB֯Pab;w(JJx<#E BdY?-("-PAHCǏSP:ϧ]U.V#Jgy 7qAMZ: G@QiS*LD:jU*Pк _@B gU(- &ƕ; (JՋB U(1p=8)Z,)#G?F Ϟ[ʕ7)ZHʕZp4A >=4⇅<đʀ-7nG!9rDs0Hт{ )0S N%ЧGD{*P? ׿߄ KBU@„Ç*PH 3jф %BD„ɓ*PXɲDN3 -Jѣ hN@#%JHѢP'N\Ѣ*GNsƏ+'N\?'L$ȡ9qF!-Z7J%JAE-R( bC`(A2 &2kV(TM&T(5 &bV s@Qo*LNq*PX У@Q)~aO&M`(QBG&0~9qʏ[("}N8#E :8A N?8AEG C0qbQ ~ؔh#JQ`(#JQz`%JHQ#O'dIѢO(T ZTIPaSQPU(TU *L%E iQ0[qM@Q]*LE K:?`4C='O>)4hѹE )PҧG t3 o\a"EbwX8(7b~%G8MRhN-=Rh")ZlO7eѢy(T`^Pa}PPa B(P0 %&RDƌ7r4E"Q0a %Vlcʐ!Y~Hѣǔ:u€cH)-:)`H;v")RBΎ4 rO(QrD# \Ar垁.޼y[Ǐ%F*Ph 'Slل %6sF*PPa4j(JnBزgӮmBwPa7p(J/G3M`hGgv)sᄑ0`( Ag`hE C(9AҌqq`QtA 4bDKhcJ%8vDDH*P0y +Yt҄ %hDDN*PPahP(J5B K6ujBSPakV(JtF&0Rq-&SLF 0RhqE zKm"E 0ң -JHcP,#@@\Hvh#HЙ&0Rnv ٲ[hcJ%xFDp*P0~ ˙7w܄ %WGDv*PPa|x(J7B ٷwoBPa~(JE 0R#?z8| )ZXԡ#ƍK"d?zh)RB);|( 9z#'Z3$ˏLБ"jTѢ֭(T VdˢPa"ڵlۚPܹ(TW *LEQ08ŌM@Q"d*LXE͜KܢE )JqèϏ?]F-ظACF)P¦%J tPaJvXa#H4r#)RdqNc~" :hаI?E%RE Q0P %>DD-^4E Q0R (T@R-]PaBL5mPN(TTEHE-RhÍWthʉWthʉ~hʉnZMQBMRv6)P r qa5+nhQQHsĕ)Rr(-RhQD)Z m@QBn*L\p*P@ ͝@B U(]; &^ (JGB U(_~)Z("E:cH=`HCG _uH1)RP" oa")N!<f9P80RDCG -RG%@.B ӧU(5 &`ǖ= (J֍B ߿U@Dq*PPϡG>]#%gGDw*P?D)`PF0`F П?[آE M`(\a = "+Wޤ`+zhQ}*L,h B(ThP *LPE7rcF*L,E*[ѢD%?`ȑ-JHD0(a)Z("%a5EZS#EFjب E%R42%E .lب1q'%J%JHB'(Q",LIѢDJ(TpR3iִygΙFTS *L5H K6uR#*LTE [[hEcaTk[MnsSE{ShrI)`NѢD0LBOS*Q6lE ,aV 19>E)C'E-tf %xFDp*0~yr˙7Dt*PPa{v(Jt|x㻣Pa}z(JwF&0RO0F h&gi"b 0RXѣI)Bu҇ExTzȊ@Vq%)0Rh"?R"(=`(4) &:UԩTZU* &zU dx"ڵlۺ}t@Q"%zDB?Rh"ET{\N!-ZHѢ5tժέ)gHѢBtZy֏񃆗k A-[dɲE<SHGK,)Ħ)]iZR"x*L?ۻ?8Lؿ &x  DP!A'L<E \TԴ(D 5W*jJ "5j rP=KPsP">j\QB)5M 95F =~Б"E[*jJE 92qEM uQ0W *X`~q0X (TYdʕ-_E ΝQ0Z %LFj*P m@QBn*LE Q0\ %?Gt*P ݽ@QBx*LG^zݻW ǟ_~UDQb AL LEQt2!q"%.bDǎ)E'&OvBQb%p*L9-X6u2s'%~EѢPH NB*u*ժUU@׮^ +vX(JMBnU(!w. &U߾(T,XPab1c(J@Bʖ(y3 &>V(THZ_Pab6ڶoέ[ (p.|8Ə#GEQ0!} %cG*P/ ϫ@Qb={*LEQ0c%( @QaC*LDE Q0cGA) 8LTeK/aāDM(pй?dhQ(J$U Oq(1* &fDWT;Vgdm[(Jĕ wq(/ & Ǒ@Qys*LDE Q0 %GDyѧW={(PQ1~}ׯKh )E%ǮC*jJhh 92d!rEM(QBG5jMSعjPQjI+>YJPBDU9D)**ŠKٳhR12pʝK]Ffw:)E)tQ-] )E-ZXM!] )#E%ZQΣZ8=fHcǎE5lBq4dH=]ѢuEBKJ?ӫ_Ͼ{FfO߿E )$!0``a[X1 ?tc!4 $v0a"F4ѴSN mv F'^qɕ/gy)Z(F,BF8p0t'H XX$'%Kr,mr@dH:5j0R~"E 0RhQE[H"7*p Br*pP!#I^ȸ~]*dxN2*#E-JHF)Z,Qם&hB@' @P] -E 9`%̆ '9R {\0qy ё3N=}l2R.>>`b%"MQI5[z4#V0` 0`@ )ܺm&b`aB}Olĉ'L6qB Ml x"E-RHBt2I ֭]!F m߮͢ Gа0\>)Z?IM2cBz'Dd0a &"'X!M/])ܧhE )Zo'44S,X`ADp Њ!=\B'E?zlΕC}~HI :0^h!TQ'L&pѢF#&p AJU(E%RhQbl7DpY1N0q" 'pB儉~=#H 1L NLNK1%ǝ1L`6qQF/N0qi'L8*'L>0RnQDS(!`Zri&?Y9qEG)Z("E:М8qEG:8FG%( &p '^pB 1…ˋ&Lx =&LH/%`HѢDFĘ0ˌ4L`„ ,Nbƌ4L8qD'b05F 'LKNg[h)GoO0AŌ/N0q 'N0Ō/0qD<~hQrS(9EgΚblj,N0‡>`jE&0X9FG)Z("E:М8qEG:8AEG)JvDwIfHBÄ IfxAÄ'L8q„ /fHBÄ ̘∉O0ѢD)"`#  'L8℉2^q„'L8A&b1}RZfHQ02q„'L8q„2^q„ٳ;*ӢČKRMѢn0LiB1bbe`K&Ѝ(M`rM)Zhsg:hIѢE 6hаIѢh0a$/8ԋNg℉'L8! 'L8! GLc MR("&[0aĉ#4X?q„8r'$h&.TN%tdNP,Ll< 'D$Yr 'T0qB%%ґM0` ϮO,XljDcL8M`С#UWalM)ĊQ6E)0JVh`Qĉ#y8&N &\0#{LOP%ZQ,Ol&L m U`ݺc8CmT (Ɣ(9 r'L,g~s&K?Q &hD;Eŏo"E-UcǎLǑc ]r:#S,  2LѢE:ԼÄ8m:ac ,N(Y 'L4q℉2O0aG1bKJhb,X0鉨&NP=a ZWb;@a%-Z!Ȏ"b5LХ{℉zO&N>a=2k8ȑ[HNEcXsEX2a38SzH"0fӆ6ܸ QQ"'X1a 4htҥn⺉On'X`!P!i8aĉM8,N0qaB'L4aDD[T1Y&L`qdH4N4yeJ&VI+EL0~E=QNCj5k4|ReJ?~Hq5ŏ,Cz5EXc[`3̈́5X0a GNԥqƑ#'L8b'L8qqbʼnM4VbTӶo^Pq„'L8q„2$BDlٱO>a \JݻEK4UqĴH/d0aℌ/d0a Ot7a℉&ȟ +&L!A-Z-ZO1BU6C%ɛf7rLС>0R萟G0JHѢD,SxY&L` 1dxqʓ8ļx! 'd$Iⅅ 'Nz"kV&Nxz„N(Ԡyg2Y!`D'L8a"&Lx1cF& .|"ŋe)9r-J(M ,̘ 4^̘ 'Nx}"ٳ0qŌ/N8 t(ʉ~h AQÍ%oXa!'`\ܘωW~HЉh~SXB` 6*L4q ,^ ;̘ G^̘d 'L4qB -My̙*P+ޒ -!gN/h0q 'N0qEIp0q '06 #%̞mF2abG3^1aƋ^0a &N>aB#&Lx1cƋ&N0a#-Zrġ)ZpCÄ1wjxě81Xɇ7dAsĕ)Rr 0(QE )Z^Ф&8aĎ^KJaĎ$3f8bf$a Mң*oRAǍ:0`Hzu -JP 'X8qŕ7l0a/d0aℌ/d0!M`7qb McDG1w\rK>! '`4Ȃ`A4N$j࠱G1CG gu耱6E[0Rč n0E_1XԈOq℉!0a ,N0aDgϟO0AC%8 Cqj]v 'p` ߾`" 4<8aD^>M*U # ߿o<'Ч7aĉ'L8 8a? b@3F0zcx؈ʦL„>F(Sh" )b€fM8a# ;Xݱʼn,0ĉ&J=U'N0qkW&N=a 1FJ%Nlxn >v`#ƉM6qpa'+6 8THL,b"&N`q℉1Xqu'L8q„V<0&`')M`G)va# +2- 'jG0`XϞ= )ˇ#&b`a'XA O`h&$NdQ"5n4G&N0 #?~G͛1wE8qv0aO@M z ,v`qSOOr 6bz'bبQF 'v 'X؁Óyc8/&Nd Ĉ{LA٘ 6̜iYlȺ-=3F ԩS`CG 0`H.5XX}D>|q,8Ѽ ,xÄٵon» \z1raq,N捗&Lo?M,hℌ$I0!!T#Ɖ&L8 'bبQ#2„^$ㄉ2^$„2ܸQ#NtHǔ)=~F'l+&LAfJBUrSPlRH+y`q Y츒$'N '6o65N0qⴉ&Nfmk(0:fF 6eɄ,N`bƌ'L8qt'X8a &N1 Ǔ?Q$;L8a⽉M7aF '"aa` '⼙1# &1#&4Ð 31xZRCz(U1N0q ,XiF-ZB`F KJh4'N\Ѣ74L` [`bƌ$;Lؑdƌ,L`D\,|`a &8A  @ѡ>-J9-[E'L`qĉH0`a M8 O0qŌ/N}73f$a Ç0ny 1L4c!$fby3cF&Ly1cF&LXyiƛfLxQD =hQb 6b 8p`q„ i| b„,0RhQD9q⊎%Za 'L4q '5d ;̘鄉,X8j;L85q"'h8a"V(b`y5X8!#Rq,N8ׄ'X=a &NxB ;>! VL8ل4h0aD &NLz#K'v\ych &Nx 'ȈK 3flҢ?`Q('L0# BD^iؑ=)ZO#> :h@i?+7^px &b8aℊ/d0aŤ/d0a"Oc %O`J,Mbɛmp(ϡC]xP+vqBR'NЀz„'LV]O|'h=a &NQG'NQ &N`+O`"FʤHF?% ,l|&B>vРa.# ڵiBw )RBÄ'L`rM8AƉ&L8B;>|8aB ˟8a &@U*xʓ$>|A'X8ab!h9qĉ'L`4q?ab$&M4q'^y"F 6X8ab,X0!t +VL ="F~H#ZU)) 5ڨB,X8b".]ȓ:z #E~SE 7,L8q„,X0!y&.c>q ,vcG OHk&^8!CYPQAb&?'C7q 'L`?!# _0!~&Σ?~ O!? Mƒ8&jlKѢE 0Q4vQ 8y ,|`q/r# )RhgeĜ0a GO$5&F=q„,j# &X=16 1NP5:l+֡aDc&N1 )&@=h'N8uk'`8‚/6L8B &NAc'X\ѕE0 8: 4h91ބ'X8&X0>h8M8b'L8#GNHhĉ>v0a,Ny'X`q5:lICξ |@Ť&L$&L &J5q+'N0qB `a쉳&L⅌&5q x8!#R4zh ; ͘ G^̘d 'L@0R B#2L04q '^̘ 'Nx⣉&N0aȋ3^1aϋ^0a℉&XAÄnZMѢĒ[x`C5Lؑdƌ'L8a 4N=aXR(" )Jh ,^̘񂅉4N0q '^(чGG_0q , (ahG(}„/fps.}`QG8;vxyB'vxID &NxB 'X0a &N0a.%Ɠ7"M8! 'L8aYa/^0qT0a &N„ +nthPF]v8!W45b8!# 'LԴyJ;0ơj0R#E\1aℌ$I8qH#4X0qbI`4km )ǏfiCD'L PF Ex,(Sq &Nt|&H8g&LbDlFd}wn'L8q'L/~$zV9r 'W~„'X8qR/-J('L`#1NԷO8'L`AL)tHѢDGL8bF1N8B&L`#͚+\ET(ъNaaĉCi0aB #bhİ$j 'LX5b'Lx=&N` 'Ye"r&8؄`'N8E 'L0c&F"ixba",b0ĉѤO0qE &JQD M]j8D YĈq„p'?a"M8S(&N0aM8q„ UhrȠ/Hj(+rR'Lv01,N0F 5j ӧQx1cƋ&L8a,N'T$HP(Ѣ5ElPnDsϑ|aDu,l0q)+ 1j„6j԰ÄV`qDM8bƌ'L`Ä4ܴ( ,v0D HAPQ$+&yåD!9rh1C?̀1dћPk\(#FZ|XTƱ98N2# &Xh `Ú`Q#H,N`1X1qMIb˷3f8aa'b`qĎ;x|AK=Ȭƌ,B0a"(ij0&N 2;5̘}E >X0aF6b0qŠ,b0q ,^̘񂅉,X0A^SIh`'cY-J ƍ!)J(nJJRK_LX(!E@ Kڒxa/Tu2QfM5TIͤ,0Q dQSQOxB Y ]B)rH4J(R}4Ym&N |H/,v 1Xlfq +,l`q"F'XxB'b8a6 TxM/"&(dŚ1(yH JIbɖ,:R`$LW`~QIU6(@K,pQ "(i䉔*M$HQh٢D2.,3SF3:+3ƅ)YA$,Tx! 'J"DEH%A ;v8܄  V# ^DĉWް&g&̛8q"WiQO &s#:R1$Ǎh2eTp\]prRAR,&LܓH'*b-B(QL)[02Lʔ(B0J,2KJ`]"DG^ab, rbaNJ9(QBǐ+\YRbF-dV 3M\#5_xZ2&X$1#&xш ,|8a &N1P &p$1P &v$YRbAE,bHn,NP1\6L8$эQz(ѢG9z(c3=X9%$Ad8%3[9q)[H2abؓ@:8q*&NrlD%B~4;ZymF%JDe()D2J(1&& r#&Cˏ%~ q%Zc&8iC&H%^1aʋ3^0a0O0ŌIv0#Ɍo|0El*, 'X„ IZ$*EVȑ#K-zDɑ# F(R, An@$ωAn@ˉ]L *]+ ؒhrE!F:bQҢL3IettI4UK$!?~#ɓ%0 .n$*ʊ9Lc1G8Q\`c㎓3MK0XI&Nxd'XxIDƉ,v8A   ^^$A biӦE6Y‚E &L蓢E7l)i'=~%ǍT&#v'"<@qEДG^&aN<~qr [bհ1 &N[)#,Y $PKB hЄ I L8!Hɒ a,xqb.nDㆋD$rqÉ-9V *R$)CYD'`qO'X8h,eԩS5Z>v8 >Glj\,XذbGG)JX ʗ4xpq#G9n(B> fvP"  2D .4EĄ9F&`;QrpJz493d & sgd &drpm/ٵa" 'N(f ktIКD@(@d8%0O b,NP4a'Lpd,XرJfL`c 2MΜG6-jj,lݑOJ\zu@@Vȑ @6qÅ(d'Zi2e @|{Ä9j&(N;Zd2ЄdѢ K`pV"D:ud#˖-Nr丱"L]*fqD/X0h&8 OXٱG,Xذ>)J,BH FIYq# .V*P d7rD9F)[dq&|) PaP9hqDː,BfaȊ@)s&.VԹ,CX$TfL4v"Ej .f-CÆUڴcb;xVp @#GX/nF&L#"8NF }^Æ Y9q„'Xp ,װa$-J^A"G.Vp1bD&B #!YzxG,LiÄJ2a";9D2䇎2Bؒ*dlD hV8!= ?̘ < fM 0Jl%Zd:XG=&̴i'ƉAƘ < #d89f'L69,N0a&F ;X 1N䅌&L9⅌&N`#y>j0E%ZxM E9(1C @\(Y 7\  +8#Ȋ7V8q" R( '<1a" ;⼙1'NH{ '5j '^̘ G^4℉,NHl'LpD%WNHR"P}Pbō!:05*Dɗ-Vf,)%%^N3ə:JhC'NH.űL(˔-dd}HUD (~$p&cx4 ڴK 8`;7LŪ+\0 9n$ʊd|4[ &Lq J0 \$ *&(8b"5\1@X 1N$Uj4Dd01Uŋ2N0qD**N81DY'jԈa%J,yC兑?bsI.n8є$?wx`H'CH"' 'SdEX91ڄ ( pgmYz T'G)=YƖ-L*Ç4Cf '=8Y!ɟAPx0{w'(D+Уwb Ww"P Y͚,P (P8j+ڇ 4L`Ç5lhd&B8rI&N\yK'bh ZT 5̘0q"T8dVbN'Nlr,Y@"NIla$Pq8b yK# QRh  +\X(1C#`…: ,Pr>0Q5jݛ &XD&(0 ,xD=&L>X0q͒[`~FYqb TP ZfQ!eKu1%K=E 70BDqcE2Nr2f^b,P.!Ju[ƍ55LL V)3(aGcƬpbذ@Č; h#v.Vp'z`)B E0 p,vY8aⲍ/PℂS8aD (. 'L8Q,L dE…(^/,V˓0+VD 2Y!?zLңI[yN0q&L@b T xCЙE .\`~`ҭC-?ZP% [!bS+Y\9E<)e +QJA0* \ X6"`jd 5N0kwp6 &l`YSG+/>D1rㅅ 1$AiCy|0 5X! KPQS7I̡BF@kUy%IA:Ǐ,L\Rf,ZLBYxIB (8! WX8!HjHR 94pa",Rb`h P -7nR!7n IQb#&Lx38qB bP%T At# 5y2j^F"FBǒ-Y"K .bNS"-Z(EGk +xxNJ9V#ȊR1CI7 @\)16flDRD :DL4†&\8B& 5c(̏% )ZbE'l@q%G1r T>8qB3TqB.nb@FAa\Q.=ZfDSբI9(Q⇖9X&vE sP8͋N&j$ʑ4.Dqj$_9(C*IE,NV㒨@D%JcBI.1q}E>p"54ρRh%}c.%Jl'l԰C'X8bb"!^m"+>B玢p V0lبd 4,Nt("'LCFO(2HJ\ KR ɑC)R[/u:r /I^t: &L8bD*.\Xb+0aְ6mlE{HD+\XSÄ`%N.ѢE\1a?aVpbŚ1cX(,E`R ) hŊ0O*9aS%ab6l0^4h0C+0`1GQ(Z丑cK܊c̉N>L8"F 3&Ni$5 򄥔0+`tqÉ)=pE 'pz( 'Lˆ Ohō.Vp P$6 sh;wPUrȘD7pЗ{:EB%-Z` '% opH@qN,!+P)a /JF!Dm1Xq &b"d\L)'uqHYN؁i @֬Q̔fDLW &N?a/XIyDʊstb!=z1E J|q b'Lh( &B\'F*.rp[:+AUy 5nzE1LIӧT-a#{LM0@VAŊ.0 뚸Zx )RTf# '@+A8 Ljqqc&b(R C)F,`l$Ǎӧs؁N2h9ӤG*"&r6af&N?a6E%ZF(Q8!Cfː,BdDQ40Aĉ&ҫa O k\X-P u\ #'RYō9nXbE>{2cG,Q={L0a"?aYF(N{h 9ruA 2Pa1L,#M5+ɕȟ'OFa)R5aң@@ab1G 1L8r@fM"_a' aل2qB 2L&}℉'X Ŋ 1{ WKhjgKZdq&8a9t*2Mp7 (HN"]bȳ!?J(JAJ̈t 'LP,h 'Nx""fFiN@ə-J̸-X84JqNp C0j'L8QxD @"DS䘒Č1Lu{ '^"9(dD&Ŋ4'L"H6%JjI3Jp1ȑ3&H0qiǖa &hf &xaF'8ɏ3 *ȯ0q9%`q C̘8a}<(d(9Ҝ8gș)=tX |1a"ϐ&g(1QMDL`&:8a DJ#F~FɗxF袤H%]\;bĉ&0aċ\Ĝ1')TOXj" EVK<\RSy tSd 5Xl0a^|%R(& 8l"q,l8FR"eB 2Fd(aO$ㄉ&ZӘSDRWɑ3&z6[VȑO~)Θ1kUӅ =cb&'LTp&~V ,EBRㄉq-p :3e'QP$P֠]q# "@c]N0qb/߽&f  0x14h1!y&.ca$ ?-iE|Mi ,Y &=8YQ޾{xb8q.Kʀ:abΟ;7!D H#H"'fjŒ40 !=Ncx0g'LaD_}UaĞ#''V8 6bF'L8rDg4h}Di(JdD#{L↋k Gcʜ9#Ǎ9hℹQrpK4xȡE+y` 'ЧWM82 ? ͬ'h0aB DNb &Nx 1jtk]"9zHC![jÄM>^PqB@5bJ#&L8a &N@H 3XMhÄN"8a /^8am[(JHLQeL4EcD.xٱcL.cS?x@J]Eq2% 鈉&N6A &Nxb Ox! 'N8܄2^8uĄ >^q„2qB98N2 &No}&N~(ㆋ0ab |^"9%4nXˆ&L0Q &Nh) 1b0a" 3&L j&X1 IҘSB/$`t Yc' ,8F'F'$ '3DH\@8qb ĈO,6 &N1 &1 &N0a &N1&h1 &h$E s8!ˌ'L8qOnK4~4ji 1w| DŽ >/fpsǜXe .TN0q@&N0aċ3a &b`qbG3^1aƋ3^0a$9%*j ,LЬib&vDAND]N_Lr#!%J4g+د'ƞ0a &N1 &h &N0a &NX2&1 &h$E sP8 'L8aڄOhF>En;Nݛ$pPa3P⅊&L8aĉ&L""5xhcƌ>|a& 8>&L⅌&Ǒ`psI  2V8qmq+Qǫw,N8q ˕#-Qr eH)CX "E`)R *ir &NԷ}4N 'LXz℉4(B(dM8k"lM1F;Q@tǐ-drp`( ‚!gP„&*89&:{>q„'J8mjYxm"'Lؾ- &z>O0<1b`#z 58݄4p ˟8a"'Lw"ȝD@) 3&x O4%%J,M\4qB 1Dd'H Rō75h @w)K80a DOER'>jBUOj&8 de@!m{\tcذQ^|Y8aĉ4h8aBb'NРqBdʔi8xq„&p8a 1FJ &N0qŌ/h0ŌIvFwnDDH%`VL%`\RGH .TN0AŌ/N0qD'L8bƌ'L8q„'L8bƌ'L8qDOPmD&`Ö M8a3:aL%Jz׆y &b|{ǫ&L0aċ3^01|/fxAÄ /fxAÄ /fHD MQ>fxq„'LH8a ĉM,fcȑ%Cqĉ,l СE6a 4N8!K 5rL>QVh8a ,B%?QDH=DK3"0a 'ďo i` &Ņ ,N?(( &8A &&Naƌe@2ņ 0aÈ&L0*fAΜ'N BQCJM8aRMP5qVZH" bO0a&֮=AÃG 'Y~c!?tdUϛ$2N0qd'&\ &6`СM&͂ Uh}l'f0aۄ (dȑ'L'N$ʕ51 ,4f'o7{(Ɠz'֟0&gMo &N0q 'L4lxB "4N8q O0&H`!EG)ZL;h8qDPAO0q &8j&R=q [O0 4N0kB2L8AȞ=&N5qǹd 0+֘GF0ajEM/,L4> ɧ|و Otlb'Hqĉ6`qvlٳOаMD4N0 ÉADrMس2[D0"d OРq}z&L8AƉ&L? 'Npϑ#' FNH}/4L6qb 'N-H޾0! 1N0as&NxB &NxB &N0ađ&NxB &NxB &N0&8q„2^$CÄ2^q„2^q2^Ä 2^q„2^q b$℉2^q(&L8a /^8a /^8a /^8a /8s6-5+&+&8a qk 1l԰D!?61Y1a O0qti4hPuk׭M81vm۷mӠqwo&L`b'` 1NDqzu'h} 'O &NOO Ǘ &d\L hhӉX9a *s0AфOhфD^I&L`򄉗0O0A&r<ӄO'JQHXʴ P8a'Lhz&b{„5l0['NX9an'L{ 'L>q„a'X #lreF{mBzM'L& c8A'h8a ,pN'+?a'LH~&Nh?a ,NO 'L?&?q„'8 'L 4&La %NXE'Llx£ O0qI'N`R v̜[+stji'X𱃅I.5a 4pL YA 'Ď%;iծ5a qY8Q'h=q &LƉ&L8A 'N0q ,X\ E&]i'N8qe0q 'N0q· 2P@9sg/@ddڔi܋W0qԋ20q 'ԟ!&I1,ĻO 'L8a2^q„ >^q„'L8q„2$℉"M8q 'L8L'N0qBƋ2N0qBƋ2N0qJma)6mlfȐO&r+ذ_OxA'֚8[&N=a PtD+jdK6cƂl6J6cY'Ly1c &L8aĉ&LH2cF&Vf} 'N0qŌ/0Ō/N0qr'L8bƌ,L8a,X0 >L7q„/fxAÄ /fxq„&ǰQ` 'LѦ0$̈tDD)Vx\P11 #O&xxpO(Qb!,v0D&8q eXcLP ˴)Ӹe:aD'1bpЄqą 2&Z~ ٴkӠq 'N`q 'NРq"&N` '[nܻ{nĉ,Xذ"= 6X߱&ۿ?O(&:q„ O0q" 'N8a 1F-@d%_ w\!AN=wC *5*CR*h Uz]O e͞ 'ܞ07&=q^'˂ 5jذQcǎ&Ld&NPYfΝU8aBh&d)Q&\8[6 'l0a#%c灂4vҤcgJrkPXKp(A]s^/T@ ݟ_ O0_ &4a 8ab!'L@xb"E1Xبц>I&O˖._D6M0%ܰ0!T艢F5a #%B*u*ժVZ5"^Aٲ&LHn=aݺv֥A߾~0q" c,N,ل %.cάys *Lm℉*,A!Ä4N-{2Pȭ{7޾ O 7aℌ/d0a℉&N0qBƋ2N0qBƋ2N0qBƋ2N0qBƋ2N0qBƋ20a &N$Lh,j԰"5v8q &@4H 'QTYˆ /aXPb'L8 ۷M0Rwo߿0DqO 2!&X1 &NЮDw߿@Q|yѧWz2L7q '^̘ Oh '^̘ 4^̘ 4^̘ 4^̘ 4^̘ 'Ny 8O @Y 'X0 (JHJ(Tu3faĎ$3f8aĉ&➘{„]2P˷߿ , O(6aℌ/d0a℉&N0qBƋ2N0qBƋ2N0qBƋ2N0qBƋ2N0qBƋ2N0q ''7a>vr:YĈM@Qӗ@„OxB &XxB &L8a M,4!E %NXEQ0G!E0qI4NdI 1eΤY &Nc AwQÆ ,N`Ԅ %NZj *LlW&L [Y&@1 qΥ[ݻFf  l/6&$O>qe'N E m´M6‡,X`QE >j` M@QFP,gndF Q0Qz&k?qw'ě oy&@a ϧ_T@&aĉ4@<\̓6`)ƒ$zLnBōPaBr(J M`!;ƉڵM}&~Q q&N?a⸉ʗ3Wn'LP~:1NpCϰ6HxQ%, Fʓ'R?DJ0R C JzL4 6t)JG1s -Z1XÄ1N0 /jP0q %x4BEEPCUAH KQ0 %VE!D,0&Ȗ=qm&ز=qD\'eAE^6ERG*1G 0RH $'aXD ,dTct8T6}uj8NpZOA*}qT /mhcÆUf` eXCDt*P~ ۹w݄ %ȗGDz*Pp O~ 0qƧO,X@ $_@8Hʓ'RXF+v=b,XҐ2dHݗ6z>MzK =1hĉIjP0P %>DD-^4E Q0R %LD!J'N0qŌ/h0AŌ/N0qP'0 &N1 &Nz!B4L|Q()f"LJJPbAL Jf  FX´ITb$)PAa3c/(m04c+$zوaBu ajP0[ %lFn޽}6E Q0\ %?G!t'N0qŌ/h0AŌ/N0q 'ܛo &N1 &N4! >0q ?OQB @\)QB+8d+(&^Œ)s&͚/0"iƌRR䡂jF IP )ª CbUԠPab+W(J BfϢMkBnߢPab.](J͋B'0qBƋ2N0qBƋ2N0q '.0g&NxB OĈA!mB[Pa"l(JؾB 'h <ć[G4attߊ`$E .\pŊˏwŊ۳wb.\߅~+B.\@PB W<|B R<֓eeP0R %LDJ-]4E 5Q0S %|4"P'N@RMM D ƌ]܀Bdʒo\vB.<daB ɲ2(T[mPaBn޽}Pp(T@\͝aBM\7qBvM|7qB ˳G,ܻC>/XX!R$ +Ntqc劖+\tb6oȹO+Vp.VHy 'ʠPab*U(J`͊B^ kBfϢPab-[(JB'ͫw/_&Lc6l`cDo'01ĉ,X0aBO$5N^Ƞ0Oژ8d.(! .( .(EANƍy8cō+x8d.( +8cō+x8cō+x8cō+x8d.( @01l2(TXTPaիXׯ(TKVhӢampOk&8&N>ap,X0a"F$5X0aFAa1q" +\()QB @\)QB @\)1CɊ.V9qNJ7V8qNJ7V8q" +\()QB.V9qNJ7V8qNJ7V8qNJ7V8q" +\()QB +\bD'ʠPaC(JL 5nh!EPaI(JdB 'd4Q 'L8qE'L 5q&Lرʼn1lc <  UVX!L\Xႉ!L\Xႉ%„YJ UVܸ PVܸJ UVX%LVp PVܸJ UVpJ UVpJ UVX%LVpbL XҁB U(Q: &oݻ (J'B U(= &䟠_߾}'N@&N4aD ,N8Ç,ba<I +\(J+VpŊ+\X .\'Р>]Xa(ҤJ25ŊRYD &rUذF(k,ڴ*)- &U޼(d(|0a ,b`QG 'b؁.E`GJ.\h+\Xup")@\'oXt+S>+pŊ+\w ]h}{W` @Q` gAqaB QQbD*LTE 0 #I0iDJ*Mpy" 5h8a"O5xaVp)R @Vpb @VT @Vpl7nbEZkWpbE7Xqo^{bE`@Db*Pprdɓ);FDf*P &N8qujըMp 'bذmŎӷJO? …WpbE.Xqu.VtwbExŻ0}zٯpbE|.\߅Ѕ@„…*Px1ĉ+>D„ƍ*P8q„'L8q„2^q„'L<􄉡1XĈBƋ$!AR#=q ߿}nD&L`P $_)aXŊ@XŊ@P9n? o䈲?G(Db9p.VHHŊ@XŊ@9F7V\ŊLtPa8Tɳϟ@u8aQ(J(]NPOH=ʼnWMhz℉`Þ0A&ҦeÇH8r )RYŊ@XŊ@XD 7rp 72gŎ(9BGc'J+Vܰc'c^ᢶqb +Vx9rX|+V0сBسkνw*PO &N8q„'X8q„4pq„ '$Xp w$$m|ϓ0+\X!W I'R` +n%M9uXAW QG],u Q]ZU +@WaŎ%[֬Y(JeB /:a yM8!f1'Lq℉'L8! 'L8q />X!a6l(£A+\f"D+V`"D@H#H7n#Șvӥ vӥ vrӥK]0Q.VT  +\0"+\0" @+\ƒ7n$[tPa"ƌ7rѣ %FD3^0a &N0aF3^0q &N0aƋ30aƋ3ĉț3^# 1p…%ą%X'xȑc')G')G'F'xp…%("ȉAVhD !.q!D %.vr9rr[Ra9ҧSn:%sGA.0a<Tpr„ +'LЯ ./N0q .K0aF5#%ZD*dؾ۶ 8TBUBrDQ!Ë<a W=ń :u09τL:dg%&12̔!Lx̔!L9sfC8e&u,a[|dBN2LL2!S&- 9sf@Ll 0KfATPEEȌMwU^:g ]z3XeA{ 5Ԩ)tՑWG:MB2et@XБBd:R\ƬCs:<NBheL@j[BG2:tHCǒ!! NETSCAPE2.0,((ݙlig՛UwRd鬎[mX)^2헷ͧϩk<)E^xl"NPF|irphҢFFGvvu,Mn676 &t/ Q'')mjimUUU'F荕6tx 847NSVmLX¼xgjkw)*Lz'GImTe-7nOg3Fu&R'$#0ײ3v6Dn%GC6EJTs);ȺqpLWfcWxv|v*VVdnUUwƌRƼ(+h7F2{ȻĹ/II;5lZW}הBH(/.M7RhjlR0K:QWdUoM)Mjwa$jE*|q(ounUzP5f6j{Z(ɃgwM~aUvЄ՚J̝ԧkʼnqng5QPW` i% e#++[;gE!RgR"4B)OS!i9H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ L;ǐ#Kp^:#F@#F@C8t#F@Cw?@v`C80Ё!F8pЁ!F8friv'РB(ҤJ2m) ~>q  Ae|dE'd!C~2d ':p2D! x@x8!ibPA@8D!G&#<TU^ŚUV@x e͞EVڲ'@xuAC/}UxA'8|4<<~ " XÍ*,BĠ Li@%*@qD TĠC>xA8_xFs8!C opݽ8Ax͟G/݃A|ǟ_ < P "Lp!ÆO q".bb#*;ʼn"@x!^:!1*<  Pp"*>@q!Nta'4Z#߾@x, #Nx1c'@x,/cάy3Ξ7a4i8Nz5֮Qa6m8έ hh|| F!FXa;P p8!C '@xP!n?C]'X T|#)ψ bŎ8AE@Ci"Ps@! <1p=qwo߿ǑysϡG>z 8 AN|`CNtP4nG!E$YI@x`1eM9uqO@x ZI&Ed4>t8c Pp D{@x1Np` y<}b#BCuŃ Txi1Dx1NPy'hxaċ*Tx MZUk8̦}"ܹu " q8,gsѥOA|ď'_޼8gA|P~2Tx"^x(#<"A|4g"C *W1<Ќ!Év Bzat#hR֬@x+ذ@|`ֲܸrҭk.޺@xP0Ċ{P@xl7kEjtƒ4Dpƒw1n,Pt"$4Lj!2h`4b⡠P!XpC<A~!bĐ ?p!6CD)V?$H4yeJ+YCL >py ;yӃCR >ppi(P8сC<ЁC<4B@! 'Pp}xCpTx0~yrT|WCv۹w|x@x0~|{C~@xЃ@8<0!,T`!"/^!# *Xp"Ĉ!HpЁ 28| ӥ *dpfzЁС8eB L:}T! p8lۂ!ܹtڽ7 < ?8Ō=! !C ;BD?`qą!̗w!;p~B{ʛ@xx?@|? DPB ?Q",^F=~%?R%\tA&4;ܼAg=9: ѡ:U*^ŚC~ЁX8퐶m9tW < }?X`…=A << ʕ-_ƜYfΙ?Z4Lj֭]ڵ?[7|݁ps@r͝wA:9\ޡ;|A<9?߁Dݿ|w~A|pB(q8`A| r$ɒ&OL^͚@xȩs'Ϟ@| t"ӦL;pʡUVva+^9a,f;tvm޾a.va/:,aw࠘C; >pȬ?-N >p-{6ڶoma8 < O|9s >p.֯a;8t@D8t/HЁ ѡ&䰐C:Db8dЁc9t9r$P䰒 <Ĕ 7?gO?=h <$U OF:jUS?+CYgѦo?0.!D8pЁ8p "D8pЁ8p "D8p "D8p "D8";tఛCЁCw఼C:BDױ_Cw >p?ѧWC} >pп9H ~ᡡC8H3j C~ᡤI8\ň!:pЁM8pbĈ8p(8t1bD81bD81bD8t1 h;tCЁݻ:pػBÈᡱc8H˘3kCᡴi8^ͺװc~۸A| N8(_A|@zu/FC9tC#Bt:p!Ĉ!Hp@"#BD#BE#Xpء:tcDЁɓ8pbĈ8̤99u < %ZQ >p`QUYn <% i?[q= < wŇ8t`ܘ"Bс8pЁ"Bс"Bс"Bс"BwsЁqwмwC!Bw@x _{{}@x,h „ "Ĉ >ph7rFʔ >phefvi&: ѡC$:tԨ8t@D8t耂D8tl8-ܸrr.^z >p(l3n&S >p3ТG.-W5 <Юm6n >p‡8;phCSЁ:pCw<8oߡs>~ ;tpa„@xp)~cF9zCH@x0y+YtfL3a~gN8C5K~jT8TzkV:pCcvm8uۡs;tpo:ˁC96\Cw2(W͛A|H6}8vٳA|pwnݻyCr@xpzt@|pwCxɓp= :p~|:t AC:HЁHЁ8X쀱:rȡ8p2%Z3& <ؼ p8ۻƒ >pA@ DP <<?QF=A p+ vͫ׃ >pH8q;t!Dt!Dt!Dt!Dt:pAD":pA :pСw C:BD:BD:tC߻ >pȯ z8`A*>pP!bE1fԸc < '?eK/=f < ?}vʡC:t AC:DʁCW9p谕+:pСЦMˁ-oƕwrС :pЁpaCc >p<1gּ@Ci >pPukׯaǖqw!@>xq!NpPϡzug΁{8ߡ;tఞ}s?Cw;pHCv8H؁ŋ?#B<ɓ(S0?@&rɳϟ@ƒѣ >pXʴÉPJJÉjƒׯ >pKvlhrX˶Cpv8ۡ߿ Ё:pX̸C#w8hܡϠCƒ >pXͺÉc˞MÉrƒ >pNȓ+_Уسk^Ãs}$HtCߟ: $X@:,dȁC9pP": ѡDPd   aB 9t"(V؁CF8t:p0ye+;t '8 "D8!Dtp '84uS8kV[vcɂmZkٶun <Ե { <6 ŋ7rd)Wp3͛9wChѣ;658vliЁDxsCp?p97wzt?p;w|xɇCz*X|p~|gC~ >p'D< Q|1*Z$!DƍBHp$K !!JD|8qB(8ؼ⃈">|8сС(>r':px T`!֭\z d˂!ڵlۺ} 7 <ؽ;B| 8^#<> ŌO9r*[>!Np DK8!!@~ٴO  B< q'BA!NpܻP"˛?^ۃ!ۿ? <A@ D >D >p=A pEA << U?UV]~ e͞EVZm~A\uś7/`*>p@ A*<\ƬΝ?ZLj*>p mA*<?\r͝?խ_Ǟ]vݵAx͟G>=ܿ| >p@xH~a"E8`A| rN˖@x)6o~a'Ϟ> *T("Mt)ӦN2ժVbͪuV8 fA|vݺ@xȫ~~a0a8 NƎA| y.c@x-OPa5֮_Î-[nέ{7޾Ə#O|r8@AU|}WTxH^Pa>}8A`*<$T?00fCGA9$I8TeK/at7qԹgϞ >p:Gi pPon < ?00'CcǏ!G<2e8dּsgϟA|"ӧQVu!Np=Dq8w!@A'8$W~"4hO{?4@qC{'BA!NpпDAРD*<Ç#JHb'8hȱǏ Cć(S\ɲK':pI 8s !OD|8q⃈(8(]⃈'N|XQ|ŠEA'۷(>rPpBN Dw8ǐ#KL2k̹ϠCMRCbs@6:tC9NsЁsK@Cs;:@ӫ_Ͼ˟Ow 2dPC:t '8L "D8lر!DtP '8 "D8sЁ9tH8p!:pС: ѡBɓ8tXɒ0c@C8Ё@rСѣG9pЁ8HJիXjڡW:+ٳҪ]ˡ8ȝ!xCC:pLCÈsX̘C#w8hܡϠ;t@tRkcw8ݡ;t@xȏsСyss>Cسw8Oӫ_o8tO>;ϟvA'>,dx$NPb5fǏ:p YC)Uv8̜&9;ٓO:p ZCIv8LU8tڵ+`;tPlԮЁ[qΥ[]s;wC$HtC8tC$Ht3СEw ́C:кu:tC8o: '΁C9p9Ou9lЁHЁs{9pP>:p?v(h 2Ĉ8t@E6r#Ȑ"G8dف"BсvrC!BC!B)Ԩ8P*VZvC:BD!:pСD!D!D8P`:pAD":pAD":pСfw`C:BD:p(^Cʕwh98p "D8p "D8p "D8o=ӯ߁~:p`:1"D:ppȡB$B#IvpdXЁC̘8pbĈ8p bĈ8p)8t1bD81bD81 c;tpCزC#F #FCw18t1bD8tpr8wЁC8pbĈ$8p bĈ$8p bĈ8xpÉ7ށC:ppB8tЁ!FA!FсC|;poCw@8pbĈ(8p bĈ8p!#8tbD81bD81 4;tCzC#F C#FCTv!k8t1bD8tmںЁ\8pbĈ$8p bĈ$8p bĈ88~ 9ɔ+[܁f:wC:BD:tC:BD:BDċ!9;px!zt;t!Dt!Dt:p 8 "D8pAD8Ё rءD!Bс8쐲:pAD":pЁΝ:pPE;t!Dt!Dt!DtVXe͞EVm8t7.^8t@D8t@LC?-_\=sAh:tj\[6ln޽{sС :p@Ρ8p]8t@D8tA|8A8t@D8t@D8Ё8 Lp!ÆBa"ʼn.bЁǎ:p)C&Ova%K'>ynsg~ЁѢ:pHӦN9@*Uj^׮rCfϢEۡn;t wnw^: :pHCwa2ʖ/cάy3>a48Nݡ֮;t {vn!papƏwa98@ޡ;`Ϯ޽wa9Oߡ;t ~sЁv0`&찐B:DCE:pиCAvdI'QTeK`rЁ7qrЁgO:ʁC$HtCPjU"8d_rЁlY:UmZo9t;n]t9p谗/C$:tЁq8t<1sС :pСP氚uׯ9pЁ8pЁ8pЁ8$WysϡGށCu8p "D8pЁ8p "D8p "D8p谟CUxHP9tC!BC!BCBvفIRvC0c@C8Ё"BPBс"Bс8pЁ"Bс"Bс"BсЁ߿~;BD:BD:BD:BDCMӨSwC:1"D:p͡B$B:pA س;8pbĈ$8p bĈ8p~8ߡ Ёr`ذC#vÎ#$[K#BD#Bt:p!Ĉ!Hp@"Ĉ!Hp@"Ĉ!:pЁӧ:pZ*#F #F #F #F ]ysC#FC9tC#BD#BtC9Pk"8СB$B8,_ޡ;tPzoЁw:p Ovdї%^$B@:p(ȡB$B$B8$١*Sv1bD81bD81bD81bD2m)ԨRRЁ8p "D8p,8t"8t"8tV!9p "D8p "D8pЁ;p(]CUwh݁lfw`C8ЁvT͗%Bс"Bс8pЁ"Bс"Bс"Bс8` "8t"8t"8t"#I4yeJ+Yr&hC:tCP8t@D8tpVU!C[9p,: ѡضm.s;pˡC^{CwMK8t ѡ: ѡ8wCh8t0}Ysvlٲ9Ԯwn8pЁ8pЁD˙7wztө/;8t|xȗЁCzsp^H8C v! 2ĉ9Xء;xHh.]!8|١4;t3gzЁС:p8RL:mڡT;t5kz 6رd˚=ۡl;} ܹ:p{Eq'Pp8Cw!8X!8t 3Ѥ;t:uլWsxz Kp4qC{w!8?ޡ;t=z[Ёܹw!8?ߡۻ?wA  C$:pȡC:pQc$:|H8t@D8t8쐳:pAP:EʁCr@$Yi rС :pAZ:W8t/}vE8t@HЁ-sYfΝ=!DtC;A6;pݡDpBсr;BD:tC:BD:BD:pCw!DC!BCr (9p "D8p "D8pЁ6;pɡ~vC;vCNr "D8pЁ8p "D8pЁC+w.ݺv%bĈ8pa8 Nܡƍ;p!Ĉ!8`bĈ$8-C#Bt:p!Ĉ!Hp@"Ĉ!:pЁq:pHB$B:p%Wh8pŊ(9t#F@#с"ЁCC:p(vh8ɡC#Bt:p!Ĉ!:pЁCO8:hQG&U!Ĉ!:pЁCժ:pкC_vC#q#G#Bt0n!FсwC#F #FC9t܁Cg8pbĈ$8p bĈ8p6.CèVp>\x#FC#FCׯw΁;8߁!FсwC#FC9C#FC9t@ŋ3jȱ#!BC(9tXفKbr١>xH1bѣ:BDP;HʁC!BC!BC8tX˶8p "D8p "D8p4`ო@^8HLC8h "D8pЁQsXݡu;tipݡ:pAD":pЁs8p "D8pЁ8Oӫ_/8pЁ߯b„'8,dؐa$:LPE:t AC:$ɁC)UC(:tM89pXǕ/r(ENI.e8pPUY;pSD^8PC8t`ۖ8pЁHЁs \aĉ/fqȑ%sLe5w3!)J01i7N|` ew Am:pͻCwq;,yKzPPÜH*rկgߡЁ}:pI%v(XC.!&RЁF8p#Ȑ"G, ʔ*9d%2;t`%Jҁ!@-bJ;`ѲT:pZVZv+ذ`;`lvm"@#(2܁:t1d:plCK|YsТCs(];phCgӮm6ܺw8Ёʗs9(⢄Cnp.BU`$h!C8t@C; IЁDvp"(r!HEV%Zҁ #]H 8f:ԴفC$:C:piҤK|Yj8tz*[9tC$HtCk9un\sֵC޼rC!B|C!B 1<q HwpaI`q27;pC; #D*:pAD":p~zp?8p J":p8!D8p "D8p@b9tC$;p8d8t"8t"z 4СD ڡK;p!Ĉ!:p"Ĉ!Pp ̈0ʦ0BZ*<}B:pKB/^+!Pp8C:xŊ-HZB7BѤGƒZ8p&R0EzxE:tXB$B$B:p8Cwx!:tD#Bȁ#FAB >Q,r萑ƍ8pbĈ8p@bĈ8d3C'cpA@xTE9tC*<<EbtUk8t`C[ mQ1"D: }s8p "D8AD"8 bfldH :,>q >vɁC,@xP.%Z s&8p!DNEP'vŇnq4Gϐ*tC:t,Pp8#8~Pŏ F0CA0a &(&\<# dyYᆑ&J$%Zb$z*":pp6D!ݻyxp;7yr9cFt)Rᆎ +R1G+R1--8Ō;px 9n$ 0 @2:t!0`0QB=aL !(:<СU^ŚUV]v68 )`H1F :j̘Ć A:j``51O8$i;|:t(=f̨1c6zԘQL̘B Lx"bp@A9;t=z(`<\PMѣG)`0A)_D"D|8r:a`i3`Hab)Vab <3aG?d C&Mvr%˖._Œ)sfnd)~pabh:lؠcciN7=f𐔊׮7Ximẍ8tс2rzH7E 6L)Vѣƌa0d&Ǎ8tLC:t@с4/K !0C 0ࡄ5lQD &=LR2%5MRGJ )G8Ty&J .Tv9G 38p ATXpCN %ZXYQcF9sQIsё"(dqaFMv|C!BC(1XpIdqQ-\زbE .4"Jఙs@sA\f NV0 ifQC @\xPt఼CsϡG>zuױG4 %<7| McJJl̘fN8V0cJwXᒃ9p0xؘÁ-^,Y DĤ(Lx ӡ0fqġ0`Ԙ!&`01B 8t1bD81'@C%JxD )L"@xxЁ2T("8:t⢄8:!3z:tƒ;:pEQwװc˞M6 Xx7\%</B/ra„7:(3c %:Xa nP%sY1)La ,Z|A#ln[l01H8VaCIJl"H,\!Hp!Ĉ!Hp@"Ĉ+,NQ"A\ .JxpEXx:p+`;tCJHcqX(abŔ0(E8,Ёc8L\e̙5oެ1e%E"a (cȔI6j!F1:RHdCV"(R̜9SD 5t1R˗Lز">0LXYI3$Enj: @0V4H )R@M:BD:|#D-J<I*KxhٲD ^@`,>tР`2|("iȐ⢄b8c48p8YE ?XCr;pk.޼z˗D VDKJ(%Q򣅇)tذcE 6бQ#E |lHزoqfƑ &vab̔K^n 3̘F4v\EɜTer i$ )R%8ppdƌ=l0c &Lc 0x" 2e,[| 3̙4iЂDN|8qƑ(8=J ?L1Ɗ0``b#\Hر1DÉUx{^,YBǘ0Rd)LQc &`x<#dgԨ!:pЁh:p8}#-\.ᡄ %t 7VLHE0fNV0‰9QjH… &`HK v:pAD":pHEp(kCjv-\CY"+R(D)L6b 3fHa" 8с̚;ƇТE(D SH8p8ݡ;t` HL07Lj̀a=E &"E&`0a~w=ӯo~8`v ]X" )fTq)A>tx#;tpeX䀢J')LH" &\D&R" &Vr*S9TZ'/Zt-Q„ 0L0k+Va 8tpnЁC`:ppŇVL&=zHF)R cFJ0mb#9nppvlٳi׶};v8pЁ8pЁ 8p G )jHq{3jHG2ȗ'}z:t AC:ԷρC HJXpŊ+ H0)0D at:t E:!e,M4Q"fL)RXD $A:p!P:t AC:t@C:X5&f01F:V8vŊ5f0Q t )CC 8 !1D!D!N@!eƌ)\hbE 32f2jۮ!78p "D8pЁC(Ɏ(+RH4%J  E#)#;pADP:p@"KxXB@Jp" %<`с8pЁ"Bс"Bс8pG"F1.ZH '8DÄ&;(b :tUV]~V,8t1bD81bD8tᆑ8t1bD8$bĈ8pЁCPq0`(0`ҡÔ&JrH.ppɡC6o̩s'Ϟ>v C:1" H1"D:pp JxD-J]COptC;pAD":pAD":pЁC9$a KDw@;:pD ;簞}{Ǘ?;pЁ9tH80bŊS̘"Ŋ-+`rǏ;СRC:tC8pJ @M5ᢅH]9iPv@CX;p D ZKք%<(Q„)8p@C8t˗HЁ8p'(a„ MHمg%LЂ?>Jx(QEJ ?~p@U:p|sf͛9wC#Btժ;tu:xD &JxPDA:tг=z8Tޡ;p!Ĉ+2: ,\p<CB0D:p8xC !D8PXÃ;Ppء$;te:1"D:pɡdPD -XÄ%FxxZHP^x!ċ2wсرd˚=6ڵ$B8صۡ{;p!%RHaƒ&ҡ%$D-@PC{(a BÒ@Bс~ p "L8t(qD:xD)LPE&OX˖T ͚6mr١~pC$%wa= _~)a B0`'8$ЁCC:p8CŊ0~#MDp%< с/arЁfMp찓?9t( .<( 80uj&"8dځ+_;lYgvm8čہ2TxP/_MCc:p$>B@A>XP ;p̡e4ogСE48tbD81bD8C9~x "D(NC G8L>C#BD#B;tо}:x>&Anp@@L!FA!Fс8p C':qJ1ЁT; !kV\9t X <!l;a>pt7޽|pB%L(BD?<8V#H*wC9w:ѤK>:uYw!8ؾݡݼE8ƒ\X|x ԫw!{!|8t`1ƒ"78@!2PpϡCw؁@ P  [C9,:p@!BȑL~RJ+?@!%Lx)|zQ Ev@ARM>UT:pC]vAX4ćB@x+w.ݺvmQƒ":a0a"8p耢C:@&ѡʖ/cάy3Ξ;BD;pau]w-?JxE:D ƏWÉ1DtC:`a8t"8t8!"Ƌ?Np8ECv"r谐!NȈCE,:pAD'8E78|PeK/aƔ鲄,Np8#ˈ":pAD":p:jUWfպC#Bt0,g9Uۡo?( 8͋bG q#Bt:D0yr:1"D:ppD '8|PCWFxEH1"DЁC,^(Qƒ,:p@"ƈ2:E0|yѧ/"Ƈ8%b ňIp@"Ĉ!:pXȰÇ#JHD#BtC 9tɡ$(;pXR0_CN(ᡧϞ4NtbD8tiFC#Fk J8 JPqŃ,:p@"Ĉ!:pwop F$#^8hƒϠCMt8>Db@AƋ1Hp@"Ĉ!:pNȓ+_μ!DtFرw;s/-XtÉ)ExON!:tPrC!B" !^xqÉ"HZ1,>t!DtP&99P?qv7Nt`<ֳ=|w`b`Y[Zx0:ppCD9Tf#|q#E% hִy*<ٳD v !F KjVzkV[vlXȖC:tCs;p+~p`8qŋwC(1ƒ(9Ӂ(Pt }@ٳA|pwnݻ9|x1Pp0N$><4(:tC(:t|xɗ7}zٟ "D8p?8t0D8D!" >p Lɏ<9x!$#;pA>Z(1"":pG:P!9p@4):} 5* 9!#B82^$B >QD-^Ęb#FC%9tC#Bt'hxx!N;Zx" E;tTi:C*pW^>Xp!Pp@ܡ'hq#bD#BtZhҥMFZj֭] "D8pЁ8p "D8pBDTŎ<q9|A|;t 1|OQ B:pJ'8AU:a!C8@(q"E@xȨQc>vᄈ"H`AH":pAD":pȩs'Ϟ> *t(ѢFvHNrС $:pA^i| D<qn1Zx(Q( ~;"@xH "4<@ ʖ/c?qid0*aG8t@ѡ:@ѡ޾.|8;|9ΟCD֯cޡ;t ^|: ޟƒ;:pߡv`8$D*t0C1,>dI8T/Ot0p9" ?vH2C irpPCOF:jUWF=DW_;,'8Un;t0no@@01FxЂ:t0r0g ?ZxP ;tచu"bhpCo'B>< ǑysYt0}z#pۡ/:@ѡÈ+^̸ǎ?@˘3k޼YCЁ8p "D8p "D8wE [`!D:BD:BDƒ,!PpX!t@_ %L >p X   p`ڔiQ9tC#BD/Xt !# ԮU"ZxBFH1" H1"Dw`ƒIPpLC#BC+\i >p`e <ݢ$^$C/<,s:p!Ĉ,8lwŏկg >p_~9t#F #^p"':P$AF1ZxxX`8pЁ!F`0Ċ3n ppi.#8pdE JpQ7gztөW~ Bɗ7x#8`*<8~ ɔ+[̡C;@q"Js8">ٴk۞}㈒:8B BsЁr8pÇ9=;{p':p8ۿ:p"DX:t0a >QD)~AF8|RH%?~AJ8Llr C:t ACE;吔C>AT(:t5k~ˡر8t@V->W.śW/ < PC792,_YfΝ=Lqj֭]{ ln޻;BDE!D!Bd8A{ϡD!;_|Bс;a ?p!B(q" <`H,bC&O"8tCn̩s'Ϟ>Ѣ NpHt)ӦN&=ժ >pȪ5k#F #F #F C/^$C~ہ!Fс:t y!Fс>Ё@xH_Î-n㦁#Bt9t1b ;t ֯cϮ};? ~<ΣO~=? >O"Ĉ!D#BD#BE#B:d8t1bD8t&79Ё!Fс"CӦ"x: Wfպ q#BtC:tE/Xpۡ8t;ďρqC9H  <(\C,BC2j "IBvIɓ(S\ɲ˖@xI8sɳO@xJH"Ё8HСj:hʁC$HtChr[PtCx;p_:pܡ0È;(V̡"K˘3kϠA8pk:@v۸9ͻ A|yKN8hA|@9t8ȟߡ;߯ ЁA8t`؁$NЁE8pЁG <$)Ud 1e9ur' QI.ei p`}Pt?@: 8t@D8th8pЁC$HtC*9lefҜfvr-j(ҤCAԨvjUZ;t+ذbǒ-kֲܸTxk.޼T|ĉ?!ȑ;Pr8t"8t"8tC:BD:BD‡sЁ;p :pns;A`ֳ=|:|`C  4x <4t?pcF=d <4 +Uv1bD8tpfxC#F #FCS9tC#BD#Btp-ضЁ!t сCrC` 6|807ЁCdɑ;p̡BѣI6}ujթ?6hCnݻy?p97g%Ĉ!:pЁC:pB$B8Ё!F$B 9t1b8t1bD8t!$*<<2ʕ,M!f49ؼi:p!Ĉ!:p84ҥL:}T! p8lۂ!ܸD!:p!p;t!Dt!Dt:pAD":pAĎ":px CiẃC!BCx!̛;;X!8xЁ"Bсۻ?@x@  ?Q",^ء9pЁ%MJ8t8pЁHЁEr@RMvʁCU9p萕V*<|VXeAmm9A.:pA/8X`… 6ƍA|Y,_ƜY8|ҥA|Z:p[vmwA8ApЁr;p)&Oa%˖-;)͚:pȩC>v*t(F;tti:@a*U:pȪC^ bf?Hv-۴N b.]Ppȫ7o~a#Nx1Ǝ; >pȬ?-N >p-{v8taw8t.Ə#On8pЁ8p}v;ta<8tHs/>;t?v сCArЁa9t8q"1fԸcG?0$PCK/a7?' CѢrC!BCvځCWv0C:BD:t0w;tÇ!DtC:t!Dt0re˗/!ϟAs "DPw58Ď݁v;tఛwo߿>\'Cs@x>zu@|ఝCyw=8t1bD8t9ء;p!Ĉ!:pЁE8hءIFсRr#F͛8s 8JC#BtO;t@jfׯ`ÊK, <] p?@ݻx= < È'Ёc8pbĈ8ps8ݡӧ;p!Ĉ!:pЁm8ݡIсsC#FC8tؾww@CP1" :tC:1" 8tP`.ЁÇ8LXE5n!A|PTdҥ8̤9A|A ʁC!BCvځUvеC:BD:tCqv!Dt:p !D8p$w28t"8t ]"Bс8P:w'^qɕ's >p^ٵoďy >p`}8t_: ѡ@:,h 8t@D8th;tȐ8tJ*9t@ѡfN:uvgBC$HtCRrʡ֬Y9p+ذbǒjA|ҭk8A|`0b:phC'w28pܡТ;t`tV5f`mwЁ:p(nxʕw98Pޡ;t{s(_׳o=?`> 4 ~bD8Txb8vЁCH:p0yC+Yvf8Դ':;B;5jCR:tjVСZ;tlȖЁCZ:ppC\s9Ե{o^{{ q <4vrd >p|9th:p0u9tp8pp7xCp8t@D8tpCtW^C8tND8t0w~|sϡC$Ht rС:p!D+Z1ƍ7~!H8<,[|4k~!N8,>t$IDt!Dt!Dt!Dt!Dt!DtÇ!Dt8096!q9t!Dt!Dt!Dt:pAD":pA*":pAD":pAD":pЁt8p "D8x>˛/A|?ۿ?8A B I1" H1" H1" H1" H1" H1" P1" :1" M6ЁT:pB$B$B8Ё!FA!FA!FA!FсAD":pAD":pAD":pAD":pAD":pAD":p."Dw"޿Ёyw࠾C:BD:BDv"8tP"Bс"Bс"Bс"Bс8pЁ"BсCO?:hQ@xPO~jUWzCW@x;gў-: ѡջ7/ :pЁpa; сCHt0C:d́3ACi8t@D8t=qsС :pЁxq:$W΁C9p0:g簝{w?^ЧC{'B?~} Bట=&ЁÇ:pHC3v8I$RСK:Ȝ)͛:pɳC@v8(]ڡP;t@jjЁׯ:pKChӪ]˶۷pƒݻ >p˷É LÉ+ƒ >pLyr1w8ݡӨ;tub:p͛C9p@8qȓw8Hޡ;pΝC‹Ё:pXϾCw8߁$XA C >pXE5RG >p Yd)9pЁ8pP&:@ѡ: ѡ.) rPժUY9tځ8pP,ԮC$:o$:taĉ/Cȑ9pP2̙5ogП?P4Tfkت?P6tݡ:pAD":pС:pAD":pAD":pС:pAD":pСwп?9$؁"Bс8pЁ"BсFr,Dt!DtC:;'B;p(ڡD!:pСZr+ذ`?`,ֲm-ܸk?`.ہ`8pbĈ8p18t1bD81bD8t`C:1"D:p͡nuw8t1bD8tC:1"D:pΡB$B8Чߡ;t 8pbĈ8p"(VxcF9nCH Np0yeJ+Y<CL >pyf;9tC#Bt:p!Ĉ!Hp@"Ĉ!:pЁCX:1"D:ppCsv/8t1bD8tpC:1"D:tpB$B8nݡٳ;tpv:1"D:p0Ρ˙7wzt?p;w|xOp=طg߁C|8p "D8p@8p "D8p "D*v!"Bс8쀲:f:BD:ɁC!BCL9p "D8p "D8pЁd;p8{Clv!DtC:t8 >;ɔ+[Y:{Ѣ;С: ѡ:pС: ѡ:!998w!t:X~vwC:t AC:ρC(PtC9pء :pAB:<D,vC:t AC:DAJ-]Sf <ĩ=}T(O*<E Mv*U;\ځC~ЁXc;A-ܺЁ\޵ˁC}rC wA8<ܡʕ;tYs<Zth:F}j:p ڵmƝ[n޻?\ G\rU]:_Av^|:p@Cs?>:pC p@: LÆ:p(C/va#8 ١&;tre.[ra&͙nЁϞ> *t(Ѣ>?t)ӦNBVZC8t@D8tC8t@D8tȫ7/:a8tH8@ :pС >w ZtҥIz5k:t AC:́C޾9pЁ;pHޡ: ѡc};޿/>ΣO~=݃a>8Ё"!8$Ё"Bс1v఑c@r0"Bс`ЁC͚8p "D88t"8t"8t"8tC8t"8t0wnC!BC!BqcǏ!G< DkvȠ.c ٵk} 3 Cƌ3dȸB#{4jȠ_}_,h „ !!Ĉ'Rh16r\En"GѤJ : %L3JrEN?d!H!㨲,Y~h*cǓ';dP!2r1D`eg @2Dr!.޼z1.l0Ċ#CȒ'Sl4bp'2FV$ T#&+’dЮm{ƥM!C Ka|G̐!c%K̐a} 3fȐ1# FYd//C"V-Yѽ1  4xa„?hpbD)V8F 9vdH"kЈq NR *@f@ Gb8RLJ @|qtǩ}1p!C#8p!CF,F!C#8p!Cƌ2ض F ? Q6d{̘`*FX(Fn$22(W|sf͛7נthѣI6}ui5dvvlٳiӮA#FnV-@E˙.lȈy¤ =e̘CZ9%ʛۑHa 2xd9r 2fԸs 2f8rgp3ThuB> -.8p?BĈQ?W1JQCʕ,[| 3f4bؼ3Ν<{ID=4R5hx nz ҃,1 d d/`vx 7[G̛;=3dX^FrS ez@FO_z +VRL.>rX$ 2f̐0 3d<1c e A Sk !c ?L  F2s`NbJ EgTRM>Mc UkЈUV]~+2̞aZmݾw2ޭA#^f~S Az2 ٬=ᦘ&T)S#Fڴ1"C MZj3\ˀ"Sy C 2$ 0bH9FI?}@$ ݽӨ!C6hG^z!C4bǟ_~!p iԐpa 1B(q"ŊiԐqc 1>43| ˖=RK9)#mt cQFe1cNB# x(Q3cHL~Ȑ?~%bJ(p*ٲ]8g @4bL†kЈx1ƎCVLʖkЈy3Ξ?-32NA$֮_Î-52nA#f}i%]Æ͟nt`Z 9ԇJ@ <"#Cƌ2װa 2f/cwԘ$"$2h '*цN"i$vQ{6f#G'QҨ!eDbĔ9fM7c!g4b:hQG&5J Ok1jUWfJ _kЈ1oA ,I`BF-Aѥ+#MQ(G?A4%р nPbȐ1d 4AtC7lܩ! a#7fX?J mSt3F2ڴ kSc 1$NQCE5hG!ErQCI5h`K1eΤF 9u֠OA%F I֠S3zU=8@AACHig(ĭ&2d yg  1CA#TU^ŚUV4jeҨ!CZmʨA#\4j}҈#IdhC KT)# M ҃ Qz)ӃM3!Cj3Ƅ E2lߖ1c̖t ,PBd*A fȀ}3dcI?F נCz5d_|5hF A#"Lp!Ä4jȈ(/Ҩ!c#ǎ?ʨA#ɒ4jH._YA25d0#}z)DK&F%J-AEVe`*cƌh!v,Y3UD@?$0G S+51ЧQCF{5hĐ?F ׿_F cHkЈÇ#JH1"22jA#Ǐ4jIɓ2jЈ%2bʬA#͛f~Ӎ0aHaM= C >A˗A2Copy"!yLQ2 2Re \ZYˈ C ! $y C?~A2!512kQC5hMF S^ZF 1b˦QC5hͻ F ȓנs5dHNu5hΝF y3!t@q _2| Azh2CO„y2C!vL њ2d I><8)ӁDq|1d 9a$ B @f *cQIoЈ)2NA#U4jW2jЈQ,2ԮA#[qΥ[]4j۷Ө!aĉ˨A#c4jȠ\5AJ3_1W`J/APQ@pAzEIϘ <22d f 7{$R1C5 '7lܩ! 2נ?iԐa` 12QCĈ'RQFiԐc 1F,i$ʔ*WQC̘5hĨiF :wSF 1QCҤ5hhT "2d8ӣNpHMQdңCXIM]|Ȩk+idȐCf̐a 'ONÜ_zK\AzBʙ/=zE nzFV3u!xA"}zws*8OvHRƎoذ0kذqc 3C1*ZQCƍ5hF $KmZƌ>f̐!c(ĊȸB#4j ċӨ!#̛˨A#4jȸܻ{>Ө!#4bOۿ/XC@5h@ЌPx#H=ܸ1c2ee$Iz<V ~TQtS2lޜS2| (њ2رc Mg<590!VD1~QCX5h@F mݾWF 1ޥQC^5hX`… F\F נCd5d\ƜYf5hF MנCj3z"F J2Azƍ;H2Az'E?=$H)e.a쐑}vݹ/IRHfؑ~2ܿ1C|3faX"2c A5d LXFiԐ!q"ŊeԠc#G5d YF&OLr%˖*iԐ!sf 1nQCϞ>QFFiԐti 1B5G12|| ׮^|#Htx#Hnݥ8<~Ĺ/3fȘ!x0^x\fS(ę!Cƌ3d`1c3g2rL# =4bNM֮kЈ!{62nέ{4bNkЈ|9ΟC.92cA#4j/~<2jЈ~=2ïA#r`(]~%J-=顅 >= >=͔"2vB2CF/gȐ)c 3nذ $ cGFGe$UtFS2| PΌ+4bdJ _kЈ1,2ЦU4bĕK wkЈo_<02'A#Fc4jȐִrΨ+㮌9d̐Wƌ2F$^ 1C3&S,,ErԠ3h5d.]F$5زk$!6n5d]F‡/n8iԐy 1SAڷsAGiԐa| 1ֳ7#(:iL2Az pG̔&>f؁G/2(V1CFF3fqFH#G؁d 2f 3i0BX# F C֠iRDh4ujTDpİzF [֠lXcɖ5{mY5du[F sֵ{\5d[F #H7:DK =(r9H=¦ 3HqZƌ1#c\  M_ !cǻxcՑG#G̐!c 6n̐!c 6n̐!cRL:!Cƌ6lܘ!Cƌ2d2)"(#Z5d}[Ftڽ7\5d[F >8ňiԐ9r 1*[9͕iԐ:t 1JV 8+8 H>&8y*ȧ8 ͐$[l!8!c 8l !8l!cg 2f 2f(C 2dP2& ƠQCD5hQF=bQCH5h@RJ-]ْF 5m CN=}H E֠CRޠ#:!Jn(XG O2812fY 2|2fX$ 2f̐yd-Wa3d|y 0Zj5d]H ڵmƝ[7m"5d^F ōG\riԐ]z "1_Ǟ]v։Ԑ^| 1̟3̈́dpx"Eĸ#/c~ Qp*!cGlܘ!c,~胐 7f#K2NΘ!c ._œqÆ3d̙sH*T(2"A$ӦNB*)2bA#׮^ +v,ٰ4jHn+w.]4jȫ~M=zqS b=d9AD@x̐!z4i9r1c3^ϐ!{3dΝ{2~>Cb OF Οנc:֯c>F ޿נc<ϣO~=z5dϯ}?81O>Z8b\߾hÇO-_ 7a?dT)cƏ?xq7qqƏ5n!h?n$UZ OyԸ1j 2ҋ_Ҩ!l6hUm[o!n4bջo_K ÇgqcǏ!G^c ˗kЈs=M)Ҥ kf䤖c&Mi53r4RCAJ*4lԑ4hTB2gaFw6~? ! 1>2FkH̐a 1"JHŋ3ZQCǏ CId4b\I0kЈA&2rA#ϟ4jJHҨ!4bHJXkЈ+2ŠA#ٳ4jX˶pҨ!ݻx˗o 1 LÈQCǐ#KLr4bhLCϠxA+2R!DnȘMs!DbNk92KA$Dj!ӫ_Ϟ} 1˟OۧQC2$XA ֠C5dLXF i\1DQCI5h`ْF 1e֠M5dYF AiԐQh 1.QCSuhĠZF YnW`kЈQYiծeV-2Υ[]y_5d &\F ĉԐq 51$OQCe5hܙF Eנi5df]F رiԐQv 1tQCo5h ^ɕ/gsЈQuٵo];2ď'_y{WḑC Ԑ?Db,H k!2&RA$ƌDj"G!$DblI2kЈa&2v'РB(ҤJ2m)S5dPj*֬ZnA#ذ4j(kjҨ!-4bЭKzkЈ/2A#4jh'Ө!24bpLТkЈa42Vn5زeנ6ܺw7o"Ij/n8ʗ/OB$j^ krR)NAF*4h؈#=6hЯo㇌Y0mq46CFD?lаx9֠dH"Ij4yeJ+YLB$FL3iִygN8hPC-JG KDh -i-?fG5~pƓ3ʐƍ5CF^?$ wFqv0|xƏ!r!Wn԰\2f̐񹆚I BujիYv51h׶}wnݻyxpܩ`㑛ApEgT. 2d} 3f0;fȐI'3dԗ12p3d˛?>ۻ??Ā b$8g 3d1C 6pఱCC,8dȎ;.!CFQ8B@9c 3\ΐS 3dܔ1C =g!C 3dEzH M>UTU^ŚUV]Cx̀1\n Ȝ+3dȘ1C2d̸aƍ2d̐p3ͥ73dȨaȍ2df.cvc1C6cF)FJ]1C>x̘!C 3d!pA2f !cgȈ(cŊe`1CDb )r$ɒ&OLr%˖$q!5nR U*9rR *'9R)P*9@jj*9VRCc+W5*P*4o:t<6Hld;c.]2ޝ!C D'NHDafȐ 2ψ-c2N˘!c2^AGڶk 2h14RC+V̤R 5r!}t+fQEA*3Bb1ΣO~=߳'bFS!h7~z[4`aCFPby"oPt<#7A /g!2d@"A;@x7CFQ$p Tƌ2F1jժ2fUFW3+v ggMFocCȠOjE"iuja n@!'Bb"$F 5Q 8t g{4ukׯaǖ=62f9b:gxqLt$WDGsLtD΄mrо=G3aQt@q̏2˘19|l(Y>Xi3AP 1, #9dȘ1CL3sC4bTPE%J MD*U^D+]~ E@VL2WG#9dܝ1C޽3 84!S.Fǫ#X)MP 1>E2̛!Cz3v̐!ǟ_~qCChBFPt@("Pt`̨Q#&:ɉ!rE:EKb̐!SƌEdĝ!3dȘ 2nЈ1paÇ'Vq2:P/ћ6:m &:Ȑ1E&P &:ȐaDGmSd0dGȡE6fȐ6fȐ1CFw3ϐ1~ 2f 2f̐1F2㟱~ḛ1  3d2d̐AQƌ3dh1C6pC 6p1C˗>~"PB8dA4錧2ʘAuWoЈׯ`ÊK6,8;XA@)6X &:Ȑ1E&P &:ȐaDcSd0c3+H!+’fȐ6xȐ16fȐ1c3rϐ[ 2f5 2fX.c2K1Cu3dr19dq3dȘ!eȗ?C6pC  ḛ~ e@d 3v sF2p~gȰ/cF~oЈ0 <0B %ZCa.Qx2ȑ#@)6%,[Θnj4kڼ3L8Ō;^sՑ!c2ra" AaC)Sx#dt`e3f <Glܘ!#y̛36lܘ!Cƌ6lܘ!Cƌ6lܘ!Cƌ6lܘ!Cƌ6Ԑ 6:.3dxd 3>Q 2fܰa 2f|(cH%e1c 5l1Cwl!CN3|ΐT 3dE*c MeܠCTU^ŚU]Pe 2f̐&L(C&LtL!È:Ȑ1E&PYac ƍ2,_1C =˘adq>d̀.C 3d\1C e̐!c 8l̐!c π/C 9r?c 3lā2|ʘ!q2f`!ceyF&OLr%˖*<`tѨ;3dI&:m &:ȐaDSFr (p$3D׮^g fϚV۶2f2x2x2x2xc2|Æ?1Ci3Nϐz 2fٲom;Gg̐!c 8l!8l̐1g`!cg/c2ΟA#Ï/> yF 8(-:̛&Lt2:`"K&P"g 'Qʨaƍ2`!&2p1 7fȐ1 7fȐ1 7fȐ1 7fȐ1C&p! 7dU;CFoeĝ1w 3fЫHf|9P/cF{cF}H3/cX˟O4C2d̘!àwGޠ`R:d1ģ2DaI6`rK1eΠYӦ 8g̐21Cѣ3fȘѴ$\̐QU 2jUW3f ;c C8 `Ւ% 8 Hd &\ 2/ 2fLQ ̙5E&]iԩMӸ! رex.mF0ЬA1: Q\2d`\4bLN 3oۻ_Oㆌ3ː1 7dC11ʜ9zfȐ1c 3,^ƒ=!C 2d̸aƍ-gȀ)c̙2d̘!Cƌ6lԐTF 6n̐!c 2f`g qh}ɀ03f!cF *Q9W.\p0e{DO̐sL4$bg3f9cM"FTtuOv81#TTgX52fk dg1c+z1C@.A& |gW4b>8Ō;^$e̸,#;{!#g8}z [Q#-z4ҦOAG:!c 6n̐!c 2f̐!c 6n̐!c 6n !cƍ#6ɨA$K?#΀a1bs#T);q$0՚'orgnj'yQ:j;Psc 3jܱ1Γ2Pʘ1C50 0 {2cƏ=Glܘ!Cƌ2P:CFS3fȐ*u 2fܰa 2ft:r gɎ3dĕ;CF]3╱W 1c11c>|1XÕFx';㉺R A½lP2-e# }5;d(1c 3lQ-Efb,pi Tp,1C2Rʘr2f̐A2d2d82d̐TƌPgȘ*cUXe:CW7hKٳhӪ]ʏYK 6p1C2 16xȐGȐ%Yfg"7dȘ11\|$#إ;#)uofXd܃l b8veb8Dcph͎2Ϙ!Cƌ1['3G1ld*p(1C2ʘp 2fȠXq 2fز 2x 2f̐Rƌ;fȠ9 9e9Cϟ7h ZQI.eF?ظ1C7lب1C2Ď1 7fȐ1 7Ȑ1ㆍ$?d _"7d측mI fHFyh`emGfnj2Dx eXM X8p[*=ѻ# 1C3dȘQ~2`Α}AȆ3dȘ1Cg`/c9d̟1CcԐ@B6lܘ!Cƌ2h8C%ʨ8"Feܠ#Ȑ"G,i$I7d1%̘0eЬ)c  oЈ?ۿ>28c 3n8rc 3vA"$;j8rc 3fȘR 3f@ =$>S 6m2ȑ Mè:C3d\aHeCf c$K3d̐w 2fIReI G#72r԰q 2f̐Y-ϐ!#Gd sc 3nذqc 3dȘ 3jذqc 3f@.͝?]tեӸ!C3dȘa3dȘ!cƓD1f3dȘ1Cg!P  ۃ!3匁12FVI!c$I3NH)c2^Θ!C8p!Cƌ^ 9K!C Ne̐!cF%1& @# đ!#6fȐ1cnΈ+WX$_!cVX2dx2d̐!cFDf3 2d̘!c4bNz5֮_nMㆌ2f̐!c 8l̐!c\ଙ1c(6fȐ1C3f>c޻s>4A镕[$쐡GȐ1C3( >d$L8C!6p1CFE׉F6fȐ1c 3dȘdI`*FMfȲ2d̐1Ǜ?̐TF20fBA1 q$'1ؘ!C8pؘ!C 2fVjƌ1[pؘ!Cƌ2˸A#FaÇ'Vqc4nȐ,c 2fܰa 2f=3jذqc 9|̐1{!̐z H(QHظKJ 1 2r.cF2ϘI2f!cǍ#6n̐1=iSQeȘ1C2d4̹J@ё#?dHb 2fȐV4XH9iSl1!1bX1(O:t>!CB6lܘ!C P2cF 6j:7hKٳhӪ] pgȝK3fȘ1c3d]$TP#>}l!C 3ϐQtDDF#ciS .fb bFPHDaCj 3|1âEglc 2fQ)UdK1]Ҹ! 9e9!Hv̐Q 9d,EɌHA"CY򐱃Bm ȇ OԁD[2f̥;CEH!ð3dȘXUk3dlѹ 2vn.lJCk3fȠ d:N6mZ>|$++1 b&P~͚ ٵϐ1c2ď'?c oЈ{ϧ__>2d1c@3f((c2d Y'Θ!r1CFx3dȘ4`,!K̆ BQ`Sp 3f8mzUc 3dȘqȘ2ꨉ2J8)Cƌ+e%"1bqBTH8#( 6h8D$H 2#fȐ1#T vȐ1 7fȐ1ㆍ$?fԠ#ܹtڽ7*?f$  ˘x3˘a#ʘ!tFe̸q Ng8b 3dnjDb #4zhnjTZJݥ7@|+c3f-B gA 0Dpd Ym̘!Cƌ3dffȐ1C7l3f服1doe>C2дΝ T^HtٰA#1e/wH? 7fȐ1 7fȐ1?ΨA#FA&TaC4jȐ1 1f!3xx1RƌxqǑ'7N e̐1} ױ_2G2e԰A}{lZ!2qct(c 3ΐPF"XD0#5)փS)2B!CF"ErXrK2|A2rbG!cѣGeȘxI )F !N舲ĩO4KX!NHMb ;dȝ;cxg̐ "1 LÈ^2 gȘLy˘/ؼy Csi( y5kT h eM@dȘA ȋ)ZbXRD"wEڴ1"e_~{e̘j?3f 8CKТ!NaO&J4pGbՆ3@dd9c 1e̐Q "1tOA\2ϐ3d`:CS3N*cƌ;flÇ HH3D2Ԯe+C$# 2@pi 3܄ #^mP VA!F2dC (d| =iԩUː1vȐ1m2tϐ"AA8 ʰ2C*QuƾD} _ 2f1C4b̧_}OD@$3f($X0$2ʘP3dȘqÆ3dȘq㈍3vp)e 3dl钥I"# 2fp9DP3f(:U4Pt(4AZbP \ȐC )TDaL2h+Cƌ6lܘ!Cƌ2fW9W 2c3h,4tȑ =`L2 TaJ(H%瓱_A4qņ3dȘ[p3ncF 13o9ҧC_iHx3(?c 3l(bÇ X gK#dX1C6p1C3d!Cƌ,jp3g؜!#ΝRvYե3fȐ#+VA$h50Ƃe"6fȐ1C3dȘaǒ,3~T7޽| /2 8<"Sq!Cƌ2*ϘJ#6j< 7f8}zj[h2MJZj >nh 3f8T9PS 0F ZfbXC {e'31ne̐1 5d؟1C2dXgϘ#͐pB e<#<C3dرd&L@=\L ||̸aȍ2d̘!cP2fܰ1nj4b<UTU^J 3ʐ1?yfȐ1C Cc 2f+C}gX [1cO[@dPư?d\Y2d]4Q@:H [Z7C}.cpg Ad 2f<} 3(\c 3@ 8 6Fr%KC31c }HxFB(q"Ŋiܐq<,!Cƌ3dr._ΐ!S;f9Ǐ>1V ~hk2|a0, Vg`*co fϢĉn c'`IW~e,X…\g 3ϐ!y 2|&NH~MhE8ԃI#9d̐R; hpӣ!)2~1C3fHΟC.}:֧!c;w<(5CgȐ1cȐ2ß!ca쐡ƍ#4(UR94R|Ȑ1Ʊcdd1 3dIvPJ!BbĔ9SW 4͐!c ?g:TFѢW$CF3dD:CF" H9Պ!#NicD { E˒CAzbH g̐12'A$FcǏ!GJpĈ!ɠG*РO{d!M#9r(`t8#j& Θ!C3d\xH =~RH!ܐRJ, "C5mޔ1c 3PVC2531$!#G2|9$I1$EI3RΐRƌ3dȔyF8sɳϟl!C 3gΘ!g3d9c Cgq KA"9#KV2Ԏ6X1CFZ3ΐV 3dԭ{F {p`E<,'@dL츴Y3[ P0f YϨaFl6jȰ-c$;d=c g̐q\F%Fp.'NĈa 'NlW b  ap/ X-!c ϘP3f8p  e+NN2rP2H#X(K21F1C̙3fȸs <{ #СD=4QW(1Ks0a)JHd2M[6PӤi0 z$;fؕ|!#2 881372$G#Rňd!B8# A"ѡ#2FdP 0:t"ժ-hr @njċc>|xnj2\segx>C^xQć 9a2X$z 䘁?y(C 1 DPB .tBYqC `xD >f4&3$P/^Ԏ&=e CP"7d!CMe̘!Cƌ6lܘ!CƌGhA%Y vl1C1E20' L8F*gm$߂r  [k j̐!c 6n̐!c 6n̐!ˍ;wn̐!cƍ#6n̘J;c>= 7b~eΑ=@f@.#,]ئE3d̸aƍ2d̸aƍ2d̸a#ɏ5hĀ_|__хlp$nV '^2>2dDi>x82NʸA$˖DnȈ)Sƌ2n!C 8p!C#8d4>̉!uj 'sG +r  T& [ *J9^dadqd˒12> 2d̰ 2d̐!;mqec xqǑwd?"A'@c ߽STzb@5W  #b׿ eHP3dȘqÆ3dȘqÆ^d(+ 1B! =>X@DP`%'2MG= P Tg 3nذqc 3nذqc ^t6 3ntc 38p0` 3nذqc >nذqc 3fȐ1c5l1C7lظ1C7lظ1C7l$1S^ͺװ[;FK3d G)u\"2d̐2m@PQ>3\}bO䆌3ҫ_?C3xA}2|$Y#Bb $(Ę7&L#O|(=E^] YI2d̰ 9d̠YSv1Z3CA%Zt 3 SQg!C 1nWa~uT03d0ap@Eݻ3fȘD9fAEaA$!Tޠ hL<glse=c ԨgȐ.1̞v 9z)cLfj+S֡2}%N\?`t!2o1C3dȘ#L'@|`߾'kd$ (pBdt $Sclqc 3fȘq[ > ;*Dg$aEP-CSDHv!1;!%*ҧ^fȐ1c 3ط!c 2f3 P 48Ɲ;5fȐ1c 3*Z!cƍ3dxA#ȑ$K<2ʓ$͐3 6pwj 6p8C Gp8C3dPlQG֭\9!̐1>̐!c3fȐ1#| cƞOt0`е1b#C-'1*[0HbX)4C3dz2fȐ1Ɩ-6fȸ;ݼ{Qi˖;3dȘ!#gx.c2WA#ܻ{>4j8$K|m:%Cƌ;Kؘ!C K$(C@>-odu"_rp*4C2ʘv 2fȐ16fȀW\u)F 3dȘ1Cg@,c2;A#dʕ-_ƜYf4:,IP퐑G$qd#K2l]$J!CpCi4CrC$8R 2t 3f?C?iC}^{`ymC#6<!p:,F+3dȘ!cg8c 3nذqc&OLr%!z%p l 3nS2f*c4b Mt)ӦNBmJV*c;v̐!Vƌ2΢M+#G"Tщv$H3y 2fxd3C~,c#Bb`6 '3#˕!H:'ڕaEƈ3nέ{^f.|8Əd܃Ȉ>c:֫~F޿/~<ظQƍk_8Ə58p`4hXLM$5 FQ$5jܨDFǎ3f9r 'MP)/8q"D+Da@ʉ1NO~G2ΐ:jU2fժuƏ_;Ə2Ц1ʚ5OfȐ;CFݺ3՛WF4b}e̐mH4l^fȘH wfhQ7hIɓ(S\ɲ˗0O.fnj2f+֌@!cFj 2c%S!@&J0Hfh\hx"2f]˶[2ܹ1CݻvkЈ߿cШ!>|Xx/ɘA22ߠϠCMӨS+ԓ2d̘!Cƌ6lܘ!Cƌ2d̘!Cƌ6TjF$!1bX5HD!1F+ "("Cƌ2˟? e?C3f X` "1.da "5dLHÝ;7fȐ1 5ɐ1c 3TR 1dΤYM9uOD$͐Qt 2f 2f̐!c 2f 8CN=}#6K -VSز2f̐Q;w2˘x 2fL!ò24o\H СE&H Uac(iܐ e1  E /3dȘqcF/8dH#I49CFJ)kЈfL3cШ!gN3x(PCoЈqiRK6u)"4VzkV[lU7d-; kgvƎ7RqwF^{Θ!p`gq 2x 2fT| 9sA#Fh80}YӨ!vl3dԮ=c ݺg eA#Fr˙7wztD԰~{v۹wH Wu!eo? 2f< seP3f80a e8t8c̘!#c;z]2J,YF,$3f"1jڤQCΝ:g)c2ʘTҥ36TZ5֭\Ҩ!#رd˚=m 1ں]i˗A#$ 2F gط/c~2fdnj5l؀7C7lظ1Cĉ3,^!C e|1C7l؀E7lظ1C3dܜs 2rh 1CR?hĀF UVU]gVƌ6lܘ!Cƌ2ʸA#\uśW^4~X`… >F ƍiH0J3dȘ1Cf3<=c 3lac 1C2fܰa2fb`̐_ ʘ1p 3fȐ1 7fȐ1 7fȐ1c 3@)dI5hP/afM5dԙs 2f D %3fԘc 2fD1WfպkW_Ҩ!lYgѦUvm 1ƥQCFW! J!C 2f$G3fhB 4iD"3A QVZ ׯ]נvm5d]F ߿iԐ1Ǒ#24`Ȑ1 g~F ?|yiԐ5Ǘ?~}̐ cH2c$\~(1E22f̑c2(SXɒ/g̐A挛2rSO3:tH֠S"IjHHXiԐ+`Æ!Cg̐팷2ƽA#ݻx˷߽4jL +^̸c6~ȘL3Ӹ!;vy!.>dȘukaϘ!vm RN| ȓX.eH>cg]F 1‹ADpXϞF ßA~}t9 2ʘQP7`C%NF 5֠G!E$F )U֠K7d̜1C 2HKEA%*tȐ2ʘSQ1UY:c a֠YiƠQC[og̥[w%TDQd 3fȘ1 2nЈcȑ%O\Y224oA$gСE&]32TA#kjjȠ=C?(Hȳf 3f >q3ː1Ƒ#7fȠ~Æ3dȘ!2d̸aƍ2d̸aƍ2d̘!Cƌ2d̸a3dȘqΝ3d0lȰ'Rh126r8CH3dȘQ#BR(d3dЬa#ɏ5h'РB-*F J )ԨRRH Z֠+X5r([v=\v̐!c\rę;C3da^db3dȘ!㱌2d̰ 2d2d̘!Cƌ2d̰ 2d2v]F‡/F ʗ+!㹌2d(Dd6t@ϐ} 3lXeƏ*1ֳo=çQC5h`  4x 26A#FDL!!W qF2Hʘqr 2fȐ1cέ[6bɐ6fȐ1CFP3dȘa|(c 3ޠt$5hx 5ԩTZJF \֠#رd˚=F l֠#A"#| 3 1#Ōcɔ+[nj2:{\FѤK>F [; 3P LJ*T!CX̛;=ԣӨ!#4bx˛?OӨ!#4bؿ?Ȁ'0>d8c g!C :#@,Θ!C=~(C3dD9c ,gS2lĉ =}2Ezt 3v\RwIJ3g *Xod|qH e͞EVZiiԐWn 1%^}H …iԐXq 1?nL3,ϐY3d|=Ch9`2(M@fȀ {lڵg-cn}Ϙ!Ce?>c ͝;tխ_c ݽ{!co@M 3y 2n_~!p QCÆ5hĈ(F /b̨QF 1>QCɒ5hHF .g1c&͚6k1cF#dZ@FHTƌN>cժVbnj2 +v,ٲeg!c[ oZ w.Mo!c ~oЈ!x0†#N02CA#4~Ȭy32~Ј!z42NA#4Ɉ=c 3nذqc 3nذqc 3d GC -h@Dƌ )}e1c 3nذqc 3nذqc 3fȐ1c 3ްa &TaC5lظ1C5 ٨@#CFI3dA#FK/aƔ9fM4jй?!hQGA#FS4jȐ:WҨ!3dȘadr$F*5x 2f#G3dȘ1"3dȘa3dȘ1Cի3lac`ÊKXwpCİM]1Few eԠÈ+^̸b5dH\F˘iԐϠeԠi5d^]FװiܐA{m2fܰa 2xܰa2\IҤI@*bA*4z5D JtćW̩!wԘ!C @QPƌ6lܘ!C%N(q 6n̐!cƲ}*`A^Gj`9å 5hĠYM9u䙓F A֠Q5d,eS5hĠZF Y֠W7dQXfeV[ʄi;rl޼y=u1R$u  HȐ#_(!C /^f,c 3D˘D2T`ZkرeϦ]{ ܹeȘIH X & 3dȘ\4bL^uٵoN kЈQ<2ԯg޽4b̧O kЈ?@7d,8c g̐!@ȱvZ+M,FHF+3VV $ 9 RX{n!?|(Zt 2rRΘ!*֬Zru be̐!c&y"E$`7;f̐1cyo/.lx023A#4jȨl22jЈ32FA#Dnhz eϘ!㶌{+PR3nxf(SC C 2gf!OZhtm%j&E|3˨7d?24xaBg4P 2f%(І 䡻d 2f0iƪ+YtfL3aҨ!g4bI C5*KҨ!j4bTJ 3xǎ2f!OtV4N#SA&!0Jt% 9h5cfHAY 2dԠcI'gvvdXC=Ix`PH3ʐ1 7fȐ1 7fȐ1 5d1C3dȘqÆ3dȘ9 ^ĸa(44C7l$#[~ ;ٴcӨ!#4bMċ?.̛Ө!#4bX^,Kp!C#1ܐ Lp(#9dALI`:י.g&y ']`Κ5iРCN]P!?R̐Q0$`C2Xl3ŇgȐã2Dʘ1c)e̘!1gȠ)cM9gcY H,X 3f`*㆚QNZUYҨ!4b%K iծe+qҨ!4bK , R<*SH2ra %U0Ch@ZP*}F!4-X Y] (>d 2M3f!CF#dddu3dl1 2f c 3`/c{ǗQGzHp!`@)2(( 12l!Ĉ'BQCƌ5hF "G,iRF 1VQC̘5hĨiF :wJj$ B}M>6Q"EI) x*J3`hB T& 3fM(kCeD!d76SHSFIh, e#2rLbq&>dPly2ftF 2A"㴌3d1kę=C{ (P`Cz{da\4b0o9ҧSNkЈ;2Ɠ/o4boOkЈa>2Ge+^@dq2r(D9as3H 3d73rP1$> M/E"2e;DDp:cFĈi2CFV[cK:2$3CF3dm; sḛ;CF(i<ɣV!19dȘ1CFb7hprdɓ)Wd&M)2dr&2d0bdJeQ$ *l J3E *_zhIc F hİIS Yd@ %61CFĈi2C@:R 3d̘ $OH3C4eؔ1# c͝;!c&EiD)J|?C 7h@^zݿߞF נC~"Ij!p p!2BA#Ŋn(H7% D Cϙ.S1c&͙2nh1Ȕ3itQ2EVZp E MȐqF0cʜI͛4iԐg 1 JѣAiԐi 1JQcƏ$6:1E >vEðK@VE4!n]2dH#2d!QL ]@bw 3A2vd8uiRd .Q@5sl20QA[F&T H!G6Z41 2˘1C5T1C7l1N>=CF ,b1  3 Ͽ1$X`A5d,dXF %NX"D5dlXF !e ;MFƌ0Jc Mr)#1b Jt ozňfQFmAQ" XEGH !r 5IJ2`,@% M֖bCF._(QYƌ2d̰Ê2d8cI>}c 8(mȠCJ*M8ñ$ˌUb '^qɕ/GN kQuٵoN kЈQ|3,qV=ȘA4u "E̐!,Ed0d8C l ;dȘH.bI]Ĉ$ Y ]@dp7䒮ĠM'0@98b(f$9|B%3fȐ1E6vȐ[f8cmP-3"㯌>ǒN3~T1Ȓ'Sly226sA$ТG.m42VA#4̸2F#Xh.Ap#FhCF"ErȨ^= ;PU2S(Q(20 Qoݙ>}$aKȠ:: `v4͐q Mr,Z;O`[,X"(#G*F̔"9f!c 6n̐!c#6[k `HKg0$?dkV[vlW5d5[F kٶuZ5dԵ[F {iܐ!c)XȰDPi!'$*F顥 ͚g,# 3HªR Ii dG,dPv̧f@dҡ4Trp>c2dHd$XD`#|zҥ Bf׷Ë JL>: Cƌ9c 5hĸ1ƍ;zȑF $KA#ʕ,[|4k֠#U7d́*>(ҥ >bİ3e >Z452fZ#  h4ŋP!d M.Sr8Q1CFzj[Ϙ!#vl$8S$Y:z E䐁\F 1;=ԫKQC3~>1C5hx 2r`O3DF .]`AH%>|̘!Cĉ3f آ cJ.T|35*! fEӇ)F1c EHQÇ4ȐB$G"M|:CF2hCeg@v meɰV29d!#,Y:Q2#`eܠCbƍ?Yc5d\ƜYfΝ={A#h4nȁU Z|Ȑ2| ‡ (Jr>C 2f \"F*sh.)M!C nrb|tE"}h$e>)c|eܿ$4`!p2r1c!Æʈg@ iddG 9r̐._Œ)s&͚6g!c'Ϟ> *Th 1"qeƇ 2DMI=%tR$ 3ʐ1 7|ȡd L2#!X0ŠS,Ex̆-PQLicΜe 0`̐ZF&>fȈ-njz $G˘1ƝMH,H #& ,b 2f c<ϣO~=z5d/>߯A#UV@ I?AXcT >X!Cƌ2d 2r)9|G%2d̐sƏ=  >C!NZ4!cFU2f!)R̐11>fPVƌ9p(S$nj2d̘!CBb8ٰLp(„19r`H 73ddA$FgϟA=ti4~PukׯaǎF ۷@H1d^Z{ȘM&1"CF)TrCC,rX.#GС󀗄PJc`#mLB 1M|̐^1˟OۧQC2$XA ֠CWd(€mdl!O 2T\9å 0gQHM(!O2f!u>d,TSPgȠzdl1CIy T|"CF#ErȠ[*>d 2]HO?]t%3dPC:4blgСEM$I ԩUfIĠ]{ɜ?4 P0Q5: W=MѥKGk(NMPV ]Sʔ]?oԨ$A5sj0F4bDoOpBp 4q=?T*PAi &2Ќ[\ Tt!njHB$ԨRRj*֪8+ذbǒ%KGjq,AC-1p,ACM#3i$oTjhUhJj&SaFhpn4ȉ!VШb W{ᚈKh&n"8b6ӈ9fFM*Uh޼F4OR%f.njF1e*44j1ӯo>`  4xaB 6tbD)VxcF9vdH#I4yeJ+YtfL3iִygN;yhPC5ziRK6ujTSVzkV[vlXcɖ5{mZkٶun\sֵ{o^{p` 6|4 !! NETSCAPE2.0,((GGGwxvhhh'''676UVUƵûy||Ӻ29FTYdfdZGC} P(``@Ͽ XA .d%NXEѣDpdT@0 0@„?$HA @@AI(  0 @A &0`@ ;@Bx`@0  &</fcȐPe̙5oYD&]iԩSk̦]60x <  8AL?(08@@ ` @h @ CPh"ƌ7n$ Ȑ"G,i$ʒh%̘2gҤ@:83@B ,`4 (`` DĈ  (H  P  8A,x@Ł $(/>0 6s,AТG.m4jh5زgӮ-[w7`/8`@ P A^@ `0  BH   `Ë#TXH4iR+YtfL2pgN;y5ziRKjTTm@V4@P pp@s֥k a HA , p8a4pA p@@իY@ @lٳi׶}7nxpÉ.@˙7wz~00 4@@ 4p0 >8X@0@@b  H>xņ$P 4k@ Ν<{ 4hP=4ҥL:]*@TZ5V , @@l h@h``C0!x `y@ 0 x$H( j۾m[{ < <̛;[_ܻ{^ʛ' X` A HA `@Q"D$h@<XA 0@%( =#TPEM>U*S \J@]~VXaVܾW\n8W/A(b:,` H @hP@u(P  0@7|@x <0@r<8 tի @v|^x#p@z_|ߧ/@ ` "L8P`"  p0`A 0(0@ns'O Hp(H`   `8 #n߾@ ݺȫw/߾~@ Hx1ƎCX/0`3Ξ?O`5k H`m  oP`$P ֯p@((PpA 88  &0 PD(@ cGAh@' eK/aƔ9p$`@O?:&% @S x`@ժ4u`=`o 0nm@&08P! `,0`@84 `&`@m۷qֽ' @qǑ'Wys>ױg׾{? Ѐ 0 `,A0@H0 p $(0pb '8(0``BH*@X ׯ`Ê*@h ۷pʝK7% ߿ Lد+&  | @p0, B $@0A H`($@- PqH@${GP   ȟ/@ $XA,dH@%NXE#D$YI"%dΔ9 9 (s 0bÉ* B Pj xpA0@Ԯ]@$`$PP!P@ ,Hc\5o ]Ufkر] m='.ɕ sLN=A н; ,`BAH _~ P``@ (`BH0@A@ >0 p,@$`` ``A2g@ ΜsB-jT2@ Ԩj*֬ZrUb,Zm-\ kWz/` @ a D@(m$``t` n  A*P0/p38h$@@@Ɠ@ hӯo@` paB 6t(V$ @FdHpX$ @L2 @N HA B4maD Zpk$` ,8(A8 @/ `(``ɓp38w@ @hѣI@@ի6h׶}wnݻy@ @p0~\˙7w<W@ @v 0?@4(A,0@  (0`*BX`xY@,0DP hD@ ҥx UTZ5z@ ر86ڵlۺ}Vt ^ 88X ɔ @` A@8,@ 6 xqG' @uױg׾{w? }{ @}пX 0``,p2P@ (,( ( BP@0E(P(iS  P`(` @`ٳX˖p ݻx ߿L+^̸ǐ eh,@ϠCS kȞm(P`,pPP< Pp (({(`` XP`` (@pP "`L(@ ѣD$Ydd)@1 PM9uS% Q`SPժn% W$i-  $HP] HPp$8@@<81 LFP  P @D(` (`((0 (@ ((q,gN@Puw'O@կg{P>@ ,h  !DP`  4PPA ,0 ,0!@@A4X  4Z@P@֮5.^K@`0Ċ1dPL@̚7s3О`4V@ زg@@ܺ7'~ 37@ ,@H0(@4hU @V|VXe͞%+@m WśWo,@… X 00A8x :0/$@ 08 `40 ``@  0@ T`` H B _@~ p  pB$ Ŋ/b̨q#nj)&O `%˖._ ͚ȩ>P `,80` @`A @ @/A@b@ ݺt$P   `@ $`0%?@ HZ_Î-;n@ .|8Ə#On\Ο`:u`Ϯ};/^`=a8@A$T (pA$H `'`@@,B08@@G! RDJ@WkW_lYUK@oƕ;n]s/@ @aÇ'@@Ǐ020g֌BX@|: ={v/ހ X AR4X,4Ѐ 0@@ @ @*\ȰaH(@ Ǐ CI2R$ ˗I͛ % ѣH @ ,`P8h ׯ`.8``@h Xm   Ѐ@0`(` 0A$@ MR& M ' ȓ+_μNس pp XϞP*A(P XC00 C  "(P $`0 \  P0PSQ Ul*AaŎ%i [̥[]y+@ Pذ/fqL,@̙ D&- ` ` ,P;4`    `n@2$P0 ``_}ߟ@@ „ 2 @@`"6r#Ȑ"G@ ʔh2gҬiv@ Р(jt h08@@pA(`08`5`@8PJ`0! (q ( 7s< G@ hgӮmv@ (n8ʗ3o\ҧ:p;x(o^= .$`@` p@bĈ ``At  P@X(qTP1@N 𡀁f(@R (0@Tz[0 lXc 00@Zpsֵ{o^{ p`6|qbŋ rdTl"@ p  0@@ }ہ4p  0 (|@@@@ @~ :jx k۾;ݼs  p?<̍  tX.0^`@4 X&P0`@ 0@D< |$ -@0pL```= @PETRM @T\ŚUV]~*@e VZmݾMk@u W",؀  @  <9 (0 F4H@5 @ 4XЀ b,p @`,4hc4pv^<̟G^z _>ǟ_~ p  LHB(qbC`H@ x@ h`e  P A8`x > U* 8p$@p A``۶ H`((`/_,#Nx1c,/cάy3Ξ7 `4iNz5֮Q `6mmP@, }:u 0PPp@@  P Ao 0 aC0"0fԸcG0$PTeK/a@ @MйgO?D @QP P @ \ Aٲ8X-[ [ 0@@ $H@ G6A00@g `@i `v@@m۷qֽ6' @qǑ'Wys>}ױg׾{? x 0H @ xpp@A8HP@ 8p@B`A4`P˗,X عs}@H HJիX:XWKٳhӪ=+@pʝK]Wa(^Lǐ@22k.A MZSkȞM@۸7 @ ȓ+_μysHNسk.@ËOyX^;0} 4@ A`ذ%6PEl@!PҤT KYS9uO@ PQI.eTNZUYW%@i-@ ]a,fL@ȑP24o g ]ZUfkذ Pmܹu['^qɓ;sLN@;ď@ y `^}O@@  B0lh@ `6r#Ȑ"E:$ʔ*Wl%KЬi&Μ:wt Р(jJ )TPj@Z ƒ%`ڴhցr p.^kA`3n1Ȓ%;2̚7s3g.m4W& mw 7p/.@ S'  `@f͛9wth 0}ujիYnm`ٳ<p@@@(`@A 8p@0 t`4  (0 QD-^ĘQƅ xP`8P   0P@={. h:P@2 A |p`AAX@\ W^}X`… FXq^0@ (P@@lzN  @ [7 ,Π @9 @0 A ̟G^zݿ_|7!D R$ 0H  4xp @H G(0P@r%KH$@0`O$0@ @AN@  u+׮^ +v,ٲfϢMvP ,` \!B H8 @ @AD(0Μ 0 P @ P , <|9ΟC.}:֯c>@? 00{ /? (o `,` A0Bph H8p@ $H@0`7 (P@OjP@`AOHP@ @kW_;lYgѦk Aƍ;@ $8x@pa (8 0 F(dp У  P " @* p*6lP &L P ((A @y@9:w$P``<` hЀB0H @ < ̛;=ԫ[>.x>|P =ڻ` TX@@@ (qD+0@Xp@ #$P H`L5i (@h-(p`A  a@((VXe͞EVZmݮP@ś7}  @AF @0@ @ h  P@P  4` L  ͝?` >  8@ `/P @ p  Æ q"Ŋ/b̨q#GD` Hr%H0@H`Ϟ80A N; Ax@T@@A0hр $ @  @`†A(Q0Ń @ g`t x`6ڶo(8@8 ΟC.}:֟``(p T`>}00P :(0@ 3 8A ,80 H @K( AX ?0@DB A pAкu x ,8m[oE`8 8`'VqcǏ!GV\P 8 p @ =aC8A(8 00>PQ <A$g A8p@ӫ_^0p$XA .dxp@ Al$PTT9 P͛hѣ0@T(`@@ PP ((lC_  P ,A@` ` 8@ 0PP@C`((cǎ@  `Ã``(' 0t(G&UztOF:`WfպkW_v@ <  P@@(PpA  @* DPp$@p  P48` 8`LP ۷o ` pp@gמ} 0|yѧW}{o? ( $@p!HX@A PA8Ō 2 9͜;g6  P  @ } (P 8<`!XGG 0 P# (0 ? 8@D((@D-f(F=~RH%KB(J$`0L5m |< B `@ U* ,H  &(@X (a@#h @`-` P@<~l < 200hҥG+x@@u\[mƝ[n޽}^@B\ @B@t ]v ށ$0_~8 ~ ``"0A(pBC   @(PM4~ *F0(`)ӦNBe:`Vbͪu+׮^Vf @0@ +p~̀A†$(P@@V@p`Æ ` $@ @ mpF P"@(    p@@ ` 0`Ap@@1fԸcG7P@@'O@` 8` 8`?AG 00OX8X@ E k@A3H- 0@ <а ,0pH`A h` @ @  @i,X,80 н>o   0zuױg׾;v 0< ~  ` п_H(\Ax`A @@x$ ( `   :`` J@(P@8@P ,``    x.x  L0  ` L˘3k MX @ r]@@B08 ' 0(`@ ,xh# h  0`  0 P0@,Pt.pA%ZԨ` @LZUYnĎ%[,Y `6[y󂰱"F, p4x 4l@ (0P^]b0p   (@B@,AXX @&.`޽{#h@4h,80,@@vݽ^x8 zݿ_ 0`!A 8<`D@!P`$` , B+h+& $Hp'@@` $8`#@ ȫ7 X  p/cάy3Ξ?<iHz5֮_0@0JlX"4 E+l`Z(}{T@ あ$0X` 4B(( Al2B   4  #4xp2 tH@&  .h` P  0A(p 4@rdɓ)W|sf thXvZ 8 8 @r$H@ " F/x ,@$p4X0E|@ 038xp HH  Z*h P<<@P @"x08P 0 رd˚=6ڵfx 7ܹo+@| x $$X r y h uZ;P  4 @A V, 4h ,=<Bp A"8A$HA7Hp$d@`p 4@-^ĘQF=~8%MDRIy5m`@A'$ A„<@0@hU( |0h ,X4h 8X@q@`" j@0`@ X@ (8 @,0#%6P@|'` ,0PP]tխ_Ǟ= ^x0 @z`4p@ L@  C .(@?.p@`d&8`6@ ( 8 pp 80P 48h`@X@ h @M 08,ЀA ((iSOF:jը08@APlYgѦU@P 0@>H``Ǐ@p0g`A1H`À $P H  ` P  `` pЀEhA8v\Р0 @$H @ 0@8AP@@  X@V8u @ ` A @P` 6|qbŋ7vl)0sf (P ppի L8Aٳ,8@$ @8 p ( P(0 @pH@H  , @  0 2Z @H JH jڼ3Ν<{0 (D  i 5ԩT*@\ v $` ]@0|eP>D q`pA+7@``4 ,>0@ x'6h`* 8#7>@ 8 $ @ @dۿ?x8p@`D-ZpP0@,#l@@h @`CMH@ `~mPXp 68h`0HAP T8-\As|N 0(  (@"@ PōG\r 8` 8` 8`̟G ( | P` D  x`! 4X`b 01>LР&M0p`A.[:`&@A HP0p @  0pA p`A H`f ` <(@ 0<0`  A8؁ y2ʖ/cάyd  9`6ڶkX H@A@ 4x`o`A,H 8H0 `` .h0pA1`@H8  (@`x  ,0s h |P@<0`@ 0` ,Xp`,Xp`@` H@p0 @;& @@e0L Ĺ=H@` (pA0$H(p`5 0X0HP  \p 0HP` @a`@ (H ,@ m@(0j֭][lڳ @ nH`@ō0@(@zL]; 0 @Рܿ"(`@&  \8A8`p  x(@A  H(TH@  (PA 60@<`  `   * T8pA0 @ ( x0†#Nx1c Pʕ(0@.P zH-@ 0` ( 0@ ,}; <8@y P@ @`` *(0:` A(P@Edqc (A 8@@`,XB>( A$UiSOF `Wf:@P \a@ 0 n] @ A@ @P<@D((0 ,0ti8p@@L @$.0@0P`1D_@ (`@!$8@8`P8x@xhax@ 3jȱǏ  @ɓ' K   $0 e $(@A HB hݪՀ(`,vAp.p 

QD+@F=v0 B `- $x L @ ) B  @@@M P UZ5p`A @8hdD[ 5  P` (0(PP-$P h@`*@@ $ ` P @$``(vݽ^x{Pݿ ?@@, Pp $ (0` $`@j@KR   n@A > 0pB @@A <`pB((  00@@ x$P  B@ (0P -z4ҦONz5 -{vȭ[ L A T(0  P@(y (8p A @ @T4A*8 (PB @q 4x@I0  P@ ,h8X0`p" `@W% ` P@AgѦUm[oƕ PoP@ P < `@H P0@( @(@*@`@>@ ` 0@nD0@w00pЀP@Я_H8x4`@ Px%$@0cʜI͛8o @@ @ Q 8` H a 8< ``С $8@  HA+Vp $8` 8<`p$P R@cP@r( 0%A; HA 0@8@{ P)$P  $PA .daC   `` Yf h ,`@ 0@P`,`PW  DP`Ad00 ` `$( @@@ $H`0x A(PA (h@ ` (H@@8@2@wŏ'_x  P ( 48 `@ 00!D5$p h (0`@ 0@2,@ `@A( ,Xp  X P@  A(`@ a ``$0b8 A$< P HP!P$@7‡/np<P@( -0HP`&Tp$8(` P@D<8aÀ t0@P0@(0PBNP@@0P0@R 0`@ pj HH>$8  (@ &(  p, A`B9wthѣI!#(H@@ٳ#D x(P    (`@@B ( 0 x` 8( Aa0 >0@*(8px ,tp@A($P04ذ@D0 A   @H  ڽ7޽|w`@8)0`@(` 8]   `  0 A  P` 4P0W7@ @0H`@ 8`A (8@$(@ ` pp@ 0H AG8 @xp@UTUB|((@Z{@"@/$@` @\@D( Ad 0 @P ( 1$]`H(! 0! 0p@@z+:8X 8h@~A< DPp $x@A ( /b̨q#ǎ r$ɒHpA `6P0P> t(0P (`@*@( @DA $0P 0{@`` 00`@b - Hz5֮_np@@$PP`A 0.}:֯cϮ}/~H @((H :0` B(0Q (`@ $`@P@п?` P@@&F x0`0`@74@\APh4B @ ֬Zrkppihk@ 8H^"/.l0 0@0 7sLТ`4j0`@  `w]@|`p G`@p0  `@hᄑ  `   $`A XHpChd(`A!0%tfL3iִyx9(C`@@Rp* 0B @ ; 0P@` `a @r$8wv@@hѣIAի8x@ Vx "A &H94wztөW~{vP00 P@ ((`@F`@ P :v0,[ ̙4k@ ΝFh` Vh   ``x 6رd˚=6ڵe   P x< ` (`#@!=  8  pA <  L  xp@f@& @ۿ?@@ D   1#0@P`$` s@P,!  `T,@V"Px@XEVZA(   p@ (@dʕ-_ƜYfΝ= aƒ @@ 8` h`P@9@:#hA0h,~A\ @ _~@  HH@ (qD r$ɒ&OLr%˖._,0 `% D0@ 0$`*U  (0Y5pဂ H Wv4X@hA`1Ǝ@  ``@ @ @Boέ{7޾.|8o$(`9s `` `;w/ `}00a 00@A A F1fԸ@$ @ `8@` ":hQG&UtOF:jUV k 0@Y 00@۶ `w@߾p P@ P@м@ VAi P:``@@mн[P8 (*p A{w?|wW}{?`@} P8&,0  D@ظB (@@(S0@ %@ r ` PAH J=`իʕ`  x@Êpx˷߿ È+^̘1"Kh@8 0X" P7`@P "0@ P `P(ADi:w 'P-*@J8 @pP@ H`m-ܸrҍ+@z/`(lp``A 0PТE`!h4Xp  (>  $PA Ɠ' hA ,80@4@0 $P@>bD)VxcEtdH#I$ @J+Y CB0@ +  @$@ضps(8K@8p7@ @d 0  0pZA8Զ}wnݻy-@É7~ypz(@v`@  p p?׷_ Ѐ<8 Q+ FxH@$2% $`@zD  - ҥL:} 5SX\z 6V =K@lۺ}at (  >88~\@ ;{YK j~}ٴ;7z (8@A-\PP[=ܻ{@ 8>۟G ?X@` pQ> 8@ DRJI@5S|@ P@T$f08p`]? VXe͞E6ܾ% \uśw% `… 0 @  B| `M @ d< \x @ ]t @v0 48x@p@ /0` p "LP0`"Ŋ/b8?`$I `% s  P F `)S0`- Hvm@ ݺȫw/߾ x 8  $00 ,hp@ |0ҦONz5k-oέ{7o.ƏG` 8`!0XX"D~}߻G``? "HP`@ *p!FP1cGA@ @I H`\ 1@M <hQG&UiS:Wfպk׫;gѢE` 8`@8`h@jP<`@ G`d `@ 0@@4@ukׯY vmֽwo>A ,@ (0 $?|yѧW@~}O_H@ 8p@ @  #((0`(˗.8p@8q0DP 0ӧP UhʵWK- 8@ `@ @È+^̘"K& ˘3kٲB& Ө k"M#= .|' A P00( ‹/@  }? 8@  (P (E5nѣG$I@)K1MI@A%Z( `:@  PjWT(@(``qΝ+@y _ pa,f8 8 p@" &]iԩU^-@ر P۶t7 '.@ sѡCu"D]„  <__@ $ 0`@ „ &Rh" pH@"CF 0 2PP :w'РA`(2@ ԨRR @@Z+ƒ-;`jתr#D0^ 0P `@0. @ 00` 0h ` @زgӮmvl;B ( hAPn:ڷs.@ `ֳo}Я/@  8 @B Ȑ\8 0B0 `0 ((0x(0@P *TzkV[lX 0@(1 B{o^{W qb4vr|Y9t,@ujv=`, @n/@/ (pAn}@ ; 0طw~| p~ 0pP B x1ĉ+ZxQ; H<2x S4k N,@ СD `L`  5+, 8X lHt"X| >X0;0`( s"<`>:լ[n-@ٴ ;z  =&Ȯ] /^@ H !0@A&TaC81 cGA @IP/aƔ9s7ofPH  $0jU(+0`gѦU,$n]wB@_`` @@$@e˗1gּsg04P@ @kׯa@@۷7>x  0P >@C@@/P`(P(~}@ 0@(*\0a"JX@2jܘQ( J 80@$P͛8sɳϟ6@(*@ ӧPJ @@X+ŠKX 480۷(0] @X< B"KA2kޜM4@׭,h ]@ @(_μУK\سwOX^7`P``0@ 9`) 0@̤Ys& O@XI.p`A`  P000Yiծe[gP.@ _@@ĉ1$O\ 0` P4  @Pn: ,X `~@` @  4xa(` ((0yeJ+YtR3igNh0zTKjTSVZZ lX5 (@(0" pW-@B6|qbŋ7V< ( @A(p@ AXvvlٳi@ @n[É7~<7@ @t~{v 0@    P`@8|*Z1Fx2d ( @, A 4СD=JTL TX5 Vd Z  .  "P 8 0p:H@  x] ٴkpH $P x@x  0P ( @@ DPA` 0@ ōG\r͙ @t\.Aݽ @z0 A "ǂ(`A.@Р h8hp. (6ỏ` @ H @*} `?. @:udN@  0|y 0}{ėO@׏@IPA 8@A@qh#`@ `#T @ zL(ϟ? (` (u 8hAXj:@(,-`@ x˷߿@0+`@ǐ#K``˘3BMh@( `A (0A ( @<8P(@8p`pЁҫ_Ͼ <@@} (P PA `@l0PI)Udٲd$ M9u% QI"SdD$` Wl.` 0  x  ܠ0PPcȑ#lD&=z@$H@(P` P@'^qɕ+@ s^uٵS@ w _y=h@h0`0h 8@p`0(Y,\@2g`  H('П$(()ԧ @ Հb`@m-ܸrҥ+@z /+@Ċ 1Ȏ,Xf 3 H #P  @@ @È /n7H0 ho/`` 4@<9 =|B 0   00@B"pbD)VXQ90dH#I4 +YfL3a"X;] h200@ 4]p Fz5v5`-0p`AԵ{ w @` 8`)W!0@4Xvlٳi׶}mMÉ7~p4wN@өW.(;x $H@ @g   8p xp@ ( 䀑Jp,[(P`P '4Р Pb   ֭\z 6X8lۺ} 7\|w`$p bh  9x `P@ x=4`@8>x=zX= @8`@ ۿ?~@@DPB "p@D\ĘQƌ|\ $X`$X@LX 0@AA <]@  @V]~- @\uśW^x FX-_Ɯ;8 ,8``,@ `A(P @ 0 @ *`ݽ^x% h_|ǟ_~ p "LBpE hPC 4`A 8A h P $@@ Ȫu +V΢Mv-p @vw/߾~,xp` Nx1Ǝ?& ʖ/Sp@A`#@ 0 @P   H<`` @ @ 8p@8P$T $00b@ @G dI'QT%KĔ9fM7q$ @O?D`G  AN*Ap ] @  P@w0Pv@a,80@    0t,@u H P@ @?`Ǒ'Wysϟ pzuױg׾}?< P~ _A pAA H4`B `Р p`p`p`p`*]H:@ h `  @v X˶۷pʝ;Wx˷߿@Ä @  @ $@$PPiNP 8  9@}@ ҫ_^ȟ߯@P`C%NHQ5nG PI)S`9K1YM9uY% `QI.eSQNZժTlWaŊ=`YiծU;`qΝ;`y_&\aćcȑ%OL5ogСE&]iԩUfkرeϦ]mܹuo'^ܨqɕ/gsѥO^uٵowŏ'_yկg{ϧ_}?@,h „ 2l!Ĉ'Rh"ƌ7r#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:w'РB-j(ҤJ2m)ԨRRj*֬!! NETSCAPE2.0,((ag[`XZ/%^Zh",\2br^`iV ag0R"-#Sg_-R]f˫ S۳m` glhm+6^^%e"˭cϯݡ u-cynX*}pnLy 7eު7+GGG,M-&pN 563L' SVS+'(O7 ҭґ46 ʹƵOG oM81swukWPױn7 oGm' -(pW ofPxr& kmilOF/X rf L(*kJK, ' x g'vrG׍# vR#&X̧& oW1gM o8.' նȮ mG.qϷTzwSU %7f pg.gtxnϧ J&Xg pilƎMȍnHlWMw z讇PoϷ ζNW͗ l))7.X1/pp.& ͦn칯˰GηqwPO,L9KTtuOv,1NO 0TV0ox38JIJg2˧-2E G7 VtuxsYHNѷ0P7ͩ/ѦQS-gP6FLSXj{H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LL ¸ǐ#KJD.G$DNJ%"YnU+DĎ%Kd%JHԪ%m[J̝."yEA \aĉ/^,$Hȑ%O\e̕8gСE&MIU@(P!(P (!! ";ȑ !BO"D !R:؉l' D8J%$a(P'G$D!?@"{,# 2l!Ĉa"ƌ7rqc'>F,i$ʔ*U: %H>$H%$D  @Hz@BO"Hz@B+b!҇=iÏ(!!BIHPFң"h'̚7sg'Az.m4WNDزgӮm6nBJ~E J~Et$=z !b?@QBB=Ӈ=i|$D!G$D $(1G$D P!G$D8" "=HD+Ytf̘BygN;y3C5ziRJj$D$D$c1k(Pm.DEB/H0"DQ "#qL2) rHtF =HDիYvvB}wnݻy;É7~yrʅz$DPD{vJtGHx)Q"r}zٳG}D׷o%"@$= D :|1DB1ƍ;z1$Kp"$ʕ,[|4k #DzAB$hP$DEH"D!$*"TZڧ\vӇX$d96ڵ}y>} 7o B|É >8`'?|8~,$Hɔ+[9͘:%AJ>:ե8; =jݻ&p"} 98D聄t}"ܻC$|x$9<"}C "D!B~"DHI{CB'J<QD*qCF!Az|RH%M$D-SL5mތD=Th$DEJH!DTJҟ?|,%JD̞Ev?HD.DBՇ^}% "bBYdʕ-C"fBZhҥMF]:] Clڵm-{} CH'<PA]? @r@ J ĈQ@D<$AOD(PA_>>}I9}IgB"H#H!ǎA)RȔ&OLr%KS)SH6o̩s'Ϟ>wc(Q!Sz Mt)ӦNNc*U!Az` ^ K ԏ(!!BIHAB ԏ(!Aԏ(! c0"DPJH}~CȜ9Dz@2ڵ9Dz 2ڵ9Hz 2ڵ>Hz jc8q!Sz O|9ΑOc:u!Az`Ϯ};޿D~=WD$H$ Hz@B>P?~ vQyɟ'QI ԏ(!ك&"D!;J}\ۇ9,!ң9,!ң9,!ңG9s;6g ҃m[oƕ6w ҃o_

D`A2{6" ĈqIobJ) I#HQ(PA2}:H@p >sC: !BkP!BϜk!BϜ>H0 ңÇ#J03 ңǏ CI B|\)$H0cʜI B|)$H@{G$H(GӧNH%Bҟ?Aǟ?D"Kٲ(Y˶[}\6uݻ_TsPCxκ9}X8# ң˘3k\9C ңӨS^ͺ B|Ȟ-$H۸L »L1ң B|(_.$H{ ABHArDAB "HzGB=bO "GBD A,3!*T$ ۇ9PYqHh"E?=T "KBYȔ 9u3#= "QB`SQN5Y )b%[Y!b`6q ]H euo;$Hz AB%$=$KB gH?!p@ ҚH> @GkAjߨAC `<ѥ )blw!b _> {ϧ_ B|/$ „ ĈAhQH7!Ml, L$HDNDp@ ")j(}RH8APJB3f@@5+9ƒ3U 4(PСܸAkWHz/AhXH'Sl2̚/3h!Az.ĉWnIg6n!Az=E !HPrU DR)@zTb)wO!遄1D! 1F +H@@I*^R>s(r!Ts]KaC 0y2+Y f N|ԴygNN3C iRK6uj B|T*$H[8lXc}8 m B|u+$Hs͐Gbh)~\ 1Vz0ɏ01FzǏAEGj"}q ң,X@PAdκ9"՜u2*=w"GxB0>ٷwއ ="G~B <0BAxQH+#ƍ;ȑA8RH,[ +J°YϑAa(Bu1E>FabDԏYRD  "Pj#= `O:f"sAǏ8&ңǕ=*[D͜:t!>J>:!Az~Dٴ;ݼ{ w!>Ax=>={!>{^8S'QgIFz A B֭C$8(BTD V 8p *JA Bcʕ2WG!>^VAVX>Vm!>ܾ\uśW^AXH CbƍdAYH=[yN| c͚zFAu*sC $8ҾTP5\!/V2(E rCks9}twh*="D!qb!>.b̨q!Az D&r%˖._Œ)e!>nϞA*t(Ѣ>ti!>BժV ّ%owJ#;SJ:t>t%^H[7Ϝ9׮C Mq!I*( I!/T E;+A B!}}[7g9};ԫ3=~Dƅ|y!>C.}!Az`Dޅ!~<ϣO|!>Aȯ?> ҃` B|$T($H! |yb֕+Tѣwʕ2,u#|iS=Y7gN9s]IV\ FÎOgJ#AD+DSڜ9}!*= "G_B<8'V؇ = G"GeBмsgϟA9Q ҃u B|Ė=vmBн; ҃xq3qV̢DʙMŊѢS!gb%9sJ$}G5:T(aČ@ i:s$HdLGqbkBYUg PE˗AISH8s⣧ϟ@ѣAXTHPJJիX⣫W!AzDhӪ]CHp⣮]!Az;EA:*VAP9CkӳH̓/=zsMs,pΝO> ң B|ȟO}B?>A .dCAXQH5G!EIA`RH1e0- bdT,#a,yJJHA' B"͙s-(zLJ(iZ Q^jsï_*^>ma#g4Q +`HP4dIVzlDСQt!>Tfڵ!Az̦Dܹo'^\x!>/sA^u>{!>ďyC3:=0aYH'mX%QK""rD>"g:C| ;Y41E\DĬI*=vB*="">|9СԨAjUHZ+ذbڴAhVHrҭk.޼z/`!Az.DĊ3nCH'2f!AzpLE2'>|JV:C,&n@[H( "D9@(Q|Q@I7gP bF-(ң.TA,Hez7bO$kz4D b!>(Vx!AztD#qeJ+Yte!>hGNAhP>qi!>6GT}aQ.0C08ƬC9G>| ]H ?2Gb1v/b;M=\zҥ .g`2NFX "&BGnA[HÉyr˙GtA~]H۹w|x}z!AzwD׷CHЇB8P/vHćF?~#0R|"%1 AJ=$ >|p=k>R8j+R.r77nS@HF( D?rL7n!>޽A 8>8q!>;ɔ+[9A ZHK#լ[A[H{Sٶ,Qd (vx=Nέb_gz !B+=ʛAA>>~؁Ň!v$HKHAkՊάK8 %՟=EM(uM1C B|D)$H-SL5} C B|*$HEETRIU =^ "V]~!$HeV =ܾ5bJF$aj$O5GC`GNM,nT]遄 9NbM(>LCxc6u Nhq^č! ͝7"tB=ݽއ =̟"zB_|_?AHp!Æ>!qb!>.bǎ=!˘!@|L9D˓!>^}4\ѹZf@#=G#N;?|KLQAb x(M*=Z7J~c0a!Az NDƎCCH/c3g!Az-z4ҦO.D֮!{v!>nέ{!AzDƅ|)Vz@2戏}H@%-%'\bH=9jK`G>| RbĊCHMe43T% 6YTP鱒e˕A9SH7qgO?GQAPTHOF:jUWkW!AzĉgѦUIon]!Azk̛ VG!QPs.>'?2>05>|҃tAzua R2JKV2Dl| ЪGs1>| =Xރ{A?^Hq}{pG}Aп_H{H*4DAb'>2jȱ'AzD(1S >)DW"Hd ={Bq$/H.X)NfX&kXE7 y"HT v'=H声"1^P"V-.TzHD˘s'>BM'Az^DװA۸s;w!> AXμ>Az!>kA# !Q|3eP2̡[*Iɓ'%ʔyG`Ћ'spH4䩶GC% zШPKMQӈA>t҃Jc,% B|,e*$HQQUY} B|%+$Hiծe[mQ׮ ="F_"fJĉر =$Oe) Ac̙+WВ%KW|4HLx}'ddJ|  JIsXizG%ZWgL.Wz\fLJ TH"?(P f)=^i1(`hӧMTx`2ez5 DM0!Х Dq1ÈAb 6 B|-$HL b8ʃL19 B|P.$Hڷs;ރa =ֳo=a =`'4"]͉) Au L M:䬓Q)`g'O)=zbŋB-|yΙ3T|*઀CdPh4i/]a=3qm B|u+$Hsֵ{ B|+$H 6|qbŇ =(W|sf͔ =HbHTz\IǏJd*P&.=z\B(I6:sN=Qbfb\H0 Χ2t"#P8>eJjQ#FA8ybtH1 =:z2ȑ2 =Z| 3̙4k "ćΝB 4СD "ćҥBx Nq豩]>~ةU,@"QFzPtά"elVzP`-OFz8D-8\z"i5G?|it ``~@K0¥݅"CHĊ31GLݼ{#p!Az?<̍#t!AzX=ܻ{DL>ۻG?E?BYhKvc@8LV-) $ y !2X r LAMi-%)?|r daYZj>:"hJ(>|TuX=V)=ܾW\nW =X`… "bBYdʕ-C"fBڈDI:Q|x2ORՁcI*@ȼi9+PćPYc5]x9CתqD ;,kThаaf@1q2ߣ(>QNj&%aX*FÆ=!q)=.b̨q#ǎ!r =NLr%˖._ "͚Bȩs'Ϟ> "ѢBH/d.uFb3bf  IRQS?BN!c;t8 f@Yx¤fM(2!ڊ>N I)N$y1c6 B|-$H޾.|x B| O.$HΟC.}:҃}%A/~<ߕ8~ =͘!>ةu:BȌ(>E9'1-'M q"!RՁdȐ0uɚe/!fY59&-HTɳ3$ voX#!B)$И0H҃k B|DIgѦUY%N|ĕ+$Hwջo_{1'B'VqcLj1 =0gȔ \đ>23{v7 w%A7E>|F,:uF9)vA#3TȎ'd)Ay3Ɖ(CD3GA'B*\ȰÇ A =2jȱǏ Cz "ćɓ(S\ɲeK!AzȜĚ8g!> ѣAXTHP⣪U!Azhğ`Al!>Ҫ ۷AKWHx⣯߿ L =+^̸ǐ#;"ć˘3k̹sg!AzmƉӨu'>bˆ2S[Ȕ{⣸q'z(_~ЅLA=!>kwbSOI⣽˟O =Ͽ=$XAA`C%N($Hѣ =D bIB`21e B|)$HAQԨ =. "SvZ5Y B|%[Yiժ[qΥ[]A_$Hĉر =$O"eB9E B|f-$HرQ۶ =t"oB ^<ɕ N|L^uٵkwwŏ'_yA`{ϟ$H?@'Az,8 L!>&RƌS"G$JzlI̟2ɹa!>v$РA(j(ҤJ2e$HRRj*֬V+ذbǒ-[VHj-\!AzЭDzo!>AhXH'2f!AzpDТat!>VAm6ܺw-$H‡/n8Ƨ9ҧS^]̔ڷG'aB+Ă(q=|'Jo  FzE } 92F3AT4I` $01Ydlr^%N|8r8^z9EC5ziҤbpjTSV:Ȕ [vlXbqm(Q`{HP".ϸQr@ >W!NDsCѡc qهF t #DrŁ2G$\3 <#x#GT2W.=772%HtөW~;)Fzt|xɗ7}zᧈ"˕T<)'>@}84/_#fp·F >|FZ5@|AIu(M&L$)I%<BG|KPEԩTZ5֭\z 6رV #mZhLQ (|;p  Ѐ1v~x֐s#="jԲb& \HJC(v]e!M$ ,M|d)4C|2a!@L64. ?|ǏQ,E:CN=}TPEETRWPb *Fz\kͨ5L&RQ㌳iH$%%>Rr EWDH$ER @0><{.ɏ@R Cj "u[lڵmƝ[n޽}\+\ #]ҳǠ(O*ڰI -{SN#_ذyNR *UH"@", O0 ŊE tP<|,d@1*=NLr%˖._Œ)s&͚6oDyG$҅K;Q~DMRDMǤCN0ђ$A3#=zqcmr 0hEˊE4N)>0`\aZ3G=rlc3Ξ?-z4ҦOmJ3fp" .]Xr/Ȕ.]1#|3to +TL"=֩Ŋ/Λ.TcL2%԰$>g)Qn2@1*=ZQ"%$(T!@0fdUMX0CaWO|DR5>@̳n0 P˕+eceJ3fd F,/ϸЃF M\ Ⅻ \h% ^Q֋&w&LlG]wջo߽V qKx$H ĉ)ryD … X$¥G(B`ǖ&JK sǏ!at1ՔfQ\@'!nOQa .\$A9U2rd/j ",U*Z!tbE5 E!$]s6A3bY𺉜`Y!N؁r8brp *A'p<]Ύ8p@ԚlPH Xjʵׯ`)RԀi'AQCʱcǏ!lM3%P"2` S >"K!RHǏ#Rxԅ'?|&ڣ >~yŏ-9KM3L)^5R`@#;?|iGX8QG #fJA|Z$r>~DÇt|OA%ZQf94Er>8rI5h*:[Ӧ⣉\~I]wSłÇSlԀA0A]:`:Ǒ4hԀh%")$Ӏ6q@Xa|ȣa AKb(0IlhƖ,9pL2D~aK 3'pjH0@SI„ (B;?|P&F?$,6(i$ʔ*WlL cP'PР`3@hy>>"Xt"ڴ>Bi3Pԭ0R ^!>,Y #FC !댑=Zup +V `@dPbJ>|G)T@ '$#]Dse ?! V Ii]]n!C(YS=|-ˬXQrć!JXs-!‡ =6tbD)F4HV=>iR?VRC2@Е]3!@!>x"Uq I3>Dq'U6 @(2mPs#{tI=z C"2T P vPcH%=zyc@|H2=㇑/>9sE"6CqE3= M=z2L:=vrǚA>|Ç7FqǗD=2D#>IJ <(>2c X88@·FCHr@#%opH¤~#N@4 )OةPW|b%ȃ \ °%r{L?!iƐx;$H SMcђ$In {br*c1r) x7)Ӱ /ݣ>%:ǚ|+ >|H4R%}aRGN:8f)O kl|e'72N> @eG֣.^͊=r&N0Jv@B/Wl ^. @9(Ѡ.c?Hl`Q7ܘ9mTWJ)Q&m#;Z~ ɃIʑ?rD#?~(@-G 9"B D]vݽ>̕DOE޽ >#dC~ da$`2#d"EL9^m`B "SܸAh-rŠ m&LH 4 @ -3Fz z̭ L\)S,@H g%K!>h$=z *QV᧎ =[l2Ѵi21ٲ̒yUM)G Ysd AˑC UB .|8Ə#On ;'>(bP[ѰD#\syp% c!@ ˖=m$LEc%i@dK&i32Ȧ=RD:[02d#0P?HЀ@H(2 >sHdx@ PG*zd /l@eeH͓',!%I&l&[Yn>ewzEk֌GeN|afI%rl=*Uꑺ%ɐYBpI*U,Y2!zՄ]B4h@ "pΔ &DB#EY"g ) hʐ"H  |X!hJ E4߫;#V.PЫWi8—>yaZh1 #KL˘+b捒8<}sN[-*e  j5⃜3W䣷o@$ٲȓOÉ.%T+0i(AD!6I&[+UjX&ٚŌcRJ4 8eXCi_"<,@3/+eTi 0` P 5C0Ҁ"$H@҃8lK> SgH."ycbIrɑ?ǐ!Gh9cyq_&\x;wVtbJ=sG1>|)Sz\9ԩURIg=d6G+F#S0) .F ]BI @l) @B6 =!*5GQ ACdp2'?xq@J=l[gܭ+=J2 BQ|"?Ҁž=v.4B6 >Ф{dQVFn!6 .Fz͛W}9>|eСS#ؼ(k,ڴjײm붭VFzt)IH7w1d+.RKȒ8QJDv&]O0GERć LPĉ %hDCh$ B(XC IP8 HᢇDdsvI&ش,$dJ<>` #&\lclѕ!J=zTX+2ՋJeT+BIyG|rG)ǑP40ziRK6uԩFycC|8Q'?R#* >|3֭\S')MCK QyQtraRI4`Eha!xbDpp -@:f10E *HTI"X,yZ%k/Rd<e W=zѣRD!MTe"xu:n-?| 9?!GIp XJ DPB <|H̡3Tz\4HFH#dJ.-H%AlTCCCL!ʢᛀ@T:U.?‚2F`ċ#bB*@hF(c8뵨 >)"DIXԠ1dV!D%$)rǏ#Zт#GBU \)=̟G^zݿ7bG. C#=4@HH5j> q"d#0Cǐ!>Nn,>%I"he"ZXHacD~5"'bup"?Hٱh]ʕU(F :2dȑd-I@$H  B"d$)&ZiJa& Q,10etDL!bldȑ#?n; A)R 9‚PZx|9ΟC.}:CD8cG#{J ϣc>@ >QI:Qn>TX`h C0P͸II"haň@6"pB%1`, йB><ɕ[7!` 2KFD*M F6ceJm(47IV¢=*GBč-jq͘)Q Pu )->|rȏGؑpdȑ'Os#P=tiӧQV} $Utzkj8 ֣MVzfǁ$W ρ艣dױg2F!|⃼"L] DW2w劲`w9@ŒG4h .0aG$$@q`@~qC$DX;Rq hX% *K4:(UO4cL"j {LEs̙H Jl!\3)bB>1$N#JN%T(Y}1E>1 X=iI!$H:Ch=1#=z!ѢE ]6 8ć:]zf!>$V@{$`!#'@edܠ!d1iO +E0IF# L*q`IWА#l 34W?r!R9㇏#p[]y囗77zޕ쌬m^q%R3 g||RȈ%C|f#FȐ?h.SDI;h:P]DP%?hb$1s,X">|` @ >0`I>,!CFNV=6|QGeAT(?)U>TaRI+Wre#&0I2Q&@2ꉏ?H"ȏH g?x+ذbǒ-kvHA֢=2,Yᗋ bذ@E(C|Ply%J 6Z撯@R8.2I!H(Ѡ%H`E9ZD$$*HXPB2aB&I$Hnɖ$I,d.(qB iRK6ujTTZ,-ulHA0ckv >ֵ dȐ{}F77Y^HC4)$ 'j4h` *CI`t|D9SVXK A"A Pe˞%KȐYryrX|іō,eq&!>#,ڣGW*)64p&/v*U GʝWҕ2q勔!k$TxJʑ#k%H;z2ȑ#l:cG]e.=jnj >z4hP?~8Ȑ0B: 3>~17N.ɂѪ\R|H$LdB0a-Sn|)R$ɖ=k ʉ*' 2s % "P GHU쑓]9dJ/$52K$qPKnqsUX<lްL vɍ/@_X&4J!ֹ\h8Q*TX-hKC@ D&Ժ@bLEF#V)3ȑ?~?~ 3 5m* NEG|G'N ZRj&X4h0ᑨ,YI$ɖ={&L "  e@:s  :P 0&IP޻%d,d K0PKndqsIcAӱȐ$ Lj`L#|cE'$,C 6.|8Ə#OnJ^ Cc;w#f89r%P~㇏?!Oc#G"eܬf#LI0UA!2eLJRblك &P*s$!BX LGrȐYR% h!dmYܸ2_4@1GD$!"ʕ(S|[S0>@)GʗSԨ!>|8Ç-,bÇz\Q&X.)>|咛`Cdɞ$  ˖  &I9䘴2Wz@B=„ H=zԓC̒$>U``$>-&7H=DdAFZ)ǑBTz0"肏?rS8!ò(?D9##VRqD?PAW)1bD>~>'2S>~`pKS~ 1ͪK჉9jebF AM2eá'h12c&[-2K$ȃ2U%P7YAaD @bD>ԹLjDzE774,2b"9( 2ì(QǗ/C|CJJL#@&\aĉ 1P_/C)WKS=9C8?|E(?|õe eJܹ@àW,_kRdRr"0cD|U,Ĉ&$(`M'P;ć>x%R9 @@"I,I @%lIV2\XsPKnSEk"@y@5 C詓8H†QK1hH^ O(Z+| …{ڴjײm-ܶ<&"$o*g>~0ncLa(>6h-\h$&I2$&mʒ@ܹ<6-A#&)E @5B@&I> 4*D Tsr"U)y2d&ԣ҃ =krM7nT`"O„ê0aO1䉡; dؘʁ>H< O sNZ?*|GNZNhPC5ziMB&K\A *tZ>~0kGZj}uC s*/{}'NYMJ&M Weظ,nDMhЯ[lk`Ĉ K0 @P ROnT~=2,Y"g 2  @d&KY`VH&C)"  >73hpѝ@Ї@?b#eȐ/ N}] %cBVzx2ȑ$KyuL*ghѹr%#?zǏD#i(N8}$SXuH D8!zդ F~Ҩc`0&} VA~䨓Ӭ i6@!$]kB+}L;$H@Ç!X,!Cfh9KȐIG%7Y.q" E` 5h\`0ᗅ'7LLܹq䈏_| Ѕb7#C@ 4x#u=9D.%Q||RH?|2d?|L>lPNc`hU0wJSC|¤V,[$ڜ9R8S@=XnQpG].Dw*m+g 2   Gr&,Y=zjA0X^!r&7Y,Ǐ#ZǏ#1|DaxCvݽ^M %%pezq JC!?~1D%P~(q(J@c'ptilLriUeFJ>F47aK >$$  ,[w 3^cqQJ >4" *KY% ZL؂ β"0y $O0a0AdOj.`Vl,q~R >NSG!a,髰>஀'//=~.|8ƏVJhT]JV^Dc?|c}c#F!>JQCƉ`>CfW`֌ ./ETaR PZZ#jMG(D8Ç ``)H%r,Icȱ$e!Sdt㇐8p- CjeX;1ңo?|Ա>~B #ÇGq$ЪYez=tiӧQ6MATBdP۶(wo?~G>%F(zu?1?|Jbgz\ejIMň~ Uq‚C }zX9Ht c>BIRK@,YI& lFĮLʒБ0ah8 ćQ|yĈH bĀJeq7Q|8G%G;T눏W7LÈ+^KL A7@{pc͇g?|>|(J᣶?(Q?|%qa3#[ ٴir:6ŋ (C$ a$@0G5@ؿF>|)A0X,YB̖$IY ]o!& @xd:f6P K>|y獠Fw\ kOXK >|yӣo٘+Щ  RAKʮ [YiծeWdA(y Sć} aĉ a<ȑ%\ٲ&,2)#[KBETRqc WA~d‚+@H|)K6mlN$YE[7ndAd | zX?&jԠ"%~L!@XYH>~ B!|O@ R,*=fҬi&Μ:w<#_DM&0I$L?8q֬?bFq",Z'Q|m-\>l!IRlS7 iJĉS2/Fȗ~ &&@D !?"XX0(R 6K^VGlCfɒ$>|R71(BX  EbU '@3N)D|bS5}1 f 1PA>WJ)VxcF0 _ 2 qc1by;yhP!J5ğJ4u$[0)I4~D!bjڣRpދ#kР_s$)B^ ~8 @Xn  " QL%KT^b@,D۲gɒ$>|R,nܠ`A1Ql  EbM4M*_b(}n= O`1NX| `A/ZL~|׷~Gpg l-Y2!%'>"Ɏk~Xc>|@#)P|2ʕ>IK ?1ͥK=*% 'N8/i|4ȇ IZP1Hp TsHa L,#g %RI{,䋶,nd1%*L9GMpHVФaW1%/F<Ǐ>jG)D 9?hmrG 8.$H̛;=5 *xȰ@ [ /.(?|E(?|BN|CB+P|<C">,)5 YRE<҇ xѠ%8`€8d8#]# #>$#] AO"e ^5##'m!+W;R@ $aT` |pO~dXBF3=(3hz2%j/>HNf}vVLC|8O|DQbĈ(>|DycJNȮ} ޽hI>~G*#=A( h0#'xp'3#Fr5&*=0},\@SG @DZl-Y„CD$ )0P@ @j+R^}c[!>ЦG!(G(ܑ?`҃paÇ'Vqb:1k'Ql`%(>@)P(ÇP(ÇPqCȔOMlIGsϱZ "DYfmQ)daĈ X0C (vˀjH(<C0ǂ+@D=rl_-%K8` $Ξ` bʁ5@qƇ 8} Cԫ_1&ŇS?J㇔P8IF 4X˶۷pʝ L7N`*0kZӃ(Ǐ(Q~HLr>|@ң)P|A *`X<.]B;o ek"Nx77UBn$.L*-Ǐ,? I3{F$IeR%$H1 ,ְGO>>|>*S^#6C|ҥ!M)әM: P(  KY?~`q Q]%|w0E| RXJUY,^|S'[!B&G2* 3Wd3W4R8' [X),[HH1aG1D1{ CH߉A )>~ a?(>"%M@\' !>a 44 ҙ3hs&tvР?(>.DԨN!Z}pqD<~LeĉӥK"*%g W"#+`6qM,I\"kff BIѢ5>dKhਠ-ڞ-Lej\44RC$N\V&j4ǐ!G yChr'X,<;׬aUHN KFz:bEс =` 4xaB^|YP჆,aP4R#DqeJ(}tGL3 9D @\R,n8]2U$h1:G 9?0A`'\a=@[as@E+>xUe˖*PP%dD ;C$j6Ç @Ϛ!G YgԚ'hH9r `Y@C~="E4@,| `bU!>q{v۹wKR,`*e}"ɓ0C|Է%J@Ǐ>:tXI !%cE4HR䉔Pw\ǫS E04Utɓg7~:C v(ܸARUi@Ҵ! D$`$'Q`>|~>25cæǐ4 AP(ÇC2DʘT 8CK"G!$Hݼ{ <04䇄ee\#J!"@|>~x=&XÇ(OI@/Z<%M)G~(%Zc||L2 RtU+$G޴2bJ#gxB!>TCF#JLVFؒD]+W,؝!>>YZEG|XARAGDh|pĈ%?|bN1ROݒ=LJ=ZhҥEઈA6,gn?1 E@C}]zt L$>~cD>`b䐁@_? PQJqhHzѓ&Lcٕ-(Mr ie˞fzxHGz" %It2Qw$1a~>>8]AF %F(nYÇ.T,ٳK~}@c0†#Nx13\y  nݒCXi?(Q@<3䇏?|޽$)2Ǐ>|BH%5C| '{}񡽉;iQ\p&[z\Q$"EEWCl3f0$hV "@%Hoƕ;n]srE*Z <#@#_lSϑ EQ?|d" S>|=GiӦAGԠy)@H=Ƈ"" fȁ]=z2Х"7n ]ְcVeW=vز1Z 8p 1 3h|)#2,YBfɄwCCj (vY!>ٸ#׈R 4wyć?A>lj"mrI@|ӧPJJթg2펶 ƌ,x) EK.&M㇏8B!>'؇c@K1eΤYS&_ !(@*I['3JE>NJUY QW%B|%ir1Bd&JS$h=zd@ef EWzL)^y"HaO8-@|ǐ#_B$I"jHT )ClҤ1t)5a8lpN}ȑjH4h4)R%I >| 9B@}@! „ 2l!C: ASXC|؉D/A@q?!?fҜPs >~DÇ OHyć˖Q$hX"AI(JՕr"I2WP  <0"P!@|Pȗ4j$Q 4hԨy>FYk$:> 9b +Vk24iЀ)ǏG9,%I3)I!?|׳o=t~1PH*RDz @yC"?(ć)=H"1JcA,=q3%shX"\*2$Ug@H2T1k#]p%䟙W  R "E\C)Eǐ'R4I6l<EZ$H%(8sZSʑ@H&j, ?(yF"IJҕJ0/0E9䇐 =W~{v۹g?s4*F>13 -R5CSA>|#F %(%FL8QNJ7Q|HhcȐkL'hBG+ѢcGE1#i]^ヂWT!Sǿ)ZY3ȇX E$C4XC5`H;w؇41S!R Q1@H M1[& IrSLċ?<51&i~A$6TJ4?|Ĉ%|pĈ%Q|Ĉ:?C@3N~ԱbM>e"CqT&L10\2BgÆ+=\RQu)**FaECE|8QУ*Qi{Ci7Q|v]zdfhؤ$@|4Q L>~IsN)NE=$ AF).#F$5c)FHĉ.=z$,I9hFZu =blڵmƝ[n^)p떁\ ]'>E3ć >| ѣD >|Dɘ>|$BN(ÇBtI)_H"@|.L@;J|R2HVL٠JC0WУj(@ň]o "ztIPН;j@͔IM>~HsTKoEޡ3\ KJA9]@RD%z2D1u`@&R@=bQ¥G+D1c4ҦONz5j/ؾV +蜑%M֙3"jŇ ǐC~@1d>L}(>|c㇏"LhYMFadJ"y\mC 8]Z"nzD`#^"w)C2dH$U“˖-U2yǐ4w A˔8O`L#GAEG"_T˪H"C~P.C:d!XsE*cGaÇ'VqcŚrRH&EQL HD9  U22 `P0%HlGX ңٳhӪ]˶ Ekg ")SN*T6>'㇏ǐA(Nh}qI!@ 9%M4hH92ć("Ѻe^YtX ,w,x8i@L*Fv POHc="I4K7tK$iRD؀as.>iҤ>~ ã"`ԨIR!C`$aݛ7HebRe@Zǰ#LO:y2ć!Az,eSQNJ;lق`md:CʦBQ|Ǐ#Z Ǐ!y۷ Ǐ!GHy#OA拔#@|p$!j]RvǕE.}pYYvqJj1<~^Mb$ ..=[5ć Edϒq> 'ɨQ>HII@  )?|R>k~!? )DLU&EsI, 1e@$L8S,">(!(@%H2gҬi&Μ6I&{TΩeT'?|͛1C|1F(?|82jײ]㇏C[w"Ep@QdL M P/!)C ХG# P &%㇂V2_xcF9vdȏ>R?|2GڴG|rGܸFz\B@w 2P2INpKɒ}RWzjf( Gl@9Gn?~jy0ć!nK#F$I>~q[eVL׷~~RFԄ>ćd@>: VF8ᣈ#c?=ztbH]L&O'P-ۧFpbԫ[=e0$ = mxp^ć>ѣ> X> Ǒ0O|<-^ɐ?FC)H*>H*Wl"@430 3W@GpZӃ TǏ#G)ɞ4* m ȏC7/XIH Cѥ>葤d >ıңK$OZv )DK 80fzƝ[n޽}]\Ø0R :T̓<@|1H&CC^J')C||Ȑ#?~/C4)'H1FșC\c#G+ qvΙ.&=k5`ĀʔXC| :E?lYҌTN05Ȑ#Gf V)RD &U$aȑ!MeH"McH)T6d)>QѥKEJʖ/cάy3efrU 6I]搳Fv!{ >n΍} IB8cΟdȑ#?|<!@zciV/XeOJy@ҙt9ׯ\`A#`C.qC)G4ٖLw9$!G % k ZH"I0% 5k )$5>9C&>JuG׮*U$)Koƕ;n]sʕI&L 8TpC9G?13!c=ZOPCcoQlW-qzA҃Z1>k3T2Fz0Rh?6c-}1}@"F,IEPIX&K>~EJ1sC|˕8E$)BTH*]ʴӧP`($L$p-Z6&Aя>~1I"@|A(?|2߿S#ʏÈǑ#aM@>ԣ."z@!*=R*F5 '!*]%͋[ 䥇q/u~E3:4,᣻ @|1d>~Ǐ!E$)H |0e XUl=rGBɣ @!>~҃ʦ.=HBH&@ iRH=\zdK1e΄q D,ɓ >|Ǐ1$Y}'>Q!>QqqD.A,ć'aH+hmBVc!1H {ɈRFqO '>dȓ4i$oѢmuQ(Ҽ  >7a$ فA$LJ@!>| TQ=yG Yar:=\8`!Ĉ'Rh"E/\9jads4>|h?1$?~?RG3=25G+F?~1$ծ*H8ć#qaH#]6inwAy0Ɖ#-h0DAG%Fz"&>sLX9RJVDڵeTZZ$ 0>v(J >I2^0)?~^#buG=1*+>` ZTZ2~FR}㇒?>~C+u~81gN3N~ԱbD>q?tA‰!@|pKFztaJ+Tz =>|A Wd  >w'?|rGbMlIzFzxÇ(k|YF5@Tć E0)v$I Eà"Ekǚ&` ai!H3=ȗ7}z٧21O&QglPA> %1䈏>~%B@#)B|8Q>3=ypbNHC@ׯs0"i ,0IځBhu ?|"L0i2$HFz(cȘJGQʠ"[`2"ʖ$E.a)L$Lx"oPIbcǚLr#2\\" H =;=ԫKKM0Le@xPH#}xC>Ň~?减!p@p >~Dq?~jy-pH' z4btfeYňѪ,6 \Ҩ(+*?Ҥ%SW> AUC?P*cet1%.g 39nTmӅ+qRf= <&NC` E!!>nyȐ"` JXjH;@|@: $@|c"ULvH`2UaO 0 *);=2V>V`5 Ȕ1\z@,y2ʖ/c<%"I2zex߾]ćuMmŊ1C|c#N O$c:>:ޏdcPG$ ZzrFL4LeN"H:s&M ˔=ć C8 -dIլ^lO /}2HM>pL*52,L4M=9ɤG jć j0!SH; IRoƕ;n]wN4F  pf?~ iR'oЬyJ!>|2ӧQ#?|2d1D>*eWZ@P%2TLH|~(:rI-$ Pf,cT @DYǏCh\q  >| 1aM)$I >|ǔ:C|ȃ @C HV|I84IңիXjʵ)EoH,w0Q"FEE̦+=z B>QDǐ#(?|2F(?|!DIR9Gf >Q0 4Qr|Ђbn.ecǚz藧P,!>|AǑ!Ep@΢Y]!)CQ>|GR,!֬á5v,D E_b=D90GI:Ň 1}̤C'EOA%ZPhqP,lc`l(0@CJ[>~(1bDyuĈ%Q|Ĉ%|hӖƇ0x `*(G~ES+fh>B .]xԣG8?|!@$GxҤԣ:?| QbĈ(>|PH1B"EId@BC|)ǠTz0dxO!^zpÇ>6rcȐ?|)RK*Wl%̘.kÇ"@Yse |B?|)ć h@|%|-kv#FDÑ#Fc#H>1g=z!C #> ɛVF:(g̘>-?pJÊ>|6 E ң̬\OÌ>)1bD">(#1ڝK ?1B @|ʄ.]凝 TD r bD)VxcE/q$[Y !$۩/ZӥK@4 Ha $ &A@QK6G(?|E1C|E(~HI#eAQ* uGE!!Rp) b=|#KI]"EGWD>H$}:4K@56)ŇP(ÇPaw \Jv`6 (:>~E @Rǒv(ć qd~ ,e >z M8Q~?~d  TIW*A(PgE?~3' Cz t @|я>Ç/]m@z7Qz)0fz0UZL1ңW|$ }"L5ǜr)O#ZǑ(Q~x#;v:Ug@GÚ1d§9r& 4 H&8 8@#ztԁ#ܻ{>w.c|7opx?>|! ,A*(PC(N\ʼn'C|Ɲ>~P CdB |<.DIՕ=>?~@-ޔ=h )DX0GyKJRp͚4c'uir'=S b!O$ EG=dU"EHnBc.ݺvͫw/ P|减…c?9 2R  |(Lz(>^-m?nߎ? Ǐ:Sz GN&LR22`2LSSH8Spd!@|LySD B?|$p @|5@xY)j$IR @G6K4"E h(?|GSOF:jUfp"F _1GY?~P o1XćQw}/)=GP?(Q"GP(3G(bMMJe~L@eu0q#L%ccH05rJ%, dPi#J1B~1%qDΡE4Ц %ؤIC|( !EL5@2 !D>~@Q"!Az\ɲ˗0c|i&V(Y㣧O?~⣨Q?Ep  >JjU(Szh:_>|PbĈQ>|DycĈ!>!X]bҥ4H$jV*0cH!>|bD>~(1#R' @b4n{>ܳRC1"i?PQ-Qt2䈏A^#G+J1*ծ?JVpbA .dCf8`ň5>|ã!@ I(">~D28L(> QI}PbĈ!>|8RbĈ>|+ cG# @HgT1G+=v9 QćGҨSF^zF+ŦqEZ0oz0ŇJtć#:)NQo> .J+%C|pG7?|@ȈIk|pƈ:?Qyկg^}0>Qr`??@?|bQ.P 'p 5 "F(Vzph!$J?(y苖?R减?|M7)OaKb6yb2NpR.%J(HHI|$J\t*P.IЮIJ C7|瀮He#%P~>~#FPRǏ1?(䇐 =/n8ʗ#ŇQ~PN|~p_ÊU >|v |pvY >χ2^r?~ ->| >Z O]+۶Yѣ -ov‰;DQ;}ǏA~ ]q :]H&"ur̕=s'N$cܸaGˑ{$ɚ-JA V@~pÇ(AztthѣI}ժ5X1 wpIÇ%AWWƇ @ Cqއ>|EJ5>Ep =Ȓ C, HN@|XqD->:E0y:C ^>uS"jb'.A̤:0ȇPZU'w0戏>~5돭> s5`fUdm0IjtB!#޽| 8 |6#S >|)Q  "`p…Fp5 $EDN dyy"E}hT"@|81G$3}G|D CtȒg͓#a*uz2ć#vNs@r v\G* 4L f[$)LUTU^Śj!>l(yTcUIYP`<HaK D1?|<^Η/Z1HK(|rDGꈏ'uІ4ǐ#R<9%ݑRsiX#R'6BS)ROxC}"'>ܿ_|8 y~ʄwP "C~ć(Az`̨q#ǎ?E>~_T.yAD!?TNT.Z3\C|@*u>~A1D%oh -S >~!Wț7B| 9ԑZs'[#^~ ?aӨЛe;,Q_0R$%^>cˎȭ{7޾!6X ,;@Hf H&[4w(Az/~<ϣ/l@ >|1vu H5"Hf>~8%R!qtGG>(1bDIGl3C@w05?RǑZJ6CJv-?|d"O]l`ܭ3=,ãO4%Q|ЂG#>| "͗BFz(@Ç'V1bQQelbF`"G%I|` >PåGkׯaǖ=vmmIw >,҃$@q@0e@"O1DəDN|#ѧW~H!*R !EFh1}1Ȳ?''ZcŇE_i刏CpGHVu8Z*m戏_,l UH*ӧPJuFAfCEY(XT)⣭[=\zȝKݻx!-LFpaUn@D 3HjI-ܑ#-c1ؾ׬)$#xJ$?NI'=P @G]_>8" 4R~#Xe0hoĄgLFl|"0;)oҤ[%NXѢD zrЕzɖ-ر+Ǥ1eM9u! %@_Y c [Z YjO* [qPtyb(4re;N@ 6~=b*yN|>HI#eGB:w3@1£V|| O )Cha*F,-?|L^u٫ D+gt9J#6E$FC|8Rz?,h „Ma^z36Чb߁08  4m{ @_1BE Ө28BvGBpRRJ3H4wsǐ'3d?l|W(>2\-_Ct_seK(h>E; -?|*&``3-C|Tć!R<)c -)Opև%Aֵ{o%N|c QK4. ^1tJ IKѣI6}ujիYvKO| Rؤ9ÇNO ('l1s>i"e!Otr/xyR$I,E|@A0M/<#BBx1ĉ=1!||8ǘ$sÈW;A HN`<{ 4СD=4).51"Ǒ> 6x=HrIXoy* K1J7o ]1;~H$X&Q;2ѤK1EլW!wЯ,̝(4Ob XZ 48l^z8=ԫ[=ҡ`Rć@1?~I2@Bh&XOyaYf{0b:2dheE?~RȐI!&-]2L5m1E=y0 $DysGz1dHq aÇ-ؼVXe͞EVZm> %  >hR.%Q|${Ȑ. >lS]EňmE1?|lڵ}n &@|GCH͝?G!>_>D׮L]D z X0hԏ#_h_~!p "Lp!Æ `" "EÎ@`IRH$[yG@ P^*LhG@ my @$` @'NB:U @|Q.T"6 f c-۶n"ݺ><<p =9QDžkFQpxtz`άy3Ξ?-z4ҜKe6UTfȏM,iä I,#YE,\Β6U`" U&a)CFԵIy@Σ?g͏>Ñ C̒*E8PH&TG!> FCҼsACcM#G\XÇ5dVGM7qԹgOF:hQG&M:HOId%mVI⃫&m,ٓ `lٳI Uٲ̒%Ul$IICqȐْ@ GҤ >~s!:<ٞ=m񱚵 =`62%HmSн;8rGq j 2Gs MHpcH k| K?|yѧW~!Ǘ?~}L鱟?=$ٲgOUH%K0)"E0Ҡ&L0ҦM&{ać 01-9kP E2$00Eij"XՇ =Š"FٳbX6pÇ] EHwg@ h$E`>J%mǏ|Y2!_)L C`"e͓5@U rAa!>$NEAر @*Lԫ'>Få5Q/9!QY2 #L*]c /\{ϧ__~'>?@,h`A'Az0lh& :](>`J@&@|BZ` %FRA>E|HáA$MP1"Q" L&Xdɒ|JQ  >ֲܸAkWHz/` E#\#ox @2R@|pւG.m4O5زgӮm۶ =v6H.FC 0aI҇D#2E?~A}"%JA Ic&>|8"U$I`)%5H*XQH#IeJ!AztD3$IRǏSE(!>| Qb>|T gzTzkV[vDcɖ5{mڴBp $H*G>| ) @ I|҄ ,PS&c$) [>HR5,{)2%c8$a XL׀0ˋ =WGvN=Ey0G&C~1D!B~?E… :|1ćA1ƍ;z($H$ ¤$,IDG5臠"X,YҦʤdJRɐ?$ٲg "?Z"X,Zȏ2I(C)@,_*X 80`!Az>DŌ9r!>*[$G*5G&XȐ~RBa@ݼ{ >q$ʏC0( -[4DX CVJTzW\uޥD}( X`… ĉƍY2=I!I!?<7$gBd˒%dlNΖ$>lQwC?Dq2ds`@H$`<S$K/az} C|#S?Hc A?&Ӥ6mla "E`LR >>hJ&OLr%˖*!s =n̩s'Ϟ7!t =" "H=K$)!X,ɗo’6L0iM*m,ْȠ#JJ@Ǐ#Q ̈́fH$IH5`IRǑLK>/2i >N!$H֮_Î#oG&m,iSex&L0Re "@~ć!Az`Ϯ};޿DL~=W?E>IL @|$dɒ TaRH-{4)d˞*(OTa삐 "I#zԫ`()$I"@Qʞ*( 9:P_ ҃lYg"G[>-{ @`&Ʋ% Pĉ#!G2L,A >a¤E@jFA|I@|PDȈ Sȟ8`0aRć&!##!#? ⣢E!AzhȱAI >Ra$ OFHI0>BFLH*]ʴӧLA =jʵׯYA =Ҫ2>~A%mo@|(RZ(OuH*`|hPXBzFZdK0@|eFCThȅL{L⣺uEَ "CkH&XK>RH3=Ͽ=$XAA`PH%NXňAQH!E>I&?T,[0)æM 9Iu zAE>k$L(pزgϒhgOX4)¤%J!CFλzLR_B \a=ر"Ifɖ"?""$LR?(H3=dϦ]mܹu"oB ^qɕ"sB^ٻ%dTiÇ ITa$"?~Ǐ&XYDΒ$>$aR m,R͒6`~Rdȏ!MYͤIU0&N!Az'A(jG$[,iZɏ~H-Uǐ!@åڴjײm-ܶAkWHz/bAhXH'?{9X$ɖ-LI@K6KTaćl )dϞ$>2!ayRH$LRI6Ulٳ% @($I%K0IHp$ (dm4!"Ilٳ%  C..=H4yeJ+Y "GLBys!;yS)= "GRBpٻ%dȩȐ'`0Il >1 H&[0Ić!w LƄ&E| >$ +0@$ć"&aIH@ $ 6m0)Gjժ8vlٳ8wn II">I-dlaz >|ťGv۹w|xA0^H~|G~AЇ@!Az<2KlIR5!C~H E$)ć#jV%&&>jR cd) @&MԠy2D62%)dH$I I`% d˚=6ڳ@TY"GN$EqLUȑӦ*`;~ 9ɔ##f!AzxĉѤK>I[#l!AzؾeX2%p %J @)ćjC;I:'RƀWc7 ةN=`CB EpK̩/?|\ĘQF1I2X0KUlX$d@qTPEEh!>>TAUV>Vl!>̞Z\ d>(1bD>~(1bD>~@ &E|hReK&t8mGaIֶ  qVL(rD}ӡ&@\r͝+LjUS0TψOMz _|_?AHp!Æ>!qb!>.bǎA">~GI>)1bD>~G,U "MbAqE/>9F[d ~(L*=^K@~H9.=fպkW_v "GYBP6oƕ;ׇ = "G_B<$VC!G?|¤͒6U02;Mɫ,\)Ӎ=j-=# T)e̗/ S%)_H.*6C|d׾{wߵyiR,E)eҤ*I)2G5X?"qA*\0a!>"JŋAȱǏ>Ad!>R˗\AǏ?|㇏@AH, -ml%H0XcLٕeqneYňуe&YEx{ $ #7et'qDʗǏ|BYʑ!>2k޼ȓ/|Rk >b mң N B|(_.$HЃA} ң B|/$H觌?|ȗ㇏᣿>iY&[$F-"@|hb2=,J&*xɒRҗpv̉&Y2n%ԮU ĭpî!p_&8 B|L\eB9E P|q>~ m@t۷?+ &,Z`R >|4̕+e`kVfs爏&Lً'77ni#n0c@N>TM07uSj7.!b⏌>$u "Eh>fqd> 8^z-j(ҤJ2MDRaj!>r!Az-Dj'>Q"^RÇ}a%JGbLJRL+Wd*ć i-Z,H=g,He%3ć4W2UQ,o0 hȀEqr 2Xp|z >| Ӯ^1gH"E|G !(?|!>$NBxcF9v1#I e B|tfLBy3;y hP3Q|>RYB?~Ç!JQȇGoz\7) !oz s0-Xb=z(9r #Wza@ >4N'+((>LYV1W [eʍ+]}Ǐ>|4iG==O0 $>~cD >cD>(0b倏(fz7}zٷWDq!>Ї # B|8|($Ḧ́UG7?|#>|PbĈ!>| !IE 5Z&>|sd?>Id2#4-aNNxT]aDQ>(ed @K>7& >:B(9Ç#%FHjÇDFLݼ{ << =;"ćԫ[!$H܃> =ʛf-[VKܡ+t>(Ji!t+Qr\>~HaI=0RʘTČA5}|9M$ZɓeT)#&5Ɤ{쾰*۰C?|)R.k>)ć MAG.!?|1FIybIR0>șYdʕ-_Ɯr!><hA@Zj>[v!>lnVp@":e  @>|H"@|1dH@‡U ,U`IR?2?Ȑ!1H C| KY77YfUe,R $)#_hǏ?4dj"MJ^ +v,ٲfc-[!AzDvCH~c0a!Az N.|r3yHǏ!@ i@NH,UlaRCnd޾ @HÎ7|߲׭,nT-Z8N*C'#<pEe9 HER$I"@|PE}G"I)c9dI'QTy2/a ҃f B|ԹgOB:4G ҃i P|DS $ovG[ ETI>~4dȏ"I1x0@|$V8N:r \eNn|13 8N@'; |%Y ) ۷oIHo@>dǏPH @|D2Kױg׾{wۃ1 =Ч"G{!$H񱟿 {cѪƇC @~HEIG B &Eh !>$I@rFя@*@u\iA&,5ʂUn)cϪ,YrI¶"I&)]x}RE4Ba ?~Q#KL˘+⣳g!AzDӨS^CHc⣶m!AzmeY8-?iTi(sE $@|hQI&I 6mXɐ}(JP(3A8,R4Ca*ث@xʎ/l%fUTd1cYĦM @| O@QD@~H9.=NZUY^ "WB [6iծeև = "]B۷e~1d`c?L6mH$L#I%`cc?F C#F G**=,M?BdCҼw).2$Vy{?~>"@|%Fxj"ƌ7r# B|,)$H*8%̘2}8 & B|)$HB{h减>0TR [, b0I&KֶaR!r?1dCj3reJ>&&M >~Ish L &@b }ܹ"E(ć!Jt}åڷs;A(o^Hq=pA ="h!>2?|rч'utiRI6[dB "L`iҤʒ%U0Rg'Q~?(Q2fC`HU'̑?IHJ> ZN u͐!R(  $%zF >>qHb?~D%c<cthѣI6=:Y v B|Զ}wnB;É yr.cGt@TÇ ECOM$aʖ*T$ɖ%mTi $L,~=Ԩ@8Ç @X!?|xرd˚=6ڳAx WHtN#$޽| 3A8XHs#2}RȐ>| JdK*L HA&m,ٳgɒ6L0fϞ-`8~̛}-]_ɓ!>9g!C'~CD@|\%H=~RH!R =\42%L5m 2H=T =M<2@ dmӦJ `&5¤ʒ%dܒY $E$ ^?~049b M2C%4M8+)>L2@\} n@|>G ͝?]tեCv!Az|^xCz!Az+ @Ȑ#?|H*a[,ć"I`f9rlEN2>~pe>06+>} Q?"c >|rV`>@|IvȏC;d >|d?  =#Nx1Ǝ3"BȬy3Ξ?g"BH> ?~1T|H*${Tc9"`liwmTć#h :G !(?|͛1C|RLZC|ϯ߇%J 1Ɠ'=>~h18q %J c%J @8N| ҃hQG&Ui B|D*$HWfպ B|+$Hg]\a8C|ხ>|PbdC46UPǐ"L0b&L#8da >)1b>Cq%F(Ǒ ?@Eu$@t2dC1d?|鉏R3=*\ȰÇ#: "ćŋBȱǏ Cn"ćɓBX "z4ć?|%F#̘0>|Iɐ!>Rd#)$ ?!Bd#VR ㈒V8c+Vt C1D#?~1MJ~ (> ći@RdA>|<dĈ!>|DQbĈ>|ǗJR|HeJNNسkߎ= ңӫ__~ ң}3.#>|Ǐ>| D!>D"&:aS&q"E|1?(#d&Op @8pŇZB"e@(Q?~1C,Zm<=YŎ!@|4cJ)2ć!c(?I3ć%qgСE&]iA`ZHeϦ]A[H#2~s@ Yf ?~ǐ0p,Ĥ#i\ EqDs~2@ MԠQ3ȏ>|@>|З>| @|(c>, _ԩҩJO 4i ȓJ N92T Ca!RҤi >|@ ,ڴjײm- B|ЭDIzo^%N|.,$HĊxtnl?|1f@6>|yς LI\MJR O#>2 !@|01˂8fl~x@a~>GҦOSR_`)R08˩S_~"}8rdCH#}@ eJ+Ytf B|ԴÉ;yN'?|5*$HK7[S?|2@@aM)`2 #e(=c^i$MU6C|tHM ~Ȑ'Gq$T,bΩH2?|9%T/Z~H&G*Ky@<<ćh!Az>:լ[^Dٴk۾;nB \ A*tć!?|݇o@2Dʗ#@РA[>J&36EW(Ȑ?Çee tǏFbe!N Ǐ@9>~ ʕ?Zs#G$x%W')_BitZByۖ >X$ȋ#O<C)R VHe͞EVZmC\uś7 = bGJ+=D>#FD!? @=8rN=iHK=ތM|#}9Ǐ@C?||dȐ>̛" #?~(ț="Ub>|TtHm=(H=(㈔'>.8"Eʑ>>Bc$ɒ&OLr% N|)s&͚6otϞ roW>"MC+b~Pe$T;b~a x|=aJnߺ1#Ǐ:=s䇏…x1Ǝ"刏ʖ}ԙbER4c/ˬLcZ]Ȑ!>n1d>!|8Ə#Ox'>C.}:֭; c;w3k|8pϗS2: Tω>[&GC>~F >鱕kW_;l!>ЦUm[o ҃nB|G_} >˗P Scȓ!>|h9uC~2ćC|!O;h dȑ/ p;⃷G2GqǑd)ϟ<"aA4RH'M2 }qɐ>|ć C! J*\ȰÇN#ŋ3jȑ)=BdL'N@%/ I=zӈWFEN5ID-aD+bHEmk\kΜ͵ԼH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ L ǐ#K<A3k̹ϠCMztR^ͺװa#(۸sͻnNȓ'7УKNسkώËOyXϾ˟_Ͽ$Xp.dC%NXbElG!E I)UdKYM9uܙ@A @@ SQ @@Ynի [,Y[q H]y۷o&\aĉ cȑ%O\ٲl̙ Pfz5]mܹu8p'pɕ/g|O^uٳ'wŏ'_xg{ } 8`@ 8p &$p'Rh"F#H $ʔ*W0 ̘2gҬi'РB *`@J2m)Tjժ @-kh-ܸr 0`@z@.l3n1Ȓ%2̚7s3g.m4W زg.Pܺu(7‡/@ʗ3o9tn:ڷs>@Ǔ/o< ӯo>`0xaB 6tbD p8vdHpXtfL3i0 @N hPC$ @RpjTSVzkVY lȖ5{mZd $ֵ{o^{0 @`0|qbŋ0 @d|s 46}ujիK(vlٳi׶M[yxpÉ7\˙ztөW~{ut>ɗ7xw?@ח/ x1C1F  ȑ$K@@ DHP @D-^(Q=@H%MDRI9@5męS'M:@E%*>T\ ~UEW\u0 ^X`… 0 bYdʕ-_\Y=@hҥMF-Z]@lڵg(@n޼ \xG\r͝?g.`@]vݽ.`@^zݿ߽ ~ p  (`!C@8@/b̨q#ǎ? R&O`%)s&M ȩS>`(ѢF"Mt)R@:@Vu+׮^@`,YM;@n+w.ݺv͋W~`0a Nx1,Y/`3Ξ?-z4hN=@֮  {6ڶ `7o>@Ə#7^Ο?/P Ȯ};޿/Σ />(p&TaC bd( AA 'Q eĔ9fL  @$ @Wf*;lYm[k 0 @_@Ç  G,`@ǐ@2k̹s-`@Өװc˞M;r NK س[@0`@ { > 0`@ .dPLXDl8@! PI) K̤9@9uO= P.0 SQN 0@Y Ď%[le۶m-P]y(_&\8/ c\eٳD iԩUfk]{u o q`|ѥO^uٵoޝď y`{P߾ @,h „ !P(`@7r`"G $l%̘2gҬi&ΛsB (ҤJ ԨjuZr+ذb ,m+`@rҭ`z /.l0 hP\̚7o.PТG.mhn=@ز `6ܺ 7p/>@ʗ3o9 `s0 Ǔ0@ ӧ/0xA @t H4yeJf̘ys;y hPC @RptSVzkV[ l5+`@kٶu`s o6|0pc(@(@(@vlٳi&py0 @p0~\˙7w<W0 @v|xɗ7?^~|Է@<8@ 8p+N$p;zH(`(`(`z 4С Rx uT  ֭\ ر8vlۺ} 7ܹt  +`@ >`  X|Yx ڳ8:i  @ ?< t}ܻ   xۿ? 8 @@P >1,^0 FRH# Rʕ SY=}TП@tM @TU Vve͞EVZm @+`@}` @<Ydʕ-_ƜYfzM @j֭] l{}\pŅ @<.`@խ_`ݽ @G^zݿ_|0 " 0@  q.b̨q#ǎ?r0 ɒHR._Œ)3n0 Ϟ*t(ѢD t)S *u`Z^ +v,YHvn `.ݺv ߾,x#Nx1Ǝ `2`,`@Ξ?`O `5-{6l@  C\` /^H@/>|?@ `A @C8q1fԸcG9 dT)`@/aƔ`7q g:hP(@(@(@0lٱ0P n]w8p@ 8pÇ'6,`@Ǐ00gּs-`@ӧukׯaǖ=p @o>xqG @uױW'p0p0p0pO P(\ȰaC(@Ǐ @R ˗0c @8  JѣH0 ӧJU@Xj5@Š0 ٳX˶۵ . @(^X @h̹sg@XͺM{s HH X|УKNث /`@ӫ_` Ͽ~ XA .da$NXq4n G YIҥd M9uO ZtI"00SQ0UuaŎ%[Yiծeۖ ] _ Pذ/ cȑ%O\eyE@ iԩU @Pk]{uo'^/ s^uݻď yկg{_?@0 „h!D h"ƌ7rcF,iV ̘2gҬiv РB-j(ҢhtRRj*Vubǒ-+Vm-ܸr`z @@`80`@Ȓ% 2p3Т9 4n5زgӎ-`@ܺ7‡-`@9 8@ڷs;0P = 8` 8`` 0 @BpbD):0 @FdH#I49R+Y@fL3iִ ;yhPC8pK6ujԧ4 klد0P@Z .\Ե;{^6<@ŋ7vrdɏ p8wthќ pXv}wnݻyޭ@˙7_.P۹s0 @x0}zٛG0 @|~ 0:|1ĉ  1:z2ȑ$K<2%J|9@4kڼ3L9@D=4ҥH 5jZ5֭U $6ʚ-@ڵ x t"(  81;.@ @P AK@  ( lؾݼ{ @̛;= ={>>ڻG``@ @ "00@D\Ĉ 0H @-]"00` S|<`PEEth> TU^ŚUVVXe͞=;@m W0 ^X @b<<@ʕ Y<0 h@Z]@lƝ[n޽} pōG\r]tխ_>@$^|̟ z _@'@~  P`" Æ (Q@/&`#G  @& r%˖._Œs6o̩s'Ϟ>w `(ѢF"MTB0 ժȪU^`,YM;@n  w0 ߾,X`1c@<@ʖ y3Ξ?zONz5֮W H`6ڶoέ[w~0 H\Ο`:u`>@  ~Σ0 /_`?8p HaC!F8qb0fԸcGAv @I'QT%Ĕ) A7M @QP4O Hjd* A_0ЦM @[;7w Ho_Mh׶M P (Xy4wT~:wp}z8p'p P8|1ĉ ƍ98p$K<2ʕ,[$p4kڤI(`@,4:uJZZx +86ڵl 8@ܹt8p|%p0p;~ 929f ѤK>:ե0 ٴe 0`@ O  ԥ 0`@ܻo@˛?>x?{ ?~(@@B >@-^ĈQ|RH%MDd\ @5m(| PE5ZM>UTQ UV]~VEVZmݾW\ }X`… FXbƍ?Yr\ƌΝ=ZhҥMFZj֭]@m߾]޽ \pō^͝?]t ]vݽ^G^zݿ_?~ `  p!ÆB` @@?v@& @@ ͚6o`> @@F"E*B*u*U @Mv-۶n+-ȫwo^(@x1ƎC&p0p?L(`(`nέ[7 H|9s `:֯c'p0p0pÏ/>O8 (@0bE1f$p0p'Qx 90zu0 @w/`0`@׿H(PÇ#JHŋ3jX CIcR\ɲ˔ I@8s(ϟ@ JѣH-@ӧ JիXjʵׯ`ÊKٳh"00[ȝKݻx˷߿ L X̸"K ˘3k̹ϠA(ӨS.]װc˞Mur.P Nȓ+_ΜNtOҫO  }$XA  @@ E G I% PM8 O ( ZUYnڕ+ [,Y(@P׮];@8p@ 8pȑ%O\0P0P kخ 8` 8` 8@qɕ+'p0p0p0pկg{'pO P0lP'"F0P $ʔ*Wl%  (jhQ(@(@+ذa 8` 8` 8` 8@.l0Ĉ Ȓ! @@0 С$`tVf-f`w7 r9 `:v;`h=| >  ppbD)VxcF H @J+Y,P@L3iִygN3 hPC5j@K6mZSVzkV[vU*Ȗ5@Zkٶun\sֵ{o^{ #(qbŋ7vrdɓ)W|sf͛9o.P@hѣI6}:tXvvlٳiv]ݻyx 0~94wztөWn]t|x =~~0P … 6@ @@;zR Z| 3L3N  СA0 ҥL:} 5ԩR 8@֭\zJ(`ں}ۖؽ. 88b0P ͜;{&p0p[~ ;6;mUT@V]~`e @@mݲ@uޭ+@ FX< ,_ƜYf @Zj֭ lڵg @@޽}`ōG\r͝?x_Ǟ]v ^x͇/Pzݿ}ǟ_~ p  Hp!ÆB(q"Ŋ@ `#G )r$ɒ&OLr%˖._Œ)s&͚(s~ *t(ѢF"Mt)ӦNB*u`ͪU^`,ٲf(`-۶n][vͫwo,x0†#N,@C,y2ʖ/cX N`_ ȭ[@ O@` ] @0`@8P$  @1fԸcG 0PeK/aƔ9K(@(@)SD:@W8p@ 8pgњ%p0p0pK(`(`(`@  P Pֽwo߿ 8` 8@@sϡG>zuף8p@ 8p@ 8p ~ׯ XȰB(@(@@I0P0P0P ѣE 8` 8` 8@ׯ`ÊK PȝKݻx׮ @( "K, A˘sg @Xͺj @ @N\X@H @Ë/`0`@Ͽ P`C%NXblG Yr)U,PK1eP9 OA,PQI.ez@Q(lWa(e[qΥ[] &\aĉ/fcȑ%O\rl挠СE&]iԩUfkرeϦ=@uo Pq(L^u ww/Py `߾@ϧ_ ߿,h „ 2lPPh"ƌ H $ʔ*U 0`@0 Μ:w)-j(R  @pW`h @ /.0n1Ȓ 8` 8@ТG&p0pgӮm67 8` 8` 8@ڷo'p0p0p0p  4xaB 8@@D)Vx P4y%J(@pgN;y8pC5z P Pt,X(@(@(@p` 6|q rdɓ)W,8@I6mZ h׶}wn xpÉ 0`@0 @t {v۷ @@0 @z> p~ <`:|1ĉ 1ƍ;b,Pȑ 82ʕ,O( ̙4kڌY< 4h=4Ң x 5jX5֭\z 6خ8Alۺ} 7ܹtڽ7޽| 80]>lŌ;~ 9ɔ+[9͜;{@K>@ ;( ݼ{] <̛#/Pԫ[.@ܻ( ?> ?| ?@@ @ >l(,^hQ| R0L5m@=0`@0 RM @@UR`]~V@ @ śW^ X @bƍ?Yd @fΚ 8@hҥG8p@ 8Ѐ ƽ@ \p 8` 8` 8@vݷ8p͓'pݿ_>  ,@p!Æ8p/V$p? )r$ɒ&Oz$p._tIny P (X`) 0hpVbJ(`(`ͫ/,x0† 8` 8` 8@Ξ?MNN}-{6ڶo [.H|yr @0 @@ϣO^ @8pPB 0bE1 0`@ @IeK/a@7q):hQG&UZ@OF:@W 0lYg(m[oe[w-P@_ܷ@'VqcǏ!GxqǑ'WysϡG>d׾{w^ѧW|Ǘ/@׿ H*\ȰÇ#@0`@ CII% @͛8s 0`@ Q ӧM U+ @ٳg ۷pʝKݻxK(`+^̸ǐ8p@ 8pϠCM P P[7  Nu ËOӛ'p0pϿ$X XE 8` 8` 8@K1_8p@ 8p@ 8pI.]JNZUYnV P`[q΍+`&\ذ` @L 4oY T`eϦM[o'^ `޼@ѥO^u {ď'_y {/P} ?@,h „ 2l!Ĉ `"6r#Ȑ"G,i$ʔ*Wl%̑ i:w'РB-j(ҤJ2m@R(*֬Z(ીƒ ֲm۶@r(.޼z{@.l0n\Ȓ'Sl2̚7s왳( @ fӮm۶@0 @@ @@0 v ; @@ק`ӗ/0@4 `(@9vdHpeJ+YtK(@(@piRJ hV]   {o޼ p` 8@@bŋ8pɓ)(`(`(`(`h׶}wn xpÉ7~yr0P0P |x8Ѐ w@ (@(0P ĉ)8p;n$p$K$IZ|ْ@`Bz0pႁ0pL:} 5T5֭\z 6,Xx @ؽ7o^ `@ ` @@0 ѤK`[f-j۾][  7 R8@8 `ܻ{>x>ۻ? @@@ @(`@  Qƍ RH Rʕ SL5m޼Y=}TPEETҡ U^ŚUV]~  (@ڵ(W\uśW^}xn FPbƍ?Ydʕ%+X@s P`@CLV@a\[lڵmƝ[nޮ \xG\r(@t ]v(@x ^z @ @!F@,X(ATE Ȩq#ǎ? )r$ɒ&9 0`@0 ͚6i @@> *T M*u*U `+W8 `@ (0 C  ?xP0 Ξ?@ONz5֮_Îݚ P.8H|9 8@֩8p޿OΣGFl    aG 4P@Ŋ(( Pe˖ fM7qԹgO?w8p@ 8pO:%pWfպ+;Xm[n 8@@]v;D D<@ @  t| @00 ALA(``ǖ={6нwo߿>x90z {w@ѧ?/Ǘ?п X0 *Dp7HC 2X@ 0@ (S@00`@8s) JѣH*]ʴS JիXjP`ÊKv - J8 D `t ˆV (^̸c L˘3k̹ϠC\Өװc˞M;v(A  XA`(@A@سkνËO#00{ȟO_A $(@(@E((G!E$YI)Ude̤YS9uOA-PQI.eSQ"-PUYnWaŎ +Ԯe۶ @W@'aĉ#`%O,4oY&]ڴi kرe`u-'.\, @ٵowg'pկgϞ P_ „ 2TH&R8p#(i$J4 %̘2gҬIv칓-j(  +ذbǒ-k+h-\0P /`(lx3n1lre3h 4S0pgӮm6n7p 8 8` 8` 8@Ǔ/o< `0`  @B pbD @F3 @@#I`+YtRԴygN; @PC 0`@K*@S @@ @Xcɖ5{mZkن-P@\ { @` 6|qb prdɓ)W|s8wthѣI6}ujդh׶}wnݻyxpÉ7~yrpAөW~{v۹w|xɗ7{ط/P@|׷~  <0… 1ĉ+Z1ƍ% @@ J  &  4Ox 5T ֭\ 0`@ ڵlۺ} 7ܹj0 ޽| 8 K(`(`(`(`Z~ݚ P 8p@ۻ?ۿ= @(@(@(@RȐ0P @L5k8p=}I(`>UTU^uJA~VXe͞EVW @  @?n,,@= ZFZj [n޽} @\r͝?]tէ(@vݽ(Px͟G^_|ǟ_~ p "Lp@/b̨q#ǎ?X&OL% @P͚6o̩s'Ϟ> *'"5ӦNB*u*ժVVE``׮^ u @`-۶n+w.ݺv[~ `0(PƎC,y`άy3Ξ9 `4ҦON=z_Î-{6ڶo-[.|8 `9s.}p`;޽ @@ϗ@ @@0 8P@D(Q@1fԸcNj 9rP @ pԹgO?I&UiS0*Udպ@ 0lYf 8@@[o8p@ 8p@ 8pÇ'NL(`0g, AϟA=V P P>xqǑ'WD>zu {?~ 0}{8p'p(`(`"JH" IR\ɲ˗)@fM(@(@ӧPJJ*Sׯ` @@h H `@x+ X( "@3k޼Y RV-`@װc˞M޽[ `УKNسkݺ‹ ҫ_Ͼ=ȟO/P(A`C%2 E5b,PG YI)UdK+PӦtOA%Zt.=`SQN@YWaŎ%[Yiծ [qP]y_~ Pp/fر L<@̙5ogСE&]iԝ kرeϦM@u( ,gs^}ٵo箽@(yկg{Ϗ/_@(h „ .@0`@0 H @*W@%̘2g@0 Μ'О ( )ԨRRj*֬Zb%pbǒKֲm-ܸq 8` 8` 8` h&S̚7s`@Т`4 8` 8@ܺw7‡/.0o9n:ڷo'p0p0p0p 4x!4t8@)VH(`H4yeJ+YtfLgN80 @PC5zp @T p`0{vkٶu @^{@0`@ŋ7vrdɓ)W|stthѣI]ի p-`@ٳpwnݻx7~yr pztөW~۹w|xp}zٷw~| p/0: ĉ+Z1ƍ;ND``ȑ$K<2eJ| 3̙4kڼ3M9@D4:0 ԩ5֭\z 6X86ڵlۺu;@tڽk@| 8(   X,`@͜:J Z~ ;6ؾ;ݼ{- Aċ? z >?h@ > D1= @ ` L5g 0`@=}TPD$TRM> 5U^Z PEVZ(@(@X`„ 8` h,_ fzM @ 0hp@ 8p޽}&pōG\r͛ @tխ_Ǟ=; _0P<` 8@Æ>$p0p )r&O `%)`@6((`"Mz@*u*ժVb*`@^ +v,YHv-۴ `. w/߾} a `1 y2ʕ g @O`5k @ڶ {0q`9 ֯cϮ};w/~<ϣG?@w_ ?8p`&TaC (`@@ @IPr/ 9fM7qԹ'Oz G&UD:@WfպkW_*`@g-5@]лwzuױ;0 @w?|yы0 @{?~ п@H Ç#J(`@Ǐ ,˗0cʜI͛7  JѣA J*``0`@ ۷p`xݻWL`(^<@ǐ#K @3/@MZXͺװc˞Mr N7+ 8` 8` 8` 8@'p߿ XA`p%NX4n\ Y$IK1eΤYӦL9@A%Z(P,e:@Q8p@ 8p@ 8p@ 8pqΝK۷/ \a`x%O\4o^ ]4ikرeϦ]۶l=@'^8p,g>@ѣ 0`@ w< {0 }@@,hp2Ĉ'R`@ F,9Rl%̘2gҬS:w'РB-SJ)Ԩ j*֬ +ذb(,ڴjײmVr.޼z0 (\Ċ3n1Ȓ% 2p\ТG.-AW 5Юm6ܺwwo/ʗ3o.@ҧ:ڷs; <oӯ? `paB 6tbD p8v49@+YtfL3i\)`@;5zi4u*`@SpktlX 0{mZ n\s֝+`@{6|qbŋ7vaT<@͛$thѣ$ujv=@ٳg 0`@ݻy-@˙7_.@۹w]7o^ٷw~~ P <0…  1*Z ƍ;z @$ 2ZtIjڼ' 84Q(@5֭[ 8@رc 6ڵlۺE;@tڽ[ 8 6,`@Ō9*[9sx,`@Ѥ:uj;ٳ 8` 8@ą8p@ 8pԫ[N{. A˛?>?| @@ D@ @D\ĘQR%M@ʕ@L5k @@ PE 0`@ TUZ@]z Xe͞EvlܾW.\W^}8  bYdY< hҥMFZj [lڵm0 n޽}|G\r͝?_ v^x^ܿ |ǟ_~ p A Hp!Æ @\0`"EȨq#ǎ? )r$IHr._ `&͚6o Ϟ*tF"Mt)ӦNBVbͪ+ +V,΢Mv-۶n+ ߾,x0xC ʖ/cάy3 -z4ҦONz5֮_ÎmZo`7o.|8H\Ο`:֯W@޿/~H~={`> 8` 0PaC  @E1fԸcG= dT)`@/aƔ`7q g:hѡ iSOF%pWfժ;6,Pm[o 4h@@]w8p|8Pr0zuׯ0pW}{Ǘ?_ @ @ CH8@3jܘQIɓ ˗0a @@8s`@ JXʴR @իXjʵ׮Kvh ۷p ݻw Lxp+^̸ L˘3O.PϠC@SV]װc˞M۸s0 N\ȓ+_<K0 νËOӫ_Ͼ{O $X0.0 CXE5nG!E$YɌ`r1e M9u O ZtI.eڔiNZU War-PYiծe{@qΝ[y_ 0 a`X%O\94o0 g ]` @ t@ @@ s :w 0`@ {}0 @ B !`"F#Ȑ"G,iIl9@2 `&Μ: 'P-:@J8p@ 8p@ 8p@ 8p@ 8p@ 8p@ 8p@ 8pĊ3n P P.m4   (nxq9ҧSnݺs (o< 8`` 8p@ 8p@ 8p@ 8p@ 8p@ 8p@ 8p;y P PTz*   {]p` 6|7 @d|sfH @jժ @l 70@4 ` @@ɗ7^ @P @ @@;n@$K<2ʕ,Y  ؼ)`@<{`D  8} 5Xkz-Pرd( ڵlۺ} @ڽ7/ 8 >8bx y+#00 ͜;08z[~ ;ٴk۾;ݼ{[ċ 8=t ]ܻ ˛?>ۻ?  @@ <(`@ QD Qƍ @%M@͝?]:s\>@ݽN̟Go Pǟ> p 8p6$p/bH(`NLr%K s&͚6o̩sM :F"MtiQ@:@VbJ  P+.ȫw/߾~ 8@† 8pƎ7&p0p?-z4Hz5֮_Î-۵n޾.7# Ο3`֯c.@ϣ7/Ï/>} ?0 @A 0`@ @E1f(@9dI'Q,)`@/0fM7q)`@?0hQD iӦ :jUWfZ_-P@Yg(m[oƕ˶@wջo_0 @a PqcǏ!+& @eмsgϟA=tiӧQVu=@qֽw >|Ǒ'WysϡG>zuױg\?|y}{ 0~ пH C HbhȱǏ 5(ɓ(S\ɲ˕I͛8s9@@ )*]THJիׯ` 0`@ [ .L`Ǐ0 eϠCMti^ͺװc ۸s&p N+_μs@ 8` 8` 8` 8` 8@H.dذ! G!E$IR@)UdK0PM5 8@OA8pI.eڔLZժU(@(@(@(@߾ aĉ8p@ 8p̙5ogР$PiԩUf:eϦ[{ ^q sѥK@ @@ y=P?@,(P0 &Rh"ƌ7n0 Ȑ"G,il%̘2gҬi&Μ:wgL-j(ҤJ.5ԨRRj*֬Zr+ذbV-@ڴjײm[Эk.޼z/.l0Ċ3n1Ȓ'Sl2̚7s3ТG.m4^Wn5زgӮm6ܺw7‡/n8ʗ3o9ҧSn:ڷs;Ǔ/o<׳o=ӯo>k!! NETSCAPE2.0,((_b]^_ޛ^_*!]__.[[ޣdd_f_a,+%e[_cb. `ܧ'fgߧ-bZ ^қe jԭޝc`dNf\nb-%c"gaS6 "k[ը!aP+-OEhkGGG:diNsu*66/VX2Zg/IMS{ytxuFLːo,-&,s*(*,& PVS56, +Plikp/E$ ֫.8J 'MgNir 8OK25 Ӱ uQMYlNG TlyNWM 8rsΧηjr ,Hl sw 7L7 NgSowPWoV O( tpG kgPX˹LG2s+,KM8/xN2E4o6 Wϗ XL m'g І & 1qrh 6pgOl( rwr Ʒ(rGl mWQtN5g V-,3qs m& ou3Ȳ GQwTtq( ֵ+OŲnUz,)JRVfH 0V.WH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LP¸ǐ#K< 3k̹ϠCMz*CR^ͺװaSQ۸sͻn*RNȓ'BУKNسkNE ËOyRYϾ˟ ϿA$Xp !@.dC%NXb!DlG!E$2I)UdKCYM9uܙdAe@D2SQeJlW]D2YieqΥ+wH y_ Raĉ/fX$A$O\e̙3'Q %R kخ|A"  No{GA$ ɕ#I ѥO^}$Aow'yկg!Ḑ_}'2@  %@(I 'R WC8Ȑ"C*qbR *WI 2gҔ (@vg!D-j(ҤJ.%2ԨRRj*֪C+ذbǒ%KdjeJH2޼z'b0bÑi Ȓ'G"E 7s<$J!@F.mt!Dn5زg&2ܺw7C)n8ʗ3gNdҧSD ڷoWℛ)Sb'%  |*B$M|$bCH$ɔ+[Ly ;$ѤK> [$ٴk۾;!DM ċ?(Q_|B$~D"p "8H "q"Ŋ/b̨"A>$2ɒ&OL"A^$2͚6mR!d'O"C ЄQž 2K N:L.J bh^ +v,ٲ@ v-!@+w.ݺo w/!@,x0†B$D,Y !/cάy%@>B$DIzj%r I _ Qd7o & jMKʨI\ %Kg`Ϯ};޿B$DI^ !Ï/%@B$D2`A&T"A F$2HETѸcGDP2"AP$2HK/[*"K7|!#HO@S&[64bHS@ActHW_;,!DUKdoH!2n]wHo!DLdÇ'VqcNj 22!@0gB$HgϟABdӧ 5!@`ǖ [)I$H >Y A%X M$U.X)$`U HyѧW=!DėOd  !C"CHHŋ3j8H B$AR\ɲe$CȜ9H8 ³OJȑU P I\  (THKV= •LX,&X/-%`\bȕݻx;$J!@ L8"A+&2CLA ¹"AB&2ӨS^ͺCM sII2CYΜ УK$q%@@ TBHYAңA%4M `@v=J`I&"r,dCQ E-!G"C$9$I)Ud$ 1e!M"COA:HI "ANZj"Cl:Ha RY@BfR|A @| I$P$ z(%y8K2)N4;QgСE{I Ufz e!D D!^| ɕsѥO^!DlNd Ry!ḐOd_e HtR*t0R%I%"AEM]Ŋ А-8,JQAHYR2gҬsH(C'!D-JdJ )ԨR*!DpJdbǒ-k,ڴf -!@B$޼z Bd b0!@3n(_P&3f JpR%IH AƂ CA`F$H4R)n8ʗ+B$Dn} ڷs=!@ƓB$Di=ӯ/   raB b!DTHd9jr-O.+q2 AJIN0` ̈ 2AIS kV[vu cm!Dun D{w {p` 6|q!D4vLdɓ rsf͛t!D6MdիY>?n(lx  kW  HIR#cd  @ ٷw~!DԷOd 0 $2…Cy +Z1ƍ3!$H"C<9H,[| 4k!$N"C Hb1 nI4`W+wJQK, M `ThQ0ǏH^$A %Y >8Cy  +!$͜;!2C9 [~ ;ٴc!$n"C=Hċ? ̛!$t"CX$fQPЄ%n,|&Q,A3ʐ(k@Z/A@PB C`A $A1D$ X͜RH% e-[!DL"C9H=} E!DR"C<UTU^:H] V"A̞EVm"C;Hu Wo=|RL0a(9%Dbl! E6(D$Hg@| L-EIbb`dɂ @`I'܅YA=\pōI ͝;B$tD} ݽ>!@̟B$zD_|_ $2CIp!ÆA "q"A.b$2ǎy$I1MaĈ%4zI,x ĉ s(%H$` $ : @ ж d,ٲfϢ (@…;Hv w"A,xp"C N&2CIz5A "{"An&2y&$b+DbCE6d ʕԣ 29 p=OۮHd<$AϢ# C4h$iRSJ8`Ae!bE"Cd8HA 'Q!eK"CĔ9fM7q9H? 2"A&Ui"CD:HW kb%3,,$H,0%χ^"d$AF'8A8͗/ A$HqsgϟA=Hӧ "A`ǖ=v"C=H߿ 2xqǑ'W"AG'2HuCѾ{wA 2"AЧ'2H{ c,aĄO,W cHfZ 0 AؒfH؉ ½"A‹O|"C_?H B?D $Hd  C!DlHd!9I#Xˆ  `r1 Z(#| MB e _9#|B! I H|DK4qYiծeۖ"A%2]C_A R"A/&2cȑ%O\eCܙ E!iԩU!2kC] u_ fžC` #&-|H(QT_i[#4 #W# "E=#aP$ID:@?@ 8$J!@% 'R(q 7#!D,i$ Dir 2g&Μ:w'!D-JdJ )ԨR*!DpJdbM a`c L H%3bX*(He*NK i!CIw Ar4@$ 5*dUGAD @HA$ ܺw=H‰ b"A3oy"CP>Hډ ;Ǔ/o~"Aֳ'2Co>A  C1x ^ A%Ą # AK$-BHKk,\ Ix @ĴA$H$I˛?O~ $|*Rؿ?~"RD!DDHd 8i(Mb,1b$L04FA@#:u)DBD0Xˆ 6blf˒EAzF&@P 34; RDV]~:He V-)DܾW.)T;H} X`… F"A?&2dJ YfC(Z"AL&2jyO11fTXB]" AKC>ix=Hլ ;"Aj&2C  ċI$̛;z!@[=ܻk$˛?>}$C/KP??"AH P!g@>|+D =D!IDd-$ Sf!@l$N=}T$CETRM>e:HU^ŚU֭DvȜ eD!DKdu W/x@B$`D`A D!D\LdΝ Z4!@LB$j֭][l"CƝ[n޽}ME ōG\R݉`\$ʐ!r$Hlٲn @Pq*VlZ+0A3"PKO )_@ 6BE 2BɒT! )TIE 6o̩s'OR *t(ѢF"MjT !NB*u*ժU(u+k   2I|IB$ J0k&DhFL!d D_~FgT!EKlj IH_QBe'N J !T .\ !Ə#O|9ͩ("}:֯cϮ};޿_C@@ ~z$ ^J0K˯BQ C(4PBX * { T@EΛ70Y"$x d$;l* [eK/aƔ9fM7qԹgO1 %"H$B AP A Z$G!B)dAX!V)T(A3DdV4sȒM&sdacm@THe CD3'U82tiӧQVukׯaǖ=6!DD9$ AHT h |x&9+؄?hiDK*h!* {06QR@'S ɓ's%% #"AA Q|)HHQb/_ȱǏ CIɓ(S\ɒYA^8QRN _2 ZD|I$ N"'  @F@ E `lBH<+ rO(K !SeȐ(Il%R %R %R ˘3k̹ϠCMӖ9ʒ@Y2HR.'.(tqV%LQ8 I-dB))RW%@ D&ɗ iPB 5Ulr^tQ"Gr 2$J!@*#E %NXE5nG!EJQ,HT DJ$ @QH.  3 hɈ䚀4XPaO tif2`lYSYJR䁡X&%@W &\aĉ/fK[nt٠# `%+P !AJNQ"""ʼn W$U\V"%H'e|.EhҢ˜A]jV D.{L8)klQ ʖ 8Dr͝?]tfh 1Qതg$A(PW7U&& N?rc6Y  h$A.d#.{&87/! #D*앀 'UU"!!V iDJ3($hE\HЁwT`ͺāP"Hh<0Hv-۴ .\ v e~!0@J ʖ/cάy3Ξ?SY7ިf#2 nK2C .qA,YV^UJ*U0cl<*Js$/Ee$ @HA @άAJ 7r#Ȑ"Er$ʓQ|%34V0d $V`.UiԌ 7p $MhlR%N \AlB'.{dBF$%BAH0ua%TH&I$D`´K49cB$.bPص :cMM8<.1# SW%-Ta 1bP 1H8hW&2J HE @A   4x@.\4tpH(TTD @L'K@HF tб5y3H!CAق 1j4H,\A*R%H8r BPCn|. 2BJB0ba*rH%EH&B‘{.= @AF.$Sn\P 3`D=YCVbBUw6Bϙ(kFM5'h  X"%ɗ7}zp~N,XpϛIoވP @9D  h?1HG/!@=j 9 ] ` 4 3AǍ#L;"BA*QՠpE(UXYd%r4T@ j8L=B@AV ;S Ncp7/ƘoĉӘ1eĈ vuGk8ejs$ݼ{ }<#V[Ѡ =ƅxsݘ#„#,=*cQlx Сdʕ-_ƜY\Zt.!hoPa ě@(qDn9fq!JG>D>$ ,AA$H4c?0A̓D}F1_!ԩ ?mDK)UP"%J*XR%J*r-XBuz AG$EK} f 6oQ>I"Kt LT @ *UFM ,\e0۶n+w.ݹ\w/:xiƬ4&I,j҅@(qD N9 +K$pFdvOX)Pd Q| O+u`$A'YSEN޿w ,tj pH@AQH!ۥ;@ @&TaH0FN Ӹ8kYgƤ46*@`Ɣ9fM7qF!@rA9j\8RͤIo.4tHU'UDH%i!#gv&W?s~ 2Q2HA$[ &Ha2C$`(>nr0S0+ F`%*N %J9T "E%@t‚A@b7![Y.WUt8@@l; N wTD΅ %I<03a*Ç#JHbE)HX±c$4hጁoT /A  T ]TY LF)  A{G&[yq Ȉ7}U Zh A$\Xx"(U(VJFQT3DN D $#G=/ yHC(.g@:C H+;HƭlX`% r kABDsֵ{o^{F2A* 4v  xAχC8w>@-0.  ˜&Lt(2%M <A&qf8"D^L#2+H$Z7Fx@%JTJr aqAXC5*|pH7@AR @!6<0`; @"VP@<3L J$ d˚!P%9@=4ҥL2$ԩS<$҅FY! %@ʚ]&Z&8H$t `(x(A,"H#E x@*q0Hӟ=+PJCI I H)* QnܪTq, K-UL,: 8 ZB<)$ HA WRTXqp<b q (HZV0FHw z^08; I<"5GZlB ō͝3$2@\!&v2t|^x͟Go^ WVxNYbV ЩS'@{ IHl1dd&K)"*rY  *4`yrIF(pHZD"Ӥ U Z2Ӧ-!MZn;v8 |Є#@~(@ʜFZ X`@2B`! ?dM GbUA^`"{6ڶoέ{w3ۘ@—YPL4N> 4lwȲ /~<.@$ [,)K$IYr'di2`$! 4rI;s&$HlAI-7nA2VZ_A$ F]`ЇkJ ArEArÈ8N  =zVt=z^uL wU H!e$Ha"C$VqcǏ!G @ u"@I,Q$H6z, Y֝ Y"- $AYa$A$Rdɑ!J E(H3gK4YIATQ' gя D& H$x8A! @P@A@1b8$An`ȉZ)M3]@G @Vx.@*]/_(%"_)ׯ`ÊKٳfWP(gHЃ>$Y `M Y԰æSw8x p |`A HݸafΒ"GY$I!BEʗ Iv&Mɖ$I.J"Ay.Cd$@v:@>$h@  q$҉@т>8Hx';(9AFxae#Li.@4nB=\``IK1eΤY͚\'=Fa "J e E jԒ"_%{ B |Y5@K̥[w!Mo H09rd ٲD!4IH3 &t H@Ak #][I8@PYF (H ^@7AJ,W̊^Ou#ݻwI ty@ 8ȩ_}@ vs?Fq06I =l E j"/la1X8GSHE9RNAi !GYd˖/[ 1%BI,3fQ>ǎYHjGhd 7$H8@ň @3  2p(3 J!=/ yB/-lnacܺ7~ “a{ 9ҧSns.6@rFʳ+AI jW澚PC\,pUC#O(B<)%HHA,rD#G0YI%3lT ;,) N;˗dh&KRo;p 66 ]  ( cQāz@ =/m!X SĴ%ā/6}ujիYv]$n3]<`F d`s*RWub,AFu]$͈C]da 5lDv-[ "GI$H!EDɐ#SȐ#EI$"O1$H!EȐ#SȐ#SH"E-$ *X td:u+HfSeA@у'it!MW @8ѢE@%|h&Ѕ`$#"YA FCۖ/'dԸcGA@ԉ)-0`!o\Ό!o  A:QD$ ]2*%}bI#G4Id"E@2%K@2!G4I#G41"L@2&K@2%KTCJ"01%AY A>XX`(P8 .@HaH^HsE HE dÊ҅0B^{y0B "i b:*\ȰÂ\hQN/1RPXݧQ$Hf tRæH@qϟN,DѣH9"#GHJU!G!`9""EUሔȈ:|&8xo_%J3 H豃y1\`a˘3c"/΋vBd9B M۸sͻ?;F83bD{%F@⍍=ldKԨaZ7F@9¾}"YtD}E /dS!(&E,rɓ#B$ 9!,2eB,YDI!KLY"ĥ#OtPH) гB`1R"Dt)a8p >lb aŎ%KVxBAdI4l (_&\_.\6C1 y%F@j `@'6j pƈr̦dIO[H&L!.dɔ)K,_ЏZDPX&2tbæ]WK͞C ,<Mʖ4rDΜ"z4i!xN PD֮_>rDڶoM!}9R|!:_mXA@ ޹Hb@4Ӡ o=HdS"Du)P IpaC!F8"D4ʦ $EYFM,,@ :"G9"dɔ)KDRɒ"Bdё#B-2 "gUdʔ%B 9!wa¤BgF乶_2tʲ 2@kwRE!G?!ӫ_Ͼ{GOE_G $XH!,:+C  [x0b !CrTҤ $a%!DAE-ZĈH"EB)BȈQI.eS\HcԺ H@K$Zx `A&\Ȟ.@X!CRR_q ue s!LY$I!Gi$I!B !K2d!Ei$I!Gi$I!G0WJ 2d!Li$!G:! Ԭ*\: `/#Q?@'X@b%Y!D^Z(J "i! бʔ*Wl%̘,0)=AX;uJA#-An`a@"LjC@p!+NUb}@ ~xeu !B$H$Eab&H$BtBb4irp HrGL92D!B$H$E<$H$BEa7Z`8r  hE=< j70!N"e*VJY)ԅ>@ܻ{>ە….Nw@(УM1( `ʈ7Ch]$M<9"dI(N\Ę~xbjK~>R-]dD FIG)"P!ETR&L@p e.}P#B~ H!B2#$#u"(eI  C$>MX@TA 'd\2+V!dӯB!tDZj֭][kI IHZRړ'GY"idGef"LY2e "E0̖&G-СH)R&A >`1b@paέ 0p@ɞXeM W"KV M @P " 1 ln]wջo߻Xp1OWa\QBD(Pk/NY2#B"䈐&HVD)B #F" tœ'B$/J„1B X8iN0H2~!V*%IVeh@+[PI2̙CF!Giɗ&B"J<"I he,FBDX'  $J)IA$H"C I N(QRE)`` Xjʵׯ`8vX낁$ @8\0 ߧqB X!B$DH$A"KV"|`0`O* $I  $[,-ۻCP8ʡC#((0`U,IK 6@/  A3Ę/ d9Qd)K{/"I[P«1R',$Hfe.vh9KQ,cǐWh+}ؙq!,2J,9RQI.eڴi$H)̢-[:-$0b' |U@N2W"$I$M,_|| n|L~B0? dB)Hx0R%.Z JRI.PKZ! @0(Lh ҩ|Q@  +YE bfɴ  F0la@ e($,a:sOp@ 䁄yI_Bp( Ьi&Μ:w )JU%HX@t'#n&xȷcY!KII!Ki#iD# I'L?i'LD!1!Wtc\.eP hDW$Vt#&?i:tc5&vD(A`9sAV@"f irdMkjdQ$ \$ Hh` '43 m"霖 Au+ $xdH#I4y%!Q Z rhP&o C !CaRDH$si$HVqH-&&)-Ԩ0F M11F`A[:!F`#|z!@@52aA", ,@`#XL0FH;XԖ,)+0XhsA4*M'"B$I2 !k'B~ A^ ہ(yЀ !I@_l* D6cvn5PJh :|1ĉ!&3bN eA"E9"$LG4A$N|8×1Xrժ FDD#&&%aQʙk݌"#Fq3Ai1F"@X2#uC Fl\,9"$"E  k% @ji#F! ɀI@(ip;ozlfh+BI>˛?<*Up`$7V²d(d"B ,RDCd<gbB-;j_#XL"@ G2H1R(U9#={N >F‚e5(1bˠP #] .\40#%i"H"B)r~T`B/ ș |‚\$0@ǀ6mD TwL!Dh$b DI\Ɲ[n޽}ޛJ&AS*SfJ#B)"D"L,)b 1)[L D0?|#Gǯ0~Lgced!CDj+#X„C@,o`I'R P0 ^4)W #6\2 pd.„ɒ"BpDJ ,T ^AȆ YӔi(\$5A6mD Twٴ 0b D`1e@,y2ʖ/c\#S Z S*0'Z!_~}DȒ"Pɭ;#ف#a #a(WLjKHO#& oN>(+0~]4`W- cҥ`ARi2§ ~H!VBL|qB&BQH!|i&^y!$G L I JLNSw3&BAKD  6xpHYgѦUm[jH⭎7"`5`ةJXaHHa!M$i"DH!P\9"J 1qcdmPeDd1b55LY"=D0br93bY]. +@C>I)T\1Rw/IOd)0SP{}`JȢ+C)"DH>f`؏ @ϋ< @`  0I0htNAjS .V( 4xPӧPJJիSMh R = @Q ,*F!B DH&BQrE#:@ ȟ.g'0AV1C! @|(  >*$1X$`wO @hS IT&`vF9B$H3X!KdE lBeLcw6@J @Iro@#IqRM9ug fčdv isdI!II"!C(" iqcO3 `e_ $!bd `12B $[,>BH=F"L4a P"@( R@ IbX OF쳣%[X qn IvBN!B$H3EX Ik̕0 HDɆJ0' D%J0$@I纁# \#Ȑ"G,i2}*gdc!(C@RD&I4"(C0b R12aA B1Sb4a1b$J4SKupО?F 2I4UQ"@(h~oXK>gFKmՀm nk^4(B$I&E Y \Dpo Hf9B 5hT65xI_BP  4xaB nR#;URuz:r#I>,FF Xl&#F"$Da4 JUΈK. C) „12"2!#`DARi22nbD(1EL^l+PJ)S*&BaR䈬 Y@ 00 U 2$ !›l"D[DArg\ƜYfΝ= d/"AJ "ڵm-!M\"#RmS1Fr6h: qLS#F`q惣JzԐe$ 3^ D X7B!j a#0ň,Rdd+ɘ S(`1bMDȑ#B^Œ%[<ʐch0':0 ^UM`ݴsд`Tv-۶n+W.R0DPȟC .6X)"DH$I9rDH$I)¤!C1d4 `rMp !Ppg}E\ *7 *T LM C"EL pg 1S}(8 @ Q   ,(g QW_9m(B,+Bϖ4[,\ A&^Y!ڹsݹ͘1h@`%4Q%<kW_;vlH D0b! @8ZF2@aRDH AyDH$H)¤%@1r H  $Ε#MHy֥K#PDI#H!{ @e@i"E:HץˊtK:9d( tG4FQҵ$(G!3Dɐ#SDI!LI$Ȗ%KȬ$$0eK(=\I;wΥ Fh U@*]ʴӧPB@ ou`@2񔬌!B$H$E-*%H/dJ"GGLx (isdʔ"Μ!gJjWs^,Y &"SyP P:rHR `ϔ"EH d/^pf¤"BF )bZ#BiݚI"B\5@HjE}D"…9rDGi#O 85i$i 8p0Tiĝ)XjtKԝ  4xaƒ"xD*TtJ\9ъdI!#y!GA?b|ʔSdIƕ)S r%ȑt0HyHM,dNT!$}*l1ӄHŘ 6 2{@`\qrE@C T%x㕪4U8SY2e!GY2e!g-%Mt&e `S13G'9lm ;M%RAs 1}zٷw/-0@ 0 "B 'OrDȜl!b?z}@`ȑ֫0a,H'R k !d!U̙#XXS$\d ϠV f=ū0!^d{e@a@+^CL3hW5 AUEB%S,r䈐%S,YH&K,dI)L2`@Ř7/1j!Mw*QbӦ)BKK5T8=ԫ[N`; v-;5 U>2LAF09s\Dk.χ5x$JO^~>VMȒ$`Ljz ׸Q|2h,j2cHs#&?^sI؀.GL0Ga$3`լ%$l\"B!u޽{!E:P0&-F1kޘPmLĝ)XJA+FZj֭]fM7 X85 @R1r䈐&I4)r䈐&I4r䈐-AH2bd¾`d 8#?aPP X0EI dmBLL&Y ZCdR=z+Ю]`/^ˤib`˄Q?RsZ-YteH!K2d!Kr !K2dH!E:f)ܱ`A1cb00`M%5h! x`" `άy3Ξ? 2e P!OiI$A)I$A$)h4A24AdQ ͪOFУ&K Yxi2rGb`c IFLRcdO%͊)RT].{hJ%KR`M, cdO.4R⠋1E@I=j !GL2D!BL2D!BL2D9B)b&q 131Jz B ~iQ& QqcǏ!GxA=6tq`jƂIRɓ"II"d"!IIRd"veO AWS ou $jrG4yB1/P[EòR0H=:$(H$ h4rl!2rir2jbI xGL92LO492!GL92!G2 @01Py (B ~$a˷߿  q, @ ғj$i"!M$!F!M$i"ȑ"}pfQ40x J swS;#٧\v 5HɎ0adš=&`1bB9Ɗ@ClJA=ÕLO| *"(|tkyaXg /Z @d!( ϡC> (@J:W)r:W)r&LW)r &LɎ9rH&B؂o I5 zcEN[qΥ[w ;U!ORذ"E"E"B$O„ FX!B>Rt7u(cj0Fdc,T9" #(#L1aRՀA|`4`@P@>@匌wVLQA|ܸ&_{Z1Cd?@, ʄ#nLP#GPr'xp|Fϔ%KD[L21ELӄH^2I #F (@p#Ί) Ɉ7Xh)FH3KQ.>FČY&Db`1bdf7idI$f4dhI$fi&s̘ir idLY 5KZF]8I$[o6FAJ+}fL3iִy&Niɑ5B+""Lq&ET FW#F"` r-FLV(,F@QP}Midɔ)B a1F"@vrX` î`̄H.1m\V2a1s$2rHtHp#l&ѥDF I$ӷlArI4[ }$ɓr~K3\ P@+ կ?υ,ZDMT/@:|1ĉ+JT.๰F #FO9!E, 䈐3015HscA=@D|)PH#G(E?!G)RC^- HjL$0D2 kek>L`Α91Fq6LaylO|~1)&P`$tOlBR",F;ٴkۆf<]I"I[Н *U:ܻ{>7XȐ`NjOIRdG,9eȐ*G,XJ!P"\(P(eH@DF8"8!R(rE@ l2DΕ+mHC8 #" Y n  p"@!qI+A B;D'`… Fp h@ :E ia  j֭][lNAd +VHȐ#M3)KȐ#E .SYA~K)I¤H)JC(G#Wd 2RY.]8$BRIdIr%2_ !rtrd +B)tIR )UJ!CYA  Vbͪu+׫f `5B)A Bc$lɒEMX@,x0†.ÂI A,Z$d%e2Eȕ2JHiDH%JYRI A0a҄I'gȊ$i0$"ED!}uALޯY„ HY$A0y$H)DH @9:@) \p(;A)rD!"I'QTI$I<d j b<тͲ$  OF:jUW:aaK{1dʕ+VLʕ+V4iʕ+4Y̖-}ْf!)(q }If& b'&B(q#k7‚H@`d'&Ladѓ"M¤HwȒ" lmVăС!!0`(P 3lSI ׿:kWSoT;! N;B'ѥKBe9CC`w8!_~!E"!MdC `4x?o<ɒ2 Aɒ%%ApH&LHGKWJ2!1dHA6jJ$ҤI i)ԨC$ b*&B0& Đ&M֊Q^ <, z/.l_'P,a"1%LQ" Qo=P"@FQ2$Z $i"l!xf aRD"yrKf\T 8t;,8th r}p@N"wŊB41k SDJQ(0 6 TH)M]DXeB$ZH2M#e @`  @?Ydʕ-_ƜYfy1RQ?=AZ5%JB ˈOa7uc 8=@ !Յ0a"D1cf+$Azuq&| _~B$H9rDH"CIJë^%Lr%˖._lʐ6o̩s'OT *4#F`H@BT UXNu %uIHKb$Bh"I#4eblЇ `N   }Ad3g"CʐҦ(z"A^FD"K #. 'A ƏJ CG.}:֯cn"޿/~JUY[ S`T(% 2(!@&"HSR:u W"i"䈐"Ezɔ& 4UVë pwջo_{ 2paÇ'V !crLsg%J^Pa#uFӣG\/#X>RF nqS߿PHDŽB"A4xaB b< i@#Fd 6`QjЇcfLu; !C=rDHҤE pSi(Ȣ X0Kc r"Aض%2H\C{7'Iٳ rw?F2 Hp#X5~d0°Hv۹w_!Gr^Ȓ)Sq/HR@#Gl1x&…Dy"+J$!DxƔҠ+ ,Y*x!W u; <{ 4СD!$$Q8} 5ԩTFI$V"Cx,b`16,a!J$X$b$޽|q!0)"$%S,YH"BLS /BCG dH%Dy [ !kSQ$!Dh?ȐAëW;=A,!x$ܻ{>!D?Odۻ?!DؿOdhD@ bDB *CA&BQ#G|&Hҡ4p+26YId=} d E*rf $U+UjJ,!xDXe͞EV!DK uśW/]*DLd…83>Fcq[9#",F 孜F:j#cDDB(U(m@d(C@R&I0)̍,0R`-K ^z !D@ժS4W&H@ .0Z3@.b̨q#ǎ?rB$ɒDIr%˖._B$͚DɩsÉtI(gd(PHbd'0H1ӄh prj 1b {5)$B,2D!GL92D!B$H$E4m8 |ɬ ?-"ANF0YhaAH5^I K (H0J' d9ΟC.}:!D`Nd޿/~|!DOOd$%Hb|1 PX'$%JL0KCF09 X $!GiDɐ#SD!LI$H!?ᢄC8rpPdvYDJ Wf _e'M 4pH ++ɖ9 |!sH2paÇ'V"A G&2He˗1gּ"A@&2HiNysk"fA"#Fh+(>X + Maqg#ύC l3G"B\iEȒ%B EH"B$IDH#P<Б9lNMÇ#B$ŋAܳI&rb,Y 8[)D| Gɳϟ@  t HӧPJt XW'P0)B&V]& MXȝ+7A˷o"T&B+^!#Kܡ92C5Y S^"AbFH&V qAD JT!&29BسkνCO +2Cϟ@tEHG*6j(P7P' QǤ ԅB0aRDO!KLY"Ĩ"I,RHO hQcZB$Q%[!QaIRK@$δ YVdV8 >A$H5pȑ%O\e̕ 3!@D"iԩU&" ر R6!@tvbEH#O)5 Q`) M.:R Pw  &B,:"Ľ"dʔ%B ) "B 9rɌ>Lh\P$ 7rH$ "G"!#d F  (উ )j(ҤJ2mt R*!Dp+ D)kv j-\'P,Y"䮐"ER䯐.p!0i\c!'Sl#B6sȑ&i(Pji5زgFDH"VVt AW*^\W YtPn:ڷs>H b$Aֳo}$CЯ?H  N1%!E0y&ј&0sN"O1cN&L<1F!i$I!Gi$!E2d!K!EYdK80g,H1{mZkٚE+C M jXȐ@5(Ȧ% ]*T@Hdɓ)W|sfC IIujիYI2HlC} y;dK$sa"J%mLrd2W0)L [f"^ AfY)A00H$%Y4vl$JAPB >p -D!D|R DAr -]DL'PId!E@2ʑ%K@2"B,I#G4Id!E@2"B4I#G4Id"E@2%K@isŊ"B4Id&s O[h\ƜYfΝ19rN"ALÂ)EhLy‚>[cGJ\pōG^| ͝D!D\Ǟ] D~ Dz'P,a"D|!G_~Xy $d$A$H@ɖ[ A A IDH"K|eK-A#bGK ZN=`A&Ta!DDHd cGd!DTId/@)dI"Bp Y2e!?*("LTH&L*dɔ)Kdrɓ#B )„I!g,2eB2wn&KRD\ 7}M<"ɖ-}4I&K˖1dɒ%M@71e&K.RВ$[Ѣ%H4vĎ1h 支o@'Wysϡ7B$HuDѾ} ?>!@ЧB$H{D? "K#H°Ç9"ŋ/B@"kL!#:@p+DȑEGv 4_؁/zNٳhӪ]˶!DȝKdx ·߿!D(^LdǐX(B,e(B$I&BbJ(B,M(B,e(B$I&BbJ(B,e(B$I&Bb+BM{(E0"3X9eW4Rk%KkDH$KrJ6P$I!G AB%I C, HбSi=ӯ/   raB b!DTHdX(B,+B$I&BbJ(B,M(B,+B$I&BbJ(B,e(B$I%Be(BČ%B0ab+K4+B09l(GTnb&I!E2D!LYdO,ы9GVt!PJ2*T`B 1~yr˙7w| ө{!Dt| D1~ ~|'P,rDH~P 9HF t"AB*uj"C`:H^ "v(E$IDȑ#B$IDȑ#B$IDȑ#B$IDȑ#B$IDȑ#B$IDȑ#B$IDȑ#B$IDH"B EȒ%BiEȒ%B EH!B$IDȑ#B$IDȑ#B$IDH"B EH!B$IDȑ#B$IDȑ#BIDȓ' 還 A~Q֬'ވ2 D8bE1f8H 2"APTe"CĔ9H7 +LAȓ'E ȓ'E ȓ'E ȓ'E ȓ'E ȓ'E ȓ'E DH&B(Q2Ȕ)G(Q2Ȕ)G(QF"B ȓ'E ȓ'E DH&B(QF"B ȓ'E ȓ'E D  -A\9# LQo hR@ЧW}{B$H}DѿH H$C(\8H B+LAȓ'E ȓ'E ȓ'E ȓ'E ȓ'E ȓ'E ȓ'E DH&B(Q2Ȕ)G(Q2Ȕ)G(QF"B ȓ'E ȓ'E DH&B(QF"B ȓ'E ȓ'E DH5 }섉Yi9&Hpo! H @ NȓB$DN}H سk=H!@‹B$DY "f$i"!M$i"B$IDȑ#B$IDȑ#B$IDȑ#B$IDȑ#B$IDȑ#B$IDH"B EȒ%B EȒ%BbEH!B$IDȑ#B$IDȑ#B$ID"B\bEH!B$IDȑ#B$IDȑ#B$ID?Qo.\h$4h -`oٹN @4ogСEB$iDaz eϦ];!@tB$oD!^ "KasѥO.!ٵ9"wŏ'_|#BHʉ *CSn*Jp>H b(E,)RD|!G<9"侐"L#OrPȑ'Oq(&ETrɓ#B8 )dI!#,2e#G,2eBrf&L)ȓ'GR "B2-RDHԨG<9""LUH&KJ fDcG¶+ *ͤI @LaH` 6|qbCq )W|sC I;Rd#BXvvlٳi>rDHnGxpÉ7N!հ M/7 &&ͤI0 1}zٷw~ ~!D "S4Y"#O2]Ȓ)S.ȓ'G_BLDH{!E2_Ȓ)S9rDȒ),r䈐%S,Pȑ'O(&Ehrɓ#BB )„I!(y䈐/Bf&L)dɔ)K9R$1Uak`jsʵׯ`Ê v h"IB۷pʝ6 x_'PLdB 9DH+V_bf3K/aFK .1e% 0rʒ)SXrʒ)SXrђKlbfJ)K\beɔ)K\h%fl1H%fl1H%fl1H%fl1H%fl1$FW0Zv-[,yѕ+VL1H+.$H&a3$T$ $[Xq$ɔ+[9!Dx :ѤK&2N0YRD"i3aR$wn! "ĉ 9."B )BX${ExR$|!9"0yϤ"L3)LX" A(…LQD!E\\" 2ԡȑB,iĊ -]SL5eRBDN=}4*@-3ʑ#V@ (UZy \\6'O@A ʓ'Vb+Pڽr޽V<E0+OX8+PXʕ+PXʕ+PXʕ+PXʕ+P\(k_En+GY #Gر%PTbJ+ɬXrvݽ^xJ A^zݿOE qBG?'t"p :t8IpaB*tPq" :t8 :T )$:t8I :T)s&͚6mRC>B'F c_2NΜq"u3Nu+׮^ +v,ٲfϢMv-۶n+w.ݺvͫw/߾~,x0†#Nx1ƎC,y2ʖ/cάy3Ξ?-z4ҦONz5֮_Î-{6ڶoέ{7޾.|8Ə#O|9ΟC.}:֯cϮ};޿ !! NETSCAPE2.0,(($]Ҫ*jR_`5][/ؙpZkT^e\R'$#Uر'VQlUbOnn_;'Q5QhMg\tbɠy6\xcH7sGGH(')260RVOsxrHH1pvPihN07H(&PV4RgL'6E.)'ihk$ҌQr%+򪨏nVvM8DMmToǰjWLnjW%5V,/6I80Kf4kg3ƯsovKv3ձlV& #OWktkxP %kX3֐Sflusxst5(+ErjznȺV6iK.V8f+ƒ)FYNH9J$ EKh3VOfXihI0fJIɹؐP2ɺrٯцz5/8FhwձPfTunL9LFWE**lOû3ewjsrPGK:v*gG'w629lQ.jKRrˊ&H6Vo֏RU˨4unWti4Ruqiq7ͦQ7dNHhLp̌oyPo9YkXcڳrFxSX3i7TŐ3ɫumɩnNYql0fg.̙TYmVX4T6HYwWVIʷJqruŲWŌKF0T7ef7 H*GSmxZ1kirOH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LeXǐ#KRaĉO9rcȏ9se̙l|g+T ]iԩU^b رeϦ]mܵW@o'NŊɕsQPOӔ'0 y9#'ϟd.+N?0`8a# ha-PPh"ƌ7nlȐ"G,i$ʒ+Zh%̘2gҤbʼn:C@'0P-ZA/(k)xlb͉ZrU)p9r,ڴGHȉrO{.޼yW@/.\Ŋ3n1ȒP2̚7sٳ'FQ )|f5evfKOq ,ıt8ʗ3?~F\NPn:#F#'Ɠ/o~ ׳o=U8a> OPaB 6t'(V)Xtd;PH 8|E [Qe GxhP>c K*]ˊSVz (vlXcǪXqmZkٶun*PԵ{o^{UD`:@" )`" ).Pd*bܜ0}Y>DG}̙yx+T0~yr˙7ob өW~{vW@|*ȗ7}z[@'$ )XIE ,R hA6v오Dȉx<2ȑGJ82ʕ,[W@>'ڻ_ 0,|@# 0MUbh #)XqBGN\xȑ3gN|o b &T*PDb j 7(PPFҢSF1]ܐbI%~` .+91tGWpDSOOYˊWfzȑ_O+DYgͮPm[+Nĕ;n]wPo_+Nzuׯ~Hw'~ ѫXq}{Ǘ~ XqOH\Ç*VHQ3jq'B\ɓ*VXżRG%_2 @[\ p1 M'JJիXz둯`OK (ҪU۷2tKݻ+t8 ( VÈ+^̸+TLYŊ3뀡ϠC+TXZŊc(*;]^S,Ŏ%JAˉQسkν{#GN/ӫ_*VO_ _ :N $B U8C%NXQ (4nTG+T YI(T8 (dTM?(҅ 5r|Y0bd1W1 ={X:sWaŎ{Yiծ]{q8R]xW@ׯ'^aĉ/Fb ȑW@Qٲ'4ogСE^i*V`zE eϦ]E't^o*V ^|.]PuQDR0L6PȁE -`%N8=hHt?=h$:Q?8 @+N,h BGVpĈh (6rTȐ+Z(i$ʔ(Z8 (fTΜ:w'О+T(jTŊJh)ԨRh֬+TUŊbNaЏ=Z၃G)| l .c* =lҢŎ4hL .GNP,G;2N`ƉТG.])h#'f>BܺU8(/n8+N0oBU8a:ڷs} (ƓW+Th=(T8a (W HC 6(PhED~ ӂ 1q`1ŝ'@"#'NɁ3gE 'zHDPC5%E .GN4uzȑSXEV*Vu cɖ5{'ض]E\*V{o^{w  Xqq*P4vrd*V|y 9Xqth-~P} ;|p‡0zD KXf3(Q (Rr䄛j{R)r-ZV`ĉ?\`8|x9q\8#'ׯB U8@+T80…(T81 (*ZTƍ;z2ȏ+T8RŊ,[P"̙4kPΝ+T TŊDAէ-*|@Qf >@ b,@qY$H?q,YeO%+N8%8Z9ę >l;~|+W^*V z K>'Z^*V;ݼ{{ ċXq"*P8=t*V} ܻXq"M \BŃ2ev r(R! *=(FL-x˨-[$#GUǑ=~'LDR*Pb 5W@SN=QXqB*PEb M>UTQW@U'~]Xe͞Eb mW@W'u=;AP($;AH"X(Q <@Fh8YM'\'l>n޽}>qpW@\'?_tխ_Gb W@^'̟G^zݯ_|*V D!p (T8p (BTŊ^IEFXAJ -PBŌ/~@H|jH X(~Z٢? \ssb)#g9!u#VO`zd뉮^{dfϞX۶*V+w vͫ'^*VHx1ƎCx /Xqb3*P-z4i*VHz _Xqb6m-9R@J<-Z[JbϧFUP(cE--PӇ ;ʠ uClj'9#'8`A+hpYqDC W@1'0f\EGADb 'W@'`Ɣ9fM7q\EO*V:t G&U'F]EU*VкUK_S+6?$#(Pzʎ_?dPcE_Arf -8KT-h|F0NdּsgϞpa˙Q^Ek*V={ qֽ'_Eq*VPysϡG| ױXq{*P?|y*VP~ Xq~.P-Z S!G qH2WTZЈ$FX@BI8[@aqAˑ'Hˉ8sɳ')J (*Uӧ+TJի(T8 (ŠUٳhӪ]˶۵+TKWŊxP߿P+TXXŊ# *H&^< -xlI₅8 1 @eXŎ+PBJFB'XƊУKNu=9r9{*PbʼnW@QXq*P߯b '$XA \C*VXq 5n'D\I*V`r 1SIE aH-8;AP,}AFDkЀ\RR gN%{ iծecX;Q׮*Pb W@QaĉQXq*PLb ̙5ogНW@Qڴ'T^kرeFb ܹW@۷'O ɕ0(RܨHP+t )3 h C+b~_}?r?#Gθ N2N0lxb 'Xq"*Pp#H*V(ir *WXq%̘2gҬi&*PbʼnBW@a(ҤJQXq)*PPbʼnZ7!ke ذ)RH,,Zh[%&i>J@@B-RmYĊ3n?D˗F]`"+T(mZŊWP5زgP+T[Ŋ‡/n8ʏP9t+NPBڷsBŊǯPRgb QÄG N^8y")1N OH%<ТECEh !%J ¢P CPI+N\ɲ˗0UPM+Nɳϟ@ BHU8ӧPJeBXU87(XQ;P]E/i1ɢ)EfkK?NL+`Xq\8A >ݠۜ'$#Kr(那J #jXz cXq۸s]{ Xqȓ+_μ*PHbʼnسkν*Pbʼn觰@䇌-PH~v9q AnbKFo1C%NX)R8s)Rp9Q H) ;x(' 8 (UQI.e (NUUYnW+T [Viծe۴:T[WŊyNiȏ=Z \p>]eO )`8Qn({{8gСEwH GNx٫efn@+T@b7'/_s*t^uٵSסw*V _yկg~ q}o_@(T„+Th(&R  I`}eRnNl%̘,+`pYqDyb#&G*UBe )P0ߦZP+X:N-k,ڴjP-\+NЭk.޼zͻBU8a0Ċ36BȒU8a (P`"ТSaт;l0R+]PٳcN7y9a܍R<۲dWZZPQ ڃ`ӉW@a'ֳo=W@a'  4xaB+Tp)VxcƉ4ZQŊ#IpeJ*\t)PDÆ09*``BKj?gNTzϊ??~Y c}*;ʼQ#FL ɓU8qsf͛9w (HNBEjիYv:u(hVDn+T UH:t6P`т :Nt a8q*\wkaN*)PϏM/^lA(qr"*PX;z2)PQD-N\F=~RH+NDB -U8S (lTN+TTŊEPBR+N}'ܿ_|_~D!p "bʼnW@!q '.bԡǎ.t)R &OXqb%-Pbʼn6W@sg'~Ѣ*tHT NZqb*-P`ͪu+׮^~mٲfϢMv-۴+T+w.ݺvūbʼn~W@!x'#^*V,y /Xqb3*PbʼnҦW@z'^^*Vȭ{ Xqb8*P O|9Ο?W֯cϮ};:`/~<ϣGCljW@!~ +VLBGAI X1eEUxP'0fCEG0t9R .PPC .`i ARC/ ai"E>}riS0TD:jUWbDW_;lY2tPm[oƍC wW@o *ZV*gş?sD(1R捋8PÅ˖/Ԩ͸GiZqzu:Vd׾{w!DyѧW}{Ǘ~ (X`ESbO+-vXH oʔi%@9KΜظȑ Cyȉ(St eq%ajMWl*)xdXM'*]ʴӧPJJիXj]" S`HE @Hc) b 6lB-$\9q\VX̸\8Aďw~| 9ULZEFJt Nȓ+_μ)*XqB (XCA&AϞvlٳipE'q.Zܨ'ObxAͲb10 JĈE.T|PTa h AaqBE-0|(HH~1ƍ;zQ(P`"E (H!%E 4iB3N(츑СDQB4R)|@5E (PB% ;R@"ǗQ44@2(Z$%!9>n7޽|qℛ8X9\T`bO]|Q" CgE={x`"F -\)Pʕ(zر#E J,e| ܻ{>ïh*PG@(ۿ_ -PB@ TH  S@(PACE<(AU @jEҼ0rg 5męs 6N"& /6iD #- 8b\q1QTQQ%SyɓFy@(좨'}k( Pc(?F-_ƜYfΝ5Oi4R@bˏlv[v ?~HBn޽}fA)PHB9%FPIF(h"HbfeAF uFݿ_>,h8 '^@-,g7nӅJ)BN )H 72H"Ȗ?`ɢ0R@#>QF (RF N0CljVbͪu+׮ZHCƉ,P`C ;PH)P`AC ,PHSHb1Ǝ[rB (P@(XА!CR Fl@Ξa.LqܧF]@'~.|x#0RqD/X~ACXQYBh''NxҨU(P (RtYP,2dLq,'SNȠE,PDL2d`2dHE(PaDK/aƔ9fM+TPA?[A#(R@i =zHE WQ" ;v;, =hE )Xxc)=THA%(Z #ĂE8|(£*<2#De˗1g?'NԢ 8@r℄i}# 8p`pA7XP'ΖRPό(X`YA (RACE (|@ OH*< )XȢ"SHG)R" 0`PDG()S͛8}``PH†QKX@Bɗ-XPAeW(qaE J#gЉhӪ]ȉ/$ra xY@(nАqַqJ}rGRP&1H1bPJ (P҅G >XHv Yͻw `H :N(_μУKS0{ã)|2(RL-T ( Sa )\Q2E 1\`J=]`"1bH:sK1et@FL⁃G A[H!/4*FЮ`*Tr`W>ZXi$E X@aE,|h2L2QN)v虂 ))@ŊJ2m)ԨRpE )R@"bS(jղH6rY(E(q/`.PH"b)`hB 0eW ́P 5WZ+ևś0=l:5زg>cߴhpR.Ŏ)P`E㳨" )O`,0EB+N4tbD)VBE 4zH'4hH"(X@" 4\@"H)L3 .~0zT -hp hH0|*' cYc bŠPQW('Xˊ{Oe '`&p 68I\Ę Y4 bL=04 TE-PHA㇭-RyAR`AC ,PHACAPAC )PHBt ,R@:(\plڵmƝ[n+\PA(P(ԣ(Hq#E (RAE )XH^x 8^,T" ,\1E ,QhAJ;)R`c @P\8! .\VHy"N#Q]|i , C.U Z>vLB%H ZcE$@X@B6.Z1Y#&hQ )PH )P )PH!xp HŎ(Rprb2ʖ/cάy3f'5nH"E (RhтE (R`F (RΝo)R@b8tH\(RH!]:,pԨw)P TLa)|BV19#'x܂i0pa.T@=TZq({vXAU.J+L(邪 *QHEn܈H={Hbw\↪)P( @RR@b#-x@{(‹OE @"`P )Xh :QA .dP (PE)4x#Ŏ2eP Y$ eʤ`2(dΤ" )tLg yQ e]-pu%6`QE.9Wa`ɗFWٓ(Ps=AP%O5\+YĉMm:%̘.3Ï.8ZTU.Hp 0RR@ر)R 7s3Т?Oi=Xh:E (XАa)X@(hQ@~Ƞ}А!G (R{AZHF'h@?~@aǏ'b'  $K=8bHAbOWA&v@J*)vu"Vip@r%JpT#(x乃z@ 4R@" )XHE֬)))PEkٶun\sNi4RHт SА!F )XA)PҨT( у ѣI!CF(P@:H >PԶ]AhHŔ2$@ ?jB&Dtө1D8W!EF| ;y)E|@g :N 4СD0hH -PX .R@)Pc'H 9 K @X7B4h`E )1G*-Xyl``PGN@ 0wլY .9xr*4L"A(S&ō,XXbcG)XhCɒ-H2@(P!F.Wj[#*Rq0< f'(ȓVb )ء*y%O2(•L"g3X8Wp`c)ʖS@Ys `ҤSؑ,XHbl+Nέ{7޾H ƍS$ Qcu)RȞ=E ރ(S=}RHƊi@!~(1ƨ*@.ARHQ2(@++O(RTFPN98Lpá×"0bI13E;ʠй3E (x%F*]uR% (Rj(КEW)R" fSUE[;XM"E(uD_bHdDJ ϟA" ePB .t=[ }Hw (RbG/^@< ;PmZB-XbI(ShQN(R`(rLᣧ;X`(R` +NHJիXjH (R+œ9= –K.X@ .RwTA"'+$ >R@" lZ@ )btrFZL#SZ_@ᩈHq\:Np .b(!K @yLB0KIE=`@>+TPA 0(Pp%,~a0-R`EFRD)4B4$Hb #)P\ -RXqM9uN.P E" >hؒ%G&idA )hȐA# a$ )8֭ )PM 4d,P N$ (,ٓA2hA"',r%F68EI ,r|cI'6!˕E!2juÇ[-ܛ$ ,T؁9KZ`AC )P!։Xra!I $8@Ɨn()=dآ)P0l@Rr"ƌ7r#.PD" >hȐ#FJcNA )hȐAA("JSq)T@R" ,hBoX@"E )P5BhodXE+Bd"˕(PsD*(P_lA*+H ?N_Z/d!)X!%ovhC ,P!ɂ HDiAC !8nH &@Q $8RpG"E ,R!C(ֳO4dŔ  4xa*P4# .zL#IKVHR.hpF*8  ɓQ7vt .|@C$[TI!0HF8fC$5Z0b+z`G)PTE )\ЀE)'ȗ7}z٧_@>|ςE @h 0@,P8pI8ŁPh >Zт,:H:4jtE-X@" )XNE (T8<ċ?)P8w…(P <)PHx,ZPC(ڻw߂Ɗi@??)Px;Z(ԧ+,PZO,ZѢEm*(R@(Hbˏ^ +v,ٲfQE(RH"2(E" )RH!8…Shc)AR@!y2>.H9 6X@b!%_t-X@" Fqт AlqǖZ|#F1_rp (cG(XtD1/Š7R`тE(Pȯ(hB S`"F +>|hE 8Z@"E )PLEI)PHE /S@" 4~йgO?s-`Rƌ-4b% )R`" )R;68ZxB (ƕC$EfDŎ2(n`aE>yiF*Hq#-\т ;P܈LL\b-EbPE (RЍ"ō-\уF)^^H#J,b  1nО;>|@ ,PG-HG ( # [,``"1"[qǏ CI)-R!cUZ!CF$D*R؉"(MW( =ZJ* Ide (¶p(E?$@E (Rp# Q`"&TtSTFؼ9E"?hcI4cEfty4h RPޝ(Phт(vHƜ2H$'z@Ŋ?`Ϣ 4R@QFI>@tϿ'$XA Ni…'@"' yǏ)D "(PG =dM8Sċ1/NXƍ.ؑF0rB$(R0,ZE 5h1_1 -R_ȑ7P)P'N,"@ РS`" )|H5-RHcЉc[ZaAc6)PpB-RHAÖ-I(AQ=#)Plb ŏ'_yW@BR3Z@aF4jHѿ?@(RD"B(RhG 0zpƌ[1'FBČ-RSɚ(yxdZ(LdP;DH7nzPsE $bѢe (PH bZ $3jԀC(gLCchSܸ">|hF>APPl([D (RPC.ZPa g.6n*V7‡/.| (|`"E 0>| u,R@"HqG ,RG 8r0‚ '@C`AŘ&1PQi'`E2F. #͉XE%-pW>A0EΜ,jD!r5P$ 2> 5gF'eNY(Rܸ" R|BF W  5[AC(Pbd@s$q>XIEd`@" .VthѣI6= YEl(R")PFx ÇhE,ZpE*APDɊ?:8qE SJ@:qF&M2EKjQ #2qЍ9&7|F ܸ")|E8 )̀S뒲NnHaтG (́" )XpE,ZX,R >8:\x +H"s͛Qx"ѣohj*hx (jKB fbH"Ȥpܜ8cAxH&Dpb8`q x/PɳWWp؏aI²pȩMvXXkw@ 0 (<`G(RP%1-PbN DdfTA-0x1C -Rhbƌ+4qႇ :N|VXe͞% )XEFXBo (R/ ,bE )Pd:\,X@" ))RE 2ԈG (lHM)PV[b)͋͝G(hֈDΌ1VM,ˬ 5s `F "E,D" ,vA"E.,Y"E\l%##' ,hC%Ł9|vӭ9xѢF"Mt)Ӥ+(PpAG)RHbl (RAE (|(F)R :N)P Fc)Rء 'N ycHha↜1cTA/Ip† ,NN>! `p E4iWNk i 麄͝ ) @)Ra" SaŎ,xBş7pc +ƛYobh1XЌ#$̬,piY>BhdRE'B|I!ETDH1/ !rrL(9!.PN0QH!'O,@a9 Ed: .lfP+(V߸J )v$ )P@"E(Ɯ(n8ʗ3o\ ҥ!v`|] )P/<;ZE YXa~ *T!EO\PauQ"F 1h0↦,I8Q /Ơ#%$I8BxY!FI&p4E4h`F64z44^pp 'P)(P0kE ),Xiō)PUZ;aYcPe'@"EfVp\G )PTNqÊ,p4DhѣI6}u+\p @(h#En(R@x ,R@bP4wBEt@h ORn# 9|i/^GY q~/ҠN$I$i)Rb%?]1IңG&h@bGzz1cDZY!̉2NL)PHq0(RiaUZ"**Yf0éJ (`8 1+ (MfXI". )@8d)]c^ 8 >Lx S(),| "͜Y(RPBJ (Rx"l*V8 +7Z J# 8~Ҥ:ɐq"HRS$q4R -DE̗b@B!FrC N0ɑ@DB8$D'N% )@1+(R!c(RF ATL,#"7R$ )nHABJ$?NԹgO? (R@" 2hA (R@ 4R@ƍ*1bh"Bn]Stؑ #q#$2dSF)X!c(0G)p'ΏCу)bD2VQE7Z '`!:@adן:zr%(b!% (RVyBƏNf@{@A 4RX03)R!F 3hClj CIɓ$uIE(bpA )Pԙ" )\Р"-ԩӆ -jJG Xp16:NbʢE4\l豢nj0z AR 7rlْ#dD5*$E`#F 5!B-=fG 3M@!B΋!=T酓"-P^0KZoa )ȃ1cG`H )(RW^VXUР(XX"=\@? F8QA .dP ,PHQbEY@1G)X ": P҇ :/aM-h85!8phaŖ8|$Ǔ'VܨDH,X4%ʗ/LRc/_0ңG(QĈa2F3i"D( QF1Jr ,ld#E HJ%6l`,XIQ2VG %9x@"E >|9>|AE,R@; F8Qyկg^ )PG> Y?(h0ڝ&i^)"E 7@ˉ?09*ZѢ #,DH7RܰbSM)*dM9Q̸r떙3f0)=ЁäK5r(aI$XYi@ zQP 0,PX"Wf<¢>&`;P+܁:dd)PFG(fFn)v@w :N/n8ʗ3O(R`v)XpOE(ƓOF[xͥ1̀c0&Mrqd"RHdFFXaLp¬ ˊ(Rp8Ed)@q2 )PtB ѣI6}ujէW@" ,R@" )XNE YHE-jyqŘ1 UD dG HbLRqG $8n`~|;R@ /a‘H(IԉBd  8+TPF )PH"3,X@: >Р"6`c0z4'΀"H H̠ /Ih": 6l؁"{RbN3 q 6Y`9rh,^$㆕0f\1i1XxS;en@G(R1,0T@"E$Ij!>PxhQ-ZhS (Ks H (RTРE )Tq5"48m[/^x"#(PҼxeKX"([9U)͋@DM$Efd¤ǔ[P*9E[ -n2D4p Ǐ9Fh&$5Z`Ɲ-.x`+x04 2(PpA (PpAQ ,PH(Z8Aŋ3j1cP,n@"˗0]ɂō(M-`8qbH*}ĉ!N4q -@lxc6lH"mƌ1t@6lQƌ5\͑ƌL|5f0˜Ɍ'`c!'^|z)PGwH'ҫ_ϾQ((`F )P LQРA qŎ71Є"1/B4eG: YrȊ&kЌ9qbFZ,iM)(|2f.a$J@PdR*1rԨG.r̨1ɗO0 &a,xԀfC*BTd1Ĉœ'*Z",T䨍"*%1Z9x ʎ2;`‡0`P̞‡sH·@t ^qɕ/g\(KOQz (RlRZ,i# URPI,pr"0^G><\<)F*k̘A$ʫ(LcF =F Ozx@ՈG"I4i檜8b\!BTpdQ%1Piˤ+,#~fhE -R0(/NQHelt3ТG.-Z (PhgNE KlH *lSfǒhw(byqℌ'@%͉N@ Y䉅;?N<2'ˌP'Oj̘Q "I4CdF*( -ŘH0ãE@AJLFh$1Ha8"RE"cT"r4 84UcFOƌ5r0>ȦHqŎePpF,8qo^{)PHEb(REdɑSу -t,bA2oADRPv݂ /=hLᅎ"ExyS )RZe"\(re-+1pT(# Fl`)P`1'҉#̲ .,ZИR)'~@Xp$M@aƔE쬠@6vH "m@Ѣ-z8cF Lq9Z@3V8DN:Qp`% ,5)?zCEb,8$ :DbHafͥ1PfHCjܸQ -RLECD 9p!/eh|s" .jԈq#ō&8qH+N)s&͚6o)X c6<"7Ox &@7ZjxAg 7qZH6E UPH PHcƌ.pA%XS:Q^}QF6lxcCP! QdR,R`D ,nĀe.\3fddʔ$3DJxdq# R@?F9DhŠ'5r$Ć P #,l`a/fRf ]}viEW,jX1l0,PHE Fl, F Yc$ԨQтEFP$)ƓDVFe30h33:@$PN(ndeF۶l`rOJ(P,م'HVQ{S,BD#D!DxF6lG -R@ჅLfԘD8[2eR"Dfqr℗WPA(Mq5aLD .`EI.LX(rTXBZ$sXqċ1/NЭ{""M]2 $0jDM èɌ,3@fr3ТG.m4ilX@ -\L!Β2eܑ!ol@" Bᜅ,h 1e ڵE -Ld)D Kp5 'uj6M =Z0h0E3(Yq1Jh"DqrċJYR1H(XLq@8bJVȐb*JVbF6M8C(Mp`Aĉ1Ɯ 7f@1E!2~8AE 7yM)b4A㥉(b$rqbŋ7vclXÆ.Ȑqg KȐqg-RHAQ#1pԘ$3'N@ 64\E7X+V$….HG$+V% &|1&OUb :q5m" !P͋PԨX[rh'^ā $^N|VXe͞-)XW6ZkcI5Z񆕃tʖM b̀q;P\ƌ" I$)F:Ĉa2F0e&59P+6ZHEPH# 9\pQc(Q$)#B^ ӧS@E9IǕ9\Qw 35fp"nj55 Du׭#a 8P1zh( 1ϳJP; L@!OH*< *Ԩ CɆ-lbe -lPĆ ̜ EY*0E N1ZTQlj@aBeQ15Z#;lBM`ö`)XȡdF pA$ 9RcF/'P,RHEْ#nj9pĈB1b45<1xq۷Y󅉘5P #DBC14f53ZHaeH2ËO0c LhˆY6\c( H : }b%(؟?XĸF$/Nlx;X % < BDNa . c';@Q 0QQGD B$K K Bfƌ?NpBE)@X@N`QcˊXȊbrQǢ=ԨƊ=`( ̙5o^1%~2dȣ&rq "II-$"=~ ^qɕ/g<6J\~H ,PlG (P&L) pLݒ(X$3&M,(P R# -jDÄG8Di3c =Z@aCω+\ac)PCvZ"ĊYȐIƔ:\ㄞ(Pㄌ0\(" %Un@" %UZ"CF06ZX!C3V q/e`"H%Wf8qQ"Q9!㎋Th!c&Q8G :Nn5زgӎ )2N 3k(A$J)Xa ;0& )ڸ34R*)8EACԸ"Eb|E "QXq-PPqg$.Za$S!ㄗ-1Z#ㄐYూEr"?jC(PC.X!CƊ}@"ㄖi^  'bʼn| 8B%FR(㍍7olR„H&HAB&_@)pt ۹Nu 9;52-_̨|Fs,aCPAKlp#F *Q %-bȑEgYVxO3Ds J֠UZEARH 2ȐCgȑ#S&5<1 YjpsBL2\sď&DDK8X`Ie-p ^8ʼn4TYqBXe͞EVrPFXBJ$id&4v9pI6X@ѢɥK # ΝAN$[`0A=CWh† J6XxcC<]X $.R CN8dR2dR5f0 (̣# oE~ 3#nj91iR +1QJ=V@(yk@LDG B :P1B 'PsbEt*t(ѢF"MjT7Ѧ%.j C -EȑS'JΞݦV(Zs [N3\ȫW 2Q$#f&3jd2 %9s#ŎolXbcV6Z13xfK-3fdvL&CFLdѢ Q`s)nhƌ.\h0jb| )SOϢ߫!_Vܸa 4k&ICN5k@#4B 4/@i"d A9dI# Bnj:IfI:Q|ӣ(DfPk&L@Di2*M+%-PdՊƌ(Dr SɌ5f`ŏ3fԈ2,TDU_-ZP"F-l,I&3j<\cƌ5dΡDL"1RHti)PN(ZPB,m(ɴ(>xq[DAMD"GHCAY !td1 4i^P}{Ǘ^(Pf xI .~z$dM63zHD`.n 0HbG=g^1fF (SRHF0aRF$+0B%G'+@A4@h* 0Tb2G +Of̨3x\Q"$(B )P@"E#)P2 f$Y+("KL˒X/PБ3G D^AMb$F 9Ɯͻ G(P!DHN%zdx/ZNX&Lv@GN2E ߨ1#F (x̘qe2VhŊ2@Q$hf).Zİ 9ČB% 5xd )P`C ,PH))ʠ,8f9!cœ(Ď%[YcS\ĉ!hS#E^HCF kƌGJ,Ɯ`cȑ%O, +ARܨ$ɌSgzΜx1+dУf ;Pa3gdQq(n5jdaℌ).Xp1E =.HB vհfЉ).xp"E5a#@-j!R V1Sc4X@ 4R@H)vL!F"LjX!CF,PЬi&Μ:k"҉0h΍fyF 8C Yd8+ذbǒ-k1{pQc"EzP#.Ǖ.EhJJÆ(/N1ko`q̘c$H 5DAh$-Zb6|HQ@ljsGϖ9D̸E 3fdѢBOTA(PpA(P@^ -xXUǑ#83jAT " VR0xaB  # !i4qQY8Җ,ȠINzqfL3iִy[r\!BdF &M`VIG9st5 PŬYvE@I k٢Hƌ.\C$J"@¨ELf&f .r(aŏ9j칆 Yڴɑ# A*T`vlٲQH!œ%9S ͚"5<1 #(7wztod &u8BJ5BX9PAAHmҜ~`G$Ez@q6[8D-N!e7n\~RF @~m P=`P3"=4 &9rpBZV`$I5B@!';=ԫO}Ȑ܇Ȑϟ?&!~x?ԢENJAgc@+P$3tQÅ 6x\r#F)Vdhˬ2(X,ɑ)SMBQ3jPŒ(̞mAcZmݾ]A uod鴦޽B A#I&BhтeƕMФI':CN\ƜYfΝ=ZhқAeϕ+.lv1cF(lnoިF ]@B9\pcddf0#ɜ)PHQG" -fԉG .jB -RD!p'"Lp*P@x#5B.bG"Q:5"$14AFH"Q 9!s&͚6o̩s'Ϟ>tJ<\A0X*G".BO&B-b-\N8f ZD'ɌE C (|HIb0(Z -bтE *@y '>-z *PN-G'n~8Y/:V SI"J\Q $5\HeȉΟC.}:֯cϮ=8R@B *9V1EE(ޣHb)2NɴG $EHܸANȘ :d(@E1P)PȊ7qqgO?СEQ)bq℗&u֠yqB9u:E$ 9BXƕ&iNUm[oƕ;n]n KPQ"D)jZHqc#.ȐG I8 I8%J3VE0tѣ )PNтw(hF ,\IR$ (8ŋU89!Cd8C,Vޠ|;P0bE"Hf 8E)Xx1 (R!҄H(@'[.C(R@ƉC@adɒ(ڻW+T_Ŋ@OdX# 50`b @</?~ 'LDRJ-]\L5męSN+Nc w )P`D(P cN$=zp " @8EQ,!R#}YܸѢFCNF, (R@ /V =Ph+Z@Ŋ]PBl?NHr .|pQd0hHtBtխ_Ǟ]*P|^x͛Wz:`ؘecOVTB%.TdƇ 6+]3E *Z"̔/xI ,PI )N`"K0V)3(P@P>_8G("EbʼnNW@!u'b]׮*8-ZA @\!ׅ,ZHqb/߾~,x0+TH8E C,y2e-RȬYŊ?' S,*`8> (ڻW:`(&M3" 8& (>|∁E2,LpM%;vL (RLE)P,f#"Q@"d EQHBi ':QB-T\ŚUV-RVŊeO@ĉ|£9FMVXĀ`… FXb+TYŊ-PBfΝ=Ph+T@ZŊ]'"I1̨bE(PqrB /h*3M~F$ >9 ;P&x)R@elиQ"D4 )D"'N@bÆB('.ȨXÅ @QE*8!s&͚6o̩ (~UѢ+ZHt)Ӧ(Z8!u (bU׮:`$I MRn𨑤ȓCs{bH4t"&Ih G^H|G)R@ ).F9 :B4, 7R` 4N .|8q*VHb9_\r)J>",|ϣO~=+T/_Ŋhb?8E'&\EC*V8 ,nHnС' 'M)E [Ը" C]zq,nHE ,|A41W?2tȐ eDHbG(n8qbJ oƕ;nݸ*VлEOQh䉕(P۠De˗1gּsg+T=ZŊQPukׯaPDm+Tн[ŊGbwH )EƉ4zqzu=ZHQ! I-R ]sō)PHa@(hт*(O a O8idM("H" ?TAǏ Cbʼn(OxqecƼ8qYI :NJѣH*=BPU8A (jʵ+ +NBhU8m$vTݸѢ.L(M1/N,XG=p"ǜOdYFDNj!%(BNq!f4ą+N>1 GQ8{ 4̈ȓ+_x'K>ucȃAR٠ӫ_Ͼ+TO_ŊP($X'.\C*VXQ E̴iS# *͡)O`K'^ uE 0jh`|`Q7Z2D@b Y@!W)ycF(IZ`[qU]y_w!8J(*8cȑ%O\Y (4oVg+T ]i(T8 (dVm:$2"3rؐ _`~'O h@" VXoQ#-b# iJ"L҄ '*^T‘F [@ab7nB)nܐ"J,Tc2g|aʼn/^1 @oXĈ'2m)ԨRB]֬*Vu bǒ-k'ֲ]ܸ*VkW/-tl (PXAt0/hL )ȂJ @`PCȅ8qF¬8a,Z p?S) ,=V$Z RThPH#*bXwVYS)͉忨~/ƠYC` ,ZQǏ 6tbD!PcF+NtB #I4BŊ+YPfL+NԴțI.0icF ,L9qċ!/8jSOT#9iF 4zdRS 31Z'6h9qw {xDc*Yd :r.jxJ'5f̨D+RRT!ċK^p 'hצM61b]#ɏÉ7~yrˑPzt+NTB ۹wBŊɯP}z+NwE XV$Œ008ĉB… _x1;lM(lɱEEQŌkP0V3M/=z8y/'B\cFD (;V+T9(T8: (JV+\,ZCƉ'N"EċOA5x"E=deF*~tN`"Ǐ=Xq"`QʼnCNbqF$2dqC)PP)'<~|QE HҼxqBJ+TZE 6K$:SN=} (UR+TUT(T8U (~UXNfdI2 7nrB'^I }xqB/N>!5fฑdUz1Ō䆋'zHj֭OȀ"mH ?zฑ"2!)(Xp 'Cd 8yx?J6oT8_|ǟ (D!PŊPb!ÆPŊ+TȨQŊ?C$Xfh≆'^8qb +^8>ObCْEmh0(ē@P!Ņ:hXqb-۶kWݺ2;w`hQ% $H`P!+Vb@DN`~N^8!z4/N򄅋'^Î-{6ڶo^*V.| Ə#O'C_*VȮ}(3(a҆ Os"8ʼn2ObN1pF6ˢb 5f̨ K\q9$I2NT"1ZXf 8\BŊP"d+NXI-Lq" CN>'Zx=DƉ?h,YZ`aE6mj !evaƌ0=_ ~"-R… 8pPƌ*TĈÆ @BB8B >|1_QF=~q %MXqBJ0TSL0ts =}XqBIbb M>ŋU$FfVcIdVe,Va)7b }Esp@G*1\Ԁ مcxY8q'LFm'\xlڵmƝ[+T\ŊōбBr͝!t+T]Ŋݽ =NG^z!#CdNȑcfblQ&Mq"/NG1Q ֭?yM%Jڀ'S =NO4i^/>ϯ ((PŊ&TaÃ+T8QŊ1¢ 6+NB2BN=tiӧQVmz aXqvm۷qM{ Xqxq@TXC 'HQDu'^8F38!F 4^鴬ɏAw\xJ*8t7i%h@ '"F|1'E"'2jqb +N,f,cJ?E*ZqE%*bqE80遈 d Y1$iN̞ĉ+`Xo'^ ^qɕ/g| ѥXquٵon} ūXq@TqC8Q/^ xa ,YȲ,n1#*$eL5\0sHS+E"h!/fi!CNyBDxh"*ƈ#,RqBQ(Djh'ƒ%+cȋ'֮}ܸrҭk.^+T.l0b4ZhXŊ'I7sh/N.mD&8RH Dpq#6Xqw 8bT)*)VD:9OPn!t0"31b(WdQHBJ*3 9 0x!'6tbD)N\EF)ZdH#IzlEJ*VpR?^8q';y8h'E ,ZҦ <ܨ+V+[h31X@aȣkٶ= s֭ #>k"+UPRƓC1\d+nTF΢HCNtEI6}ujիY^Elٳi׶}7n+NEO2ErO4obȐOT?Up^M*TтE8bpo5șECd8" "ĉ2^ R:dH8r|H JCœ5ڬ"nщ|8 ''GŘ'xqzuױ_0@T$#$0rRF* FGGGUUU&%%564+)vwvՓ-&ihjNqM' &ѐJF2N6 O#&׏J8/pYn6jWRxnG mfR $# pخ)&PGm'65ɍW 39Hwzmn%fǴGSruSV5fnW w xr of2q4FLɹ oW0% ovOXsvTFoI,v Qɯ:E2f qL)&7iOFȐONR2UTRXgNƯv2n0MPVfQTfjvqf /iJI{Шn̸u39QmQљQu󕋏&ѧSfQ񻳬2Wи0 ( #3w.WIΧͷpwVU l6.ijUxs(7f̷OŽE10f0HL0Y1ֳpYI2FhXe/хω25qru1i+&xu0ˆyɧ.jTum0ϖϗХ/Kjߢ@>j(آ5Z0lQÇ-&R85Zpc >j(.Z%5ZЬi&Μ:wРB-j(Ң/jh)ԨRRZZ_h+ذ-\ȑjײu#G.Zp!#G.Zp!#G.Zp!#G.Z0n9pha2f8rE 2hbW5زgӮmv,v7‡ʗ3os/XP#]p -Z̐A-ZpѢ -Z̐A-ZA 3Z 3Z 3ZpE .Z! 3ZpE .Z! 3Z .j` -5ziRKxjTSVzk0ZtlXcɒEZ;|h .\E.bE.\hE.bE.bE.bȐE.bE.\hE.bE.xnE :bh…2`Et/`~{v۹w ɗ7}z_h~|׷o pF.ftE  1Åĉ+Zt1c;v1Åȑ$IΘ"ʕ+gp3 -Zx"0Z 4СDҥL:} 5ԧ/`E \z 6X5\8 l\3fp…޽-u8`- p.\x؅+9s͜]h: -Jvᢅ1vx k#ݼ{ċx"̛;=0ZX^CƋܻ{>v5Z?wp"~ w"~. @ ĉ.,^ƍ.\҅%MpB;XF 5kxSN=})F Ea`TRM> -^V]~v -̞Z/bhb -\śŌ.o. nBb-ZE -hŌ.< z MpѢE,\~l0^[n޽}~p0^@\r͝?խBvݽ}xB5Z!#-\h…-\!CF -Zpb ->tb2dhх?!CF -Ntbe2dpѢ2dpѢ2dpѢ:dpN_h!u*,bͪu+׮Wwh!v,,΢Mv-۶n߲}ݺ0vȫw/߾~0^HG >rАE -.pѢ 4hpѢ[Hb5.dȁE.Z9dpi!|]ȠACƌ-fȠACƌ-fȠACƌ-f蠑Ç?XOFa`!>㗿Fx`A&Ta0ZD 1fԸ0Z  'p# .Zpтf -ZA -Zpтh G[$uE:h1E .Z2E:XE.Zu 4hȘѢ 4hȘѢ 4hȘѢ 4rpQ Ǐ_h12,0gּsgϘ_h14,PVukׯa~Em0^нwo߿~Eq0^P 5dE .ZpE 1dȈE .ZoF-Z̨QG /QEkĈF ;^hѢ-Z"2bhE 2bhE 2bhE 2j͛/` @ JQ/`X PJJիXѢW/XKٳhžѢ[/Xȝ"F.f˷߿{[ .2'I Vd1Ō82،C-fE>pcװ]̘ᢶ۷gh" Ѣq/X(_μЕѢu/XhνËFa`=/˟O4XF - A;b`C[L6bc P:t`I$48`hC>|H%# \"a#F :~.\`ԅQp;XlF aa`Q,/Ԯe4X̥F ya`_&\X -/c;p\e0p` -Di;b`kر]m.l@#3bh#I,8pѢ;pԈ"!.DQ%/vxMU[p{.Z̧E c`?0Z, w!Ĉa"0Zp"G,i$ʔ&_h%,f|Μ:wlB_ha(,2}E 3\Pj*-\؀e 3f`"PpE ,hhc5Z8@*IB4X@ '6\0n,XpB ?hF-\`G 9Xт!,5j`E8Р!E3dР!E.\hE.dЇ?X<F a`1-*Z1c/XxF$a`2ʕ,[| -jڄΝ/` 4С-``4 -:ԩ?j𑃆 -Zp".Zm"m-l@#.p!F3`hǎ>\Cƌ=b̙1Nj`b .Z! .ZpE .Zp!F.j`; -z/`8<-``= -[ܻ{>/`8 ۿ"뷀/`B@/XD8dpѢ -,. -ZxB0Z _h_~[/`H B(q"Ŋ'b#G/X F&OL ._b&M/X̹#F=]ubh F"5b)S.\U-b.\ٲfͺpb-[n[mbnvc`w -/`Hx1-``!y -.cΞ?-z4/`H _b6ڶo/`. Əby Ν֩Ȯ] -p!^|.\H…]h!߅b؂ A[$Lc _h1",0f|EGAl '_h%,`Ɣ9fM7q|EO0^:G&U,F}EU0^кE_]mlY-ZhE[o߶hႮw]uѢ .Zp1paNP؉!Ϙre˗[dEg/`= QтukׯaEm/`н >xqljтys/XDF ױg т|y/XWF ݻ! o4ahAA.\XȰaC.ZHc "-Za'-Z!CF -Z'N -Z٢&,r|ϟ0^JH*]ʴ,J}ի0^ʵׯ`Ê hx0ZȝK0^x0Z(^YpLr 8!ᢅϠChAi.\XC+NZpbE+-r;A-ZÈ -ZpѢy /XHFa` -‹O| /X_Fa`A? 0Z $ _hC[x0Zl !wd-TA#-zp8FXѢ=lhG-p1cQޠzÆYAȍD0ƍDѠ!cF.dР!E.\ a/X,fF ȑ%O 5g/X&]iԩUFF رa`Q -tw /X 'F a`y8u->鰃E *W\QbUfꔄ 1z JʪQsC>fpQ# trHd zrHz%r$ 2pѢ P>rѢ-fx&0Z B_ha(ҤJ[x)0ZP Zr+ذ^_ha,,ֲ}ܸrmz_h/, )c1$JVCI3JWgHG}`F .UDB_#丐5i. [p.Zp/X/Fa` -ӯo~ /X  xaB 6tb0ZT _hdH#[xe0Zt  3Y0d)J܌iC:Pq:-ZC ?bEO QJ( rHUE$v a"dre"&{ iH ]I.\p8)sf/XtF ѣI6 Yvl/XԶ}wnݻyF a`q -7wz /XTF a`< F1UlCa@=EU$hNIȌEN )bE& P(CǼlBY#$dH&$9)J&tirL-j(⤈-zС/`8 L"ԩT֭/`  d˚=6ڵlӾ"\/XؽF|  "b/X8~B 'R< AąQ qV.&hF %V)i႕|Xl.1-&B;&!ԅiɐ.{ĉ -Zp1E1^xx"0ZB@ xB0Z< -^ĘQF_hR$,L|J-]l 5_hS',|4BkV(Qp- "钆*ɟcC"-jӣ %bs2(!C.>MH!Cd͸^ad ^ -\(ĉ .ZpC.``Z -\l/`[n-``\ -r͝?]t/` ݽBxͷz/` %l<"Q. AP+2=\`E-\<ӣGbV)"& -xL|p( ȍj0a 0a qhE-$HPU-ZA#5~+fxb-0Z+w.0^ȫ~xb0†#Nx10Z@ ʖ_hy3Ξ[xb40ZN ֮St < snjNH~7fqV#r=Z@w!1mRx؁ʕQĴhGBhF&kxѠk &kz`F.h1E PE 2h1тcG/XF 'QT٢ /aтfM/XԹgO?F Ga`-F:j/XdF _a`1laG[ :uZO|u GK.ze' B9V6\1-,G,"ɚq[Äɚd26qѢ -ZpI]h" 5\xy0ZD _h{w[x|0ZW Ǘ?~}_h?YF*\ #ѢE/Xh)@B"BOpH1UJ-Z֏$*bp†+uShlG"d&XٺFW!]lKٳcgh" p㾀Ѣ]/XF  Ѣc/XHL˘3kFϠa`A0R^ͺ5 ;XȞF۸a`7'pͮH9u'b1b Q$I".at±Uu8xf)xĴhq@ƼlBŸ?L )K ],ta .ZpQѢ5x0Z$  )wK1a0Z  A%ZQE_h),NUYn} a_hQ,,Ԯ5F`[LA׊_I=\Q@QDpȠ<Æ{F|d&i&BT aZHGhQupo[  _h9,Ouٵo _hQ<,ԯg{}0^?@,h -2ĈZÂ:@G,$I~ b螘J"6Zrغu"豊'8"㢆*Ӳ a"d!RN]VZ[+X-x,0Zm rҭkn0Z .l0Ć_h1,&Sl2̓_h3,F6⨌4@%b5ӌήZ { V@igHNic eO6:Hх8:1 PM^ƭa"D5j,rE ]h" 1\h-\4E">vp)xcF9v#IxeJ+Ytf0ZԴ  ;y0Z5  KYР ZdBSE<~£P1u$-Z@Czu\A#9uEF5LrE Alhqم-\ȠAC-\hqE[lI`a ٳ_hq7,xxp_hq9,7wztөGEv0v|x{Ez0^p~|V\rO',")@XE"hBJ hLLbR$!h% !]nx 3&L2hАᢅΝ;]htK ;X=FLa`5ԩTZF\a`6رd˚= -ںܹtڽW-y6("Mܜ燒0?Ȗ'/^"\eԢ{cuOQ8:طI`1-DȒ!7Z?2dp".\^ܻ"x;X?>"|/Xؿ?B@/`@  >QĆ/` =z /^)d V\ uR1tP򓇟"V=ZpsN6|6Z<#@`]?a ĸh1 e٘0FVB qBX.̞mVZm[\/` }X/`@ ?Ydʕ%B2^|Zhҥ?˨Bj/XMcNjLt Kvҥk:Wܸ1-[߾ٺ֩FMܴw, y֝Kp`\ %jZ89C~3Zl!P 1"ᢅ -xb"0Z`XCƋ? )rdG5ZL ._Œ)s&͚2_hs0~ *t(Ѣ?kht),B݁F$b(b WQFPL(vkC,:^LsZnbe   hQCƋ>/.Q5d-ZFOxb50Zڶoέ{w.ZƏ#O|9_h!}:֯cϞ ޿b-b>ۚ`&k:ӢX(_Oa`A-kjO ӿѢ˟O~,Ͽ,$XA/``C%N _h#,D|I0^`1ex|Z  A_iQ(,.}S0^ZYx0Z%[Yiժ[qΥ[];p_c ĉ`QB(Ip1R#Ga hEƈvha1z2EQGMh{};r ݃ 7Z,oQC ehQz /^x]9s)!V{ϧ_>,?@,h ‚4vh!Ĉ'Rjňѿ\vڀS&ͬȐ1c "W}(M'OrAiq E )JwE8\`q٨ARcXPb-[Ej]Ԉ\&@oЭXKcNj.l0b;hh1Ȓ'Sl2̚#󐢭T4eyK]X㧙1T4[ۛ4^lF4PԊ'O+%F / `b]]l;.ƓoaXЯo>  4xaB 6t$_8s QhssJl 7exwFDRO=VV#P0Axdhʡ.,Cda¤@!7ZpkV.ZtmEXaԃHfyan\sֵ{o^{\-k }vGR7QSA XpW$GEa"c rzec2ō#Lx .Z7^܅[pzTd$N_x|xɗ7}zٷw#4X5hPgZh0ͷ/^'xx ۋ_ٱŏ/B,d!p "L`0j̨Q1`Ԩ#ǎc1#&O$W Prc&MXR#^y7*mʝ;܌irDhE.E "ntTQ6Z0&v 4 ~,†HE.ƒ0iv R%Pz‚"0j̨#k5j@ `.ƌ0bƏH.cΟC.}:_hE]wbj5Z; hӪ]˶۷p2\hBF8\Lp hXXƌ2X!EO,KҢ7Pc3gOqO`! ,K5i 4hA܅-ZؐAbz 5LrE-ZA -ZhA~ 2hАE 7Z pFhѰZvE:rhH#Cn`GV\haCF8\ٓ',%ZQIQ,thb4dh…-\hb,Ԫ-E X" AO%ioJ # 2\8AG'FXh(K#AnF 2h´ -Z5GFb,XF-4aohB 2\hE.\hB,2hqEXGK Xrς\=Z@B-Z`F:@Y,QӢ -ZA-ZpE-Zpd;Xl%̘2gҌ 2tpѢ :tpѢ -ZpѢ 2%\"EDN-Z* JjmDS@\ QɅ-<)lC bxȑ!7\Đ!F6fh -Z8'$*6l#uلd`ܚY4qE.bȐE 3¸p-G7j`v$., yL 1\h1CBdɲDM. 1ha 1\hb 1^xcF9vE-\p 3fpEL3gTb` nKy0O0F'`JC] 9.ضQR.fTo%uP!rE 9&5k,ird3\Tv1 Ң]p ի|[tg/,h~E 3\…j_rdH.\8Et6pq{ 1^|xɗ7?~ٷp~|oqƶY!ڔ)iU1B,P̓(FDyR&$2t6Z#K%ȍ4i1c-l̘F*W(!F i$jT!KlՅ\vF r 8"m26Z`ǃܹFpj N,-\h8ȑ%Kd92F Nf|م;/X>:լ[^ip"n3z 5 I;>  "HWx={F#Fxi&4o^R%x[†[apqF.F!h2.\@=ȼ$r(#,X`(Ey`T ->u1I A,YE -\|mV-̶pVm 1^W\u[ -\(B. E.? N2r'>Ђ>,Lfh` L4olNś5,)0.ك-ZܸB.?oaʿ7~E ' 9Ƅ5k@rÅ 6nh….\hE4 p%7Z  *t(Ѡ/H"C*-Z!CF -\pb-\%݁ a V>, ^ z0eҼyIG 8d̃cܸg-Z!C -ZT#h_P 0&YY"@.UdXaE 1dȨbsmAhD,brE2hАE .ZtѢ 9hL@` B '-\z( 5\hQ W<@ ^ ֋ e޼I  i1׆.jlhׅ-fȠA#-laEc- ;P 0&CZP# jhȱ2E VАaE -`уL..pmyAƒEq,pŎ-b䠡cF3tȡБ#РaE.Zo} ]o1~,׿YH?j𑃆-Z̐A -2jtE h';{g\Ԑ #2jp8s*$@9 69, Rc!K4i-\XC#֍hӦuѢvc2E 5B0Yˈ+3ZpaE 6ZpѢ{hAhh   Y`u\\~@O` 2,6B!G,rdH-&RtQ.6E3thq !*W eH-Zi-\EAma3LM3/x ,xG$-Z1E bP,.M\mm.\̨^/X/#Fĉop1d'Sna79D鰳#YȐ* Q/V~!ߍgpFPoYHȐ!Gi̍-\(Qbv6hݻ]XB֯gR ː 7ZЯ.Zp`-l1 56br[#zflhEpAn܀ʌIhqEB`1qDHl&dwn.xͻEpo4!9,* YEv.\dȑ,Kg)p$H.\Ɔ[l)~- <0ƒ/bhb-Z1c3:p2d"1RJJ1(nj3`p"C$h6S7M)SL9Dmɐ-n9r$FR<{Po-Q"(fp" -ZP0&LY#DȚB q8Ŋ[8n"r-z2p"4 Fx!E 3lx/@Kt$w&.za̘ -ز[Qԫ[=_pQC.Zpb-\̈!C -\(R*BUVرT5Z<@K1ЪJ)ƨ9r$H3MPAF_(HᢇP“DIUpB 8t0`'@x/`hɌ.̞mmGU 5hB,  š3IP 0dE U)H!CذBt -\hZuj-\c ڵmƝ[n޹p# .ZpE .Z! .ZQE 3E 5j8cebh_%!]Նl1O/Ɛ!7nA.S8bQH6jAC -fȑG5d`!Snj0Ѵhf_#*hѢG33\hEM]hѢ4~S^mc⇍X`AC =)i 2fh 92$H.fp.,م-Ξ?-z4?j𑃆 -Zh!-\ȠAC.fpbOhFNp`b-cUY8f 'y3lMtQ @@ -2h1:\hB 2ZD!# :lQ-|p砅 2I8ie.\hQM/8?a!cFX$QE 7ZB"-ZؐA%G Ѣ3\PE[-p1E -\o_ըLx ImaѢxpp↚%2dH 6lpH.*mŌ.hA56Xjʵׯ`Ѣ.\Xօ.ΘE.j$ԣ3\|F \ ,Е&#g ֬I2iވ~.ϢEyy)S&ooqK!7Z]`!DV7ZE*-Z 8q`/UH-‹EObq O`!BfEa@l  -Zpq#Ȑ.u2$H&pb˖.DtѢ)]t%,dΤYM9uϟ.\ ZI*Q#I33fp-r!ǪB*0Ďű 0"`/pyS'OJ%/o򥌀#Cnhō ohJXZhbT,DkQ3g1`̦öV1P|8qUh1ѣHAɥ--Zhѽ M' "РqѢŖ[_ .Z@,h „ C[Pb3pA&(P8qaJ.A2_x G @Z/MS){˗'pҤiU#AnFAlpF0-ZHF :Xv^.i+vxa9&N8t@gd/#,X@ fӬ*[Zpu .\lܨv6@Eƒ(nxc`9ҧSn}-;3\h X8p -ZlŌ.Z F)޼&'^ҼIOt,M:6ݪubXDƨqI3iB$HIXhhC]pqEUX4u>\pO\d|XDJ_UhE\\paI AnpcF%.Zpqq-\4E/XT|sf͛9w"F .Hh" 1\h" >fh"60E [cF6.ia: kQ)N^t/|PX MzI\Jw5&\UdGK!І &Ʌ+IXѢ+1\-x$ȑ,رJ9~Ң >Vܥi\b(ѢF"Mt)0Z@u!XdȈE 1bɈE 0dNTTiѢr~YNJT ƒ `ʔ, _-92$e$d[MACĆ{$IңŌ,0>,.Z  6}F 1`|:@ ?A:ЀE.\hqc E$]QEF[pC*6ZpJCÎ*.ZpC -xhEP.ZERK6ujT?f𑃆-ZA -Zpm .Z  p",CG xqb< c Ew\ɒYͣ!kZ,LhF&6Zn.|`;X#AZd-7w|K-TwI8\hE7 G 3fp~.dР!FNtȡЕ-lȠACF-\ȠA#V.ZXtĉ;x"ȑ$K<23ZAC-fȠAC-\…Dg`.-fxAԩ;` \\CrhLAd9 A͍-D犍-nܰᢅb(Upc ҢE#]مh-Z8"8hАE--j2"-zϘѣ6fhB2lhBhaC 2fh1C YZw" 'N\x? ۿ?XXʹhE 2bhQb [p R!C %MQJ5^ /0 2˭jԺȑ!)ljrAQB -Z05p0C#C4i2$H7ZpW^-uBp 2tpBb6m…=lh՘06ZG$-ZaE-\pō cA3v!x0a-xb1ƎC,y21Z`EΞ] E .jEQ X-0nƱoO~!t В.CI~d ·9ӠaSܙF[SXjbEm!RF:XpH#C 9rd pт A]PE- Bt1 \pѢ 7@pѢqjr -`ƄyF5MlpdF -\E.P OF:jUSwhu0.ZlY-ZpAG,cn]tix,df&A Q|A 2He@Msg CM94F ӧ[2 -``A!oĆ ߾[x ]h ϡ.݅ .Z!h$-wEy.Zh2fL]E}.Zo c`A*\0-ZƘ.\pᢣǏ-Z1'P4{D˗0ctIa…:Dny#Ȑ? BtȐ., Yrh &-Zغ51T4ѢE,82dH.Kx{  ܢpa.Z(ҟ-Zᢲ3\hxhAڅӨSn: c˞M۸k;´h" 1\hE.\h"64X ËO& 7o@ܴAn`:@f5j2R M`ڴKTܸǏ, X`d rE .ZpC.ZpC.ZpC.Zp.Zj PpC.ZpC.Zaí -uQn .mѷo,&\aĉQÅ4thb 4dhE .\hGi رeϦB Ǥw 6Z!An,K ucF1ذFE DX23,BJnc ,HGhѿ@-ZA-Z̐A-ZpA -Zhѣ-F,-fȠACƌ-fȠAC7hӅ7Zmh-\̘Ԩ1^j*֬ZrG >rE '2hАE -pѢ 9XEA9,.lp8Ԑ֟[pѢ +rhs#;4dX!*-ZPrΔ17Zc4,hRҢ ;XWK4u rÅ]hB 2fh1C 2fh1C 2\h.ha5j̘+6Z@-Z̐A-n 7nE#[1E +c`fL3iִy .jE.bȐQ.L.\h"L.bpA>alXa I@ I)iE-\İ"M\B7/@,KC;lX dH_rFKd$#`$J-\h…-\Đ!#-\Đ!#-\Đ!#-\pEt- '2kuE3Vt`qѢ2dpѢō38q.hE 3fp"a/X8|1ĉ+Z"F.fK0ƌpEc-ZCG,1c w,z 4tF-\8}H%WPגG,thX6lT[rH.cC %bĸhQ -pᄋ 1Å3fx y +[ܢ 2uQ)ZhŌ.Zx=c -ZF -Z <-x"̛;=1ZXEoq|c-ZpQ,cw,ۯOcNjS!@6n@ -:TRnj.Y,P76wL9[j%i2F%&DĐi #nN=[E E]hT M[ۡ[c4!B Dlh>ZGBz-ܿw|.\~-l!H{b! QhRbb .Z`̈ (Pfh &Ohre .[͚6o̩s'Ϝ/bE7lpb)Ӧ-ZCG, MPH^iFfc`Fm]ƌ"-Z9#a3e0ƒٰfJ?*݈|E/XѢ6\-:.N13f-{-l(=H`!'Hb3\h*Uhƍ.hbF.Zw/X/>"F-pѢ*2dpтaC.ZD# , - ,vAE-PLB+J -`h" 1\hgZ)!-Zf%Kܹf7aWl+4T#C-Z…-\Сnj-fСnj-\С#.\hF%!rE=@ѡ# vȑc(5Z#G0ZP"G - t&".Zp!F.zeEW ԤE& ԤE&YW#.Z̜9CG3Zؑ#Au#G.Zp'G.Zp!#G-nmaSh!Fצ6/`h1g٦Z!E.p!E.ȁE.Z,nE 2hАE .Zln СE&]iԥ_h-\Đ! -tv>pQF .b, P0\^ٵg? [FPbh"MZoI -hBd +z| B5bhE 5ZPhb >jbF*3ZlQÇ-Vl܂uzd -vH2g P1f(bF 5Z0mQÇ-RE 1tE b[ڴjײm-ܶ/b.޻3p⯋na.Z0nȒol.Zps.F(m4-\v5ز]ha6.\o.Z/nr-3ot-Sn-snX 3jԘE [ӯo>/b -1EB [4Q?1bq1$FH#c4.j$'I3@1 XIԈdNР1bq4gԨ$FT3ZTQF֬1€l caԘQka@#F >bo*{E@q 1`0< g8 0j̘QF kpth¸hq -XElٳi׶}wn;bE[0~9r8~4BӋ?xq=)R^t=S_d"u$XՂ0 OhxD6mqB) DLxhǎ>/6Nj/bhCǏ/"9rxŏ/vx#4s츹#G;rܱCPM/8zL?~0c]/~ᢅرb]h6 -ںܹtڽ7޻/bhb &ܢ>t`9@"<:8u '\vMh2u4 $` 훷zQX@e--,E .d"Ǐ9X\eC,~Cԋ>}^=c lE=zB `W^,r`… ˘Ѣr2dpѢ2dѢ2pp ҥMFZj֩p# .ZpBn[vE 8r@\rkBty  Z\gq #:nb 27a_~h\tA2f̐b! 3f`!q" Q @Xcc 1b1F>QO<a!s&͚2fb'Ϟ=ipѢ 4hҢ 4hѢ 4rpQ^ +v,ٲbp# EZp]v]E.|`!x0F$jƎ?‰Ffib3.ZM &D0Θ&Ta!{64pp 4pp 4pp 9֯c=bpxc< ,ΣÅ 4X/?~.Z! 3h1C :jhB>\bE1fԸc0n%T.fhEK-`pѢ:agϝ9"G&5‚)o3ʍW]PBH_m!$HX!Cgjh1re˗' Qe@Qx aǎ-\T!-\Đ!nj-\! /XD>zuױg-aRdƌ.ZpE -\hǜ@mX׿?&y riXȃ2gP]@'x%JD D>7caAM8\' @YJp pqi.jDE k % )PxA۷p}-\kÅ߿pѢE,+^̸ǐ#;Ve[̘Å.ZnE ."hâ׭iѢG/rno,xy5eATLO*A/Q$6nAƍ&50C\6FX_^-|O}2,0ࢅ-\ 89=\I' "6\ҿP4kR vXQI)U<-\IӅ9up;X %ZQI.E-F Q]LZuj Y[p1#,Ď%+-lH[`QǓolcs.la=fѸGlf +3 >ZiԩE!@[KhѢH:p1 4iBjB/^'P,o;8\h.\`ޅ}?@xB 2lȰE 0p"ƌ UjE"[$!#,xg-Z鷎X-vpE6lHP0RF… ZY+XF$,0U$.-Zh X]3"bIel"2ТLМXPl2f9phŌN\.m -Zx5زgӮm61Zvw]oa -ZҧK'4[@M/xiۍꕴHIhтK +V`l!ciaq 2^p /XTd,8vdj9sjhE.|#.-h8Ϝ.5iT.Za`U\paETSV́E.bȐE.\pqE 1tȨ sֵ{o^{0`[.Ec-pѢ 9XT|-8w"F8fa/\pm".ZvqE.ZpaE"4EZQT eq!E4hn] 2Xt"9ȸhqE.dРAH {A-zDА*- "‚:-Z`q"D$=lxE.ȁF.Z1 ȗN=ZR#IX3\% qzԈHrXxE2hАE .ZpE 2hE, DPB .|D-[pѢ?r@ReJ+E\iG 5a&@XlU̙STG M2Q+0\aD=/XeB,ܲx uYicLJ6\E.`Xb-Z԰gJDf,q6E%NvڀyΊ;,XBlڲspѢ2dpѢ -ZpѢ:dp խ_Ǟ]v_hx͗oE$/r_>|4E\*OL |){`NN'ʍ/pѢJѢs~!#,XЈb& 3f`,~l 0ZHt)S-ְ.VuXuJ$m2%W"%(EǁO䰈+w.]9phŌ.x-b`x1ƎC,-._vy3Κ[p1#,NN}MfPc6mAӛ4Qxsjuѡbs.Qҍ[aJ=$b<4bh߳hG-\ϟ.pт`R@CFL|I2'& QrAV(ٳL 'QdA-\)Ӆ7qpтg;X:hQG&5#F O]D:-\̈# _za: hP)NvK \+ذbǒ-k,3ZAC-\ha^-pѢ 9X.E,X  #`lEoyha cJ\?G=\E 2hАE&!d2s4XP ,X{ Ǔ| [gc1$,r #F$T.Z -Z!,6tPG-\hB 2fh1C 2fh1C>\fL3iִyg5Z!#-\hEҤ-pѢ /hj/XE7+83mZ)mK3 %DzhqE 0dE  @6_dy42d`q2vE.hhBI:JlF-0y 2zK?X'PlA y02|p> 2bhE 2bh2pp :|1ĉ_h ;z"d -Zc,i`&3-n Ν@8a3原b£M c[G+JqF -p1Å-\B,XA\2\"/ 4XK. hٽVxG.ZpE.\p" "J L^P*ݘy"ݺsp"[8<.Zԫ[=;bޅ[8.ZpCGۯ1B@Z2ebJ!#W"=N+%J4 r -LlB-mŃL,hh =}(*FEp!fU+FfhՅ .\ha*DZ|kC.Ȉ3j03 Mg#.\hqD`_> -Z`_?P-\p!Sѹffx#^%.Zc9:TZl&[Pr 5>-FȩsN8Z Q-pEMc`!u*ժVbͪ-+v,ٱ-Z!c nҠb.4U0~`䇒?iۃH@I(*Mi =;aF.NA 7Ox- 8XM#*2.~Ņ -ې"3DZl69'O33TzbFali=f9:GZРb?т &D؂a, F8bE1V|EG[pC.ZpC.Zp1,p- OtmΗ=ĴPJ|  vР Y*hА1E:hȒE -Z@HڨQX$ V\8\hE.ZȞ…m-r N/bX…-\ȠACƌ-\ȠAC-\h1C4!Lʵ-hbǤ$-o2(OZhD"  yAZ ¢E6Zp! .Zp¤DdK8\& 9^Ѣ 4XH)vPJ5" ũ)$,Ѣ <4X`@0GZrXҢ 4hѢ-\I@;) 3\bQp6Zpq -$On²3xgСE&]0Zvk1dȈE 0dȈE 3`x8hrJ">~ᑩF oT +ZH< @ɥ-Zla"6ZC.Zt "uBmb! 4.Z 1`Ԙ ::bf<"e/^X$H(pѢ :bhE.$Gh8^(k6-Zp -pazc`/.lx -hḅȒ'On ;hܙ O~Ѣfhˏ6|I;X`͚^cȐE.bȐE.bQ,ͫw/߾~QÅ4dh…[bd.Z`!g:j-:\\͛8sɳIZ@#T-hᢩ-\HmŌqڰ Vt9Ӣ 5P[#zh⁀7R\%OS(iS撍-\Đ!#-\Hܢ2pƘPOx`A-p`Z[#N(|,E.׷~ 1^ <0B/bx"b.bȐE6ȐE3|`2 8^ȡxJt"7@2$.Z ɞRLLG -Zlq…-\Đ!#-\m"-n(!". -Z`/Q:`hV,x8G$If "r&5 Oih:ѤK=9|hE kn; -zx"ċ?<61Z8oE3dРcF6\ѠcF3p`> .d`A# 9,k??&xE+TEJwQB-Zhх-\ȠAC-\h "6ZpL8ZBNmdhѢ\,xe .ZT"ƎX3\VXe͆>Zu\u]b--`… FXb/ 9rpѢ ZtK.]b --nϞ> *t(Ѡ/HTi >jPZ`m#^_ȐYqanhG*Vil] U,.ZpE .ZpC PEZ`Ό+Wlb4 .\`zj:fJG8 q*~]CfI3t ˥͙ΟC.}:0^ȞÇ-\oy-Ο/R1^/>oE8EA-"qF .|`1bŊ2A*iU@1JŊQ)ѡ3 -\Թ3gE1ԅ-zaܷ2,Wb}E9ːs3$CСcJw[ջo_xp.Zp17np1r 1^мsgϟAyGcV F 1`ǀR0`БEo߿}Ӑq&={P5SNESa2C"-p1| cEd(ih YJ=t!Q1ӀFaH C(S\ 0cxf.ZpѢg @]zÅѣ-xӧPJJT;^h?^Njgs`[;~ƒGx/,6 :iǐ#LȌ.Zhn!B?JaA-|`5Zkr.rō[>}h5dN/dh;,E -ҧw.oA? Ͽ,$XA .dH<H+=ѣ6\(2L.Z#XE6 2X[A,C" = r0gFxIӈS?y=ZpW-``QYiY[/X́E.ƍ.nQ8 /fcȑ%O\rc-Q7,]a%-\h…-\Đ!# Ez"E+ ,^ȐsбkQ&"a(+)P*U&0QAE=zz_ߟ0Z,9phE 2bhE-\pc/X,i$ʔ*Wl%̘(ԤJQ#+.ZpE .Zp! =Z .Z' bǒ-;jkaT."C 5jġ/-XA0vh1,vha2,6E2hАE -VpEرc`a6ܺw7‡nsI.zܸ,92\n-\ȠACƌ-\ȠACnj`=5ja!-;|p 4hE 4X# s{|c 5hQc .Z|h7Tl@R -\tBaIG>X EEV/bG-e4j  HSBX/XE mq`W -ޅ^2\ - v8q 1^Ydʕ-_\=ZhҤa`Z-ZBl-Z f%=l| ōϘE.H2t8\B; 4X|E .Z Q8sD|#ޤ$J/R%0^Hxb"0Z`;|h!.ZHre.c`!s&͚6o̩-~ *t(ѢFxb)0Z!#-\`uqK U$.`E.bE %(c_8\A8d`F8dpQGl4`ƬϏT~#K˾Jb5k/XFڶk`{ -~E>jh\-Z!CF -Zpb{/X/~<ϣ/FÏ/>}5^ȯG">!E.Z$Ad57Zp8r1E:hȲpÆ{u\̐% .\2‚ .f`F9h" X3j,.zBaN _a`1 -ЦE[/`;7F/jkƍ]h… 4dh…[xre˗1gּs0Z=tiӧQEk?l񑃆 -ZhE+5iU*C\\ACnj-! &Zi ,hh,hp1jACnj-D‚#^ iтJ/_q1# 1ZH_h#,B|ɓ1rxQK7nE.dР!E.\" H*]ʴӧPѢիXjʕ+,Š}q2bhE-lTC OP$q 1\hQ U1cHhh`AG8,h!t -ZkGd斵WoބiMsZ_hy,K1v!#F -Zp…-\Đ!#-npѢ~,Ͽ,$XA/``C%N _h !EhQG8qÆ 1]زH=Pr (X E ,.eʂ-Zhƥp,Xp+[nSMa8Hɔ[0^[yx0Z &  ;|hcȑ#qÆc`gСE&]Z -TvQkرeϦ]u -tomb N.z(!r,e<ru-kwQ=Zm>,Ϗ}6@0x HgU7^ pR'x"8`pc"_had,VE .ZtaΜ.nhg>,-j(ҤJ"}Ԩ5dj*֬ZVQذ0^(kVTjպh%3n  @.C`.\(\E|jmڑd8\2̗uhE6=a2en l @H%ia6,v;h(nʗ9 .Zpu[po{aa<׳o~ -Ӈ /`0x   .Zl C KC8vF.H49Eb.CfL2fgN8}E.z) @xjT$@JkV/XtlX/`0{ kwpѢ .ֵ{ -np` 6|q0Z4v c ɓ)W|0Zt  ѣ_hq - Bʘ AnԾ.\pE 1tȀǂ @X4wB 8XT~jG"Amx Qx@~/X x…1v!#F -Z؈!CF -ZpѢ -Z%GP~x 3̙4kڼI<{"СD=tLx"1ZX"k.nx"lAp" -ZA"-\$"^8\"弈"-f` ,X8{u'#,X1HIѤa`:լY"9XѢ-lȠAC-\h…-ȠÇ?XX=ܻ{Fa`>ۻGFa`?-B[@ApBb -ZA-Bu ]} .ZnqE 1dȈ"|0`.p]t.Z\CQ#Nj[0Uk֛<ֈǟ-l!09tE UdȈE .ZpE0Ud &OLr%˖.Wb&M/X̩s'Ϟ>qb(Q/X M"F.B E7ZȪō-\ 3:XÅ , -ZpG 7nHDLMZ@ ʖ/c?xb.Zp1c֮_E/Xέ{7޾Fa`|9/C.}4X`Fa`!~-λH{.i!]qEbō&haBnj2XD81b2bp1# YhY1b4hfmЭ[Yтf2^Թg2j:GYpѢOpт*UW[dc _;lYc_h-,݁F]w慁c _h10,'~Ec,3\Eg.ZpEi.zdI},X0a ۷qc gp8q#`j][vҘ-gwQFwQE a`-Zh1 -wEc`A*\0 -"Jŋ/`ȱǏ-``A -R˗/b颦MElܸacƙ3\JhQJݙ)K2 ,tpիXѢ+4X+MNxgѝ)iAݻx 9phŌ.+^̸/XHL˘3kFϠa`A-R^ͺu/XȞF۸a`-pE 1dȀaEdȈE .ZhwE.j$Q2iyW4. /XgG -Z/bԘe*F9F 5ncF/X́E.bȐE.bȐE.t A%ZQE_h),N}QUYnmQ a_hQ,,Ԯ}.\hB 2lh1C 2\h.`"7]cAc^,k tiQ 4pp!i4rbe1m6bb-'^qa`<-Z̐A-Z̐A -Zp|/Xg{χF a`?0Z,h 0^h'x"1ZplE.dР!I.dР!E.\f."qe -4*ɐNhJ 2XPG/XpUG b[E,7AZm-ܸrn.Z! 3Z! .Zp1^l2̚7sGx40Zn50^mwx71ZwaE 1dȈE 1dȈE .Zp{.j$!2HtQc~H 'XgB,g9X4hpVhbF^iqcF9v8 ;phE 2bhE 2bhE;c`hPC5z -6ET/`zkV-`` -ȖEZ/bpn\3fE^{uq#Ȑ.KQrXȐ5tprdɓY`q7T6芍I6}u5~p-\̘En3fE 1^0~yr˙7wөx{0Zt|0^0x~1ZԷE ]h@. 8Ѕ qHHB@Ң;z2G29IWyR%6Zؼ0b4hP;XE.Z8uET]Xmk,z 6رdˊ}ڵ0^x tڽ,}0^8xGp"d.ZX"s͛op"AJrd ,AZ"ٴkۮ4_],iՊ#:ieߕ]pi=z 0dȑcNjܹ"< .Zp"}z.Z"~c`?B@ |B0^-^Ę,<~|H0^@E-\pS.lęӆ7Zƍ A4 2Ȓ%AZBTU^Ū,Q1n-O<§Fm]u ;hW^9ph… 6\>xq/`P ϡтzuױEw/`? ѿѢX0Zw -׏ϴ5Z(lqƇ-Zir ,2jȑ 2^I$ Q& ]^  `QJtေI@X*?hXJ ,x!G -Z؈!CF -Z!CF -Z!G 0^Kݻx݋x0Z(^̸0^L3x1Z㢅.Rhk.b=ۅqݢ5tNȍ4h`AC)lQV-\ӠwpѢϘᢿ3\h .dC _hQ",4n|G!El )_h%,dQE.1c-lԨѣnj0`Ԩ$ ILL$1PŘ $1PE ,Ԯe[<`Q. -^y$IXaL,/fqc.Zp²e.Zls Рc`QiԩUfZ -dφm/`o-``Q -/s;|A9s@!$ɂs`!C:u6i)&ᚔILt 69Daq1C *Ĉ'Rш#[x"0Zؿ_B@ DP38ph>jآ5Z|RH5|BJ-]tL5[pC.Zp/XETRM>eF Ua`U -~Vl /XEF ma`W-E |]…-nhX.Zp!E-\tbe .]M-npӅauQF]HӦNU-pE-\m!v-Ξ۶n+w.ݸ/`ȫ ~b0†A/`, /bf?bt ON.^Î.nh.Zob[H.C.h޿wo!.ZGb}]o!_ -㏱8`A&<F a`1bE1fF a`1-ZeK/aƔ9f3\9c ?:hQGE/XD:jUWfF _a`1lYgѦF oa`1 .jE.\hE 0dȈE .ZDv1E .\h" 1\=2dpѢ2dpѢ2dpѢ -\o 2bh…-\hE 2bh…-\߂ -Z!CF -Z!CF -Z!CF [pE .ZpC.``Aŋ3j1 -Bɓ(S\ -bʄ͛?j𑃆 -ZhAԅHq!E.ZHmᢪX[h… 4dhAY2hА1E2hА1E2hАE .ZpE 2hАE -"pѢ 4hpѢ -B.Zp! 3Z! 3Z! .ZpE .Zp!F.j`Aسk= -‹ӫ_-ˇ?j𑃆 .Zp  -AC-\E-4pѢ 4hpI.dР!cF3dР!cF3dР!E.Z uE 2hАE -pѢ 4hpѢa[ Y.Zp! 3Z! 3Z! .Zpp -ZA#5~\e̙5oEiԩUfmzex0\Ԑ#-\ E 1dȈE .ZLwQz.\h" 1\ _޼2dpѢ2dpѢ2dpѢ@.ZpE 0dȈE .ZpE 0dȈE .Ztad.\h" 1\h" 1\h" 1\hE.\h" 5\x*֬Zr+0Z- jײmm0ZЭ z_h qĉgp1Ȓ]̘2̚713f(m4[ܸaÆزgӮm[.v1…pѢE,3o9ҧC5d;wQ0^h~G绨ƍ.h`.4E„.\pE[cF.ZtE #]4yE *]tƍ3gy;[hP.Z5E K]4uET1vzkV[vcɺmZkٶusxo1Zp`-vqqprd[Tns ͛]h -Hvquj-Xpvi}ypxp.Z7E ]4wE c`q{v۹w -ȗ7}zx~1Zp1E~ϘЅ t1c :|b +Θ"ƍ;z23\<9c,[l3 4kڼ3Ν˛Fۻ?|0^G 8hcF.\hE3dР!cF.\hE3dРcF3tРcF3tР!cF.\hE3dРcF3tР!cF.\B-\\B \[|uE .\h1C 2fhE.\h1C :fh1C 2lhE .;nE,,_ƜYfΝ=o~QhҥMFZ/XcF ;rpBn.pȁE ō# -Z# -Z#-G2\hBF8\_|w#G.Zl!p@8rE 2rsŊ/ǎ? )r$ɐ/jHr%˖._„Y6h"-~ 5Z Mi >jڢ5Z`mQÇ- 5ZmQÇ-+w.ݺukQ߾~F-jQƎ3ʖ/cάy3/`-z4ҦOF ֮_h!ۅoέ{.Zob[HΙ.h};޿bϣ7b[b>xb?8`A& !F8bŊ8vи1 5fԀdI$k̘Q#FK/[¨QF 1`Ԩ#F0jԀhQDaԨ#F0jԀjUTaU% 0b;lٰ0jԀ# 1ƍF 1ƀQ ,'VqcǏ!7Ee˗1gּ34XM#Nj_VZ?^Ė=[/pEo?~>8?^$W ϡ?3 ױg׾ŏ//Ǐ}{w ׿YH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ L;segno-1.6.6/docs/_static/artistic/letitbe.jpg000066400000000000000000000234261476440322300212050ustar00rootroot00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( (<WĿWN_~ٿ7fݸ>ңhzx{i:OVjB,i{`ij2x$G ?5 *?YɯƺL~ ϾֿnP{N.R3!OmAWP1_:톚<;!.3q8]ĿGi/lϛn{ZXiߴ=V}m(j8<Hcy]nNYZLxf+Eɹzvz?iO?gEżjXy*ƠZMV w$rJԱ?'4K5׈_˦Ii`6pvId<;V}}|.0 V65ڣ'}zY>?^E[>q+Edܽrr|,h6 6RM7M~.Ide*f{_4c&.z74VisdאД  O= |t 7ej+.,#\5gZqq^$Y;+g:Cl_=P]_EOٶۻ*LZG ?59x"xXdWU G{ckn5+K70۱8iQBM4Jk5|U\_>sEf \0 3>|]_Lnf<P_2~ϠڐZH}6: ((mC6?sߴOo{vXw6ZlOO|Mz⽼Жg_}]¯:灼M>\I 3e=aG=݅*4/3 3p5o=kOO[X UFZ/.GȟϟJa4p q^[8N =+dK[[$v}xj5.'c͏u :l M:ͺ[tȷ?#H3@-F"ɕGk]Yk{(a7t1?¿uaB{}QkY6ZK_w>![I'h 2=h1[Sn ۞=jtO/^6cJwz犱qx, 0^&ss֪N7J\{½#Z'؍D\2BlbF03뚽2=V?kĶ. A®>TjKEK]ds^n n-_j@$p02OtlrR~MP>-^:>Hb) Uy`(G/M{'}}[_q5voox{ /b..A=*vA(G/M#x;)Txka=#LJ 4S86+?QntB{ Dg9:gق'fe| xSomc͇<%e8Z(t/i˷3yv`zרvHQEQEj\y7 G o0hxp]T? #/Es'0%K(R砯}Eml=k.o`I,7k$2K-~.{R[mt#摽ҝ#:IOauw dGy өͦg:^ 7h#Z-7;};^:% kuv҇Z!?2={HK᫽&w\x罢ʻA^wBƣs>yAƂP7@q؎Y'c7s6M&,e#h5sp[Y!2ueӠ[+Y͝-ʹ0y/A+3iO5n YڲS;kÝ4J.l5{Yw-[^.ԍܺ}_5-pE<[S$еզ2Ъϟ>pgo6M7<ijRG*sV[;粵xHcA 'Ӹ\ Ak5Ŵ.Ӆ?>*ֻ4XIZ?4X Xofx2\Un:]z\B 7uOl׉|,,VJ*3Oxɵea>mbZ|ZFa$Gj9L!_fpOdqK}彵K9@.vՎZwԭwmv#޸%"0^[Z4SRdYdwmcZ鴯 j #jgV_.@X8z̏Z2%QroI:kFaD·^ؼ㝈kw;:U YKM2I"ݲme<+n? oy>yt/DY `OGcc^ӼQś%$Ozsw^P\°ѵ=~PmŝfK(nav <O›2.z^:fkm_زFfm }{WC@km# 4^t!9=ՋqJRl.Ґ.otA3+..n좲WܶR13ںKJH7WzkK)X2xt\k-J31;g5IX%.gvzw:[w/4ǚݘq*oQ{f|<$:WXT ׁ+S$((ߏ\Ρ;fe\͙P{q &te%*&z?j\y7 G o0sQ_="V2R4fC1Fɘ~k߄o/ēG)o>=5?մO _mň>]QH?zRnks<=wzBKrӋi.D]ܐ1ӟZs}MزA,R/#zz2 }QDi-1yXS qss9Ï(.1NZN}Mo`ՠ[o-N 6xgiz"Q?>߹ߎu2V:#1=Z 30m#}=+ZRG=hrөcҼCG{<ጥNckemPƒ#ǹzEZZk<˘>zשx[q? C>dZEe>=+joK>Ut!1 \\nO,ێ¼w[_9-dHۀp]ie]q:J(c+lgzMG5)'7+ ̠7L[ij\ݑ]~$*6Q>wL^^'y9+>ãjQʸ}=Lejݿ{Z B1Muݖ($=šnKM,Ygt Mm #kfIrnnzWVɒmR97aB)ԟ^-uLhu R䴤*|#xUC۵m K{l/WkZƫk M5/st`Z1+hWGIam1Dꘑ%ywvKogw GMøjSRE:Be<1YwGA_7|Nƨ,-TҜ]K&c}": ((ߏPj1̞|ܡH^;:Yη ;8_I\u_ٓF-<0\3n1} y|O&M $V,y[`P3QQ$Xk2UPqkڌw)G{k VI&6q1xϨ}+|c|S+'tq*p'fyÞ"eO1ʡCƘ 3j.+K}"jQY:ci?[^5RD̏#Bc YfOlf8u^[:xݒ:pn1Nڞr g[k׼a5}H<=5IT9@:S5FȺѮΤJk#3@@Ş^ij:.h2$ `1ߜT?Z-r}A&Nң8sZ).,[[ӦF[K䙺_şký_Kfu;YECrv#ε=g㖦[IavUr L_9^ UT(jBIj$7YŸyNyמݥ1An'RQο>׃K_On {R8lakm)$ާ{gn+PEPEPob_ aqyVݍ=y8us,2(dt0=;kzx{ c:fcw{qoۜ^٠ G/Mh}OTв+~m/p;~p@0=h4/7}^HqG<*# kښsh \KomʼI6 $J ӭz ơ,ًmvOq 7u,tv(;P^O)1O'sZ}yacM}H7 bGD_ ԴnpmV),l?!cx/?/QM5Ԑ~DY?tNyѫj,ed9!FL" w󟈚O kM'JPN4ǰ2Eu~I$$I3ۮ+x7: Cٌ9cF-7tjFqǴk(>-Gax|=O,ck=m -"M5|J>! <f ߿v=ts,|nEv;F+m~u6}tb W&z9=;׮Eҡ᷅5^Zڐ(QW11i)pHUVVvEtȿ-Vn'3Y72|u\WL̇a_6oj #@Ilj~hkIk{-F 5 Ő| _@{']LԒ,@LpC^eivC=&I"8ޮ[K0CZHkiӜH;|֗*SgoſwGpYʂ1u5rO x!Ș 7csjSN/{y6dd 0EEf̷g*Sí XZ{1X؅"~Bw='ϋ4i6%siU-#d1#Ž0ZEm^r%ʋwސzb$9F]\-l#}Ж|OCv:S"Dmz޾QEQEy߇Z=Bi֖g fk$n1{z:/_DtK$-9Hs_JzQ@6=嵜([DcybM9{qT᝼YkJ0=(R#g_}l^zgvyog_}_OzQ@6=.\#Ye[r`uRu_i5l|O=M EoI<Ȁ0hQYBQ[!R@nGSX`zP̑~>+Ti2` jmG5 B{ΉdeG\⾕Ҁ 8߽,Hp X| H`سcw OX ˏ`A$8$XA $8@LXE5nq!E$YI)UdK1e\M7,g %:I&]SQNZ)nպAaŎ%[Yi2X[qΥ[] _&\ذ ,f1 \@4o֜E(iԧ0kرeϦm@uNP@'^q HsѥO^uwŏ'_ԯg~ϗ??8 ƒh!Ĉ'6pƌ #Ȑ"G,il%̘2gҬi:w'РBpҤJ"up`@R8*֫ƒ{`@jײmmЭKz/pĊ3n1Ȓ `2̚7s.mtnͺg>P ܸ /n8ʉ89n:ڷsƓ/o<׳o@ӯo>8  @ 8bD xb8vx@#I4yt@3iִygN;y,p@PC5ziRK0jTSVzkVlد 0{ضe{`@s8o^p` p@bʼn0rdɓ)W|sfthѣI6}Xvvlٳif]ݻyޝ`@Å8yrpW~`@۹w7_@ٷw~|/p@~ <0a8|1ĉ+Z;z˛P } x}ۿ?@@PaB <QD-BT F Rd P@J y l޴`A=}&XPC,Hp@>TUVHe(@ZW\uލ@@}8@`… FXb \ƜYfΝ=pp`@ҥI8@j [[n޽}7>͝?@խWpݽ^x ^}_|ǟ@ @"Lp!Æ q`̈?zɒ&OLr%˒ )3fn̩~Y F"Mt)S *5jbͪu+׮^ {@fH`-۶n+m[~`0Hx1ƎC8A.c6P`Ξ?|@ҦKH`5֮_Î-un]޾.|8Ə(`9.}:֯c@޻8`<H>Ï/>OP H`A (aC8bE1f@=8dI'QTeK 9SfpԹgO?s(hQPTFZ WfպkWW 0Uĕwջo_x0$VqcǏ!G<@1_.pϟA=tiĖ@p6P ߿>xq r>zu о]{?|ypp@8~}׿@ (\ȰÇ#.

P Ȑ `p3ТGwp  Юm6 w~`@ʗ3o|ҧK?P ;Ǔ/o<oϾ?0 ? 

0 @nݻy=Å(yrpztөW~w^(}zٷ/p@|p<0… ,pĉ1# x2ȑ 8dZly@4kڼ<{

P@ɔ H ͜;{>P Ѣ :5 x ;ٲ 8   w?<̛;~@ԧ8  > >=?P @@ ,pB Qb \ĘQF dL4y@-]5m

l3>P ɔ+[\͜7( 8(ٳ .0 n < < 8/0  `>=@ۿ? 4X >QD-(@FLDR@5m,pN;0 @ETRM>@`V[VlE{@mݾWn޵{@}8@`… FXb r,_|@Ν=M>P j֫ [v -` \ PA͝ 0@(@P` ^/0`/@>,_ p` L@B(qb.bx@;8`$ɒ&OLr%˖ )3fny> *4 M@N:-pժT0@W(0@0@ $h`0` h A HL(0@P  `@0@ @o.p޼0`8Ə7PΛ(`:Ȯ};޿/~Σ?_(`>/p(`APP h@0 T 0@ 0@ X` ` @(0@ P%Pgў=P @[m 0ջo_8~+S^` 0`@0@`j4X&` @`x>@} @0@8Oڻo@8@@ tp@ 8@D-^ĘQF dLDRJ-O(@L j@0 ϯ80@&TaC&(bEиQ `@ ` P@AMIgO?@@$%)O>0@@ ( ^Pgў=P @[m $0n]wK7A-p@aÇ'VqcǏ0мsgϟAQ.p@k׭( ۷q-߿0| $\@sD0zu`߽(|y8}{Ǘ_H*\@#Bŋ3jȱE)(SL@b@8  @H  @X@ @@(@0@[Pݻv/_ LÈV ǎ @˘3k̹-ڀRPװc˞=7.<ȓ# 0(`@  0`@  0`$? $` ,d@%F4 `@G!E(Pd1eΤYM9u

P cȑ%O\ȅ gСE&]fkرeϦu>0 o $Px,g@ѥGOP u ${'?@էOP {P~?,h „ !Ĉ'Rh" #Ȑ"G,i@V\y`@2cH&Λ g@JH)ԧ jjrݚ@b8,ڳ -ܸrҭk/.l@3n1Ȓ'+.p̘.M@W.pذ`@‡ /pPN@ڷs;k/p׳o= `>` p@B TX@9n,p@H!pt@3i,p@N95ZK6ujTS.p@V[vlXc pmZkٶuԵ[{-@`p 4v8A)O@f͙ 6]:AYp@lٱ pwnݻy7~yr˙7wөW~{v۹Op@x p w>A/@~0$0!8|@+RLP ƍ2$<2ʕ,[|ir4kڼ3Ν<{LP@D=4ҥL H Ԩ jzz@d8 ڴ x mڭ{@|8  8p;n+[9͜;(ѤK>:լ0(;ٴk۾;7l ;7`̛3oP0PAܻ/hP0@@$XA 0 $@ @a>tA-^ĘQF)2X@H%MDRJ$8@5męSN=$8@Ez40`(@ `@ P@Z @@.(`W x @ 0P0@  Ν9;X FZj֭]> 8[n޽}\pōG{0@tե .`v |?@|(@ @/@@ Lp!ÆB(q"Ŋ/b̨qc  ( 0 `@  (0@O>  @0HA@EP`  @]   +w.ݺvͫw/߾~,x0a  (  0@ `,8` HmX Pp A (A  P0@/~<ϣO~=Ï/p`  0`@$P0d4@ X<  (@ @ P((P@ ``F:jUWfպkW_;j p` P 0 @A(0x  X <` @ @ P((P@ ``>xqǑ'WysϡG>0H Pp`  A   `@} ЯAPP`@ ,Xp@A` @ A@0cʜI͛8sɳϟ@ @(@P` PA (@@VY P  (P  (,@ `@ `h̹ϠCMӨS^ͺ  `۶0oN X@ ^z0@ 0@0@A˟OϿ$X  `x A$Hp@ 4n1A$XPrA)drAdΔ 9$h` Pt 0Q:@UnP  `Ԯe;@ 5@@ P$XP/`1 $O\ l  D `Ufkرe^ P  Gq(`s 0`@lw  _< gAP 0?0A ` X0@@"  $J  @@0P`N 0S  (@ 0hTT NU`* p+b*`@ڴh0ҭk.޼z{ ` h1&ly6s\.Mڀ h5f `6v ව (@h\tS' ڷ ^  ` 0=ӯo'`0xaB 6tb( (P@PH4p* (P` 0@i 0z0@ *`@V PApVj p[@ P/ (A 0l3&@TPs ـI PY0@ 0@wnx 7n˗ (`@~{v۹w| hpA( p@ p   `0 `:zH@J0  0@,X `@ AU @@ 0`  `0` صK ` `  0 x@@@   @Z0@@` 08`@8<̛;=z (x`@  @ 8H@$A@@ ` D h F @  `$P0@ `@0XA@@ `@(`  `@m u0    @0`, `|@@@ @h@pōG\r   0 @(@@0 `,` P $ `0@:4 `0@ `@(H@ @  `$P  ` 8  @ (0f `- 0@ `@(H @ (P`0@ ` ` @ @ Ə#O|9Ο7  ` ,h`0`#h` "0p0@! 0@ (0` 0@,X `  @  `  $`P@ 0`00 `@0A   `  `@0@@0` `P@   ߿>xqǑ   @@(@0@@ |(@P@@{(P`O @ @`A(T(a (@QGB 0  0  `&rP@P(]TӧOH@W @@  hXv @ @ x0ǐ#KL˘3BM:^ͺb` ۶ 0 .`ȏ XN @:u 0` W ` @   .C!8@E5@ $YI)Ud@1c `$ @ %*`Q0 `SL `YfеW_Phe;  `ݻ W 0ĉ 0@@ PA ((0` @@ ` ]{@/P`ɕ/_>s ^]uٵ_7ď'_yկg@ 0` ?@ 0  hPH@ pȑF ` @0`:sP (2]j0 ZHpA @@(@`z;/ `01d lYf6pWn5ز `w{p‡>@0 s(H:  @@`^g?= @ 0H` 68 `A ,hP pt)`3gyS@N;y S@PA piR4%VzkV[vz`@ (@0@@Zk  .@w(@0@ 4vx P PA@@P  @ `0n@r@ A ,p @ ק?P(@0@…x8`q@ R89,[| 3̙4k6  @@P  `R  *,XР0` h ,7. ` AA  @@ @ $H `   @   (n (A ,x  A0@  `z  >$HРh  BPA  @@F|,pH%MDRJ-@  @ 0@( H@ H$Vm 8 ` 0`@,P  @ H @@@ 08p ``A `p <7  @@ @O@$@ 0@`~  HA @ q#ǎ? )r$`i @ I@% A(@@S  88P@X@,` P 0 @(  880@ M`   ,H0(0A @@q ` `  HAHo @@@' A&@ P!F8bE1fl 4@   `@0@@74H? `h ,0 ``A  @@ 4@ $H0Hp@  `@ 0` @ `Р h`A 8` AM@o @@q  @N@@ 4(  0  =$H ` @ @*\Ȱ P2』9d,b   0@@]`  ( (@P` PA (@X+`@]PHp H^ (0@B 0@i^ͺ (0@ͻo(P`|УKNسk?0 w‡@ X?ȟ/}(H$P0 `(% Hqŋ4(#!E i  R @Athg @P@Az ~ (@P 4@@ " H@ xd $ `P ( L4i '<  @P:}*`T 5 - ڵ Ptڽ7޽|( p0A  0dP`f 8H@X `;,H `8G`x'` x8_@A 0@,8A ( $`0@  Q R@I@@ 4(   @J@P 4HA ( A 0@]8@Xe͞EVZ  (HA(0@(` X` @`@FZ$@  `@(H@@n @ `  (P@A,h@ ( @u;ŏ  `߾@̧O@@P 4h؀((`Q 4PP@ R̘f iS(P 0 `R `Z  `0`@i(`@ P@ @/.l 0c  ` `@(-`nZ `p6  `7/`ʗ3oN @ ogA(PH@V 6`X P 48 X@@ @(@0@y  @@ (0`Z(0`Aݻ]`   ;=ԫ[@@,8@4H Pp A/8`P P0`,^@ ,h@0@@0`lh 0x@ @ ((  6nv@ `  ` oA`~  ཀ /0@_`@4lXb' ` @dH#I4yX4@@@L3ip&; g0:`K (ST*`@uȖ5` @Z48@ `@A^{ (0ppX` PР `@X  @x.{@0@@ TP۹w|xط0`Է p0  0 Ĉ0@F:zr8@48 4` N  С 4iLx *HРxuرd 8+ lۺ}+ nt7/^p >8Ō @ <`͜x tJ(A[ xz `zM@8> 0@(( 0  ,8  0@P @H@ P@@   @@H%r\,@I={@@%@@R((@ @\ŚUV]~ Xp@0` @PA @<@P@ P@={& @ Z @6 0(@ < Xpip  U@X0;-Z  `@\s ` @ @4vrdɓ)W|@0@H(5X(PA  0 0@(0 4wޜ @P @@x 0O}z `$8@  P,p  `@ (F P`  SN9 hP  `ҥ  `T  `@0`@ @ } 7ܹtڽ| ` >|x8. (A͛x\` 8 ({k۾=`{0@0H`A $8@h 08^zڻ?>$p 8@@D>(@, Q<P@%RJ-]S P@|(@P (@R"@P@ PU (AEm>hP@\;` x` 6Xq (` 0XaB 0@D(x t$G#,i`xp3 ` 0 C5:T@R `  H lXȖ5{mZkٶe;n pw{p` >0 @bpx@(  (P`@Hpz@ի.ZAif@n 0~ܸ˕p@ TO@`` 0@>|  ? ,1Xq (P`ȑ$ `Z@PpСD=4ҥL TZ@ (PAʖ-Plۺ- .tڽ[^-0 @@Ō 0 ɓX60 0  (`@Ax v M@` 0@@X0 vx~~ `@8 0 >QD-@#|Y@H%I @|Y@L,0@=yPE5:@M:5UjU `  ( k\u K@^x @bƍYd\Y<PZj֭][& `n޽  (P\/P|/͛7 @P` 4PP@4@`@ (P` h8XP0Ҁ @`&͚5@@S  `*b:`(@P` PA (@+@,x0†#Nx @ ` (P `60 @ O  8`   A 0` },x` 6(@  $Hp@ 0@@  @`@ 0&7 s 0`  `4X @ A 0  v(p@]wջo_08(0 (0`@ X`@ `` 0 (@0@@ @o߽ @P@ ( $(`  ` HA0 ,Hp`@@xР HA @@0(@@`0 r ` @@@(% @A(@ 8H`,`h ` Kݻx˷0@@0 HV h.0@@P @`@ޭ@@`@8 @@0@$@` ( <8A `A 0@$@ (@ I @@ 9 SP X@<` ` -0@i8[qΥ[] k  (0 4P0e P `@  `Pvm`  0 `  ` $`P00@ (80 $`PhhD 4H@0`P   h9@`S  $h@,  Pp` (u8,ڴjײm-ܸK`޼z `xhx&0@g @ 0@ &`6n(0@‡0@ @ <8`ڵ (Ɠ/_^@ 0@A `0  P(@    `@ (@Pe 0 hִygN;yy`@(0)K6-0`@RTZkVYtZl5[ `.\%po^ 5@0 14`@͛9wL@ @`((0@@lٳ p[ݻyx PA pzT` @t|xɗ7 ~@ԯ_ p (0)‍:0$J0@ eJ,  @j0@ 'z0@ (50@8 @@ `\ x* ʖ%P  7t0`@|0@  b PA*[@\pլ[~ ;ٴ;= ċP y P z`p  `  ` '`@(@ $  1D@0@ H@IJ` ̙ 4HpA:@PE-0@@@ *|- @e `( 8@^}X`@l<@dʕ \.0@;=h0` [wn}0` @ 0=t @@|G/@ `@ @@~0@p  Q8`)r&H9._Œ)s&͚6o   t@F TN@Z  `@  v@۶l `v A  0` ``2 @g(0 (P`- ( o (  ,8Ο @@ @@/0@Σ0`@ (P` 0&TaC!F@@$h@XA$`D` A   @ PjO>]@j` 0  $`P@ 4H( ``    $`0l@g 0HA(  `@@@o0  $h@@0@@@w4HA @ A @(p@H*\h<@(X@i @R  $P  `AH"M@ H @ 0  8H@$p @ P @ 0@8p XA0x@@ N@$P  `@u$p P @8Ͽ$(8@(HAh @ A(   8H@3 %:40@@ p @ `A 0  H@8@ H@ @@0`$@@ @p@ `c ` @ @A(@@0 : @(H@ 8}?@,hP` 8 @ A @@@ 4(@$H ` P(j0 `@ Pp0PA @ 0(@ @$HР ` A00A 0` l@ 4(@$8 p   (P` 0`,X0` h`A A  (p  4x P@0Q#I(A0y XhP p4K `@ T% 0`@ @P@s @  0|a ( @d (@ H`HpZի06(@P`ݺ     @P`p}۹w|xɗ?0 @zطw~@|׷} A  P*H cF x2GJ,i J,[| 3&K4 ' ,P@ @ 4逥L x*`TZuz vX8 ڵlۺ} 7ܹ  @ 88v,@X,`J.@0h@j6@ 7z0@@ `r8`@tXnv 0` 8Ozڷ7 ~|`0 ~H@<(@ h\(@F 0`L295męSN=}@E @M U֬ `  (VmZ Hp A  ` @} %` @<@@ ,@Μ |m@4ҥ 6@0@@6 pō/@r= @/`@pzݿ_| 0` A"Lpa0 .b8,X $rJ)sfLn= *t(QFH@NB*u*էU׮ (P`fϢE;`-n w.ݺvͫw/& ` Hx  y2e`,` @@ҦO `fP@ m ( Ə#7.N@@Ȯ}v ( yOo Ï/{'@@*`@A&0@@ÆDp@E1fԸcG0 @KA 9@0t 0`$H`Wf`0H0@$H`0 ( A $&PA 0@d6@  `P @@ׯaǖ=vm@P 90]dP?|y'(} P`0@,  ` @(0  HP@(S`px@8 @@80    $@@0@8p LÈ@ `$P 0@`iXc˞M۸s>0 o0@ 8p0  @ y0@A @0@@ @,H@  @@8p0    $@@0@0 Q ZUYnj@0 ,8y  &\aĉ/f#0@@e0@8`T0A '^< 0`@ P] 00A 0`  ` $`P@ 0H (h ( A `F #Ȑ"G,р0@@L 4X$` (J@h)ԨRRj իb  `j -ܸK@ / PA hd `ಀ@ТG 0`@6ܹP‡@@ʗ3o9 @o/@/Oh?@`>  4(@  p(`@D) `@F dH0p+YA2h@   C 5ziRK p*@TSN [vlX] 0kpV@\sK @p` 6|x0`2d'+P(Ah Hfp  `@ٳiF@w'Hpx  ` @@T@tn@7/ ` @| p 0@ ( :|X`@0 ƌPJۻ?;x4` DPB (DQF<@%Mp-]l޴i=J@(TҥuU^ŚUV]~VXY,8 (( @  ` `… FlX@@ (0={.hҥMF@֭Y ` ۀ| @8/@A 8@tխ_Ǟ]vݽ  0@ h  PA $`A HÆ @@`XA 0`@ 4(@ ˖. $ s&͚6o&(`'ϝ%``( EJ@0  84 v,ٲfϢMv-۶n[ @ 0XA0  `. >0@@6@`p H@.@Ə#O|yCn@u 0`0 `= p@ ϯ?8`A&TaC>8` P@ 88P@$p   ` @Mp0g ` @Q  $@` @W_ 0lYg(m[%0 @@ @@0 @1gּsgϟA=tiӚ0(0@ 0PP` 0` @$H0  ` @ PA `@ 0(` @} pH  Xp0@ `   @@  0@@8sɳϟ@ Jѣ;((PA 4P0@ @ @P@hӦ5p0+`@  ` Ç ǐ#(0@ϟ=zӨO0۸sͻ Nq  @`  ` @ hNË?^y XO{O@8$X ,d$ P5 D I dK1eΤYtHpOA%ZHQ.h@A 4@0a @@0 - [з/P80LL5gv С,pi `ݚ@ =@o q8sѥO^u wŏ'_;ԯW A((00`@`0 `' XF6n$QF  hI@2e8&Λ 'z@J )R  *Vp%@@ @h-ܸrҭkn/.l@+v @̙ plТG-@ k`ܸ wʗ(`u  x0׳o/`8>  4x6tbD)Vd85>H `eJ0@@@  `x@hP piR @P`z[r-p@Xa pu@s% 0  ( (P`ɒ 8wthѣI6}`@իYvvlٳU8wn @ @  PA @ 0@ 0`` AP 0 Bx*Z87( H h 000`@ 4@ L:} 5ԩTZ=0 ֭\z 6رZ6-x \0` $p @0@ Y l$@@ `j۶]ݼw( 8;.@0 {,P@ @ 0 ~ؿ?@@

QD Qc HL0` $p @0@  @)  8He͚-pZkWn{@}%` (  H@  MFZj֭]>P@ڵmƝ[n޽ 8@p < n `  PA 0`  @> o@ d0>,pŊ q @&O$A @ 4@ $H 0`i@*u*ժVbͪ@^ +v,ٲfz-p۶l 0`v%` ( @`C, ``3g  z4N_pڴ{n ^@P`: 0@ ~<ϣO~=/>(0P!C!F8D/иqA0dɑPReĔi@7q

 0@@ 0 (׳o=?P   4xa4tذ)NL@ t$@# pX @0@$p A  ` @R ` @ @@ 48`@cHmZkٶMP @\s8Ap  X(S.p@f͛9wthѣppvlٳi@y.p@p 00<@Tn `  PA 0@  @  A8|@+Z1c:z@ 24(  $ `N4@=4ҥL:}z@T8 ֭\z Vʚ-[l&(` @7/|W 8b86`d  sJ>:~   w   8>@r8pԫ[=><?>۟?P ??   $PB <|H@D QF |$0A4@J8SL5i:80 N= TР T<}:@*UUV]~VE{mݶu W =` >P bƋ Yr f<MMF]ڀ  @6ڵ  @@N` ,h0 r(8]tխ+@vݷ@x `P_~ p "LX@:,pŊ0(q#ǎ?2X`$ɑ H2e^|6m0@`'Ϟ< `F 5@`RN `*V  @ @@ 8 ׀P`/߾~ (  Nx1b y@P`z5֮_Î-{6΍NP@Ə#O@C~@֫8`;  yΣOO{Ï/?ϯ}0@`,h0 @C!F8"D1fh?9@ (PP@9fM7qԹZGiSOFp@UU@ (0kw ( P0@ GPdl0 A$`0 @kׯaǖ=kpЭ;@o @ P\9 @@ױg׾{w?P @y ė?~}п_("<00`  ` `  PA 0`   $`PH `i0X ʵׯ`Êj U ( 0@@ H`4ǐ#KLhެC>0 ӨS^=װ_({4p A   P $(`  `HA o  ``@<8@%NXň @ Gp(@@ 8`@ %ZQI.ez@Q8U Wa Pleq=0$(` @ 6@ p @ 0@  ` H m@ p ^qɕ//n@sO> @ x@ ̧_}X (` Ĉ'Rh7j

@`4H@XTxcF9b4` @H" (@ $h@ (p@PC5ziRKTZ@[vlȖ%{@k8n\ p@^{  6|7vrc`РthѣImujpm @X6 0>˙7wztө({vȗ7}w@/p@~( 0@4`…0 b*V4xH $8I J, 4 j"@ NI@D8 iR60`0 \*@d 8K  ` \ ;@ 8 >8;n\ɔ'( ͜;{.pѢ:5~:j6@ z0@`̛ x.   @x@~ (A ߀   P@ @ (@1 |,0@ @\ `@ s=}TPE=P RK Uj\ŚUV̞5[m&@@ \5W^}l`… @@bƍ0` @ 0 0@MF (`4hA 4`A00 `_|ǟ_ p` L@B(qb.bx@;8`$ɑ 0 )sfL @0@~ * MJ(0@ (% v@  @`@0@`@"( 2h$H|@,hA` g(0@4Hp-{6ڶoέ{~]Ƌ(`9ΟC/p}@H`0  00A 0     d$@$H` h`A0@M  `@0 `P@ Z@A 4@0` h  ` 0` @8` H4qcǏ!GP @iӧQV]ׯ](vmн[4p A  ` @`@00@@@y ` @ $@@` 8` ` @  0A x` (k 8h@ Ҫ]˶۷pʝ{@x8߾ LÈ 1H,3c>0$@` @`u ; @<0y    @^ҫ`@ `@H` 0   $`@ 0`PA0  @` Xt1 $X A  ʕ 3 ( @ (P`(pҥL:} 5ԩT5+x@d˚=6mںm{@t8 ޼ 8 >l;60Aɔ+O^yA͜7/J60A$X H`0  `$P0`@  7@ @0@ ?X DPB (@D<~RDy@-],pL3Sg5ZM>5^Z]~@e͞E[@ܾu{u W^}[… FXbƍ(@d<ZF}@].plڳ[w ;Aō/r͝?@թH@vݷ'(@x8@z_|ߏ_ p "Lp@/Z<0 @E1f8=(dIPR`Ƅ97mgO:hQG D:dպ 6AgѦUm[h0n]wջo>0 @cǏ!G<˗-(sg=ZPF-a;8 @m۵wo߿'xq8ys 0zu$?|yыp@{Ǘ?~}Hp*\ȰH(@3b,pǏ @$\0cp͛8sܙ`@@8ѣHӧPHժ ʵׯ`Ê:hӪ]˶۷p(ݺwoL $1H,3cNP@Ϡ H  ȞMm0oNq  8 Ë@ҫ_Ͼ˟@8,`PA .dCPblq!EdI'0(eK ̤Y&M @ P.etNZu*jMpĎ%[v -0[q-`y_(a`ܘ L>e̙5Hp  ]TV]رa;Xm 8wo  ^</g| (P:o?`ŏ'/Hp{ (P~ ? „ 2< 8`"ƌ7r#,I*Wl%̘+`'РB홠J(pRRj*V0+ذbǎpjײm-ܸrҭ@z-p.lp0n̸'Sl2̚'3(m4W6`@زgӮm@w7‡/n|3_^ҧSn:(;(o<׳oo  L0 @B 6lh@)VxcF9vH$Y+Ytf̕ yfxhPC

,Hp  x (?x@@ DhP >Ѐ,^,$XH#,Hp@ SL5męS|i@E (TRM>P@j k~VX^0(VmZ =A}X0  @ƍ?n,@ \AΜ(`ҥI/`P@j [lڵmƝ[|\pō]͝?]: @޻ @^zݿ?@ @"<(Ŋ/b̨q#ǎ r$ɒ&OLr)s&͚6a`'ϝ*t(Q Ht)ӦNB*5ib`@^8`,ٱH6+w.ݺv{~,x0†(pƎC,.c<Ξ?`@ҦONz5֮(ڴ {ƏpΟC.}:};޿/~O~=(`>ȯ? 0`A&T D1A1^,p@G0TeK/aƔ97qԹgO?p@QG&UFZWfz`@_;lYg8m[;Wn{@8paÇ'Vqc\$Wϡ?p@u ?|yѧWǗ?~}p@H !HHhȱǏ Cq(S<0 ˗.@&ܩs@ JѣH*MP@PJJիX Hׯ`Ê5AҪ5P pʅx˷߿(Æ0cLyrhl@CMӨS^װc˞Mۮ, 罀Aȏ3XН/`Pسkν O~ҫO`/`P Ͽ$XA "t XE5nx ,pI)UdidL9u`AA$8PQI.e@Q$XUW,Hp  [ e`qΥ[]y_&\aĉ/fcȑ%O\e̙5ogСE&]iԩUfkرeϦ]mܹuo'^ܓqɕ/gsѥO^uٵowŏ'_yկg{ϧ_}?@,h „ 2l!Ĉ'Rh"ƌ7r#Ȑ"G,i$ʔ*Wl%̘2gҬi&Μ:w'РB-jh΀!! NETSCAPE2.0,(_888FFF'''TTTgggwwwŇ Hp`*\ȰÇ&(Ŋqi@0 0 P 0@  @ H` J@P0@p hݻv/ LÈNP H,@3k̹ϙ@4^z  @ 8`('` @H  0` 0@ `P@0`@  X.TX %NXň ر@!AHI)UdddΔY9q.`P@  @  @LEP`nu@  (0@Yiզ֭Pз 0Xa `ܘq$O\e̙''(D=Ufkmݛ Pq,sKPz@'_x(X{ _?@,h@h@# Pp"ƌ7rFY*S&P 2e@Μ  @P @Ҥ  @T @V `b *P`q  z(/(l0Ċ36@@Ȓ l p.0ТG.mz@05mvv=A‡'`P00Aҧ'`000A'`00H  O~  0xР 4,0@D)Vxq@0dH4yeJ+Y$Y3e(gN%ZK(jTztڵcɎ=P @Zi Ե{o^{[ @` 6|qbŁ T\@9oNP @hѡ $pvݺ@iNP @nݹ $7^|˙/?P @tөW~{v |xɗ7@طg`@H~ 0@8`:lX '&( ƌcJ,9,W(` ̙4kڼ3N 4СD=L2=P ԩR 5+xd˒=P ڵj 7.ؽk|=P 818~ 9ɔ+[< ͜;{ :њ:5~k>P ݺ <8?n̛3?P =;x˓?0 ۻ?ؿ?@@Pa<@-VLP F $RdDy@-]LP L3 $SgsE=0 RM>UT\ŚUV]~{ue͖=0 Zk $Wn{@}MP `ƒ $Xq<@-WN0 fΛZtFZj֭]]@ڵmƝ[n޽ H@p @y?w~@թ8@v |̟7@8@|  P` Lp!ÆBȠŊ/b̨q#ǎ, r HҀ  A `@  A 5`@ &H`j `j`^.XР 5P n.`P`.ݺvͫw/ >†#Nx1 @>`/[N@  ` F@m0ȭ.@@ +`?' ](P@ OHp`>ϯ8`A&TaC(@0fԸ9'QD@K` )`@͚p"й(XhQG&UiSOF:hP@AP0  .v0 @  (0`@D0@ P@#(  Pukׯaǖ=vm۷qV ,8` 08pA Pp`N@? ((  $h`  @@PA P P3jȱǏ CIɓ  0`@$P  @P 0 @A((0@ 0$p  ( @0XÈ+^̸ǐ#KLp p` P 0 @A(@{ X`,` @ @ 0@( `@70˟OϿ$X0H Pp`  A   `I В ,8`XA ` @ APU `WaŎ%[Yiծe @P  `@  (0@$O&@@@ ((0@0`A К ]`    ^qɕ/gsѥO'@ ޝ'/ `~@ (P @$`PB  @ Ph"ƌ7rqA"$H H`̘2e&Hp@ v.H炠B.HҤH$X  @@ ,jתr - 0``0X A7sNТGN4W^` , 0 0Pr 3gPG@  @ ƏWA#P   `,(  `)P#`H 00@L3Y`(` (@p (`RT+V[(AX ȖUk"(0 p{ p0|x7n\T\ـ thH pujէ 0@ P7 @É P W~t|xɇ `@z^@0@@ @   @(0@  $K4@@ `L4 )`@  (0@ 0@0` `@@A@ @0@t ^@ 0b;6`d*0` x6@ h 8ڀjZP@ P 0@ 87@`   `0 `ڻO@0  (`4X @    $`0  ` P @R @@\5@` 6e  m @0@@ ` @`p (x`@  @ 8H@$p  ` @0@t\7@; ` @0@A(0@   4 0P  P@@ Hi@K4@@@ N 0@V0` ` @@k X0p P 0@   X@,` ` @0`7 @ @(0@  @ H@ `@$p   ` 0P   01 @  `,P0@ `@0   @ : P`0 `,Xp h`A  A  @ ,h`0@@VZ `@0` @`0@ : 0@ `Pp(h  @ PP@  `C  `4H @  9@s 0  `XP` @@ p@@ @,xa+^L`cH,r (@@ZiX=0@00@  X^` @@ 0@@w @ @@   @@ ,$@@LXq D$YRdKd` M7 0OA *`QI `JSNJUW (A0P` ``A0@@]WPa/fܘL\й  i  `k` @ o'.`ɕ'\KP0` /` `@ 0@ H 0DA (@"0#H  lYfҬYsΜv 󧀠B j @J `RR0Up` @`,Z0re`w0  ``y С@ (A4h6 ,H 0@ʗ hҧ `>@ (/`֯' `@ pP@B 6t xb `@H0%J+WpR@3 `gN  %@ `*S$8p@[4PP@ pv@ض0`rԵ+o^{ +p`0|qb0 @  sf I@@Xvz`ݻu/`0@ p|@  ( (@P` PA PA '~|(h0A \ 1"* ƌ: @$ P,[ j  (0@P @   @0@@X4X%`t @ A(X  ( A A  @ ,8@4H AMn0@@``X` `P@x  @0` ` XA  @!0`, $hP@L0@ X@5 `=  H@j @  @Xc  0`@,P  @(X0P  `@sP`L P@@87  @@ O@$@ 0@`| `@~LA @`h @ I@$ A @@M 88P@"=X@,` P 0 @(  H@l@؀   hp`,X @@k ` `  HAn @`@@' A @@  @@ @PH@@C 0HA@@A @@K-(PA @@ 4@ ,H h A  P 0X@-(P`HpA ^ (( 1c 0`0 `0@@@i 4HA&` ` ( A @ @о 0@ė??  0@` (P PA (@0   @@8o  PH48P48 W;@Yh]˶ (0@ݻ˷o_PX,@"@˕hgMi(H  @@mr ؽ{@@ПnP@48@| @A  @_} Ͽ$XA  0@$ @@E  `$) ,0`d ͛08gO0PI@@l @  i`k[̥; 4` hpp+`Р0@@e4oYС&]Z`M@d=@m7 ON@ٳ^`w G@`?0} @@ (8@„@P "Ƌ 0J*hY 0hp  <   (ZhtԨ `Y pubǒ0Yj0` ` @0/6 `Ċ h1d0ep.P` (-W6@@f `6v0@@ (@( 7~  48 ^` a„4t(`h@8 @,0`0 ` (PP 0@K65 :@@VP 0{Yض5@@ $Hp@ 0h 3PpX4h@ pL0Mի@zٳi 0@@n= @@  : A  0_` (0,`P@ ,X `x1,H `D`$`@ P,8@ ݀ر@'O@ +@@  07@@ `A `00@A0 )`) @1cY`͛0@@@ PԨ(SLZ**Pl`;p (PnW a 8 $Hpr 4/Hp(P 8@ M6 -  @ 4Hp@LP}u l/0 _ `/P`}` ` 0lpD(`6r ࣀ" ()*W4@@fҤ9&Μ$'J.h` (@@V` @@j׮Vܸp ` $P0(la h1d%l̚30`@ (@P@n-`e v۷ @9tS>`0@ (  0= $X`?A ,H  "(0@,x(R #7(@ @ Auо 0`ЧWA{  ~} (P`@H (\ha 8`A 48` ` hP@ (v P5@`~L P@p@0@  `  8HP@L`0 l ` @@@' A(@@X`,` ` @ ` _,P P`00`@@ H2   0@0` 0(@ժ  ``@$h@ 0HA  ``/  A `, <@ z  $h`<  Pp` (|N`]{(`@~?}P8`@C (P` и# ( 0 8H`$pP$Ut` @8 @ @ĕ;w@ [@ 4@0@0`A ( (0sϟAP4QPuk  @۷m(@qǑ7@s n0 ѧW^0 `0(\(`"J8q@ hd CYXi@0c,@7 ,0` :hH"iP"@P`X0` %`lY ` %`@(X``(& @0`h,3B0` XȞ- -@ >`P N]P{ (|X/}ˇ_(A 8`@ ,  L8 `   dP39 0g8H <@A@Е +@ v@ `y ;o0@Xc(r <@Pz@dϦ-{mܹo(0` >q0@AO;wŏ'/yԫ7` @$8@,@ „ 0@!DP4`b4X0@ʔV f0:wP (Ҥ0`@ (0@@bNJ`l  @P`(@P`z0  .LAd @P@A  0hM@@ A0`@ ( ʕ PP' `@@   `|`  P @@   cF` 0`@@ 4(   'N $8`4H4%` @Tzժ 5 ` A0PA @ 0` @$8` 08@ A 0` 0m@ 0(@ @$H@$xA  p.T' @  } p< 4( $H @`    H@,P @@  g  4L p @ `A 0  8HP@$ A @0@ xl$@` @p`8:6 &` @z   ` 8H@$ @ z0p`P(@ @ 8H@$p  ` $Re `@&l8A0  $@` @8] $p 8@ @@0`$@` @p` A,[6   @ @@$P  `@n$ P @`0`@ 4(   @>$HР, A @@Ŋ4(0@@ 0  $hP@ 0HA( A H:A  U  `  $`P 4Hp@(0@0@ ,h`0@@i4X @ A[@ `.]֯@PGO X`>0`  `! ( @P` PPI`i  `@O?{ (APA(Xu^+g@@čKw PAP$V,@ 0re0 мsgϟ 0 H@k0@P@A(( @>܀Ǒ'W܀ϡ00:ױg׾} (X`^@Ǘ/׿@P H@Q (B)@R$b ` Msg H@@4P @5 ` @@@ @o    _0@ 0,A -R @@a Mm  @>@Xn@sN}uh' @‹O^ Xˏ o 4@ 0@@$ PQ40 D0@I) @P$`@A0@I`SNLjju `iծ0@K@y W_0@aĉ`<@%Pr8p@ $h `meϦ= o'^,' O^u٧ `w P޼իО@0@@ ` „ 0dXPhq(@   ` @*U AfҬYS@  @(ҤI@R `p+ذbz5@@Zje[ k5@00@d $h@0@@0` @ A m0 A$`0  00A 0`  ` $hPz$H `>`` 4 bD)V0@@@H 4X$`h @@ ` ` @ @(@@0 `@ P { 0``UTN  |% @  6-W\7|l…@<@ƍ  Y2 \&` Z(0@H` (( @ ( pō' `@0`@@vP͛@ݿ_| 0@ p  p!  `Q )rNLrI)3f6m@>(`p 4PP`N*u*U Ȫu+W+v,ٱ0`-۶n+ `/߽ x0ac (e 0Ȭg 0P i NfZ @o㶍@A4.@$h`@@`t . ^ O/` ` } ~80 $,0@C!Pb иQ(0`@@@0 @ $X04AG&=iOF:5A48p A_M`Mp@$h  PlǏ l@0c&@@@g@0 PPM@ׯ] Ppvm۷qV @o߽ 0@P\@sD.zuо{w?< 48  8 п HpPH@"ȑIɒ %K )@  @ JtQ(]ʴӧPJJ (` ,8h 0ȝK.]k_@ (A Lr2k̹- ڀkb ={ͻNȓ+_μ9   `4` A 0@ 0@ @ O@  H@  ` $hP@5HG!ELP I'  0 0P&  O,eSQNZ `@ P `A 0@@   `lc$ @ ]tTf̦=ۀ6@7 ` `@s,ٵowx@ 8  H0@  &0@p4@ H@Ьi:wj@R @@ ` `@(Xjײm-ܸr P ,x( A0@pl h@ hm@ 4(@ $H‡/pʗ3oSn p7@w 0`  `Xp  4xaB    8p`A 0р@eJ* lIhִ)`@ S@@K8jTSV=P @VY 0`c 0{mZ-@Aֵ{o^{ `(hp   h @ DPB $Qb @@#@ȑL0J-]L)@'  @(ET<4A^5P ](@X0@  @śW@`… FXb (y h@ P@lƝ[m @P`ō7@_>ݹ(@@@ `  ``!ÆB(q"ŅȨ1c IN4` @$H`   @Q %@@@5@ @`V^ 0`,YH6};v(`/_ h 0PA 0`@ 4@ 0 ҦONz5֤ { m`7o~6` @8p HA @@O@7@A `}`?0$T!>

zuױg׾@P>@ `` 0 $H`0"0`  ( A @@ Xɲebʌy`@8o8Ϟ J( $`0@0H @ A@V X˶۷pʝKwm͛ L @P@(2k̹f  kM{r=(q @ (@0w0` XϾ˟O}ϟ X`A .dC LX G Pd `@dΔy@9s ϟ%ZTiSZ`@Yna ` Yg m`y%/0@a c$O& 23ܙD&-U^kد,Pvۀ `q,7@@N@ @ Ppyկgϗ_'(` 0` *4! P4@"F QH `Ҁ*U 2gҔY:s:XР 8`0m0@0@@ƒ-+`@k.޼z .pĈ0  P\̚7s9F.]n:@fӮm6 @  9 N @ڷk/Ǔ/o|oϾOP@  48P@  bD @  ` @H" peJ+Y(f̘ P 0piR TzkV[ZMP @Xa p pkn\0@/K0`  ` $`P `40u0vl8pwnݻu;8P @p ` A4  @0`P @z $~|׷?A/&@`  `@ H@  $  `  8H@4 5*X5֭  6lH@80  @@>l;~ 9ɍ93x9J0`0    ` @ @@00@@ۿ?@8HP 80 < ` L4Y-]SL(@Nh5`T \5@@ |5@08p5 ` @0` 4@ bƋ $Ydʕ-'(@f(8pPp A\ `@ @ xG\r͏(@t{0`@^z (P`O 4` h@@H`"Ŋ/bLP ǎ 0`N0 I`&6o4@>{8`(ѢF"MB}ZV&(` W K`,ٲf H۶ w.ݺv + P „p`1Ǝ;vp`@ʖ/0`3Λ  `4iN H-`k -;vn`A$8 |8H~ C~@֫8`;  > OÏ/0@@H@"$@@4XAdԘQA9PTi @K 0s&7 0> @P@@&EZO.`PjUWfe@W]0U65`@]w0 lP@clY0uk (0q]`@0xq$Wnϟ0 d׎ 0W>AǗ?|п_("L@" @E2j$Ǐ Ci @$pȜI͛8s4ϟ< @T&E Jujjz`@`ÊKvhӢ=P ۷n @. 0 ` (&0@0@@@  `ϠCP^m0 0 N (_9 `0HР@ӣ/p @8(A`ؐ 8 l4  00A @ 0(@ 4@$Hh WaŎjYԪ V `` `$p@A'.pcȏ Pe̙58g  ]tTV}` HP@ m 8A0  ` @8pހ h ?,h B ` DPp(@ `  8hP ̘0 `'Р(j2]ZR``@0  @@8p HA  @@0`@$@@P6`9 F.m4K @@زc8(8Р 0@0(9np; `oϾ?04`` ` `  PA 0@ 0i@ 4(@ Դi@ -NM (0 P`0@`  @`@0@`@ @@ />|'X P @@@ 4Hp@!>,p@EcGA8dI PRe`Ƅy $`0@ A 0@ @+g 0` 0 ,80@`@ 00A @(ht (8  (h  PA 0(zuо]?|W@/p@} 000@ $p A  ` @@ R @@pp@$p ` @``0 88P`@ $`0 @ $h0(@ 8H@@$p@ XAB]ӨO(װc.p۶7.8 $p A @> >0~  0`$(@  X1 H< ` @$x4X 8H`$` ` `APle@qΥ[n{@8a @l  @`  S`m dPh  `0 p!B 6$ bD pQ9 0@ $p0`A @@Y $h@tp@)8F=~x@%I8J-]

{(`(ѡH4B}Z V&(`+׭+v,ٲfv +wnͫwo #Nx1 ,9r.c|`@Ξ?-zO>P ֬  {΍{>0 |9Ο`:Ȯ};w/~}Ï/>8P&TaD@1^,pS@G 0HT `Ƅ)7qԹ3?pG&5z`@OF}: W.(kW_;6@@!! NETSCAPE2.0,+\888FFF'''TTTgggwwwŇX*\ȰC Hqb2j̸ @r'0  `M8 ع @ (0HZ غU`0Xٲ XvmʝKݻx(߾\+^̸(y0` @b   07 .` 4@0@  00@@X @{,@>߯ $XA pp@!Pb4nG!7(I`ْ i@0  U 0@0@ 8H@i0 `  0`(`ĉ(c\e̙5o|@СAPtTfkرW'(mݛ n@0  P 0@  @ H` `0 @  @A  `P$P7j

P Ѣ P uZ~ ; .0@{. ċ?<8@ԫS/p><?o@۳/p( @@ @a>tx@-^ĘQF)RH%MDRe\ty`@5iH@N h5@MH@T k~@e8@Z W\uśn}X`… (pbƋ Yr \|9A=w.hңZu :Am.n޻\xG~@?]tխ_7P vݽ^x@ܿw_(@~ p L:

 *tF=P ӦL  u`͊^z=P ٲd v v=P ߾|  x Nx1ƎCx@ʖ/cάy3Ξ zN@_NP ڴ ${@ƏOP $ }`ώ}޿{?0 ϣO~=/>ϯ(,@C 0 dԘ1AA~,@I% Ĕ3A7qp@O= 0hQG&UF:jUWb5P _(lYPVƅ[w(o_t0 `F|0@H%@9@\3fSgN(0@PE @*`RM> @ZE 6d %`@-P@nWo^X`…  `b0P 0` @@h @Z `  n@@ō 0@\0  `x @/`@  ( | (_?  A $ `E/G )`@Li$`6 iϞ~ t E* @ P 0@`f 5@`   `0~ `#&  Y @ ,h`0` @p`ȭA 0 `A  ' @Ho{08pA0` ` @@@   @ 4 ,P@ @8p0   $@  `Uր% `@ `@(H@` @0@ `0@ $ (@ @0PP@ 0@0@ @8p0< } @ @  @0` x@ x@,  ` @ @(` X@ Ju ` @0@A(@w0@ p01(p(@PA0@@`0     `0@ `@0  ` @0@  p@,8@4X @  @@ 4@0@ `%*` 00@@ h`A   ` 0@0@$H` 0@0@$@` @0 0@$H `@,  >@}0@,H@ (@0@ P  @@& @pq,iVhRLf P 0ী `t@  ԩjZ (A 0@ڴ4h`+`^(@0`0n<'<@Yh0@Q@0@@ܺw{‡/n| hPn:v w 0@< oO48`?` $hP4p@Ĉ( 0@@F8v(dH#Ipr+Y0@4@@I@ 0zT `@J@@V[tPlX 0kv@ڴضv 0/^{ ;@ ppl @P 4@P`@08`i 0`0`(0`˙3T.{v۱}@0@@z p^P 0A 2d`q0   `s ;@P 0 $xzXU  d=+ ڵk}+@t wX6L 1@  9͘x:ѤK& Zn@; [p|rx 0 ?@$Xۿ/`(` p >0@) @F I  (@0@J-  @&l@4 PM6]` ( @(@P@X(P@@0@ 5@@`‚  @`@ (@H@ (@tL&@@z [   @p0@r<>}@p`@O /' A D   `!$H@ `̈q$H h A @@ @ @$H` @J ` @ (``$X >H@$hP@~ 0@@ `@@.PA  `40`^  $hP@~0`x,P 0@@ `@w$ 7  @ (H`? " 0`@,P  @(X0P  7 0 P@  80 4XAk @   0. H@ ` HA @Ӧ 0p`6 &` @    N@$@P@AO`,P  @(X0 @(  88P@  @Ҁ   Lh  @@Q ` `X  HAXk @@@% A @(V\  20`B@ $hP@ 0@@m 4HA N| 0H@ A A  @ $h@ 08po00``@4.X@@IT 0`d `0@@O 4HA,%`Q `Y ( A @(@̥[W+ (0@/N< 0xe  P@P  `@  (0@(P (P`/`P0hН $H  {?@} ?@P0lH'N$ `@  @ (9 *Wlr倘Ьi&N(`B&P0Jh*R ZuV 0@ `j %@\ P hH0&S<@̚7s3h`z@hg @-7P@Aʗ+g` `}0  ` @`?P@ 0hp` (VdpA 82(@09%J+ pR@L3  @ 5*K0  pU@ lX0muV o^z (p `0`3 ` 0@lٱ(`Р,XA hyr @@n]@vw; }zo/~|  `  8H  xqXc;X`ȑ"0`@x  S<{0@:5@@@֭Zxڠ0`@0P nص;`|x >88~ɔ @   z 8= x=4PP`0P `@8݀ # ܻ `@  ( x ` ? 0 6@@… h@  F| H-](@5m0`t@ @@@T( 0A   P`   4x 4h` P` `@7@` ` H@o @  0 H@$p@  ` @ǎ0@`@I,  @ @ Щ` `@,`P`@`dժՀ H@P@@ P 4X 4h@@ PP`0`0@@ ` H@n @   @ 8H@,  0@` Pp` (P` )` 0( $H@A @@hQXP `hE A@ ` @A @L^ݺ '_3`߾0PP`,h BhP& 0@ 0hp`0  hR`v@ @J0miR@pZ `Z  \@ h+(\ +`A$8  3F.mz0@ 0`{@(. Ps 48 `@ (_^ h?@`߾ ? ! `pbD @tXH4)`0@(H ;w*@hP?eK((   @V  @5;` @  @;  (r0lY @@Ѣ6}Y @@@Զ}[ Å/`0@7w\@tө p 4H`A /@ٷGA 'hP<0… PXhƍ5"$(@AZ( 4@@z@  8t(@0@ Xju (` @@l} Wt0`@ ` (@P |00`@ 4`4H @D\@A  @J+(PA9@t  $P   q8 (  0@ @$8$@@`0 `$`@p(` W (0@  `$P  `@(H@ @ @@0 0(0 0@0@ @@ Pcn@w 0`0 `$  0` (p X@ PPA p A` @ @A(  $5@@ `@(H@` @0@A( @0 `,$X@A@(@0@]  `6N` | 0@@u $hP@0@4xA $8A (`@A 4x AH` `hD A0  p@  @@0@@ h`A@0A   `  `,8@0`ݻw[(0@(^\1 Ph޼0 0@(P` ؽ;,x@ $X 0H <8P `X?@(@0@} 0H 0@ `p PA  Pd)@1 (P@0O%QG0Z*UY(@0@a0iծeV[qn$Hp@D'`zu(H/@   @ 0P` @ ?/0` (PA`8@%00A `G!E YIT ҥ1 XtP0@QI&5`` a +`Y [p@] o ` @ ` @0 8H@P8@7 0`"C @@ef@Y  h*)RRZ0@0, rMKு ` @@d&0@2p@((056` 0 ( 8A 0:] `^@@ ྀ `P)V8q@ Q@#G 0y  3ixC5J@RK𔀂0 + <` @ p-Zk u `` @ 0<@@bx) pY@ft,4H6-`@jX 0A0(P Pө   tA0@ @P@A  p@ 0 0PA `@ P0@$K00@` 8H@   \vP @@   \P@0 @ @  2$Hh A @ٲ@ @ `` 0  $`P@ 4HA(  A0@ P0 h@ 0HA( A\ P  0@@L0`\ $h@0@@С$HР h A ]`   @@ @ H@@@ H@f ` h.p `A 0  8H@$p A P0  0@@8p HA4  0@@ `E0 `#8p@0 . P @@A @ EZ @$@ 0@@$p @ ~@„P0` 0  H@$p @ = nA 0@`8p HAP @ (P`0 `$  ` @0  @$@ 03@@ $HР0`( A0 @ @@@Y%`o:X@Aw0`@ 0  $hP@ 0HA( A -@ z  `pM $`P 4H `0@P  `4X ` A  ` $hP@1@  ,0@˗Is@ @ (0@ѣ @PF}@X @ `, ( @P` PL`@0 @3k& M`@0 ``P@0o >  ysH>  @@ y@_ߟ@ 8x` 0@ 4 ѣD$YrT$` @1 ̜i9uSA  J@@ *(0@QZժ Wa +Yi%;yW_ LX `c L`5gN,8`S К @0`   `Μ0@u .;  ԫ7@`@ P>_@ ,h0С 0@@ !(  hr2 NvI@РB(* 0ԨPxઃ0( @(K@  r +zW(l؀ @dL60`  (]Wnk`۶ ` (n |@.`s;x@0=$x`  @  0h@B 6t p@F8vQ#E 0)@J0fL3iִy3C0*iR4%  `@V[v,Ȗ5{ (AԵ{0` ` PT|@4 ( Y^-@ @nxpÉ7 4  ( {v@ @pO@4H0 @0A 0 ƍ (PP` h, 0 0(@ 4@ 0HA( A0@0@  ` 7ܹtڽ7/] ` ( A ,@:( (0@   H@ ` @ 0@ 0 @ @8@ 0@$@@  @ `A `0@@8p\ęSN=}4 @ @@)$@ 0@`V @0@ 8p@\Ɯ9 `` 4(@ @0P ` @@8p H@  @@|7@A `0@@ǟ_~ 0@ HH$@ 0@`G@ i0@5@@ 5@`4h@VV% @ 08`AH  $`Pk `  PA 0`  $hP &_Î-{6گ  ' @  @@s 0` ^ @޽ ހ (~O`>} O @@$0@4H  ` @ @P@PTR 0@'O? :Pt :jUWfj0   m[0@@;  _ H@  PpC%NT E 0@ IRI(\)KM9uO4`@ @@ ZUY ڕa %+i  @@q8]y6@@ `  e̙l&E&]iԩUv P@P@P/g@ (A  _|ԯģ? @ ` a `7r#Ȑ"C:X PP $`P@ 0H5`05)Q P%`$HРh Am@rҭknk &Lĉ 0`&`@` G.m4WvA(8 HA @@N@  (o$@@ @8/  4x0A .4 " H@0@p 8`@ 3iִygN;yt P8 H@ @@0K@  s k$@@ @87.p@dɓ)W|@͛5@@@0@0@ x@7~yr˙7o`A (h@$H` h A  @@|@ P0@ $HР` AxJ<2%J x 0<  @0`@p`5֭\z 6lX8`A (wt (A ؀`@ @ (A  tJ>:~ ;ݼ{=@  ̛;=ԫSw`,H@A 7@ zڻ  H@ D(>tX-^Ę@=v4@@<)@, s5$@=TPEEz ,p@T$`A @@@@ K@ś| @@,0@d |`M>P j֫ 0@m [n@ G\r͝?`թ?8@{  0@@=0@@ ܿO@~$ P@(Ŋ Ȩ1c>A&K2X`%˕ )3n0O>  tF  `N `Vbͪu+׮^(ٲd0(00 w\vK`/߾~ L`0 &?& Y`Μ?{NP@Ҧ H`5 -; @.|8|@ΟC.}:}  @H{(A  0@`A $$p (0@@Ŋ0@@?8dIPR`Ƅy@7oPJ@@  @(@0@@ժu@_;lYg +7@]w5@ 0HA( A0@L m@ 4( 0@6p]߿}xqP\Gn@ 0` @$H h A/ пH8Æ @h ` HA0  ` ' @ 8Hhݪ`Â=P ٳf -ȝKW$(`  X@$ H&` h̹ϠC]ӨO'P k  `@r`@ 0  8H@@  HA @@0 $8 &

P ̙ gG.-zjV .0ܺw{@08hy0`uڵ   @0@=ЯO@~ 0$`@ 8bD x"8vx@#E0@@ pI@0@; s@iR 4ujTS:U @VY 0kmZضuks0p@޼% @7vl@ɓ)8sf$8t6]@Y6@@  `@ 0`É Pp|W~{v880 @x p po~׷~  4` … 1ĉ+( F0 `,[|)`Lj3gz 4СD}&( Ҥx iX55Vz 6lW @lۺ} 7ڽ[| @ 6`@  @@͜;z@Ѥ $:լ[~:Ak.pݺ0 x 0` r8'` tԩn `   @@   ~@8PB :8P D ` A|  @S Y NTPE @M8@T 50@l0@m ` \` 6@@<6@@d\`@sΝ;8@hҥM>P j֭8@p  \<P t]vݽ~@8@z ?0@$` @  `  8H@ 0`LnY > *4AF" P ` `0@`Y H@n p`.ݺvͫ NP@l@ Ȝg> @i0@`  `m  @ 0@`p O|yC.}:`Ϯ=(`| $hP{ 7@@0`(&TaC0dԘ1A0@$I'Q eK/Y (ApԹgN? : $UiS : ` @W@P`PK@@[m ; @]лo_{@Ç 8qc 0 d&sgϝ@tiӥPj ĖM@mp֝{>pPG70d.`@ ?@W_;X@ ׿<`"

0$(` @T6@ $p @0@  ` H(p0{v۹w] 0@` p@ $p8 2|X (@@ l 3 (` K8  x ;ٴ ;7ċ?P ` t N`@  >ڻPؿ߀ x` PB >(`  (`P@Y5i(@N=},pPCTi<4UkV]0Xe͞E ( W^}`… `` `P@@M>P j֭]]ڵi(@nxGn<7t0@@v ^x @zܿ7 ,` @  0 @ H@ RHrK.]0`& h`> (`tiB}z@Vbͪ^z=P ٲd v +5_0@`` NL@c ـ/0  &P@@@ @(``o @P`x  W@ 8Ѐ`ǎA @ 0 @ȯ(@&Ta Fx@-8cG 0@IPP ČIfM7i gO<  0@4X0@`+ (0@ PAo4`0@w4hA4` $N,`@0@0`@@]ӧM(ukׯa.p@m۵<@P@>]:  @w]@yЧGo ` @,p  ` (@0@` h, B6hpɒ RX` 0@P`@ 0 (0@ h@JXb=P ׯ`Ê[h(۶Kw(8 0  00A L  @Z XM $`0@ pA ` `@0@`P@ 0 7@P h( ` $`0@4Hp@cDy@)Udٲ1e

P ܺw]ƒ(8h(8A p= Ah޽Чo `$H (H(xѢ x[=x@˓/p  | P?h (@  P\@F2 @A0PA0`| P@A  0:u ,X @@X @` @(0}Xp 6|@ƍ?-W>P fΛ Zt @ \v`m n޽w/ p$`0@ P@,X@ `@^(`;H`,0@ 0B ` h @& r)s&͚ȩ3~YF(`)ӥ8 u`͊ +vM+ͫ  @0`1ƎC@ʖ y-z4H:^~]ڶk(`7.?@8`A aC(p@E@'Q,@K-0 ԹgO :Th&U4iF:5fz`@_;lY Po=P @]w[(paPX G\ ˗-'(sg=tiӧ Ė=ֽǑ'Wys >ױ_?0 @w?(}{?_?x`@8Ç#J<0 ŋǏ @ɓ% $%ȜI͛8s*H*]ʴJz@X8׮KvҪppxݻ7pÈ+>|`@ǐ#K< ˘//(ϠCM!! NETSCAPE2.0,+Z888FFF'''TTTgggwwwŇX:X HH2H ?(ɒXrP Y@0`HXZ`S0@@W h:k`;VYҪ-v Kw[:X (^̸"H˘/(MS^ͺש@6ޭ{ Nq Xμs NسO/0@ O~ҫO_˟O}  $X .dÄ Xb4nԸ!Pr(0  `M9 ɳ P,]*Q@@j   [ԮU[qΥ[ݸ ۗo.pĉ/fcPrly0@@ `@`Л 0A   `s P  `,X `= __@,h „ 88P Ĉ `b6r#Ȑ"9($ʓh i@0 U 0@0@ 8H@j0 `  0`(`Ċ(1l2̚7s|@ТC84 n5زgNP ܸ  `܀ ` @ `   `0@ @ ``  @$@ @H@8vx@#EHeJ+Yt2eh֤Y@; $hPC5 4AK.-p@TQ0(@ * pv @0@@\0@@@,Xp  @( P  0 (`իU(vl}wnݻy@Å8y 4wztө;OP @v   @ @0 P 88  "QX 0X ̘ fz 4СD}&( Ҥx uZ5֭\880 رb 6- x; ܹt ; ޽|; >,X x *[<;{ : x [k۾;ݵ<8?n<x| [W` ` ʛW` ` W`@D0@…PDQcF |RH%MT J+ S ,0N=}t@0@Rj^:A]&`Pe00Am&`0u00A}&`0`ƒ0HXqb <&`@ \|@=w6 `@@Zj֭](}}\pō8@r z_~@ݹ8@x @}ܿw@8@~ p L@B(q"Ŋ/:,p ǎ? )r$ɒH2^|Y 6k&(`'ϝ*4h"=Z N&(`*թȪ5k:f(`-۶n+w.ݵȫw/߾~@#>|`@ƎH`2 Ȭ9s>@ҦKH`5 -;vn㾝@޾{8`8 |9ΟC.}`Ϯ};޿_(`=/?_p@ 8aC 8Qb0fx@=8dI PeK/aƔ9SepԹgO?p@QED@W^-p@W]0U@o-p@]u'VqcǏ!p @e˗1gּsg=ZPF] ׯ]'(vmн[w^ Ǎ'(ys>]zg>߽|yѧW}{?~}׿",Ç@" hܨ1A C,ɓ&% Ȝ)3A8spϟ> @ѣH*]ʴ)HJիXjj@`Â=P ٳf -ȝ+x=P ߿~ @0(^#C>P ˖ 3 MӨS^@b˞M۸sf߾ 0xq 0H9 @=$X{0  4X  `}$  X`.TA%NXE!2Xpc!E$YI)$8@̤930`(@P ` PU @+ (`@i(( [q P] (( _ Ha$8@%O\e̙$8@&]iԩUfz0mܹm -`o ^8q ,g>`L^ .  _yկg{/@0PP`@ (AP ` `@ 4` PA  &Λ @P@h 0m)ԨRRj*֬Z6M`@ P08(8`%` @ @@ 4@0`@ `8  @@,`6ܺw7‡/~8@(HA `  ༁   X,p(0@  `$P0  4yeJ+YtfL3iL`@,P  (HA@ @ @A0@ X{ 0X@ (`` `@dɓ)W|sf͛9w  ` A @@ 4@ @ @@4X Pp` t/0(0 4@0` @ <0… :| @A (@0  `I@ 0PP` (`@L u@XE P,6ڵlۺ} 7ܹtڽ680` 8X; |yxP tI8]`լ[( H ݼ{ <O` 8 ԫWO x_ ˛_ 'H    8@p ܿ@?d 0``!Å P Ȩq )r&L9@._, sni@ *tPF Ht)Ӧ@P(P+6,f0@@[;@v+@~,x0 H@  @  `@iN0@0@@ {0`8 @ .` (@ ^yΟ/ @@G@ `@AP  @@@E+h (0R'  R  0&7 й@O50F@0 @S 48Р`p k @Yg @ `@_ @@Ç@@ ,  ` 4@0@0@@(8`A-@(8  ` @ @P@ @@@w  `7@8 o @00a ` @@  `@ @,P@ @8p0   $@  `]ր% `@ `@(H@` @ 0 ` @$ A 0  @ o@@0@   8H@@> ~ @ 0@ @ @}0@,H@ P` @ @6@T0peJX p9&L3g)`@  (0@ pT ( @Ԩ @@V  @  (0@k `s0@@@^@ @@  r|y@ @H @Xvz0@x0~yr (0@өO7@@۹w.ɗ'/= @| ԯO4 (P` (P@ ( (`$K82,[|rjڼsz8 @ )0 T 0  @ ,d˚ڵksؽ;   `` X0@@X&: 0$8@AZ.A0 @y \ @@0@Xx0 x˛?O@xoؿ_8@0@ 2$1 \x< ` @0`5@@0@hT j@@ 48@k `@ `Pw\ŋw^ 0@b Y,Y|p LF\[ll Pn޻(@ @͛ }t.@ݽ ^@ 4hp@   LH0ဆ@(`/ q?0`&K `%˖. I P`> 0@Q M:*u @@(@P@(P PA (@H,`@L`2.  0`@ fp`  `M.< `9(@0@>`/~@ ^?  @@ @0@@@C4Xd$` @ A HeK  ( A A  @ ,8@4H A 0`@ @A PA 4H PA  20`  @0@@@k 4HA&`  @qA  @@@ud/p   0=0 H@0  @8Ŋ  @p 0 @(` X@,`( `@J@ PЀ Pp A X`p 5  @@ L@$@ 0@`i `@k$ @ o0p`(7 H'` @    XO@( O`X@,` P 0 @(  8HP@ i30@ @ $`0(0A @@W ` `q  HA l @,@@L& A `]@  @@k  `mtЛ $hP@ 0@@s4H@ޝ 0H@ A A  @@$Hp `p 0bp4` H `@ 08@|A $hP@B (*@hjR0`h A(K@% @  WP 1d@25(AF.]z`زc/P0@@ [@  (0@(P@@0@`@`h0` 3`8xp bDT #0@@H# (AX$@@@L3g0 @@@Pp K6u kV[0`@Ȗ%@m;rԵ+/{ ;`0|p  P 88РH   i-wnݻyxpp| ztSp}  `@xɗO`p~|  `?P 88@qx90 dH<)`d  4` ' H  `6UTXUJ@8;@ڵ7. |;@>,b7@: K  ~z  `z| 0 ̛3'@ X7  ʗ?`o  H(` P <|H@" QF~ `  ,x A(*P#  (0@# 0+t2Դys@x0(C 0ziRK.% `[ 0@p % s {W `pp`  p4.0r( p7@$Xp@ X+`Z ` M@@pÉ 0`0  `@vs< /0 p@@?/@ ` xh+R$@@ 8@| Sjڬ9`<{ 48ԀL@ H`A4` X ((@t WK@ ` X<0@@Ѥ  0  0 P@?9 x (P`x0 x 8?>ۧ/@@ $Hp@a .8Ѐ0`(0@R\34S=})@E-*@LUTS u  @XeEvZ [@7 @` X @(( 0  $X    ^< @^@@  @ p@  (0@C(q0@   rN r 0@M $8`0@@F0`@*  @0@@Y$HРn@ 8x A$@  ((  (PA  @@g 0@i ,h@4Xm0[0` @`@   ` 4@ `x  (`  X` 0  ( @ @@,P0@ `@@ 0 0L0 %` @  0`b%PA8X``     `0@@c X@, 6   @ 0[A(@@0 `$ D7 `  Ѐ 0P`@ @0@ (P` C4@@ `K0 & @0hQx @p} P< Gp@#p_`@@ (DP:l*:z(@$I0 e$Hp 4PP@,8 xJ @x @ (P`ڵ0@0 p ` 80@ XP:8 >:ujYx]} @`ć/`P@̛;}ԫS7=$x  4@ z,p ` ~ (@@(`… PAq<~QHLDRʕ\Y`5 (S@@@AEPTAM P"(P`"PX @@h\s4( ,@  b;98X  ,h`\vM@l(@P` PA   (0@ >@{/@0@_ 0`,0``P0 $H(8`(0@ @P PP`@0 @"=A0@0@@^ `e @ A4`o 8x` ` @6@  @ ,h`0`@@ ``6n@ 0A   @  `t ,h`X@@0x ` 0@`,P0a 0@,` @ @I< 0 ` @ @P@G  O0:X k@ @ ( 0 @(xAd6@`@ `@(H@ @ @@,P  @ ` @0p ` 00@( `@ 0@(H@ C<@" р ` @ @P@0 @80 ph Xj@ @ (0 @(@wA6@` `@(X@  @  `,P  @0wX@(8`  0(0< 4@0}{(?hPP 0hE01GHd 0  ,h`@  `0@`  `,h`0`@@ `,`-A  0/0@ ,h@4Hl@ @@@P@mPP `\ 4xu@@ċP| ` ̧O?``  @@ h`A  `ƌ(`@P h9@ @P`9` 0h  (0)TPZ * `8rҭ[`޼y `Р. @ؿo8@@ pBq@\p <~ @%K"P\ @,P`| `@4:0h ke@;%PA$`@`  ` \|y@  @@h@\ 0`=`޽]  `@  (0@(P~0@ 0@X ,0@(A 0>h`0@K,hP@` ( A ` S 08    ` K]v (   P0`.0`  `4X@ A 0   `q P@ (P`P`w X``@@ 0  ( @(0@ ( @ HP@( `@ P```@&(` @8p0   P  0@m P0/ 0 `@@c$` P  0@( `@  0@ @`@ 0X (0@@P @`@ė@O@ 8 @@0@$(` @I@R>`  pA@0@  ` HXh%00  @@% A(@X`,` h` 0@@R@ (P P(00`@ } @(8p  `  A  (`  ``@$`@ `   @K1  PA 0@@P0 0  +$H4xAPA  <@,.и L@ \` @P ^=`  @0@0`0Мs P ln wlx @ɔڴZ&` lx@, @ x=@@x0@?  8@ 00F;(A0 @ `={.`P@ =*0`@ @P@(V$Xp@ h`X` @P@(A \0Μ h ]@[   (P`}4@ $H `@=( A0@@ , B| `41 $`P@ 0HA( A `0@ P  ,Xp@`5`  PA `L@0@@c 4H ` ( A0 A  @ ,P @ 8p0   $@  h@ $p @ `A 0  8HP@, h0@ Pj$@@ @8_ pA 0 %` @   ` 8H@$ @ @0p`P@ @@$P@ @ =  8A0  0  8H@$ 28B P0@ i$@@ @H p@ @(0@   H@(H@   @@HP@  ` $hP@ 0@@h A A  8PPP` `` 0  $hP@ 0HA( A PP  @ 0@4  $hP 4HA`  9@ (P` 0`,XY0` h` A  (p@ @  @P` (AD&` @`ݚ - P  00` @ @P@ (P`0@̧_@?@ @P` P  (0@7 (`H(P*U %0@P@@B 0 hRPj*֬W - j(@@r `.޼z0@/`.LĊ3N,ȑ  @@(@P``zj  5زg=@ܺwM  0' `t n:pN;@@08=  ` 0@ ` `  @H4`X0@ 4@ @P 0@4mJjTSz@V:,Xc@  @ԭ;@80|x@b4& rdɓ) pY0@hѡH A`  7 80. ӧN@w7 ` ~'`~00 aB  @X1F   ,[ x 3̗3< ` D50 @ԩS X\zj lX ` mZlۺ} W\@| 8} 0 Ōx yd+[0 3@@:Z ٴi `0 ,XР 8wN t (0ܹ (  0@  (_H@DPB &4@@D\8RL4@  `$ `$H@J@0@ @ A V ׀  PA 0@@0`@ 0(@ @$H`<M 0HA `@Ɲ[n޽}6@@  $h@ 0@@0@|0@@0   @@0 `@P )r  @ 3 0P  0` @@8p H @@0`$@@0@`~,x0 Hl @   `  ZN.p k   @ 8Hq HN@n H@0  (0` @@8p H@ @@0@A `0@?:hQ@  @D%@A @@@W 0M[@0 k0@$6@@D6@4h@ϟA PP`0@$Hn `  PA 0@  ` $hP '0׿4 `  $h@ 0@@B0dXR IS@Ӏ@0@ѣ @@P P 6`` k@۷o (P`x (A 6@a (PP`ǐ! @@˘3k̹g @S@@b&@@ @0ȓ+_.@УK.]س;w , 00@} $XA @@%NXEq!C IRI)O`I  (`@͛ tTO"PP(H,]) 0P (իW `o] ?@ 'H{̧} $X?&8``2\%:xp Hࣁ"`* h)L2 Ьi&$ O0J0TPJUZrƒk  \ҥ;]z5.l0Ċ3^@ PL6s3Л&M@jVZ ` ܸp7‡ wp`@ʓ `t0` ;`~׳o=_@ o@ @P@)Vx (AH P& ԴygN ӧ@4S pk `cɖ5{mZkٮ]`s 5 4(@ @$H`pl(l@f8L $hP 4HAh׶] ݻy;AÉ7@@3'@@0@ N@  0@@ٷw~|_00@8 HA @@H@  , xi$@@ @8D-ҥL:}@T@x%` X   xK@0 @| 8 ^Р0 8H@$p   ` @&` @@6@A   H@ԫ8 ܻ{?P 8O z ` |   8@ x@ <QD-^xqA i@0HA( A0@  4 j@ 4(@ @$HРe͞-pmݾ޵k 5@@`0`  `XpZhҥMF;6 @ @P@ō7<9͝;P0@@@  ` x ^z(@|0@ p HXpŊ/b̨q#ǎ4@0I&O$rJ^Œ)S6o Ϟ>i ѢE t)ӦN(`*թU] Vf `퀶p`ͫw/߾~Hp` H8 L. @@@@i  z5֪@`` 7@`xƍ8`9$8 }z`ώ@޿{7@@O/`= `|8P`?8`A&4`>80#G ` @$@@˖`Ɣ)S@Mp @ 0@Q PtiFAW2XkW ;V0@[o 0ww  ` 'VqcǏ!C6P ˗-?8 `4iQ6`@kׯaǖ=۵@ >|x'Gϡ(@uv   }{ ׿H! E3q@  0 0@r0@O (0H ( JZX׮KvҪUK@@  `.(@0@ P@ HL˘3k<Ϡ??h@SNM 0HA( A0@ \ @ $hPw0@_?0 ?  X$H` ` A A  ,p K1eΤYMٓ JQ0@$p @0@ Vq k$@@ `,f%G>P e̗ s&]Z(u X@$  '` `sѥO^ٵg_@ o 0@$@` @8p@  ` B0$` @&  0@c4$ʓhfҜY:s('Р,@JH   +b8,ڴjײm[knk  ` $`P@ 0H  `&` ( A0@@ 07p(n3_>ң(: 4H( 0 A  @@~P 4xaB 8bD p@F3Q p+ fL3a (x @P-ZKjTzvj`-(@0@ ` ` @6|qbŋ7v\ɓ%'(` @f9w&thѡ  pujէ&6li׶ww7n@˙/?P @t N@v۹|x'ط7 `@~( 8`:l Xhƍ `0 ,[0@ Lj$@@ 08 ҥx Z`\( ذ0 m0   ^P8;~ 9ɔ+  s6:5j[6ٴ &[z&< @ 8܀ԫ[/p,Hp  8ڻwo @H@@ (P@@q,^ĘQF880 H# Re i@̙lęSN9 TPD T<UT 5 |5@ @@Zm @@}X`~Xq<8A,0Yf<Zg @][l 6@n\p\r (] @|^^}ܿ_|'(@~ p HÆ@4`E.^$Q0 r  `0@i> 0 "MZNB*5`ͪ5 4(` Y ,hP[0@@ ` ,@#Nx1Ƈ y`Ό9A>6`` (p0@  ]0` ~=(`>p 0 0@@ 0 A8dI'QT`ƄY7m&(` @ `@  O @0@ $p   ` @[ ` @%@@ 00 $Vqc xq88P @s 0 n{0@@ y L^u ޝď_'@`  _~}0@@ (hB.$@@D& @@6n$ѣ"E0$J (2gҬY`@0'Р-jਁJ逨 `uZkƒjײm붭 ЭK@z-p0ఁĉ 0&` PL2̚7s,3Т 0Vn5زam6nw ` @0o^ң:ڷsp`o@ (0@ O  (P` (A(V4`@F @P@#I4@@0fL3iִy;wI`@ ` p  @[ 5{mZp֥[{`  0@b @@H`   @@6@  `@n @@ P @r˙7wzs~=@v $P@  0`#8 4p <0:lx@'8 ƌ `@0@$@` @8p0   P  0` @@8pp@lۺ} 7ܷ5 8A ``  @0 @;8  8:լ ;6ؾm{>0$(` @87@ $p @0@  ` 8H  0P  QD-^H@=vpPpA0@ <`@ |,pPC0@RM65PU(@V(8  0A @ 0(@0@@$H<M@0H][lڲ [n $h 0 P`h@|@͟G^}ܿw@8@~ $`@@H0! P `$0)Ҁ&O (A^ŒIM @@> *t(Q MԀ(`p A`0`P@Hnߺ=P ݺv[~(`0H8q@6 yd/cl`3Ξ?-zth6@֮_Î-{6mn};o4H 7 `>@ }/~<H>_'@@  `@A P D4@bEH@@ $P /a9 ` @O  ` @ @@O 0UЪu@׮ l8@0;@ 0$VqcP ѤK>]լW( v (<(A =ܻs'`@ 8/`@  ` @0`  (A 4H`A $X@ 0hp ,@ | (A (`T(@p T~VE{@mݶ-p\s  X`  Xb?0@dʓ  `|Z0P`0 F ( $@` ?p (@P ^<0PP@@p ~ p Lp!Æ(1.bX;&@@ ɒ@`%K0`f@SO(@ѢE(H@ `*` (@  [ (h@(8_~.8A 4P@@L 0 @@0`u]ڶk(`7޾/p|@=Ac70A޻3` 0H~={ /H >  0`?2H0p$Hp A `@Q(`'Q:H` @ @?0@@$5`@SDZ@W ;lYPVƅ[w(o_80$V G<2d֜@=PV Ė@p0wo߿Ǒ8ys >zu џ?P @{ $0ן@HA Xpa"JHQb2jQB y`@(S\ɲKI8s0 qɕ#sPuٵon}!! NETSCAPE2.0,(]888FFF'''TTTgggwwwŇ Hp`(\ȰÇ#pp@/8ǎ   (0@ )@ 4@0@  0,X0`X ` 0`(`x(߾8@È+^ "K\@˘/8ϠCMRN]װ_/`0@ (P`0@q H` P 0@ (~0` @ @ A,aL85nGPdd@1eΤYM2g %:t,5 `@(X @  `$P0@]0@`@P0@ hgПPt fkرeNP mܷ w '^qɕOP s Pz 0` ` @ P @,8` ` `(`Rh̘0` 'РBLP ҤH  Pj*֬ZVMP ذ` `  @ @0 `(@L0 @zl(`ܺs(7(n8ʗ37@ң(:8;Ǔ/ֳ__/P0@4xP@„6tbD `5(dH8peJ+Yt h֤Y@;u PphPC5z46eZS&P [@AX  @@Z @A\  @@^ @A`  p(@l H&-@իYvv }vxm@ (pyr˙7Pz ~zw``Az 0` @ ``A~  0@ ( 0` Ĉ$":z $G( ʔ (4kڼ3z @D( ҥL:} 5ԤzZd( ڴx ڭ[|( 8;n\ɔ'( ͜;{ : 8:լ[~ tjۮ}`@ݼwH 8x;o@ԧH {ʛ/@8  ?@@ ,P@ >QD 8@FdL4@-YH@L g|@EH@R ^z]~VXe(P ZmݾW\k Wo >P bƋ Yr\|=w>P hң Zum>P n޽}\p \r͝?]z\~@ݽw/px^}@/p~,` H0B|X+`#ǎ? )r$ɍHr%˖._Œ)3ny`@>{H`(ѡ H4iB}@VH`+׭ +6l΢=@n8`.ݹȫw/߾~,8#Nx1ƎC><ʖ+`3-:tN>] ֮['(`6ȭ;w~] Ƌ'(`9.=cϮ};޿>ϣO~=(8P&DX(bEиQ@Y'M(eK9SfԹgO?jG&UiSOe@UU 0+W 0H0 6$X0n ׀,Xp 0 ,H09 мY3@AӧQVukׯM3X@ ֽwo߿?@ 8  PAw   @  @} (d@AP@  P2f$@@B `A($8˗0cʜI@8$Xϟ@ Jѣ(@JJ5hʵ`Ê[`Yh P퀷 (P`` LÈ+^̸c  P@ @`@ @@(@P` @@m (`Ѐ8 0@s0 (P``ӫ_Ͼ˟O~`` 0@ `,8` `@GX T"h (0@ г  0@ @NZUYnWa@0(` 8H@,  6    @`$P0`@`$p` @ m,o'^qɕ/g<8@(X   `?@  X`@ 0X(0@  `,`P`@ l%̘2gҬi&Μ:w\` 4@  ,Xp@ h A JA   `Pn/ 4@P`@ @ Pl2̚7s3ТG_^` (0@(P@@ (.8@ (@ }P P  0@  4xaB 6t"  `@Ft0dH#4iR+PfL (pgx0@@Р@@@TSVzkV[,Hp ]  ,p. H`A ]p 0|p 7^py@0@@6=5jY@h@yFA0@@ (hp 0H{v w_| 7}z ,p~A?p? 0PB :dXD@  @ȑ JTA,W"P̙  g xz=;v(0 8/`۳//P (@0 (`@  @|rLDRJ-U 0@L( N  `  ҥ 5 @(0@e  mݾ5@@ `^} ,`@  (0@ 9r (@P`]h @  @@l `n}&@ō P@͝0@@ 0@@v ^Go@ (`@0 @0@@$  `P@ 08p4  )s& i@0@@ h`A   ` P0@YP`Z$hP ~ 0  ` ` @. 0 @@@   @~0@@ ` 08`@0 @A @0@@$p    @@ 1^4  P`0@ @ P   (0@ HP@_ `ր0  @ @_ A @@D& `d@@:  `  

@p}0``@z `> P@A4PA8(0`+Qƍ9RJ |) 4k yNz @8jL:]: TZzuV,6,  @lx+`\7 @ >؀P 0@f (h@8~-`k {ݼ{0 ć  xN  P@{.` >   (` @@  0<P (  @(@P` @0l0|$0E((0@MP@  0|K@ @(@0@^<`@x@ 9\ @   @0@@l4X&` @p`A (X@t  ( A A  @ ,8@4H40A @@ @(h  0@08  A0@  `S  $hP@^ 0@@0 h A~ @  ` 0`2 H@ `,ȭ;wp` P 0 @(` X@@ $p@` }߀ &Hp@ @D\`H@ `0 $` @p    T0 8H@0vl0p`5 %` @    ,@0AAN`,P  @(X   @(`  n O `  3h@}  P @@A ` `  HAXi @@@$ A `(UZ@@$h@X 0@@K@Y 4H%`Pp`A (X  (  A  @ ,h@4H A 0@Nq `ЀP@ `0HA'` `@ $ @ @@C$ PQ Б $hP@0e Pt9P S@ 0xW  P@P  `@  (0@ P @`0@̙ l,` (@@A$X   `ݛ N ` ul޽; (P`` 7 }?@(( „hp,`  "$9$J*Uh9@L `󦁜v0@@Р(Zt@ 0mpR,x`upb-k쀴ֲm-ܸr@  @0 ` @Ply6 0FV0 `0@@ @@r ܀0@:v >@ H`@$X `߾/ `  @ t(#I0 X R@i;I@@Ppt0@@@TR `@VY t0@@u;  `@K6\؀ 0@0` A tf,8`vz@h p7n& @7.`@7'` @@.`@xٷw~(p0@   :|( b+RQ:zȑ0 l3&L j2h` ( 耡=逥L8} 5ԩS 5kVz0@d րl (A P 0`@ 9* 9f (`>=@(Pؾm{& `@ ` h=0@v ,Xp@0  0 @(@@@H @@c<~$@d `@Jh A   :A 0(0`@$h` @|V 4@ 0@@u4X @  ` b  ` # PA  `ϟ0P@@C P5(@DP@A($Hp(`& (@0` EP.@@SZu (@0@Yi`K@ (AP@A (`p ` L33&=ifz5dϖM`@0o  q `0hp@ oWw 0 _^0`  P_} п?` „  !D& (`(@,` @$ `2 `ssB (j0mTR Pj 0+ `,  @r @`48pA(P(h1d ` Yh0`Uhz0  ‡(`0܀ P $X h? ?@ O 4Xp 0)Nl` d#4y0@fX@4P "Pp)K(@jTpUUpY` @  @;  (r(`p0 @hH&-5pZh׶-`ݻy  0~x0ztT0`۷N@4xA g@A|3? (P<:t8 bD+Zx,P`ȑ" <$+ s P@@  )L @@T5  0@d˒]` ((0 n\0 |  0PA(@@f @ 4$8Ѐ @P` (  @@'@@(P` (A x Pڷ@P (@ $h@4H `   @@@ ( =}\` @0@0@@0` h  @p0@@$`\ ,x` P A0 A  ` $hP@ 0@@l4H@ A\] ((0@ 0Hp   @AT  @ ` @ AP.[&@ (@@0 `@ X h (0@P 0 <A P @A(` H@@ 00@( ` 0 A   ` @ ,P @ @(X 0@ P`0@ pp28@0   @% A 0@A8Xp,`0  Pp4@ @$@@ @ @(X@ @ @@,P  @0 `  PP p@@p`  @` 4@0@0@@0@@`A XŊ   A  (P` 0@h 8  @ (@u (8xp@$H h`A  0XL@@ @0 ,Xp@ϟ 0@@X `   0 @  (P (AO~<X/@ P`  @ $NPQ0 P h@K 0Pf0O ,x  @@Z [i@@@+P+XȐ(`@@lР 0i& @Mmuݛ(Hq  @@sL^ `@0H`A 4`@#(P P@@$h@2lpD&R ࢀqHF`$ʔ*W\I Фi: @@B `J TN`ժJ(k,e+ୀrҝ+.^  $Hp@ (h1ȑ @ಀ (`@A (-@hM@0` [ (` 0 ^] ޽ `  ho   `@B  bD(x8v(`@H#@eJl9A L dhP @iR (P`ST0`0  `@Zزv@\q -0 @@4v\T@@ I.Mժ @l py ['npөK  0 ,X= w~| @~P88@… x +VQ;z @#Rʕ* sP`zI@P 8: i"(uT:@ @ رd 8l  ` P `@(8$8Ѐ(9,0@@jZP -  8;/@X @x^ =ڻA  H0@@H@ 4H< `L@SL0`| `E"h A <@,p $`P0P` K 0@0@@4X @ A -  ` 4@ @  `4Xŋ0`h@@  @ P0 `$` @@0@/Z4@@ `I0 `% 0`g4X ,x P@A @8p*H    ` P0 ` @0    `0@x@` @@0@8p0 ` @` @A  @0 H@$P  P 8 <80`` 0h`H@ P 0 @A(@@@] 0`@ `@(H@ @  `$P 0 `,0  0\@0] P0 @@ @0>}0 @&D Ah@ ($H (@  0A @0@ @ ,h@4H`0`h `E`K0A   @  0`,8@ Xz5 @s @@ GP ( @С@uN P7` {(hp ,x`A(P@ 0H(PQ б@@T(@I9@@.%@@ (@l*` (P@`K`@q [.y _ (P+P`%G6@@4o0gEM46 dN  @,x`A 0МsL^}lݻw _`/ P@?(8@ P%"hAp,0@ (P*W@@Li怜:u )`Р%@@R.5 (hp@,蚠xଃ (@ \`z ``Ċ h,`@P, g  `@V.=@ P @`A(A^ PGPֳ_   4h@ Pp  $@h@H @0@ `@0@@B0i4TS jUlX ` 0@@@ @5 `@(pqbŇ(`@ (#(p2͛ I^XvZi @x; ,8@ @ pAwN7_^@zطwԷ߾p@  8q@(  @ P@J P  (0@D *@P )xTR}Рxv0 Zl uk t` $XР@ h 09rd)(@P 0 ի @j- wy@@ 8.̙(@0  P0 ,Xp@(x` ,P` @P PP`@0`@@DyA $ `0`|@E0@M8@,hP  4XA  `@  ` ,8@4X @< Y -` 4@0@0@@,X(8`A @. @ 0@`,P0 @   (`  p(>hP@ (P`PHiK `@ȹ A 0`@@ @0` U`@(` H@ `@0 &` @ 0@A( `0 `$` P 0`n(@ <`0 @0XA (0@(0`,P0@O@A`@0  ( @d4` @ )$H 4  `@ j 8 `   `0@ `o  P 0@  @ X@$  ` @0P 0@  @$h`@0@Xׯ 0]@A  @@@/`   `p` (@ E8xp A9 @0 A   @  `XJ@ H% `4H @,  @@ 4@0@PA P2(@g. (@ M{ 4x@@|@ 0{ PA ((  H 0 @  , (P4 q `)@ PA9u 0(@P`(PQPuY (ka ;E P]y (`'`P@`q\e̙/`P@ h mmܷݛ ^q/g|sѥO.ٳ }w P~ 0/PP48p 0,0aP,`7jdH ,Y䀔)@%L2 `&: 8`ԀR  `0 `,֮-vrЭ;@^;@`(00 @P  <0 jn `@(`@‡/8ʗ3oSGP`ڷ(_>z<`7@@@8h0`ph0pр8r,P`#,P`+ pR@3p@;0@0@@ `([ c0{ u[Asֵ[A/(@@b(0@ɓ)Wlsf8( p@$p  `7x&Ép7 ztT~{ ȗP 𞀀p@(`(0`@@)X`( ȑ# @A,[@ $Ӏ<  `@8j R<0 $(   Z}v  @@޽{8L x yd(P@@P x [(0@ (P`,8`0@`@   `?>| (   ` @@$H` iLx\( `` 0E %`@ 4( 0@@0`e `@- ` @@ 4@0,X, @s|` ` @ `  ]` (A0 ; 0( 0@  ` t Hh@ (x0P  ` @8~ ` @@@@ : K@,`0 8p@(X (0(`b(0@ (0`@ X``@@ 0  ( @@ (0@ ^ ` @@8p o` 8A P0  88P@ ( @ (P` 00@`@ `@@S$p` `  0(0@[ P@ 0 P ,Xp@A ` (0@@0z ( @ׯ_ @ -@ 0`  `  $`0@c'0@8X 4H A ``  0 $@$HР"H@0`  `R@bPA  0A$P0 ,Xp@A ` h5@@WŠPlY 0PPx[0@+^l#G&0 g @`S`  `@ P0@ 0 9PhN@ @ XO O,HP  !E YI)U @1eΜA80ϟ%ZT(I.%`SQ  ` U8x@,𠁀 `[q ;]w0 ,aĈPc \r4#P` P:T^=u0v-`@^8 мs `: n o ` '`@ $p`0$ 0@6r$ @F0@@* 0% )怜: 'П@਀(hZR0`Z P``6 - [W^@/ 0.P `p2  (m &`@  0P0@` p7@(O` ` / `4 `@D0(`@0@@ @0@i;y(  @ 4u A0@0cɖ%`k0 4@@ @^ x@@6|7& 2ɓ)py@f͛5 0}ZX0`@Ԯ=`ݻy P` @p.`@ @@@vt@@  @P`@8h B @P@A  0`  ``    ,8`D5*`@  U@ Z`=; 7t w| p0x Y`0`@ 0( 0@@h A PA 0 `   A` 0  $`0@ 0@  P@ (@ |4@@$Hh 0PA :@tM J@@ 4@ @  @X $h@4HA@@ @ @$@  `@ H@   0l`޽y'@@ 0@$@` @8p HA0  oA tp0  @@A 0  H@60 > @ 0@ J@$P @  ``   ` @ H@@$ @ i,z( `A 0  8HP@$ A8A(0@ o:H@$ @ 0@ P0 `$  ` @` @$@ 5@ 8 @ A0% @  ` $hP@0d֜y@0@$Hh A0PA @ 4(` @ $`0 @$HO< 0HA ( A0@@@0@  `@0` @`)$   ` $hP@@@4@(jjݺu@ @ (0@p @`ͻ  @(0@ (A  `@0`` @ - (APH'0 ؾ]w‹@^ PA'@@0`P,d(@h@ŋqG!E$Y) 0@A1epp  gO %Z(Q,eSQ0jY JWa~@Yg[+ \ `<@< YgС? M@ КdP{t֭`  ` ` 0  ` `o   `@ @  `PB @@P ` hF (YJV 򥁘`sNv 0@J ht@P0 Vn0@ذ @,jײmVr0޼x0_ (l h0`9F`ڴ hmlm 0`p (n<379ң^p.0@@ֳo/`@0 ~/4x 4t' ` @F t@H#I@eJ) $3  pgN:@(piRK6u zu[tlXpvk  @ֵ;A^p`(`7v@dɒ T|@thѢ@ 0@  pw-@p' ˙7wzt p@v۷@@ȗ7?` p?@0p$HxH@0`@` 2J0 jy` A 8j   PA @ 0` , ` $`Pk| 8~  8& @  @@f 0  8@ ` `@(H@ @ (P`0@ ʛ?o0@ @@8   ` @@A   88P@( @4@PEEtM `@U$p |5  @ ڵ  @  @, 0@ @8H@M6:j\(0@  `  8H@$ A  ` x   0@@ o ~ p 4 `  H@ `Re^4@ iO08p 5`0`jV A v,ٲe 5   PA 0`~  ` $`P@ 4HA`6   PA 0@`^0`6ڶoέ0`h AN`  >Ho?@  ? 0p @ @C0D1иQ@  `@I'K P  й@O? (@A&M*F:jUW `;P 0w(xqǑ''n>}d׾]@y +PA 0A} 0PAȠ "(0`  (@bE1X` )( @0a @@iJ@H(%` S @*Ujj@` (@ٳX[`ʍk  @ @x+X<` h̹C/M ^zA,۶޽0@xq X0@h7  @@@ o@} '(@ .dP%F4@@@G!EP)Qr1eΤYM9u:8P@ %JԀI SQF@l*a  @@i8[qΕy5@@ `  cȑL&5ogСE `M ( m @0@'^@ (A ޽{ď'_g P} @ `` `'Rh"ƌ7X@  ` $hP@ 4H  `(j @T PA 0`@ 4(@ ڴj $-ܸr&(.޻@`(l`1 @p`3ТG.m4j : 0P  $(@  `   HA  `>   @ @T$` @F   0I@0 3iִygN;yH@ 0`  8H@$p   ` @%` @pK@5@A   H@ŋ8rdɓ)W>P @f͙ L @h ` @j     <`@ É7~yr˙7 TN`    $`Ppo0 @4@@    $hP@;8ȑ$K,@,[4@@j 30@ 0@,8@Z5֭\z A ` x+@|k p` 6,xL@@  ` ͛ :ѤK( 0@ٴؾ;z@8<̛;=: `xn'`۷7` ?H@@D >Q,^h R%K @2\I  y =}TP@z >u  ` `6m 5`\uW8 0< -Wv Ν,p@h @@@lm]{{|ōG\r͝gt0     _~$@@A0@@C0`"EȨ1>`&K(`%˕IM6$@@%@@  @  u*ժVbͪu 6AH۶n0@`.ݺv_6`aH,@C\ʖ+'(`  $ zN @mέ{7>`@Ə#O|9΋8`: w^@  @ ( } `?(P@  @@@C @@-8cG9RPDy@/_PI@@  @(@0@@Ӧ0uWfպkW_^p@Ye0mo 50w.h A PA 0` 0@$HР0` =[vp}`@߿}8xq P|$H` ` A A  /0 @}׿p0a H4   $@@  I@M4@8p0 @*hݪ@`Â-pٳf[ px $p`P(˘3k̹Mzt`56@$p @0@ @@h7@A `0@/p? X.dH@0b,P@ @ 8Tвe̤YM9uiAMP@ Ԁ j@ 0(@ @$H`00 y ( A P@رL<5gpgПPi$H` ` A A  (P sѥO^u {  o 7@{  } (0@@,h B (0@ `ࢁ7n,pȐ  `l@2g4@`@ 0   0E0@T0r+ذbǒZj&(` \ %`.^ /&`0Ć 0n1lrpl@G>P hMlg`6ܶ&n@ (9ҧSPz {Ɠ  `=7  @ 0xЀ "0` 8vhd#I8eJ p%h֤y@;u @@ 0J@0@S ju@tP @Xa(8pmZkٶuVs-p@^y000|a p@d)l@f8s&@@H0}Xv]ٳe;X@n 87n0@0@@w.`@P @zp~|׷0@l  (p0@  @@]t]8p  ` @@@ ,` Hp!ÆBTx@+8`#Ǎ  20`e^0`f ` O` @5@@`5@@Wk@fH`-۶nMP ݺv8Ap   Y`P@Ξ;8ҦONz5 -;vn㾝 <@ Gn` ``:`  o` @@@`ϯ@8`Aa8`@(8A ` / 0ԹgO?

   ` H@$p  p (0@  ` 8HP@K6ujԦ ` @Vtp(@@0 @@{-p@`pqbŋ8rd |r8w|` HP@ pm 8A0  `  ` 8H(p p~|חop A @@<@ cJ,y,[| ؼi@<{,pСB 0 @A   `  $`0@ 4HA  `  PA 0@ 06 0` ɔ+[9exY  (A `$Xp  w/~@̛;ԫS?P ><PAx|8@Ѐ  (A,^(F (P`LDRJ-]$  48pA|P `@M6-pTSUV]8@X @mܾuu {^} K@`… 6,@b0 \ƜYfΝ=k6@m @08p6 >@ʼn8@r ]t ]{|͗O@  `| $`` H(C0  `$`ǎ>4 r @@.i $ `O0HT0` 4``^ PAP ۶l  wͫw/߾,8#>\Ǝ'P@ e lg&` Nm`5֮@`6m  `70`q#7@`r(`_7@@P`| gA @?@00 @P@@ иQc@y@'QT/a

P4`30`0H 6@0 `8`p00A 0 @ @`$8@ (8 (@H A (8`  h A 0 @@9u,pO?PQI8S Zjnz` HP@( 0@  @0@@c ` HA0  0 `d ` 88P@<@ @$X4HxР$p P7`@@@ 8!ć h"ƌ ,I*W<0$@` v0` @8h 5 H@- z0P  0 $P0@ @@4` 4``  @@,`0 p XPN@ڷs{Ɠ@8= @0`  4(@ @D T4#F0$H# ( Ap)A 0p@; P(A$h@P@$` 4`  @@ PP` ,HР 8AT\@9wtH&}@իU8vl 0 m @ 0` @tW~@ .`@  ` @/ 7`0h $Hp $8Ѐ H :zLЀH @@04 (0 g((@ @=jL2=P ԩTZZ\( ذ8l0`\ڵK +  88 *W0 @ 4z@4Hx{A |/H O? $`@0`P.bt@ (0@ ._0@@ 4`OZ !! NETSCAPE2.0,()888FFF'''TTTfffwwwŇ @*\Ȱ HH @B (S(˗.0͛8si@@MP@H*]ʴӧP @իXjʵ+K]vp=0 ݻv/LÈ8L˘3kyCMӨSpװcvp`@۸o8N|+O~`@УKNh߮ËOӃ˟OϿA`ؐ$NX1(G!E$)U<0 K1eΤYM/ OA%Zg.etiNZY(W [Ԯe[j Pn_&/fcȑ%(pe̙5cN0 gПPtfze>0 mܹu~ɕ/gsѥ(uٵow _ `ߞϗ`@8?@ „ 2lxp'J

4xaB *bDx (#H<`+Yt 3,pgN$8@C@@K Pp@S$X@VYW 5{mZkٚU @\q {p` pp`@ŋ8rd pthѣI6 Xf=i׶=@ypÉ7~yr W^ ۹w| 0|طg`@H~ @ H ĉ%( ƌ2ȑ$K@,W3& ؼ3Ν<{LP СB 4)8}t@TZ5֭\&(` ر ,6ڵi7. ؽ7޽|MP 8p;~ 9ɔ'(  J.=լ[~ ;٬;7 <?n@̛;==;{^˛?>z x}ۯ@@ DPB,^Ę<~X%MDRʒ f5m,p=}TPTi<@^5P ]~VX] VmZW\ oX`… pp@ƍYr\ƜYfΝ=c>P hң Zu@mƝ[n޽m'@p@\ z_Ǟ]vݯ(@xGݿ_|_ p  LpB(q"Ŋ/pp?(ɒ&O

,`(ѡH4 @=ժVHp` +6΢=[n(`.ݹȫw/߾~&8 @ NC>Aʕ(`Ξ?|@ҦK8`5$8 @o} ,p`8 H}@08`A 2XaC (0@Ŋи@9T/a\@M7q`?}(hQ$UO>MP@Wf՚@{@g8m[ ;n]wk@MP@Ç 8@cǏ!G|@˗-8sg 0tiӧM(@k׭0p]߿}xqǑ'p@s0dמ@?|yė@׿("<0 Ç#J8/(ǎ)(S<0 ˗0cʜ98o(ϞJt*]ʴӧP8ժuŠK]p=0 ݻx;((^#C>0 ˘3k<Ϡ?(Xzb˞M۸e8N|+_μH.سc?0 Ë?(ȟ/?P $X ,d@%F,pEG!E$)U

P aĉ/fa\ll@E&]TV]رa(` mܹum?P q `ޜyO~@ٵo޽Ň?P y }̧_}/p@8P „ ,!Ĉ'("ƋF,i$l@2g,&Λ-j(0m@RJ-p֬X+ذbǒ-jת=P ܸpp./.L+>P Ȓ'S\̚3(3.MW>P زgӮ]ܺs(7(n3o9t PN}ڷk/`yo},p> `0x6tbTX@9n,dH0yXtfԴY@;y,p@PA piRK ` 2kVkȖ-K`ku;@0Xo^ o&|@ŋ7v)O>P @f͙ sH&}@իYvi>P @nݹ 7~yrpW^ ۵'(|xɗ/p@zԷ_@08 „ xa+R,pƍ2ȑ$K8 ʔ x ejڬ<{i С4x Xj@xA=k ڵl۶pܹr7/@ >8q;n|@ɔ'93x@K>:uZn}@ٴg8 0 x 0 y ` P$`P@0Ap @@P <@-V,pFRH%M8@J f5m,pN;TPE8@R j^A0@ `0 "h (0@ @A 0 {@ @P 0P`8 @ GP@4x`?0$T@!F8b0fx@=0T@/aƔ9fpy@?}8hQ @@ D-0`:`P Pvmo `@  `  @X@ | м@L0(@P`w _ о̧/  ?@` h&RX3(#Ȑ"G,pʔ(fҜY:s(` РBjJ*=P ԨP ` 0 @ 0A   `  0ீ$H0` @(0@P &Pg>P ܸ  (n8 89 nzڷk/p`<8= o~߿ 4 `@(*H@  @  `,P0@ `@0   @ (P`(`[(lX0{ضunԵ[@{-p`0|7vrT\@9o.p@hѡ0` @j(0  $P0@ `@(H  @ (P`0@ `@0? @ 8`:lx`@+Zq;r

P ժ ;6ؾ; /^ =:X=ʛ/_/`0|  X @PB:,@\(@ 0@HLr  |YE@RM>pTSUk~Ze&(` Zmݾuk@u=P ^{ Xp @<@bƍ 0@dʕ' 0@fΝ==@`j֫[v};A|\xp@?w^ t ]{ |^x @ܿw_/P0@ 0@HP Qb`( IN,R倖._,PA0X`'ϝ *4h"=ANB*VZ=P ׮\ +6l΢=`An$8 w.ݺ{ {@† 8`1   `@0`s>@F]`u] `n.[޽ >`p H0X`: Ȯ={`A$8~= @P @A aC!F@1^,p@G0 @'QL)@/a|)@7qԹ`G(iS:jUWfz@_0Um[o=P @]u  , @@@ ,?@@PZ׮Ď=6(@P`@>Ǒ?P @s 0zuױgN@/|y8}{Ǘ_  `0` h`A IR   0&P  `X @U,++Ҫ]˶۷p88P ݻv wo LÈ(Ly l@0 V 0@0@ 8H@`@0 `  0`(`(Ͽ$X `ؐa%F,E5n#$9)U\`1 P`0  @0 `  U P0 `$p  @ _,Pp,f@%O\e̒sD] ԩUf ]vtֽA  `q `X0 @p``O@P`_@8 ` h6rX "G,i$J he2g,Μ:wg-JJ*] :@  @@ ((j m+(@P`0@ 0@&O@@@ p@G.WnuЮM@ܺs8‡/n8hyS@pw/oo= 0@?P`8@B 6t"xb9n@H#I4yHtٲ3iL@x@C  @S  @c  mZ0P.  p.$6\X7vrdɌp8wl@ (pujիYPv }vxÅ``Ar 0` @ ``Av  0` @ ``Az  0 Է_G0( „ (+Z1: @$G2ʕ,[| 3&ؼi@<{,pСB4)8}@TR-p֭Z6,=k@l۲-pܹr7޽| 80 >8Ō;.\ɔ'  sJ.] լW'( vz] ć'( x[=ܻ{^@˛?> 8 ~@ 4X  &(@Dc<~X %I&(@JęSN=}j@EETRM8@T k~z@e8@Z n޵{@}8@` @q?v|@ʕ-_ƜYfΝ)ZhҥMFZu@m.pn޻\xG~@͝7/pt]{|@͗/pz _|ǟ_ p "LPB|x`@+H`#Ǎ )2dN<@.[H`&͙ ȩ3g~@F8`)ӥ*u*ժVbͪ5^ +v,ٲfzp۶l  w ͋7A~-„x @ 9A/[.Μ zN_Î-{6ڶo.` ޾.|8 $|@֯[?P  ~O߻?P 8P`&D!F8bE1`PcGA9dI PReČi@ p٠0`` &M`O (`W2`+W_ 4X Ag0 ĕwwջo_]@ $VqcǏ!G>@ 8  PAk   @߿  @ (+P`d/WP@@@@{,Hp׿H`HÇ#JHŋ(@BI2\ɲ0c@@8sYϟ (0hQ PӧPJJիXjʵ+  ( 0 `@  (0@_  4h@(A (0`  ` `۸sͻ N8`` P 0@` @0@y0 $ , (P@PL4, (P` 0@j @T0@ *`V PAVl P0^(`@ @,  @ʔ0-F-`@m&`޽ np \<.`@ @0@' `P@dp Hh @ q"Eр0` @`0@0@ $h`0S ,XР0`^0  v0 v l a ` @@   @N0@h0 @ (x`@  @ 8H@$p  ` @0`>7`? @  `$P 0 `$  `  0@ `0@@Ԁ0     @0` `@@P0 @@0`@$P  `@(X `  `0@7 `0@ `@(H@ @  `$P h$0$p@ 0` @  8 0@ 0@ `@(H @ (P`0@ ` ` @ @ @ ,X `F` A   @ 0`УK0`P`  `4X @ 0A 4@0@A0@8` l4@ ` @`) 9@ @ $h`0`Q `@  `;@ $@@ P` @@$ 5@@D @fz̦]t[ P 0L^    O0  O_ @@@,(@ 20 0`p #"@V hIif  B `(ҤF0 )ԨRR`Urjbǒ-kVZֲmV +^ `/ (PA `cPr6 ٳ(mzn5f`6@ 0` `S00`: x= @   ċ@@;|`ܷ/`0@ ~@  ( (@P` @P  0 (hp @)@\@@  @N0@PC M@@^%@@|%@@X @P` @ \ 8%`@  @3M@ 00@]^`@ 4@ $H h`A0 0`@<7`0@` 4(@P@A ` 4@  ` `0@@&HI@K 4HA$`  QA  @@U`%(@@Y `[0 `.@(H$ y 8 ` 0`@,P   H@ @@  `@(8  `8pAp`7   0!0 H@ ` HA  @>   @0 J@$@ 0 - pp ՛78@(X ` 0`@,P @8p0 @P0@$/`(@` @@@w ` `  HA@@ X( H@$@@9R@$h@0 0@@I@O 4H(%`P @ A(X׮  (  A  @ ,h@4H A 0@ `@ 4PP@V`0@` @@o 0` `s  :$HР0@^0`h A @@@`$  (0@G!C@,e (@t (@0  @(@P@ @0 KYA (@@Ay$X   `,fLL&PYly@ P4Tf͚(@0@t 0  ^x,g޼9O^:${  _?{__@0`0 PdР 6r\ `Rʔ(%Lf i&Μ:w9`B (J2m:SR ` @pb @ڴh @\ @ ;@`x0@ l2f7와(`@W~z0@ܹ-ව‡ 0@  t `}s@  h/  >~p  "D x tq  `@Xr 0'N;  C5j4@ @@ T]+ 8xpk p+`@\r p 0|0@  < @hH6}ujիOp-i6@@x xppyr0zt  `@ ~  8`  @ P uN@?y g~ 0  ` hЀ(A0PࣂFTd V2hp@ (0@v$ ী-ZtҤ0@ 0`u@([ P[ 48 `@ Pp  `d&O`y <@ 4 `p5  `6w(P`‡0`  @@A0Pໂ  P`^78Ѐ `  !  0 `t$ $,0  `@3 @AΜ `@0jtKp*jTJ -K u6po^0@@` .l 0hr T|Y͛57܀H 0MիY vhpwnݻsPA7^@r˓#p@ 0  @@# pP  `:l@0PP` @J<)`x) h g<(@@ @R 8=A@\ @d@@ں%@@ܹ(P` (A 8|b P*Ws (P@@p`A 0@@ 4@0 xp 0@0@@ 4H@ 0H @ H@ (` 8x `@@ (X@ 00@  @"A  @$h@ʕ $0@  `4X @ 0A  5+  (` 80  @@ @@,P0@ ``@ 0 Zuj0 &` @|  0 hP  (00ˏA @P0@ `a h` (@ G8A4@K̤)@0O> ZI`SNL0UYڵ@Pր -0q PW @A <#`\1$OA ܹ@E PtiS`u@`0` o<P0@ Nu . _@о@0}0`,H0@@0`@`(i@*Whr (P`0PРB"(ҤJ"@@R  UZrj X` pA 0` @ ` 06@ీ P& ` ,@  ഀWV-` - @  h> 0 vs^;(_` (=( @ 0! bD Th1@F HPA4` @I: )hP5zK pjTS:pu@V c pkp  (0{w@ @p (0st. @h &p @@lh@@n @  4x0 `@.@۷@@ȗ7?~ `@~p(@P`(P@@:z@ J @ ` ( @L (A Pzj` -,H`0   A 8@pAL@ 0  `0j & ,hP@ 0@@ `` :@0A  @ $h`X(@ @  @Q( `0 ` @ @P ( @@A00@ $p Aܾ5P8P `@00@@0   @ = | X@$p  P P`(@|(0@P` @` @ @P@ (0@.[P`6 0@$(`  ` HA`j@,x0 0  88P@ HA @@ (P` 0`0@` `@m$p` `  0(0u`P P P ,Xp@A `"@P`PX@  @/ @@0 A 0`/  ` 0` @(@,H(hp@ d50A `g %`@ 4(@0@@ `@ ,d& @   `8H`X @7@@Ǒ#/|9 (@Pz(A/0~'}{ 00>} ( @ h `C `@  ` 4@ ( Pbʔ)M @P@:hQ `SP @uUXjk` (8`A0  (P]`@0+^x @hyMڀiR65װc~mvm M`  ` qx@@H'`سk]‹?^ X/`{˗? 3@P`,PA  0 @Pq3X YT@Ad @99O?0I4 ` ` %` Y@qP%З0@@a Pel<@0@ k@(P@ `@@P=  @ O^@ (P` _  *T0@PH@  `* 2e0v0  @@ @@T P%@@V +a`l h;`@0` 0ீ ( h<@`y@`@(m4K(5` ƒ'@@ @3_nҧS.vڵN0@@'`>~ ,(!4bDT0@@Ft#G 0ir+Y0h@ @@ )RK pt@  (P[ lX `k.P@ @\0@@@  ` ( @` P 0    v@ (APA  :ӧ @ ^`7~ @@   ~04@ $H0( A (A @@L @@<{\@  ` $`P@ 0HA( A ` ( ,8`8lb 0HA ( A@  z 00@@n 4H ` ( A0 A @ 8@ X@$ (@ @@$P p<2 Dy2\0@ $p @ `A0  88P 8p@(H @@5@A   8H@$p  ` @(0 @M@$P  `@n$p P @ի@ @$@ 0 @$ Dp  P@Ŋ `c`@ 0  H@$ A@ H: `00@`8p H@    `0@ `@(H@ @& @(   H@0`x 8 @ A' @ @@@ <8`0`? 8P$4`0HA( A `  0  $hP@$H`@(HA  `) ( A0@@  ` ,8`o 0@`@0` @`P,D& A  ` $hP@:P` @> ` 0@0:u @_@'`@ @P@ 0@0@@@ 0@ c ( (SD)I`@    (0hQH(-0HZ +Š- `@ @׀ @+^̸ (P`  װc0`۶ &7@ȓ+_.П >h]wO@@?0,dC% P   PpI 0В$` @I @ `@ J@Y ja0`Yi `kP70 ,a `,c$ @@3 <@ 0Tк= mt0@o @8ɕ/g.`@ L   0w ` `O{O @@ (X@ hH@  `6 @H(IV0` ̘ `󦁜:w3P0QJ @P`*V b  ଀j h-\ kw@(0` `a0&`'SlY̚7k6 (mW^-  @@ܺw7p`\0o>เҧ `@p' ` (o =@` `` 0@4t@cF P0@@@0`@L3c Px @( 0ziRK6Ej ju  l-k @ @K@{4H @  @ (P@A  0th  `@nm  PA 0@0`@ 4(@ @$H`0  A p~0@PA  #R P s0@ @   @@ @P(` رd @@%` \@A `0@$p @ 0@ 0$@@0@ { < 8n @    ^ʗ }z  @ @@$@ @h@B<40D p`@=r4` H4@   0` @@8p HA  @@@A `Z @uśW޺ ` @    @ Y<{@h@@6@` `n|  0@@ tխ_7` @$HР0  A @ 0(@0` 4HA4 ILr%˖._4 `  $h@F 0@@0`VȚU +V@HvZn ` (( @~ HL(( /c,`@0@ @`5k -ȭ[ .|8Ə#n }   `;w0@H_ { /> ȯ@8p P ` @E  q9dI$ 4@eK @M7q)@:hQG `@F:Wf:+_AYg0PVo @ 0лWA_08#(qc G.0@d, @ӧO @@Ďm @  N@$@ysD݀P{w (0W 0@ ?`(p HH3.ȱ ($X20a&Is0@O 0jXJ@h րK.+@ LX#6@@@e3cϠ?@ӨS^ͺװ$@@ @rmoNȏ @H.  @@8ӫO7@@ `?  A ,$!%NXE5X@$)`I@@  PM9u0 *`@ ` SP $PUY&(W @Ԫ%@@۷%@@]((@ @&\aĉ/@  @$HРh  `meMt  $hP 4HAO^ ٵo=AŇ7@@ԫ'@0@ O@@@` 2l!Ĉ'H@  `  H@$p A  ` @@@    8H@$p ƒ-[ jײm6Ar5 .z K@0@ 8`@ ̚7s3ТGH@  `  H@$p   ` @0'`    n$@@ @8/p` 4 !   0`0 `,XtfL3iִ x0@ 0HA( A0@@0@-  $hP@ 0HA6\7vرT\lH0@@ ` xpÉ7~yr ө (A 0}zp{ (0@~ @͜;{ : >`[N@ؾm@M@8N ;@ N>}OX @ 0@  QD@ |RH%MD-]L@yN= ` %@R>UԩJ @@e Vvue^{Xp`&`@ Y\&@@| @ @Zj֭]@l߶ \p7`r͝?.@:n|/@̟?_'(` | $_ p`  C q"Ŋ `? )r$ɒ&Ozp˖, 0`n̙S@  @ ( Ӧ@ ժV (A*@Mnߺ=0 ݺtw  c P` @@> @Nz5֮_ÎzoN@   '`@ 4(@ @$H0 ` @ PA 0@@ 0,p@C  0dԘ@A4 A  0  $h@4H@@$UiSOFtW^M@^  0@0`@$@` @8p0   @  m @iӥ Ėq>P @o߿(XA$/  @A @@@wP @yѧW}{ 0 @ 0  P  $(@  `XiK$p  ` @@((]@PB-pիVW ph $p`P@ @È+^̸H,92lg0@$H`   @oN@(7@@@0@Ã/p =ȟ/@'PA  0  $h@4Hl` $YI)Ud91eLP@t$ГPA,% Z*lڕ P,i  ` [p Pnw>P aĈ P L&  @@ PZ `] kرeϦ]mܯ w ` ,gsѣ @N7@ԯ__'(` } $?@`A0ĈPh" X Ȑ PdVl%̘ ,0@:w,pР@0 J  )ԧ `U0@+Xb -K@Z%` @ХK]۷ ^Ĉ,P\60@3F `&  `@ܺs Pp7‡/n3_^ң'(` @N;  `y go{/} ` 0(@B pa(V`A9&X@H!p%J+ ` `S0Z @RIpjTSVztڵcɎMP@ n\sֵK@{+@` 0|q7vrTl@f80 6} p] @lٱ $pwnݻy;AÉ/p@r0T'`۹w} @P@ٷw@|׷_0B @P`@2HJ2% | 3̙4kLP Ν: 4( 8RL T zj `   @@ |  @ 08Ō p ɔ+Svp@͜; A 8-A  @@  `<@ċ/̛;=XnܻsOP@  @  @H $p   ` D ` @% RSL SgH@80  @ ֭|e͞EVZfWn{7A0`b<6@@d\6@ $p   ` j ` l&` | 5@Hj*@VH`+׮^MP ٲfPp@  ,`0x@,y2ʖ/G>P Μ  z ``5k M`6ڶo0@@@  |8ƏH`9.}:};w  @ (^/@@ 80@&TaC(bEиQc40$'QT)%K/aƔ936 I@Ϟ:G&UTD:ՀWj @;V0`o ;Wn`A$80paP|  G|@˗-8sg 0:Vz`ǖ=@o߿NxqPn @s(80zuױ+{w@0/ @  (\ȰÇ Hq2jX ?&@` I XɲeK0 IӀMr40@)O Xf5 `@K -0@pʝ ׀]% ` <@ X\ ǎ @2 ̹Ϟ H Xzubˎ 6@7 N  H'@:un ËOxӫG ȟO/8A`CPbl丱!E<0 @ `%1c `@ @P@H ,5@S ( U U0Yiծe6 ̥. @ ,` (P@L<5g>0 gСE&=ԩQ(k]v 8 7  00A @ 0(@ `y 0HA7   ` „ 2l P (0@@XpЬI:w<0 РB-:J()ԧjj0p A0 0P $@@  @8p&(p (m4WFm@lf04@ `@<PNڷk?P Ǔ/_(=o~4p`0` @B` 0  H@#4@ $p 4  0P piRK6u z`@ <@Ե[{=P@ 6\@7f|@ɓ%8sf @ `u0 0` @$H0  A p``  0}zٷwׯ/@  @ `@$XpXh;r

|(P`0`P@>m[>P ٴk۾]ݼw( 8x87=t['` vܻ{>6 ҦON^0 @0@ `@ `0 Ȟ ,$8Ѐ ` @ (0@ ` @8bE иcG 0T/aLP`'?% 0@iSM D%@@@Uf*`@k0@@ @Р @P`@@a$VA<9A$x P0@@ @,8P@^Ǎ(ysϡG/p@uH`0  `  $@ЀA `" ` h ``0`@@0HpPp  (H A (8   h PA 0 @È8 L˘ 3-S>0$(`  ` $p A  ` @H'` uh@@0@$@` @8pp ` `` @88`@ $`  $h0(@ 8H@$p@I XA Zjnz@aŎ%[iզ=P [o Pn h@ p0P  `r L@  `$@`  HPx@x@ ( @ 0H`A h A 8p@(X 0 @ 0  <`@ @7j,pȐ `$ʔ*W8%̗ ifvy $hP2eJ`  *Vի0lj (`A;A 0@0@@0@@A ,HЀ  ` 8X $h  @ $8`XA@p A`p@Ǔ/o|ֳ_@8> 0 `0p@ 44@@@  `@ t#H$I ( @@A (AKH ,HpZX ȒMЀAڴ @@P (0`@((@ @7f\ɓ%(sf͛9w.p@hѡpv:0@7nM/.yr pS'p݀0 ` ~@ Hx ,X 8t`A  (qx(`@ @ (0@4 fzy@D=L2=P ԩR 5+ P6muk( o^|0P8 ` P XVA0`J (A 0@j;$X@   = @@ (P`( xۿ?@Dx 6LP@ `@F R D,` Sg ` $8  0  *@`e$PP@k ^ L@ @l@ƌ r,_|@Ν=M>P j֫ [v}|p@ʼn8r͝?~@թ8@vݷ(@x(z0@ǟ_~ p L@B(qb.bx@;8`$ɑ H2e^|@6kH`'Ϟ>MP ѢD $t)ӦK u*ժSu +v,ٲfφ-`-۵+7ͫw/߽  x N;>P ʔ $y @ONzu^~] ڶo㶝@޾=Ƌ`9ΟC.}c^޻(`<ϣ/p Ϗ@(@LP @C $0bE1(cG9dɑ Pe˕9SpԹgO?s0$UOF:fz@_8lYPVƅ{`@w8o_>0 @aÅqcnj 0re˔ $=tiӧQ.uk=[pֽw@Ǒ/p@s 0tо/ѧW~}LJ/`@H*L#JHŋ qcB y`@(S\r0c

aĉHp \4o\СA;Xi 8uk ];t{ (P8/?`ѥO.Hpw (P| `_} X 2l!D hb6r#Ȑ"GrLP@* 8̘2gҬi& 'РB8ҤJ2eZ ԨP `*֬Zrz@bNJ-pڴjײm-ܴk/&0Ċ3.Ȓ'S\ ̘ p3ТG.mnͺgӮm6ܺg7(n8ʗ37`@ҧS^@s;Ɠ_׳o=| o~  4x4tذ)VxcF dH#IHeJ+Y,fLygN;y@C8iRK6ujTZ[vlX\pmZk8n\s-o^p` @ŋ8rdɓ)W|sty@I6}ujդ0vlٳi@nݻy] @p $pyr˙7w`kv ݼ<8p8^`@̛;= ` >˛A3X $8? X@@ D8p@0@D' Pp@;6@P@ 0X@J 3f5męSN=i8@PEE*4A>5P U^@~VXe͞ 0m:8P@u H@^ X FXbƍ?6\ʕ-_ƜY3|yMFm:][lڵm.n޻ \xG~͝7/` tխ_Ǟ]v ^x͟`@8@|'@~ p "L@B|`@+8`#Ǎ)2d&OLr%˖._,p͚6o̩~YF"5@NB*u*ժVH`+׭ +6l΢={@n w.ݺvͫw,x0†(`1,y2eȬy3Ξ?-:N>}`@֮[8`6 ȭ;.|8ƏpΟC.c>޿ϣO~=ߛp`?0$Tp@!F8bE8cGA'Qp@K/a<0 @M7qԹgO50$UtO>=0 @UU kW_; Um[o&(` @] $o_|0paÇ'Vqc8A3.P ɒ $9͜;{9AK.pժ ;6ؾ;ݼ{@ćH ̕( =ܻ{Ǟ@( x?ۇ@x@Pa <QD-^x`@98@H%G(@JSL5mތy@=y(@P8TRM> ^Z](` X $VZmݾWm޵+}@ .pƍ?YdYs|MFZj֦[v}@}.pōG\r _Ǟ^͟G^ ~߷_ p "x@8`"ʼn Ȩ1 )r$ɒ&O@^4P 6oy@>{8`(ѢF"MB}Z@V8`+׭$8 @fϢM{ ,p`.ݹ ȫ7o{@† Pp`1ƎCn 8yf -@NP^Î-n]޾{;X  O|H֫(`; />|Σ?AÏ/?P 8`A PP D,0@E1fxA~\@PD@K,pfM7k(gO:T&UiS D@W^-P @W] 0 Pm[m Hn] лWo|@Ç'Vqc $0 м@=t PZu`džqֽ[ @Ǒ/P @s 0d׾{w?^ЧG_(~}׿("Ç#Jx@/8ǎIɓ(%Ȝ)@8s,pϟ> @ѣH8Ӧ Jujjz@`ÊKYXvʍ; x@.pÆ ǐ#8 ysB]ӨOװcp۶7.@ȓ+_μ@:h߮}ËOҫO_p

P gСE&]g`ݚ̦m@u^ɑ(` sѥOnٵg?P w P|g@ϧ_~ ,p„!Ĉ'R7j

P ܸ /N@ʗ3oyS~@ڳ8;(o< (ЯO@OP`@paB px`)N

8q8~@+S.p͚:ѤK8  x ujۮ]ݼw( ċ/p=:Xn}x@@x` x < H  @ $h`,0 @<~4@%M@J+Sfy@=}Th5z@M(@T~VE{@mݶ-p\s4(@ ^(0@ P0 `d 0 Lh -@ (P`P00͝7?P t ]{|^x@ܿw_@8@~ p 8`!Å (1b.b>P`@@ 0 0P`8p  @(P` @v(`/߽,8#Nx1@ @/[.P Μ  zNz5-;n]޾{/hP@ (A@P `@`p (0@ @@0( @ @@@ "( @E<'Q

]zg^߽(|yѧ/p@{0ןP*\ȰÇ H@h8@`ɓ&%Ȝ)@8sɳg z@H(ӦJujʵ+@hӢ-p۷n( `@- @x@0`@"K߯(P ,\8C X4 G ,0) `ٲ`M7g %:@I.eiNz@Y(W [Ԯe̥;@y-p_0 @,fcȑ%O<@`gПPtf@eϦ]vt}@(q`ޜO^l@Ň/py0@ /@@@,(@ PA% (`ƌ6 F `򤀔`̘0`@B-jh2]z@R(*֫-k,ڳ ЭKz]` P  `4H @F A  05P  `@0` @t,`pνNj?P@׳o@ӟ@(`8aB pbD ptر#I\`+ P0 ` @0    0`0@ `@0   @ 4Xp` 0|p7f|@ɓ)W|9o>P @hѡ pvi׶}x}@Å8yr   @@ ]A( `0 `$` @ (P`0@ `@0 $ 8ZlY4g Ν<{pСB4)8}TR=0 ֭\z:d( ڴx K@0` @`0@0@ ,8` 0@@ `   (P`(`̗( {>?o@۳/P ??@@ pB Qb\xq< 9@%K@)`@  (0@L5  4 (P`M UU U 0X@X @mܾu{`@uśw}=P `ƒ Xq<8A,_ƜYsfL6]֭Y/`0@m}[}[ōG\  _~@ݹ8@x ^z(|_ p` LpB(q".bx@;8`$ɑ   `@ 6o `~, E0`NuU^u+W (0@ M@nߺ-pݺt0(w/߾~2X`0 H8qC~\ʖ+;X -zNH֮[(`6ȭ;P H^0`֭^`w0@@ G?`_}/ .0$T!>t иc <`'Q

`8aB  p@D)Npq@F9 q@H#I Y+Y `h֤y@;u8@PC5z)piV*@[vlح 0{lضe@ԭ;{*@0@ 0+@0@ 09+@0@@hѡ `@   6l(Hwn ۷7~yrˋ+zt ~ݺ t/0@xɗ7~@0~|~p L0`` *ZL`:0`` JL`,Wh`A4 03'N @D5 `@x 5ԩT(x@d˚=6ڵlے-pܹr7/@ .pŊ92Xl@;s.pѢ:5~@k۾;ݼ{.P ċ?< =:Xn@ܻsOP $>=@OP $@@ @>tx@-^ĘQF)(` H%MDRJ Sfy@=}LP PC $Ti<@UVMP V[ $VlE{vmݶ=P@uśW^} (@`… FXb,_\Ν9(@h@\v]ڵi(@n7^͙(@tխ_Ǟ]v^x͟Gܿw@8@~ p L@:,pŊq @&O,p˖,  s&͚6o̩s *t(ѢF"M tN:=0 ժT $u @fϚMP ۶l $ w͋@~MP „x@,y2ʖ/c y?-z4ҦO{p֬  { ΍;A.| @=A֯[/ ~OÏ/>P@8`A&TX@ Fx@-8cG 9RdPDy@/]8fM йSgz@G8iS 0jUWfպ ;lYgѦUoM@v ( A_}0` @ ``Ac  `re,Xs  004,X =[vpƽA߿>xq}3X@ D>zuױg?@ 80  PA}    0*P0 h9`@ (Xɠb$@@r`A@$8@ѣH*]@P$XիXjʵׯ(@Ҫ]6ȝKnx; (@a XX L˘3k̹ϠC@0PP`@ (@N(P (@0  `@(@~(@P` PϿ$XA .dC  (  0@ `,8` `@Mx "hp (0@  @ 4@0 %Piծe[qΥ[]l  0`@$P  @0  @`$P0`@`$p` 0 ^uٵowŏX@,` P@ (8@   X,`"  V` P`: `РB-j(ҤJ2m  ` A @@ 4@ @0@$Xp@ 0H @P@P.茠 Wn5زgӮm6n  00  @(@P`ޝ(`A `^ (P`#P  @A `@D)VxcF9v$  `@J)0fL3ԴyS0@P0zAҤ p@T0 " `Ȗ5{mZkٶu `As$H H`A`'Hp@ /Hɓ)/H@f͙$X  @X@ ww @@PAt @(A  P/HO~_0$X0 ,`P`(P:"P2$ < % 0PL jd  ULxTx*@ `l"Pt( ޽  P@ @ d 0Pf 0` Jfիf l([ z0 ; ԫ[>@ܻ~  @0@ۿo_~8@@ (P` X  @<Y@d@I@ ` (0@NTPEEZTM@ (P@P̚5l (P` 0@l @X0@, ,`f PAZ֬ @P@n0`@@@t (@{{'` (^  _  _? $ p Lh` (`@0@ `K^i0(@ @8`@*`5 `W  `4X @0A ( ` (X 4( 0@@mHz5  `Po7@@ ` =0`| P @ ,P@ @&p  ` @ A   8H@I `ĔӀ$ `@ `@(H@` @0@A(@@ 0, 50 ` @D@ @e A @@& `@@0<  `  

`ܻ{>` @x?'@@( <8 PD0 ` 9  @e  (0@(P=@%`@R `4P0@V@@PK @(@0@b<`y@ @zXpl0`| ` @ \' A  `/P0  @ $h@l`A0 0``#4`0  0(@ (> @@  @@S 0`  @ % `,$HР0```/~ @ A `1  @@0@@ `@k$ 6   @  0`@,P  @(X0P  0$4`D$P@ 0  ` 00   0`0@@ `@@S$ d5  ` @  0@@-@ ,@  `  H@m @ @A ۷m'@0(` X@,` P `07@>(@ 0(8C  0   0`0@@ `@M$p 5  ` @  0@@†- 4(   `0@@_4HA(&` @`A X  (  A  @ ,h@4H A 0@k7 48@A `A$HР $` `L@4PA  $) `)@I@@ 4(@  @`Q**n@Pٲ(@0@ ̥;w (P PA (@0 @  if- @A  P /xѥ  l}wŏPgO' `  @@`p haP`q#Ȑ  *S&P02e):w sР (*0)N%`V(`A$(k6j@0\r`W޼z+/.lX0P l27 Y`ZShM`fӞv0 `0@@ @@0{ ` @@ $H`A'X (@4l8bD xQt(`$ @+ fLy S0 @R4u*@TRp[*`@k٪0@\r @ p `3X0p9͛ `t 0H: 48  @8É0~\@˙ `T `۹w0 ޝ;  @~χO ( $ (`PHA6$9$JVl2Ьi PA `ʕh|0  (`@ (`> H` @0@@t$ 0)eJ(08p 0𓀀-ptK60`  p@0h  0-Z 2p.\  @^K@ @@@4v,@ `  (u 𚀀h.w+` @'0yr7w\ ;wޝ 0|0~|ԯ?`( 2` ĉ XhF  (0@$<,[4kڼIs,耡C =(K u P\ Pd @lx+@ؽ{w`/P0@@ ɓX9fx h$X x@  @P z3hp   8 : (@xN PP?@ @p…<,@  (@ $h@4H5 `@ @@ZA @TS 0A 0` 0@  @.$H@X (`p`  P,8A $H h AA  @8@N@ 4@ $H @@Pp` (P` (0@/`@A,a @4n$@@!C Yd0 ,8@ 4h@ *`@4Hi@0  +  [̥; [ P,^\@cL,3#P P  ر @ 潛 Pxq Ps(@ٱݻw o y$X  (@P  (п?@A @ࡀ'J`q qHF`JVl%̘0 9@9 0` 0` 05@)R0@@Vruj2@ \0@ W`ذ ,X (@P5#ܹ@FP@A 0`l @n p08rʗ+00@@ p/0w  `zh^(P ~0hP@B `@ T0@@F PdH0y+Y @3 0g$X@Р  0iR @Ԩ PAtU0`k0𖀀s {W@{( 0q4n, |@9 ` @0mիY&@@@i@ É@@˕ ztT~0@0H`A0P@A| (0@' 48 aB x(@*V1ƌ:2ȏJ49 J,Y0 ($D8@ 8-0`SX @  ر@%@@ (@ 8`X `A0`:0 ZjZP -  <88~\̛@@  @x^8x? 4X@ ` `\, A| @Y@ ( @5k  *=A 0Uj(8 |=` (`@A0@@8` ` #h`A  @3Z @-` 4@ @  `4Xŋ0`(  (@@0 `@@  `P @`̈ `& (HAi  hQ ,x PЀ0@@ p ` @ @A(` H@ `0 `V 0@  @ H` `@(X@ 0`:(A0 `$p  ` @(P` (4@@ `@E0 # p0eX ,xP@ 0 p d5   0`@$P 0@`+H@ @  `,P0@ `@(X`A 0P `@u 08p  G0@ ` @} @@  @XH@ 4(@ w0y `?{̟?`߿?,hp@h8@ P"Ƌ6n,c" $DP%̗(A:wٳB (ZZ5V(`Р ,( h$`P@ / `Ȓ' ` Y`ZW `f`v @ `@ʕh^^v0@@@  (P`G@(hp>  _`,pp@B@D T 48pA H`P`,p  I@4m*SN-0Z`@ذ0@@k V (p Ppx @dɓ)SFp PYG#0}, 0wnݻy@xpÇ0n@ 4hp A @p`A0p=ط0~| ~ P 8pxX b8`@x0 @((0@T(`@ ( U "(0`4x ֬@VZx[`57o0X`$h@ p (( :0  `@  (0@j{0 ĉ8~  `X](@P` (8   8 @   ` @0`@0 X  J<Sf 0 @ @P`JU @@$8p` @k@  `  (  A   @  `0@@0` h`A  |F` 0@   `t ^@ x`,` ` 0@ @ @`̈qA4 `@^ `6 3~ h ,XРN hpA @^ @@8@(X@` @(0@ 00 `$` ` @ @A(` H@ <@0p `  0@( ` 0@,` @ 6x`A    @@@ 0Ҁ'0x  @0hG$ ` 8 ` ;@ P0@@ `@(H  @  `,P  p@ ` @0 0@ (@ $h`@ P`@u ,8`@ PџРP A@Xha$x (` G,HRXɒK008@`0@t  `U0`$H  @` A  @x(P`@(P`0` PARV]` 0PP`P ( @P` h'@'0@PP@(p  @  (0@C(PqDPRIr@  (0MY P ԩ*nuW [Yi PqM (߾ \ĉ`l`0@0@hjR0`Z:+  ଀j v (P`޼x   (<@x@` sТC@Vnukm6n(@7'N80on t`]/`0@(H  @@  0pP P 0@@9 `@PXP  `@0`C@` Sz t-0,cɖ5{ضeK`  (pA^ @p` 0|p$@T6 `` {0` @O?@ @@hH&RX3QF9`V P ` Pg  0 0@@ @@Zr*X (@j 0`@(޼x 0 0p0&` @P&` f60g((@ 8  `nM(N 0'ܹҧ(P` .@(/@ֳ00   @0@ph)VxQ(A0)` @@L$@@ @xi(C@K 4%`@ 0@[ X pmڳpp@^ p` qbɒT<`͛9 P`  @@ ݻyP#P  @P@v(   0`@ @p P0    2H@, (A  9@С L@@5 (P`lw H h  8& @  0 ,80 5 ~zj0@0HA( A`  0  P x$8@@H  @~H   $hP@ 0H @ J\PA 9@J@@ 4@ $HР `    @A @0 @/@x@@ H@f : 0P  $@` @p H(0 @00@@8p HA `A(p0@ `@G$p  ` @^  $@ H8@(X@k @   ,hP` #> @@8 H@0  $(`  880 80  @@A 0  X`@@ @@$P  `@@G$ P @p( @ $H0` h A(  P[`@@]u( oس@@0X^ @߀  XA(`C ` @8#`I)UdI1e0P& г%ZTI.@SPLPuYuWa  Yiծev[(n+@ Pa  c$KPe lVP `pi 0Кkد ` 0 ɓ< Pݺ l7@w P@0@ @@@$HA hD8E70`@$*U(P@@i@NsP% @2mt@0hЀ0@@bNJ 0@-r  .z @ `ذ @&O6`f @`&`@ز06nww  `r 0@ (P@@(O@ h^ӧ?` 4` pA4$`)VxQ9j4# pҀ+YtR@Lh@;yhP< 0K6ut@T+U@Xc@kٶuK 4h0p` 0l1b7f,|e@ PA &kP 7~yr˙7@@@tT>ȓ7 @O@4H0A @   ` (` ȑ$ @ti 4 ( A ԀP0@`    $`0@j `  @\7޽|k  1$H*0` `  8Z ` @ @A(@@0@@@ 0H >| xoHA H  `  H@$p A  ` H   0@@ i N=}T(O H@j @| @d 6 @ \ A X X P88P@Ν=0:6@  P  0` @@8p HA @@@A `z @ǟ_ @ $ A(@@E 0`Y@@%  @^  `0> j H0H`A`ͪuV0 f ( A0@0`@ 0(@ $H ( A i z5֮_Îڀ0@@o4Hƍ0`@'` `@`v0@`}PA `A 0@ FP@ cǍ(0@P`406P?@G&UiSH 0@f@KP;@o0Wջ]d@w +A 3`A{ 0P0A ׏Alp*\XÇ ` c @I0`8 ܩSO% H"5Ӧ (@XjZ`@0ٲP @w߿ 0@,88ǐ#K~3kƜ`g B/Mz X͚uװa3(@s @ @(_nУN . @ހXo{ˏ/@_h  Ç$N8E5f4!E$YI)U Yt @OA*QI`TS@YfpaŎ%;ԮUkq @0@_ L /fcȑ%O `0@g (0i @P@رeϦ]{ (0o @P`/_^ ѥO^=Aٵg7@@7Pԫ =/@A ?@,h „ \@  ` $hP 4H  `2eiNv  $hP 4HPZ@Zrkƒk eKୁ0`@` 3n1Ȓ'S @@8 HA @@M@ (N@0`$@@ @8@Ǔ/׳o@`@'``0@ 8`@ 9vdH#I+ @@8 HA @@ S0@[  ` H@$p`ֵ[{@ 6 1  0`0 `,vvlٳi׶}@6`0HA( A0@  p po@ 4(@ @$HA Mz((@ @j۾;ݼ{  < x=tXn]  ހ >=zڻw_ۿ@h@P  1,H  y %MDRJy l޴  @) @* UV @@X0 @ @@u8@^$8XpF|@76@@0@@Ν=<`Ҥ @=A֭][lڵY3X@n ʼn@N@ nvݽ  @ O@8@~ , p@ L@:4@@E. @@0@I0@96o̩s'Ϟ>(ѢD  NB*@ Ȫu+׮]% f  Vn ` ݺu w ,@#>|@Ǝ `LΞ?=` z5֮_Î-{΍;~N`8@ 0`n`;/~< (  @@8`?0$T@!B$ h@@  @(@0@@˖0s7qԹgO?p@QE 0iD%`W  PA @ 0(@ `w ` A Pl1  @((]T$@` X@$ %`  Kݻxwn XL  ` 8H@$p A  ` @@ mr  0@ Xn @:h߮Ã?P (XA/ @@A$@ ,\X%NXE5(pG 04` @d PA @ 0@ ,5@@S `U 08A `, `ۖmΕ{`@y8_  \0 $`0@0H @ APZ(kرeϦ]mݛw0P8 ,'ܹ @: ŋ y P_@8?@ ƒh&Rh`#(@0@ h` ` 'РB-ʳJ*MP@0`֬Zrի@h-ҥ[z&(`  $`0n P&`27syhF(4 (gӮm6v @ƒ88  n p7@ `7`| _ ` 0h6lX%.`PcF H,i+ 𒀁3 0`x0:@K PpjTSVz5vZc&(` @0@n\s  p]{ @@Ŋ @ɒ T,@ sH&`AY'X@lٱp7n  0p p}@۹opɗ7}z Է_?A <0Bx Xh@;8 ȑ$K

  `*UȪu+׮^ v,8p@p  ` @ (`18 y2ʖ/c >\ҦK'(` k]0 ;@m` @q0@`  `u  @ `<Σ~= /> ȯ 8`@(8A00d$` @'QTeK(0ԙ3A:GPiSK@Wfպ[ gѦU6Ao5@@ 0  DP @e˕ sgϟA@Q.p@k׭0۷ ֽwo߿0|8 P<@spzuױ_wp`@0|y  }{0_P @(p,Hp"JH@$XǏ@$\2Ab0@8s4`ϟ@ @  )P :ի0@` PpٳhӪU ۷p K7% / pX<@ǐ8 ̹Ϡ,@4^cNP@۸  o'@   :  ?@ 0{ (@_`@` A 4@  4ѣD(I`ْe̤YM $g %:I&MP@J%PnWa @Y0`qΥ[]u @ Pax@%G.pe̗ gСE8i `ݚudϖ}`@o Nq ( @l'`@0@{`@?$h BP0@ ీ0@*S8%̗i&Μ:-JJ*=0 0` 0`0HA( A[7@0@  `b @ `0@̚7s3h&`0H@(  0@  @ʓ89n:/O׫o $(` @7 $p @`@0$@@0@ p AxhPC @K t` 0 `@ x@u۶s=P @^{[(qbpq4p A0 0P $@@ @6@$p 47  0P |xɗ7/ p@@ 04p1"Xh@:z2$H8ZlY4g`  0  @@$HР`   `@0`@ 0(@  @$H` >8ň 0 dHA 0(` @@` P ٲ ;7 <8;o^ԧ'(@ 00`@  ` (  H@@ ( B @@=~RȐL@(P  4`P@ @i>uz@U^Ś]v=P Xc Vmk@ܹ޵k@^}+`ƒ@Xqb \Ǝ'P@ l :MHm^& @  `7~ \x H\ ((@@ @ w /@ (@A0@@ (@P` ` @C X@@ иQc@y@'QT/a

xq Dױ_OP`<P^@  `7`@H   (0   `0 `@bD@848'@8 ((P`@    (0@ 8@-ȝ+@x˷o |@È8 @ 0@  ` $`0k & r  @ `P@0H  @` 0 `P`GA 4@P 8  ` 0` @$H` HPf@A%Zh.Uz@Q8U 0@  `  8HP@0  ` @` 0  8HP0Z 8A` ` @  00A x` $(~ 8h@ @,H *

P @jթ PA 6x P0ztөWN۵ ` 0`  Pԯo (` H ,Hp 0hp x| A$I"(  P(`@(@P ҥJ 5*X5֭ ʚ-[l&@@ @ص+^ ؀ 88~ y)l: @0@Zx] 6 $h`}Ǘ??`@H(ÆHq2jȱ)@(S,p˗. @&ܩ@pѣH*]z`@P8իXׯ`Hٲ X˶۷pe;@x8߾LÈ1H,3c>0 ϞpiXzȞMm { N\+_\K@سkνw O~|ҫO`@˟O?P  ,pA aL85fpG!E$`@)Q8K1_M9oHO  ZQI.-:@Q8U Wa(Ygm̥;7A5P '(` a $cȑ#;8P@̙ HgС?'(` iԩU0Pe;80 mܹum  ^x/WAѥO^ٵg?P w P| g_},?@`A hD `ƌ7f\Ȑ"GDJ P ̘2g4 `@'Р`0mHp*֬Z$8@-K@jת-pܸp,Hp. 뷯 .`3nx\A7HТG`A$85l mwo /n8 0?`AҧK/pڷs{/O׳o='(`  p  4xaB bD'8@F9vX @H! peJ+Yt@3i,p@N;yhP0z6ujTS&kV[v-@Xcɖ5 @k8@\sֵ{/ o6|qbŋ>0 @dɑ$psf͛9w9I6} vvl }vxxp{(yrpztөW@۹o/p@xɗ7w~|~0 $0… :|0A+R,pƍ;z2ȍ 8dZ| 3̙4]&( Ν<{pСD= @LH ԩTZUjzZd˚=6ڵd 7. ؽ7޽|MP@ >|x@;~ 92*[\ ͜;{ :h 8tZ~ ;ٴk>0 ݺ$<ċ?880 ?@@ HP@ 8D-^ĘQ#RH$ 8J-]Y L3(8SN=}SE-pRM>u \Ś`]v]@̚EZmݾW.[śW/^ >`7v ʕ,(@f (MFZ\ @ڵi8@n޽}{ōgr,Hp@ ]vݽsP@| @^8 @  p LAB(q"Ŋ/:,pǎ? )cLi@._Œ̩s'Ϟ> `"upN(ժT0`+W +v,ٲfϢM6l+w.ݺo w,xp Nx1ƎC@/[N0 Μ zNz@^Î-{6ڶo6P޾.|x O|ΟC<֯cϮ};޿0P`'`=/??@8`A&Tx!F8bŇ иQc@92dPTeK/aDY 7m&(gO:T&EZ`@OF:jUW8kW_@gў-p@[o=0 @]wջo_u0$V!?>P @e˕ sgϟA=VukׯSvmнwo 0xqǑ'Wp>g>߽|yP}{Ǘ?_׿80 Ç  @ŋ3jȱ#)(Sp˗. @& ɳϟ@ J@*]ʴӧI0UʵW @ٳhӪ]˶ ȝ+7A5P &(`  !! NETSCAPE2.0,(1888FFF'''TTTfffwwwŇ Hp (,0Ç#JHq@0ǎIr \y0a(P8s\ϟ>,@( (]TP ` իV Pk 0Xٲ Xv -0ݻxw@0+N,@ǐ#KLe ysBA Vװ$X۶,Hp N| (?Н+8 8@<_^˟O8 .dCEؑc$iTdK1epp`@9q8OA

ٵow0y` _~?@,h`2,!ćh"ƌ7r@"C8$ʓhfҬi&Μ:wLP Р@ $`(ҤG Pj*֬ZVMP ذ-Kjײm-ܸk`@ .Ċ3n1l6sF]Wn5l m@ܺs8‡/n8 hyS~ڷ(Ǔ/o< hᄑЯo>`4xaB pp@ xb8vdH#;(eJph֤Y ;yhP; p4uTZ[vlX\pmkٮ-p@\sֵ{۷ >P @bʼnprdɓ)W|3  6}vݺi׶}wnݴxÉ/p@r,HpW~@$X@xpw@@~ <` 2t 4@P c 0X ȑ$E( ʔx  <Ν<{Hp  8:- Ԩz 6X =k@l۲-pܹr7/^[`@ >0;nA X͜$XѤK>P ժ ;6 ؾ;  / xyX= $><?o۳?P ۿ?|@@ PQDQc|1ALDReJl,@NET<@UV-pV[VXe͞E+vmݶ=0 \s$W^}(@`@?Y\|@=ZtF}][l߶}@޽y8@p @\r͝?O>թ@v^x^}ǟ_ P",`!Å(1.b̨q# @&O,p˖, s&͚6o9s><0 ѢDt)ӦN(`*թȪ5 +v,M@n w͋@~,xp#>|@Ǝ8`2 Ȭy3Ξ?\ҦK(`5-{6ڶ{@Ə#O|yC~@ Ȯ={~ϣO>@/p(`A&TD@0f4P A9@'Q,p@K-0fM7q4P?}(h&EZO(jUWf-p@W]0U@oƕ;n]p 'V G\˗-(sgϟA.p@iӥua.p@m۵wo߿8xq P\yG~@ױg׾{?^ЧG?80~}( @ (\ȰÇHq2j,ǎIrR\ɲȜ)@8s,pϟ> @ѣHPӦ Jujj͚@`@pٳfX{`p=P ݻv /LXx"K.yBM^@c.p۶  ` 3N}zkN`?0X O~@$XР,d@%Pbl@!E$YdTTy@1a8M OA Ph,e@QFMP UYnZa(Y`ۖΥ[@Pp,f@%O\r4o|@СA8i ڵ̦mu(p(` q 4xs4(` ulݻ'?@է/p{P}8?@( 2\X#("ƌ7r,pȐ `lr @@N ` ( <  j h4@0@j r @@z H/ (lp3^|@Ȓ'Sl7k>P .MW>P زgӮ]ܺs(7(nhn@0  @@ (4@P0 ` ` 0  @ @(0@ `@H!pt@3iִygxy@C 0zh6ez@SVz[n=P @Xa p @ @ @P@ (0@<8@@P`( @`@7^@˙//p@tp{v۹8|x 0@8~| ~ 0!8|pA  `@ @     `@0 08pA  :@ d hڵj7.ؽk@| 8p .|@Ō x q*[|@͜;{ K>P ժ ;6  @z0@ 0@̛(AX~xG0 0`@  ` /  @Dx 6

P d\|=w>P hҥMF]֭Y(@l (|p\yr(P` (P`vݻ 0`@@_`z_~`

,`$ɑH2^Œ)s&̉@>,pѢD( @@@P`V *`׮^ VfϢP`mn[`ݺ {@† 8`1 ,y2ʖ y] Ҥ z-{6ȭ;~]Ƌ/`0@ .}:֯cϮ={(`(`=/?ϯ?8P&,aC8Q0fԸc@'Q,p@K-0@7 )?@@& `@S(PVd0kW_ [`g PV@[ 0Xn] лWo|@Ç'V!?>P @ed֜A>P@ӧQV@`dž}@۷m8wo  `8    ` 4@0@0@`@y4H'`   P  `@0@@ hܨ@ C,pɓ&0˗0c4P8o( ZH(ӧPJ-pիV++v5 `@*H@  @  `,P0@ `@0   @ (P`r(`(X|KNh߮@@<_˟O@ P .`0@ (P`0@G H` P 0@ P0 `@ ` W,Pleq=0 ]y;(/V\ȑ!e̙5opgПPtfz & `0@@ h`A    ` @0@  `@0` @(0@@(` (!ćh6r#,I@*WЬI:wz@J8)ԧ  `UZuX PAj h+`\(Py0`@(,`h\P7k>P Р `n5mv.7(nx0o9 $`pνNj_`ֳoᄑӯo 48@`@Dpt1AH4yIph,gN5ziR 4u@SN-p@VY( @ 0mض@ԭ[o{ `.pŊ 4n<rdɒ @P` H&]իU/`Pvlٳif@nݹxÉ/p@r,HpW~@$X@xpw~ (P`/0` xX`D0@@ x8 d$I8yRJZ,s zYD:X 8} 5H\( ʚ-[lۺ} 7\ n>8qb8~ 9cX9͜- @ >m@[.pٴk۾;] <̛;@ԫS/p0@   P 0 8`@  (0@B  Qĉ,Z,@|(@,Re5męSN6ThE-pM>UTUk|u0@@ `u@`0A   `d 0@0@@X @l,[wG\r88P t\~ݽ^x^}~7 `@4  T 0@0@ 8H@ `@0 `  0`(`N(`*թȪu+׮^z@f H6m+w.ݺv&(`/߽,8Hl@0  P 0@  @ H` `0   0`(`޻(`<H~=W@ ȯ?8`A&@8bE  `@@P9   & ,8` ` `W(0Vh@[m0 ջo_MP @a$V@!G]d} @P`У@@@ ė@/@H &("J83jȱǏɒXr@͛6ϟ@ѣH*-*@ H*@Xbp`ÊKY mpݻx˷],#N@"G@˘  @Ө  @۸  (X N}k.@ËOy XϾ@0 Ͽ$Xp@0CXb4n8A!E&`P)00A1e&`0900AA&`0QG0HiS L:AYf=P W_ PlԮe[ -0@y_&\p,f@%G.pe̗s&=@U.pkدPv@/pqsѥO^zٵowg/py } ̧??A/@HP „ $PH@7jLP Ȑ `l%̘2gҬY@:w'РB 8(ңhiR@ZH+د (klֲ]@rH.޻ |3n1Ȓ%`2̚7s.M@W.pذ`@‡ /pPN@ڷk/p`<׳oӯo>p (aBp(VX5(dH0yXdY3e(gN5ziRK6jTSVzkVȖ%[ k&(n\{n[ '(qbpq(W<͛5thѣI6}uXvvlٳif=ݻuxp0~x7g^ ӥ'({v{ȗ'_ '(~|0 <0 x1ĉ+Z@:zx@$G8 ʔ x ejڬy@ ?`۳O@  ` @0(`Q\$@@0`@ 2%0` (( @N H@P$8@M>UTU$8V]~VXe,P0W[u W}w P@q @P 0@=ZhҥMFZj֝(0 @ (P 0` `Р|/@ (~ P$@`"Lp!ÆB(q"Ŋ&@0 (@ `PXn0 ~Pp  A 0 `% `$8` @, w.ݺvͫw/߾~,8@(HA `   `0@ A(XA@P@ P((0`70޿/~<ϣO~= P 0`@X`$p  @ @Ш   @`,`P`@,`?` @,iSOF:jUWfպt$H(8`A 0L@ P0@ ,Xp@@@Pp`A (A۷qֽwo߿>xq  00  @(@P`PO=(`(`@ @P` @P! 0   `BIɓ(S\ɲ˗0C&P0@r)@ :ѣ( `PJ@իXh-0` 0 0ApʝKݻx] , A$Xc 8 h޼ $8@4 ^ A 0`N|+W>`@H/  h} '@@ h` ,O~_ $X ,d  $8 P DI)(`K 0`@O  Z( ,eAJP 0Wa KVٳ `;q-  зo Pذ0h@A(`Pٲ (@ (`PڴԨ^k(]m tV#(0  ^}ď_gހ _} ? `@0 X`p#ȏF `@   倘2g `Μ:w'O-J J(  (P`ZjX(0@P5@ @@00ీ(P6 ,`h((P5.0@ܹ  [p`\  9 n]݀(O0 7@>~      `0 H8`p i @hPpԀK0` @`0@0@ ,8` 0XAp8 `  @f  @6@`   @0@@4` `p (x`@  8p HA* ` @0 Ȑ4 % ` @0@A(t0@ @0   l @% @ `@ 0@0`Z `@@m X0p P 0@   X@,  (@ ` B  @ (P`0@ @ P  @ `(`  `e  ` @0@A( @0 `@ ` @|@@ (0`0@ p@@,8@4X @ @@ 4@ @ 0`0`00@@ h`A   ` 4@0@K0@@08p@   @@  0` 0@$H `@  H<@ y 0@,H`@ (@0@ P@޾ PA @@C>`cN`w/` (@ _} 00@ Ѐ @ (0@ `@  eK9s @ 0$U: `@UW  `_:Pkou;wջ0` Pqc 0r,`@g-@i PA  (0`p6`0\Ǒ P|@sD>zu{wP @0@ 0@ _0C"Hq​2f   XRKb@ M @@00hpi @U @+ +` 00`(0`@(^,ǐP e0@Ϡ =ZȞM{6 `p  @ H  >@ / 0 0hp ` 0`@XQlر! $T `Kd PӦ8 $ O PI.etSQNZժY(HW  @@iVp̝;]y  &\ذ @Ȑ(@e4H  `ԩ k][۷ '>|ɕ/g|@l] (@0@{@,?@0 ` h8  b  (0@(P*@`$`: ` m@hZ@A,hP  +X0@ڴh r@@%@@&@@ @P` @ 8&`@fA  7(N@ (0ҧK_`@ 4@ $H h`A0 $`0@  $8D,`0@ 4@   `0@@KpJ@@T 4HAt%`  @ZA  @@@^@  ` `@d0 3@HP Hwn  @p 0 @(` X@,`@ 0@ O @ 080 A8qp x4  @@ I@$@ 0@`R `@T$ @ X0p` ` @ K@% A @@b 88P@:{X@,` P 0 @(  88P@x@`  $80  (0@@,0  @@ ) I@$@@@* 4(   `0@@X4HA@  @`ƒ(PA @@ 4@ $X h A 00A ` @@ P@ PA8p` A@Oz @| /  $hP@ (`E0@@G 4HA& ` @(6oSO : `)ӦK P` Ȫ5PAf@@P  `@  (  @P@  Ye.c,  @N'X  PM' \ O|@  }:cϞ(@0@ 0`@/?@ 8`A  &P0/(#A )r@I P)@K 03p)0h0@ "= 0U@UUdk׮ ;lYgѦ-;` @w   , P<@@cǏL`0g@0 `@0@@ @@0` @$On@s>}@ $X  o` `@{?_@} `8` `"@hH@)`IXi0)@ ɳ@ (@tHX*ӦJ0@@;  `[ 0@5_0#P $8Ѐ $X` iRz0@0@ >\  @ N O0 _~_ ` A PC$NXQŋ4n(@D4( 0 ̤٠80PS $h`,дJUUYn+ĎK@Y `@̥+`@y ;@ L ( P4g ( `ԩU `@   t@0@@L@ 7`A `` ^{P@ ` B@ࡀ@cF$ @*% 4@0@0@`P ,XA (8`N%`,H0`"h`A@ `  0@A ` @hN@@ 4(   @(O@z 4HA @ A '@ 0h P P` (0,`0 @  pP@0K@ P@$`P` (`,H`(0@ y 00 6x ` @  (`  0_ @  @ X`@ *HA`  X`  @$I`  `0@ p5 `  PA,8A @A (` @` ` 8L@ x< L@$@ 0@@@ @ @@P t .` PP`@ `z$H(h A8 ` B Pp`\  A  @@J\ (@ 8p08`A 4h`0h@Az e 0@ 0@  @/$HР 0` ` @\A 0`@$`P  @`@]  ( @  `@  (0@v@ x (@=ܻ@0 p  $ ` @

@F PNBJ`*0 @`@ 4` P `@(0`@- †xƎCv\``Όـ z4Nz5^P@o3ȭ[(P`8q #@0@ ( u֯c0@w/`<ϛ^P 48` 20 @A(pP`@0ШQ0r0 9@M6 @ ZG @@@ 0 `pk (@@ E@o*@P@~ ,`# ` @  3@Pt   P6m48 (0@0}0 `@y 0@@{7@0 @`  `  @h4 ,8РdIR*`K bʌ͛ @@O `QtP 0 `%  X[`% `@x @_ 0#"G@̹ @`RN@@ ؽ[߿ '`8xp 3P@ 7h ((0@ҫ_~?_?`@ ,P ,dp! 0 @((0@(P` PA1@ӧ  `.U@(@P@l0WaŎ `(@(@W @$8Ѐ  (0@@y PU (@0@@ '^x(`@ѣN(@@@@,8@4H @ A0@@ 0 0@D $P0@6rܸ ,h@0`2 `: @`A  P @@,Yʖ- L>  N>@ ^F @ `o(@P` O\@>`_} ~<ϣ?O @ `>}  @"$  0 @@G @$'Q r9Si` 8  @iS00 (P`_ 0`00w лW@$N\q `0c.y@g@Ӧ u`0{ `@߾ 0@@q Pys>ױ о] 0~ ,Hp}0P0|#@ 0 @H@h G0I(\90@@8  0(]*jXb%U`@ ʕ;@k ,a ,H@ (̙g @Rkb -`mr[>(H>}g'` P` {/PA_@`!   @IT,HP3 D PԨ ( SQ P(@P@W(P`i v۷ [  `0(@0@c0@ @0@0@@0`t` A  `^@ ( @ٳ   @' A  `>7  p`A 4(@ (@0  @@ 0(@  `,X h A(JR0@  :@ @ ,h@\  ` 4Hp<@ 0 &` @6   `P @ ` (HA `@ @`,H0P@/(p @   X@, 4  @  `$P  `@(H@t` @ @@ PP `@@b$p  ` @(P`@P@իU @ p{ 8H <$x @(P  ` `@0@PP`".bDP`#ǎ0 @˖-Tni@ *tPF ``N (A$H  @,x`A0`] ȫwo^~ ,x0Hxb `/c\`Ξ?(P`@@_F [vڶk#=@@ AƋ#@`9C>`z`^`޿ yHo 4hp`~4PP`p F8  `@@0d Pe/_ `p gO  0@&-(jЪu@-P`@ P(@ (PA_  (@Af 0y@˖dP=@ ׮,H@h@o  @ $' 9s0} 0;w ?^|(0`0  00`@ @  Ǐ CD@@%b"IA `ϟ>0( @(]Z逧J0@0k(H`A $h@@ 4X  `_ LXÈ(0ǐ#K,r1 yB]tX=`@  ] 0 (PP hW{ AҫOA@ (A @A `@,8p`Al `@`P@)U   (0@(P Jt @PL0(@P` PVY PA (-0@@ 8 Pp`A 0@ (0@ Pi ,Xp@A0P[A ' `@0`@ٳ08$`0  4XA7` 0`@ 4@ ,X `F@ 0A   ` `( 4@  ,X ` <0X`  0` @`@pyA6 `@f  ;80y,8@p'` x`@(` H@ `  ` @ (0@ 0@ X`P 0 @(s 0@ X@,  ` @ 0@( `%P ^Р P0  00x(` @n m  @ A   @  `0@@N@ h A  z 0A  @ $   P(`@A@@(0@ Y@ S 4x@P@@5j @V |6``  @. pAX0 (0@b(P, y<Zhz@  (0@l]  \N`@խ_] |/0@͟G~ ~ (PA,P`"$``!Æ @ @4@0@ 4x`4@`%˖.0@Mn̩s> t(ѢF H*`S  u`vΞ  ;`nv[`/_~ († 3@P`1Ǝ\`eL`Ν6 Zt x m@ >0 o 7@HnN@ `}  ^ H?@{(0`> @(0` 0 00 @E0и#0@P,A/aD0A7qDgO0@QG $Uj@B 0@8x`@ P @  @ + 0p0q)2d(PA._ n0@`> @ @@@J`*` ` (0`-0 %w/~  0`1 ,9r` `3@`FP @ .@ @`ΟC^`0 `@W _   0q" Ш 028Pe `$@@O%hPTO(0jUd ` `@Yg0+`@0@@ @0 P1!G,@˖d,`@ @+@P V A0@v нn>@q$7  n@{0@y'@ 0~} ?`0P`! ŋ @`(@0 @&(P` (AH(@pժ  P0@@@  @  _(  P` 4Hh̙ ( i @P`(@r @@ P`H>} @(@0@ @  ` $`P@0` h A  PA PA )U\@  ` $hP@ 0HA( A ` 0` P $Xp@  `y ( A@@    $h`0` `4 ( A & A ` $hP@0 <@(HA @ @@$P@ $ @ @4x"Ƌ 1 0P  $@` @8p H(0@@00@8p HA0  (<@ P0 28p@0  P @@A @'(  H@@@A @@`$  @@8 H@0  $(g 880 @80 S @@A 0  X` ` @ @A(@@0 3 @(H@ 0P0 A @@@r  $HРh 0@ h@|( 0 0(@ @$HР ` 0PA r 3 0(@ 4@ $HР h A  PA 0 d8;@0@ ,h`0@@`4X @ AY@ `x ;v (0@ ]`0@<=: nvPA  0` @  P 0\Ę1@@ ( J (P5S=   @R<:  @@ @X րmݾW -0` 7 Xbƍ0`dʓ \&9<{6hҥM@@\ [ll [| \p@\r͝+@ @O@G~' @O@0  L ` ` 0 .] 36 S~ 5SN j50`M[ ww_ 0@ y@ ـΝ  z {[~ PƏ Λn``'`{ @yΟ7`} ` }'`` @  ! H10` @G@9'O @@. @0`? P$% ` 0jUWf:;VPoƅ+@]wk@߾6@paÇ P,@c0re˗1gּ0tiӧOPM  @p  xq$y(`ױg`߿?@}{ P0@@@ `0C" @" ȱǏ ChR Xr  @i @@  `0@@P4HX `@P  ݻ 5_ 6@ 0HAH6@  A@  `b @$H0@q+_μЗ @N@@ 4@   `{@ 0 `@(H@ @ 8@   x`1e4P3 03O@@ `0@ $p @0@  `  8H `a/fcȑP@l& A @@i 0m  @@@$@@L' `l7@@p g={oH0@  `  8H@$   ` @@A `N @B-j(R ` @   ુ `V ֭ ` ^ 0 0@ఁ  l 0(@ ТG6`@0`@ 4(@ 6@ 0HA( A `@0`@ 4(@hO@ӯo>~ @$ @  !pQ@F1#G0@eJX@fLԴI@N;y `5z46 `S  ` (0@Xc P  0k@^P@6lX4vrdɓ);6@@y  p5  p[x7~q 0`Wn@xɗ7O@zطwO@׷ 0 <0a x8@ĉX ƍx$A TR+d@ؼ gN 48p  >0@h $@B>4 \$@@|@ @i@J 4@@5mN=}@@E `@ UUUV[ VXe͞EVZ u0@@X`Xƍ<@@2YsZhң@j[ & @||pG\r͝?\7@@v (0x @P@ݿ@@DP`"DX B(1A/Z4@@4 R$N `%^,@An̩s'Ϟ> `0@0HA( A0@@m @5@  ` $h?.ʖ/cΜ@Ξ; @M ``j  @& .|8Ə#O|9(@A 0@@}` @@A(cG9dI'J`0 i0 G PF:jUWf 0@ $p @0@ 0 @@0@ $p @ Pu`ǖ=v֝ۀ7@$7@@P?|yѧW 0@$HР( A0@@2  i@ 4(@ @$HР8s,p@ **Mj H5@X  @0`@p`ʝKݻx 0@ ( Ph̹Ϡ Mz@5 (0s.p ~@ȏ `K@^Oӫ_@0`7@$HЀ  C `El@!C8I)U

:5~:j06@$p @0@ ^ 8o$@@ `@Dx@ 6,pDQF p% $p`P@ TPEE@>uU \5@@] k@ 0(@ $H`00  ( A @0@L6=֭Y(@l 4H A0 A  @@t(@vݽ^x@}0?> _  A (0@ Ŋ P>~4 r&O,p˖,  s̉@>4@`@ 0   `E0@W0@fϢMv-۶n8`.ݹ  x0†#>,@lʖ Ȭ9Ξ  z H@^~}@ڶm ~' `8ƇHN @Ο;7 `@Ȯ};޿( O߻OP@7 ` `@@0 Q@ǎ @@ Pr/a P7m.`PgO :T&MjO 0W 0`0v(m[;n]w杫@@8pa \ $W`ϡ??P @u 0{0|  }{( @pH:80 Ç @" hǎBIɓ% ˗/ @ɳϟ JH  ` SJUP ׯ^ $@ٳhӪ][6Ap-pݻv0o &@È  L2h޼Y iXͺװ@m @P@ @(_μH.@سkν@<_>A0@0@ PР0` 0(@ `0P `@1 YfOP$HРQ0HA@  @m ̥[]yMP _ Pp `؀ P90s ` i`@ &  80-z4ҦE ֭ AP  ` (`9.=cϮ};@ϛ/p0  ```8 HA ` @G@@ `@K @@8p?:hQB  @ : 00@ 0l<`P @[m 0ջo_=o7н;P>`o{ @@} @@@(hB0dh!D  70@ (I@* R)`N B `Р hj@@ 0@Z8+د (k,ڴj ЭKzM@ 0`0q&O6`̚p@F0@  `۶u A`8hn@@(``](hp@(P  @ @' @ 8bD xcF 4Y+YL@hִIgNx hPC5p(pjS (@50` 2hpn H{H@     ,` (th0}XvvԶ]@y.p@p `@@pN@SP0@| `p(0@ (0@ `P@ `:z, J6hp ʔ Z&8p 4PP@ @@P`L h@ZZ\( رd˚-pڵj7.ؽk@H`0   PA L x@h@0@` 0  `0  00@A00h`A Pp`A8A A  0` @8x@98@H @RJ- Sfy=}<0$(`  ` HA @@@+ W @@8p H 0``0 88@`@ $`0  $h4(@ 8H@@$p A XA̟7_(@|/p~,` H04p  ` 1@ 02@@  >j$@`  Huk@4x@` @$x4X 8H`,` P `Az @oέ{w~}@Ƌ8`9 @`  PA ~z`~0` (A 0 4(@@E0f `@PP 7@@@_@ `*`0PPE0` P dA 0`t P@ 0@:` 4H`A (0@a 0l(0P(_ \/fL<@5g.pgП0i$`ݚ5̦m`uν'XP<,gn`ѣ/X`ٳ/ޠ0@ 8P߾  ( @ 0!P$` Fp$` FY*S(%̘2g,pΜ8-J@J*-pR(*֫8+ذb(,ڳh-\ k.޺ $ (l@Ċ3n&S\̚3(3ТG.pЮM@w.` 0o9 nzs{Ɠ/oֳ_`@ӯo>`$x 6tСTX@9n,p@H!p t2A3i,@N;y@CHiRK&(jTS8kVlXcɖ P @Zi Ե{o^&\ŋ(rd|r8w\ ѣI6}@Y.@lٳiNP @nݻyp@p pyr˙7w@ӥ8{v|xpw߾?0 @~ 0!8|1ĉ:zJ@)8@F RH%I(J+Sfy3A|4P E&(` R $UTU:8P@] H@Xe&(` Zm0Pu:80 ^}Xp 6\ƍ/`P@dʕ-_ffΛZtF}z]flڳ0([wn \8p @@;P_Ǟ;̛Opܿ /0~, p` 8`!Å$8 @/bx ,p`$ɑ H2e^|`A6o&XϞ<,Hp`( Ht)S (0UȪ@ +vlX H{ n߶mݺ0`/߾~ Pp`0†Hp`q;.pʖ/cάys ONz5֮O'(`  p`7޾. H|9p`:֯W/`;/~<ϣ@8`>ϯ?8P&TaC&bE1f,@GAY @I% peK/aƔ9ԙ?:hQGiS:jUWf`@_+@ЦUƅ[wջo߻ P @e˕ sgϟAQVu`ǖ=p] ߿>x P\yG>zuױG?P @w 0|yѧWO>AǗ?׿(@*\ȰÇ @"hȱǏ Cx`@(OH˗0cʜIeɳOJѣF XtiJJիX&(׮KٳhӪ]Kpݻx˷LX̸ǎ Lyh̹ϠCpp`@ӨO8װc˞M @Nȓpp`@УK>@hνw/^ӫ_Ͼ@>Ͽ$XP ,d`%F\@4jDG!E$Y$Hd%KYt<`Au H `ڔ L-0UYnu@0Y`[q]]w,o_  \@/fcȎ\`4oy$8PtTPdϖAܹ!! NETSCAPE2.0,+1888FFF'''TTTgggwwwŇh@ (Ç#JPb qcB `A(ShK `͛60('O *tH*E:@*UZ`@ KvҪMk@p (@ݻxPo L` (^̸ǐ#/V ˖ 3 Pti ^} bˎ`As'X߾,Hp+_\УCH(XϾg@@p$XA CXblhD$YI)Upp`@1a8M9u

P@ H8ʗ3o9PN]s}Ɠ_׳o=(>   4xa4tذ)N

P @hѣC8uj$8@i׶} ,pxp 0~x7g~@ӥ Pp{v۹wמ@ 8py p@P0!8|*Hp ƍ$8@l3^ɔ+[`͜7( ѡ :5 x ;ٲ H   w/~@̛;= $=; @?>z x}ۯ@@(B QĈ<~RDy@-],pL3SN=}sE=0 RK$UTU(@V̞EV@uޭ[}@`… pbƋYr\|@=ZhҞZuz@mƝ[|]ʼn@r͝?pt]̟G^@/p~,` "LB|x`@+8`#ǎ?

P ʖ/c\Ξ;(`4ң z -{6ڴ 8`7 .P @gϟA=V@apнwo0$W@ϡG>zg~@{/p@y}{8~} п_(*\Ȱ"J8@/Hǎ Ir$R\28@&ܩ@=P ѣH*]ZP(իU +KٳXvʍ[x߿  (f ǎ $@2h޼BMz@ `׮@6ޭ@ Nx+O~@У?/p8 X~}ˏ@Ͽx`@ HC XE c$9)U

Ph,eSZnZa&@` Y̥֭kup(8xР%Pe̘s&=U>P kرeϦ]ܹq(o Px,gs^o^/P @`/@  P@ h$p  @  ` ʔ0%LivYB((ҤJ2-pԨP`*Vƒ-k,m@r-p޼x4(@ `(0@ P0 `f 0 Vh -@ (P`P00ҧK?P /o<hӯ??P` 4x .

x@&K8`%˕ )s&͚6 s *h"=z@NB*VZ=P ׮\  v 0@n+w.ݺv-P`, x N;>P ʖ/c\Ξ;(`4ң z-{6ȭ;~]Ƌ/`0s ]u_/@/@ PA /`  8`A (`(bEиQ@9dT@/a|Y7m(` @O?jG=P @SM 0 0 @ 0A   `  0$H0` @(0@P &Pa>P @m۵  >xq 8ys >dמ@?|ЧG@8~}  (0  $P0@ `@(H  @ (P`0@ `@0) JujZ`(ٳhӪ-p۷n@]w L(^@#C.p˖0@ g(0  $P0@ `@(H  @ (P`0@ `@0= O_p`@ .dp%F

0 iԩUf=رa(mܶ w '^q`ޜO^ٱ/`0w  (@̟/@@@$(ࠀ 0@D&R`qp  (iV\Y2c&Μ:wpР@`(RhiPj*֫ $-Kjת]`ҭk뗯.l0  @@ PL@7k.pР04W6P زc(6ܷ  /n8 hS^ڳ/P0@  `o/ _@ 0h@„2,)R,PA0XdH 0ydXdA3iִy;y

P p \r͝?@խ_^ ݽ^ @}ܿw0 (X @  `$P0@I0@`@P0@F hӦL u `ͪu+׮^fMP ٲfH`-۶n+m[~.`PX `,8` `X^0 @~ P  0` (`֫(`;/~<ϣ@߷/ϯ8P`&DA0q0@P0APPR@(P7 ) 0T (0@O fz@_HlYgѦUlƕ wջo_880 @aÅ  Ǒ'Wyszu(8{w]џ/p@{(@ P @A @Ç  @E @Ǐ  @@ɓ(P  @&$'*TH*]ʴӧI@U (`ÊK @p8ݺ w A(` Hh`@ S 0`{ n@ (УKPz νËO{ҫO@8  $8@ &,pCPbl@!E,pI'K1eΤYM9u,pO? Ph ,e4AQF-UWk %;6Aiզ-[oPn@&\aĉ/fرb\4o\ СA'(i`ݚudϖ] ܹq'(o ^x/W>ѡ(` uٵowŏ'է?P { P~翿x@ 8!ć hb6rx@"C8$ʓ h%̘2gҬi&Μ:o8'П (jh2]z@R8*֫ kƒ{@j8-ܷ kn{`@.l0Ċ3nx&S|`@̚3H3 (mtV^@زcH6 w@ʓ89n:ڷs;8<h}ӟ@H $(aBpa(VX 5&(dH0yXtfL3iִygΚ $5ZK.=P @TQ ptڵcɎ=P @Zi Ե[{MP@ 6|qbŊ 4vrdɓ)W`͛5'@` @ `uj 0v 0Hw 0` @hy 7(@@t4X A 4`|x0طw~|?p? lx0 ɔ# ,`͜ x :tK8= x]`(0  Pċ?<̛;zP@AP0  >  @0؀ (@ (q@ P@9-]SL5męSΝ  (  0@ `,8` Kx  @ A (x 0@00@ \ƜYfΝ=ZhҥK@0(` 8H@,  0@9 P  0((00 ` 8p@A (@  p "Lp!ÆBX@,` P 0@   8X`,` (@ @ P((P@ ``+w.ݺvͫw/߾}(0A  @` P0$H> ` @ A P ((A P$H(@0@,};޿/~<ϣG@(@P` PA P 0DX P  (0 ( @P`(Љ` :hQG&UiSOBM`d՚U@W0v@Ygў-o;.w    @@cǏ!G@@w0^PA0_@ 0@08@$X@3.ȱ BI \ b8 `@ 0`@ʠ(H"X@ (@@Xhժ@`ÂE@h (0@[@+ @X P! ` ` iX= 0s+`@(Pȓ+Xs Gg@hgw (O~<0 @ X`aC(0E1 (`G!E IrI@Ad YM9 IOA @P,eڴNZUY 0W(P@P5Px (P` 0@,fl \ٲ0@D -`i PAP[ܸ  (P PL'`:ٳ ` _~0@{ @}@?@ (h0lh'hF `@ @0@$` `P@ 08p05  j* j@0@@ h`A   ` 4@0@b0` 4H` @   @@l 0`6@8 hn =0| ` 0@ (x   @@ 8p HAX ` @0gN4( ` @0@A(pu0@ @0 0P 0 `(@A4nl `l HA@@  @0@0` `T7@@,@(` H@Pp 0`@$P  @@xр`@0   9@  @ H`X5@ p@ (@ @(( @  00 `$` ` @(0@ P0@` `0 ` Xp h`A  A  @ $h@H@DP `@0` @`0@ @ $h@4@0H(@0  ֭|%@X   ` 4@0@0@@ `@\  =@ $@@ `  |@| ]   @v @x~ܻ_(@P` pA HX` 8`   @HI@.)`6ȩs @ t逦@:` `W^  `fϢ5; `.ݺv;@߾~<` NC,y`άY>  N4Aȭ{@  \ |9sΟ.}zt֯cϮ/~`  0  @!!F0b-(#? 9r@0@@.Č9` `@F$5  hAdP  `P+` 00`(0'>`УK>` (@0@  <ҫ@ȟO  0@(@P@(P PA (@0`@ 0` $г `h ,UA,xA @a ԮU;`[w  / 0/P @ 8&`@dA ͛ ' A  `ѡ/P0  @ $h@4X@ A``@ 0`  04@@D0 0(0`@ $( 0A  &:0@  `R  S $hP@Z 0@@0` h A` X@0  @ @ @@( AgN`,P  @(X ` @(` @ `` 4P $X X`H@ `0 $` @h    pT 8H   0.p H@(H$p 8 ` 0`@,P   H00;h@@,X@X`H@  ` @ xH@X$ A @@H 0 0 &p  h  @@R 0  $hPX0@@Z4H@ 0H@ A A  @ $h@8@@լW0@  0  A 4h PA  ;0@ 0   $hP@ h ` ( A\ @`%M@)@\@ @'|@(X@R  P@\P  `@  (0@(P Pl@ (b38p ,pAL&@@\-@l=ō?N@   ݽs^0@  @L`  @@C qŊ.^Q> @ɒ `^ `@(`A>0P } ȯ_ 8PPH@ 8@@E# '`/)@6 ,0g0 )SOZjժ `00`o+wлw/ (0Æ(`xq '8Ѐ0Ь-`@iPPz@н >0@  `@@w߻?@P(@0@O@h@ Ç"F@2 @G C0(S2X٠/48@@7 (*`G(tSJJիR kWŠ0@ XV  (0][(@Aнw>|@'WG>:ױg;@@A@0   @@,@" @B@䀓\r00  ((0 ~|  8@@D@ @8`<~$`@$%RJ\@@ y3 tPE4j T$X A$` e@- `\u @^ XF<`;Y \.0@fΝ=\ҥK: @ @ p@<;|' @ @^=  $8p T *H  ` E@`F@ K0`&M6o00@@E -0`R  `UUkev-۶v;`~ 0„ x1cC y2ʖ `s$XA ,Hp ^V`6@ .|0@@N@`.`_`~}޿@_ ` @A$T(`@C! 0"E  `@ǎ )dI ` @K- 0fM7mй? ``AG$X`A  P0 к@׮ v@Yg PV@[;ջw<ÇPX@  P@0gּY (0ӧP=5k0`q&  @$O>0`@u00@A$`  (P0@ (HP(@P`(P` h `B @d  (0@ `M P@  P@h  @@@ 4@0@  00 `@< (& `c  2$HР 0   Tn{0P0@0H ` @@(@P`X8 ;( $ 89 j,@Y 8T (5U x-0 d˚=[A0X ܸ 0[` &l 0    $pA0@ jx ض= ݼ{ (P@@h`$Pa (( @E  @G @@IP(`(@ h 0 `@0@iS @@f%  @@@g @@@0.(@P` PA (@D,@ P` 0@X @ =@@ P@ϡ?70.@ 4`  ` ` 0$x    8pp `pBi$h A@M  :@H X*@ * @0$H 8`A +@w P 0@,`0  ( @@P`c&PA 0  0P  @ h(?P@$p A @@,4@A `E0@ `0 d ` @t  0`@$P0 @ ` P 0 ` @ @P@ (0@̙1P`  @$(@  ` HA0xX  `0  8HP@ H@ o  (P` 00@` H  @`,P0`@ (j  (0` PP`X  0h+`@ `_ 0@0@0y   (4(` 8H `   @t  PA x  h?@`  $H4xAPA @`@ 0@ P Y` (@Kpt @V[ j  %0u@@^ A  @$P0@dA8wY@ pX& x=/A   @ 0P@v 0@@0?(P~@8H…0ĉ+J4 x    <` @jڼ3'zI@D5*`ҥ80 TVP@\((0 ر"@ x 7.t 0 .x  `+S@f x&@    @j0@@ { 8(0 :0 x'>< 8 x/` _ 8`Dxp<0 Q 0H  0 - (0@={@ @M UVU0@0`X0@@ `    8 ,P` d `@|&@h&@u\ m(P`n|(0@@@ . (0@v@P_|߷_@0@ HpaB @A.b  r$& HreJ^)M4 j N6 ժ`%@^0`,ٲf H;`n ;@ݺ0@_,8  @`.0@?P   `l `޾{/P@ q0`@ @P@(P` (@  @`A (A Pd$0 9@PP9@Ĕ99@@O> @0@D*@4@@$HPK@@۶$H h AL@, @e ` A PA 0@ 0` @$8` h ( 0` n@ 0(@ $H` A  P` $h@0@@G 4HA @ A @0x`P @ @ H@$ @ $@. H@  $(` @8pp@$ @0@ n$@@ @8p H @ (P`@ 8H@0  @ @@A @d`  @@ 8p HA @ HW P6(p`A 0  8H@$ AHA4p0@ `m$@@ @ H  @ (P`0@ @0  P @@$@ 0`@ 4(   @ 4HA ( AB X(ң 4 A@@ 0  $`P@ 4HA` @0@P6@  ` $hP 4HeM`@0` @`h.P'   ` $hP@@ @@  P `@ p"8@@H!( + P P0@@@ ` ( (0[ (cɖ-+pK`@ p  (0p`6<@@b3.@l9P0pZ }wnݻy0@'˙H@ 0p;v۹wȗ'`}zطw޽׷p@ px1D*V1ƍ:J @ x I@  ` (85*T `V0 % m @@ K@     * Lf @@  @  lj[ݼ 6@<90@ ~}@0 |?/`' @ۯ?`(@0 ~ 0@$Ta @1fԸcGA~| LI@&pԹgOJ@G @iSD*WfպkgPVo ;wK  @ 80  @g00u`=lp-'x$'` >}zg`A'X@yz   п @*\ȰÇ#Jdŋ0( G  `dI ` $@Mr$ @@J( `J%` իW + +hӢ=P ۷n @ _ @ x"KL˘3k6P Ϡ?/`P@QXͺkȞMmrM@ .q XΜyKس(@8x q0@x :ѤC @ ի ~:ٴ ;7  @/~@̙ [' ܳN  P }ڻ? /0@X (` @D \4@0%M0@@-|I `={0@P@>u`U(@֭6e @@.u(P@@}Pp@`… Fx?v\ʕ)'@` f=w&Zh @\6;76p \<_Oݹ(@> ?Ǐ@ p Lp!Æpp`@+8`#Ǎ  ɒ% Lr%˖.W @`&͚6m0`'Ϟ*t(ѢFtRN @@u+׮%`,Hv-۶nU@v8`/߽ 0` NƎC&`@`3 z4Hm`_.pڶo}@޾0 HN` `: Ȯ=@/~<'(`=/? 0"4 DH0HA  ` @@I7 йsg:hQi$HРW0HA_ `  o-@]wջ^@@ǎ  @  P @@8p070 0G^ױg׾@P ~ `0@`@@`(\ȰÇ#.

USՀ]ࠁ 0P0@- [}(@`… .pbƋYr\|8 ( `A `0@ $p \7  0P ^zݿ@@ 8@A q )r$ɒ$ 8`%˕ )3fny $`0@`N0HA( A @5@  `] `  $`0@†#Nx1c ,Y4@P@A 4X@_8`6 ȭ{7޾  | OΟ;OP ``;0@@  ` ( O@@@`A 0@ 8bE1fh@?P dP@ (Aй?

P ѤK>]լW( (8A< 0HA[n 0@0ހ $`P@$HР @@ x 4H (P(h  ``A X@  P @@4(@\z@]~Vl̞5{@m8@\ 0 l   0` d,_l= Z@@ P P H@,Hp 0hp  /x A#(  P(`@,PH:

P | P}{ W^= +``> ` P@ 4P(`@Ad0  @` t 48`  (P`? j@ P `@@gѦUmƅ{@w8o_ 0 $V G60A˗1[^ysϟ,P60A׮,x`A۶nP  @@@@@ >A@00>@ P> 0߀ ?Hp*\ȰH(@3b,pǏ@$XbʌY8sɓ ZH*Ez@PJ}j@Xb=P@ KٳhӪ Pp(ݻx-p߿~@0(^@#C.˖3 M Xzub˞M[vr[ ~`@ȓ+_μsN}hν @<_?P $?  X`.dL8@5n1A!E$)r)U<0 K1eΤY&@A%Zh.Uz@Q8U ڕkĎ@iH[q=P ]w $_~PaĆqL\e̙5c.pgП PiԩU8k ]vt}`@8q`ޜO^l}ŏ'/կg@OP }?(p„ !Ĉ'8"Ƌ cFy`@*S 8̘`M'РA `Q0miPjj p5Abǒ-k,ڴg Эk.޼\Ċ1l6s<ТG.m:Wpزg>0 ܺw`8ʗ3oҧKOP@ڷs@Ɠ@8= ` `4h@ 6t x@8vc4ye8ԴygN;y,p@PA0(piRK2XjT zjv庀Ac2XmZ p-ֵ{ {(P7vx)WLA7'8p@I6MڀXPvlٳg}yv 0~y 4?`өO?P @v w 0>طg`A'X@~_A 4 $Xĉ+Nt 2 \8x 9ɔ+[|@͜78 ѤK>:~z@k۾;ݵ <ċH ̛3=zX=ܻpp@8 ۻ?ؿo@@@ D(0 >1 \ĘQF<~,pH%MDR%5męSN=m(@P@TRM>Mz`@U^Ś@]~le $VZmݾ6Au-p^}X` @q?Ydʕ'(@fΝ=phҥM6@ [lڵmNP n޻ \pōG\?w> խ_Ǟ] ^xH@zݷ_~ǟ_~LP  p!ÆB(q.b8 ? )r$I Hr%˖.$ s&͚6kȩs~ *t(ѢF880 ӦL  u*ժVbͪuj k΢Mv-۶n880 ݺvk,xp Pp`1ƎC,.c\Ξ?-ztg H:^~A ƍ޾.|8q H|9s ( }z `~ `AHހP`>? 0`APaC!*\@E,EF 9@PTeK,Y`pԹ3$80th"PFAW!! NETSCAPE2.0,+\888FFF'''TTTgggwwwŇX*\ȰC Hqb2j̸ @rR(@P`80g(@P`Q HZ غU`0Xٲ XvmʝKݻx(߿} pÈ+^H,3c^` 0`@0@`k4X&` @`>@} 4@0@XOˏ@8$XA(C PE5nh@!E,pI'0` K(0@ $P0@@@(HA` @(0@ 0@ X`З@ &<@'.pcȑ%O\2lysD&]iԩG'(k]m@0  P 0@  @ H` `0  @  `0$P'J

@@ٳe8wn  @@@(`p0(`p0(`p ^ PA~  P@P… 1"D X1ƍ;^T ȑ$E0 | 3̙4Y`zYD&@` Ҥ$X5j 5$X6l 6$X7n 07 ] FŊ92d\`@͜;{ : ` լ[~ ;ٮ ;7ċ?P =:Xnܻpp@8  x}ۯ@@@ DPB 2,pD Qc |1A%M,J+Sf y3A=},PCTi<@U^ŚUV]~VW@ܾu[ u&(@^p 6\ ƍ'(@ds<<ҥI(` j֭][lڵmM}>P p \y<խW?P v ^|Gݷ?P | _ p "Lp!Æ.pŊq @&O,p˖, s̉@>,pѢDt@ Vbͪu+׮^ +v,Mnߺ-ݺtw  8A.ƌ y `Ό9A?{pҤ z5֮_Î-{6ڶop޼  | OAϛ/ Ϗ8`A&TaC(@E@'Q,p@K-0ԙ@?,p@QED5AfպkW_-0lYgѦU-ƅw0PA6(`@ ( Ǐ4(@  PA @/ݠ 60 `/XР۷mHwo >xqǑ'W@G>zuױHp ?^| `(P>  @@ @ ( @( hd9@A d@A0a A8st JѣH*]z JJիXjͺ@@ٳd0۷m ȝK. 0@(p ( P˘3k̹ϠCMtP@AP0  8(0 0@P`(^`  `y(@` (  Ͽ$XA .dC PA `@0(@ ,Xp1 P 0H`A  PAP`$H (@ @,[qΥ[]y{X@$p  P 0@  `,`0 8p@A     00ٵowŏ'_  (p 0 @0`@ 8p@(XA(` PP(` @,`(ҤJ2m)ԨRR@ $h@X@ A`W 0@A ( @@,8( A (@زgӮm6ܺw @P  `@  (0w/_ P  (0P @P` P,pcF9vdH#I,@ pҥԴ9@;yPhC0zK @ p `Р$pmZkٶus$XpwA$Hp`$8p A$pxAdɓ$Hpsf ,yA @@@ `hpݺ0`@/pA0@@Tp t'@@ 08@$X~/ p L  8L P xD H$(8J 0`@ؼ gN  ' =A6 0 kV\ U=kڵ% |K@` (`(`9 (@ (`:ѣ6 uj(x l jVݼw#(0  ̛;>@ԫ} x @0@ۻ^|ۿ(@  @ >d(DQ @%M `J-]SKI @  `  ҥ 5 @(0@e  mݾ5@@ `^} ,`@  (0@;y@  @ z@0@@ & @ 6@|<8 @\݀Nݽ0 7@@z _@ hpA$P 0@` @4@`   `0& `^ŒI@n0` 0@,X `A   Y  0@`0 `@ 8 `  `p>6`0`u ` @@   @ 4 @A @0@@$p @( @@0@ (0@  @ H@@ `@@M,` ` @0@@ 0@0 060  @ @] A @@$& `D@@0:  ` 8@(X@ @ @@,P  @0 0|  (0@  @ H@ `@G$`R( PЀA (0` ` @0@A( @0 `@ ` @(@@ (0`0@ p @@ 4@0@0@@4X@`AH   @    ` 4@0@0`4H$0  00A (@0`1Pt0  `4H @0@Pv 0  `0@@ 8   (P` @@g(P Pe0@u&0 P@@ .lP Oy ({ 4`0@@  0 ! 0@ȐF`䀔 @@2$@@ `J2M:RRjꀬW (k,ڴ -\k.^K@@ 4(܀0@A(@6yТ.=4n5f`6;  r  `P` @p xƓ//`׫^|`0` pP0b( (@F h@@ 48 0 X@,` P 0 @(  88P@ N@ H (`  `_w  P  ` 0`0@@ H@h @d@@$ A `di @ J@$% A @@@U0@pp U68@(X ` 0`@,P @8pp@ϟ=00@` @ H@o  P   0`0@@ `@@y$ 7  ` @$ A `H,p AH IRPA  @@  $P0@*M@ ,8@4H@` A  `  P ߿~ @ (A(@ $x ( A  [N@ 4(  H0  ;$HР0  @ _@@A`!  `4nԸ@(@P@I(P@@P `   PU@ jeU 4` 8p P`y w <ĉ(A$O&@@e̙30 @@i0 kخP{m{ '>@ Ps(@lн?y @{0P}($ؠ  hA4@07nQȐ"E()$ʔ*WlR$@@Μ:  `-*h:)Ԩ ` pʕ % ` @0`z@0p h0h` $| F3hp4 @@f`[ܺ0@  r |S@  (/ @o/|Ч_~ @ P@ 6  Thq  `@Hpr 03i$`@ 0@PC(0iR $pzAԨ T`[t*`@X0{v@{{ 0@  `@@f͛3.@ vz@lٲpm[Ép p.@  ` 3P<70  (P`@|/`P@ 0… :LH)1`@ȑ PA,[ x9`@(`S P (0`5T (`\ `@  ( l۲%`@ @A h@ 8܀ xA  @:wzh zj; ;n@ @ z[' {  ` 4@0 }  0X 00@@-  @$ @% 4@ 0@@N J $x (`p` 0`Р(@0K@0` ` ( A0@ M@@ 4(@$H`;|    0P` @0X@ @0@0XA @ @@$@  ` &8A (80h@ (P` 5@@S0@` ` H@k @   L@$@@ @ 8pp0`f0@(P` 8p@(X@ (0@ ` `0@   8H@ `0 0hp  (PA<8A `@2`0 $` @@@$% A @@@U ` `@@Y$p P0`0@@ÆX ` @ A0 A  z5  @۷o >@ 9 4(   @PA $X A `p` 0h@A PXH@C0@0`  `( @ A@0@@ J@ 4(@@qм LN}0'/@ԯ' (8`A 3P$XA(`&NlpF$9$  @0@N9`@ Rh $H 0+X  `Zj ֭`wz`08`a0&S.P`f3&0@,8Ѐl ]ܺq+`Рh 0@ 0}  @0@ _@   `@ 4T"D  0cF9v8dHH$9eJX@ ԴY3x 9hPpK0   rUAXc0[ $X A{o^ 6|q 4vx@(WLA @0 p- p{ݻu 8@(Xzt  0tNp @P@` (`A (@a:,`P@:@J" (@0@̙s  @@ (0`:-* (@P k P`  0 A  @ ,h`8L@0`*h ,:4  ``AxM  @@  `@;Xp Ѐܹ @7 @  s . >@ /`yԯW?`@ `_` ` hX`D`Ѣ QȐ"E@@ hٲЬiSv9`B `0%N50A 48`0`,-0@zW`x XȒP` `F.`zj0@@ز `6@@`ʗ/@P^s>`/O׳0{ ?@~0`0H  ,p@ ("xb#IpR@JX3is@N;w 9hPC 0zK4mJ@  vu@X0[`@Z0@{W @  p3  8` (@ZAl.@A@{ÉP   p} 0 0o  `0(P   P (0` 0@$Hj0`<  `4iR0T0`"h A  @l Pp8 P@A 0@    ` @ ,Hٳ M@0@`p4X `   `  ( (P` XA `@B$p  ` @ @P@@0@-Y@ P`0@ M  (`  $8@$h0,@ 0 `$` P @ P`0@ @0     `0@ xP@}0 @>8p` @(P`@P@+0@ 00 ` 6mș@  4(` @$H`@<8P$@  `@(H `  ` 00 ` @0    0`0@ pA H@ 0@ `0 @@@~`@ A 0qc  8 A 00A ` @p  @0A  @ $h@@ٲ  `@0@@w4X ` 02 @@  VAk =v @(P (GN`@u >@@/@ `}  ?@A  0H`A P`h8(P@@ȜI@8s PA   0 Š- (mp"(@]` LX0  @ ǎ P˘3k<@g m  4Hk  @   @w‡@ӣ/P` P/?  ,,СCLDEl,б $9I)`IKd0Pt&Hp ,8J5@Y:@Pvie[ Pny `&LX Pȑ LPy 0gР.P` P` (@ (P PA `ޜ9 (P}o/0@y ` 8` _@ 0H6@$)ऀ*W(P`L (`90`B%* (t (`u@@`Xƒ-k, `r (`^0A(0'S<@0s(H` @@u N(@O/ PA@@(@XȰa# ` q Cr Xre (A8q"(P`@ jѢ0 (@ UX(X @,YҪM+۶ʝKx߿ ,`a `@2gs @@ uׯȖ]vm V߾ (@ (G @g7` @ 0|A@ H ,4@0`58  )U r (P`M9 `@,PPUY@ (P`"@P[̝[]x[_ P`@  @@ 4x  m@,H` Pt `0P0P@l /` ~ `@@ (8  0&Rh" (PHF,9h%f"(`9 @-:Rh) @Z p%P ֮%@@\r kz+.LxĊ3 `P02@@F(]j0`A @@v(0w0@0oP/`: `; (oༀ `ཁ Pp @(h0 `@0@@9n0 Xp9@pS; hP-@0  @(@P`@X0K@ @ (P PA00`@@ ٳ @@@p` 0@  `  $`0@47 AxA P`  0`>o@ 4(P8H@0` `  `D` A  @,h`D) @@(0`,`0 0 ` @   ( @0@@00@ $p A; ,p (p0  8HP@ H@ 8o @(0 0h H    @`,P0@3(0 (0@,`P`R0 ` @ @Z@ @` 0@ $p A0@$p@P $(`  `p$p <7  @@ ? ~ X@|`  P`. ` `D  )@> (A 0B}j@`%@@H0` 07_x   `@$H0 i` A^6  `~@ H.@' @  A$P0 ,Xp@A @P$T@DP"/Шq @I' Pi  $0@Mpԉ  @Q$%PA  @$P0@WPAЦUV@ 0w+oL@@$VxP@ 4@0@0`AP` Ė=@m۷q `>|'Gn9ϡ @@g׾ 70@08 X H*$ ဇ#F02 QǏ C@I Xɲe(@0@Sg?Zh(逧O H*uUj*Kh @ @@ `_  8 ,P` e0` @@iR: ۸=@\+O>`P  0y  0   _`   ,,0@C$N,P` 08cG `4e$` @$` ϟ0Q @ $xA@ +Ж@ K]-w_(0@$ , (0@gD@PPݻ 0@ `sPu  ď'`կg0P>0?@$8@0l萀PH@F 葀F,i򤀔hRЬ9`@9@Р@`t @0@@`Zn-@([ 0` `z.P@ `0`@ @P@(AF0@  @`@0  @7 (A P0@@@ ݻ(?@o??@ @`0pP$h4H# @*4H @ A𓀁C (XiR 4 A@    $`0@ 0Hp 0  `( p $`P@ 4HA( A0@P`p $h@@0@@@v 4HA @ A @0x`P0   @ H@$ @ $3& H@0  $@` @8pd $pl HA @@5@A   8H@$p` ` @(0 xM@$P  `@p$p P @8@(X@@@ `@$@$p @ $Qc 8@0  $@` @M $p@U8@ @@5@A   H@$p` ` @(0   H@(H   @@(p` A  @;@ $hP 4HA'` ~ p Hh`0HA( A @ 0  $hP@0H>`p   @S PA 0`@ 4(@ @$Xp@K`@0` @`H,@&   ` $hP@@ @@ {7o @P` (A?'@ uȮ=7 ~  @ PA0`@ (0 P@)R@  @ (P?0G P  *UdZ@  @@ m[0 n]wիw0'  @@e˗ dּsg@=ӧ PMadž-@m۷q-@߿0\$0@@sϡC0}ױg@0^0@@{  @}  @ 0`( @#BT0@0B0@@ ` ` @(G `J h5@ ٳ @@۷o ȕ+xk,a 0`"@`@gMZXM@װ] rM@P0sKNh`O`@{ȗO~} /0@@A0@!LXѢ5n1Ǐ0I)U`I@̤YS@@A  QI.e:`0`njaŎ KYiծ55P.y+  @@ĉ/fPYe̗l gС& Zkر@u0P,g<Pu l'`@y @ (A_ @@@'Rh"ƉH" P*W0@L0@@: `E A0  :@ @ $`P@jPrk7;A 0@ఁ0` 0(` @$HF(mj 0HA `7‡6@@  ,h@ 0@@0| (P`0@  ` @4 @ @@$@` @H# P@@0` @0@$@@ ` HA  0` p 8Hs `@^p`p@4& A(@@@f 06mڀ HAx ` @p @ @rp ~{ (`p>(0@  @p HA  @@x4@A `J @4kڼ3N ` @    Uz5@5@ 8` PР;~  P@h `  xm   0A `@ 0(@  $hP x'˛?>  ' @  (@@ 0@ H@D,0@@F<@@H% Di@%  `li@ (`p``@R@U^*K@@@V((0\t ` ^}X0_  ƍ P- @<@ @ @Z [lڰ @|.A8  @ի0@@vݽ7`x ^z ` |ǟ_} p HPÆH @ .*ȨG >2`I NdR-`,s'O $X  @5`j uV0  @@+`v ` _ x`#>l@ ( y2\`>l  @ [-`p Ə#/` @.}:u Ȟ=A޿OHP@7@` @HPh@C D$0q  )4eK9fM7N (P`")O :UfպkW_ P@[ƕ;n] W@_0X ` @cǍpre˗1_vp`@ϟ= `@i0` 0vmpwo߿>xq    00@@@  0|yћ0/`@ ` @,*\@ `20G A@(S@0cʜI͛8stA@ $hP@ 0Hh55@,g 0`[ 4HA ( A@p (^̸ Ly0B& @XM@kXp۸sͻ;X@@0` 0  8HP@ >0     X@@%HE5nLP G  i IT0 @@$ @ ZQI.e0@ p @0@ Py @ @8 HlܹE&]TVm@kd P 0`0 `,ѥO^uٱ;x@0  `P@ 4HA  `?@ @  С h@ 4(@ @$HР*W,p2gҬIvi 5@QJ 0`  `Xpbǒ-k,ڴj>H@ 0   @3nl1Ȓ'S& L@@ ` 5زg(6 @/n8@ҧSn:ڷk_ЀA(@  7@=|Яo>O  pP .4bĈxcFG  @*3g @PC5zi 4=`SN]ЀA,`P@ ` pֵKW@^Wp80Tl9ov ѣ,puj pڵ@wny{ÇPyr˙7wzt T^A $X@0p< po@~'@  !  " 1cxq$Kdʕ*3&L$` ')  @@ ԩTZ5֭ $6,X4`  @t 7޽{ 8 >lXŋ 9rXl9A:{6P ѤG( 0@ - ݼy@ ċ?<= (A0@ < (A  ??H@@ @P` @",^X9@H@\|I@@ `@(@0@ PM@ TU^ŚUVVX 0n$HР`   @b<@@\6@@ @  @@\v]ڵi@n?n@ 0(` @$H h A@/ݿ_|p~:PPAWǗO@@O@ @`(\#BpŋcG@( (@0M0` JѣH* PP&@@ @ʕ+`0@ٳhӪ ۷p ȝKwnx8߾ @ (^@#G6@2 hL@ϠC{@@Ө0 ȞM۸]` ^ȏ(` @0 kn@ 0@  @_'0@ `a$NA12XG  Y `K4@@I@ϟ `SQNm@@Y8W  `q0P.y K 6@@,^LcL\4o\СA;Xi 8u̦Mt0@0@@qɓ(P@@ 8uٵo; _|ԯW7`  ?@,h𠀄2l谡&RX7r@"G4` hi2gҬ)`Nv P B-j(R hiR  `+ %`,ڴj  k.^K`.\Ċ3n@'S6 `  @@Wu Юm6ܺwNP ` hn9t0`vo'ݻ 0` 0(@ 0`0 `@ paTxcFd$HР+0HA3 `  C-@RK6uTZ[nMP@ 5-Z0n ` @^`@ 4& 2( 3809@hѢ pujիY(vl p x8@ @@ p.@өS/p@v۹w7_ٯOP@ '`@  @ @@8p0 J ` @@@ 3g 4С 84i8HP 80  @@l8ܹtڽ7/  o .xl0`f: :0` 0(@j @@nz @@ ` ̛7/ԫ[@ܻ @ x/ / ? DPBQb\x1A< H%M@RJ( (5mެ)N=w@EH@RM>MP TU 0`0 @K@;@u(p^}X0F|7N@,[&Y<ZhF֭ ~m@ll߾=}G܀͝?onխ } @@ ?|Hp@  p L:L@ `4@`#G IINLyR `6 ̩SϞ~0` HTB*u*U`ͪ@^`X `@ ݺ w ,x0 H8C~\ʖ+'@@ g -:N0  @m @o~ @q @@0`z Ȯ] /0P`} /o  HP!(p@E0cGA~4P 'M(eK9Sf4gO*@QG&UT@Ӧ0 кkW_jlYd0@o0=0 @aÇ'V<Ǐ(reмYs (P`QNM`@0`@' PrP`d׾{ws70< (P`  > (@AXÇ#Jpŋ#)H`b@@  ` @$H Kݻxk @X ``0 ` ,8P MzR^ͺȞ-@s.p߾ 00   ` H@$p     P  0@ @@8p%NXE h Gp(@0 H@@ ][>P@ٴk۾m@z}@ć8  xy[@ܷH ˛OP $??@@@PB >lX)(@F=~,pH#Re@5m,N;Th ETR j^Śj~̞5{`@mݾWܸXF|@7.pdʓ Ys|Mpj֭]}`@ڵi8@n޽w@pŇH@r ]tխ_^ݹ@x͟pz_~ @"p@@ 8Ŋ/bĘ`@; 8`$ɒ&I`%˖.YH`&͙  ȩs'Ϟ> !! NETSCAPE2.0,+1888FFF'''TTTfffwwwŇh@ (Ç#JPb qcB `A(ShK `͛60('O *tH*E:@*UZ`@ KvҪMk@p (@ݻxPo L` (^̸ǐ#/V ˖ 3 Pti ^} bˎ`As'X߾,Hp+_\УCH(XϾg@@p$XA CXblhD$YI)Upp`@1a8M9u

P@ H8ʗ3o9PN]s}Ɠ_׳o=(>   4xa4tذ)N

P @hѣC8uj$8@i׶} ,pxp 0~x7g~@ӥ Pp{v۹wמ@ 8py p@P0!8|*Hp ƍ$8@l3^ɔ+[`͜7( ѡ :5 x ;ٲ H   w/~@̛;= $=; @?>z x}ۯ@@(B QĈ<~RDy@-],pL3SN=}sE=0 RK$UTU(@V̞EV@uޭ[}@`… pbƋYr\|@=ZhҞZuz@mƝ[|]ʼn@r͝?pt]̟G^@/p~,` "LB|x`@+8`#ǎ?

P ʖ/c\Ξ;(`4ң z -{6ڴ 8`7 .P @gϟA=V@apнwo0$W@ϡG>zg~@{/p@y}{8~} п_(*\Ȱ"J8@/Hǎ Ir$R\28@&ܩ@=P ѣH*]ZP(իU +KٳXvʍ[x߿  (f ǎ $@2h޼BMz@ `׮@6ޭ@ Nx+O~@У?/p8 X~}ˏ@Ͽx`@ HC XE c$9)U

Ph,eSZnZa&@` Y̥֭kup(8xР%Pe̘s&=U>P kرeϦ]ܹq(o Px,gs^o^/P @`/@  P@ h$p  @  ` ʔ0%LivYB((ҤJ2-pԨP`*Vƒ-k,m@r-p޼x4(@ `(0@ P0 `f 0 Vh -@ (P`P00ҧK?P /o<hӯ??P` 4x .

,pѢDt)ӦN8`*թ Ȫ5k(0`-۶n+w.ݹ  {@† 8`1 ,y2ʖ y-tN>}@֮_Î-o>P ޼  | H.` .`u(P ~|  (0`z /_}0@(P@A 0XaC 8Qb0fx@A9'Q

pP\Gױ_?P @w_(}{?_o@ ` @X   0`0` @0   @ (P`0@ XJ@Jz@X8׮ Kٳh -ȝKWn{`@ Lx#>P ǎ @2 ـ ` @X   0`0` @0   @ (P`0@ XO@ˏ@8A .pCPŊؑD$Yd@1e,pM70@O    ` 4@0@0@@ h` `K(0@P  `@0И@ L<@5g.pgП PiԩU8k ]6'^/W~@ѡ8u  ] O~y PA /`(P ((` PP`@ Fy@*S8%̗i&Μ:-jh2]RRj p@bNJ-pڴh0 퀸rҝ+@z+@.lP'K>P ̘  (m4 H5 mv{‡/n83_~@ң8:   `@` `/`0` ,p 4l8bD @P` H$Y+U.`PfL3id@N9hП0zԨ 4=@TSHp Ȗ%[k.P0@  @ Wpp4n, l@8s.Ѣ0u`ٳe(wn۷ ?@r˙Hp ~wνɗ7}zԷ_ p  `… . `ĉ+ZQb `ȑ"2%| 3̙4k

0 N@p`M@0@ .@@0( 0@@c~@޻H`<ϣO|Ï@ϯ?&(`APP `@ ` P @K`(@ > :T (A *U,@gѦUm[h0nݹ8o_ 'F\Ǐ/P0@@1g֌Y@g@=Z@P(P`@k 0[۷q-@ @ǑpϡG>zu {?|yѧ@@8~}  @@@ PA ` PE ` `@0@ @@ 0@0@OPѣF)S HJիXNU ׯ`0 ]˶۷p[`[&@`$Xq @9$Xs @:,X:A Ȟ-{s/H`#H X| H/0سk}@0ӫ_ϾO_p@ 8C Xb4n@!E,pI'e̤9@9uOA%Z,eQF-UWk %;6Aiզ-[oPn 7Apaćcȑ%O\e̙5[6PСAi`ݚudϖ] ܹq'(o ^x/W^ ѡ'(uޝ'_yկg{ P~翿x@ 8!ć hb6rܘ@"C8$ʓ hefҜy@:w'РB-jt2]z@R8*֫ kƒ{@j8-ܷ kn{@80h1Ȓ'Sl2̚/83(mtV^@زcH6 w@ʓH9 ns~`@Ǔ/o<׳o~ӟ`@H $(aBpa(VX 5&(dH0ydXd93egN;yhPC j@K.=P @TQ ptڵcɎ=P @Zi Ե[{=P @` p prdɓ)Wl@f͛9wth 0}tnm@ hצݠx0` O0`@ 'H{  ` Op~ w߾@_@~ 

:A$Hp@ p֭;A$X0|A$W|AG $h`0~ 0?@@ (P@X( @" Q@(0 R\0cʄ`͛8sܹ @$X@4 (@ (@@XheW`(P"P-o(@Pݺ(`0 0A `8$XbcG(0I)Q `)`K1ePӦ ,00@QI`*SQ PU  aņ `YiծeZ̥K @  `   и @(0@С  U6@@ `m -`@  (0@+|@ @@ٳ @@ ` `{O'@0B24`D&0`ƌ p4@#H" (iJVPhP@ 08p5( `p P 0@ુ  ` ڴj  ` \@0A   @  ` $H  ( A  (`0@@ `po70| ` @@  0@h0@ $@  ` HA  ) @@K@ (0@  @ H@@ `@@\,  ` @@A 0090  @ @l A @@' `4@@=  ` 8@(X 0@   X@,  ` @0 ̘ @ @(0@  @ H@ `@V,`6( PЀ @ 0` `0     `0@ `@0  ` @0@   8` A   @  `,@`A<  @F @    ` 4@0@0@@С,XM 08h@ 6%`@.@0A   `  `@0` `L@  @@  P@0>@\> /`  ^}_| ?@~ P(@P`@0`P>0 rH ,@A  M P  `耢 M:@ P`Ȫu v0`0`v@A  x0‚  `1ƎC Y.cl?-ZiNN}Z֮_vm` @A޽ @` H }c.`;޿.`<ϓ~ @ 0`(@$T(`@C0 `@Ed$ cG,0'L9%K/a9@s @@ P*O  ` @U4Ъ5A  [@ $8`;W лW0p#qc G0Y˗dּsf@0@@PV-`@ -@ -wo߽ '0Ǒg`0}0  `@~ ' P@A,Hp 48` 0` CIr\9Ȝ)@r `ϟ @G (% Ӧ0@@իXZUׯ`Ê+ Xvm `ݻ0o_LX `cH@e2P@MztӧH`$I(`A.]6 P@   t(F HtN@*u*ժVN0@+v -0`Z  00`/_&0f`  y0`  ` ` n  `(``xH  @u  (P` H^/`' @8@@A! "`= @& @P `(@P? *`@G"0@0uWd  ;@@Ye 0  (PA (P n@$>p @P`мY  ӧZ0@@m۷ Э[@o  @ N @g׎}@?W}ė/_7 `@@& `@ (@@ RdРK$8r)` JH*]4)JJ@ի  ;`  ȕ@ UA 0 XL ǐ (22k<@(P^ P $X0hp@4`s Ho` N@ ?}_ PPA @P` @P @   @ $h` `@ (8` @  `Z`  UY Pp`AP A  @@  A 8p4HA 4h(`@A & 5 P{ 0  8$HР0` `; ( A0 A  0P7@` P 0,0@`Q0@ X` iӦ pP0@ @(h`A'8@P` 0`mȝ[ \ s08 }t0/P`yH~='0@$8Ѐ "(0AA"D@ H0(@I@' @@@K` `0@@J@@Ѣ @P0`W@U^ 0gPVo0Wv +o_ P@aÅ(@ G<@/ мY3(ph5k Ė-@m0`@ ((0@@qǑ0@@sD.zuױ[P ?~@ћG~} P PP X8@ÇH@ P` Ir @0c @9@`@p@ 0h@ hEP` P  0@0`@p+`@x+  @0+@ `@  @Ϡ 0  ( (0v @p` A  @` P0@u h'@@0@@ h ,@> ``AP `8@ "  `@D:Xp @v(P PA /0  00@ 0P  `F0@ L 2e  L `<tE=* jUVY|*@e@ ,H` (@@^}@@` @8 Y\<`<{Z .0@j֭].P` ;7 `@\ ] `  @x3@ |? P H $8p 0PqDP@% `^ `M  ` % `Q"t @-0 Ț~@E[`mn ` ]+`_w `@ƍ @0@ʖ P`3-zO H=@k_0`l$X@ Op #H@s@'@ Ȯ}0@@HO@/`_`0`$L( 8@1 ` @G9$I'Q J  `@͚ )gO ` @QE iSB0Ud%u &Hm (n] @o_<$N,q!0y˗1cy@gϟA0Qz5P`н7 PxǑ P.`@ `gN@@w?`P 0 $8p P  @(@B)r@  (0@(@0@)@0h(@P` @@@@Š%@@ٳ (@ 0.x ;@L@@ 4@0@  0 `@= & `k  `$HР0` qx ,x P (0H'`  @ $h@Ç L$ `E  0,X0`d"h At$`A (  xY0 a @0@ (A Pl@a `@ `@(H@ t4X<@b,0P$}A ,Hl0`޽{>@|<^P@{ݻ `̟G^ ( /0@? 0`@ ,P@P`@@  (0`@( P͚4 (0@ :Ѣ -P`@ ՀV@  ,H`f(8 (@@  `/ x 0`b ,y@.cP`s= `NNZ (  P` G>`@Ο;G  @`;#y `0( @/?@ Pa ` HAB&`@6@  @ ,h`0` `@    ` = 4@  ,X @@<`0 0X@ (0@(0,`P`M$PA}РI (PA0 jW `@`` P7 m:${6` 8h0 p?̙x=[> ܻo^0  H B<P@D \TF ( D@@l4` @= 0@hA04@z%6  @-m 0@u;@0@` X r0` `LF` ([l `@ |@@\y͛]tի(@;O@xGo   ` |< 0Hp@  ` E.^4>0 N 0 @s tF t `@PP`-۶n߾ @[`/߾{ (0@† `1 0@`3Λ 6@N(`  m4`@7 \8Ə H|ΟC.``ώ}޿ `0`=@@ȟ*`@ @D,P`@ (0` dɒ P9e.(`7 4`@O? (P`G PJ`x P@A 0 `o0 <@$X re0c.@0  @(@P`@m`  @q P@ ((0@ 0 `@ `0| @    00@0H@Ҁ 8A 0@A4` @$H`0h`A@W  X;@p +@ / @0$H 8`A ,@ 0@ @`@(Xr` @ @P@ (A 0kN  0 $ A  ` @`@$(` @ 0@L|@80  0` P H@A `@0   @ :  K@,P  8p@(X (0 `@4+HD` @ @P@ (A 0N`@0 `p A  ` @`@0 PA?P @ (A@0@ h$@ 0 `@ ` @@@0% A(`X`,`  @0@ `@ h`0@ @P`\` ( @U  @ `0(@ 7@$H` P`8xA4pA0 4(@O$HР 4$ `@0@@0`H `+ ( A(@,8K0 S(0(0@c (0(s -0` p`0`   0@d(WL  @h&PA  `@$P0@nPA7n\@ T.{N@@7~ 0 $h` (` @ (P`ĉ X1」 x28,[ ` fL4kڼINzi Ph@$p 5֭ 6,d=6 Wܹt(A 8 8<@8~ qɓXP sP.Z~ j ` 7`8n= 0 {(@ $p @  ? (@B < `\0@< 9@H#  J PAl@Z @:P@TT @@ 0@ v@m (hp@\  l @L@ +L@Μ P`@p\ @l @@n| @@p0 @9 }@_^`v  x^ @ `Pp!C(Q  `@ )R,r`n4>i`PF0 0` 4@@ @ K@Y΢% `- WvͫW,`aH\` y L  @(@P` 0@(@P` '0Ο;_@  ` ( @ P ' H@  @bE (A@ P0@@@ 0S@Mp9@:P:@@S0A `  0 H h A @_ @ A0 A  @@@e0`ϟ=/P@ @0 4(@ @$Hh  PA  ( $H`0`  PA   $h`0@@0h AR@b, A0 A @@Q``   @ H@$ @ $@0X 8@0  $@` @8p $p@ HA @@H7@A   8H@$p` 0  @@  H@$P  `@E$p P @18@(HA@@ `$@@ @8p l`ۖm `n p @ @A 0  H@ $ A8@ @@6@A   H@$p` ` @(0   H@@ P @@A @ P0 A @@L  $HРh AhJ@,`  A@@ 0  $`P@ 4HA AP0A 0@ು6@  ` $hP 4H…(N`@0` @`.'   ` $hP@   @@ (0@@D'(A00i+ XfL pxP  00` @ @P@(0 `{/^ ( @` @P@(@(W `@ft04(@P`ժ v ((  @P`˙30@@t~{@@$p}z @|~ ' 4@ …  1ĉ' 0 ƍx0 $ 2ʕ+t) ̙4$ '<@ ( 4)LxJ@   l8, `@׀8 0` 0 r ` fx&` 8m 5Z00 w ?~r =}w'@ =(P@@ط?` 8@ 0`  @",H@P@H ` \4@ 0P @  T* @  ܾ `@uW^zk X10@dʕ (P@@ ZLFZ\zl 0`|-r<=_nv ̟G^' ǟ_~4@@"<8`B8`" @> 9Hr.s6 `'Ϟ0P0@ ``N ȪuV ( Y @P@n߾PA _ x0†#NL  y   `3@0`  `$H ` `A };w (   `0@  `H0HA( A @G@ PA 0@@/ fM7qԹӦ0`h`AJd _ `@P 0@ P0 `, 0g@ŋP@g^̧_}7@@`   !D0@ `@"G,9R*WlR Ьi Μ9 `p`0(@R 0mڔԨRRjZ @+ذb @@jײm-ܵ`wzW(L @ +hd &3`f 6sfТ&4V(5lX  `(q ܀ @@  ` / ` (p 6tX`@0cFPpR+  `@Lh 0@,hP H`ARK6]  8[&Xb4(@ pk@r   @@ 6@qbpX@L@t@@h pi vvl }۶(0@Ç 0~4w@өW~{v۹oO@0= 0@~|p@~@8H@8|p*Z1#F  `4kڼ9 'z 4СD- 0 *@P@Pʚ=6Z@t (A  p >88~ : y8x ;ٴk۾ 0Pp A PA 0@ @ 7o  PA 0`@ 4X@ H@B >LP D  |42$  J\ęSN=}tH A8 HA @@@K@  u  ` H@$p ?\ ʕ-_Ɯ9A=w6 @ @M@0@ 8`@pōG\r 0@@  `A 0@@|`  (@A `#ǎ)r$ɒ&rJ^  ` @ @*u*ժVbͪ5  (A  @ @@  ` X0@`b   $hP@ 0HANN]_Î-;΍n  `0@@ 8޿/~<ϛp7PP  (A&T@C!FH@@ @@'O8eK/a

x $?`ϡ?_@ ,8@ o PǗ_@}_$`($`!H83bt ,pɒ Xr@M8s܉s@PѣH*]ʴS H* Hk @6p 0@xK/ 0 1ǐ @rhެyCfӦ5k&@޽{0`УKN h߮A (h  `0@ O@A,dȐ%J,pE0G YTTi PӦ ZQI.e4N` 0P(A  / &\@L@̙38g ]TV}@رcP0[@  @(@0@Puٵo{'OAA0` @  `D  "  $hP@0` ifvy`@B8(ң hԩ,H ``A A  Эk.޼z` vPP`r8 HA @@M@6@A `0@@S^ڳ(;(oֳo/@ 0~,P@`$ 4$` @D)VxcF G   (@A 45@@@T0@8p0 k pm֥{@{8p` 0|1 8H@8@(H@0M @jիYvvl٩ 8wn ` @pÃ0n  $`P@ 0H  `'` @ PA 0`  ,p…  1"Xh@;z$PA  4@ $Hz 0 СD=4Ҡx i 0@ x @ (0@ؽ{W|P  0817.pɒ 93x@K6@`@ 0   F0@p0 ̛;=z0@ˏ'>۷ |'` @@ao~ 4` @>$ q.bH?,pɒ$,Hp`% )3ni> @F TӦN (P@@V 8׮^ +v,H6m}v ͫ7/~,x0 Nxb@,/cάy>m`4iH_Î-`mnP ޾.|8q HxqǑ'@ϝ8zu o@y` o HA 0@ XH@H@ h cIɓ XɲeH@80  @ ӧO @իXjZ@`Â-pٳf0m[p @@0@ Y 4R0:ׯ $@۸s'( p A 8@ @@ .@‹_ӫ_Ͼ(  hA  LHE h 0(@T @@Kd @@ `A -QI.e@Ql @  + `+- Py߼  \p/V LL̙ l(0@ԩU@kخ ̦m mܸ $o'(q0@Pl'] @8{ϧ__@ L@.$𡁈&RhbEp Ȑ" (iJV4%L8`&Μ:s:80 РB `(R R*`r Pb:X mHz(/(lp0`1Ȓ#0@2  3Т  @  5زg mn6`‡ʗ3o@@ҧ`zs@@x (?@h>@ӟA $x@ 8bD p8vh@H0@ 4@ ԬI 4@-J)R0@@S0@ tl @k% ` ;@@` 0|8@7f)W|ٲ t@I.p@jթ ٳe} @pÉ7>\@r˙0  ~{v۹wn|ȗ7@@@z p~P0 <8 ( Ĉ (P`$K$@J @ & ( Ν88~@+S.p͚ 0@ `   `  $`P 0HA  `   PA 0@   ` 0` ۻ?~{0?$x@(  0@ =v<0 H%MD9-Y(@L4p A0` @` 0  8H ( @0@(@bƍ?ٱ l@8p@@(` \`l.pn޻\pō8@r z_~` HP@ @o HA0  $`0@ $p `4  0P  Hr%˖._tin3@@ 8@AV u +v,ٲd 8`-۵ +7n{ $`0@ ` `  PA 0@` Hm@ 4(@ &@@$H`@Ə#O|9s.]4@PA 4X@8`> ȯ?8`A PPa F @@A 0r @ @P@7  @(&50jUWfպր(`` 4`P@ 0$VqcP4@ ` `  ` ` `<  `  @0 `A  P48pXx4H( A `Az[n=P @Xcɖ5[k(n\{4p   ` @`@00@@@h `( `A `@ 4' @8p0X0@4H h Ap ` @A42dJ,y@,[| 4k

   D@AP (A 08  ,x A 0hp .\`A nDP@@A(P@(`Z^(`,ٲfϢ-p۶l w͋7 x†HxƎ; Yʖ  & @.0@P`n#P A `  _8`  (P`^ (  _`(p(`A&,p@C 0dԘ1@4@@@L `(й?0P0hQ0iP *@ 0PP`g (( vͻ@ ,H@ 1D`0@` @iӥ Ė=vmн[^Ǎ'(` @s0H0t о ~A ЧO} ? _$8 0` 0@ @` C:H` @b8s0@'0@(*UZP(իXj-pׯ^@,]@p-px(߾8@È(Le ̹ $@4 Xm@װc˞M{ N(_@УC/p; />Aӣ/˟@H$(0A .dP%F<0 E5n#$9@TdeKYtYA(Q`ڔiNZ Yn5Aaņ-YiբMP [qp]w _&,'>P cȑ%O\̙1(g ]TV] رa'(moPx ,g9L^:lŏ'_y }̧_}ߟ?,H *<0 Ĉ`pq"G,iV\92gҔy`@:wY B&((ҤJ2miRz`@ZrubNJ=P ڴh ЭKWp@@ 8Ċ3f`@Ȓ# 82̚13ТAH4 h5زgӖ]ܺs7‡pPNڷkp `o= o 0xaƒpa(VxcF38dH peJ+U(@L1p3A5P K&(` @T $pkV[:8P@c HmZk&(` @\s0P{:80 @` 6|4vx)W|38w|@ѣE8uj p5hצAݻu3XxpÃ;X@r (,p{v0(|x48p|~| P| ;.pɔ+[9xK>:լK'(`  p ݼ{  8<p ԫO={{>( x?ۿ8  DP‚ QD $QF9LDRJ-88P L3 SN=}T5: M>UԦ UV\ H@Xe͖ VmܾW\u(@^X`… F@7.pdʕ-_ƜY3|Zh@Zj֫] ڵmƝ[ xG\r͝?P t ]vݽ=A͟G^ܿ_~H@~ p  &(`!Å(q"Ŋ/b(?zɒ&OLre )s&͚5$s'Ϟ>{*@F"Mt)ӦG u`ͪu+׮^z`@fH`-۶n+mͫw/ ,x0#pƎC,y2e y-z4ҦO_(pڶoέ{7o  |8ƍ(pΟC<Ȯ};޿׮@@8`=ÏOA $L!F8bŇ иcǍ (0d Ty `Ƅ`A7oйӀPhQG&U:@0dպkW_.`PlY PV ĕ{wջo߽ .0@'VX,/(PA^@i!! NETSCAPE2.0,,H888FFF'''TTTfffwwwŇX(Ç#J,pŋ#)2R4@0 4M8 J@X  J@Xj:`(ٲXvʝKݫ@ PÈ(ǐ#K.p˖3-z@@k`  <@  y h4@0@  @@ H  $8@ .da$Nx@5(pGPI)U8K YftԹA0@ `0 "h (0@ ж@  paB 8bD xb8v一A0@p9`@0g (0@Cpt4P` (p Plc-`k(n\{p6\@7Pɓ%(sf͛9w.p@hѡpvz (P`@nݻyxp pPөO?P @v 7}zp׷?@ < 2

P Ō;~\ɔ'(  ( v= l ;z < /0  x`><?o@ۻ?~ۯ@X (@B >,pDQc|q (P`J-]SL3  @@ @E-pRKUTU8@V VlE{@mݾWn޵{@}8@`  X<Yʔ PA= 0@(@P`\ [.0`.@8,\y<խW?P vݽ_(@z _~ _~ ,pp@q `$ `@0` @ A0@ )` 4@0@  `@0` @(0@f `۶l w͋@,x`H8C/[>P Ξ?]ҦK(`5-;m@0  W 0@ 0@ H` ` @(0@0@ PH@ Fx@-8cG 9dI' Ĕ93@py`@?:tG=P @SM 0 Հ ` @P   0`0` @0   @ (P`0@ PM@`dž}@۷m8wo>xqD>=@g~`@?~џ?P @{ 0 0@0A   `  `4X$`   (P` 0@XJJz@X8׮Kٳh-ȝK7@{`@ Lx#>P ǎ @2 ,=(Pׯ0v(@P`o 0@(0sH/P`u(`(X~˟O߯@$ &LP@%N8@4nx@!A8I  rK1e `M9u `O? PQI(0@ ZnZa&(` YiծUk@q=P ]y8_  \aĉ,qL<5g^` 0@T`ZPv- N+/мѥK/PA0Xw  _|ԯWAϧ_?P ,p„,Hp&Rh@$XȐ `lr (P`,P`Р0@@I 0-0S  `Vnka%+଀jh;@ ЭK@z-p,Hp3n@$X̘3(m4W6}@زc86   `‡ `ʗ' `ҧSnz ``o=?P 8  4xaB pa(VtqpR(@P`30'(@P`@Р 0 i  (0+Vt`c(mZpn\s}{@{(p 6|qbT\y0@@ `@`p0A   `@r P  `X @@z,Է_ <:|+Z1ƍ2$P ͜H ѤK>ZtZn]ٴg/`0@ (0@ 8.`,P0@ `@(X@` @(0@ 0@ 8 @! ,^X =~RȎ @Re SL5mLP N; Th 0` ` @\  v @0@\5@@0@`` 08pA<@,Ys|@MFZj֦[[n޽}Ν@ʼn8@r @@@0`@  (0@z ?  @?$ P  `@  `E(`;(`$ɑHr%˖._T@6op> *t(Q t@ uȪu+W  v,ٲΞv+7v+@  @pƎC,y2e y3-z4ҦO@@֮[8`6  @@o(` |0(` }0(` ^H/`(@ _ȟ &0$TP!F8bEc (0'QTe` @7m8gO :T $UAD ` d՚ `@ Uo- A] 0`o_\x'G~@ϝ8zu@џ/p@{0~}׿H 8ÆHqb2j̘@ ?Hɒ Xrebʌ@8oHϞ Jt*Mz@PJJիXj+hӢ-۷n@. ݫ7A.Æ1 H,9A3cpϞ0ӨS^ͺװcn]۸o(N|+O^П(}‹_(OϿ$XA .dؐ$Nx@18G  YdTTy@1a8M ٓgz@I8SZUYnWa8Y`ۖmΕ@yH_  \p/V@ȑ!He ܙD}`@ԩUfkرeϦ];t}`@Hq `ޜyO@ٱHw  _|ԯW@8}?,h „ 2l PH@7j,pȐ `l@2g,pΜ8-J@J*-pԨP0*֬Zrbǒ-k,ڴj2X-ܷ `׮$o ( ,h8 ` ,Hy .Mz@^Ag.ܸ0(7‡/n 0o9ҧS? 8  P|   *P4$  TdpQA78@A d@A+W A3it hPC5z 6ujTSV@lX_0mm[.s@(00`@@ 4X,psf͛9wthѣI&@0PP`@ (@0N9P@  (0{  (0`@0= @P`@  p <0… :|` 0H ( 0@   &j0@@@ ,8`4H   0A P@ں} 7ܹtڽ7޽z  0`@$P  @:0X(` PP` 8p (  =ܻ{>˓O`@,P  ( 0@ q$P0 A 0     (00EETRM>UT   A 0@ (@ $h@u0@@4H`` ,@ \ @  0 @`\[lڵmƝ[n޻( `  `@  (0@(P|0W0A/@,A@@ `Ŋ/b̨q#ǎ? )2d0`%˕^  snyϞ @ @FHZ`M@ U^0   fϢMv-۶n8 $8p A~  ,H  C A/[N` 4@0@NH=@ {ڶ ` /0`x @ @N`0  AO O`?.8  &\`AP (P#A2@AIP"P D@ ԩ@?D@G (0@@ӦB@d*_ 0PA[0 0@60Æ `0 0` `0@@ ` ;M`޽ 0 $H@0`  ` ~H~ /_ @ (`@A"$`1f8A9R$  @7)`@Ϟ 0G$@@SM *@U ` =0 h (`w ЫW@0paÇ$VX G<`˗1g<`  ti a@@p֭{`Ǎ/`0@ 0}@  (0@@(@P` PA  0  @  @P(P 2f\@R 0@怛 @@@(]JJX@ @  @@[  `]  /$X0` h ,3 ` AA  @@ @0$Hp@ `  `: ` w (hЀA4HA$HР $`@L  A @@I  ` $ &$HР %`   ` `U0 +@P H_  @p 0 @(` X@,`( 0@@ (0@A `` p 7 @@ ?  @0  @ @8fv0 B @@P% A b&@0(` X@,` P `0 603F 0@A 0A $x6 @p`@ h> 00 `$p 7  ` @` `4<T$`  @HHPA  &I@ ( C]`@ @ $H h`AA 00` @^  0  0h PA  5z p{  $hP@ p.`@t0@@@v 4HA ` @ ~'@@@~(P    `*Z@(@P@H(P@@P ` ` ҥ  ` * PV  `Р4X  PؽKK 8 (0@9sf P8-@Z~= ض-  p8~ xyw>7/ z >@0@ lBl@1,@@ 0hЀ,H 0hp A  ;ڴ-@} 0`  @ @\.ݽ0 ̛0@@ܿ_@  A(@P @ q".b8` 0`&OH9@ s6k `@  @F PN@ `mЀW  f 0@ w  _  x0ax10`0@@g>`@Ҧ Hz@֮]] .{}(0@Ə7 `s .}:u֭Ȯ] ``P  48 *@P&0`!F(bE1fHA$ dI`@`@)@?*`0T(`Р0@kW (`U;@(P՛ 0 $8Ѐ 480 03PA   tz00xq@@{ @@  @ $h`@ `@ @p` PA((0`@0` C4 @  @@  `,X0` 08  @4`AP `x `@( H& @ @@g  ` & 5$HР h  `  X.`$P0@@`@(X`  00@h@$@  `@(H@ @`I 0 4PPxp  0QP5 ` @ K@ `; K@$@ 0@@ H@  `T0@`k, @ @ 0@A(` 8H`  _ p0  @ @@B @&p4X 4h`  :  `0@@ ` H@(k @   K@$@@ @  @@ \Y   `Z $hP@4H@08r(8 A@莠A  <'` |0h` $h  ,Xp ((   t@pRr p $hP@C 0@0h A  (AZn 0PP`@^+@  p\`@((0@@͛9P@Ah0@@j@ԶM `@ oA (pAt 0@(7^س~  P 8H@B @P`P@ H` (0 eZ| 4k34(PtҥL 0@ԩT `  hX (8Vk(` 4|+`XŌ;~<`ɔ,  PA @t= x' `8^/|  4@ "PP"@@ \xR$%<9@\ `L0@@| @@T (U* H5 v@0@@};@\w},@ `p@b  ` \\@Μ|  ,Hp Ɲ[7 4hp   r͛N@ @@^0   | 0 p P`!*` Q Ȩq )rH& Hr.] 0@A6oL`~  t(Q H*`)S ``x ~Uٲf @@ ${ͫw~<`x1Ǝ\` y@Ξ?wF Zt(PP@k(P` PA.\0@  `c@(@0@^? .h $8@ (0@Ŋ4H AP e` (@I? PP0j(`@_ `P  ` $h@X `1 @ЌA  P@iӥ(PA  6P`  `4Xp,0  Pp`  (AP` 8`A` A0 A  @ $h@ 0@@G4H@ A@S0 PP`@0@`@ 8@( 8X`,`0 ` @ 0@ ǐ'@0(@@g0@ `@(XA H7 (4@0`؞@$p` P 0 @(@@0@@$p  P 0@Pr,P0`@@`@0X( X`,p е0 ` @]w P   P0 2p`@< @` (@P  8xР p` P 0 @(@@0 =@0X 0@ 0@ X`@`@"<0@@ P0@$HB% ` 0`,H pu$H0V0``p 8` $`2 @(8pV` A  @@ 4@   9$Xp(8`Ə'`#8`@ `  P`PTPA0" @P `@N9( `0z@R4S J ,x` 0@@ ms 0@@ @ (0@ PA(@@8w&@@@h(0]`@0`ٲ07 0P  `@r0@ T^{ س P@~( @ 8/`ڻo?`@ `X@0@ <,0@D <~)@H# @I@ ,0`5m 0N; TPt>%`@T ``A $X6 (@Z @ @^x 0@0@- <@<@F]@֬0`m(0@n `@p?.@͝7@@խ(0@0@Gݿ0@| _? 4` A$X @\p/ZD=Rɒ%L)`.] )s͚9`'Ϟ= t(ѢB M:`)S>%` @ 0`] v쀲 (A޾ Wu `_L@aH<`,y y3  N  `.P`(@0@\(@P`(P` ^H/`{(P@PP!@   `@  `@0`h A  Z@ ( @O  * 0A  `mo Pp$H P@ 0@`   ` 4@ ,H۶ M@0@`@q4X `A /' @ <@   @0@ XH$P  ``@ 0 %Kb ` @ @A `iPztT0{v۷ 0|x/?}zp?~| @ @@ ,0!B XDP ƌ(A$K8Y ,Yx sLj$z &8 ` 4@ @[  ذ@ t(0`[``0@@Ō7@ X.0 x@ @8}z.P` ]@ PA @< P (0@ > (~ڻ'` ~ h , `P@,0` r0@@,0@ s@) @TR  00`@@ e@vmݾu@n (@^ EX0 @`ƍ/`P@ *` R%   )3 `>:`@F @ӦN@ 85PA@۶l ;  `@  (0@x0`-Ȝ  ` ` PA (`P` P0 $H@(8`(0 @P PP`~0 @8PH@0`(0@A~ ' 84@ @x:4@ PA  @@ 4@0@0@@0`o `w @`0@ 1 4@  ,Xp@ `  @`,`0 @ 0  (` P(߽?hP@(PA ` @0 h(( ,p@ i IR  0`@$P 0@`@ ` @  @A( @0 ` @(X@ L@<`0 @(X@  @ZA(@r(?hP@@PPn 0X (( @, P `h$P  @ ` @@@  `,P0@ `@(H ` 0,Xp@(8`A  LX,^  LY 4xg `T@ @P@ mw N 8xL7  `ċ'P $hP@4X @@ (8@p 0@ $h`0` @` A   `P(@@0 (0+د ([-0`4x.޻@@`X P6`2(`(@ j< `ܺ ({@@ h.n}vp `(P0(@P`(P` @ 4tT `@9v,p PfL3 p@N: 3@$pt450@ P ˗~@ڷ/?|@ @  "@>\4P( @ 08@  @L5m޴)@N;4TiM> UT^U] e 6ml(`@u @-P` (P` @ <@sΜ0h 6`j(l@ ~p 0@A  0   ݽ> @?@_0@ DX  `@  (0@(P&` @` (P P00`@ +6 @@@@p 0@  `  $`0@@60.?XРh ` 0  m@ 4(  ' `0@@0]0`#h`A  @` .h`  @(0`,`00 ` @ hQ ( @ @@00@ $p A0< `0  8HP@ H@ Pm @(0 00@`@ `@@s$` P  0@( `@ o ` @@PA0pP ``@ 0 %K  00 ` @@8p @@8@ H $(`  `a$p H6  @@ = z@ X`<` `  (P` ` `G   @ 00@@@ X @0@0Ps  0OP$h p 00A 0`i %`@ 4(@]y w 0  @0@@e 4H h  0@ ((0  0 /P`@ +(P`@ `@l^ (P^@ @7` ?@ `ha 08 (p (I ( ̘1I@@ A%*(JhJ@RPju Z@ 4@0@0`A (  o(` (1Ȓ02f6slС .m4UhڀPЀAv@0@8hҧS' ڷs>@x (o0hӯ_~0  ,p 4,0@@ (pq@8v8#I@@J 4@3 @x @@-J)4m*T `  kp @@@^{w pX p,)O0@ (@ 0}ZPv@@w -`@É  (P` (p{(@x 0  @@  0 8xB8|H`@X ` 8ixi4 z0  8hL0@TU֭ @P`  x; W| 80P q;v,893`ѣ >M jZx ٳ &`@0@ `p =t =; 0@  8> | (@ 48@ (@@<9@H(P@@l` @5@@ @P@P  @K@0``  0PP`… 0,`@  @(@P`h @=@[  @} ` @(@0@t 8 @ A0@ @@ 4@ \` C(1` ` ` 0PA @ 0` @8` ` @ 0`^ k@ 0(@ $H` A@0@@& @  y  Zt 0( $HРn0  @$@ 0@@$ P @@ `` 0  8H@$ A@ P iA 0@8p HA0   0V P0 .8p@0  @ @@A @v`P  @ 8H@$p ` @$ @ 8A0  8H@$ AH2(p0@ Xi$@@ @ H @ (P`0@ @0 p P @@A @ p` A  3@ $hP 4HA&` oN|(`y0H( A @@  0  $h0@$H`@ ` A `h ( A0@@  `  ,h`1 $00@@ h`A,@0`@ 4(  P@0ׯ (0@@# 2 lyD ] @ @P@ (  `n@0  ( w (AP0@@@ ?@,8@B.,@X7P0hRЬiv' @ R8) 0`*Vr+ذƒK,ڴj -ܸr 0.޼0 `0Ĉ0n,1ȒP& p@3`hM@ `v w(nx0แP7`p` ` h`> 7@  0p php1 t H,I%J+p@L9'N; @(  @R2PT:`[  @0@@Zi s` @ (_P0@7fL  0@h 0:iM `0`@r p<W`{v۹k 0o^@pO@Է_ P  … x8@ĉ%( 0` ȑ HA034kڴ)@<{4P8jҥL:% T  @@\z 6XVڵj ܹt% +  @P`Ō Yɓ (y:{\  `Z  @P@ݼ{P' x=zt( vx' ˛?> @@(@xq  D' @  };0^@y ~  0  @0P Hbh  ` (O Abʜ ( O  ѣH(@AJ*jʵׯ` `];K w (0È 0ǐ#7@˘ ̙,H 0c&@۸s0@ @ ` УKN:t >@/'@ +`@ (@  dP,\!$(PŊ ,x(@) $` ˗@t @@   )Q*@UaPlY`[`@q-0o_ (P``,0e  @ D&]Zt$Xkر$} ;  `n9L` `0`P>0?@ `  h谡&Rh"Fp  @)lrLfҜi :w'РB&P R 0mԨ  `*֬Z Jી-+j  @@r8޼z 6@@ `P`263ТG.m4j  ue A  `@(n8ʑ PP00;x(o<{  ~ 0H PP)VxcF3>8`#0 4(@ @$H`xi0j0S ( A0@@  mZpn\sp] ` .L@0 89wthѣIvXp@$@` @8p0 0z ` @v0@A   H@H~O@@8$` D   H@02ʕ,[| 3&L  `(p `A 0@@Vx ` 8kH@  8>8 x  lfx6@@Pj۾;ݼ{A  $Hh A  @x @   o@ 4X@ 0HA>X-^Ę|@iJ  `0@@ 8EETRM6u     @mݾk@.u W/ (0` @P@?~\ʕ-_Ɯ@=w6@@F-@j֭U[n޽} 8` `@:թ ]vݽg@@<0@@ܿwo | _~

0`"E/^0@ 8p &OLr%˖y n Axp@A Hj 5V 0׮\% v @  w #NƎ(`2 @Ξ zҦO 0@k-{6ڶoΝ~pd@EF$@Tr0`gO?:t $U HJkW ;lٲPK@@[oƍ+nݺ лwo(@cǍ0d  @ϟ0Z@iӧQ 0@ׯaǖ=vm۷ (>\A $'@ P0@|yP= (0@}  ("<0 Ç@"hܸ (  P@9@@ JѣH8ӦPP@ `@  ` 4(@ @$H00`  ( AH 20MzRN=װ_(m 8 00A 0`@ 4@ ËOҫW 0@@7@ H@0  `4 # @80 9 ٓgz@I8S Zժ 8H@8@(H@K@y_8a@ $KPـ(`A 6@@m0@8p0 ^zo~@8y `= 8H@8@@P@'Rh"ƌ(pȐ P0@) 4ु1 `  PA 0`J  ) ` $`Pb `ֲe[r.޻.L@  0  $h@4H` Wn5 ` 0o‡'` ( >@p]P  `=ӧ_` 8aB p @P@P%X 0@3iִygN;y8hP 6mJjTSV U[  @Xc 5k6@Zk  {@{@ p7& rdɓ!L @f (I6}uX @ٳe8wn 7@yr `@t0`@ @xȓ'@@0`@| p L@E E`R0`j ` W@A % `. `/0 8… x1Ǝ(`2 p >8 @@ -@o.p޾.|x OΟ;O@ ``{0`| ` {@A `` 010fX A92A'Q P ` `0@`@Qi:jUWf@_~-p@Ye0n 0n500 ( A 0@eL@g @ 6u=vm۷w8`@(8A@d8|yѧWLJ_'(` @ 4@ XȰÇ @3j(Ǐ =I@(QH˗0cLP ͛8 0` 0@T  hZ`ÊKY Xvmʍx K LÂX̸b#<ـh޼yBM4iXͺb˞-r{ (_Hp$8@/@ӣ/p 0~ ؿ߀ $`,$C0@4n(G! P2T\)@1eΤYS9u4 %I, SLZY.`PWaŎeYgm̥;75`0`a @@c$ P̘ Й@Ԩ ^m d] .0oPx `޼K7P=ul'@@'O@ } _} H?@( ƒhaP4`"F6n4(i$* leK2 Ьi@: 'РB-ҤJ0mjRR @Z -k,ڴhҝ[z(`0`a 0&0d&Pp&`G (AVnڀ  w7 (n (P`  ^'_=p` p @p  @@00(@$H0 ; ( A p@00` @V[v,W `  ` (P@  ` pp7f|`@ɓ)W|y9o>P @hѡ p h@ @@0@$@` @8pp ( p@0@$@` @~0  `@84` 8h   0$ 0x,Y8 ̘ 3Ν< 4(=jL2=0$(`  ` 8@0  0` @8(p  :ѤKm~z A @`p x rxX= ><?o۳?P0` h0HA( A F< PA 0@@%- 0 0` N=}TOTiR $h  0  (h`̚-pZkW\u8@^ p 6 @@- ـ |@ @P@֭]PƝ(0ōG\r <7@t@A((@@P_(@~ p` L@:,pŊ `? r% LreJ)s&M ``> *t(ѢA Hj`)S@5P @@PA΢-p۶l w.ݺv8`/߽ ,8p#>@,ʔ N&@@^ {6 m o~7@@q H<?'@@_' @@ H/ `Ѐ O@@` @APP F8bdԘ@A~,p@I%( %Ki@M5 > %0(G @SDj@ J @׮ +@  ( @o  ` @] ( P@A(@X  @Pd 0 @P@@ׯ 0ֽwo>\'G^ϝ'@@ @ud7}; ?@yѧW@?@} @A @ЀXHHȠE (`  0` 4`A9͛8 ZH(ӧPJ-pիV++6A@P@0@ (AL0aǏ 0@ h6 ` `0`@ .wo3`Рxȓ'_ ^n@  ` (}ȟ/@Ͽ $8@ &,pC @ 0` @@$H`0Pt0A0P `p0PA  `a@0 `0@4Hp  `@  f@ $8p 4@0@ $`0@0H@d.pmܷo8q `ޜyO~` H@( 0@  ?@0@@B `D$p A@0`* 0@(`  pp0 $8@@$HЀ,`P 8p@ HA@-p`0Ċ81 lr6s|` H@ h $ A ;0x ` 0@A0  8HP}@p  ,0@4H  h A 8p@(X ` 0g%z@K6uSN=P @VY Pp A 5.\s h  0p`0 8h t@ @@ի P(Ah(0@ 0`p`A A ( `@ $hPXp@ 0… 8 Ĉ b:z (  ` & @P@< СD ` R0 ` d @@ 4`@ hh p <8 `d `@ P ((0 u ((@ lz <?n@̛3/p  ܻ >< 8>=_ ` ?8 ` <D $H@A 8%,@,8@  N; (@0Uj^z@]~e͖=P Zk Wn PXp @ PY ,+`@fΛ `  (j fA 0`| P@ PA?@ ,Hp ^<`0` ~ <`  Hp!Æ  q`̈?zLP@& ``%˕  s ̩炞= ` t @=  $Hp A^ `@0` vp@.0@H0@`2.0@`3>\ҦK(`5֮_.pڴ{@Ə/p(`:8};޽(`<H~={ /> $0Ѐ&TaC8Q0fԸc@'Q,p@K-0 ԙ3A?,@QG&U@OHjUW&(kW_ 8lYPm[ou[w(` @_l>P @cǍ 0d֜@ANP @iӥ $ukׯa'(vmнw >xP\G>zu!! NETSCAPE2.0,(H888FFF'''TTTfffwwwŇ Hp`*Lx@#JH3b

P @nݻy]Å(yrpP۹w|x(0}  ק@80… 8 Ĉ b:zX$G( ʕ,[,p̙23's8: L x T(0`(0 رc0 -0 t  `818~@+[9s:{|@ѤG( x j۾;@ċ/p( @@XP {ܻ .`^ۻP ~_`8@@ Dx@ 6,pDQF=8@H @e\tY5i(@N=},pPCTi}@֮[8`6 {7޾{(p|@֯[?P ޿_(`=/?o@ ` @P   0`0` @0   @ (P`0@ PJ@Fz@W8kW ;lYg ĕ@w-p@_} 0paÇ8qc د(O~~@_(@P` (`(PL0`@(`GD YP1e

P kد Pv o Hq `ޜyO^ٱ/`Pwŏgy}̧? (P`(8 B  `D&`Ѣ 0"E(YJVlٲ@`:s('П(j2m)T PJ@Zj-P ذ` `Y h{ r= 8.L+^` P`r6s@&]tU `f.`ܹ =o (n0X9 nzs`A$8`<h ӟ@(`8aB 6t0(VX5.`0@#I4iR+YtR3iִY;yY`,p4uڴSVzkVT5[kٶun\lpw 01b0(P8 ,`@(Pժ0vl m `@rT~{v۹[?P @x pp~|@/.`0@P  0 ,XJ0` h`A I    ` 4@0@Jzz@d8ڵlۺ} 7. n[ >8b x q*[:0@ @@$p  @ @ 0@A( `0 `@ P 0@ `??@@ D@ 6,P D $QF=~1A%M,pJ+0(@ L @0@A( @0 `,  0   @  @$@ @L@ 6|@ƍH@dʕ-_Ɯyr<\@ҥIH@j֭]{ul߶]޽y/`P\ @,8` `X0  0@ `P@0`@ `̈@?z,ɒ&OLre @6o,Ϟ> *th MN:] :@  @@ PA+W(P~ ,`H<@ (0@- >|@ҦKH`5֮_Î-un]@޾{8Ə#O|9.=zc/~|x H~=  ϯ? 0@

0 ׮ $@6ޭ@OP $9H.@سcOP @<_Ͼ˟@Ͽ$XA 8CXb4nԘ@!AHI `ْedΔ@9qHO  Z.UzQNZUY(P WaŎ%[Y_ m̥;y=P _ Pp,f%G>P e̗ s&=U>P kرeϦ]mܯ o'^x,g@ѥG/pu{'?@է/p{P~X !Ĉ'Rh"Ƈ#Ȑ"G,iV\y`@2cH&Λ g@JH)ԧ jjrݚ@b8,ڳh-ܸrҭk/;Ċ1lr6s\ ТC'4hufӞ] ܺs'(7(n3o9ҧS_>ڷs;(ЯO@/p (aBp(VX5(dH0ydtfL3iִi;yhPCd@RI 0*T 0Hp 5$Xp0  4Xp7A{0 Npx 4vA)O^@f͛9wthљ,HpXvvlٳiHp w `(P:  @@v @Ax 0@P(( ?~(h 0P0  ':X x2ȑ$K< x 3̙4kڼ3'  @D* L:eZZ k\x8{Al x;tڽ7޽| 8w(0 @ (P 6`(`Ѐ.@ (P`  (0`@ {>˛?>'@0 (@ Ƞ(8`A<$` D(  ` 4@0`@0@@4H (  0X@RM>UTU^Śp` P 0 @(@@^ x,`0 p@A   (`  (@\`ڵmƝ[n޽}\  (p 0 @0` 8H@ P dP`@@`@ 0X@ P@ `ɒ&OLr%˖._Œ)s  ` A @@ 4@ @`0`$H0H` @A  @ 0C,y2ʖ/cάy3Α( `  `@  (0@(P~ .` PA (` ]  `@ 0/`ϯ?8`A&TaC  @@- (`@G@9'Qr@. (0sp @O?P   OF:jUWX@ , A$Xm۶ 8  ջo_ $80 $V A 0`=z@P0@={ (P`@ @  4PP` d׾=Aw >ѧW~A/H~'X@@  X@Ç "2P@"(`@ (P@(S*P˗.(PM 瀟?0`H X*`SH% `h݊@  `Y [0@08ЀA(`@ (@ (`@˗h֬sg(Mi RVװ_#(0`@ `@.`ȓ|H@0 (P`ӣ^@ (@(0@A `ؐ$JPq@ ((0@!E)@)UdK Y@ S@0@@ дL*`@0` P֬0[ @ + (@Xc$K.PlP  `  Zd 6t 0@  ܹ Pݺ Н @goo ?@@ P 0@ࢁ p4@`   `02 `vI@0 0@,X `@ A0` @@@ 0` `@&S<@0@8 hm ;0x ` 0@ @@ X@$p  ` @ $@@ @8p0 GHp0   9@ 0@ 8H@S 0@@ H  @(0@s / ` ` HA@@  @0@0`h `6@@,@  0 @(@@0 `,` P p0@ 24 `0@ `@(H@ @  `$P0 8J $p@@ @ ( @ l P`0@ @0   @ (P` 0 0@`@P  @ ,h`0`#h`A   `0@ 8`P`  `4X ` )5 0 0( @@0 *`0@@ h A   (0` 0@  `0@@0`@p`A   @@(@0@ @(@P@r >@t @ v /@??@(P /`~ D@Hh`!C@P`   @  @`$IND9` ` @  t耢 M:` `UV  `^:0 [+w.vȫwo<@a ` ƌ 0`2ʖ/ ,`Ξ; -z4ҦKH (` [A `>`8qƍH<@.֯cn}/~(`z  @ @ 0P P 0` XcG@ )r@ɒPr 0&M7  @ @@Ӧ 0W*@P`@@0gVo @w(00$V,qcǏ0y@/ `A04i` @06p-` 0 `@0@@ @ @0 8 A(@ 4` qǏ  (S(0K@srS@J(H"% իX*ׯ`ÊJ ]60 <@ `1ǐ#K6@20hp  i $HȞ-`mr{ .(9HN>`@ (@0@  =@ϟ0 &\` ( (@P`(P@@0@`0@O5P `ڀ `  (@ 4`A  ` 6 0`z `@A  ;0` $hP@x 0@A0 B>,@ QF< 0 @-3 @NP@ @*@@@ ] K@@ e0P@ 0W 4h@ Xbƌ<Y, @(@0@hҥM@M@j@ `@ H @9 (}tխW]{|>@x @0@_ P"@ (``b 0ȘQ(P`$&4h@.  s&Mn)@~ *t(F MJ`( $X 0`@P  `]ȫW <@ H,`1 @,y  `g>0@ `-;0h[7~#P \ W`yhA`Ϯ] ^ H?` ` 0p0@C0hp A ` 0@P)`@`0s0? 0@@QG @@SM @@UdZk lY@@[ (Aw2P@  h@L@@0 `@g `V-@ `  (A@ D cG0 @'0|Ч0}{0>}OHp` `Ç#J@  $8Ѐ((@0DArh@Ѣ XtH*իXVׯ_[ٳeU[@@@;_P X<@ @2@,@4 (@b˞=sPA @  4`A4`  @P; H`A P `/   A,d8 @0@! I  (в (0f `Xp h A Ua 0@ V $`0`ջ@ ,h@ 0@@0` h 8 (@PP $p ( A0 A  @ $h@ 0@@{4H@   0 (P`@,80` @p` (  8X`,`0 ` @ ` @ڴh P  ஁ P0 0 p@@8`(8 F0@(0f;H`X@@$p` P `@ @@$P  p@   ((0@ 0,  0 @0@ 8X` ` `@(X$p8@0k @(0@ K@4~p,`(  @ @,P @ @(X@@@4' A(` X`(XA@ @  @@,8@X @ A02eJZ0` @p`A(X Р   X x%@ @Al,8@ ,X `@`  ` ,8@4H&` (  0@ (| 0 ,h`0`+H   ?  X`(0 h Q P` @ @5m)@|IE  @AM$8Ѐ 4`@ @@w@@-@FLƍ PA P<{ZҤ PA {l0@ @6 @ō(|r?'`@: }| @$^}  @|_~ 4``$X A0P`DP>~4 H)`%˖- `&S> ( t耢F"M:@ :@V^%`~% @eV  @@v  W~ 0@a  @ .yΞ-4Fm`   @`70` `9 ]}  ^O~@ @_`  P@ B@@ q9R@I'M0/Y`7q0`@?} hQ$U*D% @Ub50A M@ U0@n K~@$ @cD0red<@0@@ӧ  0v-ǑP|D]d^0W0>} ?  ,X 0P@E Q A IrRR/Ȝ9rOJѡ*iSP0(A` @쀳ҪV-0]+@@a @@ @@(@P` ,x`4PP6(0wo@ȓ'0@(P P@^ PA   X`8@L8 @0@  `@0`( A0@ (д P@Yj% @a PV - 4(@],H`A P@0  ``A M0A  @ $h@ ' `q  `4X ` `?@O@@ 0@@0x`@ @ @0@ H$P  @`@ 0 O ` @ @A `ુb8X` `` w (p@  `,P  @V ` @0@A(@@0 `$  ` @ @@@ x` ` @   `@  tҀ `0   0@R @ ,H PAZ  @ h@k @0@A(` H@ `0 V 0@   X`P ((0PA/`8P   x8@ ` ƍ  (0@0@ $h@<  ,x`A {":(PN:E@U `ͪu^ٲΞV-n K`@ mp 4`p`A Y.c<`  `Nzu=`@- .\ ` }z`'` `@/P/P0XAA  (@A!>d(0A0rP$`@ (,X @p(( 0@@@ժ0  `@ٲ ĕ;@@@ |  8p ``A XpÇH0ŋ3j8@ C `IRXYe0 ,0`@0 @((0@(X(`@Xu@ @h0@<@.  @X "G@98Xp@ @ ,h` ȖMvm(P@@ X.y@ PA  0  ` T  8 Pp A 0@ (0@ 0 ,Xp@A0PT@,eA L% `@0@`@ @i0  4h(`A P ,8@4X @  =@ .` @0@0@@4X @p` _/ @ @`@ X`,`` @ P0(0@$P2g|Р: PA0 0 0jp4`j@p`A5@஁z  `  X@, 0   @ (P`0` @0 W 0 @( `vpP@ x`,` P 0P`@B 8X`@H@8vAHPe0 p C4x0( @$x@ @c  ` X@, {0   @ p< 0@ X` P 0 @A( `@pP@@,8`X @ Ap^@ pA  o_4x4( x8@ X` h dJ8),H$  @ PD  ` 4@ ,X `@ \ 0A   `  `4X@ ZJ     (0@(] 8^`(P ]xAP }(A? A &h@@pH@ƍPAL (@S̙lS*@ PAM *`ԩ(P] PA @K`@u (x 0P \@ `fΛ0(0`@ F `@lڳ6@@ 8(p 0խ_' @^xG~zݿw/@0@ `0`@ @X`b00`A%P`%K. T͚4 ( *tFHj`)ӦK@ `@ p^ ` 0  `. `_  `Hx@,`ʖ,` @0@@0`m@0@N`@Ə#/0@^ȎA޿##H{ 0@} h `@ h` 8H@0 $@@K`p,s-P`G$U:@OD0@d0@0@@0`o"@0@K`@m0@(0@ݼ{6@@0<(`t A  @ @P@ @ ~ 8@ @8@B(@D\,0@c,HP\@ @' 4hE(TL <U ] @ر̞El %`@[@(pA0@@b Yd,_L@=,`h0@֭]P (0@n|@| ܀͝?o^@:\/= (PA(^} ?|0_~ 0 40`b.0`c @ ɒ8X  `@O~ J  %TN( u(0` v0 +w 0 0  @@<e.c<@@P P`5Pڶk+` @}n  '`@  ޽ @$pA@  @ÆD8@1(0@P Pr@ @p `( :@@W dպU (0gњ-0@$pn] <@aÇ0 D6r0` @@ ?`@ @0@@{(Pп_(@P` PA#   hܨqB @ҀI (  @ 0O 0@0`@@ @A @ׯ_ (A P0@@@ w0  3 ` @(@0@ =@@$h@4H @HG A0 A  @~ @_@  ` $HР ` 0PA @(d `0 Hp  `A ( A0@@    $h`0`i `q ( A  \A 0`@ 4(  <@(H@m @0 A(   H@P= l=0P>@8 HA0 @ 0  8HP 8p HA @@0`$@@ @8p H0` @(0 J@$P  `@\$p P @ (  8H@ @@A @@Aʗ+O@ P@$@` @ HA0  $@` @H@ HA  ,P0@ `@0    ` X@@$p @@ `0`@ 4(   @$HРh ApM@,p @ `  PA @ 0(` @$HР0HAP A  4@  ` $hP 4H$I8I@ `  T8J@ @ $HР 0 l P@07]@P8vL X ڀ (Z(A  0``  (  @ܻ{.8O`@   (0 ~8@ _ `A DH`B (. HG @@  @.  s&M6m )Ϟ~ @@F HS  @`:@`f `-[@`.w,` HC~<@/cL 0k [7޾ ' \ @@s  c`@ /~<Ο7@ /}  `?(P@@PH@  bE+ШQ@G=) 0` @K-  7oйgO:PG P@ӦF:d% ;lYg `@[o0ww@L@$q (0@@d<ϟ0`@uk ` @mqн[@xq@ P оv ( @y' Ǘ?~} 8XȰ"F42 @0@R"h Ab@   ` 0(` ӧP P`@  `W  PA 0@0` 4(@ @$H`Xlc 0HA `MӨS6@@ @ ,h@ 0@@0yH` ` @ @A(@@0@`@` C 0(` E0   ` @@8 HA `j @  0@  k Yiծe-Z H@ l @, @Ȑ P @ gD  0@@d06 8pp@ɕ@L7Pz0$@@  ` H@ @ `B  H `HF,i$ʔ*I0@ I@$P 0@`RhڴR @@V  `0j hk `^(h @ d& @$HРF(m `  PA 0@ශ (n@ 4(@N@ڷs;x @PA _ / 0X@@ pH@ xQ@dH 0I ` @L3Pp(B@K6]j @ t @X 0{V@ .\po^{ q(@0@@d0`y@ 0}u pz@h׶m[  `xÅ Pp  @@Wn]۹w'`  p^ٷw^Է~78စ 8|ဉXF :*H J2`J Zd3 ؼ  (PAD*h`0PP@XJ@  رc `@uk @ W^ @@@ 8~؀*P ͜ (>m 0@j۶=@{ -` ;y$X= ,>|H>'x,H` H@@ 0@@ <4@@ \4@@F |I@H@I@@L5 SgN TP @(0@U U\|@EVZmݾ@0`^{  X`… & @<@@dL@|yLFZuj 0@ō@<]tխ_Ǟ|7^< ( @ǟ_?~ D (A (Qb.b̨q#  )sȩ0ѢF"Mt)ӦN,P@ ``    $`0n 5@`.]v ȫ_ PA 0`@ 4(@ ʖ $y3Ξ?'(`4@k^``7 @p`|9ΟC.}:u =( `A 7@@ @@A dIPeK/0Lp j0 O PkW_;lY 6( `A $6@@D` lH@  0vֽwo >\ Pn n0 `  }{Ǘ?~}   ``  ` $hPhG `' `K 0HA( AJh(]ʴӦ@*U `%@   @@  0@ LÈH@"K6@`@L`@  @R 5b& M@@  ` У( @0ӫO?@  Ͽ$XA  %HQ5ncGD@T @K̤I9uj Д*ի:+a,HpԮe[qHp ۗ &@a`P9 0ЙgСEPZT:0Pt];Xq 8yL> @'/y о0(P}?,`  D P4@ (iʔ( ҥ1 `@ Р@-ZJ*]ԨP,`pb (Kj `w(` .l0 $  @6s3П&`ZjVZ06nw/n@ʗ+?P 0`s0Ǔ//`=ӯo> ((  "D@ P0@X @fL@$ 0zh6ez`@S8kV +(@P@(@0wqbŋ7vrd|ٲ 0 6M0HA( A0@  9  $hP@v0@<ȗ'_~|Ѐ $`P@0H @ ARJ ʕ,[| 3̔ 4 (`A 5@@Z0@ 0  8p;n|@ɔ'8   : 8H@8@(H@M@ <̛;=:Xn  8o H@  4@@B0@@8p0@ @e\ty@5i8@N T( 8H@8@(H@K ر VZmݾW{wA   @$H`  Mh&`@ ( @ 0@@?w>թ(@v 4H A0 A  @@~ @"Lp!Æ,pŊ(` @?H`H ( @P` Ϟ>0@ %``)ӥBZV`+׭+6΢Ekn 0    F0@a0`C,y2ʖ/c~\Ξ;'@@ @O&z5֮_ {6M` 7@`pƏ|9@=Ac7P ޻(`~(0&Ta  @-8cG 0@IT 0@gO0(4OB5` @UW  gў=P @[n 0n0  @a#P0d dּsgϟAkV @iӥ  mvmp֍ۀ60@q @C'0}d׾݀/p@y,Hp} ?_o4@0# P#Iɓ(S0c,p͛60@JѣHӧP @jUXhʵ`ÊKҪUk[;x+`_(X̸ǐ#Kf@˘/8 @:ӨS װ] (Ar6@7 .@'HN ν (  @˟@  $XA LP C Pb GD0@$)S K1  ` $`P ` ` UYlʵĎ%[lY `m $hP@$X `  (egСE@ԩQ8k Pܹ`o ` `nHA @@'@ y @@ P߾?@x@ (p 8 0@@ 0dY@2c8&Μ:wZJ&@` TR `5Z 50   ` 0@@ h'O.̚7s@ТG(p0 0@@ 0 (@ʗ+/pҧSn:v/O>h} _~ @0`@ 0(@( @@@F8 @ `+Y,@L3iִ@;y @ p*@pU@Vt-P @Xa pmZkٶu@s-p@^y 0  0p1ŋ7vX@  pstѣE0}tXvvԶ}; x   0`p}@۹o/p@xɗ7w߾OP@' <0aA xЀĉXxq:z2$H82Z|Ҁj0 < @ =jL2u 5 x=`d˒=P ڵj 7. {׀^|5@ p`   @@͜xL 4J8m ի(8;ٴk+ n  <ċ 98 tXP >< ?> xۯ_'X@  @    @#  %K @%-  5k@ 0@С (M>Z`@0@֭ e0@ @\P ^{ Xp @XbƋ H@d s< F}j [lMn|ܷ7`  ]tխ_n@v7@@x@ ?0 ~ p H0B|X+(` 0 r$ɑ (. (AȩϞ @P@F5`0` ժVbͪuU6Y @`+` PP@ ,8p#>|`@ƎC,y/[>P Μ  z@p m @ 00A 0@ 0(@s @$H0@ />o000@A P@  00Q$Xp 9RdPDy`@/aƔ9s7q

zdמ@/p@y0  @  ` 8p HA @@0@$@@0@ $p Arɳϟ@{ @@( 0 0@x@]p=P@xݫ@ |@È8 @ `s00(@ @$H`0`  Xn H A νËo@ Pp A48Р @ (` .TX!(E5n,pGPdd2A@0t$O  @QN*+W (P`Ԯe[q5  HpA 0   $O\̙1(gСE.piԧu̦=;tݻ70 /g\O>]ٵ0` @  _yկ?o{ o` 4P0@P@h8@#8"Ƌ #Ȑ" `lɲ2gL@9  `B 5h @TR`*Z j0`i hܸ+z07` `Xb0@& `ep@ ` j @P``@‡/nx3_~@ң8: ݻ 7@<`o_~  0 0b(R ` ` @H p@AL (  hP` @ p: 0:@c8mZ pn\s p۷ N@4&`rd)|@f͛9@hѣI0p4 vM PР6`  ` 3g: 0h` t?= ((0@  ` '@@  0@|@ $H (0 j$8P@ؾm{>P ċ?^̗( (8 0` @``  0~ (@  P `@0` @$H` r@  0@A 0PRPp A8 @ A ` 0  <`@ [… (@bƍ?.pdʓYs|80@( 0@ \ @0@ $p A@0` 0@P Ӧ 5`rM .|ȓ+G>@s >]u @P`0 /@A ((P@x 0P@ PbE P (dP K/ PfO Z.UZQ&@@ ի(a ` (q PP (۷/   (P @P ((0@ (e^pA $8@ ^0@`@`0{'?է?P {ϧ_(?8 ƒ  PH6r40A"G\`rA*S.hf40A$X` $Hh 0eJ0   (l06 k7z ׀ `p3^\Ȓ#(2̚7s.pР`n@g.pܺ(78`8ʕ(98`:; H< ހӯo>~ `0x6tbTX@9n,p@H!p t2A3i,@N;y@CHiRK&(jTS 8kVlXcɖZ@k8n\ po^{(p@`p4v@)O.@f͙ 6}uj puh׶}vx'~`@˙7wzt pt@ɗ7}طg@8~ 0@8`:lX +Z@;r,ȑ$KLP ʕ,[p̙2 3Ν<{@D-pҥJ 5ԩT8 ֬  kʚ-{`@l8 ܸ 8>lx;~+[\@;sNP ѤK>:~k>0 ݼ{=ć( x[.ܻ8 p ۷O0 p 8 @ B QD-^(q@@!! NETSCAPE2.0,,\888FFF'''TTTfffwwwŇX*\ȰC Hqb2j̸ @R(@P`80g(@P`Q OHZ غU`0Xٲ XvmʝKݻx(߿ pÈ+^H,3c^` 0@0@`k4X&` @`>@0@,h`0@ ȟ/@/p$XA (C PE5nh@!E,pI'0` K(0@ $P0@@@(HA  @ (P`0` @ /  \/V\ȑ%O\ s &]iԩUNP kد Pv ۀ  P 0@  @ H` `0  @  `0$P'J

:jx jۮ]ݼw( 8;o^ԧ( ʛ/_( ۿ?@@ Pa<@-VLP F $RdDy@-]LP L3 $SgsE=P RM>UTU^:@~z`@eH@Z n޵@}H@` @q?v@ʕ)8@f ZhҥMFZj֭].plڳ[w@ō/pr]z\~@ݽw/px^}@ǟ_~ p "LPB|x@+8`#Ǎ )2dN@ƎH`2 Ȭ9>|`@ҦONz5֮_Î-n}`@޾{H`8 H|Σ?@8`>ȯ?8`A&TaÅ $0dԘA~

MP@WfպkW^ ;lYgѦM`o&@` @ݺ `o_ 0p 0Hq 002 dNy=@ $Pu`dž] ۷m/`Pwo߿>xPysϡG~ ,p{w 0  @@(@0@ 0A  `@ "*Ȁ2jX@ B2`'  0_:X ɳϟ@ =QH*]ʴӧP>]` ʵ׭ @ٳҪUAp;W (,@ X̸ǐ#KL˘3cN` ((0@ @P`@@&@P (@0y  @ؾ @ `˟O`` P 0@` 4@0@G0@@ w(?@޽@@  0p  (6` p+Y @h,P`@N;y9hPC 0zT@RK&5 pkVr `@X0 `@Zkٲ . `po^   4  <@ ,@ @ @ m@@ 4h@0n\@rөWp 0?@ p/`@|'p M@(XA (0@ `,P0 @0 ^x,  ` @ @AD 0@@C@4@@$p`A (848p(8(  jF N0 V @ @0@  H@$p@  ` 0@ X` P0 @( ` 0`Ə7 @ @@0 `$ 7  `~ P>8( P0@4h@' 0% 00 ' ` @  @$@ ( \` P,@ 0(@$H `5kXo0`#h APN@s0  (@@A $h 00@  @A X( 8@H@ 4(   @@I@M 0HA @p P @j 0PP`ׯ ;@ (0@ PAx ;@ l@@ qc" `@  gCm V(@@[n@A (h@(W.s N}u    ' = @P` 0hp HPа@%NHQE б!C(0@)U4 `K̤YL9u OA %  2`TSQ*PU  PĊ- Yiծ[P]y+_Px@(` $P    ]ڴi ` @00@yK  Нw@4`{̟@W@ @  .0@D& 0E ` @  $VPe2 ` @ $( hZ  `VZ u `Vڴh \08`]0(\`b30` P6@@ @A (@`Zjf5l   nv&[ @@0   x 0 h?@ (`}0  0xp .C8`9r$qH$@ `@L3ipM PC%iR 6e 2P`[tȒ0@k pn\n-p/{pp<T0 <@ uj@(Xwn  P@0@@r3z `@8Ѐ 48p @P 3h` (P P @@(@0@ƍr  @@ (0`4k(' (@P h P`  p` A  @@ P0@xK@0` @ A X  ( X  <@  $P ~4XA @P`(`$h `P@4H@ AH@ 4@ $H, @@Pp` (P` (0@(   @`,`0@T\5@@ @@(X$Wn8l @(0@   8h0 |v4x(0@ P8X 8p(H `  @ @ 8H@,  @0,P0`@@`@0X( X`,p`~ 4 ` @ 0@  ^&@ (@@[ 0@ `@ HA(X`1 (0(0@ 0 ,(H@  0`@$P  `@u$` ` 0@  $P0`@`@<0@@ P0@$HP`%` @`A(XhQ   A0d  @((0p4H` @ @A.` ` `< h/`| '`ཱྀ (` $Xp 4T!xE9r# e+Y3ips@N;yC 0j  jTSz@ Ȓ k p.s o^w  `qb )'8@͚tVP`&@@pM@@l]   p| 0T^  `p|   p 80  x8@ # 4@0@0@`@0`@ 'I@8J@R$HРTj@ x`A       0@ 0@@ 0@b ,h@4X900` @`   ` 4@   :$8P P` (~0@@h @ @P@@0@)@0@0@  3,p@E0 (@ @4P @$@@0 ` @(X@l @ (0@  @ H@P 0@   <`(0@@0@8p0 (@0@ (@ ~ 0@ 0`!0@  Ҁ 8,hP@0``H`X@N `@(H `  ` 00 ` @0    0`0@ p  ( [ ]` `x(@ ` @` /^<H/`0@@4Hh @(8AC PP` 4`` <8P4@   `4X @ A$MJD  A  0v 0@,Xp@0` @p`A(@Pq #(P`@e˗- ,`@@(P (`ǎM`@m{߾0` @D70@ׯ/x}A (` 0hPA?(P@@HH@ظq P  P@ sZ@ (iP"(@U`"(@lYh(@0@p0@xݫW_ @ Ppq,x@yA0`@ ,x`A0@װȞM{r @ `ȏ X|H0uνҫO}GP`P X  "@PC$HqE4jб! id(hp $xPsA  PA@0^`@@A (@z (@ _~#@  ,X` h@D4( 8v H0@+Y0f (8  $H`@ 8  `jTR0 :  `@Zkp;@pwz[ 0`0@(PPYH(0@@ (@@$8`X @@˗+8` @v< 0p @ @P` 4@@h*@  ` H  $h@4X @  x:@ *` @0@0@@l4X Pp` K@0@ X`,`` @ P0(0@&P{~Р P Pnv 8XЀxo` 0 h H `   ` 0@ `0     `0@R X@,`|` @0@ X`,p  @ @ @   \` hfΛ4(@ h @P@ (A6@@7|0@x @ @ 4@@ vݻo H `   `4@`@0    0`0@ @(X@ J@$P0@ ,Xp h A ;@ HA  W4x`/߽ ` .  \` l`s @@hP@+v@@;w` @} p^ 0@@| ,8`4H0A  xP0@ @`@ (XZ` @ @P@ (A 0:mJ  0 $ A  ` @`@0 ^,hP@@$P0pp HA @@6@A `0 `@ ` @8@@X' A(` 8H`,`@@8@ @`@ (X\` @ @P@ (A 0l޴I`@00`p A  ` @`@0@X <8P@@,`P8xР HA @@<6@A `f0@ `0  @  00@ X`(0@ (P`@,84`@ @P@ ( @=  @ `0@ 4@0H"%`Pp A4X`A0 0@ % $HРL@0` ``@>PA  A$P0 ,Xp@A~` H>`9 P ] }@_`(P@@ @@ 0@`A $0 D4 @@ @   @@P@7qP*F$U:O :W@ (h`A0  (0 00x@Ç (ǎ Dױg' 0| ^@{(A  D@p(P (@​ h,0` 9( @P倗bʌ)8q `  @ԀQ&5i@5  kW$H`@ @  .x K &@@#.x"(0hެy&0 Xz 0 0 X|s@]  #_`y _^ `>`0  ` L4b@ Ǐ08@)  1  &9  'APѣ,e:Q(0@ [v@i @0`y@` 0@a/.x \y@4k `C `TV  `t o 7@8,7 9 0  `ŏ'^y `ߞϧ_߾_,8`@0la P`$J(P@@ (P`B0x(ң  P0@@@  ` (  + P.A3nX@  `Y@ P @@@ܺ @(n|0/0@ Pڷ 0@0 @ @@| O@ 4@ 4HA 0xcF р 00A @ 0(` @$H `p4@ 0@`  ` p $`P@ 4HA( A0@x p $h@@0@@@$H h A X@@$ ` @0 A(   H@p  8( `A 0  8H@ $p A4 800 `  8H@$p @ x+@ (P` 8H@(HA   @@Z;@(HA @ `$@@ @8p   8|` HAhA 0  8H@$ A h 0 `  8H@$ @ 0@ P0 `$  ` @  $@ 0 A @@j   $hP 4HA @0x@t = 00A @ 0(` @$H`, A H(@ 0(` 4``#>  $hP 4HA (  J`(    ` 4@0@W  `,,Xp h A+@   @P`Ǝ?P `@  z 0_^@  ``@ @P@(P 7@@ 4P0@PH`@   (0bEd(?@@LI/ (`@AP*@&UtOF:W @`  m[m ;%` @  `Ǐ!G@re˗1[ `@gϟ; -`@P ukׯ_=[@m۷oM @.@q  ys@:  @w / `p}{  0  @@  0@h `GB P@ `%0  @SMr @@ ` XjP:UUj5;Vٳ `% n `@_LXXL@ǐ eh&@@ -z 0`kb @@`@o '@\0@9С 0@ ] @@y  `@ Ͽ P `PC$ `5n0@ )S `KdPM7 @@A Z(I.5@)LZj5+aŎ%+i  @@qΥ[ݸW_  aĉ,& <@e̘@EPzԩU@u̦];ܹqwo ( qɓ (A  Nw@ О̧_}7@@@`   !ĈX@q"  $ 4@ f0  `,Xp@2mj  `V PA 0@ଁ0` 4(@ @$H`0``  @f63ТGl  5,Xv0` ` r (P`0@ @0   @ @@,P  4p@ ph @D0@A `0@ $p @0@ 0j$@@0@[vlX\ 0k @    W6@@pl@@d$p  ` @h @ @j @(wnݻwm @p0@A 0@ $p @0@ o$@ `B:|1ĉ0@ H@$P 0@`Lyz `p xj @@@x5@`   ڵlxk @0@@  `  @$H` :w6  ( A ۀl ;ݼ{ۀ0@@r 4Hԩ0`x'` @ ހ (' ~ H@  ` B :4`\8RH  9@5  S @@С0@RM>u@@V(P`e  `m @śP…  b @,l@f=Z4h FM[lڳ ` n޽}\xo @>@r<.@t\'@ +`> +@@|(AT A@pa@$ E1)R HiS0`(FH4N:5 `@Ȫu+ -0@fϚ5@@  v `߾ 0@  Nx1$H`2ʖ/ON $Hp`4i N>}A @`60 Hn`ΝN .  ހHO`=/@ϯ_(  @D8q@Ŋ0fh A9dI'K&@@ @`Ɣ9fM7c )?:T@Q@O>pWf՚kg @ +n]w%@_8)&(` F i@H  0A @ 0(@ `E h A @V] l̞5{`@m8@\ 7$H h` A  @|ZhҥMF=֭Y'(` lm n@@   8H@  H@ @@7@~ p L:

 FMP@ @% @0`$@@ @8p0`0 ~ @  l ʔ y O>P ֮ (XA.p  @A @@sC.}:֯c`޿{OP@ ހ o@ 4(@ @6H Ph! 00`p @@4eK9Sp9?}(hQ 4H A0 A  @@@YUm[oƕwMP@ 0'P @@@ `-@iӧ P `֭>0 @qD. ( @w (P` @  @׿H0@*L  `"3j1 $ dI( `%0aI8s,pϟ>0QXtJjիX ʵ׭@ -0۷pʝKw@0߾Lxp0@"K,ـeLgB-iS  m 0oN|+O`П(u= @@=(P@@(8$XAaL81A G!Ei$ `%1 4@@9IOA  QI L:nMa(ٳ6 P7 ׯ P,fcȑ%pp`@̙18g P `kرePmܹu6;o Pqɕ(O7@ @@w P@ ${ϧ>A/p@HP@ D&RhbE ( Ȑ$ ʔ*Uh2̘2 `&Μ:w('Р @ 0Pj*Ur-ذbǒ-klm˶rMP@ %@  `ĉ    ` $`P `e0v]‡/n0o< 4(` v ,h@0`@@H> 0x`6dH80@$H0@@4@ $p   ` @P  ` @zjvl5{6$@` @H qbprdɓ)W~|@͛58th p:0vh0w ` @p@A 0@@@v `p>طo_ ׷?Ap0$@@ `0 82ʕ,[| jڬY8>yڻ' |? @@ LP B 0`, F) r\,pL5męS'EMP@>%UTU^ZUVz5Ve͚pmݾk@}5`… @<@bYr,_`A$8Zh@} \v}@ڵi8@n <GrN@t \7@/@x 0@ܿ/@ǟ_ Ѐ0`!  Q`(@  r Lr%˖ )3nY>{&@` Q HtR @@U @@ @@Y @@޾% Wv`/_ ( #N\`@0`2e.Ȝ?0@ `5k]ڶk'(` ޾m@Ə?P  } n`޿o`<H~=/| o`?8`A&$haC F4@@@E1@ @G9RPTeĔ@7q,p@O=00@N 0@@WJ@@  @@YЦPĕ;7(0@߯@ HP@$` 8@  ` @@8p( ZUYnjP6@@ 8@A Pp `cȏ 8e ܙsD}` $`0@d&@@$HРh   @s PA 0@0P~  0{ϧ_/@ (@`@ ,Xp@ ,i$ʔhfҜY:s&(@ 0R0T  ` ( ذb (Aֲm ( @z/ (@`P@ (AܹG>P Wn]زc(6w7`qʗ/79ҧS.@ڷk@; /o ׳oz'` ~H`  bTX@9vdH$y@+U8fL p; @  K pT@ԨT%` @@XȒ5-Zk Ե@{ @`0L@p,`@dɒp9 4`P@ (X.p@lٱpwnݻy8xp 0~x7g@ӧ @@vwn @7O p׷O@   (P*Z$ @ (H J"(P`@ hL4k*@z P ` ( ԩz 6=k@l۲-pܹr  |  >L Ō xL ɔ+O69@0 4 0@0j ` ( wn z3`@ P lڳ [wPp A  `@0}  0  @ @ '@ $`0@ d  (P` @(`  8N0^2@0 8( ` 0` @$8` H^8`,ٱ Hv-۶n  w͋~=0$(`  ` H @@H-  [ @@8p H 0`0@ 88@`@ P  &HЀ<`P 8p@ HA@@P,p@K-0fM7q8gO :Th&Ez` H@ @$ A0m ` @@@ 0$@` @8p0s $` 8 .0@4H  h A 8p@(X ` 0~}LJ@׿@",pÇ @ cG h \Ҁ @38 3h A(@j ի (p P 4`VPp` @` 08 AA   4(  ,8P iXzb˞Mޭ@/p `@@0@@ h'@`@  `XϾ ȟo}(@P@ 0 ` Ç0 (P@48`0`@d. (`AP PL-P@ʵaņ=P Yiծe[q(]ۗo0@a/&c%OP ` h S`ڷ /(o> '`0@ ` P @f͛9g6P ѣE(` @jvvlٳ_!! NETSCAPE2.0,,H888FFF'''TTTfffwwwŇX(Ç#J,pŋ#)2R4@0 4M8 J@X  J@Xj:`(ٲXvʝKݫ@.p(^@#KLr2k|@Ϡ?8 0ub 0v ` P$`P@0Ap XȟoA?P  ,pAC%8E ؑc!C8I `K1 Pf乳A]РI P0@`@a4x  @ [4(00@,@`@ l@E.piԧkرe8m ݛw8q `s Pzl羽Ň (A0 0P`8p  @(P` @B((ңhRj*p@bNJ-m@rҭkn{@80 ` @P`@P`8 @P 0P0v.AƓ@8= o>  p2,p@DpcF98dH 0ydXdA0@9`@0i (0@SputP` (p Pns-`{(p`0|7vrT\@9o.46]@Yvvhצ}@ݻu8xp   `@7wztөWP(0@ 0طg_(~/( „8tX'( ƍ;z,pȑ"2%|r9 < D(0`(0 ԩS0 x-0 d 8 `ܹr7/@ >8q;n|@ɔ's:{|@ѤK>[>P ٲ ;7 P x8~| =X0 ^`>}(`( @@ @PB Qb\x@ RdDRJl޴Y=y.`0@ @TRM>j(`](@X@ܾW{@}-@F|@?Yr,_|@Ν98@h  Z[ڴ PA} 0@(@P` ]\/0`|/@<,^}?P ~ p H0B|X EȨ1 )r$ɑ r 6o\`> P  `4H @ A  0`-P  `@0` @c, y`Ό?{>P@ҦON@^~}@ڶk[w~}@Ə#OΟ;?P }  ހ ` @   0`0 `$  ` @(0@ P0 `@0@ ԙ@?,p@QEiSO8jU кUk_8lYPm[o0՛]` P0 ` @0    0`0@ `@0   @ 4X{w ?^|ЧG`@Ǘ??P @(`(\#JH2jx@ ?8ɒ  `%b@0A   `  `4Xh%`   (P` 0@K |@È8L˘3-@ӧ 5ȞM{ ^ȏ/`0sH z (@/@@@_  Pp,  X4nX!AI)UpK/Pft,pO?0QI&5P Q(UڕPYg[nPn߿  /V|@ȑ!8e gСA(iԧud.pmܷ0(o3Xq `ޜyO@(0'/ `Ͼ@_?$X 2dX `ƌ,Ir*Wl%fҜy@:sg`AJ$8)Ԩz rz@b8,ڳ   `@-P`޼0@@ .0a  `d&O`r̙p,ೀG(=@ n@g.pܸ,Hp/n@$X`o/pǓ/o|oϾ_`paBbD xcƋ0#I

P @jթ vlٳi׶ @y.80~yr˙7@өO/p@v0@  (P` ^ ,h` 0 h`A xH X   ` 4@0@xIjڬy@-{vl ȭ{7~ |8Ə#.@ @@֯[p޿/~@((]@PJJիXB-ׯ`ÊKl]p-ݻv/ ,8A#.ǎ@2 hެ9ACpӦװc˞M6rͻ7PȏN}zk^ '(X~}ˏ_ '( 8A C%NXѢ4nG!E,pI'e̤9@9u,pO?Ph,e@QF-pUWk%;@iծe[q-]yׯ &<@'.pcȏPrl@E.piԧu̦=@u.po Pqɕ/gyO^uٵkpw P| g>A/}? $`0lȰ@'JLP ƌ,i$ʔ*WlIr@2gҬi&Μ9-J@J*MP ԨP $`pʵ@bNJMP ڴh $ЭKwz=0 .l0Āh1Ȓ'SL@6s|@ТC84 hufӞ}@ܺs87 (nx3_~@ң8: ;Ǔ/o׳o=3X> ` `aB 0b 0Hc 0$ ,Hp2 pi@L,X '%AK6ujTS28p [vlX0{ ضe@0@@  @0p(`L (`@Ah 0`6 p6$o 0~ ˙7wzt~ ۹w|xɋ_` p~| p~ @ x1" 8@ 2ȑ$K<2ʕ,[@0PP`@ (@xJX0 (@P` @(w(@{  >8Ō;~ 9ɔ$@0 (@ `PXj0   ` 0( @0@`@` A@ 0X ۿ?@@ 4xX@$p  P @$ A4( @ 8H`@ 0@] `Xe͞EVZmݾW.8 `  0`@$P  @`@8(` ]` -`,`P`p70͝?]tխ_Ǟ]v(0A  @` P0$H@`(  PA((A>  r PP`e ``n̩s'Ϟ> *t(ѢF,P0@  @(@P` PA `n @(A A F@c  `Ξ?-z4ҦONz5  `ڴ0`7o.\ P`9s @P`z֯Ȯ} P ^ PÏ/>8 &Hp@ &T0A$X0qAdԸqA@ '$h`0s 0?:t 0i(P`(@Pg@@ 0A ՛o`AaÇ'V Ǐ$X09A,P (P4Q3P@Ak`#P F@ @ǑG@ (0@@c@/ @(@}  @(A0@C P @ 0`@(`@0ȔɠfM8q2@ϟ 2P@ (]A 00 `իh0ׯ`;X˶m@.](0߿ ,`ÈX (e   M0 4PP@s-@ N XΜ@ (P@P‡7@ (P` 0}7@  XР0@$ (`E PAPR( `1,M9 `0,%TLEP`0@W @Y@- y _6PĈ@0 c 4(@ @8`DPi08pA( @0q0 `   ` 0@$H 0@ Pp`A(0@60()` `L08pA:u`40i ` @@  `@  $@  ` HA   @ W6 ു P`0@ @+HAn 0@ @@ @ @@4@ @D A @@$ ` @@3  `   `  `0@ @(X @ ` @dɑ  @ (P`0@ @0 `  @(P`8pn00   @ P X` ` @(0@ r 0 `@(XXp h`A  A  @ $h`0@@ X `@0` @`x   ` 4(  @`n08<0   v (0@0@ $h`0` ( @8@q 0@  `X (@0@ P=@E PAM (@UV0@]~%0@̚6@@ +@} (@@b<@ \@<6 @Z0@(@0`>@ō@>@]t0@vݷ@ @z?@|_ `A H0@(q"E Ȩq#G= @&OHr%._4 M@ *F MNBtbͪu@`-0`.] 0  @`0 x @ ye-ȜY>@F-` `  @`~n 0`y@@  ] ~@/P`}?`? 0&4h @ `1f0#G` @%`I`p? 0 `@0@@ @0  V  P@@$ `@ <1м@A @Ė-6m н[7 xqljP.ysϡGgN dמ=0| ~ė?@ H0 (PA0# 9@IR\ɲKbʜ)`M8s0@ϟ@0@ (@0@ӧP  *j@K  0@p]` ( (@P`(P@@hP=ڀӨMP@A  (@   P@@ @@@@ҫ'@@'@@ @P`  @,8@ 0@@0` h`A`IdA  @O?(PA  @@ 4@ ,Xp h  00A 0@y %`@ @0`(hp@( A0@z 0  `$HР0`@A  @@y/ @П@` H@ `@(H$` 8 ` 0`@,P   8@ @@  `@ (hp 8p H@ @ < y0@f0  @ @(n @ (O@' A @@~0$@pap` P 0 @(` X@@ $p A  ` @R0` @T48@ @ x@@$p  ` @@@ 0< pL@$@ 0@`@h `@@j$ @@ H0` ` ( A @0O@ 00_`@ @P4H@` A (`  $`0@0 048@A0@ xp 0HAx%`  `@A  0 8,xL@@ 4(@ xP>-xMٴ P   0@̛3_`  ( (@P` PA (@0`@h000PF4H   5  @P @P`M uU(PP`` Wu W^} 0@A N`;Y,_YΝzM@m\&`@ P0`@$H`A @t[]ݽ^x͟G?~@0@@p   E08q0 &@^@ ` ``h HJSN 00`@ hf8qǑ'WyD.`0 {wG0`= 0P@ 0`@@(\ "" 3 `@  (0@\)˗ @  S PA (P $8 0@@ ;]W, (0@ \@ s =z 4@0@  0X Pp`0@  Pp`A0@ = 4@    $h A $`048p 4`P@$X8  `0@@0`H4HAL%` @WPA 0`@ 0`.[ @0@A(иP` 0X@  @ ` mܸ P0@   H@ `  o 8A @` 0`Р@ 00A  0@@ 0p$` @@@$ A @@N ` `@R$ P 0@b` ` -0@W(` 8H` ٳ 0    ශ `@ @ X@ 8 4P @X@ $p  ` H@h @   pI@$@@ @  @ @ 0 ,Xp@A `E A A   `@^P@ 6 @  x 0@@f $hP@ 0@ p @p  (4`A`  0@ ' A   @xH@D 0HA @p P 04 P (0`-P8P zU 6X(`A   0`  80 ` b(P4P 8Р J3PA @@ @ݻ< (@0@ԫN@v@`@ H 0 8@@ @@(`D  @90@H%MRJ\i@@ 0P=}dThEm@AP@A0@V~*@̞EVmK@(P $X 0   Yf  @@-@0@m.0@\x N@t@ (@^x?@=+(0@ 0@A 0`B ` @  `#>~P`d& ` @) $ș 0 ` ` uꀪJ@ vf %0nߺm`v Wo,`0a@c@P 8Ѐ`4  (P  ` ~ @0`9s ` @  @/`(0`  0 P`~8P!! @иcG(HdI  @@/aƔ9S@M4@@0h0P $UASO (0@   v@Yg @nĕ;n\0o<@aÇ P P@y PA@` @@@p@,0 (@ .:о0@ 8ЀAhW((0`@ "(0@ X`@@B$@@ɓ(P`@9O0`AG(UZ`     ` $h`4H @]@  A `ǐ/P0`  y 0  5,H@= @`ۯ@(@@D8@B0P \Lp;"@P@%@Y \6`@ęS=tP=*@ <:@TU^Z]v@0@ڵܺ %@޽X…@L`?v\9Ν| @0Npk#@  (P@y<.@N@O@G/@z @P 0@  P 0` Q.( >0`&O$` @Y`6o9`@>{ @"0`)SN@`*թ  &8pf2`@ @(`@ @`   <@ Ȭy>P`t  ` -[{w~ 0@@@ }֭ ] /~@@ `>}?`  0 $X h@AG(P0`0@)`@0tG$U:@@ӦF*U@WfzU@WV@ٲ P;ĕ;w(o ,x@ ` Gl@@eY@g=048$8(.A 0@48pd'@@@ (@P_?@X  `@b    ` (@ @@0@0@@0`G4H @*` ٳg @ ]A 0@@ (Ap      ` @R  @[ 7 4@ ,X N@0@@ h`A@0A    ` 4HpX`!0 ) @ 0@ (A P.Uj@S ` `@W$  6X `P@ 0h(`0 V 0 @(@@m 0@ `@(H@ @ @@$P0@ `@(X8 @ @ @0@ H$@  `@@  0 `M0  @@0% A `ઁZ:x A 0@`` @  ూ,P  @F ` @   `0@ @0 `  `Ah//0@_   @@0 @` 0)@0@@34Hx$XKP0@`0` @@@Z 0@,X h A&`@ <@ @ ,8`@0@@X0P@r4/|@tӣ @ >@x@p~ٳ'0 ?@ P(@0@x $ ((0 dP 0  gP  `@  (0@ԩXU֭P0` x+`@ (@P`^ 0@92+[< (PKFZx  ;ݻM@ H ((v Pp``ط/ 8@@ D8@…> @-Z,qF(0@@0J+|Y@̙    E@ <uU֭zVe  `Axp@A @ @0@d,@| @ @@0l@\ @`@<^@>  |>@|@?`@G(PD@A(hp`!Å 0.^,Q『I`$IN` (`pPA>,H@A ``)N @0`^ vٲ H+@ W 0`/,H\` ( y@< .0`tҦOFA F@ ȭ;w0X`8  `@C^`z(0@   $h@ X 8x` "   (q@E1fԸq@9PPY`@`P7 `@(@ DE@ dͪAW@@"h@[m4(  0X0$|A 4`8X@0uk @@P 0$ @ >@@c/@0@@yP _ @8  0@A ( @,8` PAX0 @<' 0@ @ @P`  †% ,HР  ( 6@0 $h@4X @  X=@ -` @0@0@@ h`A  Ν 80X`  0 0@,`$ " ؑ i@)@ Mt0 8 ` S $Hp@j 0,P  @0   @ (P`0` @0   0``,P0@   @`,`0 8p@0 W 0@ h@xР PPhH,Yr@8H2 P A P0@ p` P 0@ P0@` `@(H @  `,P  @F0t$P0@ ,Xp@ h A (. @ AP 4x; ` / @ @0a p P 4P#I$@$H(8`A  0:@tS 0@ $h`0` @` A   `@` 0\ P  < 0= 4xwn@@0@ (P` 0p;P 0( $X 00 (@P`X8 ;(@ 89 3j,@Y 0 8@`@TZU   8[ 퀵ںu;` ؽkw(  b;v r  zt }@x`@8?z `@ hp AX D@a ","F<~RȑL@i  @$h>h0@J@TU 0@ 0@e @v@+`\u+`}<@0@@0`+@0@ (Zh  .A A޽}#pŋ#@r ]t \n@ ^ $h0 @A8H`$``H00 Q `Q 0@&O `K., s9@P  `S 0  0׮^-`fEP`-۶k (0@v`/~"#N @   ` gp`֮_ {ڶέ{n.`8q#O0`: }{@`H  ( _ @@(AP!B40A d̈A0`@I' 0` f48 0@8 `@@  +W_@@ @@@w W<0$F0`(P@@@@ @0`@ `@ (8`(0@@| (A Po`PAxA 7  0@`0 4X8@( A0@ @@ 4@   `0@@0U0`"h`A  @` 4@0@X@ (P`P ` @ @P@ (0@ȏ((0 HP@7@ $p` 48A $@@  `G$  ` @(0 00@` `@S$` P  0( `@ @ (P`P A` @ @P@ (0@رaP` ( 8HP@ (l ,H`4(` @8p@  ` @   @@0@ `20 : @  00@ X`0k0@0@X ` ( @ (P@7k6 `0@H`0` A (n܀ @,n=A `  `  $hP@  0`  `T@8PA  A,`0 ,Xp@Ax` @PiKp  (0@(b -;@@n\ PA6L؀ ( @d(PA ,H0@@  pw PP`/>9r˙p>@@t.{vt/0@ ,x ( /@ 80… 0`@+Z,0`@2$H$K$ҀJZ| $`@$XpD h T ֭[ 6,=6lWڽ{w@ 8@A .1 0(0 :t  `x=  ( (` H0@0^5 e HK@   0@_,x_ 0@`1c ,y2`0@> zNz5֫&` @ (0@H>`(@P`(Ȏ7  O~ @} @P@PP(000`@ 8(/aƌ))`@ `(@P`@ @ @@@W P`Uv@o @(@0@@_ <@0 @ @@@e  $h@H` ` @mн[70|x$H` 0PA P0@4H Pp A 0@(4@    $hP@ 0H @ $ @  @t ) 0( $HР ` X@@$ ` @0 A  8X`BX  H@$p @ `@ 0h@ H@ HA  0  X` `0 ! @ 0@ I@$P@ @  ,P @ p0   @,P0@_ `A'N@ L@$@` @p HA0  `;` $@`  `u$p @ @A( @0 `0    ` X@@$p @@ Xp h AhJZA 0`@ @0@Z hkr]@  `  $`P@ 4HA( A @@ `: 8HР0p` A  PA 0`@ P0w P  `4X `0`@ 4(  @  @ fL2@;P  @@@TQ( [  `0@@ (0@@` &0@A 0@0@sft& 0M`@   (0wn-Ç@@4oN (`@AP7/@ p~ ~  @@p$@@ @:z$K4`ʕ  4 0X  4(PD84Q:}TTZ* \:`d˚5; Zlۺu; .t % @ .<`9XFP`x60@ѤG+@ @Znm @@@  0@ 90@  `p0@ '`  `   `@(@ P <4@,ZQ#0@% @r@`@̙SJ@PEP  `  (UkV |%VXe  @0 @. 7} @ @P` L@, @@f  L`@֭ [ll6@{ p  @r(  ]|^<̟??   ǟ~$ p  Lp!Å hŊ/b$ `  @@&OLr%K S͚4)`'Ϟ=%`0`N>P`ͪu+0h` ۶n0@]ͫW@  x0a (A @0@0@`3@ -{6ڶo6@@o> H|?7`}  `< 4@ ` @0@ (A a0` 00q#`   @@K``    P @Pj@S 0HA `_;lYgю5@@ 0 ,h@ 0@@0q 0@ @@(H@ @0@ @A pǑ'` 0 n$(@  ` 8@0 00@8p2Iɓ(S4  I@$P 0@`QX@0@X J@$@@5 P.880 ߿pa H@ @@0@$@@ @8r H@  @@H7سkݺ H@o @ @( ,$  @$`  (PM9 iA ( A S:A 0`@ 4( Y0@$HРK/&\aĉ0@L@ 4@   `i к@d@tP'^q@9 ^u ;(( y PP~7`@ (@A2d(&Rh"ƌ) `,Y h `sv 0'РB 0( h0h@0+X(k,m붭ҭK׀z5``.la1Ȓ'S 6Т.ml0][ @p W`8 +h9 ^:p`'`^'  '@@ ` ` @ P@D @@t@dH4YҀXPfL3 (p 0@6ut@T 0@[$XlX_= kٶ] /P@ z0`@ 4(@$A40! <4@@D   $hP 4HA\Y 5mę3A=}4@@ @R0@U J@  0@e͞EVZm&@@ 0@$@@ @p0@ 90@   $@@ n޽ $\pō'(@r<7@  ` @`  @|ǟ_ $```@   8HP@  H  (@A `)Ӧ*u*ժVuV  ` @ @@†#Nx1Ƌ `0@`    $`P^M`ln0@`70@`$HР` A`Ϯ/~x H>0 0`  @@  0@1fԸcG;&@@ @T)0`@gO> G  ) (0@U @P` [gѦU@o5@@% `@,x((@ @ G@ױ_7@@/`@ PO @$8H &8@H(1 ǏB $R %0cʜI@Mr @ JQH )H*jM`(ٲ @Px;` <È+^̸c Lyr0@Ϟ&` &@kc˞ [mr @ @q9H.}سcg@  0x`6dx@)P X  @$@  @;yhPB p pS p @`A 5@@@^0@ $p 46  |r8w|@ѣE8uj p6 8H@8@(H@pN @T~{v۹wnɏOP@pO o@ 4(@ 0H xh "*0 ` @JZ3&ؼi<{pСB4R$H` ` A A  ( ܹtڽ7o7A  81 xX@  ` (  :[& `@ضM nz]ć x[n ` <(@0@ x` ` @@ DP!<0A QF=~$ @H% @J\0@5@=},pPC0@R^jV V,e͞E[vZ7 -0^}x@0@br0@@fΝ `@M@j֭-@l ` @\G͝7_t,]{|`z7@@O@ , ÆB(qbC`̈?zL@LrJ M6oi~ Q%T u*`͊Mf(`-[ 7 7 ,x x@ƍp`2ʖ/cά ON@-{6ڶo 7@`8qH|yC.}:`Ϟ0` @H~={ @ $?8`AD100@#?9dI# PĔi@M$`'O? :4@QG iSO(jU ( 0UmZ0wnջo_&(paPXqD` l@@& 4P @$H0  @@ PN 0zо{w(|y0HA ``A  0` X@ $@ŋ3jX1A C,pɓ& 0e0 0`  @@J@0@$@@  J@W @ Xp-pݻx{@p X< 0@@ 0] iXͺװcf}@۸o8 @<0y ` u@@0$@@  ` ` `ذa$NXl1$(dH9 `  ZI.eS(Uڕk5P5@q 5@y %З$H`l l0 &M@UfudϦ@ ;0(@  `s P@ wŏ'@է/p{0  '@@ (h „@'R(ƌh#ȏF$Y *Wl2A2g @@B 0@: V+ذbǒz@j8-ܷ /,0bh@Ȓ%8̚7sG6` Q0@@ ඀= p(n 0?ҧHp Ɠ_'@` o>~ O0H  ") x@F hd#G PpeJ+YT @L2 pgx @@@PpiVA[vcɎ=P @Zi  k׀{k0` ` `2dT&` 4hGp:Xnm@ (pwn]`7n@ 4: `@w'` @ȓ/p@z0~|7P (0 0! xh  hƍ;zh$K,) %, |2̙4kڼ3gM<{ 4=tjZz`@\z vd˒=P ڵj 7.  0080 @P r @P@ѤK6@@0 ٴk۾ݼym@@ ` 0@  ܹ8 8>?>ؿox`$`0@ D ` A PA 02e0`@ 0(@ 0@8`M>UTP j@]| m [@  ޽ FX<@-W.pfΛ0  ` `  H@$p A ( @0@$(` zݿ_{߀<A `` PA( @@  rLr%˖)3nY>{6`@@00@ p @ 0@  `  8H~ ` H@@,y2ʖ/S6@@ ` @ @`@ 8@^Ƌ(` ΟCn֯[?P  ~ @p A0@@0 &hP@ 4H 00`  i  A 9fM7qi@? Pp A4HР P@ 0@@^ 0Um[;W[(` 0 D60Y  `  Q>-=l (`>xqǑ7  H 0   8}{ ?~}  Hp`*L H(ŋ hHǏ Iɓ'XɲJ0c@͛8syӀϟ@ @ $8P@hk+@hӪ]˶mʍ{@x8߾ @ (&qc"0@@ hL3C@ k Ȗm mؽ@x X0 PO~`(@ } ?@ P`.Tx@%NX5f

@ɕ'/ps  Νw Oy `O{7P?@ 0?@ 4`` 0@`@@F pl@ ,x A 48p   : P` ` `@Q `p+ذ(kֲ][r&(@  `/P 0&1ȎP&`e (P` Pz@ (( @@0@`‡+(΀Aʓ8 m[>0$(` @`@ $ A0 z ` @@0$@` @8ph @ H@ P  X` h`A (`A ,p  P 0 @ 0  <`@ U8@V VXe Vmu=P0` @F|@ 0(@ dʔ \@s0` L PA {  `|`@$PP 8x    <8 ,8  @ $h`L A ``̈@? )rdN 7@`? ( aÅD@"E0 0 ` 0@4X x?>X0Aϧ/?0 ,h „ a&Rx@7r"G

P Ȑ `pyG>0 Զ5زg67p(n8rhySn:ک{Ɠ`@׳o~?P   pA4t(V(9vcH$)+Yt3iִIs@;y\P @PC5z!! NETSCAPE2.0,(1FFF888'''TTTgggwwwŇ Hp (, Ç#JHQ@ 0ǎIr \y0a (P8s\ϟ>,@( (]TP ` իV Pk 0Xٲ Xv - ݻxW@ 0+N<@ǐ#KLe ysBA Vװ$X۶,Hp N| (?Н+8 8@<_~˟O ( .dCEؑc$iTdK1epp@@9q 8OA

`4xaB pp@ xb8vdH#;(eJph֤Y ;yhP;pQ4uTZ[vlX\pmkٮ-p@\sֵ{۷ >P @bʼnprdɓ)W|3  6}vݺi׶}wnݴxÉ/p@r,HpW~@$X@xpw@@~ <` 2t 4@P cF 0X ȑ$E( ʔx  <Ν<{Hp  8:- Ԩz 6X =k@l۲-pܹr7/^[@@ >0;nA X͜$XѤK>P ժ ;6 ؾ;  / xyX= $><?o۳?P ۿ?|@@ PQDQc|1ALDReJl,@NETR<@UV-pV[VXe͞E+Vmݶ= \s$W^}(@`@?Yd\|@=ZtF}][l߶}@޽y8@p @\r͝?O.թ@v^x^}ǟ_ P",`!Å(1.b̨q#G @&O,p˖, s&͚6o9S>< ѢDt)ӦN(`*թȪ5 +v,YM@n w͋@~,xp#>|@Ǝ8`2 Ȭy3Ξ?\ҦK(`5-{6ڶ{@Ə#O|yC~@ Ȯ={~ϣO>@/p(`A&TD@0f4P A9@'Q,p@K-0fM7q4P?}(h&EZO(jUWf-p@W]0U@oƕ;n]p 'V G\˗-(sgϟA.p@iӥua.p@m۵wo߿8xq P\yG~@ױg׾{?^ЧG/80~}( @ (\ȰÇHq2j,ǎIrR\ɲȜ)@8s,pϟ>@ѣHPӦ Jujj͚@`@pٳfX{`p=P ݻv /LXx"K.yBM^@c.p۶` 3N}zkN@/0X O~@$XР,d@%Pbl@!E$YdTTy@1a8M OA Ph,e@QFMP UYnZa(Y`ۖΥ[@Pp,f@%O\r4o|@СA8i ڵ̦mu(p(` q 4xs4(` ulݻw'?@է/p{P}8?@( 2\X#("ƌ7r,pȐ `lr @` ` ( < j h4@ `j0r @@z H/ (lp3^|@Ȓ'Sl7k>P .MW>P زgӮ]ܺs(7(nhn` 0  @@(4@P00@ `0  @ @( @ `@H!pt@3iִygxy@C 0zh6ez@SVz[n=P @Xa p 𖀀@ @ @P`( `<8` @ P@ ( @``7^@˙//p@tp{v۹8|x 0@8~| ~ 0!8|pA  0@@ @ 0 00@@  08pA0 *` d hڵj7.ؽk@| 8p .|@Ō x q*[|@͜;{ K>P ժ ;6 0`z `p  `̛ (AX~xG   @@0@ ?  @Dx 6

X&K(`%˖._,p͚4s tHZ@S> uꀪ`ͪu^+v,Yvm[A 0X`/߽ ,8p#>|@ƎC,/[>P  O>P ֮_Î]ڶk(`7.< PΟC.}:֫( ` />Σ?_(`>/p(`&DX(bE1f,p@G0Tr`0psg  ( h$UZ *u@fu0vg%0ƅ{@w8o_ P @hѡ p vvl }x.xp0~ܸ 4?@tөHp ȗ'_/P ` @ Ѐ4X a  `*V, x( d$8J0X ̘ fz`AD$84ҥxz Zz@\  kʚ=6ڵl( ܸ 8 8ʼn 9ɒ 9f  K>P ժ ;ٴk۾@{<8?<̛?P =; >` 0`@@? @<8@ Qĉ(P RL4y@-Y8@L5męs|,@P8TRM> ^Z].` @ P  @,X0` h`AL \00@ 4@ `Ml߶}@޽y8pōG\9 @թ8@vݽ~̟7_/` @(P@$0@ 8@       @ @ ``(X0@ 0X`)ӥ *5jbͪu+׮^(`,΢=[ n+w.] ȫ7oA @60` @ 0  `  { P00@$p @ u,}@ϣO~= ~/8`A LP @C 0 0`@ ` @0 S 4@ `@Q0@`0```p; 4Xm[ ;Wnջo_&(p'F\ Ǐ!G} ] @P@У@`@ ė@/@H &("J(3jȱǏɒXr@͛5 ϟ@ :TѣH*],@*hݪUŠKٳh88 ۷ȝ+wx˷߿y @0(^8 ` p@B TX@9n,p@H!pt@3i,p@N95ZK6ujTS pkV[vU5[kٮ-@\qp 7A .@bʼn T\9A9op@hѡpujիYvi׶}wnݻyp@pp 4wAٯ/@|p}<0… :|X@+Z1ƍ H Ȑ 8dZly@4g8 Μ  g-z@L8 Ԩ jz횠d˚=6ڵl2(7ܹtڽ7/\ 7 6`3nP0PA;'`PѤ h`Aլ0l 0H;  7/A̛;=$8@ܻ{>$8@>0`(@  @B@ĉ  0@#(L*P@0@5(P|$@`5`AM$8UTU^Ś@]|VXe͞E0@\uw}P@( @b(ʕY< PhҥMFZj֭][ (  0@@  ( `tի>@ 0P/0@( `(@P@~$0"Lp!ÆB(q"Ŋ&@  (@ `PXn0 >@p  A0@@  08f ` +w.ݺvͫw/߾~{X`$p  P  @@`@ ( u @@w#@P@ @{@ ' `A .d $XP10@@ 0`@d%1e"@ (@ (`PԨ ,e NUY u Pe;`q P]y  `#@ x48p Pg (P4 0Pkc3M[ t3P7  'ɕ'GP@@ uwP޼g߾@ _ ?@8 2lpD P(P"(`$JVh) hvsB-j(ҤF )PP  @%kjP  0@@k (l0@&<@ PA`z@@0@@V  @(ༀ> (@P@7`h? ?~ ? 4@aB p@D(RP@ P 0@3 4@@   ` K `VJ`   `,X ` A  0l pA 0@@P0p ( `@l  /n @r ` @ @@ 0 0`0@h @ XP HA@@ @`$@@ @8p0 3'Nz 0     *` 0 X@ 00 0X  @@P`P 0@@x6@`$p  ` l@ 0@  ` @ 0x`@ x`, ` @ H`,P0 @ 0 RdH   0@0@$P0 ``M$`0  ` 0@`  @` ` @  @A(0`00@@ ` @@@( @ ` p`@,8`4X@  @` l@0@`@(q 0@@0`@`00@ 4@ `Q  08p0`k @@  @   0@4H@( ` Y  `  0@k0@` 8 ( @@0`c@ yO^/ ȟ 0@@  ( ` 0qb  ( `@G  `( `/ 4@Z@@Q0@ @+0@@o 0@w+lÇ'6,!G~,@˗- y0hPuk`0vm-`N 0`@sϝ0@:(P?^W>Ǘ^@}׿_@0C0@ŋh` @0I0bIsr瀟@0XtF%` @@kl  @`p ;x;@@ @XÈ @"K.P@3k,MzӨS6@ׯ  @۸s0 XΜ H' سcg@ @^    0@}0@0  @` Lh @(G@)  0`1PMtg :I  QZuիkW kiծE+q0]w @ &<8  c$Pl,`C P 5c `64݀0P`|O^ٵo. 0y @ P@ ``  0!Ĉ P@ @A*@@,@   @ 0TRJP+ @ `(P@ @` (lXb 0`@7 0F 04j ( ` `@,8` 0@`0` h A N @(PA  @ $h`4X @ A `@  `@JpI3 PР(P`4h`@ 4HA@t00+` 0 $hP`{ 0@` ` @ A 03  `  6p H` ``(H$p 8 `  0``,P0 p(0@  @ @@ 00@p@@ ` T 00@$ 5  ` @  0@`  @`d 0@f00 4@Z H$<8 8 `  0``,P0  8A @@ H P@ @`$`@ ` S @00@(8pU0 ] @ 0` ` 0@/}  ` @L` 4@0  0@3$H@ F}z$Xp h A  @` @0@$H@ @0 48@A ?@|Р0HA@$``. `> @ND A @%0@  tS@ Ȫ^z%@`ٲ0`n 0`.] 0@@(@P`(P@@ P `  `ȭ{ (h  (P @@ \@s.ױ_o@ 0^    0@@}0 `  (4@! 0 H  48@0Ȝ)8ɳ瀟@0` 0HJ* 0kW 0[p[@x @` @xÈX,qǐ# @h0g `R 0@ 6@` ``@ 48` HO@=$@0‹ @@ X/ @ P   ` 0  PɓTd)1eΌ)M ٓ :@QI`:@SQ @Un%@` `(` Υ  @` \/fcȐ \yD.@ P@(P (@P@0`Aɓ\ѥO'  .`w P 0@ P߾ @ `(hȠA (`p 0h 0@`J* hI`2 @'-:@00p-0@  @,Xp@A ` (0@ P e  `@ТG 05 06 4@0ව  03܀0(` @Hp 0(0`@`ΟCw>`: Ȟ] 0@ `=/> *P@ 0PACDxb   0`P%/0fM7q 9gO? 0T@(` $P0@@dP  @`PVo 0w@] Ыw@_`  `sУG` w O^XO (@/Hp 2 @,$А48pA ! YRITҥ1c YӦ9APhI0@@0PY :@a ;@( q +`] _ @` x(@P`5  8p`A (@Z ` h` 0` 0@@  ( `(@ `w ?`}  ( ` 0@@@@ 0 (0  (P@ P  0&$H ` 0@ 0*V `+ `j"h  50H$h@A (`@A l A(M`4X @`Mp@ A  `]  `$H0` ( `  (P@ (0@`$ ` @ @P`@ @;u 0`  00@$  t 5X@ 4P @ 0@{ @A(@00@ @(X@ 0m @( ` 0` H` P   ` 0 <`0 <`P@@@@0   0@PFPAJ,i`J @ ``(H@ 5 iR4XT`P@(` 8p 0 U 00@(@`d @@ ``$ ` @ 0@A(0@00@,X@A @`@ @ `p  `A>|H@  @  0@4H\ 3$X$h@ @P` PP`P] 0@` h`AA  ,` 0@1 4@0@  0@4X `Fp`A |@8G( @խ Pv|  @_ @~ 0A,xpA (@  @ P`& HR@@ P  t(F t@@0`P V-% ߾(X  e.cƌ` zh( `5k^ {o ``w(8@,xA @G@h0@`ΣO~{޿   (p@&0!B,0Q@E( `@@ 0@@'M"P@K-@@@APB0ujW dU_K@0H ,p `Р(``Pl00` @P.P@(0۶0` Pyϡ. 0@ @ 0_@  @PD 48!C Pb @AB@ɓ4  (P0 z  ԀSF%@`X `†@h v - n  0@߿ Lx (P  gB.@ZSN5a#@6 {w0X 0@@N ;  (``  _@ `A,d8@Ç$JPE5n0`!E9TR@9  `@(@ LEP @ [i4x[@`y  ` PX/6` c4HP@ ,h    0رc  0@@  ( `+\  ٳ ν 0@ 0@@  ( ~ #(P@@ 0 Xp@(h  P (A ,Xp@A90``-JA 0%0@@0@@@ @0` Z heP@$x` 00` 4H @`  ` Z  ඀  ,Xp `   @@ 4P  0` 8@P  `@<8@A0@ ` i` A 0@  @  0@X %0@4H@ A  @ ,h@0@@0P(`@A(@.[w PAō@`@`;w/~G?` (P`@  (@ 0@@(AdPcG T@I% ( `ƔY@@͚pйӀ? `,8p @duР50@Y 0@@  0@@ݺ0xÇ x \(_μ9H>kνw  y}@@ ,, `@P@ @@! ɓ@P@A 0Ϟ(P@IA  @`@ 0` @ @P`qKW W 0` `<`0e3@3(@   P m @ P@ (( @   0@ 0@`@ _  @`  0a&N$ A ,X@`P@@tР `   @R 0A  @`V  ી  0@Zh;@0@`z4X @ A @  0@(s(`z(P@@ X@n `@@ 0 (@ @@ @P@ (0`$(`  @@8pp  ` 4X# `A 0@@0  @@P@ 00,@(HA`  (q(x(P@ X@@h @@@ 0  (0@@ @p @P@0`(`  ` Hط`@  48p0  8H@ H@@@(P@ 0@@P ``R$p `  ( @ P \PP ,H@A0`@ @P@0@լWP@ 0 $` 8n0H[7`@p`,x@ `  `H@$HР 0@`0` `@\PA  0A,P  ,Xp@A ` U U+]"PVA 0@( @+@ @`` A Y @P`&    o? >X@ @`@E d$@`@G@ @`P PRe 0S@70g@((`AB@ d͊ @`gP+@@;w(@_( @@ PǏ3@@e  @ 0 z 0@ Xph$` D7@ d7@@` }{ ?_@  ` 0@(a" (` Q@(Xɒe0c@S@8s)` J`ӧ HJիX h5@kW@p %  0@x{w_ L+^̸@h<@@-`Ӧ  5 Pr (@/@\ PA Pg `<@< Xo{@ P0Pp@ `!0h@@p`PATdr@ Ps@ P @`Q @Y @a [0(P@y0 @0,X$ @`4#h`AP `ܹq/@` o0 4(` @$H ` A0 @@ +@ `Pp`5 `ڶk0`x @@  0 @08  ~={0 0`00$T@Æ  0Q@ǎ@$0 @%/_ (P`@ps @0@OF}JdU@_  @Y0@[n 5@ l@$`@c 0 A d6@3m 0`@k =;p6wo߿}.$O>ys  @ױP'0@0}{o/0 H ($Ç Hŋ  CI`R@0cʜI͛1  瀟@ :tѣH XJ P 0`j* KYh(p` ݻx ` <X̸b@2P @i @P`M`rͻw 08+@HN]رP w @^ 0= 4@0  0` ` P  P0` D0P ( A0@0S    $P0 @jU 0HA `ie[q5@` З ,h` 0@`0 @ 0@@ P  `  @0@@ <Ou Н  o$(@  `H`A0 h$@@0@ँ*Wl%̘+ i @v   0ਁ t `ժ@ X  0@``wz0@8H@Ċ3^ld& ` H@ (@A ` ` Hp;w70@ H` `    @`@D( p ` # 0i@J `XxC `@R 4HA  `  A 0`@ 4(00@$HР0L17vrdɓ ` L` 4@0  0@@ 0 @&0 7>@@p܀ө0p: `Р 0}z poPp  X8 82ʕ,[Dig  (0 P  `R( *TZjuV\zu P x ڽ7޽x  80`0Ō;f<`*[9͜/ 0@K:լ[@j+`[n zV G yr̛+xtԩ3`   (>ʛG ` '@`~ H ` @ @@<I@@@JlP@N= (Ez :`U^*@]0@&XVZi= uś  8`„ `<0@ 0h Fm@5&0@&` n| `@8 @?]t\~ 0`~ܻ_~|ǟ_~ p L@@(q .b0ǎ?8`N r倖$0n)> *4 M@ u׮^ K fϢMv-۶nX@K`@ ` (0ƎCx@` ( O.֮_Î@ڶk 0@~0 Ə Ο@֯cϮ};޿@  @$HРh  0@"4 `` A  PA e Ĕ9fM йS00&%0`J`@UXp_;lYgH@  `  H@$ A  ` @c 0r ` @g0@A   H@۷qHwo߿OP @q Pn @s0@@'0@P}{Ǘ?> 0P  $(@  hG ` XiH@  @(]ʴӧ JuX j k0 ` ˷߿ L@(6`` A PA 0` X@  0   $hP@ 0HAK^سk}/Xo0@` ` 0`C%NX"`!@ P̤YӦ (( Q @P@NZYn@aņ5@`%0@[ΥKW((@_&\aĉ$@@ @$O\e̒ l&s&]u̦]m ݛ0 ,|sP]u$8@ŏ'_y$8@̧?? 0@4` 0 Ph"F6 q4@`JVhI@2c8&Λ$8g-J@J*5@`0@`Z W%k jײm-ܸre޼x  6@ hl̚7ܙ`n=fӞ]ܺs/`P7 (n3_nN`p.`x  `z(` ӯo> $    6tbD T$pcF ` @H" p p@h֤y@;u 0@0@@Ҥ6utpkV[vU5[6 n\@ P.l1ŋ @s46]Yp@lٱp7n P@ 0@ p|xɗ7ww>0`@~ ` A PA 0` @`H0@ $HРjiNzYD Ҥx Zj` 0(` @$X h A ; 8 >W3N@   `  H@$p   ` n&   P  0@  n ><?o۳?P (XAX  `$@0 P F=~RH Re 5  @`A \5@`V0@ $p 5 u o{@… 8@b Y2 8H@8@(H@ M Ɲ[n޽}nōOP@N n@ 4(@ @$H@7 o~dp @C q`̈?zpɒ$r%K$H@ ` A A  0` u*ժVbͪu 6AHK`Zn w@ ` (0 xC&0@@`L`3 zN_pڴ{n@@ (@ u` @ /~<ϣO>| ȯ?8p $$0!Ch0fH@?8dI  Ĕ@7q4@'? :G&5*)DPkW_+@ĕ7A o_00Ç $NLqcD020 PN]ׯ]/`Pvm н[n0@9 0@d'0;w P @y(8}{Ǘ^/p@HP@(\Ȱ!CH(рE3hB9IR$b0Ms `H"=P ӧO 0j0k@ @p 8ݻx˷/Lxp+N HL˘3Wϟ  @4^ͺc˞Mrmo0 (_μ (νË瞠@8 @߀ ؿ$XР @P` X" l$`!E,pI)Udy@1e  PQE (SZUYn@a8Y 60y˗ l`   @@0C M ]mܷ(o0HA``A0  `(y`{o@8?@&@`  `@ @ "  `  8H@``42eZRRj@Zr  `V `0@@[ `0Ċ3n|@'K.p̘ 0s 0`  @@0  `  8H@ =Ɠ'_ ׳o>A  $@@ `0 @9n,p#I4yeJԴY3xi@P @` @`J $`Pc 5@ 5@` @^[  6|8A70@ `  y   (vl}wnݻy}@Å8yr  n;v۹w@}z >0p/0 <0A : @` r0 3&ؼ3Ν<{

lY @͜78 $8@[~} ,p   w/xN X'=;  @`z  ? '`@@@@PB  QD,^ ` F 0@% @r5m\N=}`E(@Rj\j]v56,007.080„ @;60@@Y |. `M6@jM` [޽ P p \y ]t H@v |̟7 O@> ǟ_ $ p  $p(q"Ŋ/bh`#ǎ>4@`ɒ&O @ @._,p͚4s'Ϟ> 8`(ѡ H4iB}z@@W K (0[`%w@`0ƒ  @ ,y2ʖ/cl?m`@ @-{Ə#O|C~@֫8`; @ 0@ 7 4(@ @2HA"  ( A 00R0eK/aƔ97 `g$8@ `O (8@fZ_lYgѦp@[m0՛88(@A0@  `  8H ` 8A$Wysϡ37@`04@ `4p_x@*\Ȱ#B

`0p@B0bT$ptHdH  ` @$fL3i@(0J@@ PT@ tk500 @۷ >P @bŋ7v\ɓ%(sfs6@5WpڵԶ=@nݻ&xp 'ppN(hЀ00/4pπ $X`AgP ` ` `:zX$G( ʕ,[,p̙23'3A@P`L2%@ +z vXd˖5@` 0  `|@@P@( d *[f$| `j  ` @( `Hp@ċ/p=ԫ8  {ʛ/ $` @  A  0`q q i@0(` @$8`0` A @@ 4@ @@( (@ xUp`A `@0  <`P bƋ Yr\ƜYfL6]֭Y@@@00@ $p@  ` @\@@ ?  ` 8H@$@ ``0@ 8H``` P0  $h0(@ X`@$p A@`͊^z=P ٲfϢM[n(`.ݹȫ74p A0`q( 0@@ 0 0`^ @@ HA 0@( 0( @ A 0`@ 0h ``,`   X@Y'M(eK/a,p@M5@H@ :@ 0H0,YgP 07h A@Pl @c (p P  h@P   @ 4H AA0 4(0 ,8P@߽8|y P}{ 0ן A@P` E@@B @Ҁɓ(S$r @@@A :PР H@ 8x@`48h]p 0 ( @@ V P"K\˘/(ϠC.pӦ5Ȟ-;r >܀q X|90 >w@^ @/@@(h A h,\Lt`A  ( D$0 R@1 0@9q8O  ZQI iL:YfM@` Pi @P`0``@ E  V@aĈ `@ (A8Ѐ(P 0` 0@  88~X+[\;{ܹ@KNP լ[~ ;vjۮ]ݼw ċp=:Xnܻsp 8?' 8@@@B  H@D QF=~ P H# ReSL|YE@R^*]~6e͖pZmݲ= \u^{X`… F@ƍ8@d YfΝ9(hңZu:Al6P ޽y'(` p $\r͛;8P@ H@vݷ'(` x0P;8 |ǟ_ P`" 8y Ov ֮,p`6$8{w.|x P`r @~ cϮ ?7@P`= >(8?Hp`,p@C!F8dԘA9dI'A&(` @K pfM7qԹ :hQFpiSO:-jUкkW_z@g8m[oƕ;n՛W@`uv   ^| ,/ sѥO^]@ 0w _yՓ_{,P~}  ,h „  (ఀPhb Hp $)@ lr2g!! NETSCAPE2.0,(HFFF888'''TTTgggwwwŇ Hp`*Lx@#JH3b

8 (a6dX%(cF9v,p@H!ptr  @@SC0@@R @P@SR- [*Pm  @[{=P @` p4vrd|8w.th0}XvvԶ]@y.p@p00`4wztөW.@۹ (P@,pw߾?P @~ 

88~@+93x@K>:uZn}@ٴg8 0 (8  >@ܻ ( /  P?P @@ @PB Qb\X F RdDRJl޴Y=y.` ` @TRM>j (`](@X@ܾW{@}XpF|@?Yr,_|@Ν98@h  z{ڴ PA} @(@P@]\/ @|?@<,^}?P ~ p H0B,`"ʼnȨ1 )r$ɑ r 6o\@> P  0@4H@A  `- P  0@@0` @c, y`Ό?{>P@ҦON@^~}@ڶ ȭ;w~}@Ə#OΟ;?P }    ` @   @00@$ ` @( ` P00@@0@ ԙ@?,p@QEiSO8jU к@_8lYPm[o0՛]@ P00@ @ 0     @ @ `` 0  0@ 4X{w ?^|ЧG@@Ǘ?_?P @ Hp`*Lx@@#JHQ3b

P Æ 1HLyB.Xzb˞Mmޭ@/p0@ @@@‡@~ PA?@ PP,0 X4nX!AI)UpK/Pf9u,pO?0QI&5P Q(UڕPYg [n Pn߿ 0/V|@ȑ!8e gСA(iԧue.pmܷ0(o3Xq `ޜyO@( '?`Ͼ@_?$XA 2dX`ƌ,Ir*Wl%fҜy@: g`AJ$8)Ԩz rz@b8,ڳ 0@@-P@޼0@` .   0@d&O`r̙p<G(-` n@g.pܸ,Hp/n@$X`zڷk/pǓ/o|oϾ_@ paB bD xcƋ  #I

P @jթ vlٳi׶ @y0~yr˙7@өO/p@v0@ (P@ ~ ,h@ 0 h`AxH X00@ 4@ `xIjڬy@|˓/ۻ?ؿoA  <40@ @ 0  ` s P00@$p @ T,Uk|@e͞EVZfWnu-^}X0F|7^  @0@`h,Xp  8`A&` @( `<0@@  P͗?P z $_|/?A,` Hp!ÆBT@+8`#Ǎ @`& @  @@  ( `O>*  `  @`U U @P@Ξ@`@ @v-߾~,xp N\ ƌp`2ʖ/cά O^@^Î-έ{.|8Ə 0@C~@֫ 8޿/~<H@Pp`>ϯ80@&D@D(1*@ `  'Q*@ `/  7q*@ `@O= `@ 0@ `@Ӧ P@UU ;lYgъU0 @[ĕPo_,@D91_ ϟ0(`@  ׯ0(`@ ( ߿0`xq$P|A DAױ_?P @w P|ЧW}{ / `H",pÇ@"hܨ@ C,pɓ&%Ȝ)@8s,pϟ>@((]@PJJիXׯ`ÊK,]p-ݻv/ ,8A#.ǎ@2 hެ9ACpӦװc˞Mvrͻ 7PȏN}zk^ '(X~}ˏ_ '(8A C%NXb5nG!Ef,pI'e̤9@9u,pO?Ph,e@QF-pUWk%;@iծe[q P]yo] &<@'.pcȏPrl@E.piԧu̦=@u.poPqɕ/gܹѥO^uٵGpwP| g>A/}? $`0lȰ@'JLP ƌ,i$ʔ*Wl) ̘2gҬi&Μ0-J@J*MP ԨP $`pʵ@bNJMP ڴh $ЭKWz= .l0 h1Ȓ'Sl@6s|@ТC84 hufӞ}@ܺs87 (nx3_~@ң8: ;Ǔ/o<׳o=g 0` ( AB 0` @ ``AF 0,Xe 0,X '%AK6ujTS$8p@[vlXc$8p@u60`(@ ` P2d pPF YP 4PP`@ P@p,Hp7wztөHp;۹w|xX@p~|p~ @ 8p x! (`F 2ȑ$K<2ʕ,[@0PP@@(@ xJX  (@P@0` P@({ 0 >8Ō;~ 9ɔ '@  (@ `PXj0 @p  A0@@  0@ 0H@ 0X ۿ?@@  *t(Ѣ6(0@ 0@@  ( `(PH(`A (`Ѐ"@P #@`1@. `<y3Ξ?-z4ҦON9  {ȭ{o0q(|9 ^`:֯#(P@w P ^A(H`=Ï/>  A.H $Tpa$H $иcG $80 T A 00`? *T@Q Z:@@[@(P 0@ @@ ջ7A_  8Ç'VxA!/Hr0( `(`@(PAk `F0 (P7 (Pxq P\9 DAc}  <P~ė?@@#P  A"X@H @ h0IR  X@ 0ISM rT' ʠ(H*`@ӧNP@UKh]+`[p-P@k`L0X̸c" <2kVA  iX]@   r+(00@ȓ+_μHN (0(P@Xo{?( 4@,d @`l (PT`9@ PAt @A*  @ @(@ KԮ 5`0`0Pĉ ,6@c Ly@@@ @0@&P `P@ 08p,7  ^: n`0@` h`A 00@@ $h` 0@@ Pp`Ap0( ` 0@@ЬI i0(@Q 0`0@`p ` (6 (@P   @` 08p HA @@ ` ܸ m p0@0@$P0຀00@$  `  @ @  ``  ` 8    0`h @x 0@ @`pp @` `  0@ ` @(X 0@` @hѡ 0@(P@ ` @ 0 4W 0@0`$@@7@`p 0@( ` 0` X@ ` @( ` S  ``(X 8 @`  ` 0 . @0$H `x 90@` `   x-` 0` $h` @``p0=@ N@  @    0@4 A0(P@  @  0@H0@`0` @p`A P@   *`\* ;@@e @W.u7|  0@   M  ` @ l [n0@ @]\.@0@ 0@ݿo/o p HpaBB(`E. ` ǎ  `$ɒ&OH9@˖._@6I`>}*T( t)N @%0@@ U׮^ +VٲfHv-۶j0`.ݺv @}  @0@C ` `>0@O֬ [ڵ-`  0@q\00@N`;`H/@0} P` 80@@C 8bEd8A9dIr0fp  G @S080TJ`_ @ @0`0  ` `q   (P@ P-`@`ǖ-`@mp.P@@>$W>ϡ.@ugN 0|y}{ė?_ @ 8q2j0` @' \Ҁ˗  (@@jhQX*`JJXj*뀯` 0ٳh @ P@x `_, X̸qc 0@2kμ(@P`i(P PA(@> У?'@`@ 4PP@ @ '  /` _ PP  `C(@ `E (@ YR@ @`K  @`O 0@  0)$HР0` h ,m ` AA  @` @ $Hp@ ``A  m i0` `p 08 ` A 0.` P^  `$HР0`00$0A @   @`0@` ``N$p  ` @` @֬X   0``,P0 @(H0P  `&0@6 8 0P  0@ 0@@t `` H@ (o @@@'0A ` @ X` ` (H pi @ 0A C&@ (` X`,` P `05@ (H0P  0@ 0@@@n ``@p$p 47  ` @  0@`@ @`@~ p8H` xX@  ( A X ʔ (  0A  @ ,h`4H A 0@ %` @0hЀ (Axp$HР0y0` `I#h A xMj @zPA 8> @X=0` 4` x| 0@PA @@ P 0@@  (0 @  SN= PA  @M$X   |K @K W\ ( `^ ,` @<(( `,0@@| ZK @Z]v-@m @A}N@|?} ]ݽox @o`@ 0ߠǿ @`HpÆB(`Ŋ/b̨qE(`dNLR. )sșSϞ=%@`  M @%0@U 0`0`f HV 5]v  H`A 'H  `> zNz0m[o~. \ `} /@'0@@/`> ϟ_0@`$T(  0@@E0b0`@9 Pi` 08`A7,X ,` @G @D0jU:`;@@ٲЦ% ` @ /& paÇP 0re˔ 0@ϟ= Vz_=@@m۷ @wo&0  D>=z8H@?@@yѣ}{ǏO`@} @@ @` CP(P@ PA(S bʜI@8S@ 0@@  ( `H:  0Y@P- 0PAw(``  @xa XL` @h3B=@0.0@ \@,h@ 0``@ A A  @  `@h@ 4@00@`4X! `)0ҥ Pp  PРP( ` @0̝A 0/  @И $hP4H 0t 0@,`    `  0`@$P ` @ďo@$@0 ``(H `   ` 8H@,p`A 4P0 @4``$xB 0@R0@@T ``V$ 5 @@%0A   88P@@ `y 8H@ `@@(H@ `  @`@ʕ`  0@ ` p  @  @<8A 0A  @ (` @JpI@) I`$@00@` HA`  0@(틠 0l0@ 4@0$HH0@` p ,X0`#h A pN0  0@P  `&` @0`&n O> ` @H $`50@׮K`Ξ [޾ Wv 08 x`0,``ά  Z@ 48p^+P`6ڴn޽N`q0@0@`>` ` @P0 (0@0PD$ bE0f cG 9'Q/(HfM @`?*`@Q$U* 0h0* bek׭ 2@0gm[+W;o_ 0 $VX@c G\A  0z@  ( `(P֝[@>` `ϝ/` `@ ]߿ /`@y P 4`4P  @C $8@ (PA  0`@  0M) :@@ 0@ӧ H@ غUW-@@p` A  0@ 4@0a 0@  $8@ -z$X0` ` (`A(` 0P$` ( ,x @ 00A 4@0$H 0@`E4H@ A r  PP@@00@@ 8@0p` P   `q 0@P@ pp ,f88@4 ` @0@A @A<8A  (`p( $@0 @ @(X@ o  @`$P0 8p@  (` PP x@ X`@,``ի 0  `@޼x   0ఁ P00`$p@,` @` P( 0X@   0``$P000=@0X    ` P$P c @<Xp(8`A  0 0@ p* 0( @cɎ]@ 4@0.\    008A 8A @ y@A8x4H @ 00A  9 N`@ P ` ,Xp@ 0@`X  Ѐ 8 @XP@ R@$ ` %  jS@  D]@ 0 T 뀭 J(`l`  *@P@   ,8@ @xP 8[ @ 6@=/8w> ԩ#P @ = @ @(@ P 6L@8@=~8@00@A-]h@̙l"(SN<(hE 0M>}*@U :`\|+@@eEVZi W\  Xp&0@?&0@ 0@Ν(ҥI3@ j0`ڵm [wn| Ah?GP\@ݽ#0@?`/`?@~ P `B, QE0@`  r(`e)9@OJ`"0`N @*ub*` +Vf @@ (hp ݺ 4``  \   @P@`Y  `N `5^ -[@0`( `8  0@Λ@@`' @@޽ /`ϣ@`   @` @A  @D8001 (h`A,8@AK/D 9`"(P@GP*`@S 0W ЪU@W_+lYgPV@o 0 ,X@aÇ$ @ \@@0c 0ti @`@k @`۶ PN`@ |(~=_&Hp (@P@ HP PA@hP@@p`A 0@ PP@@0@@08`F@<+ 0` ( @0@/l`@ @ `0@` h`Aؿ@0@@,`  @ 0  (` Pt(A>hP@@P  [  `P@P8    0``$P0 ` 0  @@0@,P ` ``(H `  <@ @@,` @, @ @   X@" hʔ(4(@ L @P` ( `J4p ``@0(` Zj h(p 00@(@`0@@@0    0@ ` @(H@hN@@p`A 0@ 4@  P@~ $h ` pH@@  `@ @JXp h$h (@ `jT0@@  @,h`@Z0@`0`{ 0@ A  `0@ 4@0$XX   `(`@ Pp\A7g^(P > 0 ~0@p$` B`,XpA (  ` Z|9@ ) 0`逥L80XP  6l(@P@(Pt ^ 8_88x ,93 P ѤE 0Z6 v <`  8 x=t.`{P˓>}zۻ_ /  (@@Qĉ,0 |R D@e&@@|*@5` RK `@ ux@50 `-P@Yd, f=w. ` Z  @l@7|A r^խ_/@;ݽ_x̟/ O| @D  `a  @@ I`$ɑ``^, Y~ *TF H*`i  `j0` @E% ݺv+` † H\@;&0.cΌA-i N`0hЀ@x H|9sC\`Ϯ] ~ϣO^0`(0 0@",p! (@Pb  Y PYAĔ Y0h@P) @@ P@ 4x @o_}@@'N,10Y@YA - 0`(@P@ PA @ PyP ,Xp@A   (@P` @( @h@P$x2f G0Hp@(S @p@4X  0`  H5@*,HР ` @00@A  @ $h@XA  @ 0@@P (P@ (@0 O~< @ `0?0@,xp pp  y H @@4@A `00@@  ` @@@%0A(` 8H@,`  ` @$0@` 0  ` PP ``@ 0 ys   ` ` @@pp@` ` &x `@00@8pf  ` @@@h* J`,P0 0X( ` k ` (P P& 0`` m 0 (  0'@t`@ 0 0x`X@,X0  0 0$HР8H`0`+ `@xPA  00@,8[ 0@@5[vزE - `@^ (P@@`  `@b 2d @t  puj@ = 0@@ X A ` 0@v۷(Aȓp^@zط^p@~ 4H A P@ X JP ʕ,U x̙4 4(P 0R:%5ԩ XJ +P`50 4(@ @ڽK`|083 d*y͜9 (A  ( jZ@[j z- x 8.x. z( {ܷ > <ʗ7 h@ 0 $8`@ @ rL 0@%- 0ܼ9@= @@*`R<0 (@] 0( 7(P@޽@P@` <P@\.=wfP`@M@֬ M  0`|&@(`@@ n |7@@O`/@~ p @ `  PG> R  ` MY`'Ϟ> *T@E - ( @@ ` A5@`,YfHv-[%@ (A0Ǝ.Ȭ9>-zz֭-@@-@޾ @(A@`/P@wP H/ /_4x`? "00@`@ ` (0@@'  @K0@@ (@ 0hQ@O(A   +v@ٲ 0o @@ /_. ` P!0`@$8`X@F` 0  0@@ ϡ?_@  ` 4(` @$H` 0  `@$XA(8A  ` Ah  PA `` 4@ `0@`0`h A @†E A00A @ @ ,P0 @ @" H@   0@sN@  `  8H@$p @ `@ 0pp8  ` @0@A   8HP@, ) 0  @@$0A(@`00) 8p@(H@0@`   0 @ 8H@$p ` @4xi : 0P  $@` @p HA 00 ` 08p@@  P(0`00@@ P  ` I`,P0 @ 8 ` @ 8 ( A 0@   $`P 0@`PLy60@0HA ( A ` 0  $` 4X @p A  @x0@  ` $`  $X`0H( `  ` ,h@0@`@JX @ As@ 0@@ p+vP  0npo^    @@@ `0@h @P`ժ P  PA  (AP @ }@ȗp~ PA'@`@~0`PA P8|8@*;r `ȑ#,[|RL `D-jҥL  5*X%` V 8X@=6ڵf % @ 0` x X;~X*[|Yf J  x ض= wn  P0   ݀  0`0@` ` @ Ѐ >l8@"  0  `~P $0@@0`"Ŋ/b8@ @&KHr._„i͚6oi@ *t(Q  *u*ժVbj^ VY΢MV[K`w/_0`0†P  y2e 0Ξ?wPN @P` P |8q @P`.@֯cϮ}; O PA `} (`A  0Q 0@@  0$ $XA`Ɣif$`'O  PA 0`O  `  $hP@ 0Hp@ Pk-`  k  @$p A  ` @`   8HP@ HA  @@5ѣH*]ԨP ``U$p 5 @ [5@`k`_$p 0@ (  ` 6   ` @@8 H@ o @  0` @$XA  ` H`$P00@@`9 ˗P@4@@ `Q ДQ  ` @ ,xAĎk` ` `h A  @a`, 0`@ 0(@g P $hPM6tow ` `N` 4@0  0@ 0 '0 ̧?@@@,h  0"Ƌ (PP" @JVP@Ьi( `(Z`J 0% @*V+ذbǒ- h;0@P`޼  @P b3n&SLy7 @ 4``@SPР0`ܺwۀ‡ 7`0o9t0:ڷs=`h{ `P   (`@ (pAD (Vdp8"P 0yҤ $h0`@N30j@0  @@0c pk p;@\q {׮ - @` Pq pرpy8wY@hH ` Nvlٳa'Hp@ x AÉ/Hp,Hpz x@(A @@ HP B  ` h; %M@-]SL5m=  @$HРh  j@V]k@kZ 0HA ( AXp FX<l=0@ &0@5,8lڵmƝ[n޽$@@ 0$@@ @p0@ >0@   $  H@H`"Ŋ/bLP ǎ i IN0`@@$0@*t(ѢF"Mt)(@A 5@`.0@`6@ $p @Ȭys>-z4N6@`6@` PC.}:֯c 0@0HA( A0@`H@ P@D4@  ` $hP@'Q8@K/aƄ@7q4@` 0G  @  0@Xp_;lYgH@%`@ @P`'V؀ @@X !ćh6rH`@ `$(@ ` P:u @ B-j(ҤJ pԨP jp%`W  A @ 0(@ ` h A&@ .MWpذ`m4XA 00A  @` ;Ǔ/o<h}`>7@ H@0  `8 0$#  ` HٳC=P @RI Tz$@` @X@$ %` @p` [ŋ'@` @(l @f0@A   8HP@p  ( 0` n @v 7_ٯ?P @| HA/  $@0X,` ƍ;z2ȑ 2% xi & ` A PA 0`TT x5@@ @0@ t-p޽z80`>l@;&PA  4@0$HZ0 @k۾;ݼ{.p  ;7 @P` (A  0`x?> 0 ?H ,pB QbD\x@=z4@@@ `(@ ` @` @EETRM-pTS  ]~VX̞%l @ K@} XF|8A?6P ʕ)(@f|&`@4ҥI@Zj\P lڳ P@w|\p / `͝7/pt0   ^@ozܻ'_4 H0BX+.`P`#Ǎ )2N}  ``8`A@C!>4` @E cGA(dɒP `pԹS@O :Th&UiSO&(jUкUk50,gPm[j Pk@_50xpÇ8qcǏ!G>P @e˗ P0 uk0 ֽwo߿NP @q  n:u` O`@y 7@0HA  `  0 XЀ H @ȱǏ(ɓ0HAbP Ar@0`) HJիXNMP ׯ^ @, X[ @7x  @(0@ L@@XkM۸8p  ` @h0@/ӫ_Ͼ@>߯? `  ` h@0@1 9 00P4QH $SQ&(Up Aa8@ @@;`o \aĉ/@%G.pe̗ 06T66Pm`   n,'` `@ݻ '_y `} ` H@ `hH@&RX7r#H (idV\  `v$'РB(A2mJ`RRj kƒ-k,m6 n 0 0` @ @'K.p̚7ss.MWNP@M6ܺw{‡`8 07@ҧOpڷsƓ/o@׫7@``` pA px )V<@ 84Y+YLP@ $pgNx 0J  0* zu@V0` @c 0{ضun\Ե{@{ppXŋP @dɑ p tth 0}Xf]ٳe'(` @ oÇ0> 0ӧ 0;  00o@ >|_@@/P@ 0 …8|h b QF:z$` @$K,pʕ*0 ̙4k4P 892Xl;{ :J.}@լW8 @@@ &` x8>@0@ @{P?޼( `ۿ?H@$ @ P@(RdDy-]Sl޴y@=y8@P @ 0@  `  $hP@ 0HAܺ  ( A ؀0X  @dʕ-_Ɯ00Hp@ @ lPp ō? r͝?.թ(@v|4p A 0@ 0P $  8HP@@4@ $p 4  0P  s&͚6oYj@p`@(` @ @ +6l΢={@n+v=P ߾|  x h@ `@0@$@@ @p0   P  0@`  ` X`@֯cϮ};w ` p@`P@(*(`APPD8bE 'Q< 0`  4@$HРh  `W ( A 0@YP+@ n]wջ <?o۳? $(` @ $ A0@b `  @@ @A 0 X 4 X`<` ` @$X 4X 8H@$p` P @Yr\|@=ZtL6}@֭Y8@l   `@ @ 0@t_=0@| (`A?@ @ `@$`P@@8p A  0`@ P @o߽ 0 P(.= P0| W~=0? ЏA0@@ ((0`(" h ٵg?P@ŏ'?@ԯW@8} ߟ? ,H0A *,Ĉ'R@3H#Ȑ"A&($ʔ*Q 8%̗i&Μ:w P Р@ `0m)ԨjrZb(,ڳhmҝ[ z@ .Ċ'NP Ȓ'Gp̘3ТG.@S85m6ܺ/Nʗ+? `p]Ǔ/oֳ_/ӗ@@_` LP @B 6tb(VX5dH#Ip@J)ԴY;yp@PiR8jTS&kVlد0{mڳpֵ{o^{!! NETSCAPE2.0,''888FFFTTT'''gggwwwŇ,Hp*\ȰÇ#Hp ȱG$8@d\bL8o:X JѢ (=`PBu ʵׯ`Ê{ ,ppʝKݻx2X߿.`@ Xx"K`˘//`@ϠCݙS^װc˞Mۮ,H@@ N HН' ` $; OҫO˟O}  XA .dXE5nؑD$YrTT91aMٓ%ZQBiLZUYn:u%[Yiծe;vqΥ;a`ܘ$O\e̒s&]iԩUf=z̦]mܹu={'.ɕ''psPzulŏ'_`ߞϧ_}?,h „ 2lH'R817j$pȐ `Il2gҬi&N-j(ҤJ2JPj*֬Zrjbǒ-;6jתpܸp `.l0bhPl2̚7sl.m4WnMgӮ=;wp `0oҧSn:vƓ/o<׳Oӯo>O 484th@)NL@@ HdH peJ+Y4@ 3e gN;yhP iR SVzk @c8mZ$8ԭ; w f@bʼn0 rT&0@9o6 ` `իU vl pyx @˕8p@ӥ Pp{v۹w=ȗ'O/`@#hp 8,Hp  x X<ƍ5* Ȑ8 83&ؼiS<{ 4С=4)R5*5֭\zd˒%pڵj0 \87޽| >lx;~ *[<;{ :   ;ݼ{Ɲ@ć8 x[=ܻ[O@ $>?>| ؿ?@ 8p@ H@D-^Ęqb<~H%I@JSL5m3|4@`E-z@MH@TU^Śuj~J̞5K mݾWܶ /{`@… 8@bƍ?Y\|@=M&j֭][6}ōG\r]zt\~ݽw'x͟G^zǟ P "Lp!Æ `"ʼn `#Ǎ8 r$ɒ&OL ^|I6k ` Ϟ$ t(ѢF"MthB}*Vbj^z%pfϢMv-[ w\w^,x0†>@ ƌ  y`Ό@?-z4Ҧ?'`5-{6mȭ;7~.|8Ɓ `9 `:Ȯ};޿~@8`=/?ϯ?8`0aC8bʼnиQ#@9dI'C eK fMйS =@QGHp :UfJ_ lYPm[o&80@՛>Æ `Ǐ!G~|@˗-8sg$80@QV} ,pvmн[7>\8'GϡG>ױ_?@ @w 0Wހ@~}`(T$Xŋ3^<@ Ǐ @$ \ɲ˗ IsrI JH& ` ӧPJj@Xb=@ ׯ^ @,]˶۷p5@ x& ` ߿pÈ'>@ ǎ @2 ̹Ϟ HXz5M{6r}`@ N|ȓ#?@ @:hνop = ȟO? $8 .d$Nx@18p@!A8I`K1Pf乓A=@ QI.e)L:YfWaŎ%{@i8[[]yo &<,f%G>0 e̙5o<СA i`ݚdϦ]mܹg8o ^/gL>ٵg?0 wŏ'? { }ߟ?,h „h&RH3 #Ȑ"G,i$V\y@2cH&Μ:w<@ Р@ `0m)ԨjrJƒKj ` ܸrҝkz=@ `0n1Ȓ'36@̚3 ` $`4W 5m7`0oΜPNڷk?@ Ǔ/O =o` 4x 6dx@%XcF9v<@ @H! ptfLyxI%JK jTSV%p@VYW5[kٶun\l pwpqbŋ8@ @dɑ ptth0}XfMhצMݻu xpÉ'p@rsT^۹wȗ'?@H~| ~ X… 1"DXh;z2$J,y@,W8p@4g8 Μ 4СD 4)8}TR=0 ֭\z*A$8@@lH ܸ o8 `Ō  :{ :h>m[&pk&pݺ<ċ8 x9[~@ܻ{˓?0 $?>ؿ?@@@!>tx@-^Ę=v<@ H# 8@ J+ SfęSN5JM&@` TU|k̞upm u8xЀ}X`„Xq<-W>@ fΝ=MҥI @j @l|\pG~͝7'pt(` |`  P@  8`(ѡH4)*5*bz@^ +fϚ=@ ۶l  w ׀ ` @ 0  A߯ 0C%NX q `)Q KYtO %:I&%pQF%pUWWa8Y`ۖ-Ε@/ &  4x4tؐ)N\@ 00P@@,Xp3 @; 8`-` @ p*@T @ (0  `k n\{o^{@8p@ŋHrdɓ)W|9r8wLѣE/`@@@ @@ ( @(P 7.4'0@ (P@0@o/ @ <0…1"D1#2ȑ$K,[$p̙20 瀝<{) D=:@L:} 5T P֭Z6,86ڵlۺt%p| >8`8~+SN@@:w@Ѥ   @ٴ   @ĉ+@0@ `@ 0@0@v P>=z ?W x@ 0B<QDH`<~H%I&@`@J$XSf 3$XTh 4$XUj \zu].H`e"H@Z%0^}x0@b @dʕ-_ƜYfL6M֭Y @l|Mʼn @r_Nݹ @x͟G^z @|ǟ_~ p L@:L@ Ŋ $q @&OL@ ˖, $ s̉s><@ ѢF"Mt)ӦD 8@@Vbͪu+׮^ 8`,ٱH6-}@vH`/߽ ,80#>@ƎH`2 Ȭ9>|ONz5֮_ poέ{7޾&p|r@֯['p ~xO߻'p~8P&TaC!FDH0fԸcGA8'M eK9SpI?} hQPTFJW kW;VЦUm[oE;ջo_;Ç qc\'WysϡGG>g׾{w>}{?_~O @HÆ Hq"2j̘@ ?8ɒXɲ˗0cʜIs ϟ@ J (]PB%pիV+W+hӢ%p۷n@.]ݫ&pÆ0ǐ#KLe,`@ϠCM XzuȖm r݀0` +_@0` 'H{‹? 'XG0 $XA d$HpE5nDH)Q&P @ 0t"P 5P@ ,e L ` *P+Ď- `  @̝[ Hpaĉ/f$H̙5ogСEc^`@ `kd PmM >q М @`Pwŏ'_yկg=  (0@ P@(@@` (P@(`Ѐ $h9@Lf & 0`B 0X(ҤJ2m)ԨRRji0H   (0@   n( :`(Ht) uT 0`+׮^ +`ٲfv۶ +ͫW   @ <`2ʔy3Ξ?YO - ( `q0s ( ` `n@ /~ 0P /`} P(@@ F@0@@ i@P%K/ @,Ӏ? @G0PO 0P j@W(0 M+ hР@h@@08p $6q `p(@ 0P (` @kׯ (` @mP0A   @ ( `4H  @  A (`@0P 0@PP E2(0 9@ P@  8( @@0P@( `@08`@4((( @ 8H@@ @ @ PA P@0P@@2kl@gB00 `$ 0 ` X.@  @ H@ @ ހ0  (( A P@L, `l P@  2@( (` (Р8@(X@  @ P@,P  @0 @Ppa(  @  `$P  `@(XA P@(` `  n n @ ` @0@A( @ `@0  @ 8 @`0 `,A4  P ,h`0`"h` A   ` 0@z 0@@ 0` 0@,X0` @`  P P P(`  ^p   ` 4@0@ 0P@(`  p8@@ pq 0@@,H@  ( @    p  T kV(lXpv@ڴزV(@@`{0`(P 0`@d 0@@@@(P@ p( @ @@  yp|@( @( @ȗ7O~ 0( ~p  B8t8 Xh@:z2<Ҥ 0 j (ӀΝ0P` (P 8}j jX* 뀭\6쀱dˎ6ڵlx;@ܹtP     `X` @x   jZx jݼ  8~\(`  P =Pz  P ~ 0P(@  @0 ڻ0` `(@@ @   р.`  `@ H~  0@@p` A   ` 4@ @ǎ@( ` 04Hp@ йS0H$-`@P(@A `$h  zt ( `v^@ p0ط/ ( @H@@@D% @F@t^|/0A ?߀ + (_ P"Lx  Q.^q#G>)r$ɐNLrK.0` :`(Q TN@V`:`+׭`,ٲ   w](P@@@~@|ҧO/0຀>` 0`   |70@ 8,HpA `(`( @#  @(@@@@xs@PC `   @*0`c 0mZ  ( [`{  @(0`ɓ)OFpY ٳpzիY  8 Opy ,p n@ P ,8@@Է/P@   6$qĉ 0@@  d8%|0Nz@@ ( "@@ ҥx@x* lc  2hp Ath@8`88~xd 0P@x 00ljP \ (P`8N  >( `@xO P`H@  *@ <@@@9`-]0@(hp@ $h`0H (PT Uk](`@e @p( `\0^PFLƍ0`, @< @`80 \&{lm( ` @@ 0` \~} ^x??@@ ? $Hp@ D A$x `@- 0`#G>  @,Xp )s&͚6osO> J` t( @ K    @] *@W/~Ѐ@&  @`3g-ڀO  $Xn   0`Ə0`  0@(PPР H/@/`@ 0@@A@ 0 09@ 8 P A0@ ( 0 (@XW (` ;V 0P@P @@` (0'F,H0@p` 0@i 0` @ @,H .\@ $/ `@ 0P@ h`   ` 4@ @ ,Xp@ P@4(0` X`@,`` @@0 0-@H"}Ѐ@P  0 0 h m[  A  0 ,PP a 0 0@  0`@$@ 0P@ @ (` @0@A( @0 `$` P 8Р@ x`@0X `  0`@ 8@в̤9A4 (Q Pժ   Pv@0` @ 0 0@ 0`@$P @ `0 D(` @0@A( @0 `$` P P8@@,H`@X Pp`_@ 0` 4@0! 0P@6r (00`f(ঁ ӀB h P $0`  Txb0XP @8 0`@N; @  @p:z@t@@ p.\(@@`(Ppx4.0@dɓ)Gpy͚tLt 6mz pu pwnݸPÉ p /xT7@0` @ȗ7P@ $h@@@p 80aB x񡀉*V」  8i@Zs PztD@ RL 8EԩR 0 6d-Pڵ0 nH o `@ 'P0@ xl l0  (@(P@ٴ0 nz\88 0P@0`ܹ#@0@ }ڻ0H DHB>@@#<0@ȑ (Ҁ-S l@@<0H @Z@ Z@ (` @0P@ Pm +`\ +@ @ P<  < 0L@@j֭]{l&[n|P p  @9͝@@_~v|/@  ` z8@ /P, p`H(`a8 8@ǎ?  r$ɒ&r. )n8p`@% E E@ J` `+  }k@%W/ (@0@@ Hl@P@`6@  @`(hpm@({7@ @@^^/~y(P@@@08p@ @"0 @ ,Xp@ (`@(@@@@ Љ`@ 0@G@@ ,8@@_ 0`@ ` ĕ@  @   0  `0@ l@g4H  ]@]@0`#h` A  (P` 4@0Ɠ'o`( @@ @@@@o @B P #86@@@@# Xtr(   hP 0:4T@TS J`4H A@@ pK 0@`@`6|p2'ly8w\`(p@j vvg]@HЀ  @ө @v݀(0س~ P@B x1"X` @ Ҁ$K$2, t9`ؼis (84逥0jS zՀVv5 l  0 n4`@ -`@ 8,@ 8@ɓ @ ZѤ lj P V@0`  8p@ 0`ʗ'ۻ ? #08PaB\h `@ 2e `@   0@hE@Z 0@U    @X̞vZ  `  `^} @ @<@@ y<< `hMFzj~=@m | @nr͛]_n= _@(`@ݿ/ @7` l@H0B q/8@ǎ9@IHr. 9  @ %@`@@ : +v0x`-۵  ݺ @ 0 0P@0 ـ0`@  [@@ @ P@  } 0`  ~  `߻0(P@ *@0@@A P8@ 8 @p`0R@ A  P ,h@@00T&EOj  $`@@0H A ``7$h@$H@ 00@0h (@A  0{v { ^@ 4@  ( :u $`@@4H P@hP @,P @, (4  P P@A ` XYA0cL@ $@` @8p HA0 `@$P H@ k HA(` ( @ 0P` `@$p  ` @  $@ @ ؾ`(  (  P8pA HA P@ HG P2  `A 0  H@$ h 00 `@( 8pA XA0x, @ @`@0@@ @0  P P@A P ` p` @A ( |   $`@@4H@ P@, F ` 0@A  0 ` @$HЀB(8` @ 0P0P (`@ @P8Xp@ P 0@@ 0@ ,h` 0P@x @ A`[8p`@(@0@@@ҧ( : 0x @@` ӟ@` @ @ 0P@0p@(P`@@@@@;y@ 0 @ 0+V[ U@XȒ%@p@sPР 00|X80 @d(S sf6}Զ  m@p 0~7wS7` @tP@ɗ70 @P0   1D*Vq2d$ 89Z( 怙 , @z9@D 8z x*T Pp ֬ Pc 0` Z (`  P @ 8\ b P 9e l@  0  . wݼP p ( 0@  w@80 z _  (@ 48@a0P@-RP<0Rd 2- 0@4 @  Ԁ @jR(P@ (~ P`0VZm @;@0`… @80 ,`<Z(` @ [0n @ō'n@y͙@խ_^@vP͟G^z 0@ P p  @.b8G )r$ɐP@._@(O~0P@(t)S   ( `+vX [ - vͫw/߾x 0@@#&@,y-y6P@(^#h AnP . A  0`:$h@@ P@ (`@ $`@ o@` A(@A 0P d4P (`@I' PeK/aƔ9ӥ0` h`A PZD W8@ 0 P@(H@  @ 0X   H@˗1h @ (`  H@ @  PA (`@u(@ 8H@ @ė?~}7 ( @@"@(cG @ P Kb  )@ 0@@H P@88@ իX `p @@`@h(P@8p@ 0  0@  $@P@0PA 0  M۸sm@0 @@$p H7  P w|y X_ {(0 0P(P@@(P@4h@5(@@ @T0P0H (` (0A  0 P@0P$HЀ@ 0ж̥[]y5 ` \@ 4@  0 LD0Pt `]k mt ` `9sLW `@ @ g~ 0@@  @ ,X@ P'NP7r#Ȑ 0@@V@ЬY9@@B8@ 2m괩Rj 0bǎ5 ` e@ k׮/`  Ċ3 'Sl2̔ 0ೀТ (mzW@,`@ o 0Pr /gܹP: ;48` 0@`?` 0`  (P@ P t # 0)@J) pҥ$0@N;y@( 0zԨT@TSzU@V(0`AZk٦M Ե{o 8Р 0|p 8pA T.P @ 0m@ 6@l (pw( xp\@ 4/` @t(8p{v۹+|x @ / ~|p}8 <0… &P @)@;z2d$( ,[ x) 0 Μ84СD:80 ҥJ 0 Z0 \z@86ڵlۺ} 7 ׀^@ @ 8~ 9ɑ : @ :uj ~ ; P xp 8| x 0ܻ{>opxo 4 P @$ 40a <4P hF4H  A S&lęS@ @j( @Z@Xp@VZmݾW.Z  0@ HA(  0`@,(( @@L(P8A H@@ōG\y?wn@t( 0`0 @} p@ ǟ_~ p |p@h  8H@$  (` K^0`f(` O 0P@ ( @ H@V8`+׮^=@ ٲd Hk [(` ]     <`P @C,y2ʖ/cP ` (@A 0`o n@ H@ @7P ( @ $`@@87P@X 0P@(`@ @I'QTeK/K.h0ӀP @@@@OB50ujWf@ - 0m۶;n]w^  @'V8 P@@мsgϟA= V Ė=vpнwo>p $W@ϟ8zuױg?@ @w 0` `@{Ǐ?`$8@@*\ȰÇ$8@@hܨ(@0@ @b@3@8 s @h 40@@hݺ`Âu h,p۶KwPo_ @aX@,`@˘3k̹ Mz  0@@c.@[r( w(@x (W.y0zh/{‹O/`@ Oo0P@,С0@ 8@$YI)Udi@1et 0гgA (PQI (ԩ LZX lj W` Pl `Ε{@y( ` ,@,fر <4ogСE<ԩQ?8e.P۶m 0@@ɕ/O.s   .'Oէ?0 {P~Ͽ@(@@@ P @p8@@"80 ʔ*Wl%̘(` 0ুB(Z@ $h@@0H (` @ ([@ 5P` (`W [@80h&S|@̚5  @ $Hv (` p `8ʗ3oPN=s7{ 0$@P @8pA 0` 0X @B 0P@ (`0P#I$p@J)KԴY;y,` p@((  H@@[ 50{mZkٶu,֥@{7@` P@ (  8H@@ @ 0m@ HA P@ 8p7^˙/'p@tp{p p`Pp@ 8 <0…  pĉ0 c;r `@  A P  (`@z( h(@ `0 Հ\v%pرb 6-}t-@A  4@ $H* 0 s:ѤK>:5h~:j;{  ( 0P[P  @`ʗۻ'p ??@D@ @ @$L 0@-8@ L5męSN3 Th R <UTO\Z@V |- Xe 0VmmݾmKu& ` ^$XpF|@ <.Yrd-_\y<8p@ҥI0j[lڵM`|Mʼn'P @͝7/]@ nv{/^x>} 0  o p@ Lp:dŊqF  2& @P`f6m @@@ `(ѡHt)ӦNBU@@V8`+׭  ٲ M}k`nv 5P@~\`` HXC/[v Ξ,p`4HZ`@`޾@8@ p`:֯cϮϛO@_`>_8@P! F8bdԨ@G(P ( eK9s@p8p@?}HhQG&UhFJW& ` @W_ZlYgђ5P@(0n]v(@_LÇ'V!G6P`   P@@iӧQzĖ@qֽwo߸0p$W<00@ `@ 7P@@ 7P0H 7@(PA(,`@#J$p3jܨB@ 0 4 P ( @0h)S HJիXNM@ ׯ^ @, Xրp @ @ @@  0P @( @@^ͺuȞMͻwH@8A0  P w XϾg@8$ `  `h  P@  ! (` @ 8H@ P i P4.]J QNZ5Yn 0  ` (`0P`] ˗ &</fcȑ88@ e̗ s  m cm@tmo0H ,7@0 0` @ 7y`{P8`Pp  PP @68p@"C8$ʔ*WlfҜI:s&@` @ (ZJ 0m)Ԧ @@@@Z ذb 5P@ h-ҭk.7@(p @( @6P `in5زg>@ ܸ  (nʗ3o9t Pn p7` @ P p=wp`@0` 4P@@B4Tp9n$p@H!,HpXt@3$X@N9O5Z40@TS0PkVXt-P@  @Z Ps 5  p`0|qbŋrd(W` @f y@H0@ vl}xxp 7^˙/'p@t (;v tݻ  @  @(  (P@ ,a08`@'0Fx2$J @,[3j, <@  Ҥx iX5֬$6,=kl۲M@(7޽|5`  8.@X9͜;c6:I0P@լ[P ;7nċ?<;o~@ԧ8 0P` /Pz x/`_@X (PP@D \4P@ 4@H%MD @f (`( `P(P@ @T~VE{mݶ%p\s 0P `@(P@$HЀ@ h  (`@ 0` 0 P@ 0Ph` @\r͝?On 0=v $PP 0` Pp`hp@$p p!Æ8`"ʼnȨ1#>x` H@@ @  `A0@(P@8pA@  w.ݺv;׀ l@p@@(   (O&p֬ {6ڶo8`7.<8#?~` H@@ @  `A0@0PH@ Ph @ ``@0.P @GA9G0eK8pp@ 0` "hhp@O8jUkW_ p@YeZĕH`@` (@A \ 6P (`@`(`  8Н@>xq (` @s(8 `@@ A LJO H@(\#B$pŋ(`@ Id  ( 0Pϟ=@H (08`hʵׯ`r5@@h0 $8@ @ `(^#C>@ ˘3kLϠ? Xzu6@6s6@ @\@ȓ+_܀(hpkν(@ހ$h@@@Pp,d%F<@ E5nH!A I`ْe̤iti  jI `ڴ@ j@ 0@ -0@A @q [+ @` `<@c \ ` g @@`8@ kد Pvo ^/WNѡ'@P u 0`w  @ (޽ P (P@0P` @&@" "@(hL hN:I`@B 05P@+ƒ{@jײmr=@ ޼x  (l0Ĉ 0nlు'S,7s\С @@j ( `  Pܺ 6` gr 4H`A 48`@ (@@`@ ( @@ h/` ` $x@ 6t)N<@ @F  @XlY @0@x5Z@0Ԁ 0P@` @@0sEpW4@`,x 4Fx@0 0P@ XfMٳe wnݻy&p@ppq4wH` 0  (0A `@| p_@ P (@ `0@4X P 00 0@0` A @@A 4H  @ 0` @8x@ 7/^ >81;n|@ɔ'8  0P (`  88@@ @ 0  (` @ 0PA0  H@@0@8A(@A  `A`` 08 (0@(  8H@ NpР@ TiR<U^ŚU+~z@e8@Z 070@  ( @,0P@|`@ p  (` n H   @  0@ 4XA    0`@L@,A `"ʼnȨ1> )r$IL._$p͚4( @A 0@F A *5V` `@ Y4H Pp A 5`/ 8A `p`4`@P   @`4H A A  ` 4@  ,8@@  }t`ώ޿/~<Σ?@8`> 0 00@ ( 00@0fԸ  `@/ ` @͚ 0 (@ }߯? $h` &d0@ `5&Xбc!A. T40A$X H`  J@(`,P*  @P`k [ (Py (з8p@ĉ8c\e̙ s&=U>@ kد pmݛ7 '^`ޜ9L^lv _7` {ϧ_>ߟ?@,H 2l!&Rx@38#ȏ(i$V\@2cH&Μ:wL@ Р@ $`(ҤG)ԨO`p+ذbv%pjת%pܸp0.޼z5@ 0h&SL ̚3' 3(m4k Юmvw/Nʗ3o9 8p@ڳ8;(o< ЯO?@`HaB p!(Vxctؑ@#I4I2+Ytr3i<0 @N;yNpQ4uSVzvz@c8mZp֥{`@{8p` >0 @bʼnrdɐ psf͘ $6}ujիYpi&p@nݹ xpÉ8yrp9W~`@۵ 8|xpyp~| p}  … H Ĉ 1ƍ;z8J,I,W ̙4kpΝ:4(P=jL2pԩR 5+x 6ر 8ں} ڽ훀@ >8b  rx :$:5~kN@@ݼ H < 8=t0 v>x > 8 ?@@ Hp@ 8@D QF,RdDy-]\L3,Sg EEj>=T `]~e͞-l8@@uޭk@} X`… 0Xp@ƍ8@d$8@=} ,p@j6l߶`A}'Xp,Hp@ ]  0@G^=z  o~` ÆB< 88@ ǎ  r$ɒ&OL9._$p͚6o̩s'Ϛ  tHt)ӦNBbͪu+v,ٲf `-۵+w.ݺv{@~8`0†#Nx1@ y@/cάy3Η  z4ҦOH`5֮_^}@ڶk8޾.|8H<9C.}:֯C?0 $ ~<ϣO?>Ï/_ ϯ? `APaC!F\x@-8cGA9dT/aƔ9fM0 gO?HhQG&%z@OHjUWfպjKgѦUm[g0\ջo_M@ @aÇ'V<Ǐ!G<0gL ϟA=t PZ5`ǖ=vm۷q>0 @o߽$0xqǑ'WN<G>: d׾{w0x W}{O@ @} HÆHŋ3j@ CIr@(S\ɲ%Ȝ)srɳϟ@880 ѣF ӧPJJihjŠKٳh880 ۷pʕk˷_Lx+^̸ǐ+̹ϠCov Ө,p  0mͻ @@ȓ+Gn@У@,p$8@|={O`Ͽ @ 8C%Np5fdG,Hp `K1e@& Ϟ8ѣ `t Zn`Ď%[YiծKqΥ[. &\X `cȑ%O\9lD6@ ԩQ' ` k$8@ mܹuo Pqɕ//~`@ѡ8uٯ'wŏ'_y`ߞ}ϗ??8p 2l!Ĉ' pƌ7rF9*WT`@2gҬi&Μ: Р@ `0mRJpZr+ذbj%pڴjײmҝKz՛@.l0ĊH1 l26s|@ТC8p`@Wn5زS86ܺw}‡ 'pʗ'?0 ҧSn:/O׫?@ 80 ` 4x6tbD  ptdG0yeJ+YtҤԴ;yp@PA p jTSVztlXcmZpnܷ{o^{&|`@ŋ8rd| thѣI6} vvlٳ[' ` @n$xp0yr˙7wzt~ztn@ɏO@@ H׷~3X @ 0@ X`о ̧?'p@,h „Ch"6r#Ȑ"9& $ʓh i@Ӏ(H @  `$P0@X0P`P0@@ hĈc Pl2̚7WN@ Р  4h5زgv@ܺs87 (`@0P@ >   {( ,8` `0`` P@ h@FG 4yeJ+YL@ @L1  gNhPC@K8jT P@[P 0`  0@@s ;  p 0|X@p0Xth0}4Xvvlٳ[' wn0~yr˙7өO'p@v0 ɗ/ٷw?@@|'p@~p  `:lx@'8ƍ;z2$8$|R4kڼ3Ν54(P=j4 xt ZU`( ` ʚU`( ` U@@@@(``ŋ  ɔ'   :ѤK@@լW8@ ٲ @ 7z <'0@̛3'p 0=; ,> 8 ,x?  ,@ @ >t`)"H@F$0J-]s0@NTPEETiP<UV%pV[VlXE{mݶ%p\sWo^ &pbƋYdʕ-_ƜYsdZhҥMF4\v}`@ڵiH@n 87@͙H@t ;@8@z_|ǟ> p "Lp@/Z$ǎ rH L2._$͚4sN 4FpӦL0`*ժVbͪu+W v,ٲfϢMvX v%p߾| x` N;&pʔyf O&p֬ {6ڶoέ{l.|8Ə#O<C~@֫8`;/><Σ?@8`>ȯ??8&DHbE1fԸcG 0dI'QTĔ7q$@O=0P $U4O>@UUV 6gўp@[m 0n]wջzuױg׾] ?|yѧWLJ@8@ A(\#B$pŋ#G)(S$p˗.0͛8sɳO0 @ѣH*]ʴ)Q H*5f5``Âm@h0@Ap.h@0P@$X@ 0 $` hެ@C^ӨS^ͺצ,X ͻ ? 89  Pw    @( 0@@ @  d(P` LT X $9THpK1eΤYtHA%ZQIX`@ ZU Wa K `˖[;`y @` `ĉ/fcȑ%O\e  @@(P` P@(@@`t(P@(`P\ (` 0@ٳ@ 0@@,{ϧ_}?@0H   (0@   cF(P@,HH E A@ `Zr+ذbǒ-k,ڮ @p 0 @A(` H@@ hl 4xA @@@ 0$P@ m`/n8ʗ3o9ҏ'@0(` X`,p  P @`0 `X` P@`3iִygN;yhP   A(0@ (P $h@c0+-Z ,8$X A  @(09wthѣI6}uj՟( `  `  0@(P p| `@ Pȗ @@ @P <0… :|1ĉ( ;rR$2ʕ( $ & 0 '@`t 0@0`Z5֭\zZuAd$H  H`ܹt&Hp@ .H@ > A3N` 4@0@@:<@@ zլ k @n0`ċ @@(  4P@` x> ʛ?_>ۻA/H ' @ (@\d@F(PL"P \T5i"PN  @E (`@:UTZ@] @X@0`u 0`@} `Р P@b (P@2 0P@f;3 Z L3PZ5 mF@` 0  @͝?>@խ}v  @0ݿ^|ǟ  P D@ @(`/Q@$@r%K )s&͚6o)@> ` @@@ @^5@] V@ @`n(P@@k ( @ X(@@``0`f> Hz @@@@nm޽ 0`@ @`s @7`. / H/@@(  o`(  hP @ 4 P @8`@@0@I08p  (@ 0hQ0 (`@   ` 0 $`@@@w( ` ` (P@ 0@@0P@@g@0` `@k08po@ 0<0y(` @ P@ (` @ (x`@(P@@( @8pA HA P@ (` ˗. i  @  `$P0@ `@0XA P@(` `  `@ @@ @0   ( @@R0`b( `P@ @ @h @

@,r @n @J  `  0U P0 (06`] H`P`H<@ yʖ` @@  z  zu^ `vn@ |8 @  ( @ 0P@4H/`@ @`A@@A(@A (P@ 4@ @,Xp h A 00A P@(P@@0 0@0@ H`ЀA@ 0`  0  @| +`@ ؀@ `p QbQ=~ @@  @J|)@5 0`0P@-@<-0@TUU VXb  @m0@{W} ,``…(Pb P\&@ 4`ZtLh: `@ 0@|<ōG\?0@@@{'@ ~0  D@` 0@@@E`0@G@  `.[0 @9~*`p  0h $HpP^ vV `v w/_P`†@ `2. P@ `0A (0 04H Pp` @'0` Pp`A0@@  `> 4@ `0P@@$4P`4Hx 48X @ , `@ Z@ 0P@@Ӧ$HЀ0`(`lg  A 0P@  0@&p@ X X`@+XA `  =@ 0@߿` ( `0@@ 0 0}(@4@@ ( @ P` @P_ p H(  A4؀ 0`(`@ (`p`   @@ @@` @B-P@ժ(P` @ M;(`@v `PA  ` $h`XN6@(`A  P(@A >@@ }  @ $P  wX`8@@ @,HЀA $`@@4H  A 0, A  ` $h`O( `WX  P Р@ X@,p` ` l @ l @ 0@  ׯ]'@0(P@0 ` @ @@w  @@,`@=0  ,A P P@A(( @ 8H@ @ 00( `(0$`P @0 A8@0X ` 0@È@ `@0ACN`,P  `@0  (  (,8 @ ` (@ @ H@@,  ` @4  0P`,P0@ `@(HP @@ Xp(8` A (`] 0@@ 0@$`@`$O@ ,h@ 0P@0` @ @p$h,H ` `p`( @A 0`@ 4@ 8p@ P@  ` P0 0`,Xp0`@v*H 4 @ t (@0@p%0@@ (`Vh+`0P@`w P`0n@0@>|x08pyp_@?/@ 40A HA XT1 (P@ 0P@xY@ `;(h@x*`PxJ 쀱c0`lx; \ ( `8<@8v, @ : 0ѤK0@ժ@ ٴP nm` 8`0P=t ( ` ^@  4`@@@ 8@D8… 0P@ Q 0@H  -80 ę=}P@h tM UkV  @e͞E;@m k \$X ^4`@ bƋ<y,_\@34 @MZj{lڵm[n޼ |@͛\>@ 0@x@=_~( @,P@ P(`@(8 \ P 9@@(@0@Ϟ>:(` 4@ @V u+  `   Wo<p@@,H(` (`@  A  {@ 0@ƍ  0@@ 0@ $`@ 0`,p  @@,8p  j 0 @ +V  @(@0@@08p \`Hxc(PȬy P @k@` (P $h`XP GH^@h4 P  (0(0D00` @ @ 2,`0@ (` (0A (P@ 4@ @buk_ 0` (0,X(`@ (P` P0@  0x ` (0( `(0,`P @< 0` @ @@`@(4`  (|A(0 i@ H` (P@@( ` `0 @    `0@ @(X 8 @<`0@ 0X@  @ 0,P07/@ȓ#Ѐ@  0  oy7>{ 8  0 x@ ,,` C `((  8H@ @(` @   0@ X` P 0 @A( @  8  Pp` 0@  Pr @` $h`i0`̦=A (P` (`@,P s^z4H{  (| HO@ `p @ 0 A (`@&`b 0`F0`$H(`@ (P@ 4@0@`5( @  @ @_  @` ( @&S L3 @0 ]ۀ  A0 P r8A 0` ]@ P  `@  `,H pP)@@t$@prX80 @Դyg;s@P0zt@RK20Vt 0[mZp 4` @7vɓ P@8A  ujvvlp{ݺ=80 @rp|@# 0@@}@ȗp~'^g p 0@ 241"  Ҁ ,x@x @ 0@<0  (`0P@TX0 ֭x0`ʚ@ ( ` 0P@{ ` @8\`Ō;^<@*Wy :4I8:jx {  {0` pĉ8n`'@` tP 0> P  x_@` h @(`B 8@"8`0`%(`@\D`@g|T @ҥ>JT k|%VX(VZܾu@ @A}( 0@ Y2d<8@@>-@j֭[l [} @@@ =:0h@ P'@`z @`@$HA  (PE.0P@0 @0X`0@(@@@ @"MTP4`` (P@-P@0`\(@@` P @@,@@-i@@ (0 (0( `0P@ .= (P@PH> ``  0 `  > p (0(`@ @ @ `p@<9 J,$@`4 3瀝)@  @`ҥ 0P@@`  l @k } 7 @ 80 #`p (`@+9(` @ P@ի 6` l ;( xĉ8n@ 0@ ~ 0 P7/   @/@(0@ ( ` @|4 @ @9J- @@4 ܼ9@'=}@EM@>5P \ŚUU]~5X @@(`@u- @}-` @$8`@?0@d\,@<ZҤ@=@[ = @`(@]zt(@@` P(P`ܿwA o@P @@@@  .0 4 ` HY@(`͚6 @ 0P`00A `*U 0`  v  `n 0v  (@0@ H<Hp 8`A -iF`0 A  { `Ƌ/@P sΝ00A  0 ` @$H` `p00A (  $`@ h@Ŋ$H@ h0X ( f s? Z@ 4@  ( $H h A  o8P @,P @ @0  @ P@A P P]AaN@ $@` @8p HA0  ((=$@P  `@ HA(`  P@0P` `@$p  ` @  $@ @ غ 0p`P@@ (P@$@P @8pA(rysm@8p HA0  $@` sX@p  (` @ 0PA ( @ 8h0    (` @( @A(P@0 e @A (H@  I8 @ $HЀ0`  A 0P@ (W 6`ĉ/@` cȐ ` 0@A  0 ` @$HЀ ` A00A 0`@ n 4 P$8@ p   @`@ ( `4X& (`@ @p0 A P@L @ P` 2-P@Ԩ @@`@@P@, k 0@@ @ 0P@(`ೀ Pj gӖ--` (`   `t `pN `|ֳ'A( `  08 pp% cF9vX@$peJ 0@hִi@ΜxhP0z 4-jTS> @V@( `kp+s;`{w0L`ŋ3@p9@tPt p5pZm[ '@ 0` @ @ 0 >0?~0@ < 84P bD*V4@x4P@P J,x ӀL 9 N<{0`x:T *`V\ 0@d 86ڵ P@ @ ޼48  P0 r(Pf:w6 t6 u[x] l ( w ]ċ(0`0=ԥ~@x.  >z / `8@@ Dp `@b+` $h`@% DҀ-]Y5k (PΝ|T Ej RM>UjS :@] @̞Ev80 0@}@ F0@d,p  4 P @ 6`P@ڵm0 0P P@r@(]ݽ^x 0@@ܿ'ǟ4` 4P@( ."h A>P   ` 0` Ϟ>4X <8@ (`` 0P 5P$HЀ@ `  k`~  A (  0`2ʖ/cά0` h`A ] 8@  @( `$  ` @ 0   H@@` (  @  0P (`  H@$p  5 G @ (0@ d kW_Հ0 @@$ 5  P @ x P @e0  0P@@( `6 @@$p @`A `@  0P (`  H@$p  h @(  0`@(@ CII ` @( A(P@O(0(UJP(P@(@ `0h `@ @@ PР 0@A < `  (Pi 0P` ( @ $`@ 7P$HЀ@^zkν0@@/ A  @~ _  H (а L,PѢ PG! ,P P K1_ @48@ PQ QN5P@(`@ Yi @Ν+y_{ 0@@+&@L\<@@ tUfZe @`mܹq P  ^ ,_~@ 0h l^wŏ'_@yԯgߞ _}o@ (hP 0lဈPp 0P#!(`@*(hْL fd`󦂜 9РB"`p I$8i0UZb (PZ (P@ Э+஀z(`  (`ذ h츱P&0̚7@3 (mZزgm[n( O8ʏ'Hp@ S AڷoO H`,x=,H`? 0`  @ ( @@(x8v, ,` @X (`f yӦxhP5Z@0@@pU@֬rW8mZkٶun\hyztөW~{`  `0`(p~p(PP@)H ƍ;zL@ ȑ" 0@(4Y< P@@84ҥL:} 5  (P`  @ A P  (`\t ׀^5   A 0P@ (  :Ѥ:5j(` v ض]@0 84=ԫ[=v0 ` @( @ 0  8H@@ @0@a(` D 0PA ( @ H@-]H@L5mL@ N; j P0@ P@\- @Pe͞EVZmxp@ @@ pp HA(P@ P( @@L(P8A H@ōG\?wn@t( @@( ` `@(X 4_~ p "Lhp @ h(@A 0`K. i@ ( @ ( @ $h@@0HbJ^ +6M@ k@ 0`P(  ʖ/cάy3Ξ?H $8@ 0@@  ~q#OP`z ޿'pϣO@( ` ` 8@@0bE1fԸcG  @`  ` @/ ĔY@7o YgO?-0hѢPTOB%p@UWfz@_( ` - `@[ĕ+ww- | Ç'Vqc| 0gƼ ,HNm@ @p֭[@ .@q P@ n@gN߽;X@y 8ė@((X@0 @ŋ3jȱ#E )A R2P@`@ `@ 3(`H XF-@U0P@ [@h8۶ Kw.{@( `X,@"K\<@@ ` ӨS^ͺ$@6m 0@@` > XμN]سk.{@|y_>7@  ( ` ,d(`$NXQlp`@!E$YI)A8K0@0ٓg @ 0P@(Pk 0@i`@q8]ۗ|@ĉ@\`  P(@0@zdϦ]mܹu=/h@@@0@ (`@ $h@@0H 7 (P@ 7P@ 4 P 0,P@%8"ƋFy@*U  @ $H (` Tj*֬ZrƒAjhk  0$@P @8pA 0ు&`@   ( @ (` ر `͛‡ ?@ (XAP'  @A P@@ӯo>'p & ` @6 0 0@  $ P  pi `@ HA P@p)Vz@[8lX0{m 8H@8@(H@ 0\ @0rdɓ)W|sfs`ujX0P$H@ `  (P@r p^@t(0A 0`@0}pק? 0 @ A ``  ` $h@@$2| 3̙4kڼ<{L@=j  @ (6رd  vl` nt8 ޼  .|@Ō(00`  @F0@j0 ؾ;ݼ{mċO@;ԫ[.   ?@ۯ'p0 ~@@@ X@D,^Ę|p@%I0JSL5I`|IE&@P @M6-U0P@V]VeE[ `@\ W޼ 6`ƍ @d 0@s<0@  \@ @n\pō@@͙8@t v |̟7o@} /P@ܿ_@~ ,P p!C(1 `̘`?z<@ ɒ% 0`e 0`f̩S:FpNB*u*U uV 6H6mn+wn\ ͫw~,8#Nx1@ 0` @ -:N@ {l έ{7޾N@ | n`: `Ϯ};w  Σ7P`} /(@@&T!F4P`0 @  'Q4Ĕ@7qԹgO80P$U400@ `@^ 5P@@ 5P0H (` @ P P 0@˗-8@gϟAQ A 0[ ([  ` <D@ױg׾{w0xW>7`@}0P h Xh@ HA(P@P@ P 0@ ͛6 ϟ@ ѣp 8@ P@ +@@ p@p8ݻx LÈ'@` c l  h.` g P@ 0$@P ` @  @:u hν O|8H@ 8pA0  P@  C8PE5nDI)Q&@` K1 i@ O (PQ(@A 0P  @(P0Hq%]y囀@, @ ,@@ Y@U&pkرeϦ]6潛O@ 0м@ѥ^u>@@ y 0@  P~} ?@@ ( `P `@( ࣀ0@Jp@2c8&Μ:wJJ&@P TRj*֬Z P P,ڴh-P4X`A;.l0n؀'Sl̚ <@ (=W&pذ,Hpv@$XsPN=0(o h_ ( ~ `  C TxcF #I0el9fL @@@O5ZtK6u*Vz@[8lX pضuր ( @@( @@.P@@(P@@( (P@ 86]ڀX@vlٳ pxo7^@@ p>@ 0@w7_>طw{ L@@(1ĉ+N4ƍ;zh@(8| 3̙4k43g=?  4x`@ H@ $ 0@e\0@f(`  0PA 0@)$@P@\,P  0 @ ,H`,HЀA$P0 (X@(` (Ѐ@֭Y8@l[n޽ \xG~͝7?@ 4 P vݷ A @o@ ~l A (P@(  A,HР@@A$`Ah   (P@ P0@ ,X(84 `-۵+7ͫw/_ &pƌ(`@0@Ξ ( 0@ -{6  `@ ` s 0 (P@,x ~ 3hp ?p` 3P@`  P @ 0A~$p@I%eK/a8fMйS'A PT@ӦF:U@UW kW\[lYdPР (P@ŋ@A 0@@ gСE&MԩQ k]tM ' q`sPzu l;'_ p@B  TxcFH4yXt%h֤@;yhНpQ4uSVzvz@c8mZp֭Ե{p 6l8/,pɓ)W|`@͛9w< ѣE/ ujիYv:;segno-1.6.6/docs/_static/artistic/the-beatles-animated.gif000066400000000000000000002605501476440322300235200ustar00rootroot00000000000000GIF89aVW^f!L]`[RfYnS[_(]LдCԙ,hr^zSvЇT '\ZƌҦ<=(-/5(67Lns9_P1^)((qy&qkV&؃3Փhe:ekC*yܴM571+&T.&Y)HHGwH׉)wyyV1ˋ6YX3bp0摈iJiy 3S+I)2;y5WBיȚMt:iF:t +xzes08B5Z.{MJ06 ,s\Mͥp$ aM:CMUFwF80wŦ.xyqiq/H)uHG4o(t)9xDzE͊x{Cp;EC1R1٤K8ێ'bзt/%Fql$m x{ͨ#Xv999oU6Pw+iD'S-H EWDjٻ<$TT5UVܩ}2VfrS'%.kmGThhRۈ7nT "B-UFCsl|*RԷwUhPDt)CqWipXk9\%_I;u4GgMcYRvwy06PGl3bd,:9B=c4͠%yE|\yʩ+K! ! NETSCAPE2.0,WH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴS-JJU+fmŝ;-޹ӢlhѶXΝp[;]+ۢ߿ È+^lE#KL&-Vhnaȅ#G\>rąiCSVbȅ#G\64e)\64e߾[4qAȓobУKNy ,kνw0Z_ VXo XZXXaK+8VhA,px`b-`XE/hG!E$鱅 )Ud%K-VA4h`у,~xdE1~AF?b"ȋ?X" b/p  iծev+Υ[]r[`_vba)x!F̋/Ĉyqㅘ4xAbhPƋM6QI /6iش -\ohqɕ/gn Y^uYlg 82ϟ9U3ʜ?k" 5jZv?Oj>ݺl߲[>NJ-\ƌ7r# -V,i$ʔ*Ip 7-fҬiL7.Xtb) 0]M&8޼Lx /b'(,)Rh.ܴk.޼uݸ`E.l0b-\h̊Ȓ'S ]Xy $<Ã<#-1#{3lƆ0xy ,8:ڷ_?x-V/o<ɷp⽋+ӯo.Xw SaF 4,Ȑ2̰ө :}a"ҌV0 .Jl0Z!Ɠ3[`qE;ysg ,hiRK6u S]XqkV[p+ND +2r%C4{dȅϛ95~d%L$M3faf >t!VTnEf-Vtt-\0 իYv.XvbE-x{E-\0 ! 2W#ޟF1b2|x6f̰D3bE.XwbE-@+ hႅB-V8|1ĉp"+:h"ȑ"X ,]XT@yȐ<{1O/x} %6f̰D JHb.XxubM\=l+ڶp"+ڽ7޽u[`E[`80Zx.ZC2 c!c>o| ӗ0̰ 6!B ,X ]X ԫ[Ŋ-\Ŋ˛?>.Xwb.Xؿ+@-Vb݊-Z1 3,ȐE7>P⋭l(‚%X vZ .Z Eub.Xpb4Ҥ]X ]X! ,`2Ơ#C4}:# la# #T ,Xib| ,λhb} ,ÏE[`E8`Ap+ pbE]X ]X1 'OFY1 3,ȐE8U`A@I]̰BQVa DZ .Z _~ubE.XubE[oƕ;m ,ho ,E[`E[`1y2(x؃f 4Əl H ``QI0,`A -\ -\Pr-VDoEu-Vd׾{w߳p+зp}{]X1 ]X YGyzQPbc 3f`#0`aAŊ-\XŊ-\I&M-VlႅO-VJѣHp+pիV]X `]XA ,eap(TӜ/^b6(Qc#0``AŊ-\Ŋ-\̹3g-Vnႅi-V^ͺװUp+rp߾]XA ]X ,Hni1hqe7>KFf̀t G`BIZ ,Xh` ,.dE[`QE5nnj-\ -\`eK-VlM-VlO#FX6FfxԞVhh֊H(q[ ,``gE#wVm[-Vm]yho ,haĉ/fl ]XQ 5o -\ -ʰ`m fdcƕ WL}ai #0q -\ -` _|y-Vo{-V̧_}p?@-Vl„ 6ia ,&hb ,X12xa$x2g̰1c I`8 Z(.ZhڢRJmb.Xpubذbǒ-kl ,ֺhrҭ.Xub.X0b=2d(C H(FO_l(1c%tX8i,Xẅ ]Xa{Eܺw^{E ,h8ʗ3o~ ]Xa:ڭp⻋+ƛJ:i-VnV؆neVvSVrgV8?ゅt-VXoႅܻ{E˛?>z-\x?h" ,b.Xtb.XB3+̞qB+ܶB\uޭ }X0M\FXbƊXE#W#0`DJIqŝn\ -\pŇ7iBr͝?tխ_ǎ}S 3fL20e%CLd`  &ؘa J3 E$I?`H¢RW(q"Ŋ-Ȩq#ǎ? )rr RȐG $JpUC8"4cJ b 0r`!ŊVbͪu+׮^ C+^!AfŠB<̰0ãР\@bRRVز 8Z ,X+b2ʖ/cάy3Ξ?{>sʅ+x\Is=hq% >鋦Hf`˗$#ά.}:֯cϮ} LM oN SSΣGojSZsԔObʔ2,#C $yT  } Ă;wKJ}cɵxc]Is1hq% 7sjKH5͘&J3t ~B@ D Pa >6l ]]̘aCӌ6tc7tXϟ@ E IU>V * \<[-+XKE[XزbK>V * 3< ZQjԜ!,-hE3"4Rԅ:"ɴ#Vla n3taAG:,("%6l`dC t(¢+ Nq" >A+6l`z %6fB#F+toq i,X!2OC1{W n\ o FAC xȐ Nh @Jl(hp %6fF~x$6l8ÆRfͰ1$6٘1cUpi&Μ:wġ#+c`+i1< - YL"Q( 0ʠ+F8ΊX,xIi IԨ9CX `]` %]X F(,a#T(,ٰakE3l0f̈– %]XQ dphPCġNy0+i1<:(rYqLipbWx2 W7Ə,ldž0! 6lt$G$aq R.1# `(s$@ M4Ͱ6 É7~p:0@cd eEx$2hqB2bEF Ȑ2x AF16!eC mxhC3`$cF0bCIJ3Jژ ,̰1c 3l(1c<1X4СDCǟhX0 5K,v gTdˌǘ1X0‚fAE.?,` ,#"Tf(+B*u*ժOq踑Ό%i!G!2,`aiOvˌ1ă%𐡘$xQCJlؘac)DIX8r0NN* _m,`b7 t$Ƌ8V O|9Α 34K{ $C2d@nj捰`aڸ_-ʄ Kaa >`a 2!)iN/x}1ÆB%I 0X1dYl(QIK,`Ƅ1 7m E*8V:hQGk;K콺HF.4dM4a@άP{4Xĕk$+q,X0d{0!ȎO_ ,$I Ub ,XP``qHY`Җ&,Xӄ&Al±xqǑ'WNNj^+Bf$<̰0ãРX(" ,3)VDa1> V+`i+$YQ" E+4!mE#0`$ YYǏ,‚ŖXز" 0YDY-+`ql8VJѣH⨲l$H․ZX|2ʰ;͙hBpY9V2M\!5vL'VX(^XqceXHS,X2ʰMEceXH ,ފЁc۸s6xnxC|ԛNo2q 0rF0rqӢ;0XA#0`p9`B#Ƌ1^ A`e Ê9`C+9$€" 0rF!s`#G,`H8V̤YM9g"Ɯ? 'V>|`ǒK|X ".R a [ì5`[E1hxQc5Ƌ>|,ć/jQñKn,cɍ%>|,ǒK|XrcI/jفckرeϦ]57,iD<4h,CCjР1(U5P=#,EqtШ115#:t%F8ĈG84hR8РQI 1bj AFGb@Uqʼn#T1bz*Ƌ5El±&Μ:wy,zРуE4zAF?hȋEV(ZXK(EA^ =XA4h`F +xQdE1~EA^ =X"Ȋ"/^YQŋ"+xQdE/(E^X7‡cǍYt#Y~dѡ#˹,:^F*A`a8xW:ˢCGsYt :nŎ ;^XSdNj7z܈bG*/^q#F=nx#Ȏ/YŚ k^dNj;xbM*:p0ziRKűESc4EF1^/ƋjƈBM9v\S#5/^E}1^/Ƌ1x"F/r :^T"F/tЈthx^6}u8Vvvlٳ[QKZ[ Lү&6d`iSGK:u0 D&hR/سQE 5xQㅎ5|xx^4Xcɍ%5^xQcI5^QEcĨㅎ/X2ʕ,[DcGH!TPT0GeUpLxt,yE 1^ACNj1txBUpȩs'Ϟ>ıCM PH#&L@H9`W.~$9@0Y !vȻF 4t1`YƎ`!FЈ"F/tb4:h؁c֮_Î-57" *Br a^`` Y`!}: ,8ą!P„U@PBPEb-yǍ/vY",E`A$&dS|,X$rVmȋ8AqǍ/v"ƍ7XeK/a\L&^X EQ0X$ES,F (+l!LڰD\’NX"Ȋ"/I# )`BGNjxQC!,>Ѕ-^ YQ# /tB8VSL5męs,``QIq&E QTːd ]ruqfXeɞqBZ9zԈSdNj7z܈bG*:pX`… FXq ",X` G, [!J.+iE!5&F]n ڵmnn,rhE4~A#Ƥ^X]tխ_Ǟ]DXE-D` 9ٞeG,Cj E,d!p@-V L0a ,BdK8EvqǍ/vNJ&OLr._Œ)s6W b'ϝ~.1" 9rhyA '5bxVbŊ+Zb.XM"1^}vb/߾~E#Nxq&-V@nAe,.u)P#E 4| AF5$-{vl-Vn&-Vo,x|:^+cϮ};[`!~<ϗbv8j(E)r%=|# ѢaS",0btbE0XbE.XLI$J%/"ƍ7t+:hQ@[`iSO:ubEz ‚ Ii )V< +5h`#FI+X`eEhp ,hq , CvȒVybh`у QVu-\=vm۷khlQ`Zr *\h㇓%/n#F(DXh ]X aX1 ŋx#ˏ,:tqc#JHE-\…Ǐ Cɢ$ -V|BE/,X#  L@"G-/tX2ć1bp‚ PFubM\hmb.X /bX:hĨcݻxn ,pӢÈvゅc-VH~BE6~v#&@$G-/tĸć1bp‚ svb-_A|E ,+g4bN1vXË.άXϾϸ`AEť["!/ 5DR#K4h8aё-X )Ul˗ex#ˏ,1bE,=nQI.ej Q]XQUYp«+>"`8H&^~dbG1bqc7r#H-\(Ŋ+Zl劘+Z`aE:PF m`a P#E /8A/h+ذ.ܴ(kY7.Xq#FrcЈ.1؁c.lp ,hq&.&SLI[`EP&հTXaD!@#E 1n8A/bb]0o9,rh/Ǡx;p(o<חo|-Voh-\0 OCQ B%)`q%XF;EL3iִÇ"k^dNj>~dbG*:ppjTS:mEV-VtmEXcźhm ,غh Vc" ``pYEg+iE:A#Fn`qsf͛9XhE/?h +h׶}wnݴ[`E[`qyr.Zp .ZH-QX8L)Q#'lZbe ?xQ%,0X $cI"k^XSdNj7z܈bMp2ȑ$K~lႅJ-Vlႅ̙4gh"g ,zh"*`Vb !@#0`hy# '5hЈ"l 5$`6- 0r`"G0r#G9r#Ƌ 렡jvX9ɔ+[.ZѤKvb.Xvb'T #0R@F (@BNj!NjxE 1^pv0r`rG+7j,Yǒ%>ڿx%/۷_  DP!.X ?Rp"E .T!%UTsRcG*/bq!,XF,CHaeHEhА( /8"N5/^)E=ĈȎM8VX`…pB+pBdʓ]X ]XI6,Xxl0`%tb,~dbG*:pȫw/߾~ma-V nƎhbr ,.hbs9U9XEi(P&BI1^/hbz`b97 QE5^`#Ƌ_Ġy;pH~=ߧo}-Vo -\P -*觍&L@(RHF!=jЈ 4txA#7o$EOxQƋ1t 6F4b:Uj/^Ĉb_;lٯ-\P -\;\-VmE_-Vn'",r 0ܢU^LT6-1|ƒ7t>Xaz5(4b(R%F ,,~q㇏/vYŎI;b+g׾{w[`1E[`}{.Z .Z'Ȣ E^Xa"$يgZb8acȋ,РуE4I$pGAVLzQC 'bh`F +xQdE4~ANJPJJ.Xhub0XKv,+Ҷp+HBd!xY70(L  ? qǐ1|8!F̒,2kiA:|8Ŏ"^`‰7~bG5/^)E ?nȓ+_^ ]XAEسkޤŊ-\Ŋ-X ,{D  B\zA NjР5ސCa ⅎ/41 =jA# )Ur1eΤY͘-\ +Z %Z +Z`EQ[aQ Y° &L\z# '5hb ,I9` ,``cH/ ݈Acȑ%?ށce̙5or ,DhiԩUnk-VnȖC,X` 1`@4pR!CDu0pjơb@(Nb R$Q^Eּx5/b RE 2l!D-\Ŋ7r옱 "]XaNG+8hZZQ֍,v" BYDY-+hE<7pĂ ZY8Zŋ"+xQdŤj NJrҭkn.Xuqf|.Zh|ȩceXPlr5 СOs4j`̱2,r4aJ&\훅4q PP׋;&xq[pn:ڷWoxnZ/ojƋ>^}Qƍ>nrFK|ܸCnr!7p| 7 e5jxQÇ1^TujիYv i׶}m-Vơ"2ļB7^ 1/LC̋/1iNj;&!Ebɰ#7^#Î4j Fȼ#H4j8ACL!KdX1ƍ;z$K<Ҥ+ZxAlE1~AF=hGAVy1^YQŋ"+ŏ/"?b"ȋ?X"Ȋ"/^YE,zРуE28V>8Ō "ɔ+[ Ŋ+L[Xaڊ±G+,,jcicxp XX̱±G+,,cicxp 8ފۻ?M\ؿ?B@S @x Ghh S hh 9N1B)+LN1B)+\N1B)+l޴9Ő Gj EETiM>UU^mŝ;-޹Ble˶@vZm[}Bu޽+Bp;wZnBbƍ?Ydʕ-_ƜYfΝ=ZhҥMFZj֭][lڵmƝ[n޽}\pōG\r͝?]tխK! ! NETSCAPE2.0,d`ck]mXd]`ϛПُaW4Yrka2mӳWy*f/b r5E|D 7͖=kUZ!.^' %'H;27Ry)(( r%pyg눆/&552+ $yzzلT'JIG,&6ӔXq.e9VGG4tܲjyH7SXO-lCjRM; fOtÙלGvW/;FDxI˥ Ghz4y aLkiks&8yM/-ˉ/!X.8 w\qX|fTĜxźg4L*3̩Nv6D4Bך `D90MF'Wu t,{y\G>B\i5XU zhմ &"D{)Kr *ouS1NS&ccl(k8F*T٣|wB3H :d;IW #jHõ y9".xwp|=/#UDbYPúּո+2/`ƤAœ)pP#F 0bG["E,TDe"E,TdպU+)`,+XPbE +X;\+R]BE_+R^BEa*vyGM4<DF 2b:$F0#FiTeE +XbE +Xнn+R_BEq+VPŊWP1zu,Vо ,V *Pϋ.*X$AMRCN Faı #FT0bMS8V,Vظ Cd",Tdb 0YHAsE 8sbE+XbE+XX j^ H"S#W1HƜCZa4",Te"-TLxp)`1+XbE+̹3!+R^Bi+R^BkER 4^œ)P#F 0Ң[PR+XbE+O+XϢ,hP` *Xa ڨQab  ?dRPU#Z 2FTTG QV蹂,j(j(ҤEkPŊ,TPee֬Zr ,V(dTjTh˂>煟'7jL9sHFQ7È+RP^BfPVp3hPX(b *V`5زaŊW*RD (+C!T8!gM"!dP,\Z YHa~ Uh=UWb *  bE +vpȢF 5D([ +Z] 辩0ɢF 5XpbE +XygN;sX C5z()`*)`+)`,)Ȯ`-)خ`.)`o^{bŊ*6|q-Vpb ɢ\C ͢𼢅 -Х0 jp] ,V ݻyw+0~yr˓Y BEj (t'ICXLFgQpolE|(,Tg"ECX 48dE :|1bS4׫W;I΋XǏ+Z>#R#xъDS84ҥLx 5ԩTJmzx%Bm^ A)ڶcDHSxTBK) >8Ō;~\ 2)e#œ 4BƓN5IZF ) E$UxXH -ƉI<ċ?m*F Uk'H?^,Em3jԵ"˂c/$]`BzxR#dJ`\# ΒbGTŸ8J\+3G9ܞM9s0b(>GF)OQ# AF$2 t=?A6,Lx$'H3 }yAAdR\a %ɁCɡ0b10D-pTT*#F-ab%Lh0 )0b&F06n*L NR8 I'G 'A8ICWEz=I$H') $œE4BcѓNȤYrR0QI0JCE*pT *xH|ᣂ0`yT`'XC1hQS*lȝF?A4h y $N)BE"*ظK9T`K$4h y $Nxa48D& 7d(!uH r2RI$ڣˆvYi"1b҂0ZGE401#F>;F )E4^+S*QT-;T(‚* BhE4^ 4hxA#ȋ'5RĕF wHXFneU򄊱H0b6؈Ĉ3btM /^B5*TQ[.t!eEqg~9 /^ hx'ȋ'5RA*0ЧH hS UH #c#DC$Fa Ƥ3 vyA$4^RRE&CTB)rր /tC'H@ H"|)т& %ĈFK0 #V,#8M(ɁC!%0b[!F %O "𸑢e24htQхƢ'),zqMiRPF jO袢 OR8 I 'A)g׾{S?|2\ѱcZeh̖1:t1jMWJ1ct(ܲ*CcƬ8f;)2jHA$IJJBI)R+XRIb(IbŒHRJV$@%"% $R$D!ӧPSʦ1TtM42!*4u*["[P:0iISZpiUKS2R(V\@6=|Ȣ'ˇ/Y1 /Lŗ3\|aeJ˙/=z|9G6gJqƍȓkBK /TxI 0*%WvPhE+Jq /)FE:uҨHSN*8mJQ0ŏaKTdBJ$3zdQY,*i&E\ʨPL gfHBʌYT,Ac%=z,QQB!*l J#*6y&/[tyƕ:xX4 9j [#Jpurp'MWB&` Gqə)3Pb<̴C-T@\`L01&3Jq#^踂 ":,qEH!:Q*r@YJ[)B`/+WJL ?@*PPE;ZP#.\pÇ >zpb?G(h2CW H!:\Q[-%JUѢ 0:C:B$#)82j1eɠ-TЭK^*ZbG\q1c >zp)?RP|xD0Ա*ZB-TЦm9EC@tIF-^\#L1R.C 3<ة(oE UH$F-aO3,a#R(Ǎ SPFm)FE:uPc -ZPѢ *[PB5)֨Pa# B#Hqǰ%*!% H;*Bٸ?;tB jb 6"b-*VTAtx"DH THǑ=fp1G;TlBE"-ZPye :ހiEF?|( SPPE *BYfT\TB 3P1*|R)G\$?Rys!`TN *mC-THǍUWP kRQ6l \Rx" N[dÅRf8BE }[P# *,BbHqc;t\RG:Thr-^P"6PE >[BŭH@R#)82 =Pu*hbl*΢MV>\ I~ȫ7CWC60*Thbq;Z@e-T`nB=P:HF?oέ{723|G.H|Soql iŠ(*ZocG;ZH !*ZXYE*r` !oѴEF ?h .* 0Ɍ 1fԨ1S\(r 6K(ƍ/SPN4*-1*lXBE -vPE OIaC )֨кUwy)#%ESG *ջ/_7)0D/=(c6RDN]+ @4z97T`& ӧQ6 *-T7i:9?t(r *JzuױcÒ)q1&= }q#E @ch1ؑ#s$ʑ(JDDa9vB-ThlBEN:B JL?Lp1cʙA*bʜ)͛8ssg%SfGHiSPuc7Vhʵ++PYh[PѢ@'&G&1  ʊÈ#B*Zdq1Åe>pGϠCM*ZP"ʬ(*T 1-JqƍG`)5eȓ+G΢FУCB*Z 3,a#ɏӫ_Ͼ{+PBY)lP#TxI U *!+ HeZPBEYHG+X Y HRHq#%=HQM9uܹ" -Tbc f9BTRq#:Rr}yBE*Th¬Y+Reۖ *Ε+K.,G\`$?R aĉ/^qTLnB*ZiCDHQ.|L)u ef"+tN; *WѢ̔\,cƟ$?RLOb ٵo})ċy*ԫߑ&P##t\b @[(h ))&`"F;G.Ha2Ŋ*Vl%L-V)58a#x\ŋ1)nb,S\,# 9xQ+)Ʈhl)֮` 03,aң'7RXBĊ3nŊeؔΫRTRY!@ؤ#3RL+ RSR O*vf",Tg",T0g&E)S2Ge,F+X(o<ѳX⽘7攥(-vJc  [ْ↍)qYe<P1Ć47X*HX *Xd&Gq1M&= }q#E,TUiRK*UT)) :ph)ͫ:tB)3.PBE^-TUbE +0\T<$)8s^BEhPV6}uPXpbE 2PHH4*8]i6:PHF ?1cF.*TPq]E UX|ǧ0b 0Ņ]ԯ'I WPP 5R<0B5XxbE2  HynRi"!@6yJF?pY¤G3*j0cÌ;YH4Р+X8,\ G)R`",)ʚ=6m,Te"\:@JH ^R8@%#ÖXңUH1Kf,V :4,TVQ&@$3zdQe ))($N)VPŊċ? *X" ciޝ|4FM^\"#L01cʙ*TaF~,jB@kP#I̘& .H'7RXBH+RLBJ-SL ,V)c *CE5\1 \[e͞5 ;B .G )VPŊW aXbCV ,V,c *@jEE"*cdΌ>\bI*|P<8 ōW\Ŏ/3\Lq]=fI#+XbE +Z@^}+R_B|+RܗcPT:LugKVB+cRܰq#.KpqDʃG-ZhBɒ&O,R),\8"刋l0G)VP!ŊFWPt)ӥ,V,V*Cw"q2† RܡK WR0S-E2*p!%E.-ThB†#.X\`’BYT,QG)VP!ŊWPz5,V,V-C/"qBl VCTWRܰq#.YpAGJ.H-T/~<-Lâȅ EXf I~ȟb X *&TŊWP1ŊelDȕ4*@hH+:tHF ?1EM3ٱ >[رC;ZرE;ZbДu.b₫3$l,Te"E,Tĕ;W.)`/)DHTT$A  :tđq1E=f[( G˜LH|˙)3\.GH< *X *gמŊWP1Ŋej5H1 *DX *TdŊ1WPQŊ9el"D<*TB*" :tBőQqQ>\ѣ -Ķر#*Z.fd .fb 3I#+X`bE +X\re+Rl^Bg+R1NxvPvtѡG2RAŌ.\=PBHS\lwg|̘c \g'ɏS`>)`?@d",T0d"DcV9Ŏ*6ի-wJqƍØda%L|rf-Th1ȝF;d)nj#X̘QF#>d2,\P$@lHb jYHv rҝbE+XbE2tKCE*hBNRږl)QG%*qF-ThBŚʸ8"KRR$EL|Qnj$)L%ĩ" *X*Ɠ/OŊWPŊer#[PQ܄#Wㆍ)qYć6g CƤ*8hJS||9e#Xr}yBE%3da,\P@lHb KYHtSV:dE +XbE bPEZk[p"NJsЙѣ ."E Uhb3f2&HgZP>fه Hq: *XXvi׶w,Tf"EQToqy*`"Et\1 %vto|x-T c*BE;pq· \&LH0 *X"ĉ+F\BF+Rx\"!*ZP-ZPbE?09ÅK̨ TOTb#Ӡ)1#C!+*TP"8@ P qB)VPŊtڽ *X" EGW\q 7nP"E˖+`L1f7oЩsEϞ)]1th GPƍOW! ! NETSCAPE2.0, ^dbYcZc`]d*EciLʞ_\/l"c`\&+PәPZy'00D !6mݐ;mX(8+I(mÀ1$7Y/~?)()&qjr-UHy f*m260:uY<T"ZK{5ق' %DhXJHG( e:vyxY7V[(aj jC/( dMZ9Օ-xG3:HD{y۳NSmtJJ)3Qyg,Oss&̦HiIE5Úk(Fqydqw*4B99i&M9qXCxW/9ʎ{+0C85/Ѵ+E*mhn3X 'wf/q-wuDRB\4z5b)$:)GsJ6VD;a<+vts縆zy bt;ZPWPA֙}ɬ7ۺa-4Lq^zū"N6Z5V { QEi܂ˁ:e:T[syI}+EOcS]!EfH ڷMQdP*.P ywo"|%&-:Xy{75dN,h=LW3O}}KJbjs)RhRyҸI7} 1vV9hSHXpÇ#8qŋShԸc C\Aɓ(SL 0cʜISf)r â%,*Q¢(L)f"â%,ɔj&2,ɔ׮+Kٳh6YpʝKW.)B25*Q2RqGc5jTH#K,;|gGHdIAz S^ͺj+VPA۸sf"o5¨0ҢFZ0";R" #-ZQō)vpDE7vHBF+XOX *$XA,V`(@Wʞ=C]iAcI4Z\ 4d\컱Ҟ콳J7\Hs A%Z(Q+VPT QN*UU,V*cɍaŎl iTTEӒ*~,i* K +X aĉ/N± +VPQŚ5o9*DX´7ZfڵcR,ލ%o *Xsѥ;_Bu+VPѝEŏ'_>|*ԳX½i⌑3-Z1rgiXUx(t@"$HBDJ+X("K*Wl2 2YXBN+R'P+X(bE2jQaE #*haD-0ҢE4)RR D -HpTJA zWPŊ.lX *X,Vl2̕WPŊeԠhHBi⌑3-Z1rE!A`Uy1 ŊOa? *X`2qa -6t MXpİhG 86ሁ#O0 ,VpbEL3ib ;YXBEP+R]фERK6Y *X 63Xi -Ȗ5Kō6$8b$r`"E,Tf"EMX4vq)(`3+XbE +`0}i+R^BEl+R^#T{B\E !Fδhqƈ.~Q JbL =V0 ,Vp χ"E,Tgp * X" *:|ŊWPŊUp"R" #-ZQō)uxS* Hв I<PLWPŊTWP5֬,V,V`"-)ڮ`"ܹrYHw |YHxE Sc-9Ӣ#BZF7C;8ps͔ 0TY" *jX" *zŊWPŊ,T8g",TX:)`"<)ʯ`"ahh?|.nЄ q #Lp :+R<\BD+R\\BF9XB *LX ,V 5md",Td"=T=&M>uF,H8xX'*Hv mYHw u޵bE +Xb * XB *?ŊWPŊWPb MvpB3-Z1rE!A`-H1 cG=WΊWPŊWP]v,V ,V`B=)ܯ`B|YH Y\b *b ATiˆ #-ZQ`I w* 1(E)9B *H!s 6YHs >bE+XHb *Xb *b͊Ŋ^WP!ŊfWPVm)\8cLBibHXK,bG1b0",T`f",T-:4)N`b5+XbE+Xȭ{n+R_Bq+R _B*´.=[Q $8bc)8BE)ޯ`b>)`b?X *X ,V 1^d"E,Td"E=TT"L /[E 7nh‚G >qB'\PhE +XbE +XкV+R]BEY+VPŊoWP1n],Vл ,V ÇUDB!.\Å;jTyhИ1HUB$ N`8`)``6)p`wo߽YH1| YXBEs+RD_BEu׭X *X *ЧW1#P *#40M+ňQ)ŹITCJAq YHq  C bE+XXb *bX *rܩƊ@WPAŊHWP);. ?\F7Qc̠UvP,C=HAw xYHw   cE+XXb *"X&,2kެɊWPAŊWPa\pE 4\h MXA9y *TX *X&,‹/ɊWPŊ,Tg"+?)VPQŊ WPС;BZE 4\F,H ;` C *zHQs 9YH3 AMQ4 *X ,VZUTWPѕŊaWPQ֬@-\Ê@~h1$MXi-N9Qذ =V` ,V\e̔WPљŊ,Tf"iԩU> ,V ܹUrAcG 4hI *,NEMHؕ 0P"ъWPQŊկg> *X ,?,VhUܡ.hHFgn,"Gxclj*`ThE+X"KB-4 JYXBTkVPj*VkXbE+X( |\BDȕ>ZXrO"Ch",1bLâG0",TPff̚7sƼ,V` Wn횵*XHa{ YYR.63%x.63a 9>:\'Z*X *ƫ`a<ѫhŊ,TЯo>YH *ȒP*җP*(ʗcn*8v˒d*HX *Xtf̗,V`gN;ybE +X0bE +XpbE +XbE +XbE +X0bE +Xpn\sX {/)P1,)or(})( s|)8t|)Hgau)Xvlٳiמ cŊ&,xxMV0͌*XQ R.63%{.63'<>:\apLՊ5,T"EMXԷ~Hp 8_H-ҤB;h";RAH sޔJ1-*$Ő Uh#%ݼ{ jG>Z ARNB"0$bB/<Z 5*θab-\pB91bɔ 0LB2&F ccD^N&" `1ƌAhU5"45h >K *$FG@?՟4>h !?ᢅ#g\䇋CQ%R1b4&F ~ $$8b#R1bణe05I7&F ;Zx L*2dH @RAH4Qb C)vP'Ŏ0*ުAdG 4hIg)vpDE7vqE4)RRA G*>ǠbĨb$ZTADS1HR)@E$SC 5rǎ.\E!fP$03@F{D(ʏ䇋C ?\b&,T%R1;@EGp 5TC;8pȑ &O*-4?8䙄c#D~ȐQ -ZE 4* 3Ԅ F 5FXe VZpqW.hhE-\pтp}U qc8pR1Y);1p9q #Ӧȃ#Ƣc@#-nԐ! .Zwт VZ$oF wP1͚sՠAE.hႆ-\pѢ .Zo$Hpп?$%9QAP59H1"A"yTh ,1b@#-nԐ!Ç ?\dH ?pbH*f` P&PHȒi>pbH_-\Å;~p-ɶ"-vpSiL r2px$g9Z1fИ1EEC=Th$$ʁ"5dh&Ŏ.Ǝ;hB R,P3J4- X.E;hˆ;RAH 4hIㆋ *,N$8$pb'8$ȳiSZR , RR"@ (*TKQ I* YHE2d㇋C i.Z 1bΌ&P AJYR,ǎ.Z 2;~pc.~Ő `cCO`TS0LI8  pT8` M @T0B 5hpµ -Z.8QBM#*TAk\Khp!VZE 7\hႆ]ܨf1$vO @A#1p(G .\Pᄋ%r9%ƒ7jȐQF-\pѢ .Zl"*F lXdsŅBqE .Z0uE 4\hō*o6m#$8bd)j¸fgHpGI N(lZܨ!CF "Apc.~Ő + k+Wi" 3 4E!p+.~Q"-pE$Q &*L9Qi&;y&!AES0TB UD2bH 2jQō)Р$Ŏ.qGfڑb.+UhqFEB"P1#AZ0";RAH4~ Sg<*Q*8* B)Z Ѣ"ϦMTV 0Tԭk({F"L 2j 2@~pc-ZQ3CEZMTG hH;*XϘB #`?\XF7LBd05bA :&i"8MaP 7GE|3!RC4\ -Z!Ԩ"b;4\\a"#+.\X "ȑ3"VZB㆏8p"'F TI8p8C La8U5* TZō2dԠAE.hXi…Z!Tx;C\jШk\5h"  x"-ZXqG1y:Ņ;{E7r8qEj0x ;lwnШ!C;~p-Z tG(=MTh N"{,>|hB U DDSzP#@V@':LB 0TTJ gp# *T4yD&R(MT@P v!CF4)Р$.bJ (*T@I1ERw|Hu)UET SR,CH sV*JH\uNI1E^*BTb ƍUJE ()P%Ed+?vI=P*lF%,lzBp=PG*TjSL;~XP`@(ݽGOͫզ |Q*WcJ*z"JE@|! "BZpq3qF3>df5lTHr%˖ZpqE {wTp2c'jfbjfp2c)S38bժTUu ZA 5hh BiB+v !ȕ!Dņa6"2d"B"Y+ bE.ZȐ!B2E BI%d-ZbŊ!C"2dTD BDȐ!DR2H*"-ZA 5ҢŐ ChHW|h0P.\BɊZ ?pѢ+- jO _CZdH r.Z\ t@hq%Е={j`\ ?p0J.\PFɅ@|!FFZ0HFTiˆ .nH ) "@RAH7\QaE #*haD-Ǝ@hb ATqqcG7\QaE #*#4B@h @RAH4-dȨA$.#wD\ ȍ5ԸqODTO@oܨƍDqH".\ sE !ApQ#M4jq\Dnύ4pqH"7nHSijРQ#M 4jAF45Ç2jp‡%`}XB*~,YRlXe󠊟*KTSe_U,yJ%KZh…>\ϕ!WYRcIWc >>j,犐>xr>WJ<}\iA 5dȨAFq!7y>tH ͣGnzG>y#p Ybh u,)+tK ]tɒ..K'x0r%,]RvɒKF 2I3MzЈ9sF =gΖcfQϖ[֮]a&7[+gѳY?f1lܸes,icG>bFlDK"0Ж#(€JFR*#*Ne%L"(Tr7'\rK$enb&6l%M*H䨇Ȓ'GN #]09r !&Gl0y%jFԐ! tS&9vANqpP =֬h pt$Q&F:$a$%!j4~a eo# <   ElxqȑmxU5dȨg':rɡCG$:X*G *TPqS ;w ##[eБI%a#GVܠ Gl ^D)QqmZiap+J 6^8R zy+F 2jiGG*Qg$́sf͛1PyQԡJ$qIJgҩ &xF/BE)|T4wy)=ThR+ %x{a&6^2 FԐ!GߒА"J$sTap0`8 :bT2QRDɑ 8IrDIas)!F/̤$K֭STb<{ PR@Q"^^/lQ 3)\ГHE2d T4Pɡ9TUtڝ C SA% :#(S_00|r$ZdRLQ!Q" *.^ԓ‘U)>bH=)HZQRDɑ~PJ)̼!F *" PRLQ!U *BPTxRyqd 1/xKA >,#I9…aH=ʕB8tJ$q,sSNxxD bȭ[E)dT 3UBF >SȨPJ//h ']^Ç2jH{ER!|*c͊kP1`9БL:(Jf x! E=Q1dI'Q!EK6 5dȨg'?)KEQEaPCES0XD CEU0Tdͪd8:ɡCGEI,A/dx B*ջo߾x1"Ex)F 2ji'Ips1RbJ* QP&PP aHJ*9ęQ?@:L/RBE)=Td׾{dQŚB/l0yHAԐ!G)+BzT(TCÇU@IaH ()بZQRDɑ PJW)̼!FMSRLQϟ@IO[)̼(EofSC LeVTE .ԸX˶۵=P:0T譖$(Tr$g*vt B/lQAYE)|Th̹g|ᅖ 0/l0yYAԐ!ǒ T=Mv0`(у .=+_ރs|z`0`PMQ:erБ$I+>n@Ydo^C *T8J1L()ԩ%a>衧f^B իg"{`}0bI@y^ J-dh!Ĉ'>\B *T% G*Qȱ-ʳy>ԦK!3^C :wd"РB`(ң0 &Ohi2R+ذbŦ(bC*TBr:rա#GVn|hM/x8Ċ`"+&ONa9 *6sެɋС) 4jXфزgӮ=ɊPIB *KCGsiǍxa ^` +R_ф&+R_B0ya"Ex) 2VPqaB *"ED)MBETr$'Tsh^| ezPAf ;wX *X *2%3 & yaɓ/GB,T5{mZhYHV )P.ŨI਀$G,ɦG#OTlUx*T@I1EE,V𼂅 ,V0 ժpɭfl٢≷T!c É7~q+R4ˆ(j0`-8s$A% 17K`'L^* M^Qq>)P@+R\BBd QŚB/lH3xFRՐ*X<2J*Z`"L)TrڵPVutH(98;䆋bmx(r#/5+)h"l)ʮ`"ڴx""ExF +Xb͊ >(/6ĨRĆxI"L +XbE ҥMFMz YH[mȱ- :#(US_09rɖ/8BF,^|,,T?V!&/le3`xH +XT!ŊSHp!S`b").JƊ@XɡCGqI1S%7nBãH#/^(r%*TP!T5+"Mt NUb"6xՆhQC *βXb&, ɊvWPŊ~ShkС#c:if (RƋ6la 0TFb5֮UVNj _lxaoE@2VPŊWP!}:0VȾ,V/١E@TPQG@bn| ͋/O2aB6xQaCL/-]^Ç+XPbE +X9L+R\BEO+RB (*TK1L())%47KH,[pŒ ^TUm[*ㅠfl٢B̋6RPj!c YHx !GbE +XbE RCYQԩC% uD! мE`̀ya'T$Wys=(x 06l0yEN@| ,VP g"E,Tg"EQdulБL:rpf aG6^8RĆ*RT C J`TB& J}9bOG 5d`))`իVYHu `YHA6o*TpVL:rɡn[ܸ ő"EPCc1K&^t /08}G 5d`6)r`߾YHA| YH\ 8*TA! :uDCG8U.`zaC&G0y҅(085D ^ Z0) 0ܲ-A`^`  !c )YHr 1eΔbE +XbE RLScQ))%EIਸ k}Q <)R 1/P!N*Tp+/peO֋RQdXG2Hʇ,Tlf",T&]4)T`5)d`Nh`+(Tr$١*vtB/l0y&O`"JP8Ѩ73xP  ]d`!)&`"ƌYHq "YHar *`PC:ra337Kn@B_)rŋ#Ex! %H̗/^"EĨP苍j׾Q6nШ!c zYHw bE+XhbE+z\%HC9ZqE14d`B+)~V,Te"ZU*f0B\ugbGKbTlU)* V'* #^Ⱥb ΝULIEW)P*E/LC *lȒBn޽}Bp+RW#>*?=+?NL,&LliCx*DBE6T(f [R_ QhT>*Tt I;|,֬Ȩq#ǎװP!Ŋ&W$RbN^Έ)33-ZXEtqB 'Nf Eb*pb*:U^8Q!։*i2VP!Wv{W_,V,"B n1D?-2.hhaǒ>C!"!D "Ċ!WrE+B BDȕ!CZ rE!W!"!Vq2VP};޿wg"y-ZqcO !-i!ş?-δhAF%4qAŞ5vԠAF7bύ;jbH=7jqcO !-ܨ 5vԸŐ\E,T:hQDYHTF4)vpD-0ҢA\ؑb ATqqcG 4hIㆋ *#Ŏ.Ǝ;n";RAH7\QaE #*Ԑ ӧQV:5)`g!) cT1CE3TCF ;"Pɘ2BH*G2&# cTdLF "Pɘ2BH*PHW4aAl"Ç3aAQ(aL 3aAL(SDK2RDM2RDO2R*4H(å+JJU)jݺׯ`SlhӪ]moWȕnx˷! ! NETSCAPE2.0,)[cf%*jؙ%c\_ݣ!`'jTgVP`Yq24"k]pG5kk \֐]`SRa=_Q%lryd`/Bx,ܝyĬ;Һk$!E7=)()r&qmҧ.jy)-''jʙ56. %IHGx.ԵW'T|eكjD懸- xyyXy d:X(Zyٲp%g;ɐz4Y3FE2PsIlXy\ ;"YVwGG9OIIi.-d|Kt58J/6 ;C6V-PDI)4f7SrF*B:/H;xVV<ԗzxFj;DB*f۵%%-40H MTGkuz'؂o0B\EE-X+cMʋkjmij$tt/WِK/WP'DӕBC8#P$.$ST̀*s8T.PIȐ!F?Cx` 1Ϡ!>1` Π!!3hpHcF 1fTxc 1fАƌ#g4cL9p&UqxQgN8oq2̈qt Kï4 SVq5 2Ҙ1 4f0;C kٮU2#F4dԥ1#F4d3'G(@r6lX# 4fİ> -Yph  ʑcPt0YF6Tըqȑ5P 6d # 2Ҙ# 2*ZhƌgАƌ4d1#4d| %1jΠ!#'1z! 28irH#ß8bPQJ%5nao2dؐVƚ1Π!#.1Π!#޽zïx i̘ACb3b8ACɔ'Ә# 2:Ә# (4J)!cͱ-@r(J3(GAidɏ5~,T#M!C2d # 2Ә# 2{ƌgАƌ4d1#4dؿ>1HC@3bACB|*1G:xܨQ5j4y#CH6dИC 2\ҘC 2lyƌ=gАƌ4d1#4d<*1Π!C+1Π!CXrEVۣ8 4f̠!<1Ϡ!}{ï1 ï e(#M92qt( z ŠCǒ9#2lȐq-F!bACK3bȜAC͛8oҘ 2Ҙ14fX:ÆPB1#4dh1#4d+;s΃Gq,iS%m| 'h2lȐF!3b(ACc3bHaC˘/ۘ 2BӘ14fX=C װcV2#4d1#4d.<@'#M:xԘN+dȰ!C6d4#4d1#JhȟO1Ϡ!? 3fАQƌ c`c̠!"14Π!GY$G8Qƍ1oԠF 2dذ!çO$3b ACQ3b,1SQcL1 4f̠!+1Ď%[֬4d1#4d̥;7K-ΪG:r#Wnܨ%C mؐQY14Ϡ!31D&]ڴ4d1c ïQmܹkϠ!71Ϡ!qY*A'J:1=QK8Ō;&'ǃ*dP dP AJ*1ԸFlbhw1z <ċ?[%KtT 96:aPmѡǛ!2drD (Cx?CAP! f<|f\8F< VEN|*@2(TqL5k֨FN20c!Ì?3ҵCRKu=UTQcgU,尴j4) Q#$$ФzhܥhV,2EɑXq8QǍ5t\Y=6d|lc7 A7~`&I08@5|@?hc Eb(Q,1eaBF@*fDBg[,J lCQE9Bg#MQ65jYRΈBZȐaCD6B"C\7j8bȍGф77nhSc#Wjܸbȍ;j#J:1DB'!G@~*#SCêEYY*щA'J:1Tv,ơ(@Șѡ%ȍKbҡJ]G9E 2l@!(;z tRx"C ndqcI%5n)20ٱ[rh  [l#/(2d(qrpN/^:[rh 8[l;9lꑎ&R`:tCFT 1ц (1\7n0r F\ir协5PiS)WnԸ"; 'G $ Os1UFaddA+F D#G@rN@'#UqxQ֨ !2E 2Q 7jqC #7>nܨ1t|d$QgFsyD#9r'G Q'#UqxQ:? oc(Ȑ 5jܨF 1zqE52qF|6@G#GnFӡ}d@sD!2l&>ʡjS da@Imq㈛+7n\rɎLιQ:DevȠ 4-oA(@r 1OJQ1O,25tԨÇ:Q2Cѣg 2s劏5n3@2Q 7xܨ?vqnA@ɡ(ZJ9FXYd!4$Μ '8QT!Z7|4ѡI:!㫍!@:tԸq)2dؐ犎zu{ :nc&b)dˡ-)9HAiw 4Y9&4j8 ~ˑcP9c'GEr݊q,QC7otxF?!C52l@aC7qHoȐaF>x͍W\Q)G @qL1E2G 8EƵd,% iH#cNE|dɑ#99^H1F5p#dC 2l0HdsC 6l@!͍KbPqÈ 77naɎ?el؁d@ vd-s v Ѣ3(GER4h9:aBG&oܼi 75nN5NȰn+Wq7lȐa ՍG\Q㊑#?v0΂|GB|%HpGh 9Jm 9Zy#(TQ#<}Ѥ2l8*Æ$6ƍ7t0 6lȐ͑&:jq㊏M !#n6lbG}5t5CGAP1Ǒ#>jdcǎG ãI&d4Մ & R7@jCFϞ:ŃG3HLxhR 2Mj5!CI-7n1r & 2G05%HU( ^dxb$dhN 2dؐaUt!bX /VxŊ/2HA&;va"c!fL1DcƏd 5D $rbP ,d23l)O"Ḛe*xI&I3Vx!Æ $Z$h܆m)eoOyL˓ 8T G)G~K0BF")b`H!CF$2ԙC ÅESO0`IeFJC=zG/8pG'dȰ!hP60jCFR)VcJhhǎ5F 1K !BƔR@%aC {m׆ 6RL")⧈!Dp1T3=pL8zDMYnmCFlٱm$#SLw@xc+}!2"B̰U16ln 6d7oÆ 2d;5&d])b"DtPT}D=LGd@%m1QD2d(q"J e˓ 8Д )G~Ĉ E܊хH62F$6dXaC֭[mȐaCL1.#u*F"E`SH a!c Udx ңLI_QJ w1x ن eh!H '1ȐQ*;SȨ2GpP';\D1])b "ɐĆ m8!#t6lXB D N! # 3BePTI=ДcXd& ,ĉ(28%C p T%PhʠÀ#?vQc'!BHR$aC 2dذ!C EڐaC 2lؐ!UJb5G=( mݾֆ umȐ88p3xcG6;pR!`* 2d-Æ H@] mȀmÆ PL ![!EP8G*6d<]t6d\aCH=кQǎ58A6fpJ 6daÆ 6dP 91X#C 28QbÆ fe !fUxw)@Us&'JdؤeFelrD %Nذ! 8ДA#ȓ*OpذǍ;jH62!r*vڰ!c^'1`%c52dؐ!CP A2˰Am֩a#¨btpL28pT!Æ ]kD '1ȭ[dpÉ bLeR28TQ%~1rرF ؄1GV" !2lȐF $rbF$6Pd 6d5+[1DPTݹ8!dIHl!$2`Ɣ(S"26i$C'0 O<Ւ7ve!`)"2ذ!C gmP uȐa 60B @5 PGcgɐeZ>j䉚=8p|5xƌtgؐƌ|gА&'T O<À#Lv̠!# ;{ ڳ2ḧzeؐ;1?~B r5n 8Dï}ԕ̈} ܻsu&qf?v̠!#>:3ۿ?:4dHcF 3@hÆ h )⧈!apT 0_z8"@R%1\Ƙ3f 1fАSg$gѣE{lqǎ4d1Ϡ!e1#4d(1#C%CȈeL0cn sÇXr'4e0xI 2rɳHJ9$L8T~14f:`Â1#4d1#HdȕH!Bp  "&ԸcܳS52dؐAF˘/۰$Il$IbCiyL)V葪F;fАƌgАA4fX>4fĘ> 6dť!aB05n 8~2lؐ!gq;g޹s UlȠʔ3Z5j1 4f`9 1eƤ1#4d1#HdȰ!S„e !f|#R[`G@ULRE$6dPJ==L C b56d(_*G͓ 88Pqc 24Ә 2D&=ƌgАњƌg Q;=\1p%F"EȠ"| Udxb% 6dlQU(CE/b $ 2`Ǥep" 8Uc 2Ҙ 2&RHƌgАƌ"g a2, ]!2"E13Ə%4T <2北$2dؐ!#ؓ'U ;=|M„/6dTA.:#P'8zZƎ4d1#4d.l01Ϡ!11&@"CKĊ!"DBFƍhz)8pX F 6d$ɃJ8qDq 8z|G 8zHuƏ3h(OcF3hh{3bПAC~3b lRDH" !7x{ǔ)8z2+V!Æ$yz G+ApԴJH2GPCƏ3hpJcF 3hȰzU3btACFX3b11EcH3l!2Q7|G*OأI O<ٓD I( G@ULi SzxIb#Ϟ*g4Wʼ#?v̠!81Ϡ!yrï| ïq %1N)FF?~`SHF  Ud2E /VpH2 "5VȨb%ep#CF=jdT LN_tQG*2014fĸ9Æ<{1#4d1#Ch\P>L"cn2tÇ <@{zXrgO dؕ8(H xQD Nzx ܌c ïz[ndF3hȸMcF3Ȑ"~SO!Bp be ܻdž6"G)V2dذ!CF$Vp =X?v̠!C"1,ƘQF1<ƘACH3bD S "~#X*C5nV T<^>%!C$6"=cJAp%C ecJ;_zKnc }ïX`…Ϡ!C11 4}4ܣU>1曡?̞=yx$(2l@IT&9׻W^@9 Ɇ ͛' N^ӫ=^-qc 2ӘCzݫAC|3bc#\ A2Ɣ>2FF:5X B$ehEǎ2ĸ&CNdȸÉ bh!s -1.".F;w:KjACSrb@*u*UrhJcFd,VHYL!l$y bțwO2H'2 $C'd`ʖe|PHF9C3,qc 2^Ө3c6ڶoϮCCo3bƆ (C#`PO Ae5j\A4dv2l ex2l bC!Cl2Ć C#e 6B.3Ͼ8sfJ5~ACFE40fԸFeИ>PDG :nCG5tЩӇ>rGѢGPz>11G|dm㈏#b,M(DG5ACF]wՋƌw 25 CFdS @~ SJ 27@brHLnqL 1Aƕdx0Wj7Q:Ȑi"FG3hо{w߻Әmb,È )P+}ꠡF:(K %uIA3("c.XlfgСEfQ-\`M رeϦ ۍ ]X{ͻ]q2!Cq(4^-vҽ{ /5ԨO%+Էp½ 7-ϧ_߾|7.XwѢ@,X „ \D-VPĢlPA7n *5ƍAݸ1(+v0uӎQ֞O5d(.֬h)ԨM׸`aE.Xpubذbǒ.ZhM)xbXxXRc#V=+ZqmŞ^GjXṅ ]Xa4Mpⵋ-\Ŋܺw ]Xa˛Am(ňA 1#F<jbJZѪQԞO5zѣGKpᒱ~ ,h  4  ]hED-VT\cFWt\ .Z0͗1XƸfL7"\;j鳇5zeK[`ESWzk[Wp-\0 -p$-VmE^-Vfɍ1br#FbŊo$e A5vqF5jңF8ju ,Xhv$.h׶];I[`E.XwbE/X4w+p+ `K7qr%<|bgP>rUV+S5jh0MiDe,.Zx.Z;r|b.XtѢ ,]X 4kڬŊ-\ŊZoɒ-+|цk19hbOzX%E5xŊ-\Ŋ-\ 80`-Vnႅb-Z`E[`9.Z.Z8Ų2 rɍAqql]O{>ըIO5, Z.Z˓wb.XwѢ ]X B+ pB+B8J7܈QtACP;jQG;jDł),X =]X E5 -\E ,hBk ,~Ee[`Em[HbJAKnF7 ]5zؑz^xHH=IScǧ=1` /Xb.XdE[`p!Å.Z.Zpb+>pb$ɒ$]X .]X! ,`Qf%7ڰ# /Xc lX@[q,X8jbl ,κhbm , Ev[`E.Xvb.X N8+pb+.pbfr܈a 1(P#U `'M@Ăʙ$,XxS[`E[`!}:.Z.Zpb+ηpb=]X! ]X `1lЍ%ѕj8pQ-Zj` /@`ѩ -\P -\9L-VlEO-Z`1EG[`iS.Z .Z +VXRR gc%N.3fQcG51c-Xxi]giu ,bhv,rޭE[`AE.X(wbI\HN}z+p+cimb}%_2;vԨFX b ,Xtja ,$hb$.4n1I![`QE.Xtb-dΤYs-\ X|;( +,ŸF|ӧQƎ=xdٳ,XPim ,hy.X vѢ ]Xcȑp²+4cy +,DtÉ'nP&?AO5A)S^ gQ -\` ѥO ]hw-V'_-\` XޔbŠ,Z"g-KlY`,~ ^`1S^Ŋ-\(Ŋ*Wl 2]hNkV'Pk\(ŊX,Tnpɍ%qXY(&j0BĨF`hv ,:Xa z]Y/qⰋ-\hMȒ'Sٍ ]XK%1pJ7, MCG.}iǎg,\8rԩ$/XPiy ,p:ڷ_wx-Z`a׳o|.ZB+,\i d KdTx4@FD yM n\ -\0EJ+Y\& -Z`qgN;ytbEXufERpX4]V`EXTU`EXtufE5.XubE.Xun\p]hE^{E[`qE[`E[`qE[`E[`qE[`vlٳivѢ y-VoErkV4EeVT/EvPVt/ExkV_Ez-VoE|׷OEI\Ѕ 4Ŋ-$Y…Bj%d%dX:&#d%2 ` .ܴ  4]XE<{ 4$-V84ҥLxKAƱJ7,Ÿ,N1ɕ;viD,\ ӋSXPi" >8q;~ 9Xb|OK P#5iA;b 1$,X`Sċ?<̛;'^+XBΒmXE [CIk+쨱 $,ά8 ,B@ DPB$RŀS 9>7n8Ɛba5 ғI.IXx=}TPjaAT)Z->Vjai5+X Y$@>K܈VmKe AZ4icG iаb)@ ƍ7.Т2,_|yT "y&QDo$(\K I nIH&ƒ%7bF cX%Nj8p%kDBS %4:!b|\.]…%\ "@=>]…ҧO8B+-YU%KJ% `唤BsV,%>N8K1n8P&F;LehXe[`D=4ԣ&=izxYĂFhIO5ҸzI VXdˊ-KlY!gI)+,>(bRVdk+زdeXZBΒmXE Vc!+jŞ;(b;SXY h+E^",bO/zKɐe'7n8 '[ǂ+,BJr,PҒ-Nnpa + 8RJ1n8P&?(;L1l`BŔz4=zhңGMz4#M5pԣG]3F=Qjh" k)HLAV/=.Uƥ=v Jp @ZCS4=z 4`UFmn|B7 bՊi,XZ*F`BΗmXEΊ-KlYeɒ-+Xŏ5@cǞ{vbQEVb t-cK=+Zըn6-ϸVF{jx"/zXj$C[܈A 7lqrF >XH% Vf5qrS|bp"ɍN8Qɖv$012Fuajϧ5剢3^Ly4/X S5j\ bԨq)ܧ=4IGȐQމ]1߸#ƍ%7b1@YX 7-&{dI!d#ƍ/7bĸF7|{p%W쨱#2g/L‚ŋHl-Ҳh=zDA֎5a5j  DaƗ1bXR(F JxXЭkz]HF)VL'F1Ǹ%H\2ƕ4jEˎСk؁/Ly 4aF /=x`C=j'K;D (XqÉ'7 9 i,Ƴ4- ILb}NX6bpE%_rQe"F;v,Bhǎ{쀕K,^` HS/5!a1Ŕ4z|juF4yը#(2d@"@/rVlYd 9KnHcE\Xb kpk VhOxXE [#g,E;ƈgXx $,X,E<,b,ygŞ=ɐJ7 9 'r܈!Ev$a"ɪI,ȗ7 VĠԆOPqɖ7L0U,-ӲcEZ]F Gg`-ңGEZł),XAK5jɓG4F@!n(F7܈TN"kV\beX7bqF|D١%ZD, 8^z8v_LyI};jQG;DbNPВ1j߸#0{Mn\8nq|br#F_nĈQhɗ8} (x-ZDCK=SXx",^؟a/=zhɋ,X`B!)QcG 5D 8T'7bPjC)Fe`K5kRYB.V%aa61n8F!'r*o]&H$ʿ=HQEHXx" $/ܲxEV12Պ 8bB0,0hzԠ# 2hZ!'Ē-+|ц(ÂeX~ ڄXXnn|b˒%[VlYd [C+Dّ ԥK 5a2ILM5ɔI*4h1RGTjRHMLAbG 5pa2I L] #@]RK@juHM.] eƱYhȐA`#H,~ gXÇ+ !!jV#NJ3pa#H,~ ŏ A~0cF9|ȱ" FX1#NJ|3pa#H,cE>rG9|ȱ"9V#NJT4dȀ2H8ǘcpc @rQHTCX(V<$P Jd1?14G#UhȌ@rkofdF,o7|3D @fȌ@r1H 3fA @fࠡ4㘯C 8hИc 4f̨ t>fР#:pC 8tQ6ج:82CM/69@ L4 (taӔ6QFQu 2d3Ҡ1, 8AC%4h ydC 3|̠AG:tCuИQQ`!JT60lAl0l؀!ʆ 6l*RN6E&Bo"D`ذ 逄c2sˇ a̘$8Cc5P 7ȁC&%@r p1H t`$. RH8)#BH!SNh찔/! ;rLG`BF1F@!F9|ȱ"9V䘁8fXќ,XPi V#NJ03pa#H,~ Ŝ&3rRؘ RX< XZQ ,XE'*eCO8qzNOXHadȠ%̱Jd@f ʠBzkV_!@[3d*F?8pT1bd(9 6ĘF;DQĂ <`q +y( N`rȓ"G ?@!:hИC3ꠁ#&аTܴ0 EF\ic p):ph2D 9 ŋabH.)O~Ef͛3*#0`r Bl$!H,2dA7 %>蠁 42 ,^x _T3hИ] HApAc+:fNG`Է'/X | `0`rD6`DK2Q 9̠QH:4Yؼy,X8SH 9QG3C  bc[$,X*ڵlV*S$\:`66<)b:b`(2b!nj+rа`/^8 ,^`QfE!>r1Fpȱ"LjVXeC )BlZac+α`qf/ܻwEgXb Vt!D )BlYQ0),~4(C??И$ 43 /^`B /X|%Asv5PfШb @rdJp``zɆ 1uH ,P-Ƃ ,^`5k(.IXH% VerL6l#F@! 4tИJ~`Bb/XxB-#3h|Ɓ31<00lۆ#D6ŋ,|Bp/Xg O؀a 6G nj,2dC 4pРcȜ/Xx Y~7.X|!/^1i3|0lD&Kxb%˖,_)3&"0n!Hf"CFa̠1GJb* /^Ț5.֬ /XHt1 (9!" )6lE2X &\ʸ`Ă10lyRȑ"F@" @Ҩ5]/^ B $TdWR6sS$/Xx?49 ѻF Q0wY _yӿ`808" "p"c2$آ [j!Ĉ pCŋ/Xpa:th҄H8!C D`9&Μ.ܴO7.X-JŦ"0lqD^͘EƊZr+J,^x*/Lq̇,a H"DĘFC/X.lŚ3^Ȓ%+r` E9bOAYd(m4WnQ,XY0+rhc&4Ȭu`ذ9]Xa:-\ ^+f"!6̭pGCƊӯoTXx $\C >քFS Er`dH-V4yd ,Xla0lyR ?9eEPC5jtE-p /Q"DYhB (>a hBCǕ&C\ "D9XP.Z@" IZ /6)bB!6`|!Ht" m]iW\uqB+2,<2 4\iY.3!"D0(r ҥIhB[ _9"G؀ $EF ,XBtխK_v-V|/XPCm*?(Q$ǭ&J8P'EQDJ2/\ bB-V@(1b ,. "6Hd:b`)-\Ŋ6oY >]X!T ~+x`łQ3F1cFaPbAvX<rd 2pX[[.Z+w.X}Af֊:6Ha!E:+&ŏF2Z`!E/cάr ,>hb Pr8{V?01 &4Q%80 sK *F#IʦC0f2zON}I'ʩbG<0dFRT`ʀMO0Sb:u.ݸ`Ep<Q8!h 1Ç*/x\h 8plar1Fpȱ" FX1#NJ3paanj0+rcE8$hÈ+^EW0BF;,2ϙâ9,B #c0wXF 9rX!#BF;, #c0wX(N 9rX!#a]I\O哴X={,\ʅ}P\蟄eX& 8 b$,+$b$,+4b$,+De @`ɬŊ1eΤYӦ9ulѳ!B-"hI`tSQ[LªYʵׯ+Ď%l BZm" ! ! NETSCAPE2.0,VW^f!L]`[RfYnS[_(]LдCԙ,hr^zSvЇT '\ZƌҦ<=(-/5(67Lns9_P1^)((qy&qkV&؃3Փhe:ekC*yܴM571+&T.&Y)HHGwH׉)wyyV1ˋ6YX3bp0摈iJiy 3S+I)2;y5WBיȚMt:iF:t +xzes08B5Z.{MJ06 ,s\Mͥp$ aM:CMUFwF80wŦ.xyqiq/H)uHG4o(t)9xDzE͊x{Cp;EC1R1٤K8ێ'bзt/%Fql$m x{ͨ#Xv999oU6Pw+iD'S-H EWDjٻ<$TT5UVܩ}2VfrS'%.kmGThhRۈ7nT "B-UFCsl|*RԷwUhPDt)CqWipXk9\%_I;u4GgMcYRvwy06PGl3bd,:9B=c4͠%yE|\yʩ+KWHXwxN-Vhآc;wZld(QXɲe0cʜIM\ɳϟ=XA!HqP MYAu!XqД`rAДhӢmą۷pʝI0X˷߿}aXAXa؊±G+,,2[¢3V8Vhi,px`b-`M۸mh N\+ ӃE4zAF?b"ȋ?XA1^YE,~xd8Voႅ,$XA.ZpC%N 8RB7^ 11hF '>ĈѠ4lzA4^lҰiI[`SQBuѢ YYW^Ye 82ϟ9U3ʜ?yk" 5jZv'5nZo٭[|Zc.XlfgСEfQ-\`M رeϦ ۍ ]X{ LW2y N7o2-~1^ĠA*>lB J&|!OԄ'+Էp½ 7-ϧ_߾|7.XwѢ@,8 „ <D-VP >y$Ϻj:nr afc la# 06(.άh)ԨMϸ`aE.Xpubذbǒ.Zh;Nhd@ hX! K[af` 6!B ,X ]X ;zŊ-\8E ,Zh"f ,jڼiE<[`EDXbK>V B 42daT+&bk#JD ",%+p"+p"]X ]hႅd-VXnႅ͜7h"t ,Jh"uS.aaB+} Hӌ.4c#0X"I[`E[`1~}.Z ]hႅA-V(lႅÇhb ,2hc ,B1‚12̰0ãРȰBC/VDDۊ(,X` =+i ,hj ,jݪE`[`AE.Xub0XȝKw.+p+(â#,X!cW2x\I'2A}3\ 0E+bp+r߾aXA ]hႅs-VHoąد7i{ ,»h| ,X1¢2xA$x6Θac,0q$ ,XQ ]XѱE!E٤ -\`E ,dh9u.X ub.X0Ҕ=2d(C H(FO_l(1c%tX8í[,XQ y]XwE ^QxE ,h .Z\e̔[`EMcQ4 \2x\ti༙S 6tcÆ.IXqXѼ ]XQu٫p»-\ կg ]XQk, A+ AfE)WsA`[t(AĂE,6€c+Fp⤋+Vl.XtѢ :]Y'РB}q⨋+NdϞ1X˃Ǖ4Wx TJ*/ `M>6E ra`QŊ-\̊. ]hdnZPl2fn\ŊS:!a7G3fL2d0E  'h :0$JD ,X$jy ,p:ڷ_wx-Z`a׳o|.ZߢeNL `#r h{P[$I`p,8hd ,HpqeJ+SpE.XԴygN8]XECs[q2KA[)SO=Xq[]Y c]Xq kٶu[-Z`qo^{ubE.XvbE.X4vbE.XTvbE.XtvbE.XvbE.Xvvlٰ]hEnݻyF[(cq\ˡ)c\ӡbqԃ|`řϸ`qE[`~|ˇѢEЅ lbe8,k_eX,k_DraGۓ*%IrąwZq"+jh"Ν<{٤ŊD=4iLWL@ϘQp0i2a!A4}I l|C0Xqd=}TP8ԝ< Ԕ)Lhq玩)-z2Ŕ)7eX#C $yNT  } bLKJ}cɵxc]Is1hq% 7sjKHfH %:r ?B  "(Ͱ6tacc.lf̰i la@:pxk $HҬ`ϫ 06lqc/z( xbP!fXQhЊW}\[q +>@s`+ $iVA$͊R a,(h#J@dQX9FP,X a֊H3fZa +͘i-JDI=Ny0+i1<:(rYLi \bWx2 W7Ə,ldž0ذ! 6lt$G$aq R.1# `(s$@ M4Ͱ6  dE12dBCy2u= N N!@y1?@,@!G!2d@F16!eCmhC3`I0bCIJ3fژ ,̰1c 3l(1c<14,X G @Hxu%b3eFcK,XaH12x$xJl̘aCg4#GI:63Fϰac %6f` jlf̰ac %6fB#F8tHd Cq%2Ƙ#ONMXh" ŏef fX0⽴=2Fq%Ǖ4pr 6tc.ll؀-: cq$I 5Æ Dll( 0X\]!7vA #,XDY 4+a1F‚Ehˆ=,ȐaE#,X% 3< ZQ* E+|mdXpB 0XH2YltaAg6D,X5jN+XMC%JA2C\X Ă<]t WhXbX,EF#C,1ÂE ̸J8|) 6]ذP.R5cgCz*$uCiD_,X`;",B%a1k?nCǍtf,I d < P@FX8ea K{ʸZf <dE <,8< 4'Ƌ Pb 3H!J‚ő#0XqP fx 40*`#3 a짋 1^̐2, tx$1#w{u\h\q%4,li‚ #ƝY 8iHWX`6^aCV@A"?,XI ,9Ă 0X("5c;,E-MX8 MلNj^+Bf$<̰0ãРX(" ,3B)VDa[7 V+`i+$HҬ(膢ⶢ0XH ,BxzVlab g,XlY|,ÂŖzXdql8pTY$pJq@R ysEceX̊gpq˖,+HqHX&ې;&D,"Mẕ2,Be),NKĂEceX ˢ̱2,X$rToEvcӛLpܹ9`c1Dܴ 0r` .\$qE0Ј"FCXم`sX#,`X n%q0r F0X!}z,` I5b/bg?bUG>|,ć%KָAEA"YjܸkDFEk"/j,Y>|xQÇ%7QE >jcɍ%>|,ć%G}XrcKn,E <;pqɒF4| CX>Ĉ1 q#"Y5X[գ^1bRGCjScH 1bj CǍYbĈ(NqšAƐ4hQNjScH 4~dbG*:pxAl!Lڰh#dՆQX ,._ֳY;+> b(+8Hb!\Vp¤ ZG+ţ‚QX@"ʊb,XlYQ V+xQdE4~A#Ft㖨l@r n[6a`A,``QI"gVD0"%*ZbG ?- ,]j.Zx0^X0F(@E)Z^蠱d4bĠ ,[Ŋ-ޤŊ-\8,:^x?/tЈQG ,@  .Z0m2F 6(LrI)Z^qÉ4bĠ ,l޼ +ZB.XE 1hxU 4b .άVX`ϸ`Emť[aQUPBEPA 4O,,[vbfΝ9pB2zňG1v"F7hn-V\-\@ OX*`+ aⅅ!`Dbnp¢ NXge5hB~[tb(+|1&=hG-V )r$I-\HŊO⢠ K*)RpE цㆎ5(cNO,^uqf׮^qb, ,yǏ,1^#F =n.Z†H ]X! 0`@F&@0 9Rb4hxF ,,nM޾vq7bx</Cы8Z`E[4q!~) V$ p n Wd͋7zJ/^)E ?x#H8Z`E[`a0.Zh.Z\NU.A )B@-/tpңFkĠ 4;Xr( 'CxE_Ĉ:1hx-\(Ŋ-\h{-Vo~-VoQ ~a  "-/hң1^ACNj4b`aqdIX!I5jxCǐ`ChĈA# CƈE/vhET-VTmEV[hl ,Ⱥhm$.8ac(Bdi$'5CǍ7t ɒa@?cG*1b`aC ?|xȚ/vL#7vhEp-VoEr˕hz ,hVaE&hDHϴpƐ=X`A4h8a9?bbҋX8C4bYQŋ"+ĠE28Z`E4[`3Μ0Z.Z8" -X8e#߀6à0LTK/|2ƍC^ć1Krx j$K;z ':t#ƋEּxȎ1|AG ,:h"t&.J>mI[`E[a 0X @HNjР5ߐa ⅎ/ʿ1 =jA#ƋϏ.X +ZDP +Z`E[a ;° &L\z# '5hb ,I9l` ,``cH/ M݈ATUN݁ ]]XVXeöpB+ܶCd!,`` ~0 PA8Qɐ!NUBdv85aPDVjR' T` INb)(F"k^XSd͋kTс ]X\r͓pB+h'ݽ>@_+*zVDa_>(+`eE7\Qύ"+`CVLF"`YaT)q.X@8,X9VE&n1dȍ,KԼQŋ>| .X:hQD]X4 1b^x!F̋/ļ2iG 1/ncǤ/^D&Y^iD&Îb^x!&Ǝ ;bШ1;&ycG*/hp⃆C ӧQV:+`xAlE1~AF=hGAVy1^YQŋ"+ŏ/"?b"ȋ?X"Ȋ"/^YEYAdpÇ#JŊ+L[ XaAҊ(±G+,,bbicxp XXH±G+,,bicxp ^&.Ҫ]˶[MZKwC.9#.C.S lhʊS lhʊS mhʊӨOO1#.bj۸s޽{[oqNwXbs-G_Aرؾw+‡oAӷXΝ[;segno-1.6.6/docs/_static/artistic/yellow-submarine-rotated.png000066400000000000000000000030531476440322300245110ustar00rootroot00000000000000PNG  IHDR]G{IDATxmOFǿ;I6OV4N֔>HH8Ê4uP劄h9sG9DhJ{Ԝiěy?vGZь7!6-O(fsgޛ'&} ـm%עL X޷8 Tkz8^ЇQh #mae!JNd/&)',O.5fyI" pĴ]h\حiV+@Nk]lUeWrZQhJh } 㨗zR>rƐIA6@tgUԫQ#4\}̿z5 IAf U7Ӈ$zV1艎KR_kD- :{U~!w?8{YʞkQA;E%{Y``RuD7߭7 $FI%ř3-`:t΢)8;B/voݱ:s/x( fv8Gd 8@˫O4I&%HIcAz&_ '+l&v`Wu Pywf{u*]UH׸Y$e S>a-RKûqXYΈ)"<_C@YGt854_bʗ½{O=X̎p4kKJ:]I.U0G_aPƋ2L72BjH{R/`an v!DN܈œ>ȉPr2,M'At~ `0`IwBIȡ[u\-͈)$0PJ88zYeZՃC P]2>WeE%~>ZS@N[?Sq.PIvC0w;o+/ AzCǩJL'0kU@CcaNJ=ٗo' 0pp@s->P|%&4$5 "/^*>{t;('yfI'ha0JhJf!a1sq%Dѡ?5+`7+X?s1qCT~\\wB䏩z.IU)՚@O|IOО8YXe9@\s2 >PvT@~ 4>X1C(<112(v9R<*&:d8_Agך$kM%ޔV֬eMpE_]5=M'861`B2]/ X<@Ntыqk7 >GۍBHlgf 3Hn/@ݒt?hy94*!K,8M} )\4;"ZfS9 \./!sNA^;\ kIoEIf^4;ȵfᆴ\-0˶@ [X9gU9IENDB`segno-1.6.6/docs/_static/artistic/yellow-submarine.png000066400000000000000000000006321476440322300230510ustar00rootroot00000000000000PNG  IHDRRG PLTEGy*IIDATx] s\2La7h?g%nJ05ZGTqh|*]vްz3%JB9p *)1 ,7Ge̬"c6(+]H1hN!E G:*'1:`/T .oXLt2d6m|n mQ|QPn(GOS ocu3&J}GS-̧}vv*C RdWժ8 ,WA. &YWQՖZ* sVwRYTR"ZI}_̛iIENDB`segno-1.6.6/docs/_static/boost_example1.svg000066400000000000000000000024061476440322300206670ustar00rootroot00000000000000 segno-1.6.6/docs/_static/boost_example2.svg000066400000000000000000000024001476440322300206620ustar00rootroot00000000000000 segno-1.6.6/docs/_static/chart_create_1m.svg000066400000000000000000000414751476440322300207770ustar00rootroot00000000000000 Create a 1-M QR Code00.20.40.60.811.21.41.61.822.22.42.62.8qrcodegen2.85380.00000000000006381.6410256410257qrcode1.5206.92307692307693244.00000000000009Segno1.23172.3076923076923106.35897435897442Create a 1-M QR CodeTime (ms)qrcodegenqrcodeSegnosegno-1.6.6/docs/_static/chart_create_30h.svg000066400000000000000000000410271476440322300210450ustar00rootroot00000000000000 Create a 30-H QR Code0102030405060708090100110120qrcodegen120.04380.0381.6410256410257qrcode71.66232.73818983415782244.00000000000009Segno56.37186.19761361597415106.35897435897442Create a 30-H QR CodeTime (ms)qrcodegenqrcodeSegnosegno-1.6.6/docs/_static/chart_create_7q.svg000066400000000000000000000410311476440322300207750ustar00rootroot00000000000000 Create a 7-Q QR Code0123456789101112qrcodegen12.82380.00000000000006381.6410256410257qrcode7.17218.96855874234973244.00000000000009Segno5.8179.9219968798752106.35897435897442Create a 7-Q QR CodeTime (ms)qrcodegenqrcodeSegnosegno-1.6.6/docs/_static/chart_png.svg000066400000000000000000000367271476440322300177270ustar00rootroot00000000000000 Create a 1-M QR Code and write PNG00.20.40.60.811.21.41.61.82qrcode2.1380.0347.2307692307693Segno2.03367.8205128205128140.76923076923083Create a 1-M QR Code and write PNGTime (ms)qrcodeSegnosegno-1.6.6/docs/_static/chart_svg.svg000066400000000000000000000366771476440322300177460ustar00rootroot00000000000000 Create a 1-M QR Code and write SVG01234qrcode rects4.13380.0381.6410256410257qrcode path2.47233.1383870366921244.00000000000009Segno1.48145.5522443658037106.35897435897442Create a 1-M QR Code and write SVGTime (ms)qrcode rectsqrcode pathSegnosegno-1.6.6/docs/_static/cli/000077500000000000000000000000001476440322300157715ustar00rootroot00000000000000segno-1.6.6/docs/_static/cli/black-magic-woman.svg000066400000000000000000000016711476440322300217700ustar00rootroot00000000000000 segno-1.6.6/docs/_static/cli/boom-boom.svg000066400000000000000000000016151476440322300204030ustar00rootroot00000000000000 segno-1.6.6/docs/_static/cli/diamond.png000066400000000000000000000004171476440322300201140ustar00rootroot00000000000000PNG  IHDR;IDATxVA@ "K~-U/#TJ%,/Pf׿ߜd'p6~KTQbHfV?UekC%a^ѧYQ֕KDyԷ ֟,MIENDB`segno-1.6.6/docs/_static/cli/dontgiveup.svg000066400000000000000000000016601476440322300207010ustar00rootroot00000000000000 segno-1.6.6/docs/_static/cli/excited.png000066400000000000000000000003351476440322300201250ustar00rootroot00000000000000PNG  IHDRttnTdPLTEIDATx10~?6钩;t2\-z3;r ŗXv\v1Ooez|S͛(<G$w 4O_X i|G?n}ÄIENDB`segno-1.6.6/docs/_static/cli/hotel.png000066400000000000000000000003351476440322300176130ustar00rootroot00000000000000PNG  IHDRtt|+tRNSIDATxUA02%?`R{i =iBO  ېsɂdʍ0pO'wK#@X"vtΠ3: f*^v)[Ы   Y"T}N8%u`4NaRa?Y}$?ɒyy  wf]b{IENDB`segno-1.6.6/docs/_static/cli/micro-qr-layla-version-m4.png000066400000000000000000000214141476440322300233330ustar00rootroot00000000000000PNG  IHDRE?0iCCPICC ProfileXYT͖  9ssrC$'( "*"* eP=[t7npS"#Cacn7D@':R Cx>ٰkaCoOEB1;A 7qr0Dx: }8}$R"X' g#,/vM6)xk,oJIN]Bc!\tT31#Vamc`&wnoX3>цȜVۗbd`d.agXBl6A1N75}8.<귝#~Ihc?:A&F"  rA0={C-K 4Cu,T-{Xqd}(}#X/&l-/_?#-(_pPHt8nj[u/akQWAlkPo)v[Q?"c윶 #bD`38ڪ1@iYA" ?fCk[wY"L#8 ͉Akr)5aͰ&X<|֡EAy!g Lc0o0qKnZL7#L~9G-VAw4+Ƞu e?smKҫf3݊̑/wMT=uՂj;&T7 o7#OoB;AtkgWwoM1/aDd5( 0_Y}dX߷yub},]p-B܊~Ȅ` aXjܖ q !oB@"PZ@ ` ;؅z CXǃ$pL @)8΂*p\c S#? A8! EHҁ!+r((ʅJ3P5t ݃B}KhA0 aXa}vwpb߀Ax/Ŋ@ɠQ([EECe QZT3gq,j Eh$>htz: ]B@w's_"#Ęc0xLsӀ;SX,+UCMwl0v6 {[Nbp8N Qp14\ 7[x>/_ķ+4 4"4444 4444OihV16L8H(&F 󴴴AhivN.1I;Fw.Ky"(J#zcLjvqL/KoNK}?g IOEJ$IOI 4 } e 73,0m/2>d|τce2feJe:4IFȆdr |<Ōec6gfd<̲68+U՜552>[:[-[?Ov.v=v? :Ae~c8ќ'9sr1siqpep]憹%p^1)ie m#¯_?'-`&+pFG`EPLY0YNAH]_(_MhNOZ8IFxXFD]$PHS䧨aFbbbb5bDq](  D ^IXRE2PL,*$uBO#!.]!\NF_&NFfBUJ6YQqN_*# L  %}J&J*K))T~BVV9ҦJUUQVR+W{άnޥ0دѢyM󋖌VEĶm6-M>=ïsZg\W@[FOHW;} `K  ? 5 5Be3;Ԙ̙1k14;nܜǼ|BbE%e+I+U5lmag=j#bnh lml_ىEݲٗO;(8$9t:=/:p2pvqwuns!pvj:&;{{vۧvH1Slwq uۓIxz]ZR*( s>>E>}|}grk , 2 * l|*gmȅPк0|Wpވ}RiQQQsTKh(zgtS 3r=;W_qwɄw&iKH:4W}>}m:`z `'ɹS\SSyRN2=TFFM{~X##AGzҕKef<ʔ,\ztThczUO`sseM̝̳λϟar"BQlxUqSpINji``AY]9wyz'OꝬ=s*/ΘQ!ZQx{6tKe9s9g_~aʡZ"&fҎK.7Ԟc˼^p5kmE72n@7n5677ݴ֬pKօ,[ w,܍;{/dgH[@}G}]Lwwjy#GUVnxGSM}Zu=3z`|`ߐЋ;}e˯q+#F1^qUx]7:~{h㛑Iɏo߮NN ~edS#?̦}bTY/z_榾R˚瘿]{ۂ؏+?39ԗ:]߭įV$֚Y][_P)Gr|2m$do΂)d7 ªp ö]f~-^HK&z̭lK\x"x B"⢷-%Ƥ¤eˣUS5j1osi]W02K3ȫr{Woр!~a9":Q1Z&4&~HkSɌ)NӒ;r*rFsfGVcgsVs B W\+m(k(vɫNixrvy "H4X]tzZ_t#rꋯmzqͯ+-۴wXrnk@ӪGn-h=U{2@X44ȆWcfU'&|y6uf:{_f>| _¿~c6>N?W=KVXWz__6#;'X 9Ox AP4#k*9C(a 8I,M8vnOpi+M]Ã3+:O/,?N_PIH_ZAQJ\OBJ, LLl"VqAiZJjy|ZLtxt AaB(]V/oTٖ8;:8upMs;vyxRB|B}}fGC##Mvҭˏk>\Yg. wCQ}ӷﴎY٦}?AM置V8{ۯ,qs;^ ?~=|lg/U_)3k1n`U(u2BCL'L\R]#d5HHBH:0`?0\?gQ$":jG͠IhUN!es aF``q.WƇiѤTB-;mm;'Qx8FMH= w3N3929nMK%ldlv"{#[G &#>OE\i_Bۄ_$։uۉIP$%3F3d4e>ʞs'˿QRTQRW-QKVjhiov1Uד0 .-Lfv'ZGlXLݜ\r]&<-w|E\+_ L ]x%G-!Ŧcw$ڳw/v_dtJ!HuƎ,ޣo?gX+-/*_9vkd_ZC_?<|];g%WZEl呺 M>-U_?%(x_PW'Nΐg1kV uXM{d@E]AM9ttz jbc;qL8O<LCJ3Gh-i4|$n)ZF .&wOf.,,Yllؓ889sppZcd> ^ ^i=.+) 1%$)%., 7&?ZҲʰQ۵̶iºSzm R 776ZXX[?rqbtvr)rqް"sObuzHQ)<6b0JZ+?on•=I5O<•z"pv:MFZlbNA._¡R'ߞ?x63UՏj/]Q:R`xcjӭw[WK=hr|'=wz=QϪm>HI] }jM[wOX/_9|_jQviJjښ/u G+)nnyQp___X__;2Gmgsax;>_ע⒀(n]#bH?pk)Q{qKyK/QXrЎ;v2n4n7vK[^ a/VRK1( (z1/ځ^ 56nE(lFgPF>s`'V}$XEq \jQoU7]? tb=s1s=vݹa?FTbx 7FD߹繨szIxDӉ7~{.[\o~/_cot}7ǟqwd|N箏x/۾Exg"Z<| }'Mȹ(o]{({^">~(rDuOŃW?Xڸ6ߎ>[:{+P[G?|h>zP;G|6շŝ=_9kc}Yvt#"ݯ- { o!k+,_E, {?W?쯟VA?~63VjҝTVgV™,s답#>V9ϋ[9l}hZk,/+ piYE)n,tYlx?bXd~QfokfE{lYW/ ksX^|WֻG~/܏b(eX"32Ȳ(s8zn,9h]Ff٨n2ͬӲˊΪ9_Nz֪3,V>sYYnf;siY1xFhf* 2\_85ƈIAc7ś_x*lyocL2%'`b533D@D@D@D@D@D@D@D@D@/~`   Zq%@fyD@D@D@D@EQEQ,|:J:4g)"("("(   pf=)Sd}z)2)"("("("(" pINWjRȌzqMM ;EQEQEQEQEQEQE1cJWQOI9N;EQEQEQEQED@D@.U9%D8YZ3)}nySEQEQEQEQEQEQk=%SAຏ:v      cf,L \I8)"("("("("("(s)2d9g&uSEQEQEQ@D@D@DŔi^2jr27)g    ("("e)92yLSEQEQEQEQEQEQJc1%gR{wZq_:q^LSED@D@D@D@D@Du4Sr}̨Lyq'N@D@D@D@D@D@D`ŔQOr;EQEQEQEQEQEQE4SrF=cR︦}ɤI)"("("("("("(3)g&,q>'e̴OUSEQEQEQEQEQEQpc1%gڧLQ_Q?ߤLqiEv      W3)6u*ȤN@D@D@D@D@D@D@D@QEQEQEQEQEQ}rffƙDQEQEQEQEuyIENDB`segno-1.6.6/docs/_static/cli/micro-qr-little-wing-terminal.png000066400000000000000000000217721476440322300243070ustar00rootroot00000000000000PNG  IHDRQ6؇0iCCPICC ProfileXYT͖  9ssrC$'( "*"* eP=[t7npS"#Cacn7D@':R Cx>ٰkaCoOEB1;A 7qr0Dx: }8}$R"X' g#,/vM6)xk,oJIN]Bc!\tT31#Vamc`&wnoX3>цȜVۗbd`d.agXBl6A1N75}8.<귝#~Ihc?:A&F"  rA0={C-K 4Cu,T-{Xqd}(}#X/&l-/_?#-(_pPHt8nj[u/akQWAlkPo)v[Q?"c윶 #bD`38ڪ1@iYA" ?fCk[wY"L#8 ͉Akr)5aͰ&X<|֡EAy!g Lc0o0qKnZL7#L~9G-VAw4+Ƞu e?smKҫf3݊̑/wMT=uՂj;&T7 o7#OoB;AtkgWwoM1/aDd5( 0_Y}dX߷yub},]p-B܊~Ȅ` aXjܖ q !oB@"PZ@ ` ;؅z CXǃ$pL @)8΂*p\c S#? A8! EHҁ!+r((ʅJ3P5t ݃B}KhA0 aXa}vwpb߀Ax/Ŋ@ɠQ([EECe QZT3gq,j Eh$>htz: ]B@w's_"#Ęc0xLsӀ;SX,+UCMwl0v6 {[Nbp8N Qp14\ 7[x>/_ķ+4 4"4444 4444OihV16L8H(&F 󴴴AhivN.1I;Fw.Ky"(J#zcLjvqL/KoNK}?g IOEJ$IOI 4 } e 73,0m/2>d|τce2feJe:4IFȆdr |<Ōec6gfd<̲68+U՜552>[:[-[?Ov.v=v? :Ae~c8ќ'9sr1siqpep]憹%p^1)ie m#¯_?'-`&+pFG`EPLY0YNAH]_(_MhNOZ8IFxXFD]$PHS䧨aFbbbb5bDq](  D ^IXRE2PL,*$uBO#!.]!\NF_&NFfBUJ6YQqN_*# L  %}J&J*K))T~BVV9ҦJUUQVR+W{άnޥ0دѢyM󋖌VEĶm6-M>=ïsZg\W@[FOHW;} `K  ? 5 5Be3;Ԙ̙1k14;nܜǼ|BbE%e+I+U5lmag=j#bnh lml_ىEݲٗO;(8$9t:=/:p2pvqwuns!pvj:&;{{vۧvH1Slwq uۓIxz]ZR*( s>>E>}|}grk , 2 * l|*gmȅPк0|Wpވ}RiQQQsTKh(zgtS 3r=;W_qwɄw&iKH:4W}>}m:`z `'ɹS\SSyRN2=TFFM{~X##AGzҕKef<ʔ,\ztThczUO`sseM̝̳λϟar"BQlxUqSpINji``AY]9wyz'OꝬ=s*/ΘQ!ZQx{6tKe9s9g_~aʡZ"&fҎK.7Ԟc˼^p5kmE72n@7n5677ݴ֬pKօ,[ w,܍;{/dgH[@}G}]Lwwjy#GUVnxGSM}Zu=3z`|`ߐЋ;}e˯q+#F1^qUx]7:~{h㛑Iɏo߮NN ~edS#?̦}bTY/z_榾R˚瘿]{ۂ؏+?39ԗ:]߭įV$֚Y][_P)Gr|2m$do΂)d7 ªp ö]f~-^HK&z̭lK\x"x B"⢷-%Ƥ¤eˣUS5j1osi]W02K3ȫr{Woр!~a9":Q1Z&4&~HkSɌ)NӒ;r*rFsfGVcgsVs B W\+m(k(vɫNixrvy "H4X]tzZ_t#rꋯmzqͯ+-۴wXrnk@ӪGn-h=U{2@X44ȆWcfU'&|y6uf:{_f>| _¿~c6>N?W=KVXWz__6#;'X 9Ox AP4#k*9C(a 8I,M8vnOpi+M]Ã3+:O/,?N_PIH_ZAQJ\OBJ, LLl"VqAiZJjy|ZLtxt AaB(]V/oTٖ8;:8upMs;vyxRB|B}}fGC##Mvҭˏk>\Yg. wCQ}ӷﴎY٦}?AM置V8{ۯ,qs;^ ?~=|lg/U_)3k1n`U(u2BCL'L\R]#d5HHBH:0`?0\?gQ$":jG͠IhUN!es aF``q.WƇiѤTB-;mm;'Qx8FMH= w3N3929nMK%ldlv"{#[G &#>OE\i_Bۄ_$։uۉIP$%3F3d4e>ʞs'˿QRTQRW-QKVjhiov1Uד0 .-Lfv'ZGlXLݜ\r]&<-w|E\+_ L ]x%G-!Ŧcw$ڳw/v_dtJ!HuƎ,ޣo?gX+-/*_9vkd_ZC_?<|];g%WZEl呺 M>-U_?%(x_PW'Nΐg1kV uXM{d@E]AM9ttz jbc;qL8O<LCJ3Gh-i4|$n)ZF .&wOf.,,Yllؓ889sppZcd> ^ ^i=.+) 1%$)%., 7&?ZҲʰQ۵̶iºSzm R 776ZXX[?rqbtvr)rqް"sObuzHQ)<6b0JZ+?on•=I5O<•z"pv:MFZlbNA._¡R'ߞ?x63UՏj/]Q:R`xcjӭw[WK=hr|'=wz=QϪm>HI] }jM[wOX/_9|_jQviJjښ/u G+)nnyQp___X__;2GmgsaL87ss$d~}6OojW^jf<<?ח6Tv[U {Y>L\`8Hn;5\vm YmFA*Uw' N7Vk[U{^dF6zT*ͥCm5N6Z ݬ?]?ۇfz^~g>t{O\wI>(&9 u at58|ol.V/ڝu[eŭ2oZRR_)UZJR+R{w?4Kre[-UYo?Nnʰ~7VʰV2(RO`{V[RZi6=WˠZ_︍zMw>hT'<I^UkG?ΏZZG\#7:UYg֮J}q-GOe;эպjԮg'b~:k{ii2/Zd$rŻnGwX“oͧouOmZ<4OZJP,UufԺK.fx6KKɭ~M/W7|wo1/I;QpwF\|/BrZ|oH=n}>-?<:/ү毾v~=v._|2ygISIׯ'}[C2Q/nȍGXӼUNZ׏_WyȆǿv9͊Q(7Y>u-Ua"Ւ׿r^OSe%kZ+lok_17̋B:y+v~_I64OΉNhj=kn_rZ+_=P_gƒp)ܻ}ه{ 8F˻Unr>se51齺vwx-܇y £~OZoP^;2:e{R͕kV^5(k+vpX^SZ^֎|WC ^Yo_:^}G4vKkQR[+ՠm[l^WeXnjտ}l:twV}p:_ϝ(" " " ((" " pfƛ"sIOŚy0;Q@DD@DD@DQQ@DD`*̟ǝqtY9޿~Lr' " " ((" " ޼C2Y:4V1Q@DD@DDQQ@D&'>2Әq(((" " (({ri7}Ɲr4+y֏;QD@DD@DDQQD@DD̘)NZlSw" (((" " (#5SL9yzN}N@DD@DDQQD@DD@Dν4)2zq;QQD@DD@DQQQD`¦bY4+Sy&}<'}\fz1܉((" " (((c)N2=ty\LG(( " " ((p4)95i49+/w(( " " ((7S&=O4IY9giY>݉(" " " ((" Sg*8Mz̤ʔYa:ӝ( " " (( " 0bӬLw;ǝ4כ7+a\rN@DD@DDQQD@DD@Dνt֧qv4Lcr' " (( " " i*8)28w(((" " (( " " (( " " @dsd܉($IENDB`segno-1.6.6/docs/_static/cli/money-talks.png000066400000000000000000000006041476440322300207420ustar00rootroot00000000000000PNG  IHDR""u IDATxA0 <$DcFl%49DVĬ6/PB #Tc;seˮ T} ɫ͢*`+{o9G^Ϟ 䜳9*c)I^7_V>*k^KU~?G55~[N^۳rsNX{Y?5h^rNS($9ad?Gԁ}d} ڜ3U8o*TP=Sx)XM:m)4tEXtSoftwareSegno CIENDB`segno-1.6.6/docs/_static/cli/private-investigations.svg000066400000000000000000000023011476440322300232240ustar00rootroot00000000000000 segno-1.6.6/docs/_static/cli/qr-layla-version-5.png000066400000000000000000000274541476440322300220620ustar00rootroot00000000000000PNG  IHDR|0iCCPICC ProfileXYT͖  9ssrC$'( "*"* eP=[t7npS"#Cacn7D@':R Cx>ٰkaCoOEB1;A 7qr0Dx: }8}$R"X' g#,/vM6)xk,oJIN]Bc!\tT31#Vamc`&wnoX3>цȜVۗbd`d.agXBl6A1N75}8.<귝#~Ihc?:A&F"  rA0={C-K 4Cu,T-{Xqd}(}#X/&l-/_?#-(_pPHt8nj[u/akQWAlkPo)v[Q?"c윶 #bD`38ڪ1@iYA" ?fCk[wY"L#8 ͉Akr)5aͰ&X<|֡EAy!g Lc0o0qKnZL7#L~9G-VAw4+Ƞu e?smKҫf3݊̑/wMT=uՂj;&T7 o7#OoB;AtkgWwoM1/aDd5( 0_Y}dX߷yub},]p-B܊~Ȅ` aXjܖ q !oB@"PZ@ ` ;؅z CXǃ$pL @)8΂*p\c S#? A8! EHҁ!+r((ʅJ3P5t ݃B}KhA0 aXa}vwpb߀Ax/Ŋ@ɠQ([EECe QZT3gq,j Eh$>htz: ]B@w's_"#Ęc0xLsӀ;SX,+UCMwl0v6 {[Nbp8N Qp14\ 7[x>/_ķ+4 4"4444 4444OihV16L8H(&F 󴴴AhivN.1I;Fw.Ky"(J#zcLjvqL/KoNK}?g IOEJ$IOI 4 } e 73,0m/2>d|τce2feJe:4IFȆdr |<Ōec6gfd<̲68+U՜552>[:[-[?Ov.v=v? :Ae~c8ќ'9sr1siqpep]憹%p^1)ie m#¯_?'-`&+pFG`EPLY0YNAH]_(_MhNOZ8IFxXFD]$PHS䧨aFbbbb5bDq](  D ^IXRE2PL,*$uBO#!.]!\NF_&NFfBUJ6YQqN_*# L  %}J&J*K))T~BVV9ҦJUUQVR+W{άnޥ0دѢyM󋖌VEĶm6-M>=ïsZg\W@[FOHW;} `K  ? 5 5Be3;Ԙ̙1k14;nܜǼ|BbE%e+I+U5lmag=j#bnh lml_ىEݲٗO;(8$9t:=/:p2pvqwuns!pvj:&;{{vۧvH1Slwq uۓIxz]ZR*( s>>E>}|}grk , 2 * l|*gmȅPк0|Wpވ}RiQQQsTKh(zgtS 3r=;W_qwɄw&iKH:4W}>}m:`z `'ɹS\SSyRN2=TFFM{~X##AGzҕKef<ʔ,\ztThczUO`sseM̝̳λϟar"BQlxUqSpINji``AY]9wyz'OꝬ=s*/ΘQ!ZQx{6tKe9s9g_~aʡZ"&fҎK.7Ԟc˼^p5kmE72n@7n5677ݴ֬pKօ,[ w,܍;{/dgH[@}G}]Lwwjy#GUVnxGSM}Zu=3z`|`ߐЋ;}e˯q+#F1^qUx]7:~{h㛑Iɏo߮NN ~edS#?̦}bTY/z_榾R˚瘿]{ۂ؏+?39ԗ:]߭įV$֚Y][_P)Gr|2m$do΂)d7 ªp ö]f~-^HK&z̭lK\x"x B"⢷-%Ƥ¤eˣUS5j1osi]W02K3ȫr{Woр!~a9":Q1Z&4&~HkSɌ)NӒ;r*rFsfGVcgsVs B W\+m(k(vɫNixrvy "H4X]tzZ_t#rꋯmzqͯ+-۴wXrnk@ӪGn-h=U{2@X44ȆWcfU'&|y6uf:{_f>| _¿~c6>N?W=KVXWz__6#;'X 9Ox AP4#k*9C(a 8I,M8vnOpi+M]Ã3+:O/,?N_PIH_ZAQJ\OBJ, LLl"VqAiZJjy|ZLtxt AaB(]V/oTٖ8;:8upMs;vyxRB|B}}fGC##Mvҭˏk>\Yg. wCQ}ӷﴎY٦}?AM置V8{ۯ,qs;^ ?~=|lg/U_)3k1n`U(u2BCL'L\R]#d5HHBH:0`?0\?gQ$":jG͠IhUN!es aF``q.WƇiѤTB-;mm;'Qx8FMH= w3N3929nMK%ldlv"{#[G &#>OE\i_Bۄ_$։uۉIP$%3F3d4e>ʞs'˿QRTQRW-QKVjhiov1Uד0 .-Lfv'ZGlXLݜ\r]&<-w|E\+_ L ]x%G-!Ŧcw$ڳw/v_dtJ!HuƎ,ޣo?gX+-/*_9vkd_ZC_?<|];g%WZEl呺 M>-U_?%(x_PW'Nΐg1kV uXM{d@E]AM9ttz jbc;qL8O<LCJ3Gh-i4|$n)ZF .&wOf.,,Yllؓ889sppZcd> ^ ^i=.+) 1%$)%., 7&?ZҲʰQ۵̶iºSzm R 776ZXX[?rqbtvr)rqް"sObuzHQ)<6b0JZ+?on•=I5O<•z"pv:MFZlbNA._¡R'ߞ?x63UՏj/]Q:R`xcjӭw[WK=hr|'=wz=QϪm>HI] }jM[wOX/_9|_jQviJjښ/u G+)nnyQp___X__;2GmgsaP/&5UTU!%"2 : :NNՍ5Vlֵ@trğ<>0ZjYl ϶x99Ε+w}$:g t<]qozңo>~qY_r~׎mrl1ۼaܜNc?|~Íݘ/1/b1݋8ƍеDZv`+&ӽbr`zX,&yכ{9b0xv[3pp^X,s_[ׯl{-Zck\ՙ'.y6*_ Ӝoj~#\,##y}::U(#"׮Os1޼"wFƍYZ[cؼ=a.Ed r9csȝv=gnLr|~g[,&9|4|?gQw[?^{ظ[rv.V{l6fkv/n3y}g+F>Ea2s[m}ˣ4kgr㏞@y6v#ʼnu""Ƌ<eD?oΗyc݊\ο0gFݩc?e`>Xr5Fg`m+srx*㭣_|o##"o̗ys<{l6fkv/}،}gBg]yS7=#"^Gߊ^MƓ77 _|){״<}YןpED|5O~<ɇO=58u|oO>g:OgXC}+ēwo}>~މc?Ƈ8͏\9Sr?13>Ư{pjt_|ňX[G%"ݿx6^|3qS~VSQ<ǣƋ#ο8vZD?ůѱN=o}9c/-^q7 +W\DD?1>:3_8?kneձ?ܛ-s9d:"w(v=3Gpys2fl6[3"r0_({?zfÐ0^u|{?Qs=m?g{l6fkV^.tAƛ'o3~ۏ;>Y-p<c9|ODyU\yě|l>Mz{?^r}ֽm^\jQx @t@t :@t :@t : :tB4YiRY ?|}]ǛND'D'    zNWJ_fKm_KUUyx @t@t :@t :@t : :tB\4 稔҈uzM>^g׽yiϛND'D'    zJ)&Yf:]~h|%t : :NNND'ND'3:}~V>yDx @t@t :@t :@t : :tB\RJ#33k_5eꞗ)Y}Ԕ5nK祫@t :@t : : :NN:AR*헙gU_SnMY ݼoꞗ9qt : :NNND'ND'3gWJi2}unUה)yf^y9Ut : :NNND'ND'3R%ks}y6zx @t@t :@t :@t : :tB.z̬<_Ugs]uM9Ϻx @t@t :@t :@t : :tB]fVگq_GMY׵yDݼ@t :@t : : :NN:g .RJ2UՔy9yi}<9/U뺟M9ɛND'D'    z]t)~و5<8Ϧ̋YxUW='ěND'D'    z]tfzRJϳuhy=_/us?xηyqt : :NNND'ND'K)ZzUU=ϦCvuCׯ)C)׋5MM'    @t@t .:3+WJxMєyzmW5zii1M'    @t@t .efYxu<>M>K7)ϗ_/<o:NND'ND'ND'D'NuqЙYJ)Ϫ㫺MϺWxr\gK~NyVy|t : :NNND'ND'K)Zzu{|Uה)^ׯCϳ)]5y @t@t :@t :@t : :tBJR1Yxu_u_/MQҔuhʼzx @t@t :@t :@t : :tB.zlT_ۏG7|>ssM'    @t@t =SpvYiR񝣪ǫ:>}Խmάx^הuo5e^<t : :NNND'ND'3/3+WJiھU}~ս~M9϶)r5zx @t@t :@t :@t : :tBLy)Ժ_yz_kϦ}@t :@t : : :NN:AR%Д5~pݼ^M'    @t@t =SpviNPJ1_gM__ٔK.'o:NND'ND'ND'D'N虂WJiyff5e>_Sg۵ϗ  @t@t@t :@t :脞)+J)Zr\U=/u_/p7ND'ND'D'D'  @'LRilھts>2> 'o:NND'ND'ND'D'N虂&g)Y֭{Yn{ս7ND'ND'D'D'  @'LٕRLBef#Y2_u?'r֝ד7ND'ND'D'D'  @'8̴:kuݔYwn''  @t@t@t :@t : : :NND'ND'ND'D'    @t@t@t :@t : : :NND'Nw,΍7ND'ND'D'D'  @'??X^IENDB`segno-1.6.6/docs/_static/cli/qr-little-wing-terminal-compact.png000066400000000000000000000143651476440322300246240ustar00rootroot00000000000000PNG  IHDR# iCCPICC profile(}=H@_SvqPu ~U(BP+`rФ!Iqq\ ~,V\uup77'E)IExwqEYmf2ә1nt aL2f%)>EyVs5k1'0ô׉6m>qdxĤ ?r]segTr8L,XibV05 ∪/=V9oq֊eV'a0//qX"$PPU'Bc-_"B 0ṛ Z1/)_c|;N?Wz_ӟWZm M.w'C6eWr9)]^o}>)*qCy^k=S8rzObKGDIDATxy|$$!, $R(U\oMセHXj.Ղ ^+.j-ʢVz+](s !B Ȟs lJK3X5u2=xmwL˗77' =YʇXfVጕ{8QbdIڗ/E).ɛVʰ;4iP_7fk?6)њp%tFEۢ??Ӟo:/뗚tS+_/tͮ'>$ ostFten*9JM\][{&:KUgZ2g3s,m~RsU%-[.JTG[]~H3֓h~P[^$]p( `եJ6hջs5ר4`L= 9x_|_ZxF>Az}yR~rZ𨯛28tǫR7o7K3qzc?kmc7v с]RW:%ω|o=HEsu57iï*(HNܧ?<|b>#Fh̴e1{Ym]w2V?2No[s2t4,ztWwaGv!#[3&Ul|͚ݫ'ݩ7M_,V7+3fi ;OoFt?2>Ws=w8]|JeɼLedL+R8r"A~ed/UhOl*~Cwfd*x_7鳃er(B)R=%=`@_* k9u܈)z^I],[K>&^kwSB(ԾJOAKwjK׍P1ikU\_-蜑ר$nv/}^/ޡr|wX/B+TPK}/v֥ם/}2O}P={YzZ{J>YsH UMV+Jb^_x_eMslm Uv/XʮHs|muoooS5W×˖=U]s@׼E3HQ}=s>3\yRSu$dhb_I1դOUl&\N?vH^#4>>)4tffջ{C<)WZ_ZMĦ(%I }7lP%mtW.R:PY{f,.RQw_^%ZIJN>ݬ#=T~6d%IMz mwt->|Ӯ5IًK>g)lFbHTJU*UWG):m+7GM^AA IFʭ!M7feCzkilUH63l^_[*5Q3x<%!Tv.wmoAΤ/* zʹ1Ra}QZ>Hgjj {`sݑI|oE;v˒OZ@jFǒzi/_K&'Jw.cDzn,Bt5;z'zK*j:?#]"X0s~/U$zp[7{6D wO/7CAk0Jfti@$5:T=+yJ-y#M~e.l.)oMyںSgOY988,i[S:Rmҏ{T6yիgTOrˆɖN>'T(iGO38Sַ_j[$ӣ{%}_phj>iV[#yx.雨B>>vϱjLy:}:^W&iw#IztV6&ݭ+#]XX/T02qm\^/PFrwژF !?O2)ͿJ<}Uo]uY7m fs<;ҠG-EKI%o>Xq&>3Ձ//Tn\}FV/NwmJ-|á[pu[~n*WėvVSz M{@UתԜ54wfѭ֔v5ڙ<Ez>Z Mۖ[B-'W۵fza>i}>Z}ZCM_ȓWx=vХ]:zC-4-}ؤ>WɻS}5֣%St|缉Z{Sa)U7Z?m±sP_[kb@O355t8B!e/Ҍ%kYw{qy&):]}蚫>9kc92b ->NYSJv|LӢm2Rc*&4"Qj mZ|թ@jO~{gz==/K9@Ti~ka#F# F@ 0@a [\Ls/kSmhCF*v'-;cfQaTzF# F@ 0@a0a#a-+=&RjضISw[`\iөR#l'1Mm6(ĦM|R"'j=U9ZWB.*=JnV 9I7̅yo iBa0a #h:k&ZVԄHjovqa|v*oOS)uu6m)yy'N.WhJnZ+$ݤYh4r4 F@ 0@Sq׮SwZ9>\90X>ڭ}vjήQTަHV`';֩0g*?Y0^i  PZm:*&\㧸جR_Z%=w#Yhg02K:77\Ad1 @KB 0@a0xUMLTqOvU M& 9#QDcF# F@ @b:\ˤңUHJ9>yީt*Wα862Pm,tu|Zx %!F@ 0@@cZIqzF.{kU@M3$uS\؝`]0 9q|h23̼#F#pHWz4Rhe7hvT9. JU1¿j}*И6WbD/ 2>QS(!TeΤJa82B?žbM5o&8,Dȼ5c0@a0a j.V 6NUVLTqOv2YgS)uv#YCYai4,h1 @"F@ 0@@cBңQj&MTo^j}'DuADԮ]HyTڀݙVqQ]5Ȏu*YfIUɎ}׳Aw6w.\>.aX,z4XrZBp/< #F#h'*fݾZ-ޮ=۫k*݀Sv?NTzE&qs^-t?Tlq.JC&ۧ_fLwIEMXœukJNs"b8V4rñekFG a0a *"Usj;dS DMNU4Ӆ˱*W+yuK9]]ʫ*cpA 0@a0ƄvG&k`M9U d_&xVߧr&ڎSKg*=[vjU7[PâG a0a #0XhTeŐPUIeThtNۉW0R+4ֺ,NQ+}6ٗCǵkffh~xL@a0avG*sF}vbU] dq"UE^ĶQ*>.JoL!->iϧ@3ϟZ0^i PZm:*&\㧸D7˩qvq|,vvc kw=B1 @KB 0@a0x)-Vt>}9l ǠZQMS]XLqѫݬcF# F@ QңvRS^M>JU8[eI/Z~ˑŊ&U*XNw^M-ң{\UN͟/Pm g0UqtqޝZIG8#F# FИVR\͠ž'ZV4ەU24@(g*":U yw?&a䶖ZaϠQB*":U yw?4 0@a0@H JNVsBvkڵicRd;SՁ 7s.FٗL}>sЊd.LcEʣ:sJ|mO^צibTJOO?< ȹr!hb΅"`ru;Oih]< #F#hLWsBc ͅq84>_b#V0@a0aN2nʷPDG䵡#G a0a#F# F@ 0֎XW=ee*Ae*+ mhۨLؠ#V0@a0a9vcN;Ҕ]+vІ6-vjG;atGxc# F@ ]%mRIENDB`segno-1.6.6/docs/_static/cli/qr-little-wing-terminal.png000066400000000000000000000223431476440322300231730ustar00rootroot00000000000000PNG  IHDR z0iCCPICC ProfileXYT͖  9ssrC$'( "*"* eP=[t7npS"#Cacn7D@':R Cx>ٰkaCoOEB1;A 7qr0Dx: }8}$R"X' g#,/vM6)xk,oJIN]Bc!\tT31#Vamc`&wnoX3>цȜVۗbd`d.agXBl6A1N75}8.<귝#~Ihc?:A&F"  rA0={C-K 4Cu,T-{Xqd}(}#X/&l-/_?#-(_pPHt8nj[u/akQWAlkPo)v[Q?"c윶 #bD`38ڪ1@iYA" ?fCk[wY"L#8 ͉Akr)5aͰ&X<|֡EAy!g Lc0o0qKnZL7#L~9G-VAw4+Ƞu e?smKҫf3݊̑/wMT=uՂj;&T7 o7#OoB;AtkgWwoM1/aDd5( 0_Y}dX߷yub},]p-B܊~Ȅ` aXjܖ q !oB@"PZ@ ` ;؅z CXǃ$pL @)8΂*p\c S#? A8! EHҁ!+r((ʅJ3P5t ݃B}KhA0 aXa}vwpb߀Ax/Ŋ@ɠQ([EECe QZT3gq,j Eh$>htz: ]B@w's_"#Ęc0xLsӀ;SX,+UCMwl0v6 {[Nbp8N Qp14\ 7[x>/_ķ+4 4"4444 4444OihV16L8H(&F 󴴴AhivN.1I;Fw.Ky"(J#zcLjvqL/KoNK}?g IOEJ$IOI 4 } e 73,0m/2>d|τce2feJe:4IFȆdr |<Ōec6gfd<̲68+U՜552>[:[-[?Ov.v=v? :Ae~c8ќ'9sr1siqpep]憹%p^1)ie m#¯_?'-`&+pFG`EPLY0YNAH]_(_MhNOZ8IFxXFD]$PHS䧨aFbbbb5bDq](  D ^IXRE2PL,*$uBO#!.]!\NF_&NFfBUJ6YQqN_*# L  %}J&J*K))T~BVV9ҦJUUQVR+W{άnޥ0دѢyM󋖌VEĶm6-M>=ïsZg\W@[FOHW;} `K  ? 5 5Be3;Ԙ̙1k14;nܜǼ|BbE%e+I+U5lmag=j#bnh lml_ىEݲٗO;(8$9t:=/:p2pvqwuns!pvj:&;{{vۧvH1Slwq uۓIxz]ZR*( s>>E>}|}grk , 2 * l|*gmȅPк0|Wpވ}RiQQQsTKh(zgtS 3r=;W_qwɄw&iKH:4W}>}m:`z `'ɹS\SSyRN2=TFFM{~X##AGzҕKef<ʔ,\ztThczUO`sseM̝̳λϟar"BQlxUqSpINji``AY]9wyz'OꝬ=s*/ΘQ!ZQx{6tKe9s9g_~aʡZ"&fҎK.7Ԟc˼^p5kmE72n@7n5677ݴ֬pKօ,[ w,܍;{/dgH[@}G}]Lwwjy#GUVnxGSM}Zu=3z`|`ߐЋ;}e˯q+#F1^qUx]7:~{h㛑Iɏo߮NN ~edS#?̦}bTY/z_榾R˚瘿]{ۂ؏+?39ԗ:]߭įV$֚Y][_P)Gr|2m$do΂)d7 ªp ö]f~-^HK&z̭lK\x"x B"⢷-%Ƥ¤eˣUS5j1osi]W02K3ȫr{Woр!~a9":Q1Z&4&~HkSɌ)NӒ;r*rFsfGVcgsVs B W\+m(k(vɫNixrvy "H4X]tzZ_t#rꋯmzqͯ+-۴wXrnk@ӪGn-h=U{2@X44ȆWcfU'&|y6uf:{_f>| _¿~c6>N?W=KVXWz__6#;'X 9Ox AP4#k*9C(a 8I,M8vnOpi+M]Ã3+:O/,?N_PIH_ZAQJ\OBJ, LLl"VqAiZJjy|ZLtxt AaB(]V/oTٖ8;:8upMs;vyxRB|B}}fGC##Mvҭˏk>\Yg. wCQ}ӷﴎY٦}?AM置V8{ۯ,qs;^ ?~=|lg/U_)3k1n`U(u2BCL'L\R]#d5HHBH:0`?0\?gQ$":jG͠IhUN!es aF``q.WƇiѤTB-;mm;'Qx8FMH= w3N3929nMK%ldlv"{#[G &#>OE\i_Bۄ_$։uۉIP$%3F3d4e>ʞs'˿QRTQRW-QKVjhiov1Uד0 .-Lfv'ZGlXLݜ\r]&<-w|E\+_ L ]x%G-!Ŧcw$ڳw/v_dtJ!HuƎ,ޣo?gX+-/*_9vkd_ZC_?<|];g%WZEl呺 M>-U_?%(x_PW'Nΐg1kV uXM{d@E]AM9ttz jbc;qL8O<LCJ3Gh-i4|$n)ZF .&wOf.,,Yllؓ889sppZcd> ^ ^i=.+) 1%$)%., 7&?ZҲʰQ۵̶iºSzm R 776ZXX[?rqbtvr)rqް"sObuzHQ)<6b0JZ+?on•=I5O<•z"pv:MFZlbNA._¡R'ߞ?x63UՏj/]Q:R`xcjӭw[WK=hr|'=wz=QϪm>HI] }jM[wOX/_9|_jQviJjښ/u G+)nnyQp___X__;2Gmgsa7̭lv[}~1-n6S5vq8W ""ޏqq㈈"b;Nx})_mgy*V"x~rd kiO+3;WZrlnZ|>THQmFuf\~hh._x\E\}vnĚ}%Z8uO/9 _''okA58̆UD^ݎ> ;+h6l6w<ؾwϾ@L/=8i͸fį|3?v,"~ը<.q5]fdwVe_=oc~!2𽟵򬝶YJ~:v^56i>3TKo40Z_{͊>n9ǧ|xG?mk(F~뎸⿣c5|ظF@ q_:c35u`txJE... @@@.($\'O qp \@@@... @@@... @@@... fzOzjjʕ?RJ^?pv\ \ \ppp \P"Ӗ`|7VEO]|| @@@... a:|2-,Ӿ8{*ԧ{>`ppp \ \ \2P4'qpp \ \ \p@AL=w{Yʃppp \ \ \twJ8yϋv\ppp \ \ \L,oԔE(uT~qpp \ \ \p@A&r:|S9ׯieppp \ \ \d,Ӿ˲.Es&s]s:q \ \ \ppp0Le\~Qf^3܏ӎ @@@... JteZ{YO3/KŎ @@@... Jd"×etS)漣wY;.. @@@..8pӖ`|EgY}?ڱ@@@... &r:|S2r?β?@@@... &r:|YuEO.z zR)ee9?;... @@@.(iK0>S+z~YCSr q \ \ \ppp0L/@Ya~?oWϋljppp \ \ \g:<|B^)E?΢nppp \ \ \C{(z{Y+v\ppp \ \ \L `Ly7;.. @@@..tPG]Sf^eqp \ \ \ppP9f}zӺ`ppp \ \ \ppp \ \ \ppp \ \ \ppp \ \ \ppp \ \A855ee@@@...&ȹ˞:IENDB`segno-1.6.6/docs/_static/cli/sa_yellow-submarine-02-01.png000066400000000000000000000004431476440322300231160ustar00rootroot00000000000000PNG  IHDRcc@8IDATxՔ1n! EM((H\n4\`f\ɝf: Ǥ4H_jox7p4%ƃ[!(e6ޤ^ sB2]wg{hʫ's@(89ыq 1*uGAXj< b?5G(}G8Uޅma~Eyrrs,^7)-ld?: {FIENDB`segno-1.6.6/docs/_static/cli/sa_yellow-submarine-02-02.png000066400000000000000000000004321476440322300231150ustar00rootroot00000000000000PNG  IHDRcc@8IDATxT̓0#_8^pH1~:wDuB95xރ;ؕ;.|^"r:F'Vy))QQ鯝Ne% IENDB`segno-1.6.6/docs/_static/cli/satellite.svg000066400000000000000000000015561476440322300205070ustar00rootroot00000000000000 segno-1.6.6/docs/_static/cli/thrill-gone.txt000066400000000000000000000021421476440322300207550ustar00rootroot00000000000000000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000011111110101110110011111110000 000010000010111011110010000010000 000010111010100010010010111010000 000010111010111011000010111010000 000010111010100010110010111010000 000010000010001111011010000010000 000011111110101010101011111110000 000000000000110101001000000000000 000001101011000000111010111110000 000010010101000100001110000110000 000000001111000101000100111110000 000000000100010000001100110100000 000011101011001000001010000000000 000001000000100010011110010110000 000010001111000101001011101110000 000001110000100000010101100100000 000010001011110111101111111110000 000000000000110001011000100000000 000011111110110011011010101110000 000010000010001011111000100110000 000010111010101100101111100010000 000010111010010110101001111000000 000010111010101101101011101010000 000010000010111011001111100100000 000011111110010011011110110110000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 000000000000000000000000000000000 segno-1.6.6/docs/_static/cli/white-room.png000066400000000000000000000003501476440322300205670ustar00rootroot00000000000000PNG  IHDR~ZoIDATxc4⃐C+`u(v(A(S_ `Ǘ[y@`~)7v)HQ)ee0@8V|4tEXtSoftwareSegno CIENDB`segno-1.6.6/docs/_static/colorful/000077500000000000000000000000001476440322300170475ustar00rootroot00000000000000segno-1.6.6/docs/_static/colorful/alignment_dark.png000066400000000000000000000012251476440322300225340ustar00rootroot00000000000000PNG  IHDR PLTE ,?GIDATxZY@ sG]ҧy)[?C34R#/qYs~33>sYǮ7ahfc:xe3OUʺMC<\] C "nT] "\g݋ˇZ!.C6Re^q0Ʌ][^5hMA5K9=m-@!2a "]Bud0*6k0 tD "Qr4+Q.ie'ծe ?x\{?dˇՎ8[*Ү>:-5z.֫0xË|Rqt#fcCLʇaj(*a!\@}({ս^U8xz|2sձ_gXڸΣ7m`8]yvnަݡvnh!7pj?|?焛dW~:~«X!.%s CU/Ce5UihAӽTT^&9L2Ay Qx -!a~( yPm(_a7A%iWU6dWZa$zOfA~qB-KP\~#-zKI?-xpb4WjV(~CR^ yz\ WI˅0 Y<Ŋ|2xF欇ć*€PaH!P*I%yxIP@\Vy@Z?b;aZFQI@TL6e~ G:N}VxGg>:Oة Юx۔e4|iŗ Q=<>\;^K=uwWo)MIENDB`segno-1.6.6/docs/_static/colorful/dark.png000066400000000000000000000011121476440322300204710ustar00rootroot00000000000000PNG  IHDR[PLTEIDATxAj@ CM/R7p䡋B7- M~>d1%Y' {3,>x5\%/UoBXR^ƓRVmCf.[ţߎ(>96J*ȧBgTN(߆@g[ Adh~0 E$ {+.L7=7ȿqJDY^çK N.g`S|ZdP0Cn5B2vN?6[M L~U.z27I}ճG{O%:XKt>!}.;=]ũ7׺>h2-4Lu3o&Z;!ǹvҟ՗ jfIj퓂)(v+od[o{لz)$s`?xK@*~t_#}Z5 |1G} EMIENDB`segno-1.6.6/docs/_static/colorful/dark_module.png000066400000000000000000000011701476440322300220420ustar00rootroot00000000000000PNG  IHDR PLTE ,?*IDATxZj1 +Grƒ|1.ʵےW^uWvfL|驏xe窧]HF+[g0g0a@UTBrdS[Fnš/ǬQaP rr^kNu)+ɘoKJw+'!>ϕj]9}R2^Ŋ;^jmz#է@QC *x .7| IKݗ2^CuRE1'ѡRuu#sClCaj(0L`=q,D>iKP/I KvKPðJ+Dz F`x p#$~X*_D쩨e_$zUѾ)ۯ#T}Xy Lq>aSA]xD00E`N+ ܆>ӇkNj\i} ^uU'IE4IENDB`segno-1.6.6/docs/_static/colorful/data_dark.png000066400000000000000000000012631476440322300214710ustar00rootroot00000000000000PNG  IHDR PLTE ,?eIDATxZJ@ dڦ ""B`'{,MnlxWU?]r//mûsU=s= ^w f ,/wkõ^;2ݮ2;*.wj=N{+2븂"6FI_ӓЊfזFXtU+ (|kg$6k ᎨB[Ce|+;0`׽[E&dM: HUFwHIt k13i9bv79ٱkcǔnppK7''ʡ WZJW&R_PC~aLI:X uֿ|nG"GHN<,Q˱`]`֗KIqYzO̓kȝXެ/_^(ą4v#^9GAvQz~TX!f|hKvhH}0_.즛_ t*W]1!㞆0cGL;Vz#+z  LfK4R33_k?E+!fsŠW-i~ejP3?|@zٱe|rp:3}~RQC7δW6롇#v;fچy YU)'zIENDB`segno-1.6.6/docs/_static/colorful/finder_dark.png000066400000000000000000000012111476440322300220200ustar00rootroot00000000000000PNG  IHDR PLTE ,?;IDATxZJP {|֦;wn̵MnYzvt׹ԻOZבz|%/\o\߸|1>+8ƨp]B-N ^ qAi8:rXy[`}5~C/X8]iA@c|LWxUiiqb ʹ2TUBū3a 6D pY&BwH%N!4gS_h򘢂9{F$bEZ1󾪹AnPv> nw%,(!>qZ/qpa.bN@IX~#ZY. K3}5(lk I y~|eby:b9ʈ 7;7S(>& G3jbQF3ŋ&=ΚG(41b#og3 5+L 0V1ڔS(ޘCמ['w=pzL=aKA .x3d }~cd{tW_mpp+̴y ]q(}xEIENDB`segno-1.6.6/docs/_static/colorful/finder_light.png000066400000000000000000000012011476440322300222050ustar00rootroot00000000000000PNG  IHDR PLTE ,?3IDATxZj@ >WMlKna2d%%ٗǽ^u*\u񼚧.\p~^TǫA1,T3BVE;;9!WE o T_4f/ppE ;Z]g%)68UQ:xQG,ZPJ oGU_䡢9{fID`eI%AnPv? 8J^,(!^J-q0]n#aIw|V. k飬Aa_XHe$q1p%j\>LN-tL8ްz{rD0` E<7"J5T/HKH;kDsi| Fߠx5 5 x,UL6ek _$M<m|_ip=pE-4d ~C2fs=:ͫ/k};<>\;^tL;PU?] b)J" IENDB`segno-1.6.6/docs/_static/colorful/format_dark.png000066400000000000000000000012051476440322300220440ustar00rootroot00000000000000PNG  IHDR PLTE ,?7IDATxZ0 +G}ү%ǁIvr'zf=~; |zx:>s֊kp@3&׏N?ו!4+@*8f.0^_qVbfW8lKkCL\Ň7jzvOHZ_ \h1j+Ž\XLiD|QeD El)ChC;\kaU0I5L`{KIWƓN.fA80\B-, } tubi~c磬@vV| Ia>F7Õpa\CqbEl`8ްfcCLCah(0$`98"PJE*WHKfK;Ds0\cvXP~ǫVW*7bj5)cûTHR'QTe훰J;P@EP0 0>CoHƬ0[y ߆y'ǎWr_)g3Og}CKIENDB`segno-1.6.6/docs/_static/colorful/format_light.png000066400000000000000000000011761476440322300222410ustar00rootroot00000000000000PNG  IHDR PLTE ,?0IDATxZj@ ^ymw,[8rK@mI'yV=U {Lw}Oꅋ?ϰ~zlb8p>\N7] J(\!.CuEOu|(VŋQi-u(u> gU_x}V_P>±h5y8Gh>sWR]T_reKJ"Zn!Uu:e~C(H\&i{98ݥPq t%DbVXo?RC'wh.,] ( k[/roDxM|T4(D}C.#| %Fõq2]&֣#b.^#d:*7oZM& XO"xeŋ!=G(141O;"```x=  x#,Ul6es _=]A!oVP\ORP{sH7,c1أӾ?!õT.ϴ y Y~9A:>+IENDB`segno-1.6.6/docs/_static/colorful/light.png000066400000000000000000000011071476440322300206630ustar00rootroot00000000000000PNG  IHDR[PLTEIDATxKj#@ D\K@+5"jHvgfڏ۳*U ?Ir[juo"xoW7t*;?DE?ᙟR-Q:Bh=>oh`?}+d;;ַp-xԫtAKeu"O mNA?7ۓ _cĐӯ\?ui诓~=>Ny;&ZI$~Ѥ\$h~Fltʩ.sz{Es͇#?& #P0d.D݁.S/ss@sd)c5s"Cr)g7CϫR1ǵvr?&goTL,A0XlA!(ܜt]F k׋KѸC0zu3s\|į,^{KH* ni˨e>Cn⪐J'IENDB`segno-1.6.6/docs/_static/colorful/micro_qrcode_rain.png000066400000000000000000000003321476440322300232320ustar00rootroot00000000000000PNG  IHDRTTaR PLTEFIDATxՕ10 #OiCWbpXN_ K;=॔VEak wp9>܆ ^ )4cŸkZS߬`E[U K+|wEnݷ_C'@IENDB`segno-1.6.6/docs/_static/colorful/mqr_alignment_dark.png000066400000000000000000000003301476440322300234070ustar00rootroot00000000000000PNG  IHDRTTaR PLTE ,?IDATxՕ1 x+Bqf =)"Ystri?کޜvѫcBqP,UL|'CPs馬,f07׫3o6Nz"|E*JЯi #/tIENDB`segno-1.6.6/docs/_static/colorful/mqr_alignment_light.png000066400000000000000000000003301476440322300235750ustar00rootroot00000000000000PNG  IHDRTTaR PLTE ,?IDATxՕ1 x+Bqf =)"Ystri?کޜvѫcBqP,UL|'CPs馬,f07׫3o6Nz"|E*JЯi #/tIENDB`segno-1.6.6/docs/_static/colorful/mqr_dark.png000066400000000000000000000003071476440322300213550ustar00rootroot00000000000000PNG  IHDRTT&PLTE|IDATxڵ 1 /dR䫗H ϶ f|C#V{Hoqcl''\xͨGIUofv{e? Oy[89}F˚*IENDB`segno-1.6.6/docs/_static/colorful/mqr_dark_module.png000066400000000000000000000003301476440322300227160ustar00rootroot00000000000000PNG  IHDRTTaR PLTE ,?IDATxՕ1 x+Bqf =)"Ystri?کޜvѫcBqP,UL|'CPs馬,f07׫3o6Nz"|E*JЯi #/tIENDB`segno-1.6.6/docs/_static/colorful/mqr_data_dark.png000066400000000000000000000003331476440322300223450ustar00rootroot00000000000000PNG  IHDRTTaR PLTE ,?IDATxՕ10QO&ȒUjR.USٗCez2]ܸ`Ժ J0˕^+·ڇx!ܪH k0z-+ jE E;l)W7բz]J_n^czf,IENDB`segno-1.6.6/docs/_static/colorful/mqr_data_light.png000066400000000000000000000003361476440322300225360ustar00rootroot00000000000000PNG  IHDRTTaR PLTE ,?IDATxՕA 0 +mi"lA#Ba\D—TsŅ]&0xMظv`q */~FsÝŔ Xq啫c[R,$ؖWfcf{W V֚o9\îIENDB`segno-1.6.6/docs/_static/colorful/mqr_finder_dark.png000066400000000000000000000003311476440322300227010ustar00rootroot00000000000000PNG  IHDRTTaR PLTE ,?IDATxՕ90 -+I|ѤA)Űۊ˷㗝ͭwX?;oeA顸[8=7ۥ sTͪw58:7<<<{1 oBEVZ4'޷_C7V:wIENDB`segno-1.6.6/docs/_static/colorful/mqr_finder_light.png000066400000000000000000000003311476440322300230670ustar00rootroot00000000000000PNG  IHDRTTaR PLTE ,?IDATxՕA O9h5p6CQO_^MUx7s#m,EL҃ʋCCv za9/ݧsS~ugvS~Kt.n6ЯArQ՟J0oF/C7琏dQIENDB`segno-1.6.6/docs/_static/colorful/mqr_format_dark.png000066400000000000000000000003331476440322300227240ustar00rootroot00000000000000PNG  IHDRTTaR PLTE ,?IDATxՕA '-pb2]" [iT˳rչjOfvTMc ڭT! C6Fi9š?;~1ݽ[)̯|}  & [W -ky9t\% IENDB`segno-1.6.6/docs/_static/colorful/mqr_format_light.png000066400000000000000000000003321476440322300231110ustar00rootroot00000000000000PNG  IHDRTTaR PLTE ,?IDATxՕ1 oc>W $3[h@f |*}y5NNIENDB`segno-1.6.6/docs/_static/colorful/mqr_light.png000066400000000000000000000003021476440322300215360ustar00rootroot00000000000000PNG  IHDRTT&PLTEwIDATxڵ 0Q`-v&.raY#i݁DؓGz= 5Oj7zu8X[4V}% Uw^U|TU!zsyպ#?!.r(Cs+/p{;6ceՅ)֠Ps:c OdvA=y+!ԷP@>-?oJJWMNuSR3p=q_cyr`yIENDB`segno-1.6.6/docs/_static/colorful/quiet_zone.png000066400000000000000000000011601476440322300217350ustar00rootroot00000000000000PNG  IHDR PLTE ,?"IDATxZQNP /SHCԌ:1+cz= ̬auA!(J/0ɄiD l)C _B D$}Vt(X|'azC(I\"Je{GsݥPR# n;+Yu͖ASf.3l.ŪE'`o^lb0lxmt-̱n0Hȸ2ߓ;l.sqHH˗՜D2x|#sK0>$| in/Q0,?I[́5@q~Q@>jD49jRg+L abڔ[*$'lTȂb-aƊ12_ ,1ppx'촃p=oQcIENDB`segno-1.6.6/docs/_static/colorful/separator.png000066400000000000000000000012061476440322300215540ustar00rootroot00000000000000PNG  IHDR PLTE ,?8IDATxZJP ;|MEM{ m;yV=U]{;_;o7|w\ub=tCIG?BvU +B|S ^ qaP8W+!l%&"?aWh}C[U_ D P8LWxUiƔr (J%@^Z&LF]CEsa~c"Gb}|o;' %ip-){!z<尼ԢK 򊝈.3L[wrp'HXRExıVi~c#י>I 4.71D݇2i5ܘi7^ovOS(>TG3Ąͣ4l ŋ&5G(kF1B73^B~iapNd#>̳9OKĶoW'x{0{z–@\4d ~C2fs=:ͫ/k5w8y|xѕK30|zVOH+LjIENDB`segno-1.6.6/docs/_static/colorful/timing_dark.png000066400000000000000000000012101476440322300220370ustar00rootroot00000000000000PNG  IHDR PLTE ,?:IDATxZj0 Grk8@WJ@YVXϬg3뷳_ύLOYϛ_gq1xdÂSO":݄7 JC[r@\ZN'Np6+q|(VFuUX_Qe^+-(^?¡Y]PDnd/o덗X *^ E#aybڀ~+8Jv uX5Z1ӾZsQ5J'ẵ0މދYPbC\K-K‡O갹0.W*aI;Q. 0ݨ<e X8H0b7~yTe= }Ps\Ò!:*#7o|= eoD>T-QI^hE\2-,?ʭDSiԌ&@Ax 5 +fפqwEZ7q OF~`Pz=a@\xX2~!L4o}Yo"v/S`-xII$֯+g3Og})AMIENDB`segno-1.6.6/docs/_static/colorful/timing_light.png000066400000000000000000000012071476440322300222330ustar00rootroot00000000000000PNG  IHDR PLTE ,?9IDATxZj@ ;IYӗR@tAmYe7ǺWݫU>J|.,bp/2a ";ZPuҎ\﹘r'KE$I& *^;0\/P!OEU_^V+_0Lo4%4+fڗ5{ IK,|.*v%Wfx`)Z2[V_a^X2r] JyGhcc̠p ` I}yC% ZΏ!oj5}X_~P iEGl9GA8z ˅.LL4*w3k`9ymT& v<Ƅ6Qz5]0ƆL^Bg+&CR1M)4IԾ+5U&l^(=PՓ X!V$=2P9ˌoC|'ǎWyL;oݫU 9.AIENDB`segno-1.6.6/docs/_static/colorful/version_dark.png000066400000000000000000000012001476440322300222340ustar00rootroot00000000000000PNG  IHDR PLTE ,?2IDATxZ@ G}Rf,]8eY$M2Pa[=zV=U An\7'Os +J<8&׹d f\PF}|\TN'alTkWx1ޓXP|\ÐC}#+鑊V/NΆ3[p%mP%J Mk(h9BIH\BD$r]E!ٗ %\b{98ݥPq /DbVXo'Wu^!;4.V5_t[7? L>}T4(D}C.#| %Fõq2]&_GPs]GtUFoDdŵ!60` M)W1dQe~ApE +ZUgE)6(ȋY@&5D pY:BnJ~u Ed3<`>o(wUR(IKNwKѻ!?(, ?}rͅa\3%aI;xF. G> c!Ia>Pb~#mQpaLC5qRGl9'ӡVqa}#fzŇ݄c؄F=jŋ&&ͣ|hn= SpbAHOvф7ֹe:_#\XmňmSI;|J$yUۯGxz0y)8znc"l0GyeoCp>LJcNj\=ԯ)gճOW} segno-1.6.6/docs/_static/contact/my-vcard.svg000066400000000000000000000075611476440322300211310ustar00rootroot00000000000000 segno-1.6.6/docs/_static/css/000077500000000000000000000000001476440322300160125ustar00rootroot00000000000000segno-1.6.6/docs/_static/css/custom.css000066400000000000000000000013341476440322300200370ustar00rootroot00000000000000/* override table width restrictions */ @media screen and (min-width: 767px) { .wy-table-responsive table td { /* !important prevents the common CSS stylesheets from overriding this as on RTD they are loaded after this stylesheet */ white-space: normal !important; } .wy-table-responsive { overflow: visible !important; } } .feature_yes { color: darkgreen; font-weight: bolder; } .feature_no { color: darkred; } @media (prefers-color-scheme: dark) { .feature_yes { color: #53b353 } .feature_no { color: #ff5454 } .highlight pre { background: #282a36 !important; } .highlight .go { color: #98a5f7 !important; } } segno-1.6.6/docs/_static/css/highlight.css000066400000000000000000000116321476440322300204760ustar00rootroot00000000000000/* Dracula Theme v1.2.5 * * https://github.com/zenorocha/dracula-theme * * Copyright 2016, All rights reserved * * Code licensed under the MIT license * http://zenorocha.mit-license.org * * @author Rob G * @author Chris Bracco * @author Zeno Rocha */ @media (prefers-color-scheme: dark) { .highlight .hll { background-color: #f1fa8c } .highlight { background: #282a36; color: #f8f8f2 } .highlight .c { color: #6272a4 } /* Comment */ .highlight .err { color: #f8f8f2 } /* Error */ .highlight .g { color: #f8f8f2 } /* Generic */ .highlight .k { color: #ff79c6 } /* Keyword */ .highlight .l { color: #f8f8f2 } /* Literal */ .highlight .n { color: #f8f8f2 } /* Name */ .highlight .o { color: #ff79c6 } /* Operator */ .highlight .x { color: #f8f8f2 } /* Other */ .highlight .p { color: #f8f8f2 } /* Punctuation */ .highlight .ch { color: #6272a4 } /* Comment.Hashbang */ .highlight .cm { color: #6272a4 } /* Comment.Multiline */ .highlight .cp { color: #ff79c6 } /* Comment.Preproc */ .highlight .cpf { color: #6272a4 } /* Comment.PreprocFile */ .highlight .c1 { color: #6272a4 } /* Comment.Single */ .highlight .cs { color: #6272a4 } /* Comment.Special */ .highlight .gd { color: #8b080b } /* Generic.Deleted */ .highlight .ge { color: #f8f8f2; text-decoration: underline } /* Generic.Emph */ .highlight .gr { color: #f8f8f2 } /* Generic.Error */ .highlight .gh { color: #f8f8f2; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #f8f8f2; font-weight: bold } /* Generic.Inserted */ .highlight .go { color: #44475a } /* Generic.Output */ .highlight .gp { color: #f8f8f2 } /* Generic.Prompt */ .highlight .gs { color: #f8f8f2 } /* Generic.Strong */ .highlight .gu { color: #f8f8f2; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #f8f8f2 } /* Generic.Traceback */ .highlight .kc { color: #ff79c6 } /* Keyword.Constant */ .highlight .kd { color: #8be9fd; font-style: italic } /* Keyword.Declaration */ .highlight .kn { color: #ff79c6 } /* Keyword.Namespace */ .highlight .kp { color: #ff79c6 } /* Keyword.Pseudo */ .highlight .kr { color: #ff79c6 } /* Keyword.Reserved */ .highlight .kt { color: #8be9fd } /* Keyword.Type */ .highlight .ld { color: #f8f8f2 } /* Literal.Date */ .highlight .m { color: #bd93f9 } /* Literal.Number */ .highlight .s { color: #f1fa8c } /* Literal.String */ .highlight .na { color: #50fa7b } /* Name.Attribute */ .highlight .nb { color: #8be9fd; font-style: italic } /* Name.Builtin */ .highlight .nc { color: #50fa7b } /* Name.Class */ .highlight .no { color: #f8f8f2 } /* Name.Constant */ .highlight .nd { color: #f8f8f2 } /* Name.Decorator */ .highlight .ni { color: #f8f8f2 } /* Name.Entity */ .highlight .ne { color: #f8f8f2 } /* Name.Exception */ .highlight .nf { color: #50fa7b } /* Name.Function */ .highlight .nl { color: #8be9fd; font-style: italic } /* Name.Label */ .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ .highlight .nx { color: #f8f8f2 } /* Name.Other */ .highlight .py { color: #f8f8f2 } /* Name.Property */ .highlight .nt { color: #ff79c6 } /* Name.Tag */ .highlight .nv { color: #8be9fd; font-style: italic } /* Name.Variable */ .highlight .ow { color: #ff79c6 } /* Operator.Word */ .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ .highlight .mb { color: #bd93f9 } /* Literal.Number.Bin */ .highlight .mf { color: #bd93f9 } /* Literal.Number.Float */ .highlight .mh { color: #bd93f9 } /* Literal.Number.Hex */ .highlight .mi { color: #bd93f9 } /* Literal.Number.Integer */ .highlight .mo { color: #bd93f9 } /* Literal.Number.Oct */ .highlight .sa { color: #f1fa8c } /* Literal.String.Affix */ .highlight .sb { color: #f1fa8c } /* Literal.String.Backtick */ .highlight .sc { color: #f1fa8c } /* Literal.String.Char */ .highlight .dl { color: #f1fa8c } /* Literal.String.Delimiter */ .highlight .sd { color: #f1fa8c } /* Literal.String.Doc */ .highlight .s2 { color: #f1fa8c } /* Literal.String.Double */ .highlight .se { color: #f1fa8c } /* Literal.String.Escape */ .highlight .sh { color: #f1fa8c } /* Literal.String.Heredoc */ .highlight .si { color: #f1fa8c } /* Literal.String.Interpol */ .highlight .sx { color: #f1fa8c } /* Literal.String.Other */ .highlight .sr { color: #f1fa8c } /* Literal.String.Regex */ .highlight .s1 { color: #f1fa8c } /* Literal.String.Single */ .highlight .ss { color: #f1fa8c } /* Literal.String.Symbol */ .highlight .bp { color: #f8f8f2; font-style: italic } /* Name.Builtin.Pseudo */ .highlight .fm { color: #50fa7b } /* Name.Function.Magic */ .highlight .vc { color: #8be9fd; font-style: italic } /* Name.Variable.Class */ .highlight .vg { color: #8be9fd; font-style: italic } /* Name.Variable.Global */ .highlight .vi { color: #8be9fd; font-style: italic } /* Name.Variable.Instance */ .highlight .vm { color: #8be9fd; font-style: italic } /* Name.Variable.Magic */ .highlight .il { color: #bd93f9 } /* Literal.Number.Integer.Long */ } segno-1.6.6/docs/_static/css/rtd_dark.css000066400000000000000000000042211476440322300203150ustar00rootroot00000000000000/*! * @name Readthedocs * @namespace http://userstyles.org * @description Styles the documentation pages hosted on Readthedocs.io * @author Anthony Post * @homepage https://userstyles.org/styles/142968 * @version 0.20170529055029 * * Modified by Aloïs Dreyfus: 20200527-1037 * Modified by Erik Kalkoken: 20220615 */ @media (prefers-color-scheme: dark) { a:visited { color: #bf84d8; } pre { background-color: #2d2d2d !important; } .wy-nav-content { background: #3c3c3c; color: aliceblue; } .method dt, .class dt, .data dt, .attribute dt, .function dt, .descclassname, .descname { background-color: #525252 !important; color: white !important; } .toc-backref { color: grey !important; } code.literal { background-color: #2d2d2d !important; border: 1px solid #6d6d6d !important; } .wy-nav-content-wrap { background-color: rgba(0, 0, 0, 0.6) !important; } .sidebar { background-color: #191919 !important; } .sidebar-title { background-color: #2b2b2b !important; } .xref, .py-meth { color: #7ec3e6 !important; } .admonition, .note { background-color: #2d2d2d !important; } .wy-side-nav-search { background-color: inherit; border-bottom: 1px solid #fcfcfc; } .wy-table thead, .rst-content table.docutils thead, .rst-content table.field-list thead { background-color: #b9b9b9; } .wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { border: solid 2px #e1e4e5; } .wy-table thead p, .rst-content table.docutils thead p, .rst-content table.field-list thead p { margin: 0; } .wy-table-odd td, .wy-table-striped tr:nth-child(2n-1) td, .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { background-color: #343131; } .highlight .m { color: inherit } /* Literal.Number */ .highlight .nv { color: #3a7ca8 } /* Name.Variable */ body { text-align: justify; } .rst-content .section .admonition ul { margin-bottom: 0; } li.toctree-l1 { margin-top: 5px; margin-bottom: 5px; } .wy-menu-vertical li code { color: #E74C3C; } .wy-menu-vertical .xref { color: #2980B9 !important; } }segno-1.6.6/docs/_static/data_mask_mqr_0.svg000066400000000000000000000011501476440322300207620ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_mqr_1.svg000066400000000000000000000012071476440322300207660ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_mqr_2.svg000066400000000000000000000011741476440322300207720ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_mqr_3.svg000066400000000000000000000012011476440322300207620ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_qr_0.svg000066400000000000000000000016721476440322300206160ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_qr_1.svg000066400000000000000000000016721476440322300206170ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_qr_2.svg000066400000000000000000000017051476440322300206150ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_qr_3.svg000066400000000000000000000016631476440322300206210ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_qr_4.svg000066400000000000000000000016711476440322300206210ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_qr_5.svg000066400000000000000000000016631476440322300206230ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_qr_6.svg000066400000000000000000000016331476440322300206210ustar00rootroot00000000000000 segno-1.6.6/docs/_static/data_mask_qr_7.svg000066400000000000000000000016561476440322300206270ustar00rootroot00000000000000 segno-1.6.6/docs/_static/epc/000077500000000000000000000000001476440322300157715ustar00rootroot00000000000000segno-1.6.6/docs/_static/epc/spende-wikipedia.png000066400000000000000000000010361476440322300217210ustar00rootroot00000000000000PNG  IHDRIDATxV10{lt3k˕R\#R.]fES Hy菫?eK~^z&zX{Kα[Z!cͲYHD_`v5yEezy祸36U>1gv@/1ܙX2fqu?VhwYX;C,f^MPփ?FxgiZ+rgƼϨw܍7M@0˜ 2'WѤܼNnGPg)GN96^Ϋ a'v$v`%.s;X =XZcb{9"pGbRnglpJ&\ LAfl\dXxܼHE G%{Be]QFw݋Tpxn{+ ﯊@8ӽbB]yQF>?H}oglIENDB`segno-1.6.6/docs/_static/epc/spende-wikipedia2.png000066400000000000000000000010341476440322300220010ustar00rootroot00000000000000PNG  IHDRIDATxV;0lց3+ s3_Ò/Y^6 w-3HEq.W { wrw/yL춶j8]S324,3]8$Y|Y!WcUfxO&E<~_I26h>s#rέHp^; d2U˜Pu=x !ND*U5`i_t܌@y{8,VKK#vu'؅dRf-"hTQ93GrUuZ8^]^>$r<%!SlR !1~8٬I2\ځ}#** [ĭ9+wbbUC!ups9;];v@pE8'*^X,pϠzj bg4q G}X;x?*^fW5vMƽ?BXbՃF? / V`;."G3BrqoTpƃIENDB`segno-1.6.6/docs/_static/geo/000077500000000000000000000000001476440322300157745ustar00rootroot00000000000000segno-1.6.6/docs/_static/geo/geo_data.png000066400000000000000000000005601476440322300202460ustar00rootroot00000000000000PNG  IHDR1θ7IDATx11 C=\n,͟)M[s>,o;3O-Gk\cqF22-;>=\HjPY=;!{Ԭo^E=VG}܁f:fM_Z ߵ:T k̽h3ЅNy mA`45΅;Wli/ݚ L%aN EU4P䋀9@|Taڛon޼FE2[Ғ$"zQ[>'m\Gf &.@ֱ"ZеCtnnIKЇ)eDϑ a{̀w5UȇӳGَCc١0Κ+yoIENDB`segno-1.6.6/docs/_static/iso_fig1_1m.png000066400000000000000000000003511476440322300200240ustar00rootroot00000000000000PNG  IHDRKK5GGIDATxڥ 0 _i9 긒 R:a 8] \$H/B']+~l+ GzZŭ ǀ93`vyш^tLl"ˢ}jp_,S܎Akۮ @4Pעd@v|4;y7oR0 VY4MJٿFK jIENDB`segno-1.6.6/docs/_static/iso_fig1_1m_mask4.png000066400000000000000000000003701476440322300211240ustar00rootroot00000000000000PNG  IHDRKKPLTEѮ{IDATxڥ E.,X JX)@ Gi+_q;3>gTDA4E`[4A&)ĢEA`e K6v h۵_eL˦:C{w<"9$u)0)7Ԗ~IENDB`segno-1.6.6/docs/_static/iso_fig1_1m_pyqr.png000066400000000000000000000003511476440322300210770ustar00rootroot00000000000000PNG  IHDR??mPLTE'IDATxu ! E} ;V-d.k %:Ǒ芏+:j z=WUvd=/5fb%l'Nh~skt4ˎ{"@3U8a,?kFihy01.~ʱ_zH] gIENDB`segno-1.6.6/docs/_static/iso_fig1_1m_qrcode.png000066400000000000000000000003511476440322300213610ustar00rootroot00000000000000PNG  IHDR??mPLTE'IDATxu E[ R֠c%&@I8RtJ\ $rH2^tZyx9)0Q HxinϗKG\Ty]'R'l j:tl|Ty(^ ;vc1N\uW2IENDB`segno-1.6.6/docs/_static/iso_fig1_1m_segno.png000066400000000000000000000003731476440322300212230ustar00rootroot00000000000000PNG  IHDRKKPLTEdkNPIDATxڥ 0 _i9 긒 R:a 8] \$H/B']+~l+ GzZŭ ǀ93`vyш^tLl"ˢ}jp_,S܎Akۮ @4Pעd@v|4;y7oR0 VY4MJٿFK jIENDB`segno-1.6.6/docs/_static/iso_fig2_m2l.png000066400000000000000000000002351476440322300202030ustar00rootroot00000000000000PNG  IHDR33 dIDATxc000OFl8ر0n~=6srm#6s`3qb`E?챩?{HgņWMIENDB`segno-1.6.6/docs/_static/iso_fig2_m2l_segno.png000066400000000000000000000002571476440322300214020ustar00rootroot00000000000000PNG  IHDR33oiPLTEdkNPdIDATxc000OFl8ر0n~=6srm#6s`3qb`E?챩?{HgņWMIENDB`segno-1.6.6/docs/_static/js/000077500000000000000000000000001476440322300156365ustar00rootroot00000000000000segno-1.6.6/docs/_static/js/custom.js000066400000000000000000000011131476440322300175020ustar00rootroot00000000000000document.addEventListener('DOMContentLoaded', function(){ var x = document.getElementsByClassName("pylib-comparison"); if (x.length == 1) { feature_table = x[0]; var cells = feature_table.getElementsByTagName("td"); for (var i = 0; i < cells.length; i++) { var content = cells[i].innerHTML; if (content.includes("Yes")) { cells[i].classList.add('feature_yes') } else if (content.includes("No")) { cells[i].classList.add('feature_no') } } } }, false); segno-1.6.6/docs/_static/light-my-fire-1-m.png000066400000000000000000000003201476440322300207700ustar00rootroot00000000000000PNG  IHDRtt|+IDATx 0 -[zb/$I0N/y50;O"oĤZ|bZ??>~z Sh)^3 #7^oz-?>Ǐ6,Ģ?nۋ)0IENDB`segno-1.6.6/docs/_static/light-my-fire-m4-m.png000066400000000000000000000002601476440322300211530ustar00rootroot00000000000000PNG  IHDRTT4-lwIDATxڵS 0 B}j2S%X$(gnYoI;}!n }?}?'J~7 L RJIENDB`segno-1.6.6/docs/_static/modes/000077500000000000000000000000001476440322300163315ustar00rootroot00000000000000segno-1.6.6/docs/_static/modes/64-micro.png000066400000000000000000000002111476440322300203710ustar00rootroot00000000000000PNG  IHDR--a7PIDATxc?00`b(L=` #ATc1JfB\|#>?Nbgn&l՟ϥIENDB`segno-1.6.6/docs/_static/modes/64.png000066400000000000000000000003421476440322300172670ustar00rootroot00000000000000PNG  IHDRWWYIDATxS 0 <$d^CVi ^@TbN*2bq N1 6q3r"Dvo4tNPg5g铃it0,j>ym[ܽE|Նe9oyiZΦéC}+JgY}JgHIENDB`segno-1.6.6/docs/_static/modes/REVOLUTION9-micro.png000066400000000000000000000003121476440322300217410ustar00rootroot00000000000000PNG  IHDR??$-rIDATxڝ 0 Dq2 Rm/qZ TbHu*VG#{WOM|V/|۠-z;N.lFRM'vca _̵(,&s- qrפkPO@]Z ]ap]הIENDB`segno-1.6.6/docs/_static/modes/REVOLUTION9.png000066400000000000000000000003561476440322300206420ustar00rootroot00000000000000PNG  IHDRWWYIDATx͓ 0 qY@`畬 <:a X A "qW,$)E}5`t[H~eI>_,LH-KT'L'郅4UIU5O61%d"[a֩%g1~MGp&3 : *Y~UGuIB4PS&1g>imxrgmgKzB @O^f^ϨIENDB`segno-1.6.6/docs/_static/modes/hanzi-hanzi.png000066400000000000000000000003521476440322300212570ustar00rootroot00000000000000PNG  IHDRWWYIDATx͓ E}G&@b :VJe׈_$Wm\/KM>qO5ŦfAӔjƠG\W-1$  ޲55zC'b9bsJLτ2U(\wCAZ^VwIENDB`segno-1.6.6/docs/_static/modes/kanji-micro.png000066400000000000000000000002671476440322300212470ustar00rootroot00000000000000PNG  IHDR99c(~IDATxڕ 0 (D$.+ JtQ!K'e3 v\OUS%竃"f4˧h Bt&}jt(PJ*ȅ9$ IENDB`segno-1.6.6/docs/_static/modes/kanji-qrcode.png000066400000000000000000000003421476440322300214050ustar00rootroot00000000000000PNG  IHDRWWYIDATx͓ ϟ`6ђiwDF̸0q)Aw'x_)v2Q40Is&2Fڑ%NctdosYS$̖W43 D$|=FNgڰQR;իezY/uJy ~|J0IENDB`segno-1.6.6/docs/_static/modes/let-it-be.png000066400000000000000000000002571476440322300206250ustar00rootroot00000000000000PNG  IHDR99c(vIDATxc $100o`b8OX ?0cǩ]c /|`nu53㰫::f\@ǮɊJwlIENDB`segno-1.6.6/docs/_static/modes/revolution9-byte.png000066400000000000000000000003471476440322300223030ustar00rootroot00000000000000PNG  IHDRWWYIDATx͓ DOqA,y :Vb{g%w@.T7) ;{ڀa;;XؼGhA3RӰ*b/: +8 2$6*iJnsYkZ+;NFp//޼s]gU;&rDTz^rIENDB`segno-1.6.6/docs/_static/modes/tomorrow-never-knows.png000066400000000000000000000005171476440322300232060ustar00rootroot00000000000000PNG  IHDRooʾIDATxՔm0 EPwY@`lg{%vZCu*.Is=Ӥx6Y+(]_=I:T,q08K[`5LUvD7A9Ni-颴CwlJW-O XW'=# օmϺ:e`ݶ;_ hs :QC%GbdĖBhj|Hz"y^l[wN ήLȀ4G=i6,} ~/;9 4IENDB`segno-1.6.6/docs/_static/parisienne_walkways-2-l.png000066400000000000000000000004011476440322300223720ustar00rootroot00000000000000PNG  IHDRy? IDATxV @ ]@o \ɦ g|I.DؒlD9>@o^?'roqQe Q}sm!2Mz9 N8ϧEsHqBXEzRIKu/zKxvB'FzxEu e segno-1.6.6/docs/_static/polythene-pam-03-01.png000066400000000000000000000003451476440322300211520ustar00rootroot00000000000000PNG  IHDRWWYIDATx͓ EPKke%9/`Vt"IZ *I_$tIJI^SIL| 1hGZ]GƮV\d&#JZz2M=\`Z6S{w{t`yr_rxx?2ə3yIENDB`segno-1.6.6/docs/_static/polythene-pam-03-02.png000066400000000000000000000003451476440322300211530ustar00rootroot00000000000000PNG  IHDRWWYIDATxS ! BAwY5ܱ, kDb@vH"%^~s<xyYV=*'{xƠYRU|P9߫y \q-(xK~ި I6TA+isMYAulSz"{t1e͒d"SNj ͢emg4f ju /^CӎVݻ~<8IENDB`segno-1.6.6/docs/_static/qr-heart-of-gold-error-h.png000066400000000000000000000242041476440322300223560ustar00rootroot00000000000000PNG  IHDR\0iCCPICC ProfileXYT͖  9ssrC$'( "*"* eP=[t7npS"#Cacn7D@':R Cx>ٰkaCoOEB1;A 7qr0Dx: }8}$R"X' g#,/vM6)xk,oJIN]Bc!\tT31#Vamc`&wnoX3>цȜVۗbd`d.agXBl6A1N75}8.<귝#~Ihc?:A&F"  rA0={C-K 4Cu,T-{Xqd}(}#X/&l-/_?#-(_pPHt8nj[u/akQWAlkPo)v[Q?"c윶 #bD`38ڪ1@iYA" ?fCk[wY"L#8 ͉Akr)5aͰ&X<|֡EAy!g Lc0o0qKnZL7#L~9G-VAw4+Ƞu e?smKҫf3݊̑/wMT=uՂj;&T7 o7#OoB;AtkgWwoM1/aDd5( 0_Y}dX߷yub},]p-B܊~Ȅ` aXjܖ q !oB@"PZ@ ` ;؅z CXǃ$pL @)8΂*p\c S#? A8! EHҁ!+r((ʅJ3P5t ݃B}KhA0 aXa}vwpb߀Ax/Ŋ@ɠQ([EECe QZT3gq,j Eh$>htz: ]B@w's_"#Ęc0xLsӀ;SX,+UCMwl0v6 {[Nbp8N Qp14\ 7[x>/_ķ+4 4"4444 4444OihV16L8H(&F 󴴴AhivN.1I;Fw.Ky"(J#zcLjvqL/KoNK}?g IOEJ$IOI 4 } e 73,0m/2>d|τce2feJe:4IFȆdr |<Ōec6gfd<̲68+U՜552>[:[-[?Ov.v=v? :Ae~c8ќ'9sr1siqpep]憹%p^1)ie m#¯_?'-`&+pFG`EPLY0YNAH]_(_MhNOZ8IFxXFD]$PHS䧨aFbbbb5bDq](  D ^IXRE2PL,*$uBO#!.]!\NF_&NFfBUJ6YQqN_*# L  %}J&J*K))T~BVV9ҦJUUQVR+W{άnޥ0دѢyM󋖌VEĶm6-M>=ïsZg\W@[FOHW;} `K  ? 5 5Be3;Ԙ̙1k14;nܜǼ|BbE%e+I+U5lmag=j#bnh lml_ىEݲٗO;(8$9t:=/:p2pvqwuns!pvj:&;{{vۧvH1Slwq uۓIxz]ZR*( s>>E>}|}grk , 2 * l|*gmȅPк0|Wpވ}RiQQQsTKh(zgtS 3r=;W_qwɄw&iKH:4W}>}m:`z `'ɹS\SSyRN2=TFFM{~X##AGzҕKef<ʔ,\ztThczUO`sseM̝̳λϟar"BQlxUqSpINji``AY]9wyz'OꝬ=s*/ΘQ!ZQx{6tKe9s9g_~aʡZ"&fҎK.7Ԟc˼^p5kmE72n@7n5677ݴ֬pKօ,[ w,܍;{/dgH[@}G}]Lwwjy#GUVnxGSM}Zu=3z`|`ߐЋ;}e˯q+#F1^qUx]7:~{h㛑Iɏo߮NN ~edS#?̦}bTY/z_榾R˚瘿]{ۂ؏+?39ԗ:]߭įV$֚Y][_P)Gr|2m$do΂)d7 ªp ö]f~-^HK&z̭lK\x"x B"⢷-%Ƥ¤eˣUS5j1osi]W02K3ȫr{Woр!~a9":Q1Z&4&~HkSɌ)NӒ;r*rFsfGVcgsVs B W\+m(k(vɫNixrvy "H4X]tzZ_t#rꋯmzqͯ+-۴wXrnk@ӪGn-h=U{2@X44ȆWcfU'&|y6uf:{_f>| _¿~c6>N?W=KVXWz__6#;'X 9Ox AP4#k*9C(a 8I,M8vnOpi+M]Ã3+:O/,?N_PIH_ZAQJ\OBJ, LLl"VqAiZJjy|ZLtxt AaB(]V/oTٖ8;:8upMs;vyxRB|B}}fGC##Mvҭˏk>\Yg. wCQ}ӷﴎY٦}?AM置V8{ۯ,qs;^ ?~=|lg/U_)3k1n`U(u2BCL'L\R]#d5HHBH:0`?0\?gQ$":jG͠IhUN!es aF``q.WƇiѤTB-;mm;'Qx8FMH= w3N3929nMK%ldlv"{#[G &#>OE\i_Bۄ_$։uۉIP$%3F3d4e>ʞs'˿QRTQRW-QKVjhiov1Uד0 .-Lfv'ZGlXLݜ\r]&<-w|E\+_ L ]x%G-!Ŧcw$ڳw/v_dtJ!HuƎ,ޣo?gX+-/*_9vkd_ZC_?<|];g%WZEl呺 M>-U_?%(x_PW'Nΐg1kV uXM{d@E]AM9ttz jbc;qL8O<LCJ3Gh-i4|$n)ZF .&wOf.,,Yllؓ889sppZcd> ^ ^i=.+) 1%$)%., 7&?ZҲʰQ۵̶iºSzm R 776ZXX[?rqbtvr)rqް"sObuzHQ)<6b0JZ+?on•=I5O<•z"pv:MFZlbNA._¡R'ߞ?x63UՏj/]Q:R`xcjӭw[WK=hr|'=wz=QϪm>HI] }jM[wOX/_9|_jQviJjښ/u G+)nnyQp___X__;2Gmgsaش2[,G>8<뮝xl6mqmw9ϭ\j7|ff{{J8EǠQ#BѾßQgYusu;P8csʭf^.6"F63{ްPȢ=NpN,Z΢bsLr܏flc]~g_W:_˿~Χ~5>ꍸ|o['Eوx7#;q<;oqܙÍW<'ƍr~._߉~btwxƘ|,e F\~;ʃ3Zow^Yi3^|e/:K^(o(vgS񟏗B4#b_kQ~Gx+ߎ ` |qZD,߈^t޸{wn|7nq;wX(w0n-/DfDۿO :qnlv[w~>t{( .bFaz6>[?܌?h|8Gjpῼwȥ#;3q6ǟ4k7"O|oq'.LJN~q-"B=hC `ŠA^vSvfe^/(7|.eYnw÷7.V]fYd9zIϩoяgrg;w zrW-]se+"AmN'i֣aQ^Q{pe9d^ul6 qڹ>/i5VsL`LCV../Ec;~?[jFl5Zl6v!o=/}8^tggE˸\BM U: >Y8.}$ < < x@x@x@xx@d\b< << << < < LY}GL9XwW< < ?Y3 hUO`u6~Ns< < < @L@]/ezV<︂x@x@x3M1ϪO< < < 49ƴ2.LW< < 0MgU}q< < < c2Mf}׬z[S겞︂x@x@xirUOb>4>w\< < <pn-X3Ș6PuUxx@xx@xs9M.Sf}ӬOs~[]Vp< < < irnY_U|>m֧N xx@xx@x@`-X3ӥf}[]\< < <L;Ӻv]5>~>^<'@x@@x@ja.U=%jU==.ǡuT׳ x@@x@x@4LU|u9g} x@@x@8,U)Q>j֧qݴJ\<< < <0&W`UOqYVT8W< < s9MzgS6o߷ x@@x@x@4=qL7~}dپ>S\< < <p,LQ:|3 xx@xx@ir˴YU){Ӯb=z x@x@x@3dSiVuϪU=5m֏{]$B x@@x@@x@#&05l.YW< < 34 T0ݦ5t>\< < Ԙir`jU/@W< < 3m.əj,/\W < < < [x@xx@xx@x@@x@@x@x@x@p!"2+x@xx@xx@xཁrUWy0rceIENDB`segno-1.6.6/docs/_static/qr-heart-of-gold-error-l.png000066400000000000000000000232061476440322300223630ustar00rootroot00000000000000PNG  IHDRio0iCCPICC ProfileXYT͖  9ssrC$'( "*"* eP=[t7npS"#Cacn7D@':R Cx>ٰkaCoOEB1;A 7qr0Dx: }8}$R"X' g#,/vM6)xk,oJIN]Bc!\tT31#Vamc`&wnoX3>цȜVۗbd`d.agXBl6A1N75}8.<귝#~Ihc?:A&F"  rA0={C-K 4Cu,T-{Xqd}(}#X/&l-/_?#-(_pPHt8nj[u/akQWAlkPo)v[Q?"c윶 #bD`38ڪ1@iYA" ?fCk[wY"L#8 ͉Akr)5aͰ&X<|֡EAy!g Lc0o0qKnZL7#L~9G-VAw4+Ƞu e?smKҫf3݊̑/wMT=uՂj;&T7 o7#OoB;AtkgWwoM1/aDd5( 0_Y}dX߷yub},]p-B܊~Ȅ` aXjܖ q !oB@"PZ@ ` ;؅z CXǃ$pL @)8΂*p\c S#? A8! EHҁ!+r((ʅJ3P5t ݃B}KhA0 aXa}vwpb߀Ax/Ŋ@ɠQ([EECe QZT3gq,j Eh$>htz: ]B@w's_"#Ęc0xLsӀ;SX,+UCMwl0v6 {[Nbp8N Qp14\ 7[x>/_ķ+4 4"4444 4444OihV16L8H(&F 󴴴AhivN.1I;Fw.Ky"(J#zcLjvqL/KoNK}?g IOEJ$IOI 4 } e 73,0m/2>d|τce2feJe:4IFȆdr |<Ōec6gfd<̲68+U՜552>[:[-[?Ov.v=v? :Ae~c8ќ'9sr1siqpep]憹%p^1)ie m#¯_?'-`&+pFG`EPLY0YNAH]_(_MhNOZ8IFxXFD]$PHS䧨aFbbbb5bDq](  D ^IXRE2PL,*$uBO#!.]!\NF_&NFfBUJ6YQqN_*# L  %}J&J*K))T~BVV9ҦJUUQVR+W{άnޥ0دѢyM󋖌VEĶm6-M>=ïsZg\W@[FOHW;} `K  ? 5 5Be3;Ԙ̙1k14;nܜǼ|BbE%e+I+U5lmag=j#bnh lml_ىEݲٗO;(8$9t:=/:p2pvqwuns!pvj:&;{{vۧvH1Slwq uۓIxz]ZR*( s>>E>}|}grk , 2 * l|*gmȅPк0|Wpވ}RiQQQsTKh(zgtS 3r=;W_qwɄw&iKH:4W}>}m:`z `'ɹS\SSyRN2=TFFM{~X##AGzҕKef<ʔ,\ztThczUO`sseM̝̳λϟar"BQlxUqSpINji``AY]9wyz'OꝬ=s*/ΘQ!ZQx{6tKe9s9g_~aʡZ"&fҎK.7Ԟc˼^p5kmE72n@7n5677ݴ֬pKօ,[ w,܍;{/dgH[@}G}]Lwwjy#GUVnxGSM}Zu=3z`|`ߐЋ;}e˯q+#F1^qUx]7:~{h㛑Iɏo߮NN ~edS#?̦}bTY/z_榾R˚瘿]{ۂ؏+?39ԗ:]߭įV$֚Y][_P)Gr|2m$do΂)d7 ªp ö]f~-^HK&z̭lK\x"x B"⢷-%Ƥ¤eˣUS5j1osi]W02K3ȫr{Woр!~a9":Q1Z&4&~HkSɌ)NӒ;r*rFsfGVcgsVs B W\+m(k(vɫNixrvy "H4X]tzZ_t#rꋯmzqͯ+-۴wXrnk@ӪGn-h=U{2@X44ȆWcfU'&|y6uf:{_f>| _¿~c6>N?W=KVXWz__6#;'X 9Ox AP4#k*9C(a 8I,M8vnOpi+M]Ã3+:O/,?N_PIH_ZAQJ\OBJ, LLl"VqAiZJjy|ZLtxt AaB(]V/oTٖ8;:8upMs;vyxRB|B}}fGC##Mvҭˏk>\Yg. wCQ}ӷﴎY٦}?AM置V8{ۯ,qs;^ ?~=|lg/U_)3k1n`U(u2BCL'L\R]#d5HHBH:0`?0\?gQ$":jG͠IhUN!es aF``q.WƇiѤTB-;mm;'Qx8FMH= w3N3929nMK%ldlv"{#[G &#>OE\i_Bۄ_$։uۉIP$%3F3d4e>ʞs'˿QRTQRW-QKVjhiov1Uד0 .-Lfv'ZGlXLݜ\r]&<-w|E\+_ L ]x%G-!Ŧcw$ڳw/v_dtJ!HuƎ,ޣo?gX+-/*_9vkd_ZC_?<|];g%WZEl呺 M>-U_?%(x_PW'Nΐg1kV uXM{d@E]AM9ttz jbc;qL8O<LCJ3Gh-i4|$n)ZF .&wOf.,,Yllؓ889sppZcd> ^ ^i=.+) 1%$)%., 7&?ZҲʰQ۵̶iºSzm R 776ZXX[?rqbtvr)rqް"sObuzHQ)<6b0JZ+?on•=I5O<•z"pv:MFZlbNA._¡R'ߞ?x63UՏj/]Q:R`xcjӭw[WK=hr|'=wz=QϪm>HI] }jM[wOX/_9|_jQviJjښ/u G+)nnyQp___X__;2Gmgsaٌzm\jJ'WnVk\]`jnMEz)ꝔRJ+5ZYJEI(K|LKk[i}q[oalzZm_s4S^45;iuRھX5:ݔz+6VҷI߼9#"⭸77q\G˧/2zZԞt4qwcÿ.]scDㅟ]7w:T6i}i5fc?xoys |w,X<|ގ^3:YQ~ Ǿx-atחǻy7bm?܇D01kK_ƕke#ҵ#x.7cT1(ƼUMUimaZ=k[L4LZDz+ik"jimRFʊZZ?YkcKܿո>HE3ִ^;j8x;RRJi8myhk]!jiam+CǹwrRVHOq3yYbkn7F=Gč76nmߐ_܏53|=h,G^H/pG^c\j8WԊw>7"?oFDš}Q;;;b=S+bEdE\Uvw8~B| ԡ^(n2N8noFy/|u=E^Կ~gj Ty{))lӇvJbzA*Fw$۽sh(RᡟO4Kki8`0Hcc5V[AQa" [?g[{Ұ~k z)^blߎhq ROͅfj7kRպkf|q94 w=SȹRsa!5S_LF͓fM6v{{GVt{4_5l͈zE{8{gѺu w3C#"%}g^33g,C01|'f 0Afgff\3 T+{et>031111111111115GʪevQx}g!!!!!!!!!!!!!U+JPWUŤ_ @ @ @ @ @ @ @ @ @ @ @ @ jSevQqf !@ @ @ @ @ @ @ @ @ `JYv 111111111)eՊtΆ" @ @ @ @ @ @ @ @ @ @ @ @ Lj}8 ']-u7.DU+Nzө.|3CCC 0rՊ&P;|Lx13111111111111 2kODUߤ_e_ @ @ @ @ @ @ @ @ @ @ @ @ tV8&>Ϊ`Ճ1.Uy>`fbbbbbbbbbbbb'6VT'}Dž1U~ @ @ @ @ @ @ @ @ @ @ @ @ `MVK0eIeW)8}]cfbbbbbbbbbbbbǘU+~UI_^-*סU2EUg 3CCCCCCCCCCCCC(TZQU&W7gy\>afbbbbbbbbbbbboϫU@r^*3CCCCCCCCCCCCC8#ZQ }2U9NԘijjS'^*bՑ!!!!!!!!!!!!!X1Te*f 0ZQ~6tՃ_UVgf PqVeJ?վeQq)U9 @ @ @ @ @ @ @ @ @ @ @ @ tSjWw&8'f GǙ#!!!!!!!!!!!!!!!!!!!!Lk{4vIENDB`segno-1.6.6/docs/_static/rain-1-h.png000066400000000000000000000003141476440322300172420ustar00rootroot00000000000000PNG  IHDRtt|+IDATxUA "@K~A<ژTFV}k%444\E|\30{[A7׈QK76g|//ݾC&+8`#riՄy/':.=IENDB`segno-1.6.6/docs/_static/rain-m3-m.png000066400000000000000000000002351476440322300174300ustar00rootroot00000000000000PNG  IHDRLLldIDATxڵ Cp-B m@B4/XߎjC7Guu7 r7 ;7B PwE4jwOqLIENDB`segno-1.6.6/docs/_static/sa/000077500000000000000000000000001476440322300156255ustar00rootroot00000000000000segno-1.6.6/docs/_static/sa/structured_append_1_l-02-01.svg000066400000000000000000000016311476440322300232720ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sa/structured_append_1_l-02-02.svg000066400000000000000000000016631476440322300233000ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sa/structured_append_2_l.svg000066400000000000000000000023411476440322300226350ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sa/structured_append_example_2_2-L-04-01.svg000066400000000000000000000024141476440322300251070ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sa/structured_append_example_2_2-L-04-02.svg000066400000000000000000000024571476440322300251170ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sa/structured_append_example_2_2-L-04-03.svg000066400000000000000000000024051476440322300251110ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sa/structured_append_example_2_2-L-04-04.svg000066400000000000000000000023771476440322300251220ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sa/structured_append_example_2_6-L.svg000066400000000000000000000055351476440322300244630ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sgt-peppers-dark_0000ffcc.png000066400000000000000000000005241476440322300224020ustar00rootroot00000000000000PNG  IHDROPLTE{ܙ,tRNS4VIDATx1C1C^ߒP?ҭKx,RP q-Zo$GUǧw+FqLυȩ>iO'ue"/<4t=?s*=+@Yt.}}^3TF/Qƶh8196s/^$]L*+-a9+/k~?j032[d7g~<ŜX/X!~ױj=0wO>VIENDB`segno-1.6.6/docs/_static/sgt-peppers-dark_00fc.svg000066400000000000000000000030551476440322300217460ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sgt-peppers-dark_685e5c.svg000066400000000000000000000030331476440322300221310ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sgt-peppers-dark_890117.svg000066400000000000000000000030331476440322300217630ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sgt-peppers-dark_darkred-light_lightblue.svg000066400000000000000000000031141476440322300257720ustar00rootroot00000000000000 segno-1.6.6/docs/_static/sgt-peppers-dark_transparent-light_black.png000066400000000000000000000005011476440322300257760ustar00rootroot00000000000000PNG  IHDR]G=ytRNSIDATxUэC1 o8'5|֪j1|$QuGerc xnMq < Gz"S}&Cu~Kϱ01T.~59+{۽ƻ ;5vaT4oXǍ={wbo4؊?Ҟl1Id-,ˆ ݚTyse;OiO'ue"/<4t=?s*=+@Yt.}}^3TF/Qƶh8196s/^$]L*+-a9+/k~?j032[d7g~<ŜX/X!~ױj=0wO>VIENDB`segno-1.6.6/docs/_static/svg/000077500000000000000000000000001476440322300160215ustar00rootroot00000000000000segno-1.6.6/docs/_static/svg/penny-lane-optimized.svg000066400000000000000000000020471476440322300226150ustar00rootroot00000000000000segno-1.6.6/docs/_static/svg/penny-lane.svg000066400000000000000000000022511476440322300206100ustar00rootroot00000000000000 segno-1.6.6/docs/_static/the-beatles-1-q-scale-1-unit-cm.svg000066400000000000000000000016571476440322300233420ustar00rootroot00000000000000 segno-1.6.6/docs/_static/the-beatles-1-q-scale-1.png000066400000000000000000000002441476440322300217440ustar00rootroot00000000000000PNG  IHDR~ZkIDATxc4⃌C{ _bD߯>ey/&K+>TR÷@/HuY2eP]v b #U߼`AIENDB`segno-1.6.6/docs/_static/the-beatles-1-q-scale-10-unit-mm.svg000066400000000000000000000017111476440322300234230ustar00rootroot00000000000000 segno-1.6.6/docs/_static/the-beatles-1-q-scale-10.png000066400000000000000000000005121476440322300220220ustar00rootroot00000000000000PNG  IHDR""uIDATx;0DW8W|$ǻ@LL#*TP ڼ^=T/3P}q-ξ>?ʾ=x `/d??ث>f佒9sm(d-͎Y w[>f |9_o='zc'sd3ܾngN zN7?a^򰱻{~N W2G>dղ_wa/ ӿUv`/*TSGIENDB`segno-1.6.6/docs/_static/the-beatles-1-q-scale-2.4.svg000066400000000000000000000016621476440322300221270ustar00rootroot00000000000000 segno-1.6.6/docs/_static/the-beatles-1-q.png000066400000000000000000000003211476440322300205150ustar00rootroot00000000000000PNG  IHDRtt|+IDATx 0 -[z`>[>8N"0%wWЅ;gYry$~[ֆ܏`n|~c/Bg l ?WO)d?Vx,!֏~3QŕC߷H]3wBXq[LIA%IENDB`segno-1.6.6/docs/_static/the-beatles.png000066400000000000000000000002441476440322300201250ustar00rootroot00000000000000PNG  IHDR~ZkIDATxc4⃌C{ _bD߯>ey/&K+>TR÷@/HuY2eP]v b #U߼`AIENDB`segno-1.6.6/docs/_static/tomorrow-never-knows-2-q.png000066400000000000000000000003771476440322300225000ustar00rootroot00000000000000PNG  IHDRy? IDATxVA @ Mt/[(@CJч @55 ?8ƕpJMT$8j1^QB}lDon㰭OB !±:l-Xn>]Cԗ u-V0ZþX8̳. D==dC_G3}/[+8| ^n-wGIENDB`segno-1.6.6/docs/_static/vampire-blues-m4-m-border-10.png000066400000000000000000000003001476440322300227350ustar00rootroot00000000000000PNG  IHDR]G=yIDATx핱 D1 C-:;ixHBز(J-'ƿܣ:F(.z\PQ=iV|D8s~[7~۽z',g3-wq_]GKIENDB`segno-1.6.6/docs/_static/vampire-blues-m4-m-no-border.svg000066400000000000000000000013441476440322300231550ustar00rootroot00000000000000 segno-1.6.6/docs/_static/wifi/000077500000000000000000000000001476440322300161605ustar00rootroot00000000000000segno-1.6.6/docs/_static/wifi/wifi_data.png000066400000000000000000000005511476440322300206160ustar00rootroot00000000000000PNG  IHDR1θ0IDATxW;A BKnx*͓H+Rv@,Ɵ~wۻ0/| w#}hbK9m\!N7$nk '.(T͇෗ż0[8^Bp-t*BT"^{va-] Q73{$q8Ψ-{{$j;3JhάQsGuߡ0nE5?]u+u׸IENDB`segno-1.6.6/docs/_static/wifi/wifi_default.png000066400000000000000000000004631476440322300213330ustar00rootroot00000000000000PNG  IHDR]G=yIDATxV0uRP W>mg|C@ox~P޻; FPzs5IpO$H\kE$Z  Z|ɩ1%D8zquβc 7pi^#z:=ŀF6^05;_hόEuwDKۼoV_[A'6gI?'ҙFO y$sIENDB`segno-1.6.6/docs/api.rst000066400000000000000000000003231476440322300150750ustar00rootroot00000000000000API === Module contents --------------- .. automodule:: segno :member-order: bysource :members: High level QR Code factories ---------------------------- .. automodule:: segno.helpers :members: segno-1.6.6/docs/artistic-qrcodes.rst000066400000000000000000000106021476440322300176050ustar00rootroot00000000000000Artistic QR Codes ================= Segno focuses on creating (Micro) QR codes and offers many :ref:`output formats ` without additional dependencies on other libraries. Advanced graphic operations require the `qrcode-artistic `_ plug-in, which in turn depends on the `Pillow `_ library. The plugin can be used to create animated QR codes or static QR codes with a background image. To install the plugin, use:: pip install qrcode-artistic After that, every QR code created with :py:func:`segno.make`, :py:func:`segno.make_qr` and :py:func:`segno.make_micro` provide two additional methods "to_pil" and "to_artistic". The former returns a Pillow `Image `_ instance, which can be used for further manipulations (e.g. rotating the QR code). .. code-block:: python >>> import segno >>> qrcode = segno.make('Yellow Submarine', error='h') >>> img = qrcode.to_pil(scale=3).rotate(45, expand=True) >>> img.save('yellow-submarine-rotated.png') .. image:: _static/artistic/yellow-submarine-rotated.png :alt: Colorful 3-H QR code encoding "Yellow Submarine" rotated by 45° The "to_pil" method provides all options of :doc:`colorful-qrcodes`. .. code-block:: python >>> import segno >>> qrcode = segno.make('Yellow Submarine', error='h') >>> img = qrcode.to_pil(scale=4, dark='darkred', data_dark='darkorange', ... data_light='yellow') >>> img.save('yellow-submarine.png') .. image:: _static/artistic/yellow-submarine.png :alt: Colorful 3-H QR code encoding "Yellow Submarine" The "to_artistic" method can create animated or static QR codes. .. code-block:: python >>> import segno >>> qrcode = segno.make('The Beatles -- Albums', error='h') >>> qrcode.to_artistic(background='src/albums.gif', target='albums.gif', scale=8) .. image:: _static/artistic/albums.gif :alt: 3-H QR code encoding "The Beatles -- Albums" (animated) If the Pillow installation supports animated WebP images the plugin can save animated WebP images as well. .. code-block:: python >>> import segno >>> qrcode = segno.make('The Beatles -- Abbey Road', error='h') >>> qrcode.to_artistic(background='src/abbey-road-walking.gif', ... target='abbey-road.webp', scale=4) .. image:: _static/artistic/abbey-road.webp :alt: 4-H QR code encoding "The Beatles -- Abbey Road" (animated) The plugin also supports static backgrounds .. code-block:: python >>> import segno >>> qrcode = segno.make('The Beatles -- Let It Be', error='h') >>> qrcode.to_artistic(background='src/letitbe.jpg', target='letitbe.jpg', scale=5) .. image:: _static/artistic/letitbe.jpg :alt: 3-H QR code encoding "The Beatles -- Let It Be" with a background image It's also possible to write the result into a :py:class:`io.BytesIO` stream if the ``kind`` parameter is provided: .. code-block:: python >>> import io >>> import segno >>> qrcode = segno.make('The Beatles -- Let It Be', error='h') >>> out = io.BytesIO() >>> qrcode.to_artistic(background='src/letitbe.jpg', target=out, scale=5, kind='jpg') .. image:: _static/artistic/letitbe.jpg :alt: 3-H QR code encoding "The Beatles -- Let It Be" with a background image If the background should be specified by a URL use a file-like object: .. code-block:: python >>> from urllib.request import urlopen >>> import segno >>> qrcode = segno.make('Ringo Starr', error='h') >>> url = 'https://media.giphy.com/media/HNo1tVKdFaoco/giphy.gif' >>> bg_file = urlopen(url) >>> qrcode.to_artistic(background=bg_file, target='ringo.gif', scale=10) .. image:: _static/artistic/ringo.gif :alt: 2-H QR code encoding "Ringo Starr" with a background image It is possible to combine both techniques so that nothing is written to the hard drive: .. code-block:: python >>> import io >>> from urllib.request import urlopen >>> import segno >>> qrcode = segno.make('The Beatles', error='h') >>> url = 'https://media.giphy.com/media/mUPQmck5YEisg/giphy.gif' >>> bg_file = urlopen(url) >>> out = io.BytesIO() >>> qrcode.to_artistic(background=bg_file, target=out, scale=5, kind='gif') .. image:: _static/artistic/the-beatles-animated.gif :alt: 2-H QR code encoding "The Beatles" with a background image segno-1.6.6/docs/boost-error-correction-level.rst000066400000000000000000000040521476440322300220560ustar00rootroot00000000000000Boost error correction level ============================ If the user does not provide any :option:`--version ` or :paramref:`version ` keyword parameter for :func:`segno.make`, Segno uses the minimal possible (Micro) QR Code symbol with a maximal error correction level. The QR Code version dominates, meaning that Segno will never choose a better error correction level if this choice requires a higher (Micro) QR Code version. If the user provides the :option:`--error ` (or :paramref:`error ` keyword for :func:`segno.make`), the error correction level is treated as minimal error correction level. To prevent any error correction level enhancement, Segno provides the :option:`--no-error-boost ` option and :paramref:`boost_error=False ` option for :func:`segno.make`. It's recommended to keep the error level correction boosting, because a better error correction level improves the probability that the QR Code can be read by average QR Code decoders under all circumstances. Examples -------- Keeping the default (boost error level on):: >>> import segno >>> qrcode = segno.make('The Long and Winding Road') >>> qrcode.designator '2-M' Segno returns a 2-M QR code (version 2, error correction level "M"). .. image:: _static/boost_example1.svg :alt: 2-M QR code encoding 'The Long and Winding Road' If the user does not allow any enhancement of the error correction level, Segno returns a 2-L QR code (version 2, error correction level "L") which does not optimally exploit the possible error corrections:: >>> import segno >>> qrcode = segno.make('The Long and Winding Road', boost_error=False) >>> qrcode.designator '2-L' .. image:: _static/boost_example2.svg :alt: 2-L QR Code encoding 'The Long and Winding Road' As shown, both QR codes use the same version (and are therefore have the same size). However, the first QR code uses a better error correction level (15% vs. 7%) and should be easier to read. segno-1.6.6/docs/changes.rst000066400000000000000000000000341476440322300157330ustar00rootroot00000000000000.. include:: ../CHANGES.rst segno-1.6.6/docs/colorful-qrcodes.rst000066400000000000000000000215531476440322300176170ustar00rootroot00000000000000Colorful QR Codes ================= Almost all serializers support custom settings for the color of the dark and light modules of a (Micro) QR code. The color values can be provided as tuple ``(R, G, B)``, as web color name (like 'red') or as hexadecimal ``#RRGGBB`` value (i.e. '#085A75'). If alpha transparency is supported (i.e. :ref:`PNG ` and :ref:`SVG `), hexadecimal values like ``#RRGGBBAA`` are accepted. The value ``None`` is accepted by many serialization formats and indicates transparency, i.e. ``light=None`` indicates that all light modules should be transparent. In almost all cases the color values are automatically converted into a meaningful value of the specific output format. The keywords are optional, if not provided, all serializers use reasonable default values (dark modules are rendered in black, light modules in white). .. note:: Providing an alpha channel to a serializer which does not accept an alpha channel results usually into an error. The :ref:`SVG `, :ref:`PNG ` and :ref:`PPM ` serializers support more than two colors, every module type may have its own color. .. code-block:: python >>> import segno >>> qrcode = segno.make('Yellow Submarine', version=7, error='h') >>> qrcode.save('qrcode_yellow-submarine.png', scale=4, dark='darkred', ... data_dark='darkorange', data_light='yellow') .. image:: _static/colorful/qrcode_yellow-submarine.png :alt: Colorful 7-H QR code encoding "Yellow Submarine" .. code-block:: python >>> import segno >>> micro_qrcode = segno.make('Rain', error='q') >>> micro_qrcode.save('micro_qrode_rain.png', scale=4, dark='darkblue', data_dark='steelblue') .. image:: _static/colorful/micro_qrcode_rain.png :alt: Colorful M4-Q QR code encoding "RAIN" Module names ------------ The following examples show the results of all supported module types. The unaffected modules are rendered as grey or white modules, the red modules show the result of the keyword. The keywords "dark" and "light" (at the command line :option:`--dark ` and :option:`--light `) are supported by almost all serialization formats. dark / :option:`--dark ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the (default) color of dark modules. .. image:: _static/colorful/dark.png :alt: Picture showing the dark modules .. image:: _static/colorful/mqr_dark.png :alt: Picture showing the dark modules of a Micro QR code light / :option:`--light ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the (default) color of light modules. .. image:: _static/colorful/light.png :alt: Picture showing the light modules .. image:: _static/colorful/mqr_light.png :alt: Picture showing the light modules of a Micro QR code alignment_dark / :option:`--align-dark ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the dark alignment pattern modules. Micro QR Codes don't have alignment patterns. .. image:: _static/colorful/alignment_dark.png :alt: Picture showing the dark alignment modules .. image:: _static/colorful/mqr_alignment_dark.png :alt: Picture showing the dark alignment modules of a Micro QR code (none) alignment_light / :option:`--align-light ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the light alignment pattern modules. Micro QR Codes don't have alignment patterns. .. image:: _static/colorful/alignment_light.png :alt: Picture showing the light alignment modules .. image:: _static/colorful/mqr_alignment_light.png :alt: Picture showing the light alignment modules of a Micro QR code (none) dark_module / :option:`--dark-module ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the dark module. Micro QR Codes don't have a dark module. .. image:: _static/colorful/dark_module.png :alt: Picture showing the dark modules .. image:: _static/colorful/mqr_dark_module.png :alt: Picture showing the dark modules of a Micro QR code (none) data_dark / :option:`--data-dark ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the dark data modules. .. image:: _static/colorful/data_dark.png :alt: Picture showing the dark data modules .. image:: _static/colorful/mqr_data_dark.png :alt: Picture showing the dark data modules of a Micro QR code data_light / :option:`--data-light ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the light data modules. .. image:: _static/colorful/data_light.png :alt: Picture showing the light modules .. image:: _static/colorful/mqr_data_light.png :alt: Picture showing the light modules of a Micro QR code finder_dark / :option:`--finder-dark ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the dark modules of the finder pattern. .. image:: _static/colorful/finder_dark.png :alt: Picture showing the dark finder modules .. image:: _static/colorful/mqr_finder_dark.png :alt: Picture showing the dark finder modules of a Micro QR code finder_light / :option:`--finder-light ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the light modules of the finder pattern. .. image:: _static/colorful/finder_light.png :alt: Picture showing the light finder modules .. image:: _static/colorful/mqr_finder_light.png :alt: Picture showing the light finder modules of a Micro QR code format_dark / :option:`--format-dark ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the dark modules of the format information. .. image:: _static/colorful/format_dark.png :alt: Picture showing the dark format information modules .. image:: _static/colorful/mqr_format_dark.png :alt: Picture showing the dark format information modules of a Micro QR code (none) format_light / :option:`--format-light ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the light modules of the format information. .. image:: _static/colorful/format_light.png :alt: Picture showing the light format information modules .. image:: _static/colorful/mqr_format_light.png :alt: Picture showing the light format information modules of a Micro QR code (none) quiet_zone / :option:`--quiet-zone ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the quiet zone. .. image:: _static/colorful/quiet_zone.png :alt: Picture showing the quiet zone .. image:: _static/colorful/mqr_quiet_zone.png :alt: Picture showing the quiet zone of a Micro QR code separator / :option:`--separator ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the separator. .. image:: _static/colorful/separator.png :alt: Picture showing the separator .. image:: _static/colorful/mqr_separator.png :alt: Picture showing the separator of a Micro QR code timing_dark / :option:`--timing-dark ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the dark modules of the timing pattern. .. image:: _static/colorful/timing_dark.png :alt: Picture showing the dark timing pattern modules .. image:: _static/colorful/mqr_timing_dark.png :alt: Picture showing the dark timing pattern modules of a Micro QR code timing_light / :option:`--timing-light ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the light modules of the timing pattern. .. image:: _static/colorful/timing_light.png :alt: Picture showing the light timing pattern modules .. image:: _static/colorful/mqr_timing_light.png :alt: Picture showing the light timing pattern modules of a Micro QR code version_dark / :option:`--version-dark ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the dark modules of the version information. Micro QR Codes and QR Codes lesser than version 7 don't carry any version information. .. image:: _static/colorful/version_dark.png :alt: Picture showing the dark version modules .. image:: _static/colorful/mqr_version_dark.png :alt: Picture showing the dark version modules of a Micro QR code (none) version_light / :option:`--version-light ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sets the color of the light modules of the version information. Micro QR Codes and QR Codes lesser than version 7 don't carry any version information. .. image:: _static/colorful/version_light.png :alt: Picture showing the light version modules .. image:: _static/colorful/mqr_version_light.png :alt: Picture showing the light version modules of a Micro QR code (none) �����������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/docs/command-line.rst�������������������������������������������������������������������0000664�0000000�0000000�00000016554�14764403223�0016704�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������QR Code creation from the command line ====================================== The command line script :program:`segno` can be used to print QR codes to the terminal or to save them in supported formats like SVG, PNG, EPS, …, see :doc:`CLI man page ` for details By default, the script does not create Micro QR codes, use :option:`--micro ` to allow the creation of Micro QR codes or specify the version (like :option:`--version=M3 `) to create a Micro QR Code. See the :doc:`CLI man page ` for a detailed reference of all command line options. Usage ----- Output the QR code to the terminal:: $ segno "Little wing" .. image:: _static/cli/qr-little-wing-terminal.png :alt: QR code for "Little wing". Same content, but as Micro QR code (M4):: $ segno --micro "Little wing" .. image:: _static/cli/micro-qr-little-wing-terminal.png :alt: Micro QR code for "Little wing". Using a more compact representation of the code:: $ segno --compact "Little wing" .. image:: _static/cli/qr-little-wing-terminal-compact.png :alt: QR code for "Little wing" in a more compact manner. QR Code version --------------- If the :option:`--version ` / :option:`-v ` parameter is not provided, Segno chooses the minimal version for the QR code automatically. The version may be specified as an integer or as Micro QR Code identifier. The content 'Layla' would fit into a 1-H QR code, but the following commands enforce version 5:: $ segno --version=5 Layla $ segno -v=5 Layla .. image:: _static/cli/qr-layla-version-5.png :alt: QR code version 5 for "Layla". Micro QR Code:: $ segno -v m4 Layla $ segno --version M4 Layla .. image:: _static/cli/micro-qr-layla-version-m4.png :alt: Micro QR code version M4 for "Layla". QR Code error correction level ------------------------------ The default error correction level is "L" (or any better if :option:`--no-error-boost ` was not set, c.f. :doc:`boost-error-correction-level`), use the :option:`--error ` / :option:`-e ` parameter to change it:: $ segno --error=q "Ain't no grave" $ segno -e=h "Heart of Gold" QR code serialization --------------------- Printing the QR code to the terminal is nice but the :option:`--output ` / :option:`-o ` parameter serializes the QR code in one of the supported file formats:: $ segno --output=white-room.png "White Room" .. image:: _static/cli/white-room.png :alt: QR code "White Room". :: $ segno -o=satellite.svg "Satellite Of Love" .. image:: _static/cli/satellite.svg :alt: QR code "Satellite Of Love". :: $ segno --output=mrs.eps "Mrs. Robinson" $ segno --output=dedodo.pdf "De Do Do Do, De Da Da Da" $ segno --output=tin-pan-alley.svgz "Tin Pan Alley" :: $ segno --output=thrill-gone.txt "The Thrill Is Gone" .. include:: _static/cli/thrill-gone.txt :literal: Scaling QR codes ---------------- If the resulting QR code is too small, :option:`--scale ` or :option:`-s ` can be used to create a more appropriate output:: $ segno --scale=10 --output=money-talks.png "Money Talks" .. image:: _static/cli/money-talks.png :alt: QR code "Money Talks". :: $ segno -s 10 --output=private-investigations.svg Private Investigations .. image:: _static/cli/private-investigations.svg :alt: QR code "Private Investigations". If the serializer does not support a scaling factor (i.e. text output), this parameter is ignored. Changing the size of the quiet zone ----------------------------------- The generated QR code will have a recommended quiet zone / border around the symbol. To change the size of the border, :option:`--border ` or the shortcut :option:`-b ` can be utilized:: $ segno --border 0 --scale 4 --output=black-magic-woman.svg "Black Magic Woman" .. image:: _static/cli/black-magic-woman.svg :alt: QR code "Black Magic Woman" using quiet zone of zero. :: $ segno --border 10 --scale 4 --output diamond.png "Shine On You Crazy Diamond" .. image:: _static/cli/diamond.png :alt: QR code "Shine On You Crazy Diamond" using quiet zone of ten. :: $ segno -b 30 --scale 4 --output=boom-boom.svg Boom Boom .. image:: _static/cli/boom-boom.svg :alt: QR code "Boom Boom" using quiet zone of 30. Colors ------ Usually, all QR codes are serialized in black and white. Use :option:`--dark ` to change the color of the dark modules and :option:`--light ` to change the color of the light modules. Change the color of the dark modules to to darkblue:: $ segno --dark=darkblue --scale 4 --output=excited.png "So Excited" .. image:: _static/cli/excited.png :alt: QR code "So Excited" with foreground color "darkblue" Change the color of the light modules to transparent:: $ segno --light=transparent --scale 4 --output=hotel.png "Hotel California" .. image:: _static/cli/hotel.png :alt: QR code "Hotel California" with background color "transparent" Change the color of the dark modules to darkblue and the color of the light modules to yellow:: $ segno --dark=darkblue --light=yellow --scale 4 --output=dontgiveup.svg "Don't Give Up" .. image:: _static/cli/dontgiveup.svg :alt: QR code "Don't Give Up" with foreground color "transparent" If the serializer does not support :option:`--color ` or :option:`--light `, these arguments are ignored. The :ref:`SVG `, :ref:`PNG ` and :ref:`PPM ` serializers support more than two colors, each module type (finder pattern (dark / light), alignment pattern (dark / light) etc.) may have its own color, see :doc:`colorful-qrcodes` for details. .. code-block:: bash $ segno --dark darkred --data-dark darkorange --data-light yellow --scale 5 -o qrcode_yellow-submarine.png Yellow Submarine .. image:: _static/colorful/qrcode_yellow-submarine.png :alt: QR code "Yellow Submarine" colorful Structured Append ----------------- The :doc:`Structured Append ` mode can be used to split a message across multiple (max. 16) QR codes. To create a sequence of QR codes, the :option:`--seq ` argument must be provided. Additionally, either the :option:`--version ` or the desired number of symbols (:option:`--symbol-count `) must be provided:: $ segno --seq -v 1 --scale 3 -o polythene-pam.png "Well you should see Polythene Pam" .. image:: _static/polythene-pam-03-01.png :alt: 1st part of Structured Append code .. image:: _static/polythene-pam-03-02.png :alt: 2nd part of Structured Append code .. image:: _static/polythene-pam-03-03.png :alt: 3nd part of Structured Append code Specify the max. number of symbols:: $ segno --seq --symbol-count=2 -s 3 -o sa_yellow-submarine.png "We all live in a yellow submarine" .. image:: _static/cli/sa_yellow-submarine-02-01.png :alt: 1st part of Structured Append code .. image:: _static/cli/sa_yellow-submarine-02-02.png :alt: 2nd part of Structured Append code Shortcut to specify the number of symbols:: $ segno --seq -sc 2 -s 3 -o julia.png "Half of what I say is meaningless" .. image:: _static/cli/julia-02-01.png :alt: 1st part of Structured Append code .. image:: _static/cli/julia-02-02.png :alt: 2nd part of Structured Append code ����������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/docs/comparison-qrcode-libs.rst���������������������������������������������������������0000664�0000000�0000000�00000025141�14764403223�0020705�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Comparison of Python QR Code libraries ====================================== Features -------- .. |br| raw:: html
.. table:: :class: pylib-comparison ================================================================ ===================== ====================== ======== Description `qrcode`_ `qrcodegen`_ `Segno`_ ================================================================ ===================== ====================== ======== Library license `BSD`_ `MIT`_ `BSD`_ Library version 8.0.0 1.8.0 |version| Mode Numeric Yes Yes Yes Mode Alphanumeric Yes Yes Yes Mode Byte Yes Yes Yes Mode Kanji No Yes Yes Mode ECI No Yes Yes Mode FNC1 No No No Mode Structured Append No No Yes Mode Hanzi [1]_ No No Yes Mixing modes Yes Yes Yes QR Codes version 1 - 40 Yes Yes Yes Micro QR Codes version M1 - M4 No No Yes Output acc. to ISO/IEC 18004:2015(E) Fig. 1 [2]_ |br| |ISO 1-M| No |br| |mask4 1-M| No |br| |mask4 1-M| Yes |br| |segno 1-M| Output acc. to ISO/IEC 18004:2015(E) Fig. 2 |br| |ISO M2-L| - - Yes |br| |segno M2-L| Find maximal error correction level No Yes Yes Optimize QR Codes Yes No No `PNG`_ output Yes No Yes `SVG`_ output Yes No Yes `EPS`_ output Yes No Yes `PDF`_ output Yes No Yes `PAM`_ output No No Yes `PBM`_ output Yes No Yes `PPM`_ output Yes No Yes `LaTeX`_ support No No Yes `XBM`_ output Yes No Yes `XPM`_ output No No Yes PNG `data URI`_ No No Yes SVG data URI No No Yes Text output Yes No Yes `ANSI`_ escape code output Yes No Yes Other output formats (i.e. `JPEG`_) Yes No Yes via `plugin`_ Black and white QR Codes Yes Yes Yes Colored QR Codes Yes No Yes Animated QR Codes (`GIF`_, `APNG`_, `WebP`_) No No Yes via `plugin`_ Changing size of modules (scaling factor) Yes No Yes Command line script Yes No Yes Plugins No No Yes Default encoding in Byte mode ISO/IEC 8859-1 ISO/IEC 8859-1 ISO/IEC 8859-1 or UTF-8 or UTF-8 or UTF-8 3rd party dependencies `Pillow`_ or - - `Pymaging`_ and `Pymaging-PNG`_ (Windows: `colorama`_) ================================================================ ===================== ====================== ======== .. [1] The Hanzi mode is not part of ISO/IEC 18004 and may not be supported by all QR Code decoders. Segno uses the Hanzi mode if the user enables it explicitly, see :ref:`hanzi-mode` for details .. [2] Even if all libs generate the same byte output (``40 e5 15 22 04 36 f6 46 52 05 37 96 d6 26 f6 c0``) for the input "QR Code Symbol", the generated QR code may look different because they choose a different mask pattern. ISO/IEC 18004:2015(E) (cf. page 7) uses mask 5, while qrcode and qrcodegen use mask 4. All these QR codes can be read by common QR Code readers. Performance ----------- Some performance indicators. The script `benchmarks.py`_ ran on Intel i7-8559U / CPython 3.11. Each SVG / PNG image uses a scaling factor of 10 (aside from qrcodegen which does not support any scaling). Create a 1-M QR code ~~~~~~~~~~~~~~~~~~~~ 1-M QR code encoding "QR Code Symbol" .. image:: _static/chart_create_1m.svg :alt: Chart showing the results of creating a 1-M QR code. Create a 7-Q QR code ~~~~~~~~~~~~~~~~~~~~ 7-Q QR code encoding "QR Code Symbol" .. image:: _static/chart_create_7q.svg :alt: Chart showing the results of creating a 7-Q QR code. Create a 30-H QR code ~~~~~~~~~~~~~~~~~~~~~ 30-H QR code encoding "QR Code Symbol" .. image:: _static/chart_create_30h.svg :alt: Chart showing the results of creating a 30-H QR code. Create a QR code and serialize it as SVG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Create a QR code 1-M "QR Code Symbol" and serialize it as SVG document. .. image:: _static/chart_svg.svg :alt: Chart showing the results of creating a 1-M QR code and export it as SVG image. Create a QR code and serialize it as PNG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Create a QR code 1-M "QR Code Symbol" and serialize it as PNG image. .. image:: _static/chart_png.svg :alt: Chart showing the results of creating a 1-M QR code and export it as SVG image. .. |ISO 1-M| image:: _static/iso_fig1_1m.png :alt: 1-M QR code encoding 'QR Code Symbol' :width: 75 :height: 75 .. |ISO M2-L| image:: _static/iso_fig2_m2l.png :alt: M2-L Micro QR code encoding '01234567' :width: 51 :height: 51 .. |mask4 1-M| image:: _static/iso_fig1_1m_mask4.png :alt: 1-M QR code encoding 'QR Code Symbol' using mask 4 :width: 75 :height: 75 .. |segno 1-M| image:: _static/iso_fig1_1m_segno.png :alt: 1-M QR code encoding 'QR Code Symbol' using mask 5 :width: 75 :height: 75 .. |segno M2-L| image:: _static/iso_fig2_m2l_segno.png :alt: M2-L Micro QR code encoding '01234567' :width: 51 :height: 51 The comparison included PyQRCode in all years before 2022. In the meantime, six years have passed without any updates and PyQRCode has lost its connection in many aspects. Although popular, it lost all feature and performance comparisons, therefore it is no longer part of this comparison. .. _qrcode: https://pypi.org/project/qrcode/ .. _qrcodegen: https://pypi.org/project/qrcodegen/ .. _Segno: https://pypi.org/project/segno/ .. _BSD: http://opensource.org/licenses/BSD-3-Clause .. _MIT: http://opensource.org/licenses/MIT .. _PNG: https://en.wikipedia.org/wiki/Portable_Network_Graphics .. _SVG: https://en.wikipedia.org/wiki/Scalable_Vector_Graphics .. _EPS: https://en.wikipedia.org/wiki/Encapsulated_PostScript .. _PDF: https://en.wikipedia.org/wiki/Portable_Document_Format .. _XBM: https://en.wikipedia.org/wiki/X_BitMap .. _XPM: https://de.wikipedia.org/wiki/X_PixMap .. _PAM: http://netpbm.sourceforge.net/doc/pam.html .. _PBM: http://netpbm.sourceforge.net/doc/pbm.html .. _PPM: http://netpbm.sourceforge.net/doc/ppm.html .. _LaTeX: https://en.wikipedia.org/wiki/LaTeX .. _data URI: https://en.wikipedia.org/wiki/Data_URI_scheme .. _ANSI: https://en.wikipedia.org/wiki/ANSI_escape_code .. _JPEG: https://en.wikipedia.org/wiki/JPEG .. _six: https://pypi.org/project/six/ .. _PyPNG: https://pypi.org/project/pypng/ .. _Pymaging: https://github.com/ojii/pymaging .. _Pymaging-PNG: https://github.com/ojii/pymaging-png .. _PIL: https://pypi.org/project/PIL/ .. _Pillow: https://pypi.org/project/Pillow/ .. _colorama: https://pypi.org/project/colorama/ .. _plugin: https://github.com/heuer/qrcode-artistic .. _benchmarks.py: https://github.com/heuer/segno/blob/master/sandbox/benchmarks.py .. _GIF: https://en.wikipedia.org/wiki/GIF#Animated_GIF .. _APNG: https://en.wikipedia.org/wiki/Animated_Portable_Network_Graphics .. _WebP: https://en.wikipedia.org/wiki/WebP segno-1.6.6/docs/conf.py000066400000000000000000000042151476440322300150750ustar00rootroot00000000000000# # segno documentation build configuration file # import os import sys sys.path.insert(0, os.path.abspath('..')) import segno extensions = [ 'sphinx.ext.autodoc', 'sphinx_paramlinks', 'sphinx.ext.intersphinx', ] autodoc_member_order = 'groupwise' intersphinx_mapping = {'python': ('https://docs.python.org/3', None)} # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] source_suffix = '.rst' # The master toctree document. master_doc = 'index' project = 'Segno' copyright = '2016 - 2025 Lars Heuer -- "QR Code" and "Micro QR Code" are registered trademarks of DENSO WAVE INCORPORATED.' # noqa: E501 author = 'Lars Heuer' version = segno.__version__ language = 'en' exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] show_authors = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True html_theme = 'furo' # 'sphinx_rtd_theme' #'classic' #'alabaster' html_theme_options = { 'globaltoc_collapse': False } html_static_path = ['_static'] pygments_dark_style = 'lightbulb' # Output file base name for HTML help builder. htmlhelp_basename = 'segnodoc' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'segno.tex', 'Segno Documentation', 'Author', 'manual'), ] # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('man/segno', 'segno', 'Segno QR Code encoder', '', 1), ] # -- 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 = [ (master_doc, 'segno', 'Segno Documentation', author, 'segno', 'One line description of project.', 'Miscellaneous'), ] # Bibliographic Dublin Core info. epub_title = project epub_author = author epub_publisher = author epub_copyright = copyright epub_exclude_files = ['search.html'] segno-1.6.6/docs/contact-information.rst000066400000000000000000000051141476440322300203050ustar00rootroot00000000000000Creating a QR Code encoding contact information =============================================== MeCard ------ The function :py:func:`segno.helpers.make_mecard` returns a QR code which encodes contact information as MeCard. .. code-block:: python >>> from segno import helpers >>> qrcode = helpers.make_mecard(name='Doe,John', email='me@example.org', phone='+1234567') >>> qrcode.designator '3-L' >>> # Some params accept multiple values, like email, phone, url >>> qrcode = helpers.make_mecard(name='Doe,John', ... email=('me@example.org', 'another@example.org'), ... url=['http://www.example.org', 'https://example.org/~joe']) >>> qrcode.save('my-mecard.svg', scale=4) .. image:: _static/contact/my-mecard.svg :alt: qrcode Code encoding a MeCard A factory function which returns the MeCard as string is available as well. .. code-block:: python >>> import segno >>> from segno import helpers >>> mecard = helpers.make_mecard_data(name='Doe,John', email='me@example.org', phone='+1234567') >>> mecard 'MECARD:N:Doe,John;TEL:+1234567;EMAIL:me@example.org;;' >>> qrcode = segno.make(mecard, error='H') >>> qrcode.designator '6-H' vCard ----- The function :py:func:`segno.helpers.make_vcard` returns a QR code which encodes contact information as vCard version 3.0. .. code-block:: python >>> from segno import helpers >>> qrcode = helpers.make_vcard(name='Doe;John', displayname='John Doe', ... email='me@example.org', phone='+1234567') >>> qrcode.designator '5-L' >>> # Some params accept multiple values, like email, phone, url >>> qrcode = helpers.make_vcard(name='Doe;John', displayname='John Doe', ... email=('me@example.org', 'another@example.org'), ... url=['http://www.example.org', 'https://example.org/~joe']) >>> qrcode.save('my-vcard.svg', scale=4) .. image:: _static/contact/my-vcard.svg :alt: QR Code encoding a vCard A factory function which returns the vCard as string is available as well. .. code-block:: python >>> import segno >>> from segno import helpers >>> vcard = helpers.make_vcard_data(name='Doe;John', displayname='John Doe', ... email='me@example.org', phone='+1234567') >>> vcard 'BEGIN:VCARD\r\nVERSION:3.0\r\nN:Doe;John\r\nFN:John Doe\r\nEMAIL:me@example.org\r\nTEL:+1234567\r\nEND:VCARD\r\n' >>> qrcode = segno.make(vcard, error='H') >>> qrcode.designator '9-H' segno-1.6.6/docs/epc-qrcodes.rst000066400000000000000000000046351476440322300165430ustar00rootroot00000000000000EPC QR Codes ============ European Payments Council Quick Response Codes (EPC QR Codes) are used to initiate SEPA credit transfers. They encode all necessary data (IBAN, amount, recipient) and may be placed on invoices to eliminate the error-prone typing of payment Information. See the `EPC guidelines (PDF document) `_ for more information. The function :py:func:`segno.helpers.make_epc_qr` is used to create a EPC QR code. It is not possible to modify the error correction level or to change the version of the QR code. The EPC guidelines specify that the error correction level is fixed to "M" and the QR Code version must not be higher than 13. .. code-block:: python >>> from segno import helpers >>> qrcode = helpers.make_epc_qr(name='Wikimedia Foerdergesellschaft', ... iban='DE33100205000001194700', ... amount=20, text='Spende fuer Wikipedia') >>> qrcode.save('spende-wikipedia.png', scale=3) .. image:: _static/epc/spende-wikipedia.png :alt: EPC QR code The QR code shown above encodes the following information:: BCD 002 2 SCT Wikimedia Foerdergesellschaft DE33100205000001194700 EUR20 Spende fuer Wikipedia By default, the function uses the minimal possible encoding to encode the provided data. If another encoding, i.e. UTF-8, is required, the user may specify the encoding with an integer referring to one of the supported encodings (1: UTF-8, 2: ISO 8859-1, 3: ISO 8859-2, 4: ISO 8859-4, 5: ISO 8859-5, 6: ISO 8859-7, 7: ISO 8859-10, 8: ISO 8859-15) or the (case insensitive) name of the encoding like 'utf-8' or 'ISO-8859-1'. .. code-block:: python >>> from segno import helpers >>> qrcode = helpers.make_epc_qr(name='Wikimedia Foerdergesellschaft', ... iban='DE33100205000001194700', amount=13.05, ... text='Spende fuer Wikipedia', encoding='utf-8') >>> qrcode.save('spende-wikipedia2.png', scale=3) .. image:: _static/epc/spende-wikipedia2.png :alt: EPC QR Code Decoded infomation:: BCD 002 1 SCT Wikimedia Foerdergesellschaft DE33100205000001194700 EUR13.05 Spende fuer Wikipedia segno-1.6.6/docs/index.rst000066400000000000000000000017141476440322300154400ustar00rootroot00000000000000Segno - Python QR Code and Micro QR Code encoder ================================================ Pure Python QR Code generator with no dependencies. Segno (Italian for "sign" / "symbol") generates QR Codes and Micro QR Codes according to ``ISO/IEC 18004:2015(E)``. Links ----- * `PyPI homepage `_ * `GitHub homepage `_ * `Issue tracker `_ Contents -------- .. toctree:: :maxdepth: 4 make serializers boost-error-correction-level qrcode-modes structured-append colorful-qrcodes svg-options special-qrcode-factories contact-information epc-qrcodes pillow-qrcodes artistic-qrcodes web-development command-line comparison-qrcode-libs man/index plugins api changes third-party-projects Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` segno-1.6.6/docs/make.bat000066400000000000000000000155031476440322300152050ustar00rootroot00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled echo. coverage to run coverage check of the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) REM Check if sphinx-build is available and fallback to Python version if any %SPHINXBUILD% 2> nul if errorlevel 9009 goto sphinx_python goto sphinx_ok :sphinx_python set SPHINXBUILD=python -m sphinx.__init__ %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) :sphinx_ok if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\segno.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\segno.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "coverage" ( %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage if errorlevel 1 exit /b 1 echo. echo.Testing of coverage in the sources finished, look at the ^ results in %BUILDDIR%/coverage/python.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end segno-1.6.6/docs/make.rst000066400000000000000000000177511476440322300152560ustar00rootroot00000000000000Creating QR codes or Micro QR codes =================================== Segno's (Micro) QR codes are independent of a concrete output format; it's possible to create more than one rendering (output format) from a single QR code or Micro QR code: .. code-block:: python >>> import segno >>> qrcode = segno.make('Henry Lee') >>> qrcode.save('henry-lee.svg') # SVG document >>> qrcode.save('henry-lee.png') # PNG image >>> qrcode.save('henry-lee.eps') # EPS document >>> qrcode.save('henry-lee.txt') # Text output By default, the serialized (Micro) QR codes are black and white (or transparent) and have a quiet zone (border) of four (or two for Micro QR Codes) light modules. Nearly all output formats provide options to change at least the scale of the code, the color of the dark modules, and the border, see :py:func:`segno.QRCode.save()` and :doc:`serializers` for details. .. code-block:: python >>> import segno >>> qrcode = segno.make('You Know My Name (Look Up The Number)') >>> qrcode.save('you-know-my-name-no-border.svg', border=0) # no border / quiet zone >>> qrcode.save('you-know-my-name-color-green.svg', ... dark='green') # default border, dark modules are green >>> qrcode.save('you-know-my-name-background-grey.svg', ... light='#eee') # default border, background grey The factory function :py:func:`segno.make` chooses the minimal possible (Micro) QR Code version with a maximal error correction for the provided input. .. code-block:: python >>> import segno >>> qrcode = segno.make('Rain') >>> qrcode.version 'M3' .. image:: _static/rain-m3-m.png :alt: "M3-M Micro QR code encoding 'Rain'" The caller may enforce that a QR Code instead of a Micro QR Code should be generated even if the content may fit into a Micro QR Code. .. code-block:: python >>> import segno >>> qrcode = segno.make('Rain', micro=False) >>> qrcode.version 1 .. image:: _static/rain-1-h.png :alt: "1-H QR Code encoding 'Rain'" Further, Segno provides two additional factory functions to enforce the creation of QR Codes or Micro QR Codes: :py:func:`segno.make_qr` for QR Codes and :py:func:`segno.make_micro` to create Micro QR Codes: .. code-block:: python >>> import segno >>> micro_qrcode = segno.make_micro('The Beatles') # Micro QR Code >>> micro_qrcode.designator # Get the version and error level 'M4-M' .. image:: _static/the-beatles-m4-m.png :alt: "M4-M Micro QR code encoding 'The Beatles'" .. code-block:: python >>> import segno >>> qrcode = segno.make_qr('The Beatles') # Same content but as QR Code >>> qrcode.designator '1-Q' .. image:: _static/the-beatles-1-q.png :alt: "1-Q QR code encoding 'The Beatles'" .. code-block:: python >>> import segno >>> qrcode = segno.make('The Beatles', micro=False) # Disallow Micro QR Codes >>> qrcode.designator '1-Q' .. image:: _static/the-beatles-1-q.png :alt: "1-Q QR code encoding 'The Beatles'" If the provided content is too large, a :py:exc:`segno.DataOverflowError` is thrown: .. code-block:: python >>> import segno >>> qrcode = segno.make_micro('The Curse of Millhaven') Traceback (most recent call last): ... DataOverflowError: Data too large. No Micro QR Code can handle the provided data QR Code version --------------- It's possible to specify the desired version for the provided ``content``. .. code-block:: python >>> import segno >>> qrcode = segno.make('Light My Fire') >>> qrcode.version 'M4' >>> qrcode.designator 'M4-M' .. image:: _static/light-my-fire-m4-m.png :alt: "M4-M QR code encoding 'Light My fire'" .. code-block:: python >>> import segno >>> qrcode = segno.make('Light My Fire', version=1) >>> qrcode.version 1 >>> qrcode.designator '1-M' .. image:: _static/light-my-fire-1-m.png :alt: "1-M QR code encoding 'Light My fire'" QR Code error correction level ------------------------------ By default, Segno uses at minimum the error correction level "L" to encode a (Micro) QR code. Segno tries by default to enhance the provided error correction level if :paramref:`boost_error ` is not set to ``False``; it takes the ``error`` level as minimum error level without changing the (Micro) QR Code version, c.f. :doc:`boost-error-correction-level` for details. If this behaviour is not desired, :paramref:`boost_error ` must be set to ``False`` (default: ``True``). Use the parameter :paramref:`error ` to change the (minimum) error correction level. The `error` parameter is case-insensitive. Available error correction levels are ``L`` (lowest error correction level: 7% of codewords can be restored), ``M`` (error correction level "medium": 15% of codewords can be restored), ``Q`` (error correction level "quartile": 25% of codewords can be restored), and ``H`` (highest error correction level: 30% of codewords can be restored). The error correction level "H" is not available for Micro QR Codes, if the user specifies the error correction level "H", a QR code is generated by :py:func:`segno.make`, never a Micro QR code. .. code-block:: python >>> import segno >>> qrcode = segno.make('Parisienne Walkways', ... error='l') # Explicit (minimum) error correction level >>> qrcode.designator # The error correction level was changed to "Q" since there was enough available space '2-Q' .. image:: _static/parisienne_walkways-2-q.png :alt: "2-Q QR code encoding 'Parisienne Walkways'" .. code-block:: python >>> import segno >>> qrcode = segno.make('Parisienne Walkways', error='l', ... boost_error=False) # Explicit error level >>> qrcode.designator '2-L' .. image:: _static/parisienne_walkways-2-l.png :alt: "2-L QR code encoding 'Parisienne Walkways'" .. code-block:: python >>> import segno >>> # Enhancing the error correction level may enforce another QR Code version >>> qrcode = segno.make('Parisienne Walkways', error='H') >>> qrcode.designator '3-H' .. image:: _static/parisienne_walkways-3-h.png :alt: "3-H QR Code encoding 'Parisienne Walkways'" QR Code data masking -------------------- Segno chooses by default an optimal mask for the provided input, but the user may specify the preferred mask as well. QR Codes support 8 mask patterns, while Micro QR Codes support 4 mask patterns, only. .. code-block:: python >>> import segno >>> qrcode = segno.make('Ai Du') >>> qrcode.mask 0 >>> qrcode = segno.make('Ai Du', mask=3) >>> qrcode.mask 3 Micro QR code with different data masks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ M3-M codes encoding "Ai Du" with the four different masks: .. figure:: _static/data_mask_mqr_0.svg Micro QR Code using data mask pattern 00 (mask=0) .. figure:: _static/data_mask_mqr_1.svg Micro QR Code using data mask pattern 01 (mask=1) .. figure:: _static/data_mask_mqr_2.svg Micro QR Code using data mask pattern 10 (mask=2) .. figure:: _static/data_mask_mqr_3.svg Micro QR Code using data mask pattern 11 (mask=3) QR code with different data masks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1-H codes encoding "Ai Du" using the eight different mask patterns: .. figure:: _static/data_mask_qr_0.svg QR Code using data mask pattern 000 (mask=0) .. figure:: _static/data_mask_qr_1.svg QR Code using data mask pattern 001 (mask=1) .. figure:: _static/data_mask_qr_2.svg QR Code using data mask pattern 010 (mask=2) .. figure:: _static/data_mask_qr_3.svg QR Code using data mask pattern 011 (mask=3) .. figure:: _static/data_mask_qr_4.svg QR Code using data mask pattern 100 (mask=4) .. figure:: _static/data_mask_qr_5.svg QR Code using data mask pattern 101 (mask=5) .. figure:: _static/data_mask_qr_6.svg QR Code using data mask pattern 110 (mask=6) .. figure:: _static/data_mask_qr_7.svg QR Code using data mask pattern 111 (mask=7) segno-1.6.6/docs/man/000077500000000000000000000000001476440322300143475ustar00rootroot00000000000000segno-1.6.6/docs/man/index.rst000066400000000000000000000001521476440322300162060ustar00rootroot00000000000000Man pages ========= Documentation of the command line interface. .. toctree:: :maxdepth: 3 segno segno-1.6.6/docs/man/segno.rst000066400000000000000000000203611476440322300162160ustar00rootroot00000000000000segno ===== Synopsis -------- **segno** [*options*] content Description ----------- :program:`segno` creates QR Codes and Micro QR Codes. It can be used to print the codes to a terminal or to serialize them in several output formats (like SVG and PNG). Command Line Options -------------------- .. program:: segno .. option:: --ver, -V Shows Segno's version and exit .. option:: -h, --help Show a help message which lists all commands and exit QR Code Options ~~~~~~~~~~~~~~~ .. option:: --version VERSION, -v VERSION QR Code version: 1 \.\. 40 or Micro Code Version "M1", "M2", "M3", "M4" .. option:: --error {L,M,Q,H,-}, -e {L,M,Q,H,-} Error correction level: "L": 7% (default), "M": 15%, "Q": 25%, "H": 30%, "-": no error correction (used for M1 symbols) .. option:: --mode {numeric,alphanumeric,byte,kanji,hanzi}, -m {numeric,alphanumeric,byte,kanji,hanzi} Mode. If unspecified (default), an optimal mode is chosen for the given input. .. option:: --pattern PATTERN, -p PATTERN Mask pattern to use. If unspecified (default), an optimal mask pattern is used. Valid values for QR Codes: 0 \.\. 7 Valid values for Micro QR Codes: 0 \.\. 3 .. option:: --encoding ENCODING Specifies the encoding of the provided content. If not specified (default) either ISO 8859-1 is used or if it does not fit, UTF-8 or Shift_JIS (for Kanji content) is used. .. option:: --micro Allow the creation of Micro QR Codes .. option:: --no-micro Disallow creation of Micro QR Codes (default) .. option:: --no-error-boost Disables the automatic error correction level incrementation. By default, the maximal error correction level is used (without changing the version). .. option:: --seq Creates a sequence of QR Codes (Structured Append mode). The :option:`--version` or :option:`--symbol-count` must be provided .. option:: --symbol-count SYMBOL_COUNT, -sc SYMBOL_COUNT Number of symbols to create .. option:: --border BORDER, -b BORDER Size of the border / quiet zone of the output. By default, the standard border (4 modules for QR Codes, 2 modules for Micro QR Codes) will be used. A value of 0 omits the border Output Options ~~~~~~~~~~~~~~ .. option:: --scale SCALE, -s SCALE Scaling factor of the output. By default, a scaling factor of 1 is used which can result into too small images. Some output formats, i.e. SVG, accept a decimal value. .. option:: --output OUTPUT, -o OUTPUT Output file. If not specified, the QR Code is printed to the terminal .. option:: --compact Indicates that the QR code should be printed to the terminal in a more compact manner. Module Colors ~~~~~~~~~~~~~ Arguments to specify the module colors. Multiple colors are supported for SVG and PNG. The module color support varies between the serialization formats. Most serializers support at least "--dark" and "--light". Unsupported arguments are ignored. .. option:: --dark DARK Sets the (default) color of the dark modules. The color may be specified as web color name, i.e. "red" or as hexadecimal value, i.e. "#0033cc". Some serializers, i.e. SVG and PNG, support alpha channels (8-digit hexadecimal value) and some support "transparent" as color value. The standard color is black .. option:: --light LIGHT Sets the (default) color of the light modules. The standard value is either white or transparent. See :option:`--dark` for a description of allowed values. .. option:: --align-dark ALIGN_DARK Sets the color of the dark modules of the alignment patterns. See :option:`--dark` for a description of allowed values. .. option:: --align-light ALIGN_LIGHT Sets the color of the light modules of the alignment patterns. See :option:`--dark` for a description of allowed values. .. option:: --dark-module DARK_MODULE Sets the color of the dark module. See :option:`--dark` for a description of allowed values. .. option:: --data-dark DATA_DARK Sets the color of the dark data modules. See :option:`--dark` for a description of allowed values. .. option:: --data-light DATA_LIGHT Sets the color of the light data modules. See :option:`--dark` for a description of allowed values. .. option:: --finder-dark FINDER_DARK Sets the color of the dark modules of the finder pattern. See :option:`--dark` for a description of allowed values. .. option:: --finder-light FINDER_LIGHT Sets the color of the light modules of the finder pattern. See :option:`--dark` for a description of allowed values. .. option:: --format-dark FORMAT_DARK Sets the color of the dark modules of the format information. See :option:`--dark` for a description of allowed values. .. option:: --format-light FORMAT_LIGHT Sets the color of the light modules of the format information. See :option:`--dark` for a description of allowed values. .. option:: --quiet-zone QUIET_ZONE Sets the color of the quiet zone (border). See :option:`--dark` for a description of allowed values. .. option:: --separator SEPARATOR Sets the color of the separator. See :option:`--dark` for a description of allowed values. .. option:: --timing-dark TIMING_DARK Sets the color of the dark modules of the timing pattern. See :option:`--dark` for a description of allowed values. .. option:: --timing-light TIMING_LIGHT Sets the color of the light modules of the timing pattern. See :option:`--dark` for a description of allowed values. .. option:: --version-dark VERSION_DARK Sets the color of the dark modules of the version information. See :option:`--dark` for a description of allowed values. .. option:: --version-light VERSION_LIGHT Sets the color of the light modules of the version information. See :option:`--dark` for a description of allowed values. SVG Options ~~~~~~~~~~~ .. option:: --no-classes Omits the (default) SVG classes .. option:: --no-xmldecl Omits the XML declaration header .. option:: --no-namespace Indicates that the SVG document should have no SVG namespace declaration .. option:: --no-newline Indicates that the SVG document should have no trailing newline .. option:: --title TITLE Specifies the title of the SVG document .. option:: --desc DESC Specifies the description of the SVG document .. option:: --svgid SVGID Indicates the ID of the element .. option:: --svgclass SVGCLASS Indicates the CSS class of the element (default: 'segno'). An empty string omits the attribute. .. option:: --lineclass LINECLASS Indicates the CSS class of the elements. An empty string omits the attribute. .. option:: --no-size Indicates that the SVG document should not have "width" and "height" attributes .. option:: --unit UNIT Indicates SVG coordinate system unit .. option:: --svgversion SVGVERSION Indicates the SVG version .. option:: --svgencoding ENCODING Specifies the encoding of the document .. option:: --draw-transparent Indicates if invisible paths should be added to the SVG document. By default all transparent paths are omitted. PNG Options ~~~~~~~~~~~ .. option:: --dpi DPI Sets the DPI value of the PNG file Exit Status ----------- :program:`segno` exits 0 on success, and 1 if an error occurs. Examples -------- .. code-block:: bash $ segno "Up jumped the devil" Prints a 2-Q QR code to the terminal .. code-block:: bash $ segno --compact "I am the walrus" Prints a 1-L QR code to the terminal in a more compact manner .. code-block:: bash $ segno -o=yesterday.png "Yesterday" Saves the 1-Q QR code as PNG image. .. code-block:: bash $ segno -o=fool.svg --title="Example QR code" "The Fool on the Hill" Saves the 2-Q QR code as SVG document with the given title. .. code-block:: bash $ segno -o=a-day-in-the-life.svg --scale=10 --dark darkblue "A Day in the Life" Saves the 1-L QR code as SVG document, using a scaling factor of 10 and the dark modules use the color "darkblue" instead of black. .. code-block:: bash $ segno -o rain.png -s 4 --dark "#003399" --micro RAIN Saves the Micro QR Code (M2-M) as PNG image, using the color #003399 for dark modules. Each module corresponds to 4 x 4 pixels because the scaling factor was set to 4. segno-1.6.6/docs/pillow-qrcodes.rst000066400000000000000000000045321476440322300172760ustar00rootroot00000000000000Pillow ====== In order to process the output of Segno with Pillow you may use the :doc:`artistic-qrcodes ` plugin or use the result of Segno's capability to generate PNG images directly. All PNG images can be opened by the Pillow library: .. code-block:: python >>> import io >>> from PIL import Image >>> import segno >>> # Create a 5-H QR code >>> qrcode = segno.make('Blackbird singing in the dead of night', error='h') >>> # Save the QR code into a memory buffer as PNG >>> out = io.BytesIO() >>> qrcode.save(out, scale=5, kind='png') >>> out.seek(0) # Important to let PIL / Pillow load the image >>> img = Image.open(out) # Done, do what ever you want with the PIL/Pillow image Convert QR code to RGB(A) ------------------------- Since Segno tries to return a minimal PNG representation it may be necessary to convert the Pillow image into a RGB or RGBA image: .. code-block:: python >>> img = Image.open(out).convert('RGB') # We want to use Pillow with colors >>> # Only necessary if further processing requires transparency / an alpha channel >>> img = Image.open(out).convert('RGBA') Add a logo to a QR code ----------------------- A common request to add a logo or any kind of other picture to the QR code is beyond the purpose of this library since it requires 3rd party libraries. The following code provides an example how to use Pillow to add a logo to the center of a QR code. .. code-block:: python import io from PIL import Image import segno out = io.BytesIO() # Nothing special here, let Segno generate the QR code and save it as PNG in a buffer segno.make('Blackbird singing in the dead of night', error='h').save(out, scale=5, kind='png') out.seek(0) # Important to let Pillow load the PNG img = Image.open(out) img = img.convert('RGB') # Ensure colors for the output img_width, img_height = img.size logo_max_size = img_height // 3 # May use a fixed value as well logo_img = Image.open('./blackbird.jpg') # The logo # Resize the logo to logo_max_size logo_img.thumbnail((logo_max_size, logo_max_size), Image.Resampling.LANCZOS) # Calculate the center of the QR code box = ((img_width - logo_img.size[0]) // 2, (img_height - logo_img.size[1]) // 2) img.paste(logo_img, box) img.save('qrcode_with_logo.png') segno-1.6.6/docs/plugins.rst000066400000000000000000000042711476440322300160130ustar00rootroot00000000000000Writing plugins for Segno ========================= :py:class:`segno.QRCode` provides a plugin architecture which utilizes egg entry points. All plugins must use the ``segno.plugin.converter`` entry point to be recognized. If a plugin is detected, the user may use the the plugin by calling ``to_XXX`` where ``XXX`` refers to the plugin name. The specific plugin is invoked by providing the :py:class:`segno.QRCode` instance and any further arguments or keywords. Simple plugin ------------- This section explains how to write a plugin which writes to ``stdout`` and uses ``X`` for dark modules and ``_`` for light modules. Content of ``simple_plugin.py``: .. code-block:: python import sys def write(qrcode): write = sys.stdout.write for row in qrcode.matrix: for col in row: write('X' if col else '_') write('\n') ``setup.py``: .. code-block:: python setup( name='simple-plugin', version='1.0', license='BSD', author='John Doe', author_email='john@example.org', platforms=['any'], py_modules=['simple_plugin'], entry_points=""" [segno.plugin.converter] simple = simple_plugin:write """, install_requires=['segno'], ) Once installed, it's possible to call this plugin via: .. code-block:: python >>> import segno >>> qrcode = segno.make('Chelsea Hotel No. 2') >>> qrcode.to_simple() XXXXXXX_XXXX_XX_X_XXXXXXX X_____X___________X_____X X_XXX_X_XX__XXX___X_XXX_X X_XXX_X__X_XXX_X__X_XXX_X X_XXX_X__XX_XX__X_X_XXX_X X_____X_X__XXX__X_X_____X XXXXXXX_X_X_X_X_X_XXXXXXX __________X_X__XX________ X_X___XX__XXXXX_X__X__X_X _XX__X_XXXXXX__XX_XX_X__X _X____X____X_XXXX__XX_X_X _XX__X_XX_XXX__XXXX_XX___ __X_XXXX_XXX_XX_X_XXXX_X_ _____X_X_X___X__XXXX_XX_X XXXXX_X_X_XX___XX_XXXXX_X ____XX__XXX__X_______X_XX XX_X__X__XXXXX_XXXXXX__XX ________X_X_X___X___X____ XXXXXXX_X___XXX_X_X_X___X X_____X__X_XX_X_X___XX_XX X_XXX_X___X__XXXXXXXXX_XX X_XXX_X______XX__X__XX_X_ X_XXX_X_XXXX_____X_XX_XXX X_____X___X__X__XX_X_X___ XXXXXXX_XXXXXX__X_XXXX__X segno-1.6.6/docs/qrcode-modes.rst000066400000000000000000000137361476440322300167220ustar00rootroot00000000000000QR Code modes ============= The ISO/IEC 18004 standard defines four modes in order to encode the data as efficiently as possible. If no encoding or mode is provided, Segno tries to find the most efficient encoding / mode. The mode may be specified by the :paramref:`mode ` (CLI: :option:`--mode ` or :option:`-m `) parameter although it is recommended to let Segno decide which mode / encoding should be used. .. _numeric-mode: Numeric mode ------------ The numeric mode is the most efficient way to encode digits. This mode does not cover negative numbers because it does not support the minus sign (or plus sign). The numeric mode is supported by QR Codes and Micro QR Codes. Segno detects the numeric mode if the data is provided as string or integer: .. code-block:: python >>> import segno >>> qrcode = segno.make('64') >>> qrcode2 = segno.make(64) >>> qrcode.designator 'M1' >>> qrcode2.designator 'M1' >>> qrcode.mode 'numeric' >>> qrcode2.mode 'numeric' >>> qrcode == qrcode2 True .. image:: _static/modes/64-micro.png :alt: M1 Micro QR Code encoding "64" Segno chooses by default a minimal QR Code output. Since the numeric mode is supported by Micro QR Codes and QR Codes, Segno chooses a Micro QR Code as most efficient representation. To enforce a QR Code, use either the factory function :py:func:`segno.make_qr` or set the :paramref:`micro ` parameter of :py:func:`segno.make` to ``False``: .. code-block:: python >>> import segno >>> qrcode = segno.make_qr('64') >>> qrcode2 = segno.make(64, micro=False) >>> qrcode.designator '1-H' >>> qrcode.mode 'numeric' >>> qrcode == qrcode2 True .. image:: _static/modes/64.png :alt: 1-H QR Code encoding "64" Alphanumeric mode ----------------- The alphanumeric mode extends the :ref:`numeric-mode` by various characters. Namely about the upper case letters ``ABCDEFGHIJKLMNOPQRSTUVWXYZ``, a space character " " and other letters ``$%*+-./:``. .. code-block:: python >>> import segno >>> qrcode = segno.make('REVOLUTION NO. 9') >>> qrcode.designator 'M4-M' >>> qrcode.mode 'alphanumeric' .. image:: _static/modes/REVOLUTION9-micro.png :alt: M4-M Micro QR Code encoding "REVOLUTION NO. 9" As stated in :ref:`numeric-mode`, Segno tries to find the smallest possible code. To ensure a QR Code (and not a Micro QR Code), use the above mentioned factory functions: .. code-block:: python >>> import segno >>> qrcode = segno.make_qr('REVOLUTION NO. 9') >>> qrcode.designator '1-Q' >>> qrcode.mode 'alphanumeric' >>> qrcode2 = segno.make('REVOLUTION NO. 9', micro=False) >>> qrcode2.designator '1-Q' >>> qrcode2.mode 'alphanumeric' .. image:: _static/modes/REVOLUTION9.png :alt: 1-Q QR Code encoding "REVOLUTION NO. 9" Lower case characters are not covered by the alphanumeric mode, but by the :ref:`byte-mode` .. code-block:: python >>> import segno >>> qrcode = segno.make('Revolution No. 9') >>> qrcode.mode 'byte' .. image:: _static/modes/revolution9-byte.png :alt: 1-L QR Code encoding "Revolution No. 9" Kanji mode ---------- Kanji can be encoded compactly and efficiently and requires significantly less space than encoding the characters in UTF-8. .. code-block:: python >>> import segno >>> qrcode = segno.make('ビートルズ') >>> qrcode.designator 'M3-L' >>> qrcode.mode 'kanji' .. image:: _static/modes/kanji-micro.png :alt: M3-L Micro QR Code encoding "ビートルズ" .. code-block:: python >>> import segno >>> qrcode = segno.make_qr('ビートルズ') >>> qrcode.designator '1-Q' >>> qrcode.mode 'kanji' .. image:: _static/modes/kanji-qrcode.png :alt: 1-Q QR Code encoding "ビートルズ" .. _byte-mode: Byte mode --------- The byte mode covers all data which cannot be represented by the other modes. Segno tries, according to ISO/IEC 18004, to encode the data with ISO 8859-1. In case the data cannot be represented by ISO 8859-1, UTF-8 is used as fallback. .. code-block:: python >>> import segno >>> qrcode = segno.make('Turn off your mind relax and float down stream') >>> qrcode.designator '3-L' >>> qrcode.mode 'byte' .. image:: _static/modes/tomorrow-never-knows.png :alt: 3-L QR Code encoding "Turn off your mind relax and float down stream" The byte mode is also supported by Micro QR Code M3 and M4: .. code-block:: python >>> import segno >>> qrcode = segno.make('Let it be') >>> qrcode.designator 'M3-L' >>> qrcode.mode 'byte' .. image:: _static/modes/let-it-be.png :alt: M3-L Micro QR Code encoding "Let it be" .. _hanzi-mode: Hanzi mode ---------- The Hanzi mode is not covered by ISO/IEC 18004 and should be used with care since it is not widely supported by QR Code readers, although the `ZXing `_ project supports decoding QR Codes which utilize the Hanzi mode. .. note:: Since this mode is not covered by the ISO standard, Segno tries not to detect Hanzi. The user has to enable it explicitly. Further, the Hanzi mode is not available for Micro QR Codes. .. code-block:: python >>> import segno >>> qrcode = segno.make('书读百遍其义自现') >>> qrcode.designator '2-M' >>> qrcode.mode 'byte' The QR Code uses the :ref:`byte-mode` because no other mode fits. .. image:: _static/modes/hanzi-byte.png :alt: 2-M QR Code encoding "书读百遍其义自现" in byte mode To enable Hanzi, provide the mode in the factory function: .. code-block:: python >>> import segno >>> qrcode = segno.make('书读百遍其义自现', mode='hanzi') >>> qrcode.mode 'hanzi' >>> qrcode.designator '1-M' As shown, the input is encoded much more compact and a 1-M instead of a 2-M QR Code is generated. .. image:: _static/modes/hanzi-hanzi.png :alt: 1-M QR Code encoding "书读百遍其义自现" in Hanzi mode segno-1.6.6/docs/requirements.txt000066400000000000000000000000621476440322300170560ustar00rootroot00000000000000sphinx<7.4.0 sphinx_paramlinks~=0.6 furo<2025.0.0 segno-1.6.6/docs/serializers.rst000066400000000000000000000232421476440322300166650ustar00rootroot00000000000000QR code and Micro QR code serialization ======================================= A QR code or Micro QR code is independent of its output, it's just a matrix. To save a QR code or Micro QR code, Segno provides several output formats. Segno provides a :py:func:`segno.QRCode.save` method to serialize a (Micro) QR code in different formats: .. code-block:: python >>> import segno >>> qrcode = segno.make('Tomorrow Never Knows') >>> qrcode.save('tomorrow-never-knows.svg') >>> qrcode.save('tomorrow-never-knows.png') >>> qrcode.save('tomorrow-never-knows.eps') .. image:: _static/tomorrow-never-knows-2-q.png :alt: 2-Q QR code encoding "Tomorrow Never Knows" Border ------ All serializers accept a ``border`` parameter which indicates the "quiet zone" of a (Micro) QR code. If ``border`` is ``None``, the default border (quiet zone) size will be used. If the resulting (Micro) QR code should have no border or a custom border, the user may specify the border explicitly. .. code-block:: python >>> import segno >>> qrcode = segno.make('Vampire Blues') >>> qrcode.save('vampire-blues.svg', border=0) # No border .. image:: _static/vampire-blues-m4-m-no-border.svg :alt: M4-M QR code encoding "Vampire Blues", quiet zone omitted .. code-block:: python >>> import segno >>> qrcode = segno.make('Vampire Blues') >>> qrcode.save('vampire-blues.png', border=10) # Larger border .. image:: _static/vampire-blues-m4-m-border-10.png :alt: M4-M QR code encoding "Vampire Blues", quiet zone of 10 Scale ----- Most serializers accept a ``scale`` parameter which indicates the scaling factor of the serialization. By default, the scaling factor is ``1`` which means that size of a dark / light module is interpreted as one unit in the specific user space (i.e. 1 pixel for the :ref:`PNG ` serializer or 1 point (1/72 of an inch) in :ref:`EPS `). Some serializers (like :ref:`PNG `) accept only an integer value or convert the provided scaling factor to an integer. Other, like :ref:`SVG ` and :ref:`EPS `, accept float values and do not "downgrade" it to an integer. .. code-block:: python >>> import segno >>> qrcode = segno.make_qr('The Beatles') >>> qrcode.save('the-beatles.png', scale=1.2) # No scaling at all since int(1.2) is 1 .. image:: _static/the-beatles-1-q-scale-1.png :alt: 1-Q QR code encoding "The Beatles" .. code-block:: python >>> import segno >>> qrcode = segno.make_qr('The Beatles') >>> qrcode.save('the-beatles.png', scale=10) # 1 module == 10 pixels .. image:: _static/the-beatles-1-q-scale-10.png :alt: 1-Q QR code encoding "The Beatles" .. code-block:: python >>> import segno >>> qrcode = segno.make_qr('The Beatles') >>> qrcode.save('the-beatles.svg', scale=2.4) # SVG accepts float values .. image:: _static/the-beatles-1-q-scale-2.4.svg :alt: 1-Q QR code encoding "The Beatles" .. code-block:: python >>> import segno >>> qrcode = segno.make_qr('The Beatles') >>> # The SVG serializer provides the "unit" parameter to specify >>> # how to interpret the values >>> qrcode.save('the-beatles.svg', scale=10, unit='mm') # 1 unit = 1 mm .. image:: _static/the-beatles-1-q-scale-10-unit-mm.svg :alt: 1-Q QR code encoding "The Beatles" .. code-block:: python >>> import segno >>> qrcode = segno.make_qr('The Beatles') >>> qrcode.save('the-beatles.svg', unit='cm') # 1 unit = 1 cm, result as above .. image:: _static/the-beatles-1-q-scale-1-unit-cm.svg :alt: 1-Q QR code encoding "The Beatles" Color of dark and light modules ------------------------------- Many serializers accept the parameters ``dark`` and ``light`` to specify the color of the dark modules and light modules. See :doc:`colorful-qrcodes` for details. .. code-block:: python >>> import segno >>> qrcode = segno.make("Sgt. Pepper’s Lonely Hearts Club Band") >>> qrcode.save('sgt-peppers.svg', dark='darkred', light='lightblue') .. image:: _static/sgt-peppers-dark_darkred-light_lightblue.svg :alt: 3-M QR code encoding "Sgt. Pepper’s Lonely Hearts Club Band" .. code-block:: python >>> import segno >>> qrcode = segno.make("Sgt. Pepper’s Lonely Hearts Club Band") >>> qrcode.save('sgt-peppers.svg', dark='#ccc') .. image:: _static/sgt-peppers-dark_685e5c.svg :alt: 3-M QR code encoding "Sgt. Pepper’s Lonely Hearts Club Band" .. code-block:: python >>> import segno >>> qrcode = segno.make("Sgt. Pepper’s Lonely Hearts Club Band") >>> qrcode.save('sgt-peppers.png', light=None) # Transparent background .. image:: _static/sgt-peppers-light_transparent.png :alt: 3-M QR code encoding "Sgt. Pepper’s Lonely Hearts Club Band" .. code-block:: python >>> import segno >>> qrcode = segno.make("Sgt. Pepper’s Lonely Hearts Club Band") >>> # Dark modules = transparent, light modules = black >>> qrcode.save('sgt-peppers.png', dark=None, light='black') .. image:: _static/sgt-peppers-dark_transparent-light_black.png :alt: 3-M QR code encoding "Sgt. Pepper’s Lonely Hearts Club Band" .. code-block:: python >>> import segno >>> qrcode = segno.make("Sgt. Pepper’s Lonely Hearts Club Band") >>> # Dark modules with alpha transparency >>> qrcode.save('sgt-peppers.png', dark='#0000ffcc') .. image:: _static/sgt-peppers-dark_0000ffcc.png :alt: 3-M QR code encoding "Sgt. Pepper’s Lonely Hearts Club Band" .. code-block:: python >>> import segno >>> qrcode = segno.make("Sgt. Pepper’s Lonely Hearts Club Band") >>> qrcode.save('sgt-peppers.svg', dark='#00fc') # Same as above but SVG .. image:: _static/sgt-peppers-dark_00fc.svg :alt: 3-M QR code encoding "Sgt. Pepper’s Lonely Hearts Club Band" .. code-block:: python >>> import segno >>> qrcode = segno.make("Sgt. Pepper’s Lonely Hearts Club Band") >>> # Anonther color, save as compressed SVG >>> qrcode.save('sgt-peppers.svgz', dark=(8, 90, 117)) .. image:: _static/sgt-peppers-dark_890117.svg :alt: 3-M QR code encoding "Sgt. Pepper’s Lonely Hearts Club Band" Saving QR codes to streams -------------------------- If the QR code should be serialized to a buffer, use the :paramref:`kind ` parameter to specify the output format. Please note that some serializers write bytes while others write strings, see :py:meth:`segno.QRCode.save` for details. .. code-block:: python >>> import segno >>> import io >>> qrcode = segno.make('Paul McCartney') >>> buff = io.BytesIO() >>> qrcode.save(buff, kind='svg') >>> # All other serializer parameters are supported as well >>> buff = io.BytesIO() >>> qrcode.save(buff, kind='svg', dark='darkblue', light='#eee') .. image:: _static/paul-mccartney.svg :alt: M4-L QR code encoding "Paul McCartney" See :py:meth:`segno.QRCode.save` for a complete reference which parameters are accepted by the specific serializer. More colorful QR Codes ---------------------- The :ref:`SVG `, :ref:`PNG ` and :ref:`PPM ` serializers support more than two colors. .. code-block:: python >>> import segno >>> qrcode = segno.make('Yellow Submarine', version=7, error='h') >>> qrcode.save('qrcode_yellow-submarine.png', scale=5, dark='darkred', ... data_dark='darkorange', data_light='yellow') .. image:: _static/colorful/qrcode_yellow-submarine.png :alt: Colorful 7-H QR code encoding "Yellow Submarine" See :doc:`colorful-qrcodes` for available options. .. _serializers: Available serializers --------------------- ANSI ANSI escape code. The serializer supports the `border` keyword, only. See :ref:`ANSI ` for details. EPS Encapsulated PostScript (EPS). The serializer provides all default features (scale, border, color of dark / light modules), see :ref:`EPS ` for details. LaTeX LaTeX / PGF/TikZ. The serializer provides no support to change the color of the light modules, but all other default features (scale, border, color) are supported, see :ref:`LaTeX ` for details. PAM Portable Arbitrary Map (PAM). The serializer provides all default features (scale, border, color of dark / light modules), see :ref:`PAM ` for details. PBM Portable Bitmap (PBM). The serializer does not support any coloring, but the common featurs like scale and border are supported, see :ref:`PBM ` for details. PPM Portable Pixmap (PPM). The serializer does not support transparency, but the common features like scale, border and (multiple) colors are supported, see :ref:`PPM ` for details. PDF Portable Document Format (PDF). The serializer provides all default features (scale, border, color of dark / light modules), see :ref:`PDF ` for details. PNG Portable Network Graphics (PNG). The serializer provides all default features (scale, border, color of dark / light modules) and a few more to customize the output, see :ref:`PNG ` for details. SVG Scalable Vector Graphics (SVG). The serializer provides all default features (scale, border, color of dark / light modules) and many more to customize the output, see :ref:`SVG ` for details. SVGZ (compressed SVG) is supported as well. TXT Text output. The serializer does not support any scale or color, but the characters for the dark and light modules may be specified, see :ref:`TXT ` for details. XBM X BitMap (XBM). The serializer does not support any coloring, but scale and border are supported, see :ref:`XBM ` for details. XPM X PixMap (XPM). The serializer provides all default features (scale, border, color of dark / light modules) and a few more, see :ref:`XPM ` for details. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/docs/special-qrcode-factories.rst�������������������������������������������������������0000664�0000000�0000000�00000005104�14764403223�0021176�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Special QR Code factory functions ================================= The :py:mod:`segno.helpers` module provides factory functions to create common QR codes for encoding WIFI configurations, :doc:`vCards and MeCards `, :doc:`EPC QR Codes ` or `geographic locations <#geographic>`_. The created QR codes use at minimum the error correction level "L". If a better error correction level is possible without changing the QR Code version, the better error correction level will be used. Create a QR code for a WIFI configuration ----------------------------------------- .. code-block:: python >>> from segno import helpers >>> # Create a WIFI config with min. error level "L" or better >>> qrcode = helpers.make_wifi(ssid='My network', password='secret', security='WPA') >>> qrcode.designator '3-M' .. image:: _static/wifi/wifi_default.png :alt: 3-M QR code encoding a WIFI configuration If you want more control over the creation of the QR code (i.e. using a specific version or error correction level, use the :py:func:`segno.helpers.make_wifi_data` factory function, which returns a string which encodes the WIFI configuration. .. code-block:: python >>> import segno >>> from segno import helpers >>> config = helpers.make_wifi_data(ssid='My network', password='secret', security='WPA') >>> config 'WIFI:T:WPA;S:My network;P:secret;;' >>> # Create a QR Code with error correction level "H" >>> qrcode = segno.make(config, error='h') >>> qrcode.designator '4-H' .. image:: _static/wifi/wifi_data.png :alt: 4-H QR code encoding a WIFI configuration .. _geographic: Create a QR code encoding geographic information ------------------------------------------------ .. code-block:: python >>> from segno import helpers >>> latitude, longitude = 38.8976763,-77.0365297 >>> qrcode = helpers.make_geo(latitude, longitude) >>> qrcode.designator '2-M' .. image:: _static/geo/geo_default.png :alt: 2-M QR code encoding a geographic informatiion A factory function for encoding the geographic information as string is also available. .. code-block:: python >>> import segno >>> from segno import helpers >>> latitude, longitude = 38.8976763, -77.0365297 >>> geo_uri = helpers.make_geo_data(latitude, longitude) >>> geo_uri 'geo:38.8976763,-77.0365297' >>> # Use error correction level "H" >>> qrcode = segno.make(geo_uri, error='H') >>> qrcode.designator '4-H' .. image:: _static/geo/geo_data.png :alt: 4-H QR code encoding a geographic informatiion ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/docs/structured-append.rst��������������������������������������������������������������0000664�0000000�0000000�00000007043�14764403223�0020003�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Structured Append ================= The Structured Append mode can be used to split a message across several QR codes (it's not available for Micro QR codes). Example: The 2-L QR code encodes the same information ("I read the news today oh boy") as the following 1-L QR codes which are using Structured Append: .. image:: _static/sa/structured_append_2_l.svg :alt: 2-L QR code encoding 'I read the news today oh boy' With Structured Append (version 1): .. image:: _static/sa/structured_append_1_l-02-01.svg :alt: 1-L QR code encoding 'I read the news today oh boy' part 1/2 .. image:: _static/sa/structured_append_1_l-02-02.svg :alt: 1-L QR code encoding 'I read the news today oh boy' part 2/2 Segno provides a special factory function, :py:func:`segno.make_sequence`, to create a sequence of (up to 16) QR codes. The function returns instances of :py:class:`segno.QRCodeSequence`. Structured Append by QR Code version ------------------------------------ To create a sequence of QR codes, the QR Code version must be specified. The number of symbols is automatically determined by the QR Code version. .. code-block:: python >>> import segno >>> qrcode_seq = segno.make_sequence('I read the news today oh boy', version=1) >>> len(qrcode_seq) 2 >>> # Creates "a-day-in-the-life-02-01.svg" and "a-day-in-the-life-02-02.svg" >>> qrcode_seq.save('a-day-in-the-life.svg', scale=10) If the provided content fits into one QR code, the sequence behaves like a :py:class:`segno.QRCode` instance. .. code-block:: python >>> import segno >>> qrcode_seq = segno.make_sequence('I read', version=1) >>> len(qrcode_seq) 1 >>> qrcode_seq.designator '1-H' >>> # Creates "a-day-in-the-life.svg" >>> qrcode_seq.save('a-day-in-the-life.svg', scale=10) Structured Append by number of symbols -------------------------------------- The number of desired QR code symbols may be specified directly. The utilized QR Code version is automatically determined by the number of symbols. .. code-block:: python >>> import segno >>> qrcode_seq = segno.make_sequence('Day after day, alone on the hill', symbol_count=4) >>> [qrcode.designator for qr in seq] ['1-Q', '1-Q', '1-Q', '1-Q'] >>> qrcode_seq = segno.make_sequence('Day after day, alone on the hill', symbol_count=2) >>> [qrcode.designator for qr in seq] ['2-Q', '2-Q'] >>> qrcode_seq = segno.make_sequence('Day after day, alone on the hill', symbol_count=6) >>> [qrcode.designator for qr in seq] ['1-Q', '1-Q', '1-H', '1-H', '1-H', '1-H'] Example: The 6-L QR code encodes the same information (first verse of the song "Yesterday") as the four 2-L QR codes. .. image:: _static/sa/structured_append_example_2_6-L.svg :alt: 6-L QR code encoding 'Yesterday...' The following 2-L QR codes were created by specifying that 4 codes should be generated (:paramref:`symbol_count=4 ` ). The result would be the same if the user specifies that a sequence of QR codes with version 2 should be created. .. image:: _static/sa/structured_append_example_2_2-L-04-01.svg :alt: 2-L QR code encoding first verse of 'Yesterday' part 1/4 .. image:: _static/sa/structured_append_example_2_2-L-04-02.svg :alt: 2-L QR code encoding first verse of 'Yesterday' part 2/4 .. image:: _static/sa/structured_append_example_2_2-L-04-03.svg :alt: 2-L QR code encoding first verse of 'Yesterday' part 3/4 .. image:: _static/sa/structured_append_example_2_2-L-04-04.svg :alt: 2-L QR code encoding first verse of 'Yesterday' part 4/4 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/docs/svg-options.rst��������������������������������������������������������������������0000664�0000000�0000000�00000026437�14764403223�0016632�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������SVG options =========== All options of the :doc:`colorful-qrcodes` are supported. Additionally, the following options are provided by the SVG serializer. Options ------- xmldecl ~~~~~~~ Boolean (default: ``True``) to enable (default) or omit (CLI: :option:`--no-xmldecl `) the XML declaration svgns ~~~~~ Boolean to enable (default) or omit (CLI: :option:`--no-namespace `) the SVG namespace declaration. svgid / :option:`--svgid ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String (default: ``None``). CSS identifier of the ``svg`` element. svgclass / :option:`--svgclass ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String (default: "segno"). CSS class of the ``svg`` element. Use ``None`` or an empty string to omit the attribute. lineclass / :option:`--lineclass ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String (default: "qrline"). CSS class of all paths. Use ``None`` or an empty string to omit the attribute. omitsize / :option:`--no-size ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Boolean to disable the ``width`` and ``height`` attributes (CLI: :option:`--no-size `). If set to ``True`` (default: ``False``) the attributes will be replaced by a ``viewBox`` attribute. nl ~~ Boolean (default: ``True``) to enable / disable a trailing new line character (``\n``) at the end of the document. It's enabled by default. Set to ``False`` (CLI: :option:`--no-newline `) to omit it. title / :option:`--title ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String (default: ``None``). Sets the title of the graphic. If empty or ``None``, the title is omitted. desc / :option:`--desc ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String (default: ``None``). Sets the description of the graphic. If empty or ``None``, the description is omitted. unit / :option:`--unit ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String (default: ``None``). Sets the unit of the ``width`` / ``height`` attributes. The unit is not checked, any non empty value is used as appendix to the numeric width / height attributes. Common values are "mm" or "cm". encoding / :option:`--svgencoding ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ String (default: "utf--8"). Sets the encoding of the XML document. If set to ``None``, the encoding parameter of the XML declaration is omitted but the XML default encoding "UTF-8" is used. .. note:: It is not recommended to set the encoding to another value than "utf-8" if ``xmldecl`` is set to ``False``. draw_transparent ~~~~~~~~~~~~~~~~ Boolean (default: ``False``). Set to ``True`` (CLI: :option:`--draw-transparent ` to draw transparent paths. svgversion / :option:`--svgversion ` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :class:`int` or :class:`float` (default: ``None``) Sets the SVG ``version`` attribute. By default, the attribute is omitted. Any given value is converted into a string. The value may have an impact on the generated paths since this lib assumes that a value lesser than ``2`` does not support `CSS Color Module Level 3 `_. .. note:: It's recommended to keep the default value. Optimizing SVG -------------- The SVG serializer supports several options to optimize the output. By default, a minimal, standalone SVG graphic is generated which includes the XML declaration, the SVG namespace and a trailing newline. .. code-block:: python >>> import segno >>> qrcode = segno.make('Penny Lane', error='h') >>> qrcode.save('penny-lane.svg', scale=4) .. image:: _static/svg/penny-lane.svg :alt: 2-H QR code encoding 'Penny Lane' XML markup: .. code-block:: xml To suppress the XML declaration, use ``xmldecl=False``. .. code-block:: python >>> import segno >>> qrcode = segno.make('Penny Lane', error='h') >>> qrcode.save('penny-lane.svg', scale=4, xmldecl=False) XML markup: .. code-block:: xml If the SVG graphic should be embedded into a HTML5 context, the namespace declaration is superfluous, omit it via ``svgns=False``. .. code-block:: python >>> import segno >>> qrcode = segno.make('Penny Lane', error='h') >>> qrcode.save('penny-lane.svg', scale=4, xmldecl=False, svgns=False) XML markup: .. code-block:: xml By default, Segno adds a ``class`` attribute to the ``svg`` element, further, it adds a ``class`` attribute to all paths. To omit the ``class`` attribute of the ``svg`` element, use ``svgclass=None``. To omit the ``class`` attribute of the paths, use ``lineclass=None``. .. code-block:: python >>> import segno >>> qr = segno.make('Penny Lane', error='h') >>> qr.save('penny-lane.svg', scale=4, xmldecl=False, svgns=False, svgclass=None, lineclass=None) .. code-block:: xml To replace the ``width`` and ``height`` attributes with ``viewBox``, use ``omitsize=True``. Since the graphic should take all available space, the ``scale`` may be omitted, too. .. code-block:: python >>> import segno >>> qrcode = segno.make('Penny Lane', error='h') >>> qrcode.save('penny-lane.svg', xmldecl=False, svgns=False, svgclass=None, lineclass=None, omitsize=True) XML markup. .. code-block:: xml Too squeeze the file size futher, omit the trailing newline character via ``nl=False``. .. code-block:: python >>> import segno >>> qrcode = segno.make('Penny Lane', error='h') >>> qrcode.save('penny-lane.svg', xmldecl=False, svgns=False, svgclass=None, lineclass=None, omitsize=True, nl=False) The result is almost the same, but you've saved a few (abt. 130) bytes .. raw:: html :file: _static/svg/penny-lane-optimized.svg ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/docs/third-party-projects.rst�����������������������������������������������������������0000664�0000000�0000000�00000001320�14764403223�0020420�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Third-party projects ==================== A possibly incomplete list of projects that extend Segno or show its use. The Segno project is usually not directly involved in the projects. qrcode-other-pattern -------------------- `qrcode-other-pattern `_ is a Segno plugin which changes the black modules into custom shapes instead of squares. It requires `Pillow `_. online-qr-code-generator ------------------------ `QR Code Generator `_ uses Segno to generate QR Codes online. The source code is available on `GitHub `_. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/docs/web-development.rst����������������������������������������������������������������0000664�0000000�0000000�00000011032�14764403223�0017420�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Web development =============== A few proposals how to use Segno with popular Python web application frameworks. Flask ----- There are various ways to output QR codes in Jinja templates in conjunction with Flask. See also the Flask example in the repository: https://github.com/heuer/segno/tree/master/examples/flask_qrcode Data URIs ~~~~~~~~~ Create a QR code in the Flask view and use the :py:func:`segno.QRCode.svg_data_uri()` or :py:func:`segno.QRCode.png_data_uri()` methods in the template. .. code-block:: python from flask import Flask, render_template import segno app = Flask(__name__) @app.route('/) def home(): qrcode = segno.make('The Continuing Story of Bungalow Bill') return render_template('example.html', qrcode=qrcode) .. code-block:: jinja QR Codes
Embed SVG QR codes into HTML ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Since HTML5 supports SVG directly, it's also possible to embed the generated SVG directly into a template. Create the QR code within the Flask view and use the :py:func:`segno.QRCode.svg_inline()` method in conjunction with the Jinja ``|safe`` filter. .. code-block:: python @app.route('/') def home(): qrcode = segno.make('While My Guitar Gently Weeps') return render_template('example.html', qrcode=qrcode) .. code-block:: jinja

{{ qrcode.svg_inline(scale=3) | safe }}
Create a view ~~~~~~~~~~~~~ Another possibility is to create the QR codes dynamically in a Flask view and deliver them with ``send_file``. .. code-block:: python BEATLES_SONGS = {'Yellow Submarine', 'Let It Be', 'Rocky Raccoon'} @app.route('/qr-png/') def qrcode_png(): data = request.args.get('data') # Check if the data is acceptable otherwise a 404 error is generated if data not in BEATLES_SONGS: return abort(404) buff = io.BytesIO() segno.make(data, micro=False) \ .save(buff, kind='png', scale=4, dark='darkblue', data_dark='#474747', light='#efefef') buff.seek(0) return send_file(buff, mimetype='image/png') .. code-block:: jinja Django ------ The project `django-segno-qr `_ provides a template tag for creating SVG QR codes in Django templates while `django-qr-code `_ provides more template tags and utility functions. Apart from that, the aforementioned information for Flask should also be adaptable to Django, so here is just a hint on how to save QR codes in a Django ``ImageField``. The complete code is in the repository: https://github.com/heuer/segno/tree/master/examples/django_qrcode Saving a QR code to an ImageField ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Assuming this simple model. .. code-block:: python from django.db import models class Ticket(models.Model): name = models.CharField(max_length=150, unique=True) qrcode = models.ImageField(upload_to='ticket-qrcodes/') Create a QR code with Segno and save it as PNG into a :py:class:`io.BytesIO` instance. .. code-block:: python import io import segno qrcode = segno.make('JULIA') # Save the QR code with transparent background and use dark blue for # the dark modules out = io.BytesIO() qrcode.save(out, kind='png', dark='#00008b', light=None, scale=3) Now you can use the content of the buffer as input for a Django ``ContentFile``. .. code-block:: python ticket = Ticket(name='JULIA') ticket.qrcode.save('JULIA.png', ContentFile(out.getvalue()), save=False) ticket.save() If for some reason the QR codes should be stored in the lossy file format JPEG, the ``qrcode-artistic`` plugin is required (see also :doc:`artistic-qrcodes`):: $ pip install qrcode-artistic .. code-block:: python import io import segno qrcode = segno.make('JULIA') # img is a Pillow Image instance img = qrcode.to_pil(dark='#00008b', scale=3) # Now use Pillow Image.save() to save the QR code out = io.BytesIO() img.save(out, format='jpg') # ... ticket.qrcode.save('JULIA.jpg', ContentFile(out.getvalue()), save=False) segno-1.6.6/examples/000077500000000000000000000000001476440322300144625ustar00rootroot00000000000000segno-1.6.6/examples/django_qrcode/000077500000000000000000000000001476440322300172615ustar00rootroot00000000000000segno-1.6.6/examples/django_qrcode/README.rst000066400000000000000000000002571476440322300207540ustar00rootroot00000000000000Example how to use Segno with `Django `_ See https://segno.readthedocs.io/en/latest/web-development.html#django for a detailed description. segno-1.6.6/examples/django_qrcode/qrcode/000077500000000000000000000000001476440322300205365ustar00rootroot00000000000000segno-1.6.6/examples/django_qrcode/qrcode/__init__.py000066400000000000000000000000001476440322300226350ustar00rootroot00000000000000segno-1.6.6/examples/django_qrcode/qrcode/admin.py000066400000000000000000000000771476440322300222040ustar00rootroot00000000000000from django.contrib import admin # Register your models here. segno-1.6.6/examples/django_qrcode/qrcode/apps.py000066400000000000000000000001271476440322300220530ustar00rootroot00000000000000from django.apps import AppConfig class QrcodeConfig(AppConfig): name = 'qrcode' segno-1.6.6/examples/django_qrcode/qrcode/forms.py000066400000000000000000000004461476440322300222420ustar00rootroot00000000000000from django import forms from django.core.validators import RegexValidator class TicketForm(forms.Form): """Simple form for the Ticket model.""" name = forms.CharField(label='Name', max_length=150, min_length=1, validators=[RegexValidator(r'^[A-Z0-9]+$')]) segno-1.6.6/examples/django_qrcode/qrcode/migrations/000077500000000000000000000000001476440322300227125ustar00rootroot00000000000000segno-1.6.6/examples/django_qrcode/qrcode/migrations/0001_initial.py000066400000000000000000000010751476440322300253600ustar00rootroot00000000000000# Generated by Django 3.1 on 2020-08-18 14:26 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Ticket', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=150, unique=True)), ('qrcode', models.ImageField(upload_to='ticket-qrcodes/')), ], ), ] segno-1.6.6/examples/django_qrcode/qrcode/migrations/__init__.py000066400000000000000000000000001476440322300250110ustar00rootroot00000000000000segno-1.6.6/examples/django_qrcode/qrcode/models.py000066400000000000000000000004021476440322300223670ustar00rootroot00000000000000from django.db import models class Ticket(models.Model): """Example which stores an alphanumeric name and the name as QR code. """ name = models.CharField(max_length=150, unique=True) qrcode = models.ImageField(upload_to='ticket-qrcodes/') segno-1.6.6/examples/django_qrcode/qrcode/templates/000077500000000000000000000000001476440322300225345ustar00rootroot00000000000000segno-1.6.6/examples/django_qrcode/qrcode/templates/qrcode/000077500000000000000000000000001476440322300240115ustar00rootroot00000000000000segno-1.6.6/examples/django_qrcode/qrcode/templates/qrcode/example.html000066400000000000000000000005211476440322300263300ustar00rootroot00000000000000 Django QR Codes

Create a ticket

Only uppercase characters and numbers are accepted as name

{% csrf_token %} {{ form }}
segno-1.6.6/examples/django_qrcode/qrcode/tests.py000066400000000000000000000000741476440322300222530ustar00rootroot00000000000000from django.test import TestCase # Create your tests here. segno-1.6.6/examples/django_qrcode/qrcode/urls.py000066400000000000000000000002401476440322300220710ustar00rootroot00000000000000from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('thanks/', views.thanks, name='thanks'), ] segno-1.6.6/examples/django_qrcode/qrcode/views.py000066400000000000000000000017051476440322300222500ustar00rootroot00000000000000import io from django.http import HttpResponse, HttpResponseRedirect from django.core.files.base import ContentFile from django.shortcuts import render import segno from .models import Ticket from .forms import TicketForm def index(request): """Renders the form to create a ticket""" if request.method == 'POST': form = TicketForm(request.POST) if form.is_valid(): name = form.cleaned_data['name'] qr = segno.make_qr(name) buff = io.BytesIO() qr.save(buff, kind='png', scale=3, dark='darkblue') ticket = Ticket(name=name) ticket.qrcode.save(name + '.png', ContentFile(buff.getvalue()), save=True) return HttpResponseRedirect('/thanks/') else: form = TicketForm() return render(request, 'qrcode/example.html', {'form': form}) def thanks(request): return HttpResponse('Thanks, a new ticket was created') segno-1.6.6/examples/django_qrcode/requirements.txt000066400000000000000000000000241476440322300225410ustar00rootroot00000000000000Django>=3.0 Pillow segno-1.6.6/examples/flask_qrcode/000077500000000000000000000000001476440322300171175ustar00rootroot00000000000000segno-1.6.6/examples/flask_qrcode/README.rst000066400000000000000000000002541476440322300206070ustar00rootroot00000000000000Example how to use Segno with `Flask `_ See https://segno.readthedocs.io/en/latest/web-development.html#flask for a detailed description. segno-1.6.6/examples/flask_qrcode/__init__.py000066400000000000000000000000001476440322300212160ustar00rootroot00000000000000segno-1.6.6/examples/flask_qrcode/qrcode.py000066400000000000000000000023131476440322300207450ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Copyright (c) 2016 - 2020 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Example Flask app to show different possibilities to embed Segno. """ import io from flask import Flask, render_template, request, send_file, abort import segno app = Flask(__name__) @app.route('/') def home(): qr = segno.make('The Continuing Story of Bungalow Bill') return render_template('example.html', qr=qr) @app.route('/qr-svg/') def qrcode_svg(): data = request.args.get('data') if data not in ('Savoy Truffle', 'Rocky Raccoon'): return abort(404) buff = io.BytesIO() segno.make(data, micro=False).save(buff, kind='svg', scale=4) buff.seek(0) return send_file(buff, mimetype='image/svg+xml') @app.route('/qr-png/') def qrcode_png(): data = request.args.get('data') if data not in ('Savoy Truffle', 'Rocky Raccoon'): return abort(404) buff = io.BytesIO() segno.make(data, micro=False) \ .save(buff, kind='png', scale=4, dark='darkblue', data_dark='#474747', light='#efefef') buff.seek(0) return send_file(buff, mimetype='image/png') if __name__ == '__main__': app.run(debug=True, port=5673) segno-1.6.6/examples/flask_qrcode/requirements.txt000066400000000000000000000000151476440322300223770ustar00rootroot00000000000000flask~=2.3.2 segno-1.6.6/examples/flask_qrcode/templates/000077500000000000000000000000001476440322300211155ustar00rootroot00000000000000segno-1.6.6/examples/flask_qrcode/templates/example.html000066400000000000000000000015511476440322300234400ustar00rootroot00000000000000 Flask QR Codes

QR Code embedded as data URI

PNG data URI


qr.png_data_uri(dark='darkblue', data_dark='steelblue', alignment_dark='darkgreen', scale=3)

SVG data URI


qr.svg_data_uri(quiet_zone='#eee', scale=4)

SVG embedded in HTML

{{ qr.svg_inline(dark='darkred', scale=3) | safe }}

SVG image tag

PNG image tag

segno-1.6.6/examples/logo/000077500000000000000000000000001476440322300154225ustar00rootroot00000000000000segno-1.6.6/examples/logo/README.rst000066400000000000000000000007311476440322300171120ustar00rootroot00000000000000Example to add an image to a QR code. See https://github.com/heuer/segno/issues/116 ``add_logo.py`` requires `Pillow `_. blackbird.jpg ------------- * LICENSE `CC0 1.0 Universal Public Domain Dedication `_ * CREATOR `Bernard Spragg, NZ `_ * SOURCE https://commons.wikimedia.org/wiki/File:Blackbird._(Turdus_merula)_(9513269847).jpg segno-1.6.6/examples/logo/add_logo.py000066400000000000000000000021051476440322300175420ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Copyright (c) 2022 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Example how to add an image i.e. a logo to a QR code. Requires the Pillow lib. """ import io from PIL import Image import segno out = io.BytesIO() # Nothing special here, let Segno generate the QR code and save it as PNG in a buffer segno.make('Blackbird singing in the dead of night', error='h').save(out, scale=5, kind='png') out.seek(0) # Important to let Pillow load the PNG img = Image.open(out) # Ensure colors (Segno saves a grayscale PNG to reduce the file size), use 'RGBA' if you need transparency img = img.convert('RGB') img_width, img_height = img.size logo_max_size = img_height // 3 # May use a fixed value as well logo_img = Image.open('./blackbird.jpg') # The logo # Resize the logo to logo_max_size logo_img.thumbnail((logo_max_size, logo_max_size), Image.Resampling.LANCZOS) # Calculate the center of the QR code box = ((img_width - logo_img.size[0]) // 2, (img_height - logo_img.size[1]) // 2) img.paste(logo_img, box) img.save('qrcode_with_logo.png') segno-1.6.6/examples/logo/blackbird.jpg000066400000000000000000000413651476440322300200520ustar00rootroot00000000000000lExifMM* JT\(SONY DSCHHC     C  ?" E!1AQa"q#2BRb$3r%c4CDSs.!1A"Qa2q# ?i* 5|F8T ӻ;0 hVaOUnT|PۤBx QmDL[[LUD2 8V5CndV Oi[ہIc';B2+Zb%5a!7TFjn^SKԦ}*/9HR$C$L)gq&I}eDWm6a*BU=fp =_~SpgK! J>/rNB3aE}! CeRT=1V]@'fRZJIox";RqO*eRRe!?K6K`*6К*YA8GZHCiX…2+'թ"pp)ғ{*lV!:[DEz+ hBSӚQ7 xS#=N )QwUSNQ$sC5 3DJ>cx~>ێGzSg`nRu0x曹=;Hsv;Qt=1ESpGJp0:Q!־-ܲY^}+'$XF A=)#4I޺J/5YI5Y=ɫMp6@aI)5qGJ-=(۞Htc(+rqSQ2zPQ6xn%.$F r;Ԧ M4b8 GF1SfM,cf8"̔搝)FGpDt{Rv/.iH 5QL/'ym<^z vF|kodivK$'р%GB~A}b茄#5*B[ٯCUJ=̻PGmX84tJI bYߚjXH֚,ϴ {,H5EۓCY)&j2Sϵ o&PڹD*A,X.\S${ 󓔵Wl8-hUg#I@8+qNR8N%Dd`W"TqRTn~C 9Pփ]XD+}3T[y(%櫻QVYݓ C%.`w۽Po;}M LVqi5:Ұ NX]E)$ܚ@DyrzSNcQN oI0䋤Ž<W %J<\KknS6IqaZeOXzV~ERTqUއ~vO rG>Wnb9hvӇ DRTp@ h-Ed'b֗Two.42XaDY.2B98<~zg\&N>!GQ: !QxkK$MOsC5#D D+[S 2flnvŴR붇a'#WRعCңWt{݂zn=ku«}v$X ⛹uUH`9sH?z9u*nh ޠ 5; ڮd57_p=#F8OWu469;L.#!AC+Saxk!J< Bԛ\S +]"8JI{cpqX~ձոHrh/cDm@½;bK;5x4eoѶqQ>kaj72yVw VgojӒoSdRz--IjҧI9sPi -E+itp[2CIlݕKWuګ{)e)*씓aOnQnN%KQCsʀj̉Jynj.m,25mo)1@PJB@$Vk]M>uKRpBp$\ŴzmA EM;)S#B[]F^Zm~U@:Pt%{USv^w]wKp]uON7Rj.+'yW%6B1=>"l/:ޡX$_:Fɑ{6i7fJiWTBh \X# xVBOej[+ -GIHR9P/k:nն$Gm<y?^;T熟٦arvk/kMu7ZY.|,bk(JG葚Mq>Q&6 jn,,"0VuSUơ+5ɲCK'zk!8&uo03+_;Sn[[IjX50JӸ܎+Ku}UnH;U#M(jHRHo3:m#j_2S ҿ-ӄjޙ4jd-losq+tiS^nW?;k+#<-d*S4 A[h#ڵݣX݈8YQI%e\5'# 4;s W8J~c|pp5)P".|n K*XL -G;^cUᆍgOZ7BO-{:o3ޤr{iTԞH=)9!% NzԒtA3q MlJn?OiyEra p5oBV)=T9#ۥ*DuJwkkWl {R%&M,H_ `>DJ8Σڗh`^ӌ)O5z`4OZ2q-28 HnX%!1ɩ&}Hl)TpX>IԋyNAf-#@KJr Ÿ[sRF<4$J6a$))Vxy}d] B~x+iu[PJN7'5D!]LTD#5Yɍj#H]m_--Z•=&%" ;fCtGSgc(Z8RHJY:qyY-86u5/Jf4N [pOj /TNKl^F>ܔr>dz- 8*> nM1rXAKzp*ib a(H=>ۛ+}(a vLi-5\4QRWLoaH]TWݏ,a>jY~ t]Z*JaMѢR?JV,!Y .]leYIw?Bx]w7y!ZR3ڵ_Q>ShpjݱvR@@M ،Ct;jaJ6$mi@{ToR^eab:U*4z4W_pUK29!mT>ڟu*P'&8v$ֲ_&_?È^ |rjĝYCi>`wZ^ڊ}Ey* !+`==j_jn_?jܯʾ>!D'֑ACLH A#{Vl,vn}YkǖV7t:}ǙrjiЅ9z/%IpI-MndF;$>NeG s]! VXC)Ӗv^,5_v1Է \[o6"pIŠ.q>bp2G~Q)/!lrۊR sH136l,8NG;p6?pe-8ʔw`~ 'ҠK^gFO4\SĞ7vSK\@O /r]s r3XRRBOY zվBN Rs9kz;b;)(9eYiFy"I2kd +''>'Ȍ"n[寻jV䤞Oۑ-מ)1_l2j7!^W˸vNxKJ]%J)RR{ʥ zj.-y77`a28ܓІk bM`JD$ Kla`w##h0F15_nC (#5oNVO#U+ d.:]ߕDO>ԖV!,̬|?V2vr`f苙Xu`'9?CcC@񢶹NqIR1רgj-˵A\!FK<)B;TDi2%NzD6^J-7ڐ@A "}݌Рo qnzRPn76rJ|Vshd{sc+ ?TQWyMs% Wq։8[ Esi _8R?8zZgZNNָYlJH$;昭qHpw/=:/$bI@Rc~c֝3>rhO׎ )G9LB'WmOrD̔R F>$:帱$Z/G۪갷Tt1e7|;Gės)vm)u8N)$[r.;\hA4\xӣqmeCE[DKX!E?m4V~w/C2C%ԅM|KbKoz|0 J,ᤕqU_%eKJJǥfV;3ycqrhO)+كbHJyt'ǂꢒFa,51=JH¿zv[e% uo1zCj,ܸ] %hv(4rb L$K&u)`czJ|)ڡ w)O\Uoe!qqТ-Z)_kY+=? J>Z;{[Ryy6/ȷP?:^|]%{f)`'AupW$jZgzGu"a*TҋLv'nYBnA$ޚ@k֯ޖԍ%mRZ}iذۘeƍReDvCO/SA}=I,?ȴ>OsS˓󮗤u)g*ZNOzBCI'T- Zʆs#{}{W;d$vO8 dx!11A_'[?{chYӷzKmzf-ĩdRR> ~U ?n.Cd@ђr8NMF64O,'>QG?Zߘ .;Juij jf44/"# 8P SnyҦ([[K}.NDy~[De)H$sjD*ZUJVNJs?}z҂wsoH^녒^wn|<FppbuD>Ia{G#t)+JX ǮSQ2Y\e *+'yZp]!댢IwtnnI-#Vv c*i3e61SW0:@q|. Υ%D0jP8?璬tJF[NœLTࢂ2rYr*kOO$G0Z1q( .({Wv-uxh?K)AN1^: $7t hM16''щ-$ sJL-*D`)BP4io H 9T+d8m!"K08.ߚ r]B:v5M W{e*NsQ}|N-ô$sYl٩qYqU7Vy,Bׯ-ƖF޼9|eqQjBsˇz">v[uJ9>"G^)ceI8U2cu^PhbfNkm.s(.PYeX?Eo.TCT@rBv'irڶ#WEŖۙIA6C;reKRwj BGrxZ_NGS̓)ux/V_ktV #jEm)OQwVn-!/q#zóoܮ&Rg<dRN"kgOGj ]A襄#+"cʏe rQm:d[ u,s],) \<}MbSd![JYLvWiA9e6vΰ=>ZxMe.2Lڣ2FǒAI9mE2P^εuV,^zΕq}PluG\0b"FKSIӜ{;ԯ( ‚ BGAZ7Ct!=U̶MvpDuqVg'/PKVɉ jFā5cn!Ma;=!L4FnTU.T<TJ|)m.[rm@WO;!o(O%1 smȜѧ[_$6rꝲGu!G;#lg֖r^C٫spSK)%ح;'S'x/iC( .He#AVwK#0hd͕->Rrbz(AGB%ʗv1͆BOusB!q_ŷY")+Qܞk}h-vFe,nZyHۻq's޲241!!9(3RG&RICc7Ob8D1#G 0٦UƊkWbD& 2րoBdU]I̻\+*-H^}*AavFx4D,0 AOHOBjuflc5b+l/zR]V0t̩w,!SJޜ"H#1ZZ) r3jWe )2m>u˗ũ/C&ơsrTsY]Ӳʔj|-+pQ,(  $ڙ{p*=]y9]x9,>X$uO7Ma,n!^c6UnPs}RUzS'<6;rwtp<%'֡ N=zk;%#{aor=r8 N8ZSYm/*%a e(`zG*5wymKJ0 lB 'ĘJ+JF UIrÁ+V-w~F̸|{MZ#TZf;rd\!T-a5⓭tG.:US;Z VZIq>OɨW8YqC [C$ظxOUۭOIuԞJsjkl9K\BNwz0gt漯G_ q4r+ QVTO&jHOj*FT3Ԟ)s-hM6jC ^W# ڃœL"Tu%)ݕ+ϠW)-Nm)m=(D qɘ[K\!.-'Un4Ih6+EζiID5&#qՆ3)Ys qA.C=q^'Wuqa~\QLR ۚaiL%ÍH-/6I=Kkq*LoSWdVp119446!C.o;09 j˵wBY?{5dKȱʲUir0;:z j*A0:m*qr O[*5#n]<{z T֮%W$ X@[^qwpNw Rܒ7}k2[%дq|?y#ƽYGK,UvV7(Ν&))J *II#nw"HoZ"~M9A@_d'8UT#RSrw+C`&h;#T,3#=J@Y\3(% :+ŮyrS~u$r>{.+Y#r+dq: #Gj^vVX!-#f5e>T߹lim1E͍XM/YINӄ+FF:bjLڤ]oQ)ʔ֢xE#AyaJ]&4͕Ұ/{i||6w9?Z?ߌW/nCs!$k>ݪ.H+YR8ѪieʹҢJxJ`ln3 LvʕDR. yjqGO4pQV{&LKpL68TCCGf^** )QV 䚏\9t!B$T?l,**Rb6~cwAL/(>J!6Ɍ.yP*qD_SUJJ+;-3j4JNk.,ߧqHrY! k-.H`A#nˎ6\vGhړ~^H(X06ץt1]G!|$Bs{v[v!?2W(TRs@Fz|N0q\QRI$?Hےn+BFB Z@%==MxcJ-0`ۘpAYgry)rh[l7 ?v52!\UVNP<C^GK]G6nXZ +:ҬʫNNLCSc`h\yZ$> -MUԿn,M+Q#Pgw+Un u7O\ZӁE򲑐I<[ym ڕ*.v32z~R`tϥW: c!͓"A55( zW G8KUi"vj9T"rľY4V+'HÍ9YN]&ŒB)f)ۊ?rR\y86W -=7!^H^)ڴڏ#Ui=q_LERzT^:%5';U[>J_K%[~S5\VT3|OS(VwODe#VF+Kh(:˜6Hy*y**5lʏjmIk(n%Gr}+gM[UF89r1]I-Z&QI28T%#>|T^R'-Q($$bU{MRVU$F$A?^?J9uaK&Wϓlr:!„ɛ欓'k٫%[Gja:wLc(K_^DT0w-)Ft~|^:w3!і[8l^M-EfSjI]|dZI=*>#$ ?/rݠܑmfBXZ\s3Qr44jiR8 T:JβM&$Wc<һsI6H,(D?\C'֮=0cGCVsSR//=R ۃ WJ僒re=$z>`ұ"sKu~[L4?u?Rp$~^DvK3-RYQ- i@s}qVݺSܝӗMi-鎶l =%[yYHxC͗""ERPn:O-_}y9ʻP۝OjdNPcAo Wr/'G$) 'gOK G2p*mv9޿s\ЉOx–F+^dYuR=}] WV鯳_W2!85~^L,&Jy>QM7|M#}G!9pjN)ʉX+vAE5o!F(a ,' #7PG+` KVDTk(6kG]1"PN?LWEEɾJ3O|BV3{QUN2쇀m\ rQC׽B['"3 ~5miIY NOCGPwtgҘWU;/<#\RO(* vi_CޛR>@I+OzKd6@ ՗,kd(RBU6ח:~6q+RPPx,T=ZowNvi-E`?2Y5d`=| ?"*}d%G%GI;$ sUΰ[B'ݳ%Z:6|>-״6[fkcp۠}P3Tw5TAmL}+ejWޒ[’rJ }yVfq 6nfiJLAH#ҷ[7ȯE]l-|:U7Ƹ[P-)J:Q|Mg^VRrk 1€~ZcN-w+]T0WZ *=I954}yM8r,62ܕn+{K𙐘Ħߘ)_Te'c[KԜdU!J94:A;zrBGzj^3>c=gvQ (R֝Ζn*!*IsKC!󎗕G\>m#q^b$^+>^TҸ{4PrG'ڻ6cPX{2;JSy(*{k|D?i@@ i|[0kFZp/[SXMn$e),;6>w7XRˉ3=\}.~5$'{N}htjqi˂S*FRqCu](BO&j,yζ-ܰNv'/c9zV-oxRG[bRx#:F>母ɥqb j *<'ְ@°{Ⳛo&qhL؜ntIN0B0Izg h[qPdmOϭ5㎿r hg$$S%]Rx)`%ʔxHYPZ͋jm’.GҬS'VK|Q;l`a)ʑcˍ-C(Z"Nv/&O8꿺jǢkiDTLy?Rӛ>ǽ`:6$?"kQa\Kj1=3N|{|7pϗ"n1*Je)8S?m9O]BYZ@9JzZcw5maq@b@*PN>d9I˔n|%_Eῷh[d~w&䤂 TӃMB~ ԱS\m;7TX٭\Wy2e`l I8[2V*=f[RXL#g;+Wt"#JR?AA $ϭu.eՆZΊ< Y{se8@URowĕ^H^y*[M,MLx VPxxBMQBSɘ$)$IPRH؊l$GdpN(ny (ʷTO%uF]`+!l4kou-ȳDniwJgvonV-2eSR[Nw Rw *jO\8;`K|;aԒIPT`}G5,UW_/1tn]C i CrUj_<|u飕a2TS=\) DbR_VcCPAqڝPOOZ3_&qM.. %Z,E,mIp-zpi@+R#b5٤\IkK>#bH a`uF;FhBU?5՜ K,ǝ^՛D emcs r!""!33"" ;v9(RBa``11o8=̵yj{'(J^h)0ԁ<@H(X=ƃAqlu6(Q¯g,-ˣAW %l%D@DJ !%!$ ;$DD$Gwb1Ix'Am;~$]!kZ$" KyeYRHADh4zY6L[wƝ̝;=pzzf: FBsl- DRJ"R Iy{Vvl ['# &BD1;fD?]MOQaT9QH  =()LDp&q2Fqk55=wnԹF}T ɜ(x "DB"fB" :AB  @`ffGY ; @B$pb`f,H"plRz3zqKW&$'(BW+J@DBkM@Z*iaظ女7j3bz4z;FkA@J";BQ*!  s9@x 9:fw',сsp7>Mg™j}TT8՛FG%sN*B@(DB~.; DDHD9k9;&+2|~'p׿fIE 2U MFP&V {ң?pL6SRAf8N֍m$pHDB "JH0)Mv:v:gu"""# cCڻqh4d=FdJBm)IR2:qpi#\=[4RQhVWWPHRֱ5VJJ)P( ƀsu13" "VE58Yk;:fv90l'?TR"z,P 1NFMm٧N=vz\Qăjn֯;~$<3 33BK@Q[tDkc;w2 ekفN[k[u;SvyҝVo [ӵ l NP$H;6d&ۭFcϾ0;P˖QfQ&|޹`҉$깇nO?t_u\OoY)l Z߻{\L P8ݯH%3vyQ}eH";y/2EOJ sfֵ͝V륥f/z$,Lkm\N)UkעQ/ dtғ qJY!TFwkۯ<Y(O5JbyniM㝝VN1,2[BBN? G;siaeٿW|"h'?D@n+bO$HKBLu6m\{# <ĘX^9LAleR*)Pg٧h{{V);t;NSi|uߏR*^_w36BNg""C kC#gjcڗO|I۱51,:?"8'^PRE+kHP:3]_&2c'qgi.N\޾ZֵjQ?38x0qfS2K =O$IX;CHW4 Ne1i:=3.]38tv$R _ t,pZSD(% r`m_Y|!W d<{?O4f|[j)c/iZ IHJzCjf{{s h9pbwĎ;}*<~S?:],0zekOOwQT$֙3})t.K͵Wt 3&&d G8w'ׯٖDd'~ӧ4#R:K*+/sLH*3P)7ucd x Tba229)PcD&Rq>ѧz×.=4W:Q$gG*eȝ֗%wk%)"#vޭ͝H Tۃxk[GxLF~?t\=)'<ɥ'nVGH> d8c3 ISAXj7 Т xg"?ǟy9{YiM6ln1 PɟO𱧧*nt |N~FQ,wV'ɨ85IDmaoN7':[t !'k-.}ϬT&$B4M$4ʹNUFDGdSN$f@9s}zO>xBZ*aXx=íN-Yj{/=q:½qc_B__?:%޸2v1Vk^pwzv{NvuH B(HHAiDCvKU-W,s !<ڝ8N,-qlsW9$!D#f}|˧_kK<2[aM|Y':Ⴕnzu{|{6)u6,awFcI,oDy3VG]ma_J b"&l*UOM$YIJ<ΠBt($a^# Rز=4{&7t3h@$J /sQKure, pYJlڦfPHjIX3Kӳ󧧅"׍I$jsm`_ةZNtovp2ʢ\?=rGx?A;}0Pl=zךRZ2Ltt&(g@M*lѠ{";gLTlnoo Hhtf8)0JIΚ~k=?Ҧ 'Ϸsa9ЂLX[(( k'DX}5xZlV;C~t_~}{;U%Ȯ5r-4Hgf,PN+OgOM_A6DJ5MpxZ&rjj-Z=r'?Μaů7tG/̗J^N"Nd,$.;__whV+SN5ZL#)g!z0ǣ48J9G)HSe"NilmO c3[mTjeA'J?] Y:8nԖk e;Z93?hתsRrq48>r'?ӍVw쵶؎$8I&j&"%/_z7;ck^/9}lN4?У^yokku pzz.~JK876Ϝ02_Ԕ;RZPsJure*, ,0hM)˲7=7}<)`r+/:6>Z'?Jec66- m W-&izٰd8??ɍ[kA̰Pb2I`mk=s/_+ZGJVQtCD4FIOxSFG^P*%k;$  |uƟ==\W_|B +/@J]Y} ɵ޿{nfVG03z]b{O)r|*q[f iֽ4q;5:=tK/4ޟĩ1:MR̜Mhސ7lwĥjWaܸqVF 5X_"jL"0IjO-Ix4=tfAfZY5j@ab1Fa~P(,  KO<SsC/@Ǝ4^w?hm[@BV3cv{Jt8v**NK'jw  ~ه}zqK<6X/ݼu^6043I4 ccLG4&j2Uof:N^PJg>ܩ3gΟ^ pZ:@@bFdOzsRO:^AȀ (.vfn09&>ZCF% ~ޤ'Fj]ci /IM>xǐf_{ JbnNMh4Jɠ,Dqag ^7}hzWR0ԘpPR`aBAX*I9v޿v=4%L7f>&>Z'?VIbUJ ~ED$ˈ86/jUHQjgfeM'F1TO7zlaT2E^/(^w#qjMzNORVp8$$BAdD0Ta ~3R!Ghg0j( 5a}i{C:yԿ{@=Wa< <`J!{/?G0,_{\s\M7|<5՜I&Q?^w{Zezˤ`00&ۀ9U:B[kt jeG//IK%EH"[c-6UqscydEe(0.&l߽O!6W>%`$ K<{*%:}̧>t$=XXL BȠZX&t6;3D 8FnG)djUkO$1?553Ue Ò*5a_n)o4q6zVדtT^VK;RTk[ *#:~Ǎ+%pΕ_H |*).dJ(5dh'[f'2kqiݽ#~c J9v{Q&ƼJŁZ흶WCDܘ <~\L[=H 鑇CVKb~?뿞ƃ0eҾ|;~0RDB`!qV 2 "#<;(" 2Ѥǜ/yŹS ̤Z}W~laid42:DQ-'Iٺ_*',ic d`YBIVhx&@{kﮭw~kj6WY|o|;Ɇl%A }E.%3:$ę%xGi(HB$.8J|Si6 U9(W:N5IݱLZ1d(g@l_zsnH0q}Sa4l6V9t%Ȑ ET9w#'?1 wwn/xTde>7կ}_d6~7uF;Ȕ0(E?,̟Q]bT0Cb`"1K(o>X32^{@ٰa1(,Z"  @̎wOˇڃI=0ixw9D(zn]\nNyo_'lY qQĎ W*QIp:,l%$qF4IhP+3K5\*/hJ5,wv+?Ï=+ɑ|/(싲R6Y_1Ee,Gv?'^ځ4LZz=Kak}˿I gM (OUrZnL奏<`y7[;Das/|/_.3i6 J=hmc>J*}eM B`X3pQ$$08dݡ'#) |g`ۓQmz2GJڛ_b`¯oneYܩZX],{RR{鏿˟l[cR%z:r%/_y;s?^"GO;Ig~OEhlB! gY) EL'ĻljkAt?Q' Fxg _Qk2̞=_fnmw%nom '>dhsyggϤfUl%Q-L'ꥯ+W^oYw{^4RFbPIdpA2V#"0}?lG{x?>Ȥޗ|Peifr}kh_|tyz:28ޓ?h<@k+tQG@!2/=丛(wOEAwJis<x'?d, 87-M]Z}FUtrJd6R W{QMnw7n%&{g_>=6LZmZkV=ϟ}{gUe (h,v!=%%xeP20"̀nwwjѯ z\HCn,e] D*J7Lx$ՖѻEun1ꥥ00R.-?ըϱ՞ȡW~kƗ8iőPy.x& _2e r>F7ʆSZJOr%P l1;?iPP̾ [ K+Y-d#lKχᯯl_|=[-&L3@&ròtseLuΦ[D&%_AP(TC:fDΡp(sd`tFIV:E q2GK}{v!Ce}SG\B-]Bݻ>KѕPw9"^ފ~wEF yWdwEF ywlknJc_3X?y*հz(B-]B-݁d<~5rdMɊyHB-]BLGw;]RGW2޳-!~wEF yWdwEF y#y0EN68{?x_YwtoG yWdwEF yWdw)'{lA=|9Q+2ZȻ"+2ZȻ#< lCt!*#EF yWdwEF yw{߳As;ĽvtZ \} ~wEF yWdwEF y#y*0&vtSez=[W+2ZȻ"+2ZȻɚ.{{gryHB-]Ba͔{enNAݗ\.E?ZȻ"+2ZȻ";̚鸶H8 #R{긎=R+2ZȻ"+2ZȻ -]B-]B-]B-]B-]B-]B-]B-]B-]B- 0+DteBIENDB`segno-1.6.6/examples/logo/qrcode_without_logo.png000066400000000000000000000011141476440322300222050ustar00rootroot00000000000000PNG  IHDRIDATx1@ E#MŐpJ Orծ"HBT|N?=,qg~zTQf W&- 6~kQRDuOmib`pG庪T>>,9td@+AXn77":axrm,%uE(4I8&lٲJɡЉ*Qa`nx>q xNPy4{ >cPjؤo!Ѽx5늒H)Mak@e-ګ$E(\"k%KЃ&]5'Cg+4P锵ZAD7' 񞡖*_8vh,oGvBDo*}2}6OsmK28B>Eb8E'ǝ n-ʕeڼ܋W8۟M xul^cG^tSTr]Cn6YUsL+Ýs z* IENDB`segno-1.6.6/examples/qrcode_text/000077500000000000000000000000001476440322300170035ustar00rootroot00000000000000segno-1.6.6/examples/qrcode_text/README.rst000066400000000000000000000003071476440322300204720ustar00rootroot00000000000000Examples to add additional text to the generated QR code. Inspired by https://github.com/lincolnloop/python-qrcode/issues/199 ``png_text.py`` requires `Pillow `_. segno-1.6.6/examples/qrcode_text/font/000077500000000000000000000000001476440322300177515ustar00rootroot00000000000000segno-1.6.6/examples/qrcode_text/font/DejaVuSansMono.ttf000066400000000000000000012313501476440322300233310ustar00rootroot00000000000000 FFTMs,GDEFspHGPOS/ 9GSUB\;OS/2@Vcmap_ҕANcvt  Wl0fpgm[kYgaspZH glyfZThead=\6hhea=$hmtxIL=jlocaPX$4maxp' name` !postd$}prep:+=)){|     0 DFLT&arab0cyrl>grekPlao \latnj SRB 4ISM 4KSM 4LSM 4MOL 4NSM 4ROM 4SKS 4SSM 4mark mark,mark4mkmk:rtbdB &.6>FPX`Rx | 568" ph&0  c"c]j]jbj $6HZl~ P|H 0 P|H <P ,  T`  P|H    ~hhhn  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\Xd|dh0`tXtX <|00hL( Tplx`xDJPV]j]j]j]j]jbj]j]jh|  &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| dt hd8|$|`HLD \t@4H(|XT(lt<0xx_` iFWW@TT[:B`LLL[Z[IWTL4K]l8@^  @bXXXXoM!TxxTT&~O[ XPXD,aDf\Ph< \\\0,0@, d `|tL`00@\  T`@L845D80H <D<x(LX$Tt0TLh0pLh<pl$d`0h8< PLdhx8TR m$v2z`M;)RDhp_)I R|o~4WWYZ\{#$ ( " %d ( +h ; ;l > Am D q " " ' ' ) ) + , |} &,28>DJPV]j]j]j]j]jbj]j]jh $f *  $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTDhxzOhDh*hDhhhhDhhhvhhVhYDxhVVhxhhsDVhDDDDDDzzzzhhhh6hhhhhhhhhhh46vvvvhhhhhhhhhhhhhhhVVVDD6h6hzvzvzvzvhVhVhVhVhhhhhhhhYDxxxx9hVhVhhhhhhDDhhhhhhhxhxhhhhhhhhhhshVhhhhhhhhhhh 66hhhVVh"VhVhVhhhDDxVhhXVVjhhhhhDDVhhVVhVhVIV$=D]4:IWfoqr "#&36k       |":P  &,28>DJPV\bhntz "(.4:@FLRX^djpv|     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z     " ( . 4 : @ F L R X ^ d j p v |     $ * 0 6 < B H N T Z ` f l r x ~      & , 2 8 > D J P V \ b h n t z  "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(.4:@FLRX^djpv| $*06<BHNTZ`flrx~ &,28>DJPV\bhntz "(hhhh66zzhhhhhhhhhhhhhhhh66hhhhhhhhhhhhhhh`hhh`hhv`vhhh`hVhhhhV22h`hh`hh`hh`hVh`hVh`hh`hhhh`hh`hh`hh`hh`hVh`hhhhhhhzzzzzzhhhh66hhhhhhhhhhhhh6666hhhhhhh`h`vvvvhhhhhhhhhhhh`hhhhhhVhhVhVhhhhh`6h66hhzvzvzvzv`zvhVhVhVhVhhhhhhhhhhhhhhh`hhVh`2222222hhhh`hhhhVh`hVhhhhhhhhh`h6h6h`6h`hhhhhhh`hhhhhhhhhhhhhhhhhhhhhh`hhhhVhhhhhhhhhhhhhhhhhh  `6666hhhhh`hVVVhhVhhVhhVhhhhhhhh22hhhhhhVh`hVhh`hhh`hVh`hV66Vhhh`hhhhhh`hVhhhh66h`hh`hh`hh`h)`)`YYhhv`vv`v`v`vZ`Zr`rv`v`V>>Vh`hV`n`nVh`hh`hVooooVD`Dh`h88PP>>Vh`hh`hVh`hV`Vf&Vh`hh`hh`hh`hhhVh`hhh6`6Vh`hVh`hVc`ch`h``h`hVssVssVx`xVssV`VhhVh`hh`hh`hh`hh`hhhh`h`Vh`hh`hVh`hV$$$$h`h ` >`>h`hh`hVh`hhhV$$h`hh`h`h`v`h`h`h`h`h`h`h`h`h`h``h`h`hh`h`h`h`h`h`h`h`5`h`h``h`''}{}hhRREE^^rrhhhh??aaiihhhhhhGGhhhhhh6h\aadd55g'ee``66LhViihhh`hhhVVhhVhhViiV11`hhkkh&$=D]4Kjsxk 5<:>BbDHglowmyv+GG        "+12 $*06<BHNTZ`flrx~h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`h`hhhhhhhhhhhhhhhhhhhhhhhhhhh`h`h`/-3 ntz "(.4:@FLRX^djpv|>DJPV\bhntztwwwwt`~~`~`/ lDFLT&arab2cyrlFgrekblao nlatnx SRB F CAT RESP RGAL RISM ZKSM ZLSM ZMOL fNSM ZROM fSKS ZSSM Z case>ccmpDdligJfinaPinitVliga\loclbloclhmedinrligt   (08@HPX`hX\  l  l   $$XLMLM&   qpp5 = ? A C E I K O Q U Y ] a e g i k m q u y }       # ) !Xpr{# * *4T' G M S W [ _ c o s w {  '      % +\\^^`diprxz{"T' F L R V Z ^ b n r v z ~ &      $ *\\^^`diprxz{"   I  I > $  C  ?  =  C  ?  =  O LI LM  . / 0c 33f  &(PfEd@ m`, 4D, 4~!AEM?CXaw_csV_  :UZmt{? .<[ex{-McyEMWY[]} # & 7 : ? I K _ q !!!!!!!"!$!&!+!.!H!Q!_!""" "#"-"="i""""""""####!#(#+#z#}#####$#&/&&&&'' '''K'M'R'V'^'u'''''''''))))**/*k+ +,d,p,w,z,...%..'t $CLPCXatzbr1Ya  !@Z`ty~?,0>bw{0Th| HPY[]_  & / 9 < E K _ p t !!! !!!!"!$!&!*!.!H!P!S!!"""#"'"4"A"m"""""""#####%#+#5#}#####$#%&8&&&''' ')'M'O'V'X'a'''''''''))))**/*j++,d,m,u,y,|...".."RpvqiWUQPONM?=/ IHG?:761-(" s21/.,&%$#"  qmkea_^[QOKIA?531/-'%#! zywsrqnlSLK" 3WOKH:c)C;765ݝݗݕݍddddMdLd4cx>,   ~b!$ACELMP`gks|?CCXXaatwz_/bcrs1VY_a&MO  Q  STUV!:W@UqZZ`mtty{~?? ,.0<>['beEwxI{{KLMjq-0MTchy|  %'= ECHMiPWoYYw[[x]]y_}z   # & &/ / 70 9 :9 < ?; E I? K KD _ _E p qF t H c p  !!!!! !!!!!!!!"!"!$!$!&!&!*!+!.!.!H!H!P!Q!S!_!!!"""0"" 1"#"#;"'"-<"4"=C"A"iM"m"v""""""""""""""########!#%#(#+#+#5#z#}#} 6## 7## ;## ?## @## T$#$# V%&/ W&8& && && && '' '' ' '' ')'K 'M'M 3'O'R 4'V'V 8'X'^ 9'a'u @'' U'' V'' n'' |'' }'' '' '' '' )) )) )) )) ** */*/ *j*k ++ ++ ,d,d ,m,p ,u,w ,y,z ,|, .. .. .".% ....   "'  R  " & (pt ,v 1 ZZ p֣     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a+rdei-xpkvjl8spqgw-+@l|cn4TT"m}/b'(#$ !:|9: ,y%)1gyquvwzzxhf 7X!uu9!{Xm{o{RoZ!=fs +b#1N {T\q#w`j#fy```{{w`b{!{RNNfffHF?{L'oo5jo{-{3=foD7f}s, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-,%%I%%I` ch #:e:-hh/10!%!!hsr) @ <2991/03#3#qeR@1<20###Ѯ++J@0     91/<<<<<<<2220333!3!###!5!!5!#3hiiThiih)T/hTaabbNZ /d@9($)%/%$(!$, ( 0<2<1/299990>54&'#.'5.546753.'n|phumdfbdcӿdOTUPDNtd]gp^Vd-.)>B+/Qš ! *9V@/7(" "7(.+  % 4  + :99991/9999032654&#"4632#"&'%32654&#"4632#"&iNMklLNi@s..2H#)iOMllMMk@u--1?NjkMMljO0./t?``OikMMkjN0--uA9*7@b  -,.+2345617B7 1 +"1"!% (! 7+!(!(! .899999991/9990KSX999Y" >54/3#'#"5467.54632.#"3267>7#'&JKNSj抋20ǭAF;}Eap:6\[ț*\,#1h F'XmFD ̉dHG'%[M;I\ 10#+u @  29910#&547u;:\' @  299103#654\<<J+N@,       <2<2991<22990 %#'-73%+f9s9f9PsPbybcyXqy '@    <<1<<0!!#!5!CDDD/@ 103#Śc/dm10!!d 11/03#1fB7@ 103#ymL # @  $!"!$10@////////// / / ?????????? ? ? OOOO O ____ _    F////////// / / __________ _ _  $]]4632#"&"32'2#"M68PO98K7PP78NL0670xx~F &@ ## 1/20%!5%3!!:P6ȪuLJժ#Q@)%%B   "$91/20KSX92Y"%!!567>54&#"5>32uu5dF[pga Yd8ժ.>zO}BC12`tA7(G@)  #)&" )9190#"&'532654&+532654&#"5>32ggfbYhyI'Ǖ&$54zms{(( ۵{fo B@   B    $<291/<290KSXY" !33##!5)!3d-=@"   "190!!>32#"&'532654&#"+W,wN\aQFժ 21%%L$=@#  %"& "%190.#">32# !2"32654&?M0n#J݁%'dkuzl75@%%B"991/0KSXY"!#!5V+N #/C@% '-'0 $*$ "!0991990"32654&%.54632#"$54632654&#"hʁ򑁖Myz{yŗT!Ѳ!!ȟɠbx~~xzF $;@" ""%"  &%1902654&#"532#"543 !"&T?M/nI%'!dk  os'@ <21/03#3#'9' %@  103#3#Śc /Xyw!@('29190 5yR!÷X`y@ <210!!!!X!! BXyw!@('<919055X!R^^="{@B  %%B !    ) #99991/9990KSX99Y"#546?>54&#"5>323#=TZ>/mNb^hC^XE&bRY;X1YnED98L\VBT=/s 4p@1(+$ 4 '$+1+5' ( + . !+ -.5<991999990@ ]4&#"326#5#"&5463254&#"!267# !2kkkk%RӡP$J6l90?{:]x<!o?DF=?z% @A%%%% % % %  % B   / 91/<90KSXY"]@    ]]!3#!#hnl#+{q =@#   21 0!29991/9032654&#32654&#%!2)qﰖ뒃JF{f>p}qdƵϠ1.@  2 10210%# !2.#"32671M[?[MJVXI5))pn))=@@=R(@  2 1099991/0% 6&!# )`dVDѦHKw/N )@  13 21/0!!!!!!vTrwժFX $@14 21/0!!!!#o\eժH7fP<@!   6251990%# !2.#"3267#5!PQv@^PQ_ſCe){KMon56MI!H &@ 1 0 221/<203!3#!#)d+9 %@ 77 221/220!!!!5!!=99ժm,@    51990753265!5!#"&m[hqG`=QQD, @!% %B  0 291/<290KSXY"]@L&&6FUWX dzy{ ',+&:IGG[WXXWkzx]]33 ##wVhs@ 141/03!!dժVy @,  B    / 0 91/<290KSXY" ]@$  &)&) 6968  ]]! !###V+'F m@B10 991/<2990KSXY"]@&)&8Wdjuz &)FIWgh]]!3!#3+3u\ #@ 2 62510#"32#"32IIz~u+@  2 8 3291/032654&#%!2+#ꌝL/ϔu\=@   2 625999919990"#"32#"32ȗyHdIj@8  %%B     21  0299991/<9990KSX9Y"#.+#!232654&#NnRٲM{cݑohy]ҔYJ'@=  %  %B %( &919"0(9999190KSX99Y"]@ ]].#"#"&'532654&/.54$32\^mjikshulм V;53#"&'.  yVWx! 9FBjiCE:= m];<<;\lh?;::;>9L@)%%%%B/091/290KSXY"%3#3h_KKѪ++ @D    %%% % B    /91/<<90KSXY" ]@^ //+ ??8 ZZ  &*%*(+ % & 5:5:;: 4 6 TTZXWV[[RW X ] gh yvy v #]]333# #ŏӬ߿ʿD"+w @K % % % %%%% % B   ;/; 0 91/<290KSXY"7]@8  '()& X xyw !%+% 5UYX es]]3 3 # #VHNAu3B}%Y@.%%%%B<< 9991/290KSXY"3 3#%lk!mb E@%%B/0 991/0KSXY"]]!!!5!" ՚ow@=210!#3!XfB7@ 10 #%mZ@=210!53#5XޏH@ 91290 # #Ȳu-m/10!5/mPPf%@ <1K TKT[X@8Y0 #fx#{ )n@*  ! $   D >*22991/99990@00 0!0" ]#"326757#5#"&546;5.#"5>32=zl;^[fX=& 3qpepӺ)Ld_y64''RR2X 0@  G F221/9904&#"326>32#"&'#3,fd./xRXWS%{/@   F210%# !2.#"3267%JR%QNI]`A9++88*,A:;>{0@G H221/9903#5#"3232654&#"Z.deCSW;7W {X{E@&    IH991990!3267# 32.#"X㿮Xmi[ ^Z89++9 @Ţ'4@     <<2991/22990#"!!#!5!5463'cM+Qgc/яN{H{ )H@' '  $(*' G!H*221999904&#"326#"&'5326=#"3253ZLSbC,ml/9.,}^\::VZ,@  J  F21/<990#4&#"#3>32jq1sJ`cD .@ L LK <<1/20!!!5!!3#mnm`/BCV 8@   <2991990!5!+53263#XZZӜ} @:  B  DE 291/<90KSXY"]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##Gb{ZFB?  &@   L 991/990;#"&5!5![Y饵|~mo{"@'  MNMNME#K TKT[X8Y<91/<<<299990@G000000 0 0 ????????? #]>32#4&#"#4&#"#3>32"iJo5FP;9JI9!c?LeHEws{p{``32jq1sJ``cH{ #@  D>10"32654&'2#"hڜ-.VT{3@ GF221990%#3>32#"&4&#"326w.df SWWRw 3@   G>22199032654&#"#"3253#L-ed.+SY7:WSj{O@   21/990@%  0030@@C@PPPP].#"#3>32;zI.Dv6y.*`w"${'u@@    B %( OI"E(99991990KSX99Y".#"#"&'532654/.54632OS}{\JSjgTzEZ9..QSKJ#}##55cY1!1@  <<2991/<2990!!;#"&5!5!f^^uϪ+|b`>^,@    JF21/2990332653#5#"&økp1qJyaddm`e@)BIE91/290KSXY"']@%]]3 3#dEFr`T` @E      B    /91/<<90KSXY" ]@      &&)&))#, 96993< EI F J VX W Y fifij e vzx| r -   ++>>< H Y jih {yz|  ]]333# #àö`wBfL` @H      B  IE 91/<290KSXY" ]@ fivy  :4 ZV ]] # # 3 ^oo)'`?HkhV`@E       B   IE9129990KSX9Y"8]@v  &&8IIY ]]+532673 3Z.Gc".\mQ\GOLGhu:NN^Nlb X@BIE 2991/0KSXY"8]@68EJWXejuz ]!!!5!-}bܖ%$f@5 %   !  % $  = %<<29999999199999990#"&=4&+5326=46;#"3@k>>j@FU[noZUtrݓWV10#$j@7%   #%#= %<2<9999999199999990326=467.=4&+532;#"+DVZon[VD>k@@k>XXrtݔXy &@  '1<2990#"'&'.#"5>32326yKOZq Mg3OINS5dJ t]F ;73 !;?<6 7=` !@  <29910533b)eq%!N@*   " E"<<<2212<990.'>7#&5473%C??BI9gg9ބ5(,-("9="+` 츸X>@     <<1/2<2990.#"!!!!53#5354632D>Cs3A,,ُ/яLB /@ (-  * -'! @') -0)$ !'$* xyx( $02299999999912299999999904&#"3267'#"&''7.5467'7>32d|[Z}}Z[|Z^.[20`0\^.[3.^Z{{Z\}~t]1]02[-^Z3].2]-_%@D% % %%B  < e e<<2<299991/2<2<290KSXY"3 33!!!#!5!5'!53%lkVoqZmo#o o#o!<210##  = 2>j@<#$93 $*0?#54&S9akԂ[]=:̭IWW9fqր][<;ȧH>=><''PGZsweZ54m@''TLf{xf[1,pE-Z/L-Z/L?F@aa1<203#%3#?}N1ID@'  &>>2J\ ^,8 8YD/210.#"3267#"&54632'"3267>54&'.'2#"&'.5467>`:o:u8g24r=г=rjKKMMKLijLLKLKKkZZ\[[[~}[[[\ZZ/lhȬJKKjhKLLLLLijKKJgZZ[~}[[[[[[}~[ZZ %)d@6  (&&  #*& (' j kji*22999199990"326=7#5#"&546;54&#"5>32!!|WHi1Rwu3}CD?kdPDN@Ms=@pABtZ\#! {w# /@    v v<2991<2990 5 5L-+-+#RRXsy^@ '10!#!X!^?dm10!!d }N4L@I  ] ] B   A)5)M  \\ [G#X;#Y//29999129990KSX9Y"2#'.+##32654&2#"&'.5467>"3267>54&'.XXP:&rk1=-7ffZJJDZZ\[[[~}[[[\ZZ~jKKMMKLijLLKLKKLbeG]C;P*T6?>5VZZ[~}[[[[[[}~[ZZgJKKjhKLLLLLijKKJ=b10!!=V+u @ STS 102#"&546"32654&hAu,-/OomOPqp1.-rBoPPlnNOpXy.@    <2<21/<<07!!!!#!5!X!dCDLIB}a@WWBA     @9991990KSX9Y"!!57>54&#"5>32eQdR1q?Ay;Jwrnaz3=L$$}k9wuF(\A          @#) & )99190#"&'532654&+532654&#"5>32^c:r;Eq-evnmBJ]b`W,p;Eu2X`lP|yQDJLl?<8?yvcG]f%@ <1K TKT[X@8Y03#fT` L@*  !   JF!99912<9903326533267#"&'#"&'øxo ! &D">K .Y\,T H;8 OOPNLPj; #@WW1 9120!###.54$FfNݸ/`103#`u)X 9A      @  aW}a 12035733!j c)t'+n 3@   jkji9910"32654&'2#"&546!!hfssfeusgʫ˫\{u༻߻`{\# /@   vv <<991<2990 5 %5 +-:+-#^R^  ^R^  Z{'HV'{ Z{'{& tVZ'HV'u p`!%@G  %%B! "$ $&# # )"#&999919990KSX99Y"33267#"&546?>54565#53%=TZ>/mNb^hC^XC&ϚbRY;X1YnED98L\V@T?%k&$ u@O ]1%k&$ u@O ]1%m&$ u  +@ /  ]1%^&$ u# +@O#@]1%N&$ u +@p0? /]1%m !@W % %%% %!%! %!! % !B     !  PPK/K!"2299999991/<9990KSXY"]@  ]]4&#"326!.54632#!#Y?@WX??Y:Arr@;nlZ?YWA?XXP!yIrrIv${g@7 % %%%B    c /<291/<20KSXY"!!!!!!#!3eex5ժFժu1&d&Nk&( uNk&( uNm&( uNN&( uk&, uk&, um&, u  Ic:1N&, u+1N ;@!    21 0 0<291/220 )#53 6&!#!!VD}}/`ŕ{HK+Fb&1 y"+@O"@]1u\k&2 u@O]1u\k&2 u@O]1u\m&2 u +@ /]1u\^&2 u 0!+@O0@!]1u\N&2 u +@p0? /]1;T .@     <91<290 7   ^t^_t\t%\^u^uw^ +k@:+)&  *&&, #* #)+262#5,999999991/9999990324&' .#"#"&''7&5327sT sV)+y=g %s9d/NZIn-QUPeQzQQFIRPJ=k&8 u@O]1=k&8 u@O]1=m&8 u $+@ $/ $ ]1=N&8 u$!+@p!$0!?$ !/$!$]1%k&< u@ ]14 @  28  32299991/032654&#33 !##ꞝL!󄃃}/V@1-'!  **.  !' $'$-DF099991/9904632#"&'532654&/.5467.#"#7C:oEBL;lAxC\[yqyrq|d1M*%]taQG_J'8O#kr#f&DC#f&Dv#f&Dg#7&Dy#&Dj#&Dw){ C@I=70 6 %C "76. 3@:("D%=/.M/u MCM6+sD299912<2<2<999990@ 05060708]5#"32654&#"!3267#"&'#"&546;54&#"5>32>321xYS\JMWWLepO27Gn 'aȿuc^8>M<[|%!YHZqYa4+#"33)+RNPPXx+'#!?@=Bu%{&hF{Xf&HC{Xf&Hv{Xf&Hg{X&Hj@@]1Df&CDf&vDf&g @@ 0 ]1D&j +1H)@O B $ *'! !'D! >*999999199990KSX9Y"#"32.''7'3%.#"32654&Ŷ"#!H&!!#R-:/(  (-Y,\bPȑ^b n7&QyHf&RCHf&RvHf&Rg+@]1H7&Ry. +@ 0 ?. /. .]1H&Rj +@ p_PO@]1Xyo '@ w <<103#3#!!j!/ +s@>+,&  )&  *&& &,+,* # )#D>,99999999199999990 32654&'.#".5327#"&''m1$eA H#cC')d<]*,g9\ //4o0.0tGGq.78MBz;32#"&4&#"326w.dfSWWhV&\j%0& $ +@ @O /]1#&D%m& $+@ _PO@/ ]1#H&D%u'x$ur{'xYD1k&& Zu%f&FvZ1t' ~|&%f&gZF1P& K&%&KF1m&& Zu%f&FhZRg&' o{ ' :G @8@]1N{$H@ "  @"   GH%<<1/<2990!5!533##5#"3232654&#"Z1.de5yySW;7W N0& ({X&#HNm& ({XH&HNP& ({X&HuN'x1({uX{'xHNg&( $o{Xa&Hh#fPm' u*{Hf&gJfPm& 2*{HH&JfPP& 2*{H&JfP'*{HN'.JHm' u+ +@ /]1m' uKKQX@8Y@p`O]0?@!     1 0<22<221/<2<<2203!533##!##53!5*ʇʆ*9QF?@"   J  F<221/<<2990#4&#"##5353!!>32jq}}a1sJzz`c^' u, +@ O@ ?0 / ]1D7&y0& ,+@O@]1D&m& ,+@O@]1DH&u&,xFuD&LxPP& ,D` "@LLK 1/20!!!5!!mnm`/B =@!   "!221/2<220%532765!5!#"'&!#3!53#=Ga'&HHAA@-]@QQJKDuuêK I@&  ! <<<<1/22<220!5!+53263#!!!5!#3#ZZi,+뗗Ӝ}/BCmm' 0u-Vf&g&j.'N` @9  B  DE 291/<290KSXY"]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##Gb`/ZFB?sl' v/@ ]1 l' vOKQX@8Y@O]0s&f/ &Os' m/' Os'y`/'yOs 7@   1 4<2.9991/903%!!'7;NwdPo;jnL >@!    <<2999991/9990;#"&5'!5!%[Y饵P{;Pu|~$o/nFk' !u1m&vQF&*1{&0QFm&1 *uf&Qh&Q{aIV=2@  1021/90+5327654&#"#3>32=YZͧZ-,t|6~ij>>WotV{ 2@  JF!21/90+5327654&#"#367632YZ͹Z-,jqFE1TTsTU6ij>>~ʗ[\``21qpu\0& 2+@ O@/ ]1H&R+1u\m& 2 +@/ ]1HH&R#+@]1u\k& 2Hf&RH;@     -299991/220%! )!!!";(RH=MKF{ 8i@92/ & 8   #5/)#92& MuMCM,s9299912<229999904654&#"265&#"!3267#"&'#"32>32PVWMfRPhgPPcpP/;}Jb04TY/%W & +#T53+)CBDA88>A>Ak' u5jm'vU&r5 {&Ug&5 ojf&UhZJk' u6m&vVJm' u6f&gVuJ&6u{&VJm&6 uf&Vh/u&7u&yW/m&7 u +1~&W /-@  : : <<1/2<20!!!!#!5!!/s-  +ժA@B@!    <<<<2991/<2<2990!!3#;#"&=#535!5!f^^uϪ+|b>=^' u8/ +@O@ ]17&yX'+@/ ]1=0& 8+@ O@/ ]1&X+1=m& 8+@/ ]1H&X+@]1=m&8w g&Xw=k& 8f&Xe=&8xu^&Xxt' |:+1m&gZ+1%t' |< +1hVm&g \%N&< u +1k' u=m&vV]P& 2=&]m&= uf&]h',@   <991/990#!5!546;#"+cM=яNQFX%>32#"&'##53533!!#&#"32y,fd.{{aRXWSzzc)?@$   2 !$'+9291/9032654&#32654&#%!2)"#546xxtB>d{f>p}qdƵϠ/Wp1FqPX>32#"&'#!!&#"32y,fd.RXWS0 327654'&#'3)'KKOO{e5Fq>=DEdgh=< !&#"32>32#"'&'#'҈FDDFl,fttttdLL.zYmnnnRRX랝+,S|1/@21 <1@   0>3 !"&'532#"M[?[MIXVJ))gj))=@0230@=<g"%# !2676;".#"3267M[?ZO*ZT3,JVXI5))p*32j>5F=@@=^s!%# !2676;".#"3267JR%FC=ZZ-,I]`A9++8(8rGj>>~A:;>N3 !#"#546 6&!#FVD6<0c//&r1FHKwN#";5!! $5476%3羽EF5e{ɉ{+ˡd4 32654&#"5!#5#"32_.df,T}SW;7XR=G{ 7%2654&#"#"/532376?654'&'&'&'&32h(>vwf2BFKI I<' )iy|{L (=\RR $+.! -&N +@ 1 3 21@  /0!5!!5!!5NwrT+u\=@ 26 25991@  9905!54#"5>32#"327uVJM[׌~ S@=))yz~#7(>@  22&0)1@ )) #)90.54$32.#";#"3267#"$546IyhYbfgg"{ (({smz45$&Ε?V!!!!+532765| YZZ-,ժH#ij>>~V'$+"!!+532765!5!547676;'a'&QRF1i&&(W%6MI!RI ! 5 3 3325D`H&0tt?uo+EA&#767653#"'&54&#"#367632"&76/JI_BG}MKUv14IBe``  1:!5!!;#"'&5=,-Z٪\Y+z=>jf!!3!!#!!5!!5!!= 99ժi@n67632'&#"##3i~\/j!-<BmV c3r%3sh5476;#"33 ##YZ͹Z-,Gbij>>~ZFB? ;#"&=#53!5!;+[Y饵 |~ĎɎ1m% # #''3C\P"Pn@Jo |mo"%#"&33265332653#5#"&8"iJo5FP;9JI9!c?LerHE! s{ p{+`=R{#4&#"#3>32jq1sd``cu\  32'&#"32767\:DC; 9CD8 z~{{vu'y2 {'R-%63273# &#"327-N5>o毴o8=yy=Y+͠v~^VR{ 763273##"'&7327&#"VPeo~簵noVAA( /s%+n+͝u"mmB8!+#"#54763! 27654&+Vn]6<0``~'R@]M//&r1FRQE8DVT*3265'"#"67232#"&'#76;#"w" . [f,?N͹ /2FIWS.O#.+#33232654&#N76SٲM{cݑ77hy]ҔYJ'>323267#"$546?>54&#"iV luhskijm^\''Ƞ/ vp{DI--յ1#hcq<;{'>323267#"&546?>54&#"PZڒEzTgjS썉J\{}SO9!!1Yc55##}#JKSQ..xmvV[!&'&#"3;#"'&5# 54!238!n|wx'%dQW/R5-0A3=g)(V\`@oV !!;+53276=#"&5!5!f^^uYZ͹Z-,(Ϫ+|bij>>~`>/&#5463!!#ŃF1-/7&r1F+!!;#"&5!5!5476;#"f^^uϪ*YZ͹Z-,`|b`ij>>~/V!!;#"'&5!/s-,-ZߥZY+ժ~>>ji? '8v'q'|XdJ##"47#5! 54'5{no{x4xn8!L IL*!"'&533254'3\Z,,Zxznjf?~>> ILɸ#367632'&#"kSHcm.-PKG "(3t*b7m*9 Vm+5326?3 67632'&#"nQGJ|lLT3!;^2Q+31705+h:=HTN~) )!3!#!!5#5!!uP" "v՚i@5b!!!#!!5!5!!-8YbҖg 7654'&+5!5!2! $5dc{dd\^rhbVPKKKKIJG8+lh3! $54767635!!#" 76RUci r\\dc{dd݊hl+8GJIKKKK}LT` 5!!#"3267# $547676peje]\dcmTjdc^QVbܨ JKKK21%݊hm*8V$` 2767# 4%$54#0!!5! TMOQWPVa ejo0, 5%b|8d1a# 6323#!!5!5!67654'&#"п -"BP8u~i9Dc``JU?T<>< % 7654'&#!!!!2! &53h<= \^G/"icUPRz,ʞ[+3IJ I8+le[tG)}LT` 7654'&#!!!76!"'57?\]ȨgcUQԪ-5IJ,39+lhJc 4'&+#5333#!"'53276MJY>lunc9rO_}nw~FVrA}Vg{#36763254'&#"64QҸMNr98xܭz BR1pqWBA3#+9'6-3!!!!#!5!5!5!^^``l%m&$ u#f&Dhm&, uDf&hu\m&2 uHf&Rh=m&8 u#+@ /##]1f&Xh=' &8j2&&Xq<=' &8 &&X<=' &8 &&X<=' &8 '<zW{%' 'j$#2'q<%'j& $#2'q<0' )&fPm' u*{Hf&hJm' u.m' uNue\&x2eH{&xRue\0& eH&m' uy}LTf&h8Va&h#fPk' Zu*{Hf&vJ=%2763#"'&5!#3!3m6!h9Hն+ROf'MSb9du'Fk' u1f&CQk' u)f&vk' u/f&v%k& $#f&D%m& $#H&DNk& ({Xf&HNm& ({XH&Hk& ,Df&m& ,DH&u\k& 2Hf&Ru\m& 2HH&Rk& 5hf'Um& 5jH'U=k& 8f&X=m& 8H&XJ&6{&V/&7&YW}RT. 56$>54&#"57>54.#"5632 4o1\}p_s54&#"57>54.#"5$32Fp>!BlJc(v];?"AW?-1CA#E ptgDZX%KlaF='.`[b[3XpVU 32=t|6~kWotl(1%7276"'676#"'#7&/'&'&3232654&"m B{ rhG0wD &8Md\]P{#looԐ>>t#O9 Y%Z5H7WSCTV!!3+53276=!5!"YZ͹Z-,՚o*ij>>~Vb!!#+53276=!5!-}YZ͹Z-,|bܖij>>~%%P& $#&DuN&2({uX{&2Hu\' 'j2H2'q<u\&2' jH2'q<u\P& 2H&Ru\'j& 2H2'q<%0& <hV&\l %7276"#7&'&5!5!676#" B{wD3' rhF>O9aJwt#jlf{.%7276"'676"'#7&'&=4&#"#3>324 B{zgG1wD3'5ZI9!c?98>>r.O9aJs{``>t#O9aJ;>V` ,@   991990!5!+5326XZZӜ}xY12654&"&#"32>32#"&'#5#"323QSSQPQRRQP]=zz<\o\32#"&'#QSSZQPPSSPP]=yz<\o\GJR\D%QM((_]q"! ^`A7S]++ L8 rMq;> 3!!!!!5! d iA!#!5!7##'-.d'Jug[|BJ8jF{5.#"3#"'&/&/5632654/&'&54632OS}{\Jvh*L'TrGY3e2{zD>zEGIZ9..QSKJ#}^R ~$=&[5#`cY1!GJ!b!;#"'&/&#=!-j1 *L4[TrGY=Zb ~$=&[?%7"#5463!2##326&#v6<0~'ʌ//&r1F q(!2)#5332654&#32654&+3F뒃ﰖƵϠn,>p}qd?{ƕ)533!33##"&'.=)3267>5~9FBjiCE:  yVWx! A?;::;>`m];<<;\l9 #3#i++!!2#.+##5332654&#LN76SٲM{cmˉҔ77hy]w{.#"!!##533>32;zI[M ܹ.Dv6y.*l\<Ĥw"$8{ )32654&#"3>32+3267#"&'.>zl<^\fX<& +qpepӺ)Ld_y64''RR2{{0@G H221/99053#5#"3232654&#"Z.deэSW;7W Wy 0@  G F221/9904&#"326>32#"&'#3.de,-xSWWS^X $9@  !G! F%22991/04&#"326>32#"&'#46;#",fd.̸ZZ/xRXWS~Ӝ}}{0@ <1@   0>3 !"&'532654&#"JR&PNH\`@%++*,A:;>s:{!)47&'&!2.#"63 !"'3254#" 90%QNI]cU-RG+>jiáS,+;7W{7 &32654&#"%5476;#"#5#"32;mjkookjDGH8H$#${PϳQ{#T ij>>~SW;7WSzW{432!"&'5326=!7!.#"z [imX^^"++98ȷzW{?@ I H991@  9905!54&#"5>3 #"73267zXmi[&Z89++"Ƣ{ )%654'2273;#"&5 '&'&'& 56BL+>w9P!1jcGF:“֊>8E#ZuaQ`vg("chV({09@ 22&%!*2 &.F110&'&54632&'&#";#"32767#"'&546wA@Q[\ihWVLHHZ[c[[MaZ[V_A@^  VJ=+,nQb54"[\m({(<@! #)) )& )190#"&'532654&+532654&#"5>32U`LdKhiP_m"#ibQnW=JV^8{B#"&'5327654'&+5327654'&#"56763273;#"'&55c88hh@H9DDKCE@?qv|f6688h8AANODE<[KO 0A=1_JJm\["45bQ77,+=J++  OAf10`ZȢA"y( !27654'&+532764&%632#"'$Sv<;;!!;yUkbbkˠU^A;;LL67ss.gg=XVq^!+53265!5!!5!qZZh(Ӝ}}ؤg {H4&05476;#"#"&'5326=#"43#"326HH1:hh>CO6xn#{XЮmssngn^ ij>>~.,}^\:<bH4^ $!"326#"&'5326=#"4763!|LSbC,muq9b.,}^\:ᥟzX %#5!#"!2&'&#"32BHXN,>hhxpVHdbbd">:KMrqfqrfQk^".5 3 3265+]ܞ^+ r.$a32#4&#"#5476;#"}2rjrZZκZX `cJij|~V(>32+5327654&#"#5476;#"}1rX[̸[-,jrZZκZX `c6ij>>~ʗij|~23#!!!!!5!!5!! bnnl~ ˏ5i ^!#"'&5!5!; ̦ZXXZjf;8~|2^ !!!!5!!nnl^BXy&;#"&=&#"5>32!5!3267#"'.H>ꤶ./OINS)&r\FJKOUi(? ;?<65=>;7-4 ;#"&=# 5432!5!3#'&#"3[Y襵>5*GN\|~ܽ󠠄K9V  ;#"&5!5![Y饵|~(L-;#"&5#5!!2#"'&'532654'&+5!HHTgOE@KOPUCWJJX|~A$8+lh%12KJhj^!%#"&3326532653#5#"&2"hJn4FP<88 d>LfpHE!s{p{`LfpHE!s{p{)32+532654&#"#4&#"#3>32"iJoSN5FP;9JI9!c?S,5HEcԜ|~s{p{^^@;#+VM{+532765367632#4&#"{5D1DCWVV\^oA@01re22wx\__V{ 4'&#"#3>32;#"'&./]p@A2XVV?4<>OO__^edwxH10``A{ !3!##{yyH{  #"%"!&'&!3276ߌH?7?H4HH4{-m__mOmmOE`!!!!!"'&763#";d~~~~ KKKK`hghi&{.4'&#"3276=332#"'&'#"'&57!29PHJ|")u) }07_CC_vD8@jxZqosO++Oz2ee2z| VH&/#5!#3!535&'&76767654'&_|{_hd{{dE,HH,O1HH1ouu{{BnmBHImnI^732653#5#"&';zI.Dv6.*+w"$732653#5#"&';zI.Dv6.*w"$fV^;#"&=#"&'532653YZNb.Dv6;zI}}w"$.*+jV{.#"#3>32;zI.Dv6y.*)w"$jV{;#"&53>32.#"#,,[.Dv6;zI[[}?>rw"$.*ll2{476;#"!!5!RRҼj&$pnhb`022{!!5!4&+532jnnHlдRRV``bzW^!#&'&+#!2327654'&#7545â?;;alkpw?@@?w 66^q$%'^NMi++ST**zW^!#!3327673327654'&+jpkl|a;;?î545(w?@@?wSiQP^)%$q^667**TS++V{8.#"#"';#"&=327654'&/&'&54632N[DF20@RRz|hj&"nfdbbFF24@LLf?((**T@%$!*MLZ[705-,QK((%$JK}VT+5326546;#"ӳZZcMӜ}}¸Qg}VT!+53265!5!!5!546;#"4ZZ=cMh(Ӝ}}ؤiPQg}VT^;#"&54'&+532'&cݳ--Zg() |@>vV[!#"327673## 54!3476;#"8tn!ʷ5RWQîd%'3A0Ǜo@`\V()g+`!5!4&+532!!H^^uϪ+>`|bW!!;#"&5!5!f^^uϪ+|b >`!533!33##5#"&=)3276:CYYu>>|WMĤ45wEioabdo?ܤdqnܑkmhAw` !+"'&5#5!?27654'&'&UBr86FRQS&(g3XXBO\Ldqn``;612abdw7,H`!# #3T`` !# # #33”­jj`jH >;#"# #4N|lLT2"zHTlfk}3 3#f%.]}8 V`!!;#"&=!5!;4z `ۧ10%*`!#47!5!5!332!'3254#ejL<FX3<;4% 6[}LT` 2!"'&'5327654'&+5!5!ajbVQ^cdjTmcd\]ej8*mh%12KKKJiLh`$- 76654'&+5!5!2#4'07&#"327* \^ejeidTQ'd( }ŃcL;*1JJ$8+lgqUeR8y*K/K327654'&#"56763 #?W::fPONNLQQUmlprLbAr+#}swt#&'&5476!2&'&#"3ʪplnUQQLNONPc9:Vws}#+rAbLr3!"'&'5327674'&#˪plmUQQLNNOPc9:Vtws}#+rAbLrJ#476!2&'&#"32767# '&5nUQQLNONPc99cPNONLQQUn>}#+rAAr+#}_-sB (47632 7 654'&#"47632"'&_ԚO̵eddede"!/."!B^!"5Ԝ0ٍccƍffff.""""./B!!} -@   F!21/9032654&#32654&#%!2#!]_Z^UTTVeb`sci?\dU?.Vi}u"y+";#"3$''"'&5467.5476322s9@< <@7uTxVddjbbjdd6=76NJ@6sx>WVggWV6l0%#5!#"'&76325476;#"#&'&#"32t:{}|3H >ws}#+rAbLr #26&"3!!!+5#"32deen a^!;8NN8:j+^Lۓa31DD10ML C3276'&#"%#5#"'&76323!2#"'&'5327654'&+5!22XW3223WX2o#55JzLMMLzJ55#o ?M;319;<@3xAr;<78chqjtssttss_3d0110d^L$8*mh%12KKKJ6 ,326&"!5!332+#47'#5#"3233254#dees ai$\\#jKyyKj#n0 h*5j 3.#"#"'&'#"&5#5333#;532654'&/.54632/e6RR;Y%w026:8>qaQQo-Ek>v;NTj&g[{=l?((TT@I!,KL!&`>NM55YQK($)$V4%.!5476;#"+53276=#"'&5#53!3A &'p.6@3632&'&#"632#"'47&'#"&5#533254#"&57#3uZ310.///0l;;;2v1+\!raQQ$-WO=MT-E‚#+qrfr9DhT"2`>9KiNVH3+5327654&#"####53546;#";67632G11l?KJYhonjjhqij;/m(56Ft<;H``01/яNPhce22wx%7&'&#"#"'&'#367632327654'&/&'&;>ABgf$&n/<>][ALODKTLDCKEJIa54%"092?)TT?&$!,KL\[&:MV3-+RK(#*$JA 3!!!+ۊqvLۓB 333# #333# #ttttU=B!#!#!#!#kkUXrXJ 4&+53232653#9O%5zpcęaBþybV "32653;#"'&'5#"4'&+532Zgo0>*m/2O?*mbþyf\gę10A @ 32tNN^luu)qJy}wYYk\g88A3>32#4&#"#5476;#")qJy}tNN^lu43rB98wYXj\1Sw66WU 3+532653#wtgr,B0ttxlX6Vr8.#"#3>327.bjtt%uT  qksa97832653#5#"&'.bjtt%uT  qkJa97Q32653;#"'&=#5#"&'Q.biuB-r33$vS  qkJH VX66x a970!+33276?3327654'&+CGDDuj=%%(f{n!!!|K((((K|N;[--s?5/.B 333# #tt+5326?331]O\D05 {{bpEW(K/itf-#-$452654DŽ@XX@rPPPP=>X@?X=>POPP"'&4763"3tPNNPt@XX@PPOP>=X?@X>^s327654'&#"567632#(y6$$>q31210336WEDGkM@*7K$@ ` XFh_@C^s#&'&547632&'&#"3kGDFV63301213q>$$6yMAmC@_hFX ` @$K7*@)f7@  91290K TKT[X@878Y3#'#f)f7@  91<90K TKT[X@878Y373x$@1@0#+=b$@1@0%#+=/yX0CbyX0v#!!heJ'#!heJ#c#d>U 533##5#5uJu!5!J>ߖ/)HDV{ W @  P{P10K TK T[X@878YK TX@878Y#"&546324&#"326{tsst{X@@WW@@Xssss?XW@AWXu"  @  |1/90!33267#"&546w-+76 >&Dzs5=X.. W]0i7@!   PP99991<<99990K TK T[X@878YKTX@878Y@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@Z7JQ!7JQXfs%3;!"'&5k&&iWRd10`ZȢ% '&73733256/MMV| ;#"&5#5!88hr.EGWwl:Q[v/).#"#"&'532654'&/.54632P1j8WV>](}248{D@}=RX o)k`@q a//$)*+MWfk2-*SIXa #'#37 ͉H+^s#&'&547632&'&#"3kGDFV63301213q>$$6y[AmC@_hFX ` @$K7*@,X!!5!yЈ,X!!5!34,X3#!5hh,X3#!54,X%3!5( DfCfv)fg7y=b10!!=V =/)H @ PP1<0332673#"&/w `WU`w HLJJLD@ a103#?Fj82#567654#"56J24C1xZ@Vƪ@$C!Xl05^ V{wXf%@991<203#3# fx)fh"#DVv'4f#!#͇fxx/)'vu/)H >32#.#"/ w`UW` )LJJL" #3ﻒY#55#53pp{53#3"pp{f3# qfyX0CbyX0v53#5#5L:#33T걈s^p!5!#.q532654&'3#"&=X.. W]0ihw-+76 >&Dzs5  "&463"]]3GGlbbG23GbL3!5353:^H#5!##걈c_I #53533##sc^5!tcV %+53276=YZ͹Z-,ij>>~V 73;#"'&5,-ZͥZY~>>jic/@a103#?d.@ aa1<203#%3#@ D  1  0#"&546324&#"326D]\\]bG33FF33G\\\\2GF34FG;@103#ﻒu)8  @ |1/90@ IYiy]!#"&'532654&'85xv-W,"K/:=,,>i0Y[ 0.W=u#x $s/#DU|/#5!#|J9X#"4533273273"h;tv gfv ifvtR)@  91<90373x)@  912903#'#m/8 @ PP1<0332673#"&/w `WU`w LJJL/: #.#"#>32w `WU`w LJJL5@!   PP99991<<99990@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@X7JQ!7JQ=/10!!>VєmB]"Xy a&h!5&hhh5!Ĥ/'\ ]`LM'ogDdFFJ  26544#3GG3]]lG32GbU|3!53UJU |/!!|&b9X632#&#"#&'"#72h54'&' RJ 6"RH 0PQn +0PQn  &==Dv7"#4%62#&%n~vv<<tf3AntVH%#AnHFW`wV #"=3;X3Vh{%{&Fy{&y'm-fv?F&jrf&>/`yNf&DHf&f&D\f&pf&f&6&%$q%sR%1/01/0@%%%%% !3yyN(=H+u\6@ 26 25IJ]1@ 0!5!#"32#"320qYǪIIz~,.%0/01/<0@%%%%3#3#+#Vy0F1H (1  <<1@   /0!5!5!!5HA)Aժ9u\2H^u3xm < 1 <21@ /220@% %%% !!5 5!!9" :A@/7%<uZ&/M@"2  &,2(0<<2<<21@&( '   /<<2<<203!535&'&547675#5!67654'&'Ͱa|{aa{{bL+CC+LL*DD*+v[ssZttZss[v*DD*7*DD*;uZ9@  <<1@   /22<<2067633!535&'&3I.K{bb{L-I["WDWx ֪ WW"J@@qqro prol 991@ /<20353&5323!5654#"J{n !o{1xx 7oȼ߅LI LN' u%N' uFf&(f&Vf&6f&3i&Fy *'&'&3273;#"'&''&'&767,-b=MJMUHi;c( #) Xn^T).\-rv~ oik*%1)0T*XmY*)Va!%#54'$QQ 0kEb6=q'0  Vm`&+532 3#-^1FAF[D~S]VH" 4"32654&%&'&54632&'&#"76hY(>f2BFUR I<' )iy|{L (=\ $+.! -&({R&%#457654'&# !5!OTJPE* :Lf.,KOxsPWKL,#%5,*3eaZiV{.@ J  F21@    /90#4&#"#3>32jq1s```cH9@ D >221@ @]0&'&#"!32762#"?HH?5@HH@<⇙8wyvs6`@ 1@ /0;#"'&'#5"$lYoRQ`+.0`b;`D # #'&#5~J/1Fe<2T`wtB`!367676'&'3!xdLjE.*{`T|p5dwY|rNįtR8&%#457654'&# 4%$47#5! OTJPE* 9MKOxsPWKL,#%5,*p$Rݿ &H{RP`!#3267#"&5!##P117,#J%q\T`PH? XVT{.@ G  F21@  906#"&'#764&#"326ttf,n䇅{WS<R%{$%#457654'&# !2.#"OTJPE* :%QNI]]^KOxsPWKL,#%5,*8(8*,A:nok` 2@  D>ij991@ 20"32654'&7'"763!aFH<Ηr{sPSے-- 2^!@  1@ /20%;#"'&5!5!!$lYoRR0`b3i`%27676'&'3%"'&5#5!tZ;jF-*RR"$vfwZ{s`b;+.0LVh )O@ '#* KQXYԴ0'']<<Դ0]1@' *2<220"27654'&'2##"'&7673A\VMMG*w|~~hA1LLNeˑRh]c[斘n,mKseg.YVx`#&+53 3;# t/1FC /1Fz ~,~VN`%67653#&'&533?>TyyT>?@WxؑoW@F`&#"&'#"'&37676376' 2KUXK2~)@V""V@)~`{gLHk{A>oRyRo>6&j3i&jHf& 3if&Ff&$ # 76'&%$'&763 '7676] NI5|utf M2C6R6WpA{z Ʋ itR$ $6'&'&'&7!2#"'&32765JgNn-R Nr^ydPpw{A K~}Sj~"#4''&5676'&qO**d\txLJso@z8 vVOv~*+40r51_Tpf&"N& umVd'#&'&7673567654'&'ĸh]i^V5RR*aW4QQ(VyvaxxGnռFCImֹD9` !32376&7%&# 67#5!'TQ0'( 0A_+T3 4`/&'&7'&7676'&#"56776327'5!`ȍ=`[+9[R~!*`ȍ=`[+9[&͘7 cl|YDT|˩hl="pl |YDT|˩hlfMZuV\ #"32&'&32_{|^"y|•"jVH{ "32654&#&'& h1`{{_ mw.vRL#"32#457654'&#"'&76)MbzYTJPE* 9{2e+wTOxsPWKL,#%5,*˞nͱR)`#!"#457654'&#"76))I]]_bNTJPE* 9ۓ eUlnoJOxsPWKL,#%5,*8(X)V#!47632.#"!!#"&'53276`1c3$R,x:KAb9f.1d0W@Rd>Qoɏ?s!K_`7"'&76'&52n 'BQ_'BQ_[~,`*l#FR`*l#FRM #!3M&pM]!V!#56#'0#0?&'&bTB9[@[`7"7>9[@[|"O z:6hl0%[Ml |"Oz:6hl0%?[MVT{ 7636#"&')! $&#"32nttf,hՇ<WSs)%{FVMu\&'&#"!3276 32 5DC6 >BCD@qopުՈOz~ {!&'&#"!!32?# '&76!2 %%cjf_[_fMJOhk en(' c\\c(  {"056763 !"/532767!5!&'&#"'(ne khOJMf_[_fjc% ؜c\\c VT1&Vy ! !###V{+'`VO` !!###`{`UVT{##5#537636#"&'!&#"32wiinttf,;pp>WS17532#"5>3 !"&IXVJM[?[5=@0230@=))gj)1&8y1'yc<Nk' uTNN' 8uT*o/32654&#"##5!!676767632#"'4=N qjqjW.E~C%0"@X UkiS*\o-* % T pFwusk' HuR1L@!21 0221IIPX@8Y0327# !2&#"!^?s}RooR}J6,N&E u+1m-%326&+32+##526!Z}y^ϬvH+W"%32654&+!#3!332#!Z}x_uwg)9dqco"676767632#4&#"##5!%0"@X UjqjW.E~-* % T pΗ*\o-k' uYFk' uWhm& bH 33!3!#)v++B%$q2@   21 0291/032654&#!3)!qﰖE{e5F{f>dghq%s141/03!!/ժ!0@  1@ /2220%3#!#32!!3!7yŪM0'TB /ѪBL ҪN(x@   <<91@ B /<<2290KSX@ % %Y@ I:I:I:I:I:I: <<<<33 ##'# 3 0YY0S0кv{Z7F <@  B 10 991/<2990KSXY"33!#3+3Fm& W.F$@  1@  /<0#526!#v.+W++Vy0H+u\2H@ 101/<0!#!#++u31&/7h?@ B120KSX@%%%%Y+532767673 3;E,LE\mQ.-"X74oJ+'/.M *5>Bg@2  2 <<<<1@ /<2<20 KTKT[KT[KT[X!  @868Y3#5&%>54&'II Ǹ ˥II<{z WS ;P $@   1/22033!33#P)ˆ+BD @   021/20332673##"&nmuz[v~PEx+:r` &@   1@ /2<<0)33333`++</@   1@   /22<<03333333#<ຆ++B u*@ 2 2/1@  /0%32654&+!5!32#ϊ)+An ,@  22/1@  /<20!3%327654&+332#[fN+1@"#( +0! 3 632#"6/&4767676%67䐌x$[3#F#3bJ/P{3-wRIUA   +t` -@   F!21/9032654&#32654&#%!2#!_eUkUTTVe_cmcpPO^UCCVpou`@ 1/0#!6`ih`0@  1@  /2220%3#!#325!!3y-C7 "Ld64d!{X{H;`x@  <<91@ B /<<2290KSX@  Y@ I:I:I:I:I:I: <<<<33##'#3hh`Pl4_P({` =@ F 221@B /<2990KSX@ Y #33#b縸)`)H&w``"@ 1@ /<0!#!+53265 _7#U^`v=` N@B      221/<290KSX@  Y3 3###=ww`M` $@   F 221/<20!#3!3#b縸`9H{R`@F1/<0!#!#bW6`VT{S%{F`@ 1/<0#!5!и&6ʖhV`\cVec@    <<<54&xjjx޸ܸxjj ++ gsL`[|^` $@   1/220%#!3!3^渖L`66b!@   F21  /20332673##"&øknXrE5od]'+}U` $@    1/2<0)33333U(`66P`-@   1@  /2<0)333333#".𨐖`666L`)@  2/1@  /0%32654&+#5!!2#|y֜XZZZʖ;hi` +@   2/1@  /<20!3%32654&+332#S|yS[`Y[[[`;8`*@    F291/0%32654&+3!2#{֙YZ^X`;%{K@  <21@   IIPX @8Y07532767!5!&'&#"5>3 !"&A`^S E^]INQ%R9>;qdRp:A,*윜+N{ ?@#    221/904&#"726332#"'##3pLLqjUUe9ҝ暙?``B@  291@ B  /<90KSX  Y;#".5463!##r78r5ܖaUmV9{Xm&tC{X&tj##VT533!!>32564&#"##@1|yj{яLs`c. m&rvQ%{L@    F 221IIPX@8Y0%# '&!2.#"%!3267%JR%QNI]]E S^`A9++8*,A:pSdq;>{VDLD&j +1VM `%2+##+53265!327 RC'#U^5iрiv;A`%254+32+!#3!3 褽l`9#9533!!>32#4&#"##@1sjqяLs`cBm&yv0m&wC@hVH&` 33!3!#ø`6 u%326&+32#!!5!53!q zQ533!!!2#!3264&+WH|y͓LΧXZu\aH{s@141/03!3!/2$@ 1/0#!38X`:Us 3!!!!##U/#˂>` !#53!!!!`¸ fs#!!!2+5327654&#/7qohfL>87||9ժFwr|zKK"VR`#!!3 +5327654'&#HRRQn!&&1`GQ``07 )3 3333###'0:YY{ZSS/B0кv;`33333###';M4hhPPlL_u7&Vu({&v%3###33VrwBh`%3###33,bG*B?`/Z%3##!#3!3)˪B9db|`%3##!#3!3ø縸*`Cq 33!!!#!ql"d9}` 33!!!#!}f`9ǖ6u1&d`u%{&h/ %3##!5!!+s-B+` %3##!5!!ø&ɸ*%<\Vt`3 3#\IIT`lD%3 3!!#!5!5%lk! mP\P\Vt`3 33##5#535\IIT`l55%3## # 3 3XfuPHNAB}3BL`%3## # 3 3o)'o*?HkG#4&#"#36?6?2GjqjW.E#20@0X U ڗ*\cU'% T pK,m& U;H&uf32+5327654&+#33stohfL>87||wwqwr|zKK"hVm`3 +5327654'&+#33j:HRRQn!&&1'wGQ``07 )&?`/fH%+532765!#3!3HhgL>87)hzzKK_9dV`+532765!#3!3RQn!&``07 `CG %"'&'&5332767653##|#3/@0X TjqjW.Fժ$'% T pI*\z)b%6#"&53326=3##c<1Tsjqø~3$2 #%m& O+@ _PO@/ ]1#H&o%N&O u +@p0? /]1#&jo){Nm& T{XH&tu\QzW{u\N' uzW&jN' uU;&ju7N' uV(&jvy}LT`8F0& W&wFN' uW&jwu\N&] u +@p0? /]1H&}j+@ pO@]1u\3H{u\N' uH&j1N' ul%&jh0& bhV&hN' ubhV&jhk& bhVf&DN' uf&js %3##!!/Bժ` %3##!!øȸ*`AnN' ujhi&j7R({u\4RwT:`ZwZ'>53.'#".53327.'S5 #"? F,X,pny@:hVL4=_3_,@ J\9 2D;x| ,\L06k2P#54.#"!!#4>2*:iUVh:@yܮy@k,[K00K[,#= |x::x|U|&##!".54>324.#"3!|}jzB?xonyA:jUVh88hV m=>ˍʀ;;ʏ7kT46ba664>23##4.#"#6@yܮy@:iUVh: |x::x|a=J,[K00K[,P".53!!32>=3*@yܮy@:hVUi:|x;;x| ,\L00L\,`q)!!332>54."#54>2q'@TXX$gC32vvnU3%MvvN%PT^cA K1\in00nBBxY %!!3!!CꪪP#54.#"!!4>2*:iUVh:0@yܮy@k,\L00L\,` |x;;x|+*:"#4>323##".4>;54.32>5#"yHExwE2Y{IHzY22YzHF"2#"4#$3!L1jysܒIKޓ4kq;3lr8{nڨm?AkP@U|&33##".54>3!"32>55}}Aynox?Bzj Vh88hVUj:Bʁ;H֏ؑKBqpC4Tk7=#54.#"#3>32=:iUVh:6Ony@,\L00L\,3P&*;x|63!!dժ]t2>53".5##3 $=`: I҅M`1Kf>>fKIwo55owO6)A33>32.#"#".5467#2>54.+64/sR<]QN-kOa8[4Szjw./-%HqsK* &J +%?eG% F6:4TSvT0de4?yl[B%#?Wgu=@ykX@$a=!##".5332>53=6Ony@:hVUi:%*;x|3,\L00L\,X[v%.54676$73v4[C'h{uk˵n>7<@/7B(=gbV;3qqm`M-_r.9.'#".4>32>."#54>2"3267.p^QeL#H$XpHxU//UxHgX2:%MvvN%PTB=IG?L>D|nf6a-S^&JnqO)MBan10nBAkIHME23!4.#"#6@yܮy@{:iUVh: |x::x|J,[K00K[,Vz!"!".54676736$33!zmP╣zs3D3y-^6!#".5332>5@yܮy@:hVUi:ժ|x;;x| ,\L00L\,@9 .532>54.#!5!2>54&"#4>32<}|;!HrsI#(MqIPB];~yAvedxC4L.Dc@_MM`AqU1.Ql>?fF&*GZ0vpq{[i88gZ;hS<G`s6".5#5!32>=3@yܮy@:hVUi:|x;;x|b,\L00L\,`q/2>=3".54>7'.+532'.#"3&NwuM$PTKuAZ8n%-{3~H (-/HuSn20nBEN(g N=!#4.#"#4>2=:iUVh:@yܮy@J,\L00L\, |x;;x|`q'4."#54>2#532>&NwuM$PT$>PXZ( ^.HuSn20nBEqhD!cEeNA##54>32#4.ǾVi9>ГӁ79iGl IpX*9؜VV؂\OvO`p)D4.#".54>32!!33267>4.#"32>1N7VvM*0Nrc{6DoLgC(^E/ %H>LpJ%CR2R91AGH 8{vlQ0e~y%L.+4^dzE 5GOP%)=(4[{G(*a64>23##4.#"#6@yܮy@:iUVh: |x::x|a=J,[K00K[,=332>53".5:hVUi:@yܮy@,\L00L\,J|x;;x|!332>533!#".5!:hVUi:R6Ony@`,\L00L\,ժ%*;x|ig=332>54.54>32#4.#"#".i0UtDAmN,BkkB5otsq8<]A@]=+IbnsnbI+A~w{ĈHKuO)&IjEH`B.0:Y_Qn@@nQ4W>"!;S25K8)%&1A[zR`yDE}=#54.#"#4>2=:iUVh:@yܮy@k,\L00L\, |x;;x|@D"32>4.'2 .532>54.#!5!.54>ڐ^66^IB]96ju=4L.Dc@;}}; GssG (LpI 1!=uL&AU`YC))CY`V@:iY;fQ:Ibq9_NM`AqU13Vq>:_D%9DHYj:J!!#ROF +3>4.'.>753#Ia;;aHIb::bIe&'ef((f/gk23kg/WܜVzzVݜW3.4>2#".'!!#5#5"2>54.7sr66r{ JJB,ʿg>@id;<_vBDv^`wC *(Hf|gK*'HhA>fJu\2G)3>#"&'.=33"&54>;5"4.#2>/P?ESb;l7>73y)Jg=2yjH'F_7DjA 1O@;jV>,MyXfCb*#4>7632#".'332>54.#"P7dV=BCh@"Cb@*QG5 6& 4G)20}sV$MvR3YB&0K6 %*?*  3!#zgi`'%#".5332653327653#5#"2"hKD]; HO<JI!c?rHE.qw9z78=?`32jqV1sV abIVw %#".54>32533## 6& &-fep<32ʔjq1sُV``ab-3!!326=3#5#"&/kp1rlLח0adIVw%#".54>32533! 6& &-fep<32jq1sJl abBV{+;.#"#3>323##".54>32>7#",U}RMsL'"IUd=fwEeh Gfz>HsR,5Wq<%A3$2("5/fq<*Ze :L-Sچf)'JiANsK%< IvV)=(5)I%!"2>5".54>3!33&;`F& BefC 6qo42n{:laep;32jq1sabGV`!!3 hVh+327653#5#".=4'&#"#3>32JI!c?H\3JI!c?H\378=?`7%32>54.'#"EZ!%9wv9=iPϔjACmPOmD5.NmD`2onf*zΗUUzˍR!bSoAAoS3omf*BqV332653##"&5kp1r{RadK%/D#5#".547.546?3327>32>=4.'D)ZwG?Uh;Y`3Ķ9T839 $2" 8C9W=MlC6_K9cI*, 5~[,J6Bve`-?N( ?OU010$ $EvV17]{DV3ywl'5{rV_{3!4&#"#3>32ʕjq1s/``ab2*=2.#"#5#".547#53>32>=4.' 86jd](xI?Qf>\[-862}'CX0Kg?-bm18 *MnD Or,H4@qZ+^uAXuF54.#"'>32 t*D07".546?3267#=/"?pM  +A,:4 ElL<{7`q,`/'8% qZվA'gVi`'%#".5332653327653##"2"hKD]; HO<JI!c?rHE.qw9z78=? 54.54>32%">54.):_y~y_: t&C1RH $7@7$IxPf}F*+VD*-6-2?kD)KiO}p_N+9 BI;=@#5ZRLQY4O`65g4N3!ADFLR,QO=K?`B!M{$"#3>32!!5>54.;>`@!1ycZ+7R5)?\<=c4ZzFs`dcF}gSv94myPIa8^XfVj3326533!#"&fkp1rH/ӑRadhi{,!#4'&#"#5#".53327653>32iJI !c?G[4JI!c?G[478=e^`32jq1sJ abH4{J"`%!!3&"`hVi,!#4'&#"##".53327653>32iJI !c?G[4JI!c?G[478=e 32#"&&#"32xx.dep<;pfgccTVRۊٗQVTH{R(V$+6##".'73".54>;2"4.#2>8zËKnb-{!GP]8bn::of{9H}t{yKc^M!CךU[7P2,J5.-PpCHpM'GH+OHBRZ`2BuH3326533!5#"&Hkp_1rl{/adR%3#3#Rdm$7'd?98>1"$/#4'&'3767653653#"''##53 ra{ .r &q,bS !/#12j{@E#$]|0q!<"5DAb1)*5"32767#"'&54767&'&'&76'##53|LAV:218UG&/=8O6-N@?_F?D(7-"Gq/#)^ %$ \*$@.!* n F?\KH* #TH#5DAbZw %3#%3#3#%3#ô ^ %3#%3#%3#3#%3#̠&!#53ӤR@dm 327654'+53367657M593pQf$h?FA@6b !eI(R[2* #53 3#ӤR%@-$%#5754&'./.54632.#"'/XZH߸g^aOl39ZZ8{4<5/VVL89CFnY1^5YVeU-"%56767&'&54767632&767/SD435gcbnZdF31`9:H:ZU!LOTAKv?=0ps2# &][&zr 3# E' , ' qxE '  E'  X f'  cX f$$27'&5767&X$JԖ`e_'@5 ^vbĘe4)X ' cj%67654'&'3#"'532T! D' U g$?%#"'&7673327676'4/37653323#"'&' &!UNBAE3I0<^yM\dsቬ+;H2zm^\꜑#P}g£x&R" C~m8($' c i =%327654'&#"67632+"'&5#"'&5473767654'&'3HIj($@GgLK1ZX%5,0.3cM[|dh<2=B%A !  .DF-%!mNH7(M' Ok  %327654'&#"!#53367632,Ij($?GhKL1[W~.DF-%!mNظ\wLR! Xn*' X &/.Q&+8O\79LK5:,]-#4CK%63#"'&&733276u2lecw@A(IiTcI9(jzG1H*V\ss~B")T.327654'&'&#"&#4763&547632#XzL,5;(.;Dn2KxAZM\MObxX'*9:X DD(NOf7*(?$S-8AP6`'  *"327654'&'2#"'&5476B!799[]KB{ƶ`Q%T*WE{R,,9.UMAx|KU#JNL 3 &"4'&!5 767&'&'&547632?,3/V%.-js1v-3t9>YH9!$7+(;ڮ.TVLh+bZ3[f5%#"'$47332767654'&'&767632#4'&y]H?BKSxlkA;"b^M`72'#}[7 0&huqc-##NG".*3:,=2IB="9), g:^M ' r zD5%5%DHHnnnnD&567&'&54763233"/#"'&5332767654&#"t$!lD?I'8 .4LT^s7Z $08 " ,d$* 9^W4'6O'&n=NV)qaK" %D5%%5%DHHnnnnnD5%DHnnD/&'&54763233"'&'#5276767654'&#" lD?I'8" +EɓV  , 8_W4'6O -n=*{nmp" %D5%DHnn0('&54737676537654'3'&x!9EO)"a 2=`KG g&ZGM'DA2omb}8T"RY$6s9It6X !Vz 4&"2>#"&4632XXXXztrrt?XW@AWX栠732767#"&'gC*6:*kWZZB6"D6{S )L}@"Fw \v4373ŠF3#< !#'3<&1yI !n8#'337673#" &1CRz6 *boajr!nUPymL%#'37676537653#"' &1/(0H/<(F!34.5WY9!nr|> @2%,*;l>3  *"2767#"'&54767&'&'&76`yg\NNYp0.VhG hRcpl?AOXj<9U9iDGTOA7.?#ou\N/ b \^xH a8' &6F('&5473327&'&5476&'5#"'767654'&#"%327654'&Cv-(;G--0M,Q;(J$"':AGb 41~!$@K5:,+  iEN@TSZ 'C49g=ql@H=.%4-+#%v%'r.C!0B7,g`o6oU%m`m!3/AbM3))I~R~R0`'0333#!!67654'&'567654'&'|djw~~tdxd=HL@|c3?>1fv! LVxZQ-x.6{<2'1mc,#>d{*>@ #% +BA?>pпQQ9l,"2"54767$32632&#"# '4%7654DҼJPi?3k]KM?oabu;\SfaƎ:F78UyP8327&'"'&#"%47&76$#&67 #"'632Y60I616*, !*:9u`0'"/6OAK %[9.ȵ!463 #"&'7325#'&&7'6et !yCBBquЍ h! ACBB|U )"32654&24''&5432#5476n$ % *|{e6Lj` %"%:yx~)RhKK>a 9"32654&&5456767$ 3276320! 54-6546$ % #vdz]#x.>r>>$o %"%}@~Y9peDQcFlWNn-7Vs\ ,2654&'&! 3%$4567&7'7$!% /@l~.ZA $! $?=Qm.uG4 {V{,@ //1@ <0%"32544$#"54$76f@@@)@@@@Pyxo *%"32654&"#" #"5323272#4#"$ % zw6^"$J7f %"%&PW0>{#$"2"22#"5#&567663 #4#"&퀀!7y{^܀ݹIedm%jh{'>@ $/<@ )1@")<@ & )<0&7'64323254#4%$7"6CBCbRBCACKؼJjeh0KT 24#"53265$54767653!"'#@>z]U]xTrs@0egu/ss}T|"247&76% 3%$Զ%< &Ѩ'LB}T"247&76! 3%$Զ%< &Ѩ'hBc J"32654&"32654&+&'#"'&5432'3253765&7465&'7$ % $ & cge~PLfrtгJwT\U &"$ %"%IJTObo;4ˋP6A^g[oPIcb$0+&'#"'&5432'32537653"32654&b\U{cge~PLfrt$ & ,PIIJTObo;4ˋ %"%el} ,"32654&2537653%&'# 47&76b$ $ 0nuhigeޘ %"%4ˮ/IJ=%ۏel ,"32654&2537653%&'# 47&76b$ $ 0nuhigeޘ %"%4˯IJ=%ۏ``3323!"'#"543225cиx)3Ɯ)`,88{s\ ,2654&'&! 3%$4567&7'7$!% /@l~.ZA $! $&=Qm.uG4 dm +"32654&&! ! &%$&7676=$ $ W6tm2JX $ $8${{N&ap .%"32654&%&'&'&7!2765!"'676F% $ WD NbfP'G!$ $TrJco<ob{"326! %&$'423 54! P@@<)"FTY=Ib" 2:%"32654&%!$76! 6'&'7%&'&'&7!276 54! H& $ JF r cXD NbfPt!$ $=1TvTEmMd 6"327$"327$7&76365+&7632676#4#"A?A?`ƾ5@VC?/@@@L@@@E>/} cbWZwj %-"32654&7$%&'&763 54\$ %  ʪ=A8)SUB<S %"$36H9G)#$67U 6"32654&$'&%$76!232'&#"%$'&762$ % T\oEh@MqKUPn^ %"%+DYl0yP^d6Qqt^}]F0&$"2''&'$! '&5"32?6*ʁ+=x #esZh N)=md[d'u ! &7623$54'74"m#!AVB8?kP$U.F~>=!{ ##"2#"5324#j=;C>{jVnn!r&/S~i! ! !5 74! $&>%~?>~Si! ! 3!= 74! %&>%~?>wJ~S~i! ! !5 74! #5$&>%~?>~NSi! ! 3!= 74! #5%&>%~?>wJ~T3"36654'#"5432AA\(DeN[̼o[$N[ux"325"547&5423253,r>Jm,Ws> [yu?{EBXFE '656%"'&76! 4"3VA!. {x9f>.`h>4A?~= h\$kb8:;-F_Zkf2)I 53533##5J؎؎؎P;r 432#"324ЄLT3z! 473! 4'$331=PU~iibcWOJf34! %56'&53!! 4<1~k  !TxY9vwsknWa!%! %674#"&5! % %a lշ._z-FH+,S.+RLo ۤTnB7W !,6752363 ! 54+"&$54+"32(TX[P<fI+yhZtԕGw, bb+]mLVW3! 473! 5 &5 3I%$&>8 wjs oeKrdW2'! 673! =4+5374# #&5! 24:ip II-<-]mxRbXxR~X{\+2 ! 75&7!  4'"6258TW\F ;IJ:QU-\p!7 %#65+"! 5!2363 6#&32Ԅ!S}GJtAFWHCBuccyi2#! #&! 2Ɣ#cZY4! 473! =+53254!5 4C(pbAAZZwfq211W2 #&$'6?! &65l_$^M>p v\Y1xOh_[ )euG4! !234!#5!  ! 4E%D˼  }>>&T2! )!"363! %22:M#@͹$[ڀ g7 ##654#"#4+"#&=!2363 K@BM{hIF`fhh&4!! 473! !#53274%$534D'e[?RܬW&Z~IJȕ!6G))=iY32! 3! 5 '%5%30>'Mhko 4>>HS2>+3|'! %!5!$! 3#3%! ! 5)54!  I8<rrr OfkQؔc7X!,!"'#!52'4#&3$5!23634+"32~ Mas1D>3LIvjt| ٔxukYf!! %$54#"'! ! 4'7fGD `U6I@bYsrg8A:ԃM){6\lY4(3! 4%7%#"'#% 3! #>U&;3̿0?7YpnWc$!6=3! 47$$5! nڞòd?;kHuLL8TWJ&)*y54&#"'675&%'% t_CCty`^q|ytJfI8=\ ۣb*#2 3#3#3##Ѻ/㰽;2"4;%"4#"32lѹF|pux$LRQ´){ B32654&#"26=%!>54&#"5>32>32+3267#"&'#"&1xYS\JMLepO27Gn 'aȿuc^8>M<[|%!YHZqYaq4+#"33)+RNPPXx+'#!?@=B2({0#"'&'532654'&+532654'&#"567632wA@Q[\ihWVLHHZ[c[[MaZ[VA@^  VJ=+,nQb54"[\mPDd %!!5!!!#53)Ḹя{ 6326="326&!54&#"5>32>32#"&'#"&PVWMZfRPhgPPTcpP/;}Jb04TY/%W & +ݮyT53+)CBDA>A>A2/H{  #4&#"Ð/.G/  33265G.Ð/.+[%!5!2654&#!5!#J^adlp2r?W75353!5!2654&#!5!#?idxEvDFzlp2r+")5!2654&#!5!2654&#!5!#HEws{p{``PDP. &#"32 &6 Ua`UU`aڜ›>pU?32654&#%!2+#XcbYSJKR]#'.+#!232654&#1E4p1M>ze\Y_[' ?]Z4D|vShPIKHM!!#!ڀ_A33267>53#"&'.A L67K $,*kCBk*,$=4!!!!4<8l$! !#n 333# #|ZkmZ|xyY>E )#"326757#5#"&546;5.#"5>32&ffMD_ntt&pQlT];y:Av7X|&??8?vh+]85l[hmKDg..RE )32654&#"3>32+3267#"&'.&&ffMD_ntt&pQlT];y:Av7X|&??8?vh+f]85lZimKDg..RG53#5#"&546323264&#"tt`??aVTSXXSTNO/00z{{ B32654&#"26=%!4654&#"5>32>32+3267#"&'#"&5kK84:/0n06@F2Q #S-E^T=bg~yI>;#T'1S&9NT8m\)3?26JUJLXP ZQ`.+-,`\`d1CH^#$"%G4&"2>32#"&'#3VWWaA?`tt]z{{.10/OgG3#5#"&546323264&#"tt`??aVTSXXSTDO/00z{{1!3267#"&54632.#" xn7yEB{9t\UTm 2gp fnZ_bW15!54&#"5>32#"&732671xn7yEB{9t\UTm 2gp fnZ_bWO(.54632.#";#"3267#"&546KQ3sCBm0W][Uhd^jrm>s0=r6]H5KX ]0*"0Q>-7;af]=SO(#"&'532654&+532654&#"5>32KQ3sCBm0W][Uhd^jrm>s0=r6]H5KX ]0*"0Q>-7;af]=SG '4&#"32#"&'5326=#"&5463253UQUZZVPɖ0i4>d+]V_E||D^tgxxz)f[bF5302QI !#5!#3#53W?浵ss#PP-8 33##8x0BVxyDI%">32#4&#"#4&#"#3>32B/UFj",2%j$/.#jj?'0@)&ug@Eg?Es6"#'[v+5327654&#"#367632v89hu9CGR,+tt54Ilj!pm;32#"&'53264&#"X.c43a1.\;muvl=_)ʮl$!~~!#: 46 #4&#":&{[YX[ՠxzzx:  &533265ڜ{[YX[ՠxzzxG#3>32#"&$4&"2uu`?@`8UWWbP/00z{{M!!;#"&5#535};JkPF7R]rTP[v332653#5#"&[tCGRWttkGlj{TPg`b^68~}!5!2654&#!5!#K`Yslqj=?g32#"&'#3LSbC,ml/#.,}^\VZ:5`!!!5!!5!!5!!5nnlphˏ5iV ;+53276=#"&5!5![YYZ͹Z-,0|~ij>>~G#3>32#"&$4&#"32tt`??a9VTSXXSTNqO/00z{{Xy#"&632.#"3267y.c43a1.\;muvl=_)6l$!}ut~!#QI+325&#"47&'&547632.#"632#"d&/\R@5a$^`^63302b3q>>>5|4 * &:/ZXX `@?@bj:)#"&54632.''7'37.#"32654&|s .sPm4\a^UV^%wp237,pQ57vonwwn=rO(#"&'532654&+532654&#"5>32T]5sQ0"*0] XK5HWz#"3###535463z>1tkqU.98P#P,gabo53#5!3#+53276=Ι<98h9\P\ m;d+]V_E|~4wuxzzf[bF53[v332653##"&[tCGRWttkGlj{TPg`bO68~C3#!3#3!535#535#4tt)r\PP\ap #"&5#5!;phq)99uun@PpFFI !#3!53#I?P-PPG#3!535#535#5!#?\PP\PPdm3#"54;33#'0#"3276ttdytrx !3rJMB ,|ssW?#5$ U| ;#"&5#5!98dv.FFXtp(QU| ;+53276=#"&5#5!9889ht9hr.EGbm;32+53276=14&#"#4&#"#3>32B.V"#23_uj3",2%j$/.$ii>(0@)&:;Sm;32#4&#"MU!1$XT8[]V;;FQxlX6V~a88wYYk\U|$54'&#"#367632;#"'&5:G()WW*+7[//$1!U&'H/Y,-56\sa8BDH V6X66x? 33##?-{{~: #"'&547"!&'&!3276&NNNMMNNX-(e(-W !-XY-!TUTTTTU=5cc5=J,==,:&/#5!#3!535&'&5476767654'&3fwx=%; )=xw>)[v<.#"#"/;#"'&=32654'&/.547632P1j8W*,]({44MN8> 0Br34@>?=RX!k)k`FG@98b/$+*MW33 V6X66x"192-*TIX00xY46;#"+5326 j{mo>1gr,B0]MecU-:JxlX6M!!!;+53276=#"'&5#535}J88hu956PF]m;T_^s!!#;#"'&=!5!jG$2!V&'G^=R V6X66x ^M^#47#5!5!3632#'03254#a\'Ln& m,8!!^R^=jR332#"&'532654&+5!5!dCP>i;}C5~Dx~uhn\' xM|mTPJS]R^: .#"!326 #"&54UYXUcVXYV&l~~g~]% &$ #{&DqP& %X&2Ecq&%cX&Eq&%X&Eu1k' Zu&d&u%f&vZ&hFRP& '{&GcR&'{c&GR&'{&G}uR''{u&GR&'{&GN&({X{&HN&({X{&HuNm& &(2{uXH&&H2XP& 6)'P& IfP0& 2*{H&JHP& +P& KcH&+c&KH5' \+X'jHKuH'+7u'KH&+&K&,D&Lk' u.k' %uNc&.c&2N&.&2Ncs&2/c &Ocs0& c 0& s&2/ &Os&2/ &OVyk' u0mof&vPVyP& 0mo&PVcy&0mco{&PFP& 1&QcF&1c{&QF&1{&QF&1{&Qu\&2'  2H'&Ryur' w|3VTf&SuP& 3VT&SP& 5j&Uc&5jc{&Uc0& =c&&5={&UJP& 6&VcJ&6c{&VcJP& &6c&&V/P& 7P& W/c&7c&W/&7&W/&7&Wd=&8d^&X=&8^&X=&8^&X=' ' 28'&yX9E' \9dm&yY9c&9dcm`&Yr' |:m&CZr' |:m&v@Z4'j$:&jZP& :&Zc&:c`&ZP& ;L&[5' \;L&j[%P& <hV&\t' .|=m&g]c&2=cb&]&2=b&]&K'jW&wZhV&w \'P& AH"%c&$c#{&D%ct' |c#m&g%& &$ #'<%cm& c#&ucN&({cX{&HN^' *u({X7&yHcNt' |{cXm&g"c&,cD&Luc\&2cH{&Ruc\t' | cHm&g k' ub f&vck' ub f&Cc^' ub 7&ycc&b c{&cc=&8c^&X k' vuq'f'vdr k' vuq'f'Cdr ^' vuq'7'ydr c'vq'cq'dr%r' |<hVm&C\%c&<hV`'\%^' u<hV7&y\Fr&Fr&Fr&Fr&Fr&Fr&F&F&%r&%r&pkr&vkr&vr&r&&&p(r&(r&(r&(r&(r&(r&~Nr&~Nr&Nr&Nr&Nr&Nr&Vr&Vr&Vr&Vr&Vr&Vr&V&V&LHr&]LHr&]?Hr&J?Hr&JHr&|Hr&|cH&DcH&D6r&6r&r&r&'r&r&&&~r&~r&r&r&r&r&&&Hr& Hr& Hr& Hr& Hr& Hr& \r&~\r&\r&\r&\r&v\r&v3ir&3ir&3ir&3ir&3ir&3ir&3i&3i&r&?r&JDr&1&Fr&Fr&Fr&Fr&Fr&Fr&F&F&r&er&vr&r&r&r&&&Ff&CFf(f&C(fVf&CVff&C6fHf& CHf3if&C3ifFf&CFfFVr&'ϜFVr&(ϜFVr&)ϜFVr&*ϜFVr&Ϝ+FVr&Ϝ,FV&-ϜFV&.Ϝ%Vr&/%Vr&0kVr&1kVr&2Vr&3Vr&4V&5V&6Vr&CVr&DVr&EVr&FVr'GVr'HV&IV&JLVHr&KLVHr&L?VHr&M?VHr&NVHr&OVHr&PcVH&QcVH&RFVr&{FVr&|FVr&}FVr&~FVr&FVr&FV&FV&Vr&eVr&Vr&Vr&Vr&Vr&V&V&FH&F&FVf&ϜFVy&ϜFVf&ϜF7&FV7&Ϝ%m& %0& f&pf%V&rVr#525#53d7yF&jTVf&V{&Vf&V7&V7&Nf&vNf[Hf&DHfVH&r''r'8d&/H&6&&67&&m& 0& f&fr'r'$d&3iH&3i&3i&3iVTr&VTr&3i7&3i&%m& %0& [f&Dpf~ur&F&jr?FfCFVf&FV`&FVf&F7&FV7&\f&\ff&fJV&fvr53#3"ïddm10!!d dmy/10!!/yy/10!!/yy/10!!/yy/10!!/y'__ ]&BB-@ 10#53Ěb~-@ 103#1řb/103#Śc/-#5b %@   1<20#53#53Ěb5Ǚb~~ '@   1<203#%3#řb5Ěb/ * @  1<203#%3#řb5Ěb/ #5!#5bb;/ '@  RQ R <<1<203!!#!5!nn\];/<@  R Q R <<2<<212<220%!#!5!!5!3!!!/nnnn\\?!   V 104632#"&?}|}||{|?q?P1 #@   1/<<2203#3#3#P3f111'3?Kt@%1= 1%+C@&7IF:4(:PFz4P@ PzP"P.zP@(/99991/<22299990'32654&#"4632#"&32654&#"4632#"&32654&#"4632#"&H%'H_EDbcCE_yxxwyLaEEacCEayyxxy aEF`bDEayyxxy7a`JGacECcaEyxyEaaECcaExxy"GaaGCcaExxy DP\h4632#"&62654&#"'4626763267632#"'&'#"'&'#"&732654&#"32654&#"32654&#"yxxyyaacCE%'E FedE  FeddeF  EdeF FceeO:8RR8:OxQ::PR8:QzQ::PR8:QyxxyaaECca`JyS  SS SxyT TT  T{GacECcaEGaaGCcaEGaaGCca`$3`u`'33j`P'3,'33`$#3$V`u`'66j`P&6'6,6Z/#@ v29190 5/-+#Ry#@ v<9190 5 +-#^R^  '4%#56763253767654'& Yb^`_hon"!^XE&->B% #D9``LAB\VBT=BR-;,,1Y7 B $7#"$'5ZThh~vvuw~iw !#3#3!XEFZ !53#53#5Xޏ!'  !' 4' ;g 2###׍辸= ,47632""327654'&'2#"'&5476"%F$W+,,+WX+,,+XLLLLJKKL @ !UUUUUUUUYnmnmmnmnH !3!53#3#z(洴ttPPD  5   @  W <291<29033##5!5 !wtt}oyc?}!!!>32#"&'532654&#"f6TTXYJz04?9= 25DIJLL...P\\PS****hQQ;JJKJ hh2112=!#!=HCD0;.="327654'&'&'&547632#"'&54767327654&#"hT-../RU-../P--KKKK--P]12PPPP210'(KL('NMK(')+*++*+NM*+/23Gc;::;cG3288Yq?@?@pZ88C#$$#CDH$$0.27654'&#"532765#"'&547632#"'&SP-..-PS+***(X/x==jDHIKLKKZ[-..44]\4421ab21hQP854&e_]]_eTSS}~A @ 32tNN^luu)qJy}wYYk\sa88=TFdXC{dB}TtdFTud CHd?}CIdITJd=CKd;RLd0TMd?Nd8Od PdifQdifRdE,d12d:;dsd13dAhVd8g8dV|n}d%9dASdG?d[v~dM%@d ##"32.#"3267!!!!!!;JܾL:9II9^o78?*?77IG8GI`{c9'.473&'3267#"'#7&'#7&'&76?3&',;8+$"5:lUXn;4";τPqJ8=0;i<)^_HH?WgjιKp(_Y,%6767# !2.#"3>32.#"YQbUYoHqWUnrV,e#7!v'/_HGghGG_^ٜu]\YC!!!!3###5ZpP~WHE9El#!!53#535#535632.#"!!!?-쿿=OL=tyB_))HmBo)632#4&#"#5#&'&#"#3>323 0?o5FP;]iJI9!c?L3!Bjbws{E78{``N#55YQKP%$((TT@I!*##` E326&##.+#!232654&/.54632.#"#"'&]``]z/YM$TP*N(:?>?>SZAm)naAt02k:WX?^)}j9>/b؍$~3YQKP%$((TT@I!* *-037#!3!73!733#3#####53'#53'33ٹpg1 2CYȿYD2FIn$uumuuwugu* %2#4&#!#)"33!3*ԕ|aԕ~V*$oN{&lz%%3p@< 1& (# #43('1)-&- 2'-4229999999999122<2032.#"!!!!3267#"#73&'&54767#70TJBN1Fi1OCHU,1u1!(*=Dl-.&nC>*( n -/ l*33!!###5<~rTws1s/!5!!77#'%5'+s-PPMMo؈onوn9-bw'67>32#"'&'"326767654'&'&67'>7632#"'.'&/#"'&54632326767654'&'&&#"32fbU!O3'A"+0.!. !  _ \5#?\k2,,#2!$(2( 4" )1>((E8&^ ,9Q F 9)ЗiRm:3Xwdg7? 2j7#=5(6$ 629T/ (2M !:5S}$@{mbq~Es/4 -& "TAB`]|@8nRkcd]aC".)5'632327&547632#527654'#"'&#"%654'&#"o|@X"07PYtaTk~j[IwmqJ2530D#24!`NkBX``S㫣†qJ`R{{{{{A667654&#"5>323#!!3267#"$547#536767!5? 7^\iV ^':,hski HE 4cq<;''K={[/ {9b{DI--N@{ O/{O!,&'&#2767#&'&576757O[TUeeUT[Y\Y[dsye]Y\[CvlCi----iH$"u9Bt"#BuflC/ !!!!#!/ss-+ժx hq%!!##.+532767!7!&'&+7q7V#7KPN76SٲM{cݑG; 74K7{P{V^77hy]M@f{L5N{ !#'%5'%3772N4L4PP~n؉noوo.fu!2+!!##535#53326&#0It⦦ 1ϔ 1 %3267# !2."_|dT ȄE}=[~oi 7@,L]r4*:0N̾ (2.#"3267#"&54632%3#"326.2"&54:F#KVVK#F:-Q.~*Pʇ=II=323]W!{/tKb J G'QWab ^TH632#64&#"#'?3%Ǘŋ]W!{ 1$ÑEmJHWEbOYbcJ %# !3!# GHMZMd q+  #  "32!!3463"##526eb223b WU&WU&  1Q~>;\>}N*3>"32>54.'2#".5467>32654&#%!2+#hjMMKLijKLkZZ\[~}ڶ[\ZZ&RXXRuJjhKLLLijJgZZ[~}ڶ[[}~[ZZICBISqmopB 33!27&#%!2+!67654'&` `s1:+YX*q jdZ)VV) (%#'#  %27&"676'&\ӿ,F E]]]][{ab[ 2222jT%%5$c$% &.2&'&+3!.+!!2!27&#676'&%3A::f&AVy-`5?vfAd)7%LK$201/O~hbb)j)V>U)- fh@6    B     ` `_`_/91<<2<<90KSXY"###5!3###r}r7q^^-B0 %#!!!5!bJZCJ]d qddd J.%m -)7 7673 $54$32!"53!25&'&#"6Ky {U>ZLtࠢ""38M{{M7M3TT<`xGZAEIpP3RQ4O !!!7!#3#3#B!#n!ӄO-`ddhZ{& '{KVZ{& '{M`e{'uV& {e'uV& tZ{'IV& {Z'IV& tZ'IV& u Z{'IV& Hj{'JV& {j{'JV& I_{'LV& {_'LV& u_{'LV& I_{'LV& KZ{& {e'F& uVB} 5!!B#ZpZR#ZZM '#'"ZZ$MZpZ#B} '7!5!'7ZpZ#ZZM !737@ZZ#ZpZB}!5!'7'mZ#ZZ#ZߠZ#R#ZZRZM%7#7'3'ZRZZ$R"ZݠZ#ZZ#Za 7!##:nt':tna #5'#5!tn'dtna )53753dtnntda 733!ntd:ntB}3!'7!5!7ѓc}Z#Z㔎RZ#R#ZRB}#5!7!'7'7!'/cZ#ZߤRZRZRYxa532767676767632&'&'&#"#"'&/#7!$f ! +!3-68+2",j!!!3 .6+85.0$m: w '07)(6;C+ : ,:'+:Yxa5!5!#5#"'&'&'.'&#"'6767632327676:m$0.58+6. 3!!!j,"2+86-3!+ ! f:d+':, : +C;6()70' wB}!!'#537i&ڠZZ#ZZZZ#R#ZZM'75'3''#ZZ$R"ZZ&ZZ#ZZB}'73'7'7#'7!5hZZ#ZZZZRZZM77#75'73ZZRZZ'ZZ#ZZ&B}'!5!7ZZ#ZZ1ZZ#R#ZZB}'7!'7'7!'4ZZ#ZZ1ZZRZZB} 53#5!5뤤4Z#ZhZ#R#ZM %'3'3!5Z$R"Zh̠Z#Z4B} !'7'7!#3̠Z#Z4ZRZM 7#7#5!ZRZ4Z#Z̤M%'7'3'73!5ZZ$R"ZZhZZ#ZZB#(276767654'&'&'4#!5d >b-*,%:0Z#Z  *+(54<852.&Z#R#ZB#)!'7'7!"'&'&'&547676763"mEZ#Z0:%,*-11> ZRZ&.258<45(+  B#$>2+#5!5!54767676"3276767654'&'&'&l>b-*,%:0ΠZ#Z2)-019 o #*+(54<852.&ՠZ#R#Z};47(+ }  B#$>!'7'7!#5#"'&'&'&54767>";54'&'&'&e910-)2Z#ZΤ0:%,*-b> o #+(74;}ZRZ&.258<45(+*  } B}X3267676767632267676?'7'7#&"'&'&'&'&'&""'&'&'&#5! ! Z#Z  > >  Z#Z" *!#$' * ZRZ %  '%  %' " Z#R#ZB!'7#5!3'7'<2Z#Z<2Z#Z Z#R#Z ZRZq` %7'7]JQgz=Zӄh PJV}e 5!#Z"ZǠZ#R#Ze !#!'7'< Z$Z9kZRZe !3!5zZ"ZZ#R#Ze '7'7!354'&/#7!J%%%'HD_SlhX[HJ%%%%Jw422-A8;>112-!:zJZ[ghX\HC+%%'GKY[eg[WMs2=>FD{2,/2{DF>H':Xy6#5!#52767>54'&'7#"'&'&'&54767<:!-211>;8A-224wJ%%%%JH[XhlS_DH'&&&Iz:d'H>FD{2/,2{DF>=2sMW[ge[YKG'%%+CH\Xhg[[IB}5!B#Zp{#ZB!!BMZZ#M3'#|"ZMZM#'Z$MpZ#B}!5!'7pZ#ߤZB'7!5Z{ZM!37ZMZGM!#73{Z#ZpB|  '7!5!'7 5!!ZpZ##ZpZZZR#ZZ*M !737 3'#'2ZZR"ZZ#ZpZMZpZB| '7!5!'7%!!ZpZ#ZpZuRZZ#ZZ#B|'5!!!!5 #ZppZ>R#ZZ#R*M73'#'#'3hR"ZZ$RZppZ#B|'7!5!'7!5!'7ZppZ#>RZZR*M%#73737#hRZZR#ZppZBA! '7!=!Z#Zp{Z{#ZBA! !! !5!'7BMZMpZ#ߤZ#ZB}!73!!!'7#5!!qVa6ZEV`6NZ#Z">RRjը;mRR:lNZ#R#ZRRB!!373'7'7#'7#537!7'!RRȚNZ#ZN|NZ#ZN.9#!RRRRNZRZN ~NZ#R#ZN RRB}!'7#5!7!5!73'7'%!7'!`]Va6.ZxV`6NZ#ZRR;mRR:lNZRZRRB}!!5!RRpNZ#ZNRRRNZ#R#ZNRM#'3'#'RNZ$R"ZNRSpNZ#ZNpRB}!5!'7'7!5!7NZ#ZNpRRNZRZNRRM%37#73RNZRZNRRpNZ#ZNRB}!!7/7'7!5mRRRNZ#ZNNZ#ZNRRRNZRZNNZ#R#ZNM'77#7'3SRRSQNZRZNNZ$R"ZpRRmRRANZ#ZNNZ#Z6a##7!#tn::n3:t:5p::6a '#5!#5'5C:3n::n:4:dp:nt6%753!5373:4:dp:ntn:nd:4:6%3!'3n:nd:4:n::p5:tB}5!!!!!Z#Zwgw"?Z#R#ZRwRwRB}!5!7!5!'!5!70"wgwZ#?RwRwRZRB}37773'''#5:;!\[`Z#ZCCjjZ#R#ZB}'7'7#'''53777Z#Z`[\!;:ZRZjjCCM%#5#535#535'3'3#3Z$R"ZtZ#ZtM533#3#7#75#535#5ZRZtZ#ZtB} !553353!Z#Z{Z#R#ZM '3'#7#7Z$R"ZnZ#Z}ʻB} !'7'7!+53#53Z#Z}ʻZRZM 7#77'3'3ZRZZ#Z}6B} !!#3#Z4ZݤZ#ZZ#B} 3#'7!5!'7뤤Z4̠ZZ#h#ZZ 5!5! !!? Ou]%uuv 333'#!#\^vtP uB !!75!!5 t]]Xv ###3!3,^\X& v 3'335%!!# #^\XtvpFguv %3'3#!5%# #3!^\^$tv~Fuv #3#!5#3/# #3!J\^^|HGetvJ~{GGMuv 3#!!5#3# #3!F\ F ^tvW~uv 3'333'37# ##!#^\fd^tv ^u9v #!5#3'%3'37#7# ##3!3^^ fd^tvJ^uB '#35!7'!!!5 5~t]]EF 7!##!#*:ntaI':tnIFEF %!53753!5!ldtn~ntd&Iv #7#3'# #3 3\^^tvP*OutuB}'0#"'&'#53676323'7'7%&'&#"!32764RvxN1kk2Ow9g' Z#Z 0GD2 & +JD5@3PO2BB4R,( : ZRZ11/0*M !#737'#'RZZ"ZZ$#ZpZ*ZpZ#Ba7!5!'7!5!'7'7!5!ppZ#Zp?ZRRRZB}#5!5!53!Z#Z[qZ#R#ZB}!5!53!'7'7!#p\Z#ZߤZRZB}#53533'7'7##Z#ZZ#ZߠZ#R#ZZRZB}#5##5#53533533ҤtZ#ZtZ#R#ZB}#53533533'7'7##5##tZ#ZtߤZRZB}53533533'7'7##5##5Z#Z8Z#Z8ߠZ#R#ZZRZ !! ?OuuuB 7% !5uzR##7 ! ?S:uuzRuu##% %!3!3hV[7l n7R{+u\ #&'&#"327673 u B!OO!B ocI7͙7IcL 0"'&547632654'&#"563 3276767&#" \m`cu\6% GGnth r5?,/H@3H5,Y:$UeI+HQ\N,tqzSd69->eSY׮l 7!!5!!5!!LLk+5!#7#53!5!!5!733!ZD2/+^^``kIb!0?"'&''7&'&54767>2"&'2767>54'&&cv-'''OO_@8vcu-'''OO_A:GE:;9($(#&GFF:;9cv8@_pm__ONP(-vcu:A_mp__OOP(-9;SPF($(9;PSF'O@*iiiiB91/90KSXY"#3 !q!#7!hqqP3!!"&63!!"!0",Z(膆(\JN*"f_QQĪKM_fOPi%+%3!!"''7&'&6;73#!!#"!#L(0,:CyEB航6'|>v\JK-".4"$: 1cQı2#KK_ff_lFO]B/ 3 3ް2ް2201!3!!".>3!!"N=c(憆(c=֪I9[[9IP&'.#!5!2#!5!276767!5 ,Z(؈膆(\JL, 1f_rĪKM_fOPi%+&#!5!27+'7#53!5!3276767!73&'&'(/-9CyDD舫6'{rx\JJ. 4 %:  1crı2ݪyKK_ff_lFO]5!&'&#!5!2#!5!2767>b(؈憆(؆b>,I9[[9I3!L9@ 120!#!L^L9!3!9_k^L= 7   @  <91990!!5 5!!LR%# Չ\P_X-y10!!X!תXy!5!!5!3!!y!DCmILfB7+U e+Gr?-; /@     99190'%3##d)#Ӕ/}b%9;v'ue4;e'He4 %.#"326"&'#"&54632>3"38\32#"&'#"&546329[=G[TFBi8\=G[SDCj~/[w~SNAU}^sdlkutcjmvu۠d|k֥s}T!3!T*,}T!3!T*p_,33# NM^T,3 3#T^,$476767632#4'&'&'&#"#;9_UijB9 KGLV32326yKOZq Mg3OINS5dK t]F;73 ";@<7  6<Xy32767>32.#"#"&'XJF]t Kd5SNIO3gM qZOK?<6  7<@;" 37;XyG&'&#"5>323267#"''43OINS61-NSXIFJKOQdSP  ;@<7 W"323326X!!KOZq!Sc1NJOR`!t]D;83$
777=X`y!!#"'&'.#"5>32326X!!KOZq Mg3OINS5dK t]F c;73 ";@<7  6<Xbz'767#"'!!'7#5!7&'&567676ǧfYUE5kIQ%\n*xrYQMoIF\<[ETFR q$"B2(d%(9L5XXy$!!!!#"'&'.#"5>32326X!!!KOZq Mg3OINS52'V t]Fجϯ;73 ";@<7 " 6<X1y0%#5!7!5!73!!!'#"'&'.#"5>32326Qu{hq,gqTKOZq Mg3OINS52'V t]FR=R ;73 ";@<7 " 6<Xy.1%!5!7!5!7&'.#"5>3273267#"'!!!!'hMEnK Mg3OINS523J:VQ FJKO!8!E$F";@<7 832326#"'&'.#"5>323326yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]Dï;73 ";@<7  6<а;83 $77 7=X0y8&#"5>327&'&#"5>323267#"'3267#"/'00NJOR:G67'43OINS520N]a91FJKO?J4r[DKKOdgb 7 ;@<7 !7)32326#"'&'.#"5>323326!!yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]D*!;73 ";@<7  6<а;83 $77 7=Xy7S#"'&'.#"5>323326#"'&'.#"5>32326#"'&'.#"5>323326yKOZq Sc1NJOR` t]DKKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]D;83 $77 7=;73 ";@<7  6<а;83 $77 7=Xy$!5!53276767632.#"#"&'y!JF]t V'25SNIO3gM qZOKج#?<6 " 7<@;" 37;Wy' %52% $'"51pZV(IٜXDz;%76767!##"'&'&'#5!!5367676323!&'&'&i1*+V WJRNMR  W,!::!,\HSLPM% +*%'H:^2:A<336G84^:H'@'H?Y L=@33/N0<^:H'%X`z!!5367676323!&'&'&!!i:!,\HSLPM% +*!#'H?Y L=@33/N0<^:H'%X`y& Xy& ''Xy'& oWz'& nJ. 3#3#!5!5J=>𹬬J. ##!!!!>7BX`y 365&'!!5!&547!5!!%43448>!0IG00GG2?8>;_8X`y !!!!"264&'2#"&546X!!IdddeH:l'**z{ BbFE``bq+((d:svvX`yK!!!!2&'56X!! BS X`yD!!!!73# X!!鏫 BZVX`yD!!!!33#X!!֕ BLVX`y!!!!!!'X!!߰ TU UT BX`y !!!!!3!X!!-e Bz(iE`07GO!!!!#"3###535463!3267#"&54632.#"'53#5#"&4632264&"X!!4@#mmC???DJB&G$$K&aqk[Q_B;18BCC?-I\\I-?p`ctiF6A?9i=$#tu#gSSSX`y*!!!!>32#4&#"#4&#"#3>32X!!."]?T\Y88EQY7:DQYYU;;R B=:xoHOM]QHPL^P%U20=X`y ,!!!!3#7#546?>54&#"5>32X!!ffc`--A6(Y1/a3\p$-, BiN2A+,/-7#!^aO&E++ X%y<@     <291<2<<990!3!!!'7#5!7!X}y}J;fժhӬXyB !!!!!!X!!!جX y%#5!7!5!7!5!73!!!!!'G=XkXU7Y Z:wSAw@Xy 7!!!!!!!!X!!!!߬Xy? (@( ' <2291/905!5y!!LK Xy? (@ (' <<291/90-5!!X#!!VVTw 3!!5!5V!!!!߬¶LK VTw 3!!-5!5V!!!!߬VVw#5!7!5!73!!!'5 p[5m{*[y~!߬`u,`vLKVw#5!7!5!73!!!'-5 p[5m{*[y!!߬`u,`vWy&%5767$'5674[šzآb|۠M)Ig#M(Jh#Xy %5%%%'w2rK/dtm0x0oVXy '75%%5%'rKnd.t'o0xEu0#oVX y!5!%5%%%!!'XC_^?sMN#N+PJ>`5Yd|5X y!!'7#5375%7%57'NEO>:fLNtt5\h}a5H<Vw?#%#"'&'.#"5>323265wKOZq Mg3OINS52'V t]FJ!;73 ";@<7 " 6<LKVw?!(%#"'&'&'&#"5676323276-5wKHGOZq M343OFGINIIS52'V t]FDE)!!;3 " @< " 6V w+.%"5>327%5%%%3267#"'&'&''}QINSE^AsMP#Bt]FJKOZq _4O;@<7փ_5Xc|6V w27'732767#"'&'&''5676?5%7%53;L t]FDEJGLGOZq P32326&%&%5$7$7wKOZq Mg3OINS5dK t]FJl#a;73 ";@<7  6<RO]ɗ9=}Vw*%#"'&'.#"5>3232655%$wKOZq Mg3OINS5dK t]F)a#l;73 ";@<7  6<R˖}=9"]OV[w67&%'&'5$774hmU֠Gc _eT2wnw2"O0Bj%V[w'567&'567&hmU*c _eT2Vwnw 2O0BDj%Xy_%!"'&54763!!"3!yɊD_`Dƍ^`Xy_75!27654&#!5!2#XD`_DȊɣ`^ȋXy> #"&'&5476;7!!!!"#'J_+30TD~K9# K^+#Eƍ5p5Xy> 32654'&'7+'7!5!!5!237RJ_+30TD~K9FC K9^+#Eƍ55Xy%!5%!"'&54763!!"3!y!ɊD_`Dƍ^`Xy%!=!27654&#!5!2#yD`_DȊɪ`^ȋX,y&%!!'7#5!7&'&5476;73!!!#"$UrG6:qYȲG5^_=R5 Yƍ5p&`=X,y!++!!'7#5!7!5!&#!5!27327654'&'92D4VqF53 D&#I`__ 2ȋ559`^`X0y!%!'7!5!7#"'&54763!!"3!!yR|ɊD_aDAQjfƍ^`5eX0y"%!'7!5!7#!5!27654&#!5!2yR|Da_DȊ]zTQjf`^nj^DeN3#%332653! &1N332653! &3##5#535eDddXwy1/3ް2/301!!!!X!w@Xwy1/3ް2/301!5!!5ywXy H/3 ް 2 ް2/33 3017!!!!!!X!!w߸Xy J/3ް2 ް 2 / 301%!5!5!!5y!w54&'&'3!!#!5!ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FތPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi372"&'&'&547676"2767>54&'&'!5ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FMPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9ՌOi3?2"&'&'&547676"2767>54&'&'77''7ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FBccccPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9ccccOi372"&'&'&547676"2767>54&'&''ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F,ccPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9KccOi73#2"&'&'&547676"2767>54&'&'ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:FPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi2L2#"&546"326542"&'&'&547676"2767>54&'&'h7b%&'qqnNL88OݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F)'%`8nqqMpLM77POO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi!'/7=E2"&'&'&547676%&'&'& 654'67676-ݾOO''''OOݾOO''''OOf:F-T1-F::E.S1.E:POO__pm__ONPPNO__mp__OOAϚ9FPQ9.9떖EQPD19Oi!;!!!!2"&'&'&547676"2767>54&'&'+{{ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F;gZfPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9Oi372"&'&'&547676"2767>54&'&'!5!ݾOO''''OOݾOO''''OO~GE:;99;:EGFF:;99;:F2mPOO__pm__ONPPNO__mp__OO=9;SP;99;PS;9IPi%!!!3!!#!5!3Ҍ8Ȍ7nj6Pi %!!!!53rM_Pi%!!!7   '3ͬc  ccc #c ccc Pi 3#!!! 3Xy!!#yӪXy!!5!3y--Xy!!5!!C!DZXy!!5!ZXyw 5V!Xyw7%X!ߨVw^^Xy? %!5 5yyy!LKXy? 7!!7-X!!ߨ{?繷g 7!6762"'&'$&"26i1[륢S4OsPOtO.D/YR3BPQqOOLN #4&#"#6! NMz(/N7332653! &;zMig Y/`103#`7 !!'  TS TS8X`y!532767>32.#"#"&'yJF]t Kd5SNIO3gM qZOK ?<6  7<@;" 37; !33qj}+)y ##y(,}Zw #!"3!!"&5463!! )!"3!wk:PP:jkwj Q9:PD{  |Zw #!2654&#!5!2#!! )5!254#!Z:PP:kjyikQ9:PXAy 755%5!5X!#!!ʶLK XAy % 5 -5!!y#!!!!KL VVw?  55!5!w!!!KLVXy? 55%5!X!#!Vw $75$&%&%5$7$7"nWlܜ86s˖}=9]OVw $'$'5%$5)n˱#lݷW680O]"ɗ9=}Vw)%*67&'&%&''&'57&%5$?7dMjTVʥ3˱!3a4m"cjX)3S][e﹏3N@%HZ-=}k$Vw)$(6%'56?56%7$'57&%D>WwZN(۷+/m")33 +Si063hiyje˖X[y3!!!'7#! !PYBzrYh?ݪ@?@X[y3!'7#5!!5!!PYzrY(s??ݪ@X>y!!!!!!'7!5!7!X!w R`RgfjfX>y%!'7!5!7!5!!5!!yRgw! RjfhDfVw?%%&'&#"5>327%5 %3267#"''43OINS:Z0!!x2XIFJKOQd>3  ;@<7 ҧK{"327V!!?E>XIFJKOQd>C43OINS:Z0"323267#"''&%&%5$7$743OINS61-NSXIFJKOQdSl#a  ;@<7 W"323267#"''55%$43OINS61-NSXIFJKOQdSa#l  ;@<7 W" # #h֣ͣG9> 3 3h*338> !!# #g֣ͣrcG9> !!!!# #gg֣ͣrrcG9w!##mZ##5w33ϸ"mZ!533X%C!!3#CrrCr[  C!!3# CrrCr[ %~!!3#CrrCr  ~!!3# CrrCr Xsy^!#y^ap$%%$~  7%6 %!&'&"112*zz`XXroGGnY  67" ,J5PP5JX*77*#L8P"2642#"''7&546Ċnji56؝]QBɉLJo3NEQ\|G+-7AJT35#"&546;5#"&46235462+32"&=54&#"3#"2653264&"2654&#ςYxxYςZxxZE1/EE0uu0EE`Ev/EDaEEaDE/wZ\ZЂZwwZЂZ\Zwu0EE`E`E/1EE0E`EE0u0EE1/EXsy^!3!yߨys+~!#!r ~5!#r rS;+;!!3vrr;)3!rv;SLl4732#"'&'.#"0 Pd@7+ h$TA6?&H| #"&546323250 Pd@7+ h$DTA6?&Hk-khi !!!#%!!h\roa`޾"(I  !! #37!#3'Q''Ho99Ƀo!p=⻻}(TI #!!7!#3'l)okkɃ=r!r⻻+2" #/;GS_kw+7CO[gs!2#!"543!254#!"+"=4;2+"=4;27+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2%+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2'+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;2+"=4;22+"=4"=43+"=4;2+"=4;2"=43!2#\\K\=Kl]\\\\]ii\][]\\\\\\\\]\\]\\\\\\x::f>]Y"\I\\\\I`LLMK\y>>(I !! 3#)%3!'-''96=ûHJ7 hHH--JJXy !5!!!!5!D!DZP4!!!rrZm4 !%!!5!5!5!!mr4 3#3#!%!!5!!omrX4  ! !! !ZS;Z$m4&  ?4 '3276'&#"!#"'&'!!67632!zzzzzzzzIwwHS;HwwI΍GG2GG$_EXXE^m_DXXE_3#%673#&'%676'&1rsrs2srsrTTTT@TTT|B B@B)B)΍11@4121tD&  "XBy 3!!#!5!y ]XBy 3!!#!5fa]<4 !%!!Ybm5A4 !!!!;rbmY5A4 !%!5!mrXae4 !%! !2mrx1xB35!3!!#!B#ZCkZF#Z-ӠZB3 '7!#!5!3!'7ZlDZ#Z-ӤZ4 !%!!5!!ZZmrϠZnZ4 !!'7!!!'7;rZZmZ1X1Z'327#"'$%'3632# 6'&#"zz=>lWWsPYX2灾vzz>GjX`OXGX4y !5!!5!yeZrr^Z%3 33!#!!3/ .^+^kk4 7!!#xr;rc/Krmu4 % !%!50!53!ymrZ[zXy&'&47673!!5!64'<<<.LM.;<+PN.;==R-*/KO/'-TQ0˪1.Xy '!!#!5!'"ZABZ$ZuZ#4 !!%!!''!;GZZHrZEZwXy !!!5!!X!D!CZ%3 !#!3!###.77/^+kk4! !! 3!xS;ZK{mu4 ! !%!#5!5!"~~+mrz[ZXy!5!5!!#&'&476654'#D!C<+PN.;<.LM.==<<}}-TP/ .LO//AJ/,EN*Xy!7!5!3!!7@ZBAZ#ZhZ4 !7!)!7ZbZmEZwZ4&  4& 4?&  4&  4D&  ",D$467632#4& #62"&$&"264:zӃ:4ር♜VuVRyV8vu4DֆMUTyRT4&  ?Z^' F4& ?Xy3#%3#!5!!?ʲC!D$Z 3#%3#!#7!?9hwMq' ?H' 8 t'  ",3+33676767653#&'&'&'&  V &#$K 9BU5>=5^:;^D`1o%".+y 9 :C[\l3;b 89hbXy3!!#"'&7633!!";;yV__W9|+q_ih_XyH' 8aXyH' 8!Xy !!3#X!Ścת% *!%#567!676&'&'&'&|z*(2J E<iKH#&GIJE E|-2 M3 +O  ! r; ?9y?p  ! Xy*= 67 '&5677%"632327'&32767#"'&'.#"y{h p{"zi piE5 5dJ t]BFZCEF4 Zq Mg3ħĨ1P$s 7%ےs3 !Xy3#"'#&'&#"5>323326yKOGU43OINS52^NFz;7 (  ;?<6 '='3#3!!#7#537 `?+0'7ϺrSSr4!!!!3!!!'7#5!7!xrddeZmn;fժhӬ4&" ?Xy673367##%.XhZvrM'hx:Bxv`M]Pd H d-Dbgd *Xy633267#.'#%'Xr<;oj/eE}{SC5E%rI1V /dj6`VT{F`4y& 45{& 44`& 4`& Fy. ! //1 /<20#5!!!#oo.ڭ%ۭ&H:07 %#"326=7#5#"&546;54&#"5>32hHH#[]E>Vcii!fHatLT5m4:j2O85%--JJ??8?vh+]85l[hmKDg/R: 953353!53!5!#"326=7#5#"&546;54&#"5>32as7s9s;#[]E>Vcii!fHatLT5m4:j2Op"r??8?vh+]85l[hmKDg..R:1=[%5!!5!#"326=7#5#"&546;54&#"5>32#"326757#5#"&546;5.#"5>320;0#[]E>Vcii!fHatLT5m4:j2Op""[]E>Vbii"eIasLS5m4:j2Op"rrrr??8?vh+]85l[hmKDg..R}??8?vh+]85l[hmKDg..Rk*.26:>B#5#"&546;54&#"5>32#"326=%=!!%%%5!55qi!fHatLT5m4:j2O85%#[]E>Vc,,,,]85l[hmKDg/R}??8?vhyyrDyyyyrryyR8~4<DLTZ`%#5&'&'&''7&5475'7676767537'5676767'7&'&'&'5'7'%654d3/D9229D/3d4.E9229E.42*  *22*  *2*88fWfEOPDfWg88fWeDPOEeWf8g * apa *  * aa * ba.43ab-45F^'04>2".33&'."#67>76#FVʓVVʓ"vv"Z83Pv"Υ"vP3ʓVVʓVVnh<8PvDDvP8"vP9~?9Pv"F^&0!4>2".7!&'."67>4'&hVʓVVʓDvP479;;74PvD"MʓVVʓVVv"i c;DD;g"vP F^ %7'32>4.#52".VFoDvvDDvYoʓVVʓVSwVF_YvDDvvDoVʓVV4!!!xrZm #53àZ03#s #5ˠАWeE%3 53Zz i#0s  3#àР˓[m#!!# q3#s!!`N um!5!#z3#zz3!5!`z m #4763!!"ƺoyeD9uߑfW#'&%'53 763:*enK==Mne( =C _AEc H<  3!!"'&59De{oVfd #3ƺ m 4'&#!5!2 9Deyo}Wf &'&3!3#76<(enM==Kne*!<McEA_I= 3#!5!2765 o{eD9ᏞfV3 wv% !!!!55!#uX ̼uu]]e! !!;bc;$<.: 1/<03!3T.%yj5!jl!X3 !@ <j 5!!5!!5!r#B#B#j<l !!!!!r#B#B#XXXm 333mjjjm !!!@@@mjjj<j 53353353353X 5!###ljjjX !5!!!5!4l t,> 3!!!--Axj 333!xjkx 3!3!kA 5!5!5!3,,=jX 5!333jkkX 5!35!3̠= 3!!!!-- ABx 333!!xs  x 3!33!!-skA jB !5!5!5!3,,X !5!333xtjk X 5!3!5!33t,  !5!!5!4B 5!!###sjjj 5!!5!3!!t,-sjB 5!5!3!,-XAj 5!333!jkk 5!5!333!XkA!5!5!5!3!!!!,,--AB5!333!!###sjkkjj !!!!5!5!333!-s t,jBkA 43!!"yY[p~| 4&#!5!2[Yxp~|j 5!2653#xY[j~|qj !"&533![Yyjq|~*m3YѲ/ Y*m#3*/ Y*m # # 3 3*iSjh5!|j3?hj5!h}j3@hl|X!@?hl!h}X!@@l5!5!!5ijVV333PP?@l!!!iXVV#!#P@P?@ ?!?j!j!k!@!!B!B! F!Z ! ! h!| ! *!> 3 i }8m #'+/37;?53!5353!5353!5353!5353!5353!5353!5353!53Z667576l #'+/37;?CGKOSW[_cgkosw53%5353535353535353%5353535353535353%5353535353535353%5353%5353%53eeefffdddheefcd!!!z m #A35#35#35#35#35#35#35#35#35#!#5#!5#!35#35#35#35!3h̚h̚̚h̚̚hϚ2̙Ϛ#366B BF Zi!}@i }i !!}} @@&  !!!@@!!i }&  !!!}}w!N<w7!!!xr$<w 3!254#!") ) xrVVVw&  w !%!5!5!5!5!5!5!5!5!5!N?:IILII޸[["[[w !!!!!!IIN< w !%!!5!!!I) N"-?33 #&'&+"'&#"/573;2?"#'57#&'#"#567635a)8)kOkaKA-'= //G),Y=  !H$ /+HDH)+) $., fYYx !=Z Lx73&'37&'67&'67&'67'32654'&'7654&#"3672 $54767&'&47'&27632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5430'&327632#"/#"?#"54?'&5432&5432&56327&5432'&327632#"/#"?#"54?'&5432'&327632#"/#"?#"54?'&5432PO~ )*+')+(@&'$||e?/A}]\B-71SLoWj\vLLr%%,* #$ )*n$ % +) $ #*+    ? '+&()&(+&p   % % +) $ $*+*EC*Z*,)-)-*,%&%&fБfU 5HhfeefhH2pu^QFs棥sKQG4 4  22044 22 9       L%('*%)(*%)(*t     144 22 0r!2CTev+&'&54?6?6/&2#"/547672#"/547672#"'=47672#"/54762#"/54762#"'=4762#"/547672#"'=47672#"/54762#"/547672#"/547672#"/547672#"/5476l=.%G\&#- Lj.N 0d&K4i    }    g    s            &                            H5-V"*2-.T<:U'EGE'DN-ֈU]\`CDcbF]WWZA@ZZ@AZZA@[[@AZKPrqqrPGeޝdMP䠠P }2ٛk A4&#"26%4&#"326#"547&'&4632 $54'&'&4632XP79NNqO.N97OO79N']EacDC_\n\U>DbcEXFDbbDEaaEEaaEDaa+G詄UUSj멏i LVV6 "32654&7#"32?ɏǾ/`TcȐɎ;P12Y.1"264&"3264#"54327&5432#"'&'@KjjjiOiiLKirqrtPssrqQܩZTdIU )5AMYdp{3/&76'!'47653!476=332654&#"#"&54632'#"&54632#"&54632&'&676&'&676'.7>'.76$6&'&%6&'&6>'.>'.f<;.=+,>/;Kyz~LZ|WX{{XX{IE11EE11ET    m       ;   R       s@dd@s}>}=/NnN/=}>@MllMNkk& % I% % "!$# "! "!! & % % & %-5AMYdp|5#!4'&'5#2#"&546"264&"264"2647>'.7>'.%676&'&>&'&7>'.%7>'.676&'&676&'&753!476=3''676%27/&76'77&'&/#?6'&7liilYz{XW|{bEEbEd      8    @     .HxttxH%?%5E$6  6$D5%?%-5!!1(~(1 5,4t4(4N4(4t4;hhh%%#%% $ %_ $ $!"!$!/!!!" $ $ $ %:-,GtG,-: XLRqqRLX ![$n[ii[n$[!ob !!'!tKZGkcn "!!'!##&+572367676hNn_5, S Grj3#-EmDJ~o.(*!4\tR~UL !!'!  ##' CI3Z  > << 5DCX << ; YD36273 ##'5&< +Z@\\DC ZY\5#,5>~3+&=4%3+&=4%3+&=43+&=4%3+&=43+&=43+&=4%33 #&'&+"'&#"/573;2?"#'57#&'#"#567635@)A({@(@){A)A(@A(^)4 'iOj_J@,&< //F(0'&&'ܐ'J&(lN5  >! )&V?<?$&$ '& ZN N />Eqw!674#!!6?676'4#'323276767654#3#&'&'&6%67!672!&=75$/563&43!32+'!67#>54&53 *,  3)="(&)09$) L&TE` MPA[MH Y $ ;&&e=O%/ N ,8(.7L1Rf~H8SQ,zH%9D6 )jGP@4Rjd_*KfsDIR 9! O  -]&C+/3#"'43727&'#"$472776725676&5&U8)$ tJ .; d3f,"3' VD ( GL/7;;,g t^F$< LD&?>X4R !/# I ? P?D!)Mv>/z2!"&54676737#&'&54>;7#"&546767!7!"&54>3!6763!2h!.)g$'30!/&j ! /:(/  )/ 9)/  9)0:*/z2463!2!2#!!+32#3#i9/ ! j&/!03'$g).!*:0)9  /)9 /)  /(:!!C4&#!"!&3!!"3!#";#"3&'6737#&'6737!"'67!7!"'63!67!2e;'+pCCo CCCC2CCKK<LLKK%JJ60"2=2).=<==<@=:>=;TT USUT UT83$QE!D72654'6#"'4#"'54#"'54#"'675674767#%$4:JILLHOKHLKIhghgighgD>-sJ1 b6'SS cRR SS?SS\\K\\;\\]]!A*>K!!D!254+'3254+'!254#!'!254!&#!"0!463!!2#!!#!3#3lCC2CCCC oCCp+'q=2"06JJ%KKLL:=@<==<=.)g$38TU TUSU TTE!C32=732=7325732'654&#'%2&'&5&'5&'IKLHKOHLLIJ:4$N->DghgighghSS=SS SSb SS'6a!0J)K>*B \\]]:]]J]] O!%)-1523656;2#'7+"/#"'+"5&54775'"'5476;25'7&567635&56;374765'75'76=4'&+ '"'4!#"'&36365&5&#%#754'&5&&547'5367&7+&'&'735&2?"5775537'7'3533553535'32767&5%2?&#%55'575775775uo,Mz"060D/5I:2'5:6&" *:D:S46$.e QN5  u4MDa 6bUP+ ,H;`I23N5( (#I0M '^5%#!:X+ "*  6W}W:uW4 5vT & /H3V XD9\SL+&31.d+%X!Q $2``KPPPG[6%# Qy- 6[[3GK[O`_A[-)$t7 L-$ L6=" (CJ#R"0 :~GB{~Eoj<4S[Za LC5 ) .U%+Z&)͢ 7e<ILAaMoK33K@G6 $$(& (''&1/----2)( (-((d.'-T?OK8T$ !T3(-<((')))())( &2%2#"'&=477654'#"'5473t\*e O@UCXq P S. P ӍMOb>YaYƮ58l7P P@ $0<FX + &=%6&#"3 6=%&#"';27!54767%!&'&'2+"'&=476^7\Pg㑵Hr'.)%sM M#fC-7!%A.; ӎw:kKqz +H*G;M tu/&((AA&:+C;."/ 8Pi>'67&&&'6.7#"'&'#"'676'773.#'6'5676&&5476'&'67&&07 ^< 1x,B5@2 JVMv!#uA+UBDX[f*;-10)..C,sB#HKU P]12<0VQ }%'H6-T}^$k7 R2'7f!A\;y?1!50BEt"!zkQ;0qu0\oi:5oPZjsXFaPJGl;4ejN^1F[q7&&'7'6&'$#&7'&#"'5&767#&''5$'67'6'6'5$'67'656&'67&'6'&'''5$7676'&&'6'63&7"7&'7&'7&'7&'6'6%676767&77&77&''5&"'6%35&'.54>23#67#&8 p +WDTc'H @XO`= ;*)8 kDv/Pk-J KDhGa D`gBD6DDD =3dTDW, :g j)Yi#'WtI-9w18$^8;./7-I)jS)'#i\-IM91D;8%a7/.D=uRNBR&'%QBNRq d2 D s98C ["|44&3, '2^3R T(B?#'9C- !y ~#Z10>N?$%Y4 )%FN? ({ usis< 3(&^T05<>7;,#4[:O(vAfGEtYB z^~4j #,;b:['~Av@~EQ Bak4~_H#T2 $$$$ 2T"`q$&'6&'67327&#!65#&3jjdnh wWVݱqZre[c7 7 cyX ,35'533#3!'#'5!5!5#53!5!5#!!ʶ~~ blvF F A<<3ffX苜qXGccGap 3264&#!2+73 #'#5# 3m`hh`2`Ĉѳh|;vvʷ}f33#!!#'!'57!5#'5735 64pzp7d+!#!573#'5!3!'573!#'73!#'5IxOOTxSVVdY\yvVPPvIyY',32#' 37+ &5%6323'#57'53mJl{~m@+ݼh4144'0>,_ vNknmmnObs32732753"'#"'432364'5;+"'#"'53275'&'&54?5572'#&'&547634%476='4&#68$$B )Z>&A_;i88u-o1bFGfQ_M5mwLbkjI,K=''8 0##Rm4 ڹ+ܴ5!PP"4\=ѻ"8Qý32#"&546324&"26%#"5432itvxsq1"00" 0/B//B/#a`ir|H!//!"00""00"!/0 _b #>DJPV\bhn27654'&#"&7367'67675673#''5&'&'7&'%67'7&'67'%7&'&'%6767%&'&$h%$%%34$&1++XSA N@`==k>P CRX++XYC P>k==l?L ?Q oL+ Nn;P?;@  nMNn3%%%%34%&&%s==`?J >PW,,WW? K?_==f?H?PW,,WU?H?^<=Ke+cL mCP`k<<!4(0847632#"'&7327654#"&#%#&7&'67&'67!󫪪vӤ=6 5N'V[S.U[R󫬬񫪪񿉊 ʯX[V[X[V[!4(0847632#"'&7327654#"73$3&'67&'67!󫪪vѦ=63QNV[S.U[R󫬬񫪪񿉊w  'X[V[X[V[!4!)47632#"'&%#$''&'6%&'6!󫪪4>;D@KDzcngk?dnhk󫬬񫪪I kpinipi !4 "*2:AIX3#''%#&'52#"'&5476!!'5%!!'53'5%3'5%3#'32765'&#"M==,/0#H 8&O6 |7iY06./==e6a&i1r4z012+KN2HQ>>>>f^2"/1]8`1"Y 4f2y5+ +"'5$76%&'547327676=&#; hz0/O{[(*TQ~`NO =tR[\ 8d<+% &56;2'5$%75#"3vh0.P~N^(8P,VRZycOpO >S\^ f`1B7#5#53'&'&54767&'&=33676=3#327654'&O&"}|fzg}}"&&"}UQn$mQU}"$nQUVV{xVVUQ<"{u^^\ _u{"#| zUOOUz |#YOT{zQPPQz{TO@>)4'&#"3276&5476327#'#53'&`____`oŠqk]^^]YYňÁhgf@> '"3276'&'7#5373'#"'&5476j___``_ߓqŊqYX]]XYfhhĈÁj0 '&'&376&+"'&5'476%7!Z{z[ZZ[~\YWmpN#ZX[[YZ[PQmp#TG*52764'&#"#463233#!5sPQPPtrQPyzg֏LQQQPPQr{{t|g*#"#53533#632#47654&#"#ddiqqCBigIIugzyUr}ppDtPQs_CS 7"27654'&7#"&54767##53#533333#3##h. @\ ! 2(>>?ZW~>'3|}}! -/@ /- !^'?XY??~YX?(F}R}hh}}hLS<#5#535&'&'5'73'3#'73'676=35'73'13|e{vw}wwUATwx|xxS@Wwx}vv|d|re{Eus~~suE|VAKtrrt@X{Ius~~suI{dr|*! #!!!'!27674'&#_82V)3{D#MHZW{s{?zK8! %#"#&5463 67!2#6#";z\)MaBuh __ itBaM(]y tt[+##+tt\5."264&'67>3"#"&54767&'&#52hq៝rd:BJ|^d#!p⡠q $c]7A;{26XY "zz" YX62 &'5 %$ 56?6'.j拈|*xIIz'&|JJx, F42$8"3264,'5'&54632264&" &$#"&547>ȜmmNMm} lyzU<Mnnnm+}7 lyzU<|||,&(uO#eaHG||||Q'(sO#e‹`IH=! <>'.463227#"&5454&#"&'&5476766&D9BB8Ğv?W:pbW~tp) "-ff)-gtpQ@3AA:ACj›GmN?ijbvr56WGe((Wi0154d)-?/6?2>32>32#&'567'6'#4&&#4'3>64&"-S5,9"\0+Fgv!4u|W")^,k ikdS!eb[_[H|NYC:RHB=G`SnU|#!!!53&54632!!5#67654&"U't00Z =yy= :]ZssZ JjkkjJ 2f4%353'5#"'&''#&&#4'3>32>32YE;<<-!&Y*dx cf_Oz.*O2)7Ze``b<`WuALh`8!5!1##'!5!_drrPk^K{U_W{'/27632#"'#576&#"4'5267>327&'"2XCZd}uud$gq~dV)40tlx!&%"dLk}:Uwma4 sOHK{wY@x A63276327632&"'&#"'&#'6327627632&#"'&#"'&#'YR #{=('%{XNCEz>O&z>'(#&R #{=O&{YNCEz>'(%{=('#&ee22ee$l66kd23dEPdd33dd$l76kd34eE^s#!5!37!!'  L34((C $Td67&'&"!3!67>54.#"!5&'.54>325467675#53533#63232>54.#"3'8xpA?9l9>@q<;9'D} 5RTP=: SSPSS ;r>>p  p>>r> !A% )RSQ1 )6BB6) 1QSR) p  ""V{zHNRh|&'4>32"'4>32&'4>32&54>32&54>32#!5!'!567>54.#"32367>4.#"323732>4.#"327>54.#"732>54.#"I )),(?)(#!3()3$))BG!(( K{mg,;h IXI L$  P   H''1|G''#s%'')7$ ''A  ''HTݬ9.%~~ rF)~ wpa!'-23353#3!53573#'5#5335!75!!5'57!ePPeeQQeDpH>H@A~}}~00mrTTreppe-!7CQ^&54767&'&'5676767&'&54>32!535#5##3654."!2>4.#" 1""#@%@#!@% ?$##0 ܍a1%?E?%4,/--+D,/1+ 4;AB<>"  "#>"">#"  ">#10$ITNnVB, n ?%#Naji-/4^t&AYcgb3%' + ((NV8OQĿ>:<uyg**5 k5h P[32>4.#"732>54.#"!5&546767&'&546767&'&4>32'&'.#"+L)+L*+M)(LH     > |n @: !:;! 8An} E04`a30TL**LTM((     ++x: 8>>q ?9 9? q>>8 :x++c^UZbbZU^jg% $Tdhy47&'&";67>54.#"!5&'.54>325467675#53533#63232>54.#"!57#&'.54>3234'67632#7$5oh<:5d4:;i865%1MNJ96 MMJMM 68JNM0v    +0 +/0U-,,+,.T1/, 9j9:h  h:9j9a &LMK- '2==2' -KML& 1  V//X//X//V6HLP&'4>32"'4>32&'4>32&54>32&54>32#!5!5!M ,,.*C,+%#7+,7%,+ FK#++ PDNAM**4d;K))$'**,dY&"**E #**L:ƥ??@@=%)5!5!3353#3!53573#'5#5335!mD^JJ^W^KK^׋LLZZ,}}uz%yuu{{u}--4@4767&'&'5676767&'&54>32!&7535#5##3 1!!#?%?#!?% >$""/ _1+ 4:AA<="  !#=""=#!  "=![1=%T e >6.HC'L"'G 12h[FH`[$%ok+*8d .Ncv[.7&546767&'&546767&'&4>32 w "E> #@!!?% =E!w ./@ =CDz" E>"">E "zDC= @/.QO##"'##565'##"/547?kM ,4N"DF &Fi?JO/FB!O {|Im<&=M2227632#&547636=4'&#"#4'&#"=` ]d2 cBU;/G;SXMB:@B ս;7hf% #>|\@9@O &&5 iC n:^O G  %2O7236;2"'##'65##"'&5476;235&'&=476jS c1=EO ;SCFRʝT6*F@E1;O+.`162V Yi8/D ;8[B VRP"<B+"'##565#+"'&575477;2732;276=4'&3&'"ih;F(wQ"DG".FWCNfBy" bODUq5u4  Pro@ |S`64 '4'&'~ v '  w (  w ' $k=F F>jG3~Pjb^*IerN{̑?qJAe}Ωv6\~x(ONPPNO(!8?|EE|?8!r!_3#"/4?23D-!]UF+}{<!/3#'654'&'#"547326Rs9W5[S%3;B[/OBC'*|<j_g#"=4?2%#"=4?23ɧ%QM?ˠ)TK7(w7џ5s ?|O"'4723!#"5472!5YA>RHIOq 1 ӫg 4D% 3363'$6'"I+4 puoS^*  3%#'#3%#';&2 IʗHj7*(,377#'#'547#5773%%,ppsr,'zzxz'984?/99e5>:_`qE#&#"'5654'5673;54'56732733273+&##&"#&'565*G1 VV2Is3'{'3sI1VV 0Gs3'{'3sP3+1='3sH1WW1Hs3'=1+3PH2WW2H. ;G7567&'&'3#6737'#&'7#&'6735'67#3335#5*)SR))&*&';((:'&)'ȶkkn\\[[nȶ kk n[[\\n`ff/ee.((&(;((:(&((@))SS**n\][[o jj |o[\\\n jj e(P( /N#.6CMhw!2732!'5675&'&=32#&'567637&/7&+"+&'532?4/%32#'#&'&=4?#'57335'3!273+#&='#"/547354;2?!&=35-,;K> #WU* y "њHV ηz/;@"q=o )we)$IY'L ALaXwH >X%CII$PC/DN6g+  b% #  jnN :3 O+5{bQ< ,d-  X] f '^ JJA!< 8 2E35733!&54?'7'7!!"'&%#'73676'77'7'&'676}]} =--HW(7*! >y*1c{F=.,H-.'d(#Y+GC8957jN})%%tGl5nm3(,H:0/(_kiN}!N920K 1DW3!5>7>54&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676@.#5*"I?6O"[m" c<,+GU 5) <|w)/ayD<,+G,,&a(!>B<#q'%NG91 M7835hL{'$$qEh3kj2'+G8/.&HghL{ L8*/D *(=Pc#"&'532654&+532654&#"5>32&54?'7'7!!"'&%#'73676/77'7'&'676D|q%N24H'CB=9PS3464E>6O#]o 32EX!#2632#"&'532654&#"&54?'7'7!!"'&%#'73676'77'7'&'676Hevyn$L27C'y*1c{F=.,H-.&c)"ERUHHS S /(*. 8956jN~(%%tGk5nm3(,H:00'\jiN}!N91/K "7J]"3264&7.#"632#"&54632&54?'7'7!!"'&%#'73676/77'7'&'676]'00'*//l+2>AB(S`dT^dyg7<,+GU 5) <|w)/ayD<,+G,,&a(!.T--T.H D&RECSukf{7835hL{(#$qEi4lj2'+G8/.&HhgLz L8*.- X.A!#!&54?'7'7!!"'&%#'73676'77'7'&'676n!?/.JY08+"(@},2fH?/-J.0'f*#&K:;68nP*%'wIn7rp5).J<21(vmmQ"P;:1-K':7&54?'7'7!!"'&%#'73676'77'7'&'676N!?/.JY08+"(@},2fH?/-J.0'f*#:<68mP*&&wHn7qp5 ).J;11)wnlP!P;;199'9HR!273!567&#2&'676+&'67'#'6765'533!273+#/#"/47$,7Jv I MO $p%|I ^ [T<K"(~GW$?8?])( EAs#L, T 0 ` +WVۄ`$$a.|%2<J\e3 + &=762367#&'&#367&#&#"3274/"34?3'35732?5#+'535^-J|@h'\-e@<r2&H); uZJM =9jl:jgb.Qi2Q|酝:*}( dpR!h j `]_i$x:-(^%,3"ؿEa HMP E7g /:BR`j # &5%6; 65%&# 327#57&/#2#&'676+'%3#'#&/47'3327##'%3#"/6j1M{ǮG&z v$ExݨE(+=R:n:D!s Y!gQKum;} uA;>e=g¯Cy??ԢB|*>w4I ' 5@` bC$ j$H?iM!%.|7H27&' # &5%6367&#'.7&67263'#%; 65%&# mJB|e6O}°I+o|BJn^jaygwaaygxaj^w$FyتFG퇢D{C?` B]ww]B JХC}.?yP%.232#!7&!"4#".54767267p   {u*_ Jcllm8*#I%<($|ʀX#{Nwt7mnld4)5:IIIB,<_4767632#"'&'&!%!!  >W$`4 Z|b<_/374767632#"'&'&4767632#"'&'&!%!!    UW$`H    Z|b<_/GKO4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!      UW$`H      Z|b<[/G_cg4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!    /    UW$`  K     Z|b<_/G_w{4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&!%!!    /      >W$`  L      Z|b<V/G_w4767632#"'&'&%4767632#"'&'&4767632#"'&'&4767632#"'&'&%4767632#"'&'&4767632#"'&'&!%!!  0      /    UW$`+    .      @  Z|b.t )2 $$ >54.#"4>32#"&h..--t*Ƅ2..2/.y )62 $$ >54.#"4>32#"&$2#".46h..--1.-.y*Ƅ2..2//2..2/.t 2 $$2>4.#"h-..-t*f/2..2/.j '2 $$2>4.#"$32>4."h-..-q.-.1-j*f/2..2/y2..2/R7!!R-ӖR7!!%!!RMzM; 67'&/#'3#67$#%ׯP==Ͱ̼bN+#!f"K++!|o554.#"##"'5##"&'&'0!5!5&'.4>32!!676767'7' :!9!"9 :! F GF;kY_1278e56d:81)RLk<GG E~^ : : ; ;NG 5 e4G( Li) enf77fne )i (G4e5 G( Pm 9Y%&'%67&673&/'67'&'"&'4?&'37' '7 &/7&'#>7$%88EFu/- 6uNDL22LENu/80uFD8jU45B%y\A@Yy$F 0=/0 ,-X70 ;~*2 %% 2*~697X-,oo  +F9d1 ) ( 1d9C1*CT'&#"'5&767#&$'&%'6'&'''$'676'&5$'6%'.54>32D$ "@F,NNNvF8p^Lb2  N**+ B@0"AR/0?wA%od/D&3.YaQ/5#3$"uI' @3/u= =#n- .... w3% % 32+#".7!"&'&'#&=4;73737D*$#GFHH%#Ι+(&aa'm99m9 3.055_4i4_550.3k  #tttk"632&'.'#####֊v)%8 _^>:k{ZG_?g@`H,>|:=+,j,,<6O/233<bbJ 132>4.#"367#&7&$735&'.4>2,P*+P,.N+)PƗd"/%(MM~95DLMNMD2)WN,,NWP**g!ʇw֜s~  &JJ&?GO277''"/&'&'7&'&'7&47'6767'676?  6"&462EG#96\>42(p __ p(24>\69#G#:5\>42(p __ p(24>\5:'NmNNm U%4m+3 EJ5:6JE 3+m4%T  T%4m+3 EJ6:5JE 3,l4%T '\nMMnM* ? !&+05:?DP3&7"7&'7&'7&'7&'6'6%676767&77&77&'"32654&'5&'.4>323#67#&#"'5&'&547&"'6%6761a$O` "NiB*4l,4"U47),3($aM#"aT*BF 4,=44#Y3,)0BB0/CBO"!-$F$FJF1.#- -#-2MJF$G# 8<g7*!2U6J%n=_CBnT> rYw0d "*7]6U$u=n;wBLz >\e0wZ3C.1BB1.C(N "%""%" M#p.PA.$;QW$.AP-{ "R &.FR2#".54>&'767&%76'&''67&'&'&'67676547676'&7>3263'##"'&'&'&54767&'&547676&'&#"6&%6767&'&'&676&5467&'&6732767&h@9h),)RP|  |PR-*g:>/**Y&()((')&&)')(()% @9f+.TR"`33`\_ .np, 00441/ ,pn, ]]&&()&&EEEJ032WyQT.,d9@.**..1230IDE%&**%&F+.SEFE.IMMI."#FES. !  ";-0.--.0IM+.REF$$1.%2S_`Q2%-1OQQO2-$3Q`_R3&.>GIIG"" 7447#.$$FER/+L"  !75/57%"IJJI* )p~67&'67&'4&6%67.'4'6&&'6767&54?67&'&#&'#&'5&'"'67&'&47632>4.#"72#".4>"0'-, )*#'05%"*%%, ),,"GNYI'+""$(JYNO21, 9,4=SM:7,: -12-[[Z[]WXIOMKLMN2 Y{\ bCWDJgABcp7L^BML0b \u]! @R%KlhhO+ww+O hhlK$PZX'@D 0:)ww*;0 EA&XZw[[[[GJMMJ"( %3!'#!52#"62#".54>o:5(67%'$(n H0L*I"33'554#$/* PR 6h"&>I > >A>!!ua!&5476'#5!+{h_a66mHHm.rZy'#"'&#"'&'&'&547676763232767676'&'&'&/&'&'&547676762!2!%3276767654'&'&'&#"&#"3276767654'&'&˗Pz  ,D@   7;+  23  M98G ):               r         0   L:5U        .\ r26767654'&'."#"'%"'&'&'&54767676;27>764'.'&+"'&'&'&547676762%632$"26767654'&'&#  #  @!R763276;%326767654'&'&'&#"6767654'&'&'&#"32ɓ E79E"  21 +96  >B+  # zOo              49D   /    "    :           =JZx-4H67&'&'&+"'&'&'&4767676327632 #"/#"'&'&'&54767676;276276767654'&'&'&"276767654'&'&'&""'&'&'&547676762"'&'&'&547676762'&'&'&547654'&'&'&";276-&#"+"276767654'&5476%327%&"'&'&4767628?.  !  !a=?^'_)\?=a! !# "!.8?""  "  "  "   f  2 .?E S@6f G=. 2  ŕ6@  B   )_>9 9>_)  % I        ? *        ;d.      ?P   !-  @( ,#%>  NpNM&_*# (! &) ,,f&  ! (K_  Z0-  Yi D   cp-)L &gK1 [N3$ n/ "!0{I"H#fmt2>,7HBI.;/8[, Q[z)  .)S9L *E   '+(4%(4  *X >  7A) 0'-570+I;-% *#%(0  ]'5.  U-9Lp{7654'"'&#"+"'7&54?67676763276323273#5%6767'&#"6%"/67#"27632327654'73654'676547& t!M#l5G;@\ 2BX-0%-m * '?,N ?'!&R;-> <\-R5-6E!"$b$6$!q",; t@P"#C  *FS "DX@! %z$(`]jMP   &O/+@ p_u<  3  DMKZRdYL6D_YBI5.!!''kGWz")3SZ67654/##3276?7%754'654'36767632#"'&54767632'0,,; (| w| ki5.U,\\    %g .  ;,-0j{w {w3V. T, \[^     -5& '-EL4'&'&/767675'7! !'7!654'!4'!!$4767>2"&'&'!654'$$CCC||]V|V#u    9Z(f(Y7%$66%"'&'&'&47676762%'b&I    )^tN/  /dIW?    @ViDV /  V%&%$64'%%&'&'&"27676@))< "  " ]NO]    9|23277632#"'&'&5476"# 6v>? (-=%P8j?  #j<  y"$"JrB23277632#"'&'&5476"" YTo k%,02?=V8jiA{C {u+'qP?  ' 7 sssssstsXrsrtsssr@Q  ' 7 5NB2632#"'&'#"'&547677&'&54763267632676   Bt  ah>) c!  ,Hs *ܡ   },"2A "  {3+Q26#"'#"'&'#'&'#"'&547&'&54767&'&54763267632676  ΂    NjM  rkW* & \ *3 #ﳎ*3 Tv! ( 5+" , @V #!!!!!%!!!!!!!!#!5!3 ;E;JEJJJ<;E;EJK!IKV{ !!!!!!||uv9f !!#!5!335#*+մ*ִw0r!!%!!!!!!/0``1/`1) !!#!5!3^^^~S3!!'#'!!#!!3!5LDʃDMA #5!#3!3'3#!#35!3###5353;9nj#5AI##0vQ#"#3;54'&'&'!"3276767653#4'&'&'&+3!52767>5/]LED73!&&54GBO]63H>SkS>H388]OBG45&&!35FEL]63H>SS>H38882I32367675&'&'.5467676236767>32#"&'&'&'#"'&'.546767675&% >#"? ?"#>    G   >#"? ?"#>  G     F  >##> >##>   F    ?#"> >"#?4'&'&'&'.54767676322767676767632#"'&'&'&'&'&#"'&'&'&5476767676765"#"'&'&'&5476767632B ,#,+%) 3!, &&*-#''#-*&& &$0 )$W$) 0$' L+,$&&$,/"&&$b3") M*,%&&%,."'%%0 )$W#) 4!, &&+,$''$,+&& &$1 ,#,+$)0267632#"'&'&'3&'&'&54676763267632#"'&'#"'&'&'&5476767#6767632#"'&'"'&'&'&54767#"'&'&'&54767676325##"'&'&'&54767#"'&'&'&476767632&'&547676763235#"'.'&5476767632&'&54767676h             -  (                  '    *             .         +j276767653"4'&'&'&+sidUS+*+'WPihtthiPW'+*+SUdi),)URhexuhbXR,,,,RYaitwfgSU),%t?247676763"'&'&'&5!276767653"4'&'&'&LEA86:4DDMMDD4:68AEtjdVT,*+(XQjhvvhjQX(+*,TVdj-76DCOME@:66:?FLOCC67-*UShgyvjbYS,-,-RZbjvyghTU*,(8 %%! !)ttJHcdecH]F]~]^C5 )!%%!2#"'&'&'&54767676hzt@z@Az@t{ne_RP)((&SNcdome_RP)((&SMdd0x}*(QObbrle]TP)**(QObbooe]TN+*(.'"276767654'&'&'! !_)(""""()_)(""""(Y$(*/.*(#  #(*./*($]^#< '1%%2"'&'&'&5476767! !#xxa)(#""#()a)(#""#(YDgghgD^I^W $(*0.+($  $(+.0*($ YZ(8 3'7'3!%%!! !hE۱CCDe g  g f ҁссi:]^= 3'7'3!%%!7!7'7!hTDEDDTNPPIQ2P11P2#mm(? -5%7'%!! !] P  gfeer­696ƌ]^^. /'%!!%!77!yrryyqm"_^^l%%tu%ߴ߳!63% %#'-7:|:||9|kֵֵkֶWz`37'%7% %#'ZZZZZ]^Z^ZZ˛ʜm˜˜mʜ0o #'!5!73!P6M6P$6PMP66R#6QLR6$Q6L$z     - h<_K <; L_zK <; J`;<_  '!'/7'?!7% % -[9^[[ZG^ZZz'}*}zy}*}'q^\\ZG^ZZ:\O}zy}*}'yz(}2 % %  h_y(_^(zFGs% % -hVHzVUzHrVU{HUVH% % -hhhႁhhhႂhhh$h7% %' 7-'hX5 5XV6 6g5VW6 6WV5 0t/37%!!%'#''7'%!5!%7'77;[TA:#T8#AT[TA#9T#8AT T8#AT[U@#7S#9@U[TA8#154'&5476276767632#"#"#"327232#"'&'&/"'&5476=&'&'#"'&'&54767632332?&547'&#"#"#"'&'&54767632676?>$,.c.,$> ]5 71+: H3> kR  Sk >3H :+17 7Z  >$,.c.,$? Z7 71+: H3> lR  Rk >3H :+17 9X  ib9@R'))'R@9dg  8d< +$;)01):$* \570+9 F3= kQ  Sj  =3F 9+077Y  >$,.a.,$? Y770+9 G3= kR  Qk =3G 9+079W     > h`9@Q'(('Q@9bf  7c<+$:)/0(:$+HH#:.'W4,CEH@,4W'*>&DL:Z##KGW,f ',;[;;+*Q--}KOW*AA*WSGu5-U&+;;[;,)  '+;[<>**Q--}KNW+@@-USFu5-S(+;>Y;+* !67654'&"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"#"'&#"327676%32767654'&'&#"#"i/)F)/,UK:M $\/8E(5>H6-EFJA-5H;8)D7.\# L;KU,*UK;K #\.7F'5>H5-DE-6H<7*C8/\$ M:K U+:6-21 4 $:<;$ 4 22-6 O;(A7##7A(; !*:#.#;&Rm!CcJMU)??,RMJcCoS%9#.#;)!  );#-$:'Qn!DcIMU*??*UMIcD oS%;#.$:* f /D;;D/ $i"276767654'&'&'767632#"'#"'&'&'&'#"'&'&'&5476767#"'&'&'&5476767632&'&5476767632o00'))'00o00'))'0]0+)*+%# #+%0%##&&.0%+%   #%'.0$,#0%-# #%'.0$.  #%'-1$,#$%*/0961/*%%*/1690/*%) "*&0-(%$$$)-0&*!&"*!$$)-0&-#%(-0&*"" (-0&*"$$(./& n%#"'&'&'&5476767#"'&'&'&5476767632&'&54767676267632#"'#"'&'&'&27654'&'&'&"67&'&'&'276767&54767'&'&#"276767654'&/?676767654'&'&'&#"h &,&1/(&#!$&1%-$!&$/'.)2$-%c%-$2-*++&$!$-%1&$!#&(/1&,& =s0 9 55%R 9 !_  , 9 R%5s  _!#'"+'0/)&$%%).2'+$ * '1.*%%%%*.1' * "+'2.)%%$&)/0'+"'#L% %L %#M L:2(&6  _ M#%   6&(2: -[3b &'#"'&'&'&547676763267'&#"327%327676764'&'.#"7632#"'%&'&54767676324676762676322##"'&'"'&'.5#"'&'&'&54767"'&'&'&54767676&'&'&'&'&'67676?&'32767677676765&'&'.#"7676767&'&'&/326767674'&'&'67'&'&'&#"67'&'&'&'67676767"276767654'&'&'"'&'&'&54?&'276767654'7654'&'&'&"67'&547676762    (  b  (       #!"G"!# * " ' ## G!""  '  Y m    ( y   ( O k  w  m Q (  O (     ? ?   + / L* / *   +. M+ .*   !!!! '? ?' "#& #'"!!  '? ?'  !"!  $&  m P    O        m     y    O k         b       %j<\l"276767654'&'&/2#"'&'&'&47676762#"'&'&'&54767676% %-[''!  !''[&( !! (TB39)+,+76?A3:(+,+76>tjeVT,++(XRiiuskdVT,**(XQijtuz"z!uv!z"z#&(,-''""''-,(&#e)*:6?;97,+)*97z88,+,*UThgyricYT+,,*USigtvjbZR-,zvvz"z vv!z29"327632#"'&'&/#"'&5476=#"'&'&5476763232?'&#"#"'&'&5476763254'&5476276767632#"'&#"27654'&%&'&#"327676%327632 654'&'&#"#"i"(-+S I9K #Y.6C&4<F4,CDH?,4F96(B5-Y" K8IS*)RI8J "Y-5D&3<F4,CC,4F:6(A6.Y# K9I R*"(-62 #9~3 #9; 01+56 00,5`%;G,A $.?'!3&@!*Yx$ ImPT]-EE0ZTPmI "zZ)!?&3!'@-$ #,A'!2'?!*Yx$ImQT\.EE.\TQmI#yZ)!A&2"'?.#~&41%%14>3t-3>41%%14>3f^CC^B%@#@@%@#-4>41%%14>4-3>41%%14>3+  V  ++  V  !r +?Sg"&46277''"'&'&476762"'&'&4767622"'&'&4767$2"'&'&4767eeeBABA#U##U##U##U#V%**%V&**KV&**&V%**~ffeAA$AAV%**%V&**V&**&V%**#U##U##U##U#  &3@MYam+%5%32476;#"'&'?632&54?#"632/&54#"/72#547"&462"'&=3?_?6 6  6] 6'?&M&C_CC_?&M&< 'L&&L'!6 6^6!6 >_CC_D<>"l267632%632#"'%3#"'&'"'&547#"'&54727%#"'&47632%&'&54763&5476h!#;'&1'h 9##8)'1!, ;#A#; '&1')8##9 h'12;# 4%.&! 6 = 6%".% 3 3 G%.56 = 6 %".G 4 $8 ! 54."#"54$32632#"_ ɀ~~a>E  %!#!3!p EE?p9E=V %!%!35!cE:d FF8 %!!![:F:\;[0q %!!7!N]<N;)G+t  ,o9; #q !rQk!k`!733}b>v!#7#)iC~' < <#' = =#g]jOS2#"327676765#"'&546;57!##"'&'&'&54767676%#     42;%-n`Ԯrr#26A@:V7:$)&7.Yq   % $.277g[(dVDQ49%*,04?()-#52&'&547676762"'&'&'&5476767hc"$njln(Lfe*+$$$$+*e*+$%%$+! #'(*dRjjSc*('!"%*,20,+%""%+,02,*%"%C&'&547676762476767622"'&'&'&5476767hcn(%X%&&&W%(nؖe*+$$$$+*e*+$%%$+,Dj*('(&,,&('(*kC"&*,11,*%##%*,11,*&".i%%&%&54767676247676762hhÔ*(42u24)(()42u24(*i\=97,*+*96@@69*+*,79=Zr_'#"'&'&'&547676763"'&'&'&5476767632_dA=;0-/.=:DD:=./-0;=Abx1.=8DC9() 1F="%".4"tNa5&$4! /.r<@6B2L_0>Q#kI|"rz7&)?),%=^K=.C26F@13.!9+cM313N676 547&'&327#"'#536767&'&'&5432&5476323254'&543253%5@26`', =NR6#!vWR>4 2:O t51"".1&X.RO A5ȏ )T/186,FAS :#(=:tA0 9SD 'A#5}11BO9 "'&'&'&547676763"3ᗊpm8884qlYTN! !C@RP]e:6pltm9:'62~~jf77"05276767654'.'4]PR@C! !NTYlq4888mpe'67fj~~27&:9mtlo7:fkR !&547jljjlyyxzQqpnc$0!!676n wu;;vi43f$lcC}U# 3tD}U 3 DutV.! !JV. ! JA! !m^\GHB ! ^^HHv!'7DWWWW|'7'7WWbW>W^$#"&=4&+5326=46;#"3xMe,,fLx1d=AOOA=dƂ׈ihDŽOߍOi(326=467&'&=4&+532;#"+5nCFVU$#Cn5BB*)p//oTBB¥P⎁AAPDBۇ45iDCS/~ #!5!3}t]} 7%d^=]d>S~5 /%0~##t] '-f\=]d]>-!'7!. (``I)=2"&'&'&5476?!".'&47>3!'&'&54767>2 '!  `!!  !' ,&   &   S~&!5! F78-x!5!5 V(Mr6u #3#3#3!!5 鴴ZZ---I(,,,,S~  55!#3#3#3F9UU**b]^bUUUS~!!5 F7.`tq!%  qR{V$%! S%@{V t%226=3!5 5!"'&'&'&6  $hI$  h$   6<47676763!5 5!"6  $hI$  $   $O!! e 6n55!lMlTwccwekl!5!!53 ' !_[y"kd""e/l5!!53 ' !_["/d""5 !73#57!%!6UcGjbzbdǩ""ap 5!'53#'!!!7%acߎA[؁(ZqZ{{{ĒҒ}TM %'!'!53 !;qKRnKa26wwIw22wT}> 3#5!7!!! ZQtZQ0L>ssjLK2Nu '!53#'5!'7! !pSn%R&%Ua2wKJ,Lw22w)1 '7!573#5!7! !r&j&St&SpWl6qM,LLyy77y@!6767632#"'&'&'!  6IYZgb^UMI%&&"LF\Zfc^UM3!t:6I&&&#LHZZhc\UMH'&&#L2<tt XNy "&*.37#37#37#37#5'!!55!!3'#3'#3'#3'#r+qr*rr+rr+rV{{*q+*r*+r++r+9Ɔ\]t] 7&#"7'7 #%5#t69.wZY96t".*X/S~k 55!5!!7'!nnUVGG8:ȏu\j '327'' #395t".Y/Y"u69.xXXN2%&#"6767&'&"67632&'&547676767}:"  s %*&*(&"!#!"O>>;*E/4767!"!47676763"'&'&'&5!3!&'&5v  5 $ %% $  H vgMME %!#"!% EMu\2&'&'&'&54767#"'&'276?&'&'32\":  #'$'$#Y@I:86s6::I  #&'#'" X  :5*+B67"'&'&'&547676$47676762"'&'&'%&'&'&547676762$[ /  H =a=   / ZI=X  q> d(*c     XJn.676767632#"'&'&'&%&'&54767&'&54765 #&+*1)F-Y)) .EOO/3S>>S&/ #$))%#]]#%))$#&e"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 I ]]I    Q      Q  %eg"'&'.54?654'&'&'&+"#!".4?64/&4676763!2;276767654/&54676762 GKa u~iKG E     2 +#76767&'&/3#6767!5!!5!&'&'g?j7R=y66y=R6k?VO S+ +Sd _8=eyu'&utj>jijR"53#5#"'&323276'&#"3UVn၂pVTMLNMMNLA+l99lg-,..VVy ##! !+532765YZͷZ-,'ij>>% %!#3!3iVO7n lѲR{jR"%#367632#"'&'&#"327"3UVn၂pVT+MLNMMNLl99f-,[љH3!!# 9`#3!{`9Lh '"27654'&'2#"'&7673A\VMMG*w|~~hA1LLNeˑRh]c[斘,mKseg.!#5#"&'532654&+532.Dv6;zIMcݳw"$.*gQH{"264   676326^\`s-!\[^[]-=P@7'"]_$5hXd3#3h݄D8.#";#"./.'&'532654&/&'&54$32\^mjj3!2_Pf-Efoshul]^ V;5#5% Yb^`_hon"!^XE&->B%S #D9``LAB\VBT=;-;,,1Y7Xy&KW:w!##Z:#5!#J&w3!3XZ!533XKV,X3#3,X0X,X3#3,$dX,X3#3,X,X3#3,X,X%3#3#,񈈈X,X3##3X0X,X3##3$dX,X3##3X,X3##3X,X%3#!#3X,X!#!!yX,X!#3!!Ẍ,X!#3!!X,X!#3!!Xd,X%!!3XT| 3'#'L:LjLCUCT| #'737:LjLCUC( 3#3#'( f*D( #53#73 fRo(D dA!5 !5 !5 ||pO  'ŢcmZn`!5 !5 !5 TT  |MY 5! u .1 V{ 5! u X.1 VH+532765!#3!HYZͧZ-,)ij>>9dV4&#"#3>32+532765bjq1sYZ͹Z-,`c6ij>>~'IJ !5!5!5!J>>I3#qe10#+DfV4 ;#"&5# 5432!5!3#'&#"3[Y襵>5*GN\|~󠠄K9T !33###TÆ3B3z^{3##4&#"#3>32Ҍjq1sL``c"#546;!3#!#R>d9/Wp1Fd+93!533##!##53!5:]UUTT]}}}\rk\\~~?$07 6762!3267#&'&'#"&54%"32654&.#"&N [ xm7zEB{:] M.X[[XY[[X[VTl T Z2fq fW TRzxw{{wxz[^cWH %"32654&'6#"467.5463%!"h{1PAž(rڜ-*/1|I5#7N@*        JEE<2<2991/<299903#'#"!#!##535463wcM%ɩQge/яN#7B@#    JE E<<991/<29990#!"!!##5354637cM%۸ɩ{Qge/яNE &  E &   X& &   X& '  E &  E &  x X& &  X& ' E &  E &  r  X& & z X& ' E&  7'E&  -x& & m& ' E&  E'  y& & |& ' EW& TLfEH'T4W & &TK& 'T]r& ( tj' v ?' ,~ '  ~& ( j ' t ?' ,x  '  X f&c {X f& ] /}>\/' a8 ^>/'  8 _X f&c X f& ] &8\/' 8 ^8/' 8 _X f&c *X f& ] B\/'  ^>/' 8 _X f&c 2X f& ] ^\/'  ^>/' 8 _a7&g ` D' \ i'TUg` 'T i ]2%#"'$4733267654'&54767;#"'&'0Qcpl?AOL64)>.VhFd((&*=#>2(I=/ b \^xHj<9"1B,f%TOA7.N?+  cG& J' T +9'  9'  6 *  &#"'&47332767654'3;#"'G{579T?:!e#"#V4^Wt<;?xC3^w3UT8@0&6D%3!"''&5473327&'&5476&'5%67654'&#"%3276'&'&bJDv-(0g:-0M,QG$"':AG 5' 343%@K5:,+ CfN@TSZ 'AO@H=.%4-+#%v_U[1C "&_ ,:%&'&5476&'53!"'+532767654'&#"%3276'&'&\:-0M,QG JF$"':AG 5' 3CfN@TSZ 'AO844U@H=.%4-+#%v_U[1C "&_X %!#53 76=3`H՞,1VV,1jٻX%#!5!276=33!!"^L,02,*VV,1jj1,z| X'  &X'  'D|&|qD}"k ;#"'&=31,cK\WL71,\W+D~D&qD&qD&q0&qVz&qU-W&]' I 9&]9'' IL 3&y`>Z '2>   &] &V IV&zY|_' 'p &'p ' ]L 3;!"'&L2,PXskj1,\eE&  E'  X& & X& ' &x j'  E &  E '  #' R &' R 'E&  E'  ,& & R& ' ,X f&c X f' p ]\/'   ^/'   _X fcX f.%3#"'&'&'27'&5767&5$(1{R=IrbJԖ`e_$m3HZdP]vbĘe4)@5 [_w\/&'&'&5672+5327676SSgURHKLXJKݣdht^#4b4bBPH:jV/);#"'&'+53276767&'&'&5672~AI2h6:H~D&g ] ` '   i$iF"'&''#"'&7673327676'&/37653323;#"'4A@E2J/1%=Gq_ev!UNBAF3I2Q, E;eF*L$Ftg£x&R" C~m8*@#?9,%#GvOdT7323;#"'#"'&'#"'&'+53276=32765!5d*,""@e;6:HO7* F35C%&F:DF*7@`*%Rx&),`X I6[m8*6759,%#GvOdTtg$&i 6 '   m'   n' R  ok G%327654'&#"%;#"/+"'&5#"'&5473767654'&'367632Ij($?GhK=.';4f&4-//3fJZ}eh<2H7(28`@%(jm=vbw $A7. *727&'&5763"327%+5=K4X}ں>SF8I \Y];d}M4F!Ť$/%+532767&'&5476762;#""654'hkB;(aD hYYf MXD=pʨ4/gg/($'UZ'-)74--38)-'bM,(U __ z F&o w L'  F' w L'  & ( *jL'  ?' ~ ~' " }t& ! ]~' Nk ?&  ,~~&  t!D#"'5327654'&'&7676;#"''&5473327676J&P DfXRNB8D-<9_h$$EB|=Q&v+6(  %z|qe))5!27654'&54767;#"'&/P/62 hF F&,@XB:f"``h$$EB|=Q&v+6(  %?+)x.CKu $;#"'#"'&&733276761,+K8N3h^}cw@A(IiTcEkj1,3]?~/"*V\ss~B")9(j )5!27653WP,1se\,1j%)5327653;! hL,02,VV,1jkj1,TvGt4%327654'&'&#"#"'&#4763&547632;#" zL,5;(.;D Kp#IxAIM\HT(RfV*9:X DD(PNKOmf7*(?$G@^m*%'+53276767632%327654'&'&#"d`p@ht4,+^]EE>/4:''5)24ed0$#1P8O$*ME5EX !a%m/%#"'+53276767632;#"%327654'&'&#"|an@h4,+^]HB3&id>/4:''5).4fb0$#1P8S1>/E5EX d%6& *  ' w !& & R& ' Rx $&'&'&'3;#"'&'#"'&5476 xRot$8pqZI-&8:m*12e CY>)2'+eO,3;I0D-=67654'&#"27&'&5476&'5#"'+5327654'&$"':A4N--0M,Q;(Jxb 41~! @H=.%4-+#%v iEN@TSZ 'C49g=ql)D%'r.C!v-3j  ;AWE L9P)8K6(S/VL_+Y9K1\Sz|7%&'&'&54767632;#"'&##"'&'&73327676 ,)MW,.@"##C@"*5NhLy $Eq:<3, $.=N/[ EW3235huFX^"!ݺh^bNm/>ZUb=*(DV\BAL89DEnY1X;YTBEbD !!!5!#3#3#!#n!7`ddh%$q%1&R'N(X)fP*H+,m-.s/Vy0F1u\2u3u\45J6/7=899:;%<=#{DXE%{F{G{X{H'I{H{JKDLVMN Omo{P{QH{RVT{SRwTj{U{VW^Xdm`Y`ZL`[hV`\b]LF#7fo-L7NFf@103# qf?Q@ aa1<20KTX@878YKTK T[X@878Y3#%3#?Zk10K TX@878YKTX@878Y@&  //// //]]3#@   99991<<990KTKT[X@878Y@t        !      ]]'.#"#4632326=3#"&d9 #(}gU$=19#(}fT"<9! 2-ev 3)dwyi10K TX@878YKTX@878YKTX@878Y@ //]#1Ś7]@ 91<90K TX@878YKTX@878Y@ //, ]3#'# ӌ7i@ 91290KTX@878YK TX@878Y@ //*//]373 ӌ Zj@ 9910'3$ll/{m > #.#"/  waSRd {xz{w8796/{m @ PP120332673#"&/w dRSaw m6978w{zPa103#PXck@ 1<203#3#\zkcyk#!#uŚŚkf$(#5476?>54'&'&56763#7:)*%>8'9@B9Q[~CG=9. bEBTY;X1I*%#D>"Y`LAB\VE'*==010!!=V045!5!5gr4!5!;r4!5!/r^s 2"&46"264hrL&'◚vURyVP%`8n|TyRTv?F3#%3#?53#73#'3# 3#3#'3#}}dE&"'&547332767654'3;#"'&')+ubEW-7!K4/+X`t8A>|0l7%5A8>7KZd3(,*OQ/9?0654'&323276767'&54767632#!V)B,4((7(*HTO<?aNbNLZB`.NJ|m+M;3*)3P& ]027EW4,E$2Hf3Џ,' 3;!"'#!5327&'&5476762"67654'&'ȷ$&ň($28 D@$ 8P2*I1C299(M.L,0W 5+5DE2.4!.@%&'&'&54767632;+'$'&547332766'&'&#"B.y9()Wp8c2X]0Lh^E>>:lu{/"'"5 9Ld/  #+m=E2X:SmJN}`kI="'&4762<R8R8z?@?@@?@(8)*8@@@@@??V<D@!B  10291/<2990KSXY33+532765#5YZ͹Z-,˹iij>>iE'&5473327654'ߚ)+ubj{G{yo9;>|0lALj@G}t8654'&32676#"'&54767632'&'&5473)B,4((7(*H[b?zKbNLc9g'!.9ΊMRVV+M;3*)3P&;f4KCW-3E$2Zwfj}ػH(E  '  &  E'   X '8cX ' cX ' Tc&g>x9654'&"32#"'&&733276767#"'&54767632)B,4P7&,Hir$$xZT0A&?zKbNLZB`.,L95T2R$T&()X\^-"2(hLDV,4D$2Hf3C'u6#"'&47332767654'3dG{579T?:"FHt<;?xC3b`L 3H'py'(zx @ <2991/0533)eq!%@G  %%B! "$ $&# # )"#&999919990KSX99Y"33267#"&546?>54565#53%=TZ>/mNb^hC^XC&DbRY;X1YnED98L\V@T? u^Tq_<++9mhR!9\XdffXXX%fmVuu/9%fZH{{{mjdLhX%?wXd=+XBFjX%%%%%%uuuuu%){{{{X/hh%%%{{{{{{{f{f{f{f{FmLuuuHj j///%h%F0<<^u?4An1mu -V8xv// 'J}}}9%uz%%)f{uu}f{=)/%%{{uuhj/}%{uuuu%hjxx/!79{{{zz8{zffX(hhgEfjjzz}}}v_AHHf}i_6w#6AAQ0^^))$=$=yy>/VX%V[^,,,,,)=/?VX)"V//yysb^_s?$U))//=X/UUm?p6%%u%Vux/%uuJ%F63F 6DtP3LYF633Ft"p"m94u`!Y4uVUm"h%!Vu/hBPr< A<L}i{;=hcL|}PhN{{# A#h uU;bq}/%\%\L;%%){uzuz;}uuuhhhhhhAhuwU6`x+U]6[_6V6@6``A`6!i@F3uGzygIrIBIGhrh=hgfhhW(Hd11ZdL EEEXXX$$ zzC6LDDDDDD0V\~~6EEEEEEXXXX ~~>ly|as{jK}}cceesdaobwU0[SSSSxEV_In7777-7777Vv7kn#)+?+77LL,:d^E<<.?AEEGGG11OOGI8%[:X::GM[%#H[#{:GXQ:OWbG[CaIGdUU~%%UU?::[xM Fa^M3:%{{{}{{{{{f{7VmVmVmujj==////9d9dLL%hh%%%%{{{uu    ' ' ' '%h%h%hFFFFFFFF%%llMM@@cc66'33333333@EFFFFFFFFfFF633FFFFFFFFFF%%llMM@@ccFFFFFFFFfFFFFFFF%%%['/66333333%%[p?FFFFFJdd??PZZ!!=H ?I=;0A=XBF ?I=;0E1:1A8V%AG[M {_m *{%*/.j5'/h f:TTJ B%0J%  BBBBBYYBBBBBBBBBBBBq?QQ2BXXBBBBGB*BB*B*BBBBBBBBBBBBBBBBBBEEB*BBBBBBBB%uIXXf+?;;;)}}?5XJWXXXXXXXXXXXXXXXWXXXXXWJJXXXXXXXEXXXXXXXXVVVVWXXXXVVVVVVVVVXVVVVVVXXXXXXXXXXXXXX^^OOOOOOOOOPPPPXXXXXXXXiXZZXXVXVVVVXXXXVVVVPIrZZ% % XaGX++|h}2HXXXBBX%XXX%XXX?XXXX%XXXX6FFHRFFF    <<<<<<xxxxxxxhhiFiiDDu777777?aa"2"Y::;+6.ocN8/&/// "N`ya7g!!!!GCL54=/U28Y^CVpj6gv2 1.rjD7`./<KD$>K--9.7.P<<<<<<....RRs'J*R*"..:=4%=?D-W&W;%J@3@V90~0G+%(C(#(=(.6W0$2$0174!$%2 02)!"$E=80+Qg.rA1fnCDStSt-IS-6SS`{{66O6ee5a}T2)XtSuN*u5&%2X87u)(,,uXXPXXT11T1jV%jLXZZ,,,,,,,,,,,,,,,TT(((AnTz?##EEEEEEEEEEEEjjXXXXXXXX`` 6|DD"DDDD0VLZ| LEEEEEEXXXXXX``$$  zzjC G6LZ||@S__R%fmVuu/9%{{{mjdLhf?y77//Xf=^?EjEEEXXXC6LLLLL,x 8d x ( d  4  ,(PD  !!T!!""@"#p$$%%&8''p'(P)L)*+ +,,,-P.<./ /0123X4$4T5$55567L8d989::<<=`==?,?X?@<@ABBCC@CPCDHDDEE FF8F\FFFH$HHI I$I<ITIlIIIJlJJJKK<KtKLMM4MdMMN@O$O<OTOlOOOQQQ4QLQdQQQQQS S$S<STS|SST8U<UTUlUUUVpVVVVWW,WDW\WtWWWWWXXXDXTYY(Y@YXYpYYYYYZZZ0ZHZ`ZxZZZZ[$[\D\x\\\\]](]@]X]^P___0_H_``\`````aa,aDabHb`bxbbbbbcddDdddddde|fffffg g$g<gTglgggggghh8hPhiLixiiijj<jTjljjjjjkk4kLkpkkkkklldlmmn ndno`op@pPpqqlrrtsst txtuXuvv\vw wTwxxLxxyy,yyzlz{\{|L|\|},}h}~~ ~<~~TH d0 dt4Ll ,DTt $<Tl, 8Ph(@Xp0H`xLTD,Ld|``\XxD@h(4pxdhl(``0XtD$$(x Lh LXH$L<L <T @4 @`XT4 (8HXÔ,Ĉ@pŀŰ,@TƀƜƬƼ`(|ɰ,d,Tt˄˔ˤ˴d̤̔L\x͔,TxΔΨμ$hϘϼ (XЈд`ь4XҠpӤԄ԰0L|ՠH֨$D`p׀ר׸0HXp؈ؠظ 0ِ٠ٰ`pڀXhxۈ  ݰXpވޠ޸ߐ@\t,|TXL< 8Hh|H,<0 ,x0HP4Ld,<t\t\l|\|pDT$l(8Ht <   h  T   D \ t  \4L|,<L<T ` @XpT 0$,D|4Ld|Lx(@Xp(@P`pt @ !!<!"4""##t$($x$%%&L&'@'((h()4)*L**++,,-T--..../,/<//0L011L112(2p33334h45<5L66X77P7|78L8\89`: :::;d;;;<\<<===>>?d??@@l@A A|AAAAABB(B@BXBpBBC C`CxCCDDE`ExEEFtFFFFGGHxHHIxJJ4J`KK,KHKKLxLMMM$MLMhMMNlNO\OOPDPPQ8Q\QQRRR0RHR`RxRRRRRSS SSTTTTTTU`UVLV\VlV|WWXlY$YZZ[\[\h\]^^d^_`(`aHab(bc\cde8efg g(gggh0h|hi$ilij jtjjkkkklPlm0mnnooop<pqqhqrDrs spstPtuXuv<vw,wwxtyyXyzDz{d{|H|}T}~,~4D\ TDt0`0`|@8HP @x@ <X$8 `|p,\(x Hx|(p<DH0H`,D\t$<Tl,D\t4Ld| $<Tl,Dd,D\t <Tl,D\t,D\t4Ld| $<Tl $D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ld| $<Tl,D\t4Ldt,<Td| $<Tl,D\t4Ld| $<Tl,D\t @Ph 0Hd|4Ldt¨0H`xÐè 8PhĀĘİ444444444444`pŜ4Lƈ$ǀ<pLɌɨP|̸̜0tͼThΠ8TόόLм$Ѥ҄@\ӄӸPdxԌԠԴ,@Th|Րդո0DXlրפ4t\ی0ܐܨݸX4hHdDL 4Tt4TtPDtD4$l<|0l@TlH(`| p 4\L0x<@8x8x dL,h  \   @   X   `    @ p(\t <pt8`<L`tTxt\0\tX   !l!"|#$$%l&`&'$'(T(l((())\)*$*l**+8+,d,-t-.,../(//00h014112D23 34H4585|66667d78`89X9::L:;$;x;L>>?x?@ @DA ABC<CDEFG8GGH HXHHHHI ILIIJJPJJJK$KKLLxLM@MMNNhNOhOPPPPQ8QR8RS|SSSTT,TTTTTUU(UHUpUUUVV\VlVVWLX4XXX|XXXY4YYZ(Z_,___``X`aaab,bDb|bbc clccdDddepeef<ffgDgghh`hi ihiiijjj0jjjjk0ktkkklLlllmmnxnooopppppppppqqq`qrsttuvHvwtwwwx,xdxxxxyy<yXyxyzz<zXzz{{8{{{||,|H|d||}}D}|}~~P~t~~~(Lp<\(P$P|(P|$PxDp(\,d @t4`4` Lx8hD(\XDt (D`|@h|$@\x 4d,@Tp0Hl xHd$@l@\0Xt4xp$dhDl p Lx8Ph 4\8X p0\x| \D 8ì\(ƀ`Ȕ`$ʼTͤhTld\D8\t00 lp|P$lDl(DXhl0D h,|`     4PDL<< l  !H"\##$ % &)+,++,$,l.0/15@6899<`=?,@(ATB4BCCCDDEFDFxFFG(GGHIpJ,KMtPQ4QR\RST<TU0UVV\VW WxX(XlXY YtZ []_aDbekmoTppqstuw0xtxy yTyyz z(zDz`zzzz{|}X}~TtX0l$LtPHtHp8`8(lTHXP4 t4h T$T<$Lx0d <lp``,|,, @Px@h Dh 8L48hx\ 4Ld| $<Tl,D\t4Ld| $<Tl$(@Pl4D\l(8P`x0H`x4Ld| $<TlD0H`x 8HD,DT$D\t, 8Phx$| $<TlÄÜô,<t ƀƸǬ0 0ɨd˘˨Ld|̬̔ $<͐Έ 0@P`pπϐϠϰ 0@P`pЀАРа 0@P`pрѐѠѰ 0@P`pҀҐҠҰTՐ֠ `׌؀جHpو٬PۈL4Xݐݰ ެ߰0Hp 1 +kW_B]  @  4     S  b     " :R & hhCopyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain DejaVu Sans MonoDejaVu Sans MonoBookBookDejaVu Sans MonoDejaVu Sans MonoDejaVu Sans MonoDejaVu Sans MonoVersion 2.37Version 2.37DejaVuSansMonoDejaVuSansMonoDejaVu fonts teamDejaVu fonts teamhttp://dejavu.sourceforge.nethttp://dejavu.sourceforge.netFonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. http://dejavu.sourceforge.net/wiki/index.php/Licensehttp://dejavu.sourceforge.net/wiki/index.php/License~Z 1  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                            ! " # $ % & ' ( ) * + , - . / 0 1 2 sfthyphenAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccent Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni0180uni0181uni0182uni0183uni0184uni0185uni0186uni0187uni0188uni0189uni018Auni018Buni018Cuni018Duni018Euni018Funi0190uni0191uni0193uni0194uni0195uni0196uni0197uni0198uni0199uni019Auni019Buni019Cuni019Duni019Euni019FOhornohornuni01A2uni01A3uni01A4uni01A5uni01A6uni01A7uni01A8uni01A9uni01AAuni01ABuni01ACuni01ADuni01AEUhornuhornuni01B1uni01B2uni01B3uni01B4uni01B5uni01B6uni01B7uni01B8uni01B9uni01BAuni01BBuni01BCuni01BDuni01BEuni01BFuni01C0uni01C1uni01C2uni01C3uni01CDuni01CEuni01CFuni01D0uni01D1uni01D2uni01D3uni01D4uni01D5uni01D6uni01D7uni01D8uni01D9uni01DAuni01DBuni01DCuni01DDuni01DEuni01DFuni01E0uni01E1uni01E2uni01E3Gcarongcaronuni01E8uni01E9uni01EAuni01EBuni01ECuni01EDuni01EEuni01EFuni01F0uni01F4uni01F5uni01F6uni01F8uni01F9AEacuteaeacute Oslashacute oslashacuteuni0200uni0201uni0202uni0203uni0204uni0205uni0206uni0207uni0208uni0209uni020Auni020Buni020Cuni020Duni020Euni020Funi0210uni0211uni0212uni0213uni0214uni0215uni0216uni0217 Scommaaccent scommaaccentuni021Auni021Buni021Cuni021Duni021Euni021Funi0220uni0221uni0224uni0225uni0226uni0227uni0228uni0229uni022Auni022Buni022Cuni022Duni022Euni022Funi0230uni0231uni0232uni0233uni0234uni0235uni0236dotlessjuni0238uni0239uni023Auni023Buni023Cuni023Duni023Euni023Funi0240uni0241uni0243uni0244uni0245uni024Cuni024Duni0250uni0251uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0259uni025Auni025Buni025Cuni025Duni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni0268uni0269uni026Auni026Buni026Cuni026Duni026Euni026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0277uni0278uni0279uni027Auni027Buni027Cuni027Duni027Euni027Funi0280uni0281uni0282uni0283uni0284uni0285uni0286uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni0293uni0294uni0295uni0296uni0297uni0298uni0299uni029Auni029Buni029Cuni029Duni029Euni029Funi02A0uni02A1uni02A2uni02A3uni02A4uni02A5uni02A6uni02A7uni02A8uni02A9uni02AAuni02ABuni02ACuni02ADuni02AEuni02AFuni02B0uni02B1uni02B2uni02B3uni02B4uni02B5uni02B6uni02B7uni02B8uni02B9uni02BBuni02BCuni02BDuni02BEuni02BFuni02C0uni02C1uni02C8uni02C9uni02CCuni02CDuni02CEuni02CFuni02D0uni02D1uni02D2uni02D3uni02D6uni02D7uni02DEuni02E0uni02E1uni02E2uni02E3uni02E4uni02E5uni02E6uni02E7uni02E8uni02E9uni02EEuni02F3 gravecomb acutecombuni0302 tildecombuni0304uni0305uni0306uni0307uni0308 hookabovecombuni030Auni030Buni030Cuni030Duni030Euni030Funi0310uni0311uni0312uni0313uni0314uni0315uni0316uni0317uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0321uni0322 dotbelowcombuni0324uni0325uni0326uni0327uni0328uni0329uni032Auni032Buni032Cuni032Duni032Euni032Funi0330uni0331uni0332uni0333uni0334uni0335uni0336uni0337uni0338uni0339uni033Auni033Buni033Cuni033Duni033Euni033Funi0343uni0358uni0361uni0374uni0375uni0376uni0377uni037Auni037Buni037Cuni037Duni037Euni037Ftonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D0theta1Upsilon1uni03D3uni03D4phi1omega1uni03D7uni03D8uni03D9uni03DAuni03DBuni03DCuni03DDuni03DEuni03DFuni03E0uni03E1uni03F0uni03F1uni03F2uni03F3uni03F4uni03F5uni03F6uni03F7uni03F8uni03F9uni03FAuni03FBuni03FCuni03FDuni03FEuni03FFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0463uni0472uni0473uni0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni04A2uni04A3uni04A4uni04A5uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04BAuni04BBuni04C0uni04C1uni04C2uni04C3uni04C4uni04C7uni04C8uni04CBuni04CCuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni0510uni0511uni051Auni051Buni051Cuni051Duni0531uni0532uni0533uni0534uni0535uni0536uni0537uni0538uni0539uni053Auni053Buni053Cuni053Duni053Euni053Funi0540uni0541uni0542uni0543uni0544uni0545uni0546uni0547uni0548uni0549uni054Auni054Buni054Cuni054Duni054Euni054Funi0550uni0551uni0552uni0553uni0554uni0555uni0556uni0559uni055Auni055Buni055Cuni055Duni055Euni055Funi0561uni0562uni0563uni0564uni0565uni0566uni0567uni0568uni0569uni056Auni056Buni056Cuni056Duni056Euni056Funi0570uni0571uni0572uni0573uni0574uni0575uni0576uni0577uni0578uni0579uni057Auni057Buni057Cuni057Duni057Euni057Funi0580uni0581uni0582uni0583uni0584uni0585uni0586uni0587uni0589uni058Auni0606uni0607uni0609uni060Auni060Cuni0615uni061Buni061Funi0621uni0622uni0623uni0624uni0625uni0626uni0627uni0628uni0629uni062Auni062Buni062Cuni062Duni062Euni062Funi0630uni0631uni0632uni0633uni0634uni0635uni0636uni0637uni0638uni0639uni063Auni0640uni0641uni0642uni0643uni0644uni0645uni0646uni0647uni0648uni0649uni064Auni064Buni064Cuni064Duni064Euni064Funi0650uni0651uni0652uni0653uni0654uni0655uni065Auni0660uni0661uni0662uni0663uni0664uni0665uni0666uni0667uni0668uni0669uni066Auni066Buni066Cuni066Duni0674uni0679uni067Auni067Buni067Euni067Funi0680uni0683uni0684uni0686uni0687uni0691uni0698uni06A4uni06A9uni06AFuni06BEuni06CCuni06F0uni06F1uni06F2uni06F3uni06F4uni06F5uni06F6uni06F7uni06F8uni06F9uni0E3Funi0E81uni0E82uni0E84uni0E87uni0E88uni0E8Auni0E8Duni0E94uni0E95uni0E96uni0E97uni0E99uni0E9Auni0E9Buni0E9Cuni0E9Duni0E9Euni0E9Funi0EA1uni0EA2uni0EA3uni0EA5uni0EA7uni0EAAuni0EABuni0EADuni0EAEuni0EAFuni0EB0uni0EB1uni0EB2uni0EB3uni0EB4uni0EB5uni0EB6uni0EB7uni0EB8uni0EB9uni0EBBuni0EBCuni0EC8uni0EC9uni0ECAuni0ECBuni0ECCuni0ECDuni10D0uni10D1uni10D2uni10D3uni10D4uni10D5uni10D6uni10D7uni10D8uni10D9uni10DAuni10DBuni10DCuni10DDuni10DEuni10DFuni10E0uni10E1uni10E2uni10E3uni10E4uni10E5uni10E6uni10E7uni10E8uni10E9uni10EAuni10EBuni10ECuni10EDuni10EEuni10EFuni10F0uni10F1uni10F2uni10F3uni10F4uni10F5uni10F6uni10F7uni10F8uni10F9uni10FAuni10FBuni10FCuni1D02uni1D08uni1D09uni1D14uni1D16uni1D17uni1D1Duni1D1Euni1D1Funi1D2Cuni1D2Duni1D2Euni1D30uni1D31uni1D32uni1D33uni1D34uni1D35uni1D36uni1D37uni1D38uni1D39uni1D3Auni1D3Buni1D3Cuni1D3Euni1D3Funi1D40uni1D41uni1D42uni1D43uni1D44uni1D45uni1D46uni1D47uni1D48uni1D49uni1D4Auni1D4Buni1D4Cuni1D4Duni1D4Euni1D4Funi1D50uni1D51uni1D52uni1D53uni1D54uni1D55uni1D56uni1D57uni1D58uni1D59uni1D5Auni1D5Buni1D62uni1D63uni1D64uni1D65uni1D77uni1D78uni1D7Buni1D85uni1D9Buni1D9Cuni1D9Duni1D9Euni1D9Funi1DA0uni1DA1uni1DA2uni1DA3uni1DA4uni1DA5uni1DA6uni1DA7uni1DA8uni1DA9uni1DAAuni1DABuni1DACuni1DADuni1DAEuni1DAFuni1DB0uni1DB1uni1DB2uni1DB3uni1DB4uni1DB5uni1DB6uni1DB7uni1DB9uni1DBAuni1DBBuni1DBCuni1DBDuni1DBEuni1DBFuni1E00uni1E01uni1E02uni1E03uni1E04uni1E05uni1E06uni1E07uni1E08uni1E09uni1E0Auni1E0Buni1E0Cuni1E0Duni1E0Euni1E0Funi1E10uni1E11uni1E12uni1E13uni1E18uni1E19uni1E1Auni1E1Buni1E1Cuni1E1Duni1E1Euni1E1Funi1E20uni1E21uni1E22uni1E23uni1E24uni1E25uni1E26uni1E27uni1E28uni1E29uni1E2Auni1E2Buni1E2Cuni1E2Duni1E30uni1E31uni1E32uni1E33uni1E34uni1E35uni1E36uni1E37uni1E38uni1E39uni1E3Auni1E3Buni1E3Cuni1E3Duni1E3Euni1E3Funi1E40uni1E41uni1E42uni1E43uni1E44uni1E45uni1E46uni1E47uni1E48uni1E49uni1E4Auni1E4Buni1E4Cuni1E4Duni1E54uni1E55uni1E56uni1E57uni1E58uni1E59uni1E5Auni1E5Buni1E5Cuni1E5Duni1E5Euni1E5Funi1E60uni1E61uni1E62uni1E63uni1E68uni1E69uni1E6Auni1E6Buni1E6Cuni1E6Duni1E6Euni1E6Funi1E70uni1E71uni1E72uni1E73uni1E74uni1E75uni1E76uni1E77uni1E78uni1E79uni1E7Cuni1E7Duni1E7Euni1E7FWgravewgraveWacutewacute Wdieresis wdieresisuni1E86uni1E87uni1E88uni1E89uni1E8Auni1E8Buni1E8Cuni1E8Duni1E8Euni1E8Funi1E90uni1E91uni1E92uni1E93uni1E94uni1E95uni1E96uni1E97uni1E98uni1E99uni1E9Buni1E9Funi1EA0uni1EA1uni1EACuni1EADuni1EB0uni1EB1uni1EB6uni1EB7uni1EB8uni1EB9uni1EBCuni1EBDuni1EC6uni1EC7uni1ECAuni1ECBuni1ECCuni1ECDuni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE8uni1EE9uni1EEAuni1EEBuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF8uni1EF9uni1F00uni1F01uni1F02uni1F03uni1F04uni1F05uni1F06uni1F07uni1F08uni1F09uni1F0Auni1F0Buni1F0Cuni1F0Duni1F0Euni1F0Funi1F10uni1F11uni1F12uni1F13uni1F14uni1F15uni1F18uni1F19uni1F1Auni1F1Buni1F1Cuni1F1Duni1F20uni1F21uni1F22uni1F23uni1F24uni1F25uni1F26uni1F27uni1F28uni1F29uni1F2Auni1F2Buni1F2Cuni1F2Duni1F2Euni1F2Funi1F30uni1F31uni1F32uni1F33uni1F34uni1F35uni1F36uni1F37uni1F38uni1F39uni1F3Auni1F3Buni1F3Cuni1F3Duni1F3Euni1F3Funi1F40uni1F41uni1F42uni1F43uni1F44uni1F45uni1F48uni1F49uni1F4Auni1F4Buni1F4Cuni1F4Duni1F50uni1F51uni1F52uni1F53uni1F54uni1F55uni1F56uni1F57uni1F59uni1F5Buni1F5Duni1F5Funi1F60uni1F61uni1F62uni1F63uni1F64uni1F65uni1F66uni1F67uni1F68uni1F69uni1F6Auni1F6Buni1F6Cuni1F6Duni1F6Euni1F6Funi1F70uni1F71uni1F72uni1F73uni1F74uni1F75uni1F76uni1F77uni1F78uni1F79uni1F7Auni1F7Buni1F7Cuni1F7Duni1F80uni1F81uni1F82uni1F83uni1F84uni1F85uni1F86uni1F87uni1F88uni1F89uni1F8Auni1F8Buni1F8Cuni1F8Duni1F8Euni1F8Funi1F90uni1F91uni1F92uni1F93uni1F94uni1F95uni1F96uni1F97uni1F98uni1F99uni1F9Auni1F9Buni1F9Cuni1F9Duni1F9Euni1F9Funi1FA0uni1FA1uni1FA2uni1FA3uni1FA4uni1FA5uni1FA6uni1FA7uni1FA8uni1FA9uni1FAAuni1FABuni1FACuni1FADuni1FAEuni1FAFuni1FB0uni1FB1uni1FB2uni1FB3uni1FB4uni1FB6uni1FB7uni1FB8uni1FB9uni1FBAuni1FBBuni1FBCuni1FBDuni1FBEuni1FBFuni1FC0uni1FC1uni1FC2uni1FC3uni1FC4uni1FC6uni1FC7uni1FC8uni1FC9uni1FCAuni1FCBuni1FCCuni1FCDuni1FCEuni1FCFuni1FD0uni1FD1uni1FD2uni1FD3uni1FD6uni1FD7uni1FD8uni1FD9uni1FDAuni1FDBuni1FDDuni1FDEuni1FDFuni1FE0uni1FE1uni1FE2uni1FE3uni1FE4uni1FE5uni1FE6uni1FE7uni1FE8uni1FE9uni1FEAuni1FEBuni1FECuni1FEDuni1FEEuni1FEFuni1FF2uni1FF3uni1FF4uni1FF6uni1FF7uni1FF8uni1FF9uni1FFAuni1FFBuni1FFCuni1FFDuni1FFEuni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni2010uni2011 figuredashuni2015uni2016 underscoredbl quotereverseduni201Funi2023uni202Funi2031minuteseconduni2034uni2035uni2036uni2037 exclamdbluni203Duni203Euni203Funi2045uni2046uni2047uni2048uni2049uni204Buni205Funi2070uni2071uni2074uni2075uni2076uni2077uni2078uni2079uni207Auni207Buni207Cuni207Duni207Euni207Funi2080uni2081uni2082uni2083uni2084uni2085uni2086uni2087uni2088uni2089uni208Auni208Buni208Cuni208Duni208Euni2090uni2091uni2092uni2093uni2094uni2095uni2096uni2097uni2098uni2099uni209Auni209Buni209Cuni20A0 colonmonetaryuni20A2lirauni20A5uni20A6pesetauni20A8uni20A9uni20AAdongEurouni20ADuni20AEuni20AFuni20B0uni20B1uni20B2uni20B3uni20B4uni20B5uni20B8uni20B9uni20BAuni20BDuni2102uni2105uni210Duni210Euni210Funi2115uni2116uni2117uni2119uni211Auni211Duni2124uni2126uni212Auni212B estimateduni2148uni2150uni2151onethird twothirdsuni2155uni2156uni2157uni2158uni2159uni215A oneeighth threeeighths fiveeighths seveneighthsuni215Funi2189 arrowleftarrowup arrowright arrowdown arrowboth arrowupdnuni2196uni2197uni2198uni2199uni219Auni219Buni219Cuni219Duni219Euni219Funi21A0uni21A1uni21A2uni21A3uni21A4uni21A5uni21A6uni21A7 arrowupdnbseuni21A9uni21AAuni21ABuni21ACuni21ADuni21AEuni21AFuni21B0uni21B1uni21B2uni21B3uni21B4carriagereturnuni21B6uni21B7uni21B8uni21B9uni21BAuni21BBuni21BCuni21BDuni21BEuni21BFuni21C0uni21C1uni21C2uni21C3uni21C4uni21C5uni21C6uni21C7uni21C8uni21C9uni21CAuni21CBuni21CCuni21CDuni21CEuni21CF arrowdblleft arrowdblup arrowdblright arrowdbldown arrowdblbothuni21D5uni21D6uni21D7uni21D8uni21D9uni21DAuni21DBuni21DCuni21DDuni21DEuni21DFuni21E0uni21E1uni21E2uni21E3uni21E4uni21E5uni21E6uni21E7uni21E8uni21E9uni21EAuni21EBuni21ECuni21EDuni21EEuni21EFuni21F0uni21F1uni21F2uni21F3uni21F4uni21F5uni21F6uni21F7uni21F8uni21F9uni21FAuni21FBuni21FCuni21FDuni21FEuni21FF universaluni2201 existentialuni2204emptysetgradientelement notelementuni220Asuchthatuni220Cuni220Duni220Euni2210uni2213uni2215 asteriskmathuni2218uni2219uni221Buni221C proportional orthogonalangleuni2223 logicaland logicalor intersectionunionuni222Cuni222D thereforeuni2235uni2236uni2237uni2238uni2239uni223Auni223Bsimilaruni223Duni2241uni2242uni2243uni2244 congruentuni2246uni2247uni2249uni224Auni224Buni224Cuni224Duni224Euni224Funi2250uni2251uni2252uni2253uni2254uni2255uni2256uni2257uni2258uni2259uni225Auni225Buni225Cuni225Duni225Euni225F equivalenceuni2262uni2263uni2266uni2267uni2268uni2269uni226Duni226Euni226Funi2270uni2271uni2272uni2273uni2274uni2275uni2276uni2277uni2278uni2279uni227Auni227Buni227Cuni227Duni227Euni227Funi2280uni2281 propersubsetpropersuperset notsubsetuni2285 reflexsubsetreflexsupersetuni2288uni2289uni228Auni228Buni228Duni228Euni228Funi2290uni2291uni2292uni2293uni2294 circleplusuni2296circlemultiplyuni2298uni2299uni229Auni229Buni229Cuni229Duni229Euni229Funi22A0uni22A1uni22A2uni22A3uni22A4 perpendicularuni22B2uni22B3uni22B4uni22B5uni22B8uni22C2uni22C3uni22C4dotmathuni22C6uni22CDuni22CEuni22CFuni22D0uni22D1uni22DAuni22DBuni22DCuni22DDuni22DEuni22DFuni22E0uni22E1uni22E2uni22E3uni22E4uni22E5uni22E6uni22E7uni22E8uni22E9uni22EFuni2300uni2301houseuni2303uni2304uni2305uni2306uni2308uni2309uni230Auni230Buni230Cuni230Duni230Euni230F revlogicalnotuni2311uni2312uni2313uni2314uni2315uni2318uni2319uni231Cuni231Duni231Euni231F integraltp integralbtuni2325uni2326uni2327uni2328uni232Buni2335uni2336uni2337uni2338uni2339uni233Auni233Buni233Cuni233Duni233Euni233Funi2340uni2341uni2342uni2343uni2344uni2345uni2346uni2347uni2348uni2349uni234Auni234Buni234Cuni234Duni234Euni234Funi2350uni2351uni2352uni2353uni2354uni2355uni2356uni2357uni2358uni2359uni235Auni235Buni235Cuni235Duni235Euni235Funi2360uni2361uni2362uni2363uni2364uni2365uni2366uni2367uni2368uni2369uni236Auni236Buni236Cuni236Duni236Euni236Funi2370uni2371uni2372uni2373uni2374uni2375uni2376uni2377uni2378uni2379uni237Auni237Duni2380uni2381uni2382uni2383uni2388uni2389uni238Auni238Buni2395uni239Buni239Cuni239Duni239Euni239Funi23A0uni23A1uni23A2uni23A3uni23A4uni23A5uni23A6uni23A7uni23A8uni23A9uni23AAuni23ABuni23ACuni23ADuni23AEuni23CEuni23CFuni2423SF100000uni2501SF110000uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250BSF010000uni250Duni250Euni250FSF030000uni2511uni2512uni2513SF020000uni2515uni2516uni2517SF040000uni2519uni251Auni251BSF080000uni251Duni251Euni251Funi2520uni2521uni2522uni2523SF090000uni2525uni2526uni2527uni2528uni2529uni252Auni252BSF060000uni252Duni252Euni252Funi2530uni2531uni2532uni2533SF070000uni2535uni2536uni2537uni2538uni2539uni253Auni253BSF050000uni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254FSF430000SF240000SF510000SF520000SF390000SF220000SF210000SF250000SF500000SF490000SF380000SF280000SF270000SF260000SF360000SF370000SF420000SF190000SF200000SF230000SF470000SF480000SF410000SF450000SF460000SF400000SF540000SF530000SF440000uni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Fupblockuni2581uni2582uni2583dnblockuni2585uni2586uni2587blockuni2589uni258Auni258Blfblockuni258Duni258Euni258Frtblockltshadeshadedkshadeuni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259F filledboxH22073uni25A2uni25A3uni25A4uni25A5uni25A6uni25A7uni25A8uni25A9H18543H18551 filledrectuni25ADuni25AEuni25AFuni25B0uni25B1triagupuni25B3uni25B4uni25B5uni25B6uni25B7uni25B8uni25B9triagrtuni25BBtriagdnuni25BDuni25BEuni25BFuni25C0uni25C1uni25C2uni25C3triaglfuni25C5uni25C6uni25C7uni25C8uni25C9circleuni25CCuni25CDuni25CEH18533uni25D0uni25D1uni25D2uni25D3uni25D4uni25D5uni25D6uni25D7 invbullet invcircleuni25DAuni25DBuni25DCuni25DDuni25DEuni25DFuni25E0uni25E1uni25E2uni25E3uni25E4uni25E5 openbulletuni25E7uni25E8uni25E9uni25EAuni25EBuni25ECuni25EDuni25EEuni25EFuni25F0uni25F1uni25F2uni25F3uni25F4uni25F5uni25F6uni25F7uni25F8uni25F9uni25FAuni25FBuni25FCuni25FDuni25FEuni25FFuni2600uni2601uni2602uni2603uni2604uni2605uni2606uni2607uni2608uni2609uni260Auni260Buni260Cuni260Duni260Euni260Funi2610uni2611uni2612uni2613uni2614uni2615uni2616uni2617uni2618uni2619uni261Auni261Buni261Cuni261Duni261Euni261Funi2620uni2621uni2622uni2623uni2624uni2625uni2626uni2627uni2628uni2629uni262Auni262Buni262Cuni262Duni262Euni262Funi2638uni2639 smileface invsmilefacesununi263Duni263Euni263Ffemaleuni2641maleuni2643uni2644uni2645uni2646uni2647uni2648uni2649uni264Auni264Buni264Cuni264Duni264Euni264Funi2650uni2651uni2652uni2653uni2654uni2655uni2656uni2657uni2658uni2659uni265Auni265Buni265Cuni265Duni265Euni265Fspadeuni2661uni2662clubuni2664heartdiamonduni2667uni2668uni2669 musicalnotemusicalnotedbluni266Cuni266Duni266Euni266Funi2670uni2671uni2672uni2673uni2674uni2675uni2676uni2677uni2678uni2679uni267Auni267Buni267Cuni267Duni267Euni267Funi2680uni2681uni2682uni2683uni2684uni2685uni2686uni2687uni2688uni2689uni268Auni268Buni2690uni2691uni2692uni2693uni2694uni2695uni2696uni2697uni2698uni2699uni269Auni269Buni269Cuni26A0uni26A1uni26B0uni26B1uni2701uni2702uni2703uni2704uni2706uni2707uni2708uni2709uni270Cuni270Duni270Euni270Funi2710uni2711uni2712uni2713uni2714uni2715uni2716uni2717uni2718uni2719uni271Auni271Buni271Cuni271Duni271Euni271Funi2720uni2721uni2722uni2723uni2724uni2725uni2726uni2727uni2729uni272Auni272Buni272Cuni272Duni272Euni272Funi2730uni2731uni2732uni2733uni2734uni2735uni2736uni2737uni2738uni2739uni273Auni273Buni273Cuni273Duni273Euni273Funi2740uni2741uni2742uni2743uni2744uni2745uni2746uni2747uni2748uni2749uni274Auni274Buni274Duni274Funi2750uni2751uni2752uni2756uni2758uni2759uni275Auni275Buni275Cuni275Duni275Euni2761uni2762uni2763uni2764uni2765uni2766uni2767uni2768uni2769uni276Auni276Buni276Cuni276Duni276Euni276Funi2770uni2771uni2772uni2773uni2774uni2775uni2794uni2798uni2799uni279Auni279Buni279Cuni279Duni279Euni279Funi27A0uni27A1uni27A2uni27A3uni27A4uni27A5uni27A6uni27A7uni27A8uni27A9uni27AAuni27ABuni27ACuni27ADuni27AEuni27AFuni27B1uni27B2uni27B3uni27B4uni27B5uni27B6uni27B7uni27B8uni27B9uni27BAuni27BBuni27BCuni27BDuni27BEuni27C2uni27C5uni27C6uni27DCuni27E0uni27E6uni27E7uni27E8uni27E9uni27EAuni27EBuni27F5uni27F6uni27F7uni2987uni2988uni2997uni2998uni29EBuni29FAuni29FBuni2A00uni2A2Funi2A6Auni2A6Buni2B05uni2B06uni2B07uni2B08uni2B09uni2B0Auni2B0Buni2B0Cuni2B0Duni2B12uni2B13uni2B14uni2B15uni2B16uni2B17uni2B18uni2B19uni2B1Auni2C64uni2C6Duni2C6Euni2C6Funi2C70uni2C75uni2C76uni2C77uni2C79uni2C7Auni2C7Cuni2C7Duni2C7Euni2C7Funi2E18uni2E1Funi2E22uni2E23uni2E24uni2E25uni2E2EuniA708uniA709uniA70AuniA70BuniA70CuniA70DuniA70EuniA70FuniA710uniA711uniA712uniA713uniA714uniA715uniA716uniA71BuniA71CuniA71DuniA71EuniA71FuniA722uniA723uniA724uniA725uniA726uniA727uniA789uniA78AuniA78BuniA78CuniA78DuniA78EuniA790uniA791uniA7AAuniA7F8uniA7F9uniF6C5uniFB52uniFB53uniFB54uniFB55uniFB56uniFB57uniFB58uniFB59uniFB5AuniFB5BuniFB5CuniFB5DuniFB5EuniFB5FuniFB60uniFB61uniFB62uniFB63uniFB64uniFB65uniFB66uniFB67uniFB68uniFB69uniFB6AuniFB6BuniFB6CuniFB6DuniFB6EuniFB6FuniFB70uniFB71uniFB72uniFB73uniFB74uniFB75uniFB76uniFB77uniFB78uniFB79uniFB7AuniFB7BuniFB7CuniFB7DuniFB7EuniFB7FuniFB80uniFB81uniFB8AuniFB8BuniFB8CuniFB8DuniFB8EuniFB8FuniFB90uniFB91uniFB92uniFB93uniFB94uniFB95uniFB9EuniFB9FuniFBAAuniFBABuniFBACuniFBADuniFBE8uniFBE9uniFBFCuniFBFDuniFBFEuniFBFFuniFE70uniFE71uniFE72uniFE73uniFE74uniFE76uniFE77uniFE78uniFE79uniFE7AuniFE7BuniFE7CuniFE7DuniFE7EuniFE7FuniFE80uniFE81uniFE82uniFE83uniFE84uniFE85uniFE86uniFE87uniFE88uniFE89uniFE8AuniFE8BuniFE8CuniFE8DuniFE8EuniFE8FuniFE90uniFE91uniFE92uniFE93uniFE94uniFE95uniFE96uniFE97uniFE98uniFE99uniFE9AuniFE9BuniFE9CuniFE9DuniFE9EuniFE9FuniFEA0uniFEA1uniFEA2uniFEA3uniFEA4uniFEA5uniFEA6uniFEA7uniFEA8uniFEA9uniFEAAuniFEABuniFEACuniFEADuniFEAEuniFEAFuniFEB0uniFEB1uniFEB2uniFEB3uniFEB4uniFEB5uniFEB6uniFEB7uniFEB8uniFEB9uniFEBAuniFEBBuniFEBCuniFEBDuniFEBEuniFEBFuniFEC0uniFEC1uniFEC2uniFEC3uniFEC4uniFEC5uniFEC6uniFEC7uniFEC8uniFEC9uniFECAuniFECBuniFECCuniFECDuniFECEuniFECFuniFED0uniFED1uniFED2uniFED3uniFED4uniFED5uniFED6uniFED7uniFED8uniFED9uniFEDAuniFEDBuniFEDCuniFEDDuniFEDEuniFEDFuniFEE0uniFEE1uniFEE2uniFEE3uniFEE4uniFEE5uniFEE6uniFEE7uniFEE8uniFEE9uniFEEAuniFEEBuniFEECuniFEEDuniFEEEuniFEEFuniFEF0uniFEF1uniFEF2uniFEF3uniFEF4uniFEF5uniFEF6uniFEF7uniFEF8uniFEF9uniFEFAuniFEFBuniFEFCuniFEFFuniFFF9uniFFFAuniFFFBuniFFFCuniFFFDu1D55Au1D670u1D671u1D672u1D673u1D674u1D675u1D676u1D677u1D678u1D679u1D67Au1D67Bu1D67Cu1D67Du1D67Eu1D67Fu1D680u1D681u1D682u1D683u1D684u1D685u1D686u1D687u1D688u1D689u1D68Au1D68Bu1D68Cu1D68Du1D68Eu1D68Fu1D690u1D691u1D692u1D693u1D694u1D695u1D696u1D697u1D698u1D699u1D69Au1D69Bu1D69Cu1D69Du1D69Eu1D69Fu1D6A0u1D6A1u1D6A2u1D6A3u1D7F6u1D7F7u1D7F8u1D7F9u1D7FAu1D7FBu1D7FCu1D7FDu1D7FEu1D7FF dlLtcaron DiaeresisAcuteTildeGrave CircumflexCaron fractionslash uni0311.case uni0306.case uni0307.case uni030B.case uni030F.case thinquestion uni0304.caseunderbar underbar.wideunderbar.smalljotdiaeresis.symbols arabic_dot arabic_2dots arabic_3dots uni066E.fina uni06A1.init uni06A1.medi uni066F.fina uni06A1.finaarabic_3dots_aarabic_2dots_a arabic_4dotsarabic_gaf_bararabic_gaf_bar_a arabic_ringEng.altuni066Euni066Funi067Cuni067Duni0681uni0682uni0685uni0692uni06A1uni06B5uni06BAuni06C6uni06CEuni06D5exclamdown.casequestiondown.case uni2E18.case]A GA% } % 2  %%@Y}2}Y&Y@&//2G@Gddkߖږ؍ }:Ս :  ϊ̖ˋ%}Ś   ]%]@%AA dd@2(-}-d   ..A]%]@%%%A  %d%BSx~}~}}|{zwvut uu@t tss@rqponSonm(nSm(lk2ji2hgfedcbcbba`_^Z ^]d\[Z [Z YXWVUU2TSRQ}PONM-MLK(JIJ7ICIHEHGCGdFEFEDCD7CBCC@@ BABB@ A@AA@ @? @@@ ? ? ?@@d>=-=<;(:9B9d818K76-65K404K3032B21-10/-/. .-,--@ ,,,@@+*%+* *%):)('&%B%E$#""! -!} -KBBF-B-B-B@  @   @    @  @7    -:-:-d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++segno-1.6.6/examples/qrcode_text/font/LICENSE000066400000000000000000000211601476440322300207560ustar00rootroot00000000000000Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Arev Fonts Copyright ------------------------------ Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. TeX Gyre DJV Math ----------------- Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Math extensions done by B. Jackowski, P. Strzelczyk and P. Pianowski (on behalf of TeX users groups) are in public domain. Letters imported from Euler Fraktur from AMSfonts are (c) American Mathematical Society (see below). Bitstream Vera Fonts Copyright Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (“Fonts”) and associated documentation files (the “Font Software”), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words “Bitstream” or the word “Vera”. This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the “Bitstream Vera” names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of GNOME, the GNOME Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the GNOME Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. AMSFonts (v. 2.2) copyright The PostScript Type 1 implementation of the AMSFonts produced by and previously distributed by Blue Sky Research and Y&Y, Inc. are now freely available for general use. This has been accomplished through the cooperation of a consortium of scientific publishers with Blue Sky Research and Y&Y. Members of this consortium include: Elsevier Science IBM Corporation Society for Industrial and Applied Mathematics (SIAM) Springer-Verlag American Mathematical Society (AMS) In order to assure the authenticity of these fonts, copyright will be held by the American Mathematical Society. This is not meant to restrict in any way the legitimate use of the fonts, such as (but not limited to) electronic distribution of documents containing these fonts, inclusion of these fonts into other public domain or commercial font collections or computer applications, use of the outline data to create derivative fonts and/or faces, etc. However, the AMS does require that the AMS copyright notice be removed from any derivative versions of the fonts which have been altered in any way. In addition, to ensure the fidelity of TeX documents using Computer Modern fonts, Professor Donald Knuth, creator of the Computer Modern faces, has requested that any alterations which yield different font metrics be given a different name. $Id$ segno-1.6.6/examples/qrcode_text/png_text.py000066400000000000000000000151061476440322300212100ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Copyright (c) 2016 - 2020 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Example how to add additional text to a QR code. See """ import io import os from functools import partial from PIL import Image, ImageColor, ImageDraw, ImageFont import segno def qr_with_text(qrcode: segno.QRCode, *, text: str = None, font_path: str = None, font_size: int = 12, font_color=False, line_spacing: int = None, scale: int = 1, border: int = None, dark='#000', light='#fff', finder_dark=False, finder_light=False, data_dark=False, data_light=False, version_dark=False, version_light=False, format_dark=False, format_light=False, alignment_dark=False, alignment_light=False, timing_dark=False, timing_light=False, separator=False, dark_module=False, quiet_zone=False) -> Image: """\ Adds a text (i.e. the content of the QR code) to the QR code. See `segno.QRCode.save `_ and `PNG `_ for a detailed description of the parameters. :param segno.QRCode qrcode: The QR code. :param str text: The text to add to the QR code. :param str font_path: Path to the font :param int font_size: Font size. :param font_color: See dark for valid values. :param int line_spacing: Spacing between the lines. If not provided, it is the half of the font size. :param scale: The scale. :param int border: Number indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param dark: Color of the dark modules (default: black). The color can be provided as ``(R, G, B)`` tuple, as hexadecimal format (``#RGB``, ``#RRGGBB`` ``RRGGBBAA``), or web color name (i.e. ``red``). :param light: Color of the light modules (default: white). See `color` for valid values. If light is set to ``None`` the light modules will be transparent. :param finder_dark: Color of the dark finder modules (default: same as ``dark``) :param finder_light: Color of the light finder modules (default: same as ``light``) :param data_dark: Color of the dark data modules (default: same as ``dark``) :param data_light: Color of the light data modules (default: same as ``light``) :param version_dark: Color of the dark version modules (default: same as ``dark``) :param version_light: Color of the light version modules (default: same as ``light``) :param format_dark: Color of the dark format modules (default: same as ``dark``) :param format_light: Color of the light format modules (default: same as ``light``) :param alignment_dark: Color of the dark alignment modules (default: same as ``dark``) :param alignment_light: Color of the light alignment modules (default: same as ``light``) :param timing_dark: Color of the dark timing pattern modules (default: same as ``dark``) :param timing_light: Color of the light timing pattern modules (default: same as ``light``) :param separator: Color of the separator (default: same as ``light``) :param dark_module: Color of the dark module (default: same as ``dark``) :param quiet_zone: Color of the quiet zone modules (default: same as ``light``) """ png = io.BytesIO() qrcode.save(png, kind='png', scale=scale, border=border, dark=dark, light=light, finder_dark=finder_dark, finder_light=finder_light, data_dark=data_dark, data_light=data_light, version_dark=version_dark, version_light=version_light, format_dark=format_dark, format_light=format_light, alignment_dark=alignment_dark, alignment_light=alignment_light, timing_dark=timing_dark, timing_light=timing_light, separator=separator, dark_module=dark_module, quiet_zone=quiet_zone) png.seek(0) img = Image.open(png) if text is None: return img font_path = font_path or os.path.join(os.path.dirname(__file__), 'font', 'DejaVuSansMono.ttf') font = ImageFont.truetype(font_path, font_size) width, height = img.size x, y = scale * (border if border is not None else qrcode.default_border_size), height line_spacing = line_spacing or font_size // 2 lines = text.splitlines() # Calculate the additional space required for the text for line in lines: try: # Pillow versions < 10 fw, fh = font.getsize(line) except AttributeError: fw, fh = font.getbbox(line)[2:4] if fw > width: width = fw + font_size height += fh + line_spacing has_palette = img.mode == 'P' if has_palette: # The palette of the resulting image may be different from the # palette of the original image. To avoid problems with pasting the # QR code image into the resulting image, convert the QR code image to RGBA # This operation is reverted after drawing the text img = img.convert('RGBA') res_img = Image.new(img.mode, (width, height), color=quiet_zone or light) res_img.paste(img) draw = ImageDraw.Draw(res_img) font_color = font_color or dark draw_text = partial(draw.text, font=font, fill=ImageColor.getcolor(font_color, img.mode)) for line in lines: draw_text((x, y), line) y += font_size + line_spacing if has_palette: res_img = res_img.convert('P') return res_img if __name__ == '__main__': content = 'I read the news today, oh boy\n' \ 'About a lucky man who made the grade\n' \ 'And though the news was rather sad\n' \ 'Well, I just had to laugh\n' \ 'I saw the photograph' qr = segno.make(content) qr_with_text(qr, text=content, scale=6, dark='darkblue', light='#ffffb2', quiet_zone='#eee').save('a-day-in-the-life-1.png') qr_with_text(qr, text=content, scale=6, dark='darkblue', quiet_zone='#eee', font_color='darkgreen').save('a-day-in-the-life-2.png') qr_with_text(qr, text=content, scale=6).save('a-day-in-the-life-3.png') qr_with_text(qr, text=content, scale=6, font_size=32).save('a-day-in-the-life-4.png') qr_with_text(qr, text=content).save('a-day-in-the-life-5.png') qr_with_text(qr, text=content, border=0, scale=3).save('a-day-in-the-life-6.png') segno-1.6.6/examples/qrcode_text/svg_text.py000066400000000000000000000154061476440322300212260ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # Copyright (c) 2016 - 2020 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Example how to add additional text to a SVG QR code. """ import io import re from xml.sax.saxutils import escape import segno from segno.writers import _color_to_webcolor as webcolor def qr_with_text(qrcode: segno.QRCode, *, text: str = None, font_size: int = 12, font_color=False, line_spacing: int = None, scale: int = 1, border: int = None, dark='#000', light='#fff', finder_dark=False, finder_light=False, data_dark=False, data_light=False, version_dark=False, version_light=False, format_dark=False, format_light=False, alignment_dark=False, alignment_light=False, timing_dark=False, timing_light=False, separator=False, dark_module=False, quiet_zone=False, **kw) -> io.BytesIO: """\ Adds a text (i.e. the content of the QR code) to the QR code. See `segno.QRCode.save `_ and `SVG `_ for a detailed description of the parameters. :param segno.QRCode qrcode: The QR code. :param str text: The text to add to the QR code. :param int font_size: Font size. :param font_color: See dark for valid values. :param int line_spacing: Spacing between the lines. If not provided, it is the half of the font size. :param scale: The scale. :param int border: Number indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param dark: Color of the dark modules (default: black). The color can be provided as ``(R, G, B)`` tuple, as hexadecimal format (``#RGB``, ``#RRGGBB`` ``RRGGBBAA``), or web color name (i.e. ``red``). :param light: Color of the light modules (default: white). See `color` for valid values. If light is set to ``None`` the light modules will be transparent. :param finder_dark: Color of the dark finder modules (default: same as ``dark``) :param finder_light: Color of the light finder modules (default: same as ``light``) :param data_dark: Color of the dark data modules (default: same as ``dark``) :param data_light: Color of the light data modules (default: same as ``light``) :param version_dark: Color of the dark version modules (default: same as ``dark``) :param version_light: Color of the light version modules (default: same as ``light``) :param format_dark: Color of the dark format modules (default: same as ``dark``) :param format_light: Color of the light format modules (default: same as ``light``) :param alignment_dark: Color of the dark alignment modules (default: same as ``dark``) :param alignment_light: Color of the light alignment modules (default: same as ``light``) :param timing_dark: Color of the dark timing pattern modules (default: same as ``dark``) :param timing_light: Color of the light timing pattern modules (default: same as ``light``) :param separator: Color of the separator (default: same as ``light``) :param dark_module: Color of the dark module (default: same as ``dark``) :param quiet_zone: Color of the quiet zone modules (default: same as ``light``) """ def calc_font_size(txt) -> int: return round(len(txt) * font_size / 1.5), font_size svg = io.BytesIO() qrcode.save(svg, kind='svg', scale=scale, border=border, dark=dark, light=light, finder_dark=finder_dark, finder_light=finder_light, data_dark=data_dark, data_light=data_light, version_dark=version_dark, version_light=version_light, format_dark=format_dark, format_light=format_light, alignment_dark=alignment_dark, alignment_light=alignment_light, timing_dark=timing_dark, timing_light=timing_light, separator=separator, dark_module=dark_module, quiet_zone=quiet_zone, **kw) svg.seek(0) if text is None: text = kw.get('title') if text is None: # That was easy, nothing to do, just return the SVG return svg encoding = kw.get('encoding', 'utf-8') qr_width, qr_height = qrcode.symbol_size(scale, border) width, height = qr_width, qr_height text_buff = io.BytesIO() write = text_buff.write write_str = lambda s: write(s.encode(encoding)) border = border if border is not None else qrcode.default_border_size border_offset = scale * border font_color = webcolor(font_color or dark) write_str('' .format(qr_height, font_size, font_color)) line_spacing = line_spacing or font_size // 2 for line in text.splitlines(): write_str(''.format(border_offset, font_size + line_spacing)) write_str(escape(line)) write(b'') fw, fh = calc_font_size(line) if fw > width: width = fw height += fh + line_spacing height += line_spacing write(b'') # Add the text to the SVG generated by Segno. # The is part of the text_buff res = re.sub(b'', text_buff.getvalue(), svg.getvalue()) res = re.sub('width="{}"'.format(qr_width).encode(encoding), 'width="{}"'.format(width).encode(encoding), res) res = re.sub('height="{}"'.format(qr_height).encode(encoding), 'height="{}"'.format(height).encode(encoding), res) svg = io.BytesIO(res) svg.seek(0) return svg if __name__ == '__main__': content = 'If the rain comes\n' \ 'They run and hide their heads\n' \ 'They might as well be dead\n' \ 'If the rain comes\n' \ 'If the rain comes' qr = segno.make(content) svg = qr_with_text(qr, text=content, scale=6, dark='darkblue', light='#eee', data_dark='steelblue').getvalue() with open('rain-1.svg', 'wb') as f: f.write(svg) svg = qr_with_text(qr, text=content, scale=6).getvalue() with open('rain-2.svg', 'wb') as f: f.write(svg) svg = qr_with_text(qr, text=content, scale=6, font_size=32).getvalue() with open('rain-3.svg', 'wb') as f: f.write(svg) svg = qr_with_text(qr, text=content).getvalue() with open('rain-4.svg', 'wb') as f: f.write(svg) svg = qr_with_text(qr, text=content, border=0, scale=3).getvalue() with open('rain-5.svg', 'wb') as f: f.write(svg) svg = qr_with_text(qr, title='Rain', scale=3, font_color='darkred').getvalue() with open('rain-6.svg', 'wb') as f: f.write(svg) segno-1.6.6/noxfile.py000066400000000000000000000172371476440322300146740ustar00rootroot00000000000000# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Nox test runner configuration. """ import os import sys import re from functools import partial from itertools import chain import shutil import nox _PY_VERSIONS = ('3.9', '3.10', '3.11', '3.12', '3.13', 'pypy3') _PY_DEFAULT_VERSION = sys.version[:4] nox.options.sessions = chain([f'test-{version}' for version in _PY_VERSIONS], ['coverage', 'lint']) @nox.session(python=_PY_VERSIONS) def test(session): """\ Run test suite. """ session.install('-Ur', 'tests/requirements.txt') session.install('.') if session.posargs: session.run('pytest', *[f'tests/{test_file}' for test_file in session.posargs]) else: session.run('pytest') @nox.session(python=_PY_DEFAULT_VERSION) def docs(session): """\ Build the documentation. """ session.install('-Ur', 'docs/requirements.txt') output_dir = os.path.abspath(os.path.join(session.create_tmp(), 'output')) shutil.rmtree(output_dir, ignore_errors=True) doctrees, html, man = map(partial(os.path.join, output_dir), ['doctrees', 'html', 'man']) session.install('.') session.cd('docs') sphinx_build = partial(session.run, 'sphinx-build', '-W', '-d', doctrees, '.') sphinx_build('-b', 'html', html) sphinx_build('-b', 'man', man) sys.path.insert(0, os.path.abspath('..')) import segno if 'dev' not in segno.__version__: shutil.copyfile(os.path.join(man, 'segno.1'), os.path.abspath(os.path.join(os.path.dirname(__file__), 'data/share/man/man1/', 'segno.1'))) session.log("'man/segno.1' has been modified, don't forget to commit") @nox.session(python=_PY_DEFAULT_VERSION) def coverage(session): """\ Run coverage. """ session.install('-Ur', 'tests/requirements.txt') session.install('.') html_output_dir = os.path.abspath(os.path.join(session.create_tmp(), 'html')) session.run('pytest', '--cov=segno', '--cov-report=term', f'--cov-report=html:{html_output_dir}') @nox.session(python=_PY_DEFAULT_VERSION) def lint(session): """\ Run linters. """ session.install('ruff', 'mypy') session.run('mypy', 'segno') session.run('ruff', 'check', '.') @nox.session(python=_PY_DEFAULT_VERSION) def benchmarks(session): """\ Run the benchmarks and create the charts. """ session.install('qrcode', 'Pillow', 'qrcodegen', 'pygal') session.install('setuptools') # Required by pygal since it uses pkg_resources session.install('.') sandbox_dir = os.path.join(os.path.dirname(__file__), 'sandbox') session.run('python', os.path.join(sandbox_dir, 'benchmarks.py')) session.run('python', os.path.join(sandbox_dir, 'make_charts.py')) # # Release related tasks # 1. nox -e start-release -- version-number # 2. run tests, update docs, update changes # 3. nox -e finish-release -- version-number # 4. git push / git push origin --tags # 5. nox -e build-release -- version-number # 6. nox -e upload-release # @nox.session(name='start-release', python=_PY_DEFAULT_VERSION) def start_release(session): """\ Prepares a release. * Creates a new branch release-VERSION_NUMBER * Changes the version number in segno.__version__ to VERSION_NUMBER """ session.install('packaging') git = partial(session.run, 'git', external=True) git('checkout', 'master') prev_version = _get_current_version(session) version = _validate_version(session) valid_version = bool(int(session.run('python', '-c', 'from packaging.version import parse;' f'prev_version = parse("{prev_version}");' f'next_version = parse("{version}");' 'print(1 if prev_version < next_version else 0)', silent=True))) if not valid_version: session.error('Invalid version') release_branch = f'release-{version}' git('checkout', '-b', release_branch, 'master') _change_version(session, prev_version, version) git('add', 'segno/__init__.py') session.log(f'Now on branch "{release_branch}". Run the tests, run nox -e docs. Update and add CHANGES') session.log('Commit any changes.') session.log(f'When done, call nox -e finish-release -- {version}') @nox.session(name='finish-release', python=_PY_DEFAULT_VERSION) def finish_release(session): """\ Finishes the release. * Merges the branch release-VERSION_NUMBER into master * Creates a tag VERSION_NUMBER * Increments the development version """ version = _validate_version(session) release_branch = f'release-{version}' git = partial(session.run, 'git', external=True) git('checkout', 'master') git('merge', '--no-ff', release_branch, '-m', f'Merge release branch {release_branch}') git('tag', '-a', version, '-m', f'Release {version}') git('branch', '-d', release_branch) version_parts = version.split('.') patch = str(int(version_parts[2]) + 1) next_version = '.'.join(chain(version_parts[:2], patch)) + '.dev' _change_version(session, version, next_version) git('add', 'segno/__init__.py') git('commit', '-m', 'Incremented development version') session.log('Finished. Run git push / git push origin --tags and ' f'nox -e build-release -- {version} / nox -e upload-release') @nox.session(name='build-release', python=_PY_DEFAULT_VERSION) def build_release(session): """\ Builds a release: Creates sdist and wheel """ version = _validate_version(session) session.install('flit-core') git = partial(session.run, 'git', external=True) git('fetch') git('fetch', '--tags') git('checkout', version) shutil.rmtree('dist', ignore_errors=True) session.run('flit', 'build', external=True) git('checkout', 'master') @nox.session(name='upload-release', python=_PY_DEFAULT_VERSION) def upload_release(session): """\ Uploads a release to PyPI """ session.install('twine') twine = partial(session.run, 'twine') twine('check', 'dist/*') twine('upload', 'dist/*') def _validate_version(session): if not session.posargs: session.error('No release version provided') elif len(session.posargs) > 1: session.error('Too many arguments') version = session.posargs[0] if not re.match(r'^[0-9]+\.[0-9]+\.[0-9]+$', version): session.error(f'Invalid version number: "{version}"') return version def _get_current_version(session): """\ Returns the current Segno version. """ fn = os.path.abspath(os.path.join(os.path.dirname(__file__), 'segno/__init__.py')) with open(fn, encoding='utf-8') as f: content = f.read() m = re.search(r'^__version__ = ["\']([^"\']+)["\']$', content, flags=re.MULTILINE) if m: return m.group(1) session.error('Cannot find any version information') def _change_version(session, previous_version, next_version): """\ Changes the segno.__init__.__version__ from previous_version to next_version. """ fn = os.path.abspath(os.path.join(os.path.dirname(__file__), 'segno/__init__.py')) with open(fn, encoding='utf-8') as f: content = f.read() new_content = re.sub(rf'^(__version__ = ["\'])({re.escape(previous_version)})(["\'])$', rf'\g<1>{next_version}\g<3>', content, flags=re.MULTILINE) if content != new_content: with open(fn, 'w', encoding='utf-8') as f: f.write(new_content) return session.error(f'Cannot modify version. Provided: "{previous_version}" (previous) "{next_version}" (next)') segno-1.6.6/pyproject.toml000066400000000000000000000036211476440322300155620ustar00rootroot00000000000000[build-system] requires = ["flit_core >=3.2,<4"] build-backend = "flit_core.buildapi" [project] name = "segno" description = "QR Code and Micro QR Code generator for Python" dynamic = ["version"] readme = "README.rst" license = {file = "LICENSE"} authors = [{"name" = "Lars Heuer", email = "heuer@semagia.com"}] requires-python = ">=3.5" keywords = ["QR Code", "Micro QR Code", "ISO/IEC 18004", "ISO/IEC 18004:2006(E)", "ISO/IEC 18004:2015(E)", "qrcode", "QR", "barcode", "matrix", "2D",] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Topic :: Multimedia :: Graphics", "Topic :: Printing", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities", ] dependencies = [ "importlib-metadata>=3.6.0; python_version < '3.10'", ] [project.urls] Homepage = "https://github.com/heuer/segno/" Documentation = "https://segno.readthedocs.io/" "Issue tracker" = "https://github.com/heuer/segno/issues/" Changes = "https://github.com/heuer/segno/blob/master/CHANGES.rst" [project.scripts] segno = "segno.cli:main" [tool.coverage.run] branch = true [tool.coverage.report] exclude_also = [ # Don't complain if non-runnable code isn't run: "if __name__ == .__main__.:", ] [tool.flit.sdist] include = ["docs/", "tests/", "LICENSE", "*.rst", # CHANGES and README "noxfile.py", "MANIFEST.in", "pyproject.toml"] exclude = [".github", ".*", "sandbox/*"] [tool.flit.external-data] directory = "data" [tool.ruff] lint.select = ['E', 'F', 'N', 'W', 'UP', 'RUF'] lint.ignore = ['I001', 'RUF022'] exclude = ['examples', 'tests'] line-length = 120 segno-1.6.6/sandbox/000077500000000000000000000000001476440322300143025ustar00rootroot00000000000000segno-1.6.6/sandbox/benchmarks.py000066400000000000000000000147321476440322300170000ustar00rootroot00000000000000"""\ Some benchmarks running against QR Code generators """ import sys import os import csv import timeit import segno try: import qrcode from qrcode import QRCode, ERROR_CORRECT_M, ERROR_CORRECT_Q, ERROR_CORRECT_H from qrcode.image.svg import SvgImage, SvgPathImage except ImportError: qrcode = None try: import qrcodegen from qrcodegen import QrCode, QrSegment qrcodegen_make_segment = QrSegment.make_segments qrcodegen_error_m = QrCode.Ecc.MEDIUM qrcodegen_error_q = QrCode.Ecc.QUARTILE qrcodegen_error_h = QrCode.Ecc.HIGH except ImportError: qrcodegen = None _PNG_COMPRESSION_LEVEL = 6 # Default Pillow PNG compression level if qrcode: def create_qrcode(data='QR Code Symbol'): """qrcode create 1-M""" qr = QRCode(error_correction=ERROR_CORRECT_M) qr.add_data(data, optimize=False) qr.make() def create7q_qrcode(data='QR Code Symbol'): """qrcode create 7-Q""" qr = QRCode(error_correction=ERROR_CORRECT_Q, version=7) qr.add_data(data, optimize=False) qr.make() def create30h_qrcode(data='QR Code Symbol'): """qrcode create 30-H""" qr = QRCode(error_correction=ERROR_CORRECT_H, version=30) qr.add_data(data, optimize=False) qr.make() def svg_qrcode_path(data='QR Code Symbol'): """qrcode SVG path""" qr = QRCode(error_correction=ERROR_CORRECT_M, box_size=10, image_factory=SvgPathImage) qr.add_data(data, optimize=False) qr.make_image().save(os.path.join(_output_dir(), f'qrcode_path_{data}.svg')) def svg_qrcode_rects(data='QR Code Symbol'): """qrcode SVG rects""" qr = QRCode(error_correction=ERROR_CORRECT_M, box_size=10, image_factory=SvgImage) qr.add_data(data, optimize=False) qr.make_image().save(os.path.join(_output_dir(), f'qrcode_rects_{data}.svg')) def png_qrcode(data='QR Code Symbol'): """qrcode PNG 1-M""" qr = QRCode(error_correction=ERROR_CORRECT_M, box_size=10) qr.add_data(data, optimize=False) qr.make_image().save(os.path.join(_output_dir(), f'qrcode_{data}.png'), compress_level=_PNG_COMPRESSION_LEVEL) if qrcodegen: def create_qrcodegen(data='QR Code Symbol'): """qrcodegen create 1-M""" QrCode.encode_segments(qrcodegen_make_segment(data), ecl=qrcodegen_error_m, boostecl=False) def create7q_qrcodegen(data='QR Code Symbol'): """qrcodegen create 7-Q""" QrCode.encode_segments(qrcodegen_make_segment(data), ecl=qrcodegen_error_q, minversion=7, maxversion=7, boostecl=False) def create30h_qrcodegen(data='QR Code Symbol'): """qrcodegen create 30-H""" QrCode.encode_segments(qrcodegen_make_segment(data), ecl=qrcodegen_error_h, minversion=30, maxversion=30, boostecl=False) def _output_dir(): return os.path.join(os.path.abspath(os.path.dirname(__file__)), 'out') def create_segno(data='QR Code Symbol'): """Segno create 1-M""" segno.make_qr(data, error='m', boost_error=False) def create7q_segno(data='QR Code Symbol'): """Segno create 7-Q""" segno.make_qr(data, error='q', version=7, boost_error=False) def create30h_segno(data='QR Code Symbol'): """Segno create 30-H""" segno.make_qr(data, error='h', version=30, boost_error=False) def svg_segno(data='QR Code Symbol'): """Segno SVG""" segno.make_qr(data, error='m', boost_error=False).save(os.path.join(_output_dir(), f'segno_{data}.svg'), scale=10) def png_segno(data='QR Code Symbol'): """Segno PNG 1-M""" segno.make_qr(data, error='m', boost_error=False).save(os.path.join(_output_dir(), f'segno_{data}.png'), scale=10, compresslevel=_PNG_COMPRESSION_LEVEL) def run_create_tests(which=None, number=200, table=None): tests = ('create_qrcodegen', 'create_qrcode', 'create_segno',) if which: tests = filter(lambda n: n[len('create_'):] in which, tests) _run_tests(tests, number, table) def run_create7q_tests(which=None, number=200, table=None): tests = ('create7q_qrcodegen', 'create7q_qrcode', 'create7q_segno',) if which: tests = filter(lambda n: n[len('create7q_'):] in which, tests) _run_tests(tests, number, table) def run_create30h_tests(which=None, number=200, table=None): tests = ('create30h_qrcodegen', 'create30h_qrcode', 'create30h_segno',) if which: tests = filter(lambda n: n[len('createbig_'):] in which, tests) _run_tests(tests, number, table) def run_svg_tests(which=None, number=200, table=None): tests = ('svg_qrcode_path', 'svg_qrcode_rects', 'svg_segno',) if which: tests = filter(lambda n: n[len('svg_'):] in which, tests) _run_tests(tests, number, table) def run_png_tests(which=None, number=200, table=None): tests = ('png_qrcode', 'png_segno',) if which: tests = filter(lambda n: n[len('png_'):] in which, tests) _run_tests(tests, number, table) def _run_tests(tests, number, table=None): # Code taken from # Author: Jonas Borgström # License: BSD (I'd think since Genshi uses BSD as well) for test in [t for t in tests if hasattr(sys.modules[__name__], t)]: t = timeit.Timer(setup=f'from __main__ import {test};', stmt=f'{test}()') time = t.timeit(number=number) / number if time < 0.00001: result = ' (not installed?)' else: result = '%16.2f ms' % (1000 * time) name = getattr(sys.modules[__name__], test).__doc__ print(f'{name: <35} {result}') if table is not None: table.append((name, '%.2f' % (1000 * time))) if __name__ == '__main__': table = [] run_create_tests(table=table) run_create7q_tests(table=table) run_create30h_tests(table=table) run_svg_tests(table=table) run_png_tests(table=table) with open(os.path.join(_output_dir(), 'results.csv'), 'w') as f: writer = csv.writer(f) writer.writerows(table) segno-1.6.6/sandbox/make_charts.py000066400000000000000000000052061476440322300171400ustar00rootroot00000000000000"""\ Create the benchmark charts. """ import os import csv from decimal import Decimal import pygal def create_chart(title, data, filename): chart = pygal.HorizontalBar(title=title, x_title='Time (ms)', js=(), print_labels=True, show_legend=False) for name, val in data: chart.add(name, val) chart.render_to_file(filename) def create_charts(): color_map = { 'PyQRCode': '#F44336', 'PyQRCodeNG': '#b4750f', 'qrcode': '#3F51B5', 'qrcode path': '#3F51B5', 'qrcode rects': '#26854F', 'qrcodegen': '#009688', 'Segno': '#FFC107', } create_1m_data = [] create_7q_data = [] create_30h_data = [] svg_data = [] png_data = [] with open(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'out', 'results.csv')) as f: reader = csv.reader(f) for row in reader: name, val = row if name.endswith(' create 1-M'): create_1m_data.append((name.replace(' create 1-M', ''), val)) elif name.endswith(' create 7-Q'): create_7q_data.append((name.replace(' create 7-Q', ''), val)) elif name.endswith(' create 30-H'): create_30h_data.append((name.replace(' create 30-H', ''), val)) elif name.endswith(' PNG 1-M'): png_data.append((name.replace(' PNG 1-M', ''), val)) elif ' SVG' in name: svg_data.append((name.replace(' SVG', ''), val)) output_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)), '../docs/_static/') for data, title, filename in ((create_1m_data, 'Create a 1-M QR Code', os.path.join(output_dir, 'chart_create_1m.svg')), (create_7q_data, 'Create a 7-Q QR Code', os.path.join(output_dir, 'chart_create_7q.svg')), (create_30h_data, 'Create a 30-H QR Code', os.path.join(output_dir, 'chart_create_30h.svg')), (svg_data, 'Create a 1-M QR Code and write SVG', os.path.join(output_dir, 'chart_svg.svg')), (png_data, 'Create a 1-M QR Code and write PNG', os.path.join(output_dir, 'chart_png.svg'))): create_chart(title, [(name, [{'value': float(val), 'color': color_map[name], 'label': name}]) for name, val in sorted(data, key=lambda t: Decimal(t[1]))], filename) if __name__ == '__main__': create_charts() segno-1.6.6/sandbox/out/000077500000000000000000000000001476440322300151115ustar00rootroot00000000000000segno-1.6.6/sandbox/out/results.csv000066400000000000000000000004761476440322300173360ustar00rootroot00000000000000qrcodegen create 1-M,2.85 qrcode create 1-M,1.50 Segno create 1-M,1.23 qrcodegen create 7-Q,12.82 qrcode create 7-Q,7.17 Segno create 7-Q,5.80 qrcodegen create 30-H,120.04 qrcode create 30-H,71.66 Segno create 30-H,56.37 qrcode SVG path,2.47 qrcode SVG rects,4.13 Segno SVG,1.48 qrcode PNG 1-M,2.10 Segno PNG 1-M,2.03 segno-1.6.6/segno/000077500000000000000000000000001476440322300137575ustar00rootroot00000000000000segno-1.6.6/segno/__init__.py000066400000000000000000001333421476440322300160760ustar00rootroot00000000000000# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ QR Code and Micro QR Code implementation. "QR Code" and "Micro QR Code" are registered trademarks of DENSO WAVE INCORPORATED. """ import sys import io from . import encoder from .encoder import DataOverflowError from . import writers, utils __version__ = '1.6.6' __all__ = ('make', 'make_qr', 'make_micro', 'make_sequence', 'QRCode', 'QRCodeSequence', 'DataOverflowError') def make(content, error=None, version=None, mode=None, mask=None, encoding=None, eci=False, micro=None, boost_error=True): """\ Creates a (Micro) QR Code. This is main entry point to create QR Codes and Micro QR Codes. Aside from `content`, all parameters are optional and an optimal (minimal) (Micro) QR code with a maximal error correction level is generated. :param content: The data to encode. Either a Unicode string, an integer or bytes. If bytes are provided, the `encoding` parameter should be used to specify the used encoding. :type content: str, int, bytes :param error: Error correction level. If ``None`` (default), error correction level ``L`` is used (note: Micro QR Code version M1 does not support any error correction. If an explicit error correction level is used, a M1 QR code won't be generated). Valid values: ``None`` (allowing generation of M1 codes or use error correction level "L" or better see :paramref:`boost_error `), "L", "M", "Q", "H" (error correction level "H" isn't available for Micro QR Codes). ===================================== =========================== Error correction level Error correction capability ===================================== =========================== L (Segno's default unless version M1) recovers 7% of data M recovers 15% of data Q recovers 25% of data H (not available for Micro QR Codes) recovers 30% of data ===================================== =========================== Higher error levels may require larger QR codes (see also :paramref:`version ` parameter). The `error` parameter is case insensitive. See also the :paramref:`boost_error ` parameter. :type error: str or None :param version: QR Code version. If the value is ``None`` (default), the minimal version which fits for the input data will be used. Valid values: "M1", "M2", "M3", "M4" (for Micro QR codes) or an integer between 1 and 40 (for QR codes). The `version` parameter is case insensitive. :type version: int, str or None :param mode: "numeric", "alphanumeric", "byte", "kanji" or "hanzi". If the value is ``None`` (default) the appropriate mode will automatically be determined. If `version` refers to a Micro QR code, this function may raise a :py:exc:`ValueError` if the provided `mode` is not supported. The `mode` parameter is case insensitive. ============ ======================= Mode (Micro) QR Code Version ============ ======================= numeric 1 - 40, M1, M2, M3, M4 alphanumeric 1 - 40, M2, M3, M4 byte 1 - 40, M3, M4 kanji 1 - 40, M3, M4 hanzi 1 - 40 ============ ======================= .. note:: The Hanzi mode may not be supported by all QR code readers since it is not part of ISO/IEC 18004:2015(E). For this reason, this mode must be specified explicitly by the user:: import segno qrcode = segno.make('书读百遍其义自现', mode='hanzi') :type mode: str or None :param mask: Data mask. If the value is ``None`` (default), the appropriate data mask is chosen automatically. If the `mask` parameter is provided, this function may raise a :py:exc:`ValueError` if the mask is invalid. :type mask: int or None :param encoding: Indicates the encoding in mode "byte". By default (`encoding` is ``None``) the implementation tries to use the standard conform ISO/IEC 8859-1 encoding and if it does not fit, it will use UTF-8. Note that no ECI mode indicator is inserted by default (see :paramref:`eci `). The `encoding` parameter is case insensitive. :type encoding: str or None :param bool eci: Indicates if binary data which does not use the default encoding (ISO/IEC 8859-1) should enforce the ECI mode. Since a lot of QR code readers do not support the ECI mode, this feature is disabled by default and the data is encoded in the provided `encoding` using the usual "byte" mode. Set `eci` to ``True`` if an ECI header should be inserted into the QR Code. Note that the implementation may not know the ECI designator for the provided `encoding` and may raise an exception if the ECI designator cannot be found. The ECI mode is not supported by Micro QR Codes. :param micro: If :paramref:`version ` is ``None`` (default) this parameter can be used to allow the creation of a Micro QR code. If set to ``False``, a QR code is generated. If set to ``None`` (default) a Micro QR code may be generated if applicable. If set to ``True`` the algorithm generates a Micro QR Code or raises an exception if the `mode` is not compatible or the `content` is too large for Micro QR codes. :type micro: bool or None :param bool boost_error: Indicates if the error correction level may be increased if it does not affect the version (default: ``True``). If set to ``True``, the :paramref:`error ` parameter is interpreted as minimum error level. If set to ``False``, the resulting (Micro) QR code uses the provided `error` level (or the default error correction level, if error is ``None``) :raises: :py:exc:`ValueError` or :py:exc:`DataOverflowError`: In case the data does not fit into a (Micro) QR Code or it does not fit into the provided :paramref:`version`. :rtype: QRCode """ return QRCode(encoder.encode(content, error, version, mode, mask, encoding, eci, micro, boost_error=boost_error)) def make_qr(content, error=None, version=None, mode=None, mask=None, encoding=None, eci=False, boost_error=True): """\ Creates a QR code (never a Micro QR code). See :py:func:`make` for a description of the parameters. :rtype: QRCode """ return make(content, error=error, version=version, mode=mode, mask=mask, encoding=encoding, eci=eci, micro=False, boost_error=boost_error) def make_micro(content, error=None, version=None, mode=None, mask=None, encoding=None, boost_error=True): """\ Creates a Micro QR code. See :py:func:`make` for a description of the parameters. Note: Error correction level "H" isn't available for Micro QR codes. If used, this function raises a :py:class:`segno.ErrorLevelError`. :rtype: QRCode """ return make(content, error=error, version=version, mode=mode, mask=mask, encoding=encoding, micro=True, boost_error=boost_error) def make_sequence(content, error=None, version=None, mode=None, mask=None, encoding=None, boost_error=True, symbol_count=None): """\ Creates a sequence of QR codes using the Structured Append mode. If the content fits into one QR code and neither ``version`` nor ``symbol_count`` is provided, this function may return a sequence with one QR Code which does not use the Structured Append mode. Otherwise a sequence of 2 .. n (max. n = 16) QR codes is returned which use the Structured Append mode. The Structured Append mode allows to split the content over a number (max. 16) QR Codes. The Structured Append mode isn't available for Micro QR Codes, therefor the returned sequence contains QR codes, only. Since this function returns an iterable object, it may be used as follows: .. code-block:: python for i, qrcode in enumerate(segno.make_sequence(data, symbol_count=2)): qrcode.save('seq-%d.svg' % i, scale=10, color='darkblue') The number of QR codes is determined by the `version` or `symbol_count` parameter. See :py:func:`make` for a description of the other parameters. :param int symbol_count: Number of symbols. :rtype: QRCodeSequence """ return QRCodeSequence(map(QRCode, encoder.encode_sequence(content, error=error, version=version, mode=mode, mask=mask, encoding=encoding, boost_error=boost_error, symbol_count=symbol_count))) class QRCode: """\ Represents a (Micro) QR Code. """ __slots__ = ('_error', '_matrix_size', '_mode', '_version', 'mask', 'matrix') def __init__(self, code): """\ Initializes the QR Code object. :param code: An object with a ``matrix``, ``version``, ``error``, ``mask`` and ``segments`` attribute. """ matrix = code.matrix self.matrix = matrix """Returns the matrix. :rtype: tuple of :py:class:`bytearray` instances. """ self.mask = code.mask """Returns the data mask pattern reference :rtype: int """ self._matrix_size = len(matrix[0]), len(matrix) self._version = code.version self._error = code.error self._mode = code.segments[0].mode if len(code.segments) == 1 else None @property def version(self): """\ (Micro) QR Code version. Either a string ("M1", "M2", "M3", "M4") or an integer in the range of 1 .. 40. :rtype: str or int """ return encoder.get_version_name(self._version) @property def error(self): """\ Error correction level; either a string ("L", "M", "Q", "H") or ``None`` if the QR code provides no error correction (Micro QR Code version M1) :rtype: str """ if self._error is None: return None return encoder.get_error_name(self._error) @property def mode(self): """\ String indicating the mode ("numeric", "alphanumeric", "byte", "kanji", or "hanzi"). May be ``None`` if multiple modes are used. :rtype: str or None """ if self._mode is not None: return encoder.get_mode_name(self._mode) return None @property def designator(self): """\ Returns the version and error correction level as string `V-E` where `V` represents the version number and `E` the error level. :rtype: str """ version = str(self.version) return '-'.join((version, self.error) if self.error else (version,)) @property def default_border_size(self): """\ Indicates the default border size aka quiet zone. QR Codes have a quiet zone of four light modules, while Micro QR Codes have a quiet zone of two light modules. :rtype: int """ return utils.get_default_border_size(self._matrix_size) @property def is_micro(self): """\ Indicates if this QR code is a Micro QR code :rtype: bool """ return self._version < 1 def __eq__(self, other): return self.__class__ == other.__class__ and self.matrix == other.matrix __hash__ = None def symbol_size(self, scale=1, border=None): """\ Returns the symbol size (width x height) with the provided border and scaling factor. :param scale: Indicates the size of a single module (default: 1). The size of a module depends on the used output format; i.e. in a PNG context, a scaling factor of 2 indicates that a module has a size of 2 x 2 pixel. Some outputs (i.e. SVG) accept floating point values. :type scale: int or float :param int border: The border size or ``None`` to specify the default quiet zone (4 for QR Codes, 2 for Micro QR Codes). :rtype: tuple (width, height) """ return utils.get_symbol_size(self._matrix_size, scale=scale, border=border) def matrix_iter(self, scale=1, border=None, verbose=False): """\ Returns an iterator over the matrix which includes the border. The border is returned as sequence of light modules. Dark modules are reported as ``0x1``, light modules have the value ``0x0``. The following example converts the QR code matrix into a list of lists which use boolean values for the modules (True = dark module, False = light module):: >>> import segno >>> qrcode = segno.make('The Beatles') >>> width, height = qrcode.symbol_size(scale=2) >>> res = [] >>> # Scaling factor 2, default border >>> for row in qrcode.matrix_iter(scale=2): >>> res.append([col == 0x1 for col in row]) >>> width == len(res[0]) True >>> height == len(res) True If `verbose` is ``True``, the iterator returns integer constants which indicate the type of the module, i.e. ``segno.consts.TYPE_FINDER_PATTERN_DARK``, ``segno.consts.TYPE_FINDER_PATTERN_LIGHT``, ``segno.consts.TYPE_QUIET_ZONE`` etc. To check if the returned module type is dark or light, use:: if mt >> 8: print('dark module') if not mt >> 8: print('light module') :param int scale: The scaling factor (default: ``1``). :param int border: The size of border / quiet zone or ``None`` to indicate the default border. :param bool verbose: Indicates if the type of the module should be returned instead of ``0x1`` and ``0x0`` values. See :py:mod:`segno.consts` for the return values. This feature is currently in EXPERIMENTAL state. :raises: :py:exc:`ValueError` if the scaling factor or the border is invalid (i.e. negative). """ iterfn = utils.matrix_iter_verbose if verbose else utils.matrix_iter return iterfn(self.matrix, self._matrix_size, scale, border) def show(self, delete_after=20, scale=10, border=None, dark='#000', light='#fff'): # pragma: no cover """\ Displays this QR code. This method is mainly intended for debugging purposes. This method saves the QR code as an image (by default with a scaling factor of 10) to a temporary file and opens it with the standard PNG viewer application or within the standard webbrowser. The temporary file is deleted afterwards (unless :paramref:`delete_after ` is set to ``None``). If this method does not show any result, try to increase the :paramref:`delete_after ` value or set it to ``None`` :param delete_after: Time in seconds to wait till the temporary file is deleted. :type delete_after: int or None :param int scale: Integer indicating the size of a single module. :param border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used. :type border: int or None :param dark: The color of the dark modules (default: black). :param light: The color of the light modules (default: white). """ import os import time import tempfile import webbrowser import threading from urllib.parse import urljoin from urllib.request import pathname2url def delete_file(name): time.sleep(delete_after) try: os.unlink(name) except OSError: pass f = tempfile.NamedTemporaryFile('wb', suffix='.png', delete=False) try: self.save(f, scale=scale, dark=dark, light=light, border=border) except: f.close() os.unlink(f.name) raise f.close() webbrowser.open_new_tab(urljoin('file:', pathname2url(f.name))) if delete_after is not None: t = threading.Thread(target=delete_file, args=(f.name,)) t.start() def svg_data_uri(self, xmldecl=False, encode_minimal=False, omit_charset=False, nl=False, **kw): """\ Converts the QR code into an SVG data URI. The XML declaration is omitted by default (set :paramref:`xmldecl ` to ``True`` to enable it), further the newline is omitted by default (set ``nl`` to ``True`` to enable it). Aside from the missing `out` parameter, the different `xmldecl` and `nl` default values, and the additional parameters :paramref:`encode_minimal ` and :paramref:`omit_charset `, this method uses the same parameters as the usual SVG serializer, see :py:func:`save` and the available `SVG parameters <#svg>`_ .. note:: In order to embed a SVG image in HTML without generating a file, the :py:func:`svg_inline` method could serve better results, as it usually produces a smaller output. :param bool xmldecl: Indicates if the XML declaration should be serialized (default: ``False``) :param bool encode_minimal: Indicates if the resulting data URI should use minimal percent encoding (disabled by default). :param bool omit_charset: Indicates if the ``;charset=...`` should be omitted (disabled by default) :param bool nl: Indicates if the document should have a trailing newline (default: ``False``) :rtype: str """ return writers.as_svg_data_uri(self.matrix, self._matrix_size, xmldecl=xmldecl, nl=nl, encode_minimal=encode_minimal, omit_charset=omit_charset, **kw) def svg_inline(self, **kw): """\ Returns an SVG representation which is embeddable into HTML5 contexts. Due to the fact that HTML5 directly supports SVG, various elements of an SVG document can or should be suppressed (i.e. the XML declaration and the SVG namespace). This method returns a string that can be used in an HTML context. This method uses the same parameters as the usual SVG serializer, see :py:func:`save` and the available `SVG parameters <#svg>`_ (the ``out`` and ``kind`` parameters are not supported). The returned string can be used directly in `Jinja `_ and `Django `_ templates, provided the ``safe`` filter is used which marks a string as not requiring further HTML escaping prior to output. ::
{{ qr.svg_inline(dark='#228b22', scale=3) | safe }}
:rtype: str """ buff = io.BytesIO() self.save(buff, kind='svg', xmldecl=False, svgns=False, nl=False, **kw) return buff.getvalue().decode(kw.get('encoding', 'utf-8')) def png_data_uri(self, **kw): """\ Converts the QR code into a PNG data URI. Uses the same keyword parameters as the usual PNG serializer, see :py:func:`save` and the available `PNG parameters <#png>`_ :rtype: str """ return writers.as_png_data_uri(self.matrix, self._matrix_size, **kw) def terminal(self, out=None, border=None, compact=False): """\ Serializes the matrix as ANSI escape code or Unicode Block Elements (if ``compact`` is ``True``). Under Windows, no ANSI escape sequence is generated but the Windows API is used *unless* :paramref:`out ` is a writable object or using WinAPI fails or if ``compact`` is ``True``. :param out: Filename or a file-like object supporting to write text. If ``None`` (default), the matrix is written to :py:class:`sys.stdout`. :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param bool compact: Indicates if a more compact QR code should be shown (default: ``False``). """ if compact: writers.write_terminal_compact(self.matrix, self._matrix_size, out or sys.stdout, border) elif out is None and sys.platform == 'win32': # pragma: no cover # Windows < 10 does not support ANSI escape sequences, try to # call the a Windows specific terminal output which uses the # Windows API. try: writers.write_terminal_win(self.matrix, self._matrix_size, border) except OSError: # Use the standard output even if it may print garbage writers.write_terminal(self.matrix, self._matrix_size, sys.stdout, border) else: writers.write_terminal(self.matrix, self._matrix_size, out or sys.stdout, border) def save(self, out, kind=None, **kw): """\ Serializes the QR code in one of the supported formats. The serialization format depends on the filename extension. .. _common_keywords: **Common keywords** ========== ============================================================== Name Description ========== ============================================================== scale Integer or float indicating the size of a single module. Default: 1. The interpretation of the scaling factor depends on the serializer. For pixel-based output (like :ref:`PNG `) the scaling factor is interpreted as pixel-size (1 = 1 pixel). :ref:`EPS ` interprets ``1`` as 1 point (1/72 inch) per module. Some serializers (like :ref:`SVG `) accept float values. If the serializer does not accept float values, the value will be converted to an integer value (note: int(1.6) == 1). border Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR codes, ``2`` for a Micro QR codes). A value of ``0`` indicates that border should be omitted. dark A string or tuple representing a color value for the dark modules. The default value is "black". The color can be provided as ``(R, G, B)`` tuple, as web color name (like "red") or in hexadecimal format (``#RGB`` or ``#RRGGBB``). Some serializers (i.e. :ref:`SVG ` and :ref:`PNG `) accept an alpha transparency value like ``#RRGGBBAA``. light A string or tuple representing a color for the light modules. See `dark` for valid values. The default value depends on the serializer. :ref:`SVG ` uses no color (``None``) for light modules by default, other serializers, like :ref:`PNG `, use "white" as default light color. ========== ============================================================== .. _module_colors: **Module Colors** =============== ======================================================= Name Description =============== ======================================================= finder_dark Color of the dark modules of the finder patterns Default: undefined, use value of "dark" finder_light Color of the light modules of the finder patterns Default: undefined, use value of "light" data_dark Color of the dark data modules Default: undefined, use value of "dark" data_light Color of the light data modules. Default: undefined, use value of "light". version_dark Color of the dark modules of the version information. Default: undefined, use value of "dark". version_light Color of the light modules of the version information, Default: undefined, use value of "light". format_dark Color of the dark modules of the format information. Default: undefined, use value of "dark". format_light Color of the light modules of the format information. Default: undefined, use value of "light". alignment_dark Color of the dark modules of the alignment patterns. Default: undefined, use value of "dark". alignment_light Color of the light modules of the alignment patterns. Default: undefined, use value of "light". timing_dark Color of the dark modules of the timing patterns. Default: undefined, use value of "dark". timing_light Color of the light modules of the timing patterns. Default: undefined, use value of "light". separator Color of the separator. Default: undefined, use value of "light". dark_module Color of the dark module (a single dark module which occurs in all QR Codes but not in Micro QR Codes. Default: undefined, use value of "dark". quiet_zone Color of the quiet zone / border. Default: undefined, use value of "light". =============== ======================================================= .. _svg: **Scalable Vector Graphics (SVG)** All :ref:`common keywords ` and :ref:`module colors ` are supported. ================ ============================================================== Name Description ================ ============================================================== out Filename or :py:class:`io.BytesIO` kind "svg" or "svgz" (to create a gzip compressed SVG) scale integer or float dark Default: "#000" (black) ``None`` is a valid value. If set to ``None``, the resulting path won't have a "stroke" attribute. The "stroke" attribute may be defined via CSS (external). If an alpha channel is defined, the output depends of the used SVG version. For SVG versions >= 2.0, the "stroke" attribute will have a value like "rgba(R, G, B, A)", otherwise the path gets another attribute "stroke-opacity" to emulate the alpha channel. To minimize the document size, the SVG serializer uses automatically the shortest color representation: If a value like "#000000" is provided, the resulting document will have a color value of "#000". If the color is "#FF0000", the resulting color is not "#F00", but the web color name "red". light Default value ``None``. If this parameter is set to another value, the resulting image will have another path which is used to define the color of the light modules. If an alpha channel is used, the resulting path may have a "fill-opacity" attribute (for SVG version < 2.0) or the "fill" attribute has a "rgba(R, G, B, A)" value. xmldecl Boolean value (default: ``True``) indicating whether the document should have an XML declaration header. Set to ``False`` to omit the header. svgns Boolean value (default: ``True``) indicating whether the document should have an explicit SVG namespace declaration. Set to ``False`` to omit the namespace declaration. The latter might be useful if the document should be embedded into a HTML 5 document where the SVG namespace is implicitly defined. title String (default: ``None``) Optional title of the generated SVG document. desc String (default: ``None``) Optional description of the generated SVG document. svgid A string indicating the ID of the SVG document (if set to ``None`` (default), the SVG element won't have an ID). svgclass Default: "segno". The CSS class of the SVG document (if set to ``None``, the SVG element won't have a class). lineclass Default: "qrline". The CSS class of the path element (which draws the dark modules (if set to ``None``, the path won't have a class). omitsize Indicates if width and height attributes should be omitted (default: ``False``). If these attributes are omitted, a ``viewBox`` attribute will be added to the document. unit Default: ``None`` Indicates the unit for width / height and other coordinates. By default, the unit is unspecified and all values are in the user space. Valid values: em, ex, px, pt, pc, cm, mm, in, and percentages (any string is accepted, this parameter is not validated by the serializer) encoding Encoding of the XML document. "utf-8" by default. svgversion SVG version (default: ``None``). If specified (a float), the resulting document has an explicit "version" attribute. If set to ``None``, the document won't have a "version" attribute. This parameter is not validated. compresslevel Default: 9. This parameter is only valid, if a compressed SVG document should be created (file extension "svgz"). 1 is fastest and produces the least compression, 9 is slowest and produces the most. 0 is no compression. draw_transparent Indicates if transparent SVG paths should be added to the graphic (default: ``False``) nl Indicates if the document should have a trailing newline (default: ``True``) ================ ============================================================== .. _png: **Portable Network Graphics (PNG)** This writes either a grayscale (maybe with transparency) PNG (color type 0) or a palette-based (maybe with transparency) image (color type 3). If the dark / light values are ``None``, white or black, the serializer chooses the more compact grayscale mode, in all other cases a palette-based image is written. All :ref:`common keywords ` and :ref:`module colors ` are supported. =============== ============================================================== Name Description =============== ============================================================== out Filename or :py:class:`io.BytesIO` kind "png" scale integer dark Default: "#000" (black) ``None`` is a valid value iff light is not ``None``. If set to ``None``, the dark modules become transparent. light Default value "#fff" (white) See keyword "dark" for further details. compresslevel Default: 9. Integer indicating the compression level for the ``IDAT`` (data) chunk. 1 is fastest and produces the least compression, 9 is slowest and produces the most. 0 is no compression. dpi Default: ``None``. Specifies the DPI value for the image. By default, the DPI value is unspecified. Please note that the DPI value is converted into meters (maybe with rounding errors) since PNG does not support the unit "dots per inch". =============== ============================================================== .. _eps: **Encapsulated PostScript (EPS)** All :ref:`common keywords ` are supported. ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.StringIO` kind "eps" scale integer or float dark Default: "#000" (black) light Default value: ``None`` (transparent light modules) ============= ============================================================== .. _pdf: **Portable Document Format (PDF)** All :ref:`common keywords ` are supported. ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.BytesIO` kind "pdf" scale integer or float dark Default: "#000" (black) light Default value: ``None`` (transparent light modules) compresslevel Default: 9. Integer indicating the compression level. 1 is fastest and produces the least compression, 9 is slowest and produces the most. 0 is no compression. ============= ============================================================== .. _txt: **Text (TXT)** Aside of "scale", all :ref:`common keywords ` are supported. ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.StringIO` kind "txt" dark Default: "1" light Default: "0" ============= ============================================================== .. _ansi: **ANSI escape code** Supports the "border" keyword, only! ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.StringIO` kind "ans" ============= ============================================================== .. _pbm: **Portable Bitmap (PBM)** All :ref:`common keywords ` are supported. ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.BytesIO` kind "pbm" scale integer plain Default: False. Boolean to switch between the P4 and P1 format. If set to ``True``, the (outdated) P1 serialization format is used. ============= ============================================================== .. _pam: **Portable Arbitrary Map (PAM)** All :ref:`common keywords ` are supported. ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.BytesIO` kind "pam" scale integer dark Default: "#000" (black). light Default value "#fff" (white). Use ``None`` for transparent light modules. ============= ============================================================== .. _ppm: **Portable Pixmap (PPM)** All :ref:`common keywords ` and :ref:`module colors ` are supported. ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.BytesIO` kind "ppm" scale integer dark Default: "#000" (black). light Default value "#fff" (white). ============= ============================================================== .. _latex: **LaTeX / PGF/TikZ** To use the output of this serializer, the ``PGF/TikZ`` (and optionally ``hyperref``) package is required in the LaTeX environment. The serializer itself does not depend on any external packages. All :ref:`common keywords ` are supported. ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.StringIO` kind "tex" scale integer or float dark LaTeX color name (default: "black"). The color is written "at it is", please ensure that the color is a standard color or it has been defined in the enclosing LaTeX document. url Default: ``None``. Optional URL where the QR code should point to. Requires the ``hyperref`` package in the LaTeX environment. ============= ============================================================== .. _xbm: **X BitMap (XBM)** All :ref:`common keywords ` are supported. ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.StringIO` kind "xbm" scale integer name Name of the variable (default: "img") ============= ============================================================== .. _xpm: **X PixMap (XPM)** All :ref:`common keywords ` are supported. ============= ============================================================== Name Description ============= ============================================================== out Filename or :py:class:`io.StringIO` kind "xpm" scale integer dark Default: "#000" (black). ``None`` indicates transparent dark modules. light Default value "#fff" (white) ``None`` indicates transparent light modules. name Name of the variable (default: "img") ============= ============================================================== :param out: A filename or a writable file-like object with a ``name`` attribute. Use the :paramref:`kind ` parameter if `out` is a :py:class:`io.BytesIO` or :py:class:`io.StringIO` stream which don't have a ``name`` attribute. :param str kind: Default ``None``. If the desired output format cannot be determined from the :paramref:`out ` parameter, this parameter can be used to indicate the serialization format (i.e. "svg" to enforce SVG output). The value is case insensitive. :param kw: Any of the supported keywords by the specific serializer. """ writers.save(self.matrix, self._matrix_size, out, kind, **kw) def __getattr__(self, name): """\ This is used to plug-in external serializers. When a "to_" method is invoked, this method tries to find a ``segno.plugin.converter`` plugin with the provided ````. If such a plugin exists, a callable function is returned. The result of invoking the function depends on the plugin. """ if name.startswith('to_'): try: # Try to use the 3rd party lib first. This is required for # Python versions < 3.10 import importlib_metadata as metadata except ImportError: from importlib import metadata from functools import partial for ep in metadata.entry_points(group='segno.plugin.converter', name=name[3:]): plugin = ep.load() return partial(plugin, self) raise AttributeError(f'{self.__class__} object has no attribute {name}') class QRCodeSequence(tuple): """\ Represents a sequence of 1 .. n (max. n = 16) :py:class:`QRCode` instances. Iff this sequence contains only one item, it behaves like :py:class:`QRCode`. """ __slots__ = () def __new__(cls, qrcodes): return super().__new__(cls, qrcodes) def terminal(self, out=None, border=None, compact=False): """\ Serializes the sequence of QR codes as ANSI escape code. See :py:meth:`QRCode.terminal()` for details. """ for qrcode in self: qrcode.terminal(out=out, border=border, compact=compact) def save(self, out, kind=None, **kw): """\ Saves the sequence of QR codes to `out`. If `out` is a filename, this method modifies the filename and adds ``-`` to it. ``structured-append.svg`` becomes (if the sequence contains two QR codes): ``structured-append-02-01.svg`` and ``structured-append-02-02.svg`` Please note that using a file or file-like object may result into an invalid serialization format since all QR codes are written to the same output. See :py:meth:`QRCode.save()` for a detailed enumeration of options. """ filename = lambda o, n: o # noqa: E731 m = len(self) if m > 1 and isinstance(out, str): dot_idx = out.rfind('.') if dot_idx > -1: out = out[:dot_idx] + '-{0:02d}-{1:02d}' + out[dot_idx:] filename = lambda o, n: o.format(m, n) # noqa: E731 for n, qrcode in enumerate(self, start=1): qrcode.save(filename(out, n), kind=kind, **kw) def __getattr__(self, item): """\ Behaves like :py:class:`QRCode` iff this sequence contains a single item. """ if len(self) == 1: return getattr(self[0], item) raise AttributeError(f"{self.__class__} object has no attribute '{item}'") ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/segno/__init__.pyi����������������������������������������������������������������������0000664�0000000�0000000�00000006554�14764403223�0016253�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from typing import Any, AnyStr, Callable, IO, TextIO from collections.abc import Iterator, Iterable from .encoder import DataOverflowError as DataOverflowError __version__ : str def make(content: int | str | bytes, error: str | None = None, version: int | str | None = None, mode: str | None = None, mask: int | None = None, encoding: str | None = None, eci: bool = False, micro: bool | None = None, boost_error: bool = True) -> QRCode: ... def make_qr(content: int | str | bytes, error: str | None = None, version: int | str | None = None, mode: str | None = None, mask: int | None = None, encoding: str | None = None, eci: bool = False, boost_error: bool = True) -> QRCode: ... def make_micro(content: int | str | bytes, error: str | None = None, version: int | str | None = None, mode: str | None = None, mask: int | None = None, encoding: str | None = None, boost_error: bool = True) -> QRCode: ... def make_sequence(content: int | str | bytes, error: str | None = None, version: int | str | None = None, mode: str | None = None, mask: int | None = None, encoding: str | None = None, boost_error: bool = True, symbol_count: int | None = None) -> QRCodeSequence: ... class QRCode: matrix: tuple[bytearray, ...] mask: int @property def version(self) -> int | str: ... @property def error(self) -> str: ... @property def mode(self) -> str | None: ... @property def designator(self) -> str: ... @property def default_border_size(self) -> int: ... @property def is_micro(self) -> bool: ... def symbol_size(self, scale: int | float = 1, border: int | None = None) -> tuple[int | float, int | float]: ... def matrix_iter(self, scale: int | float = 1, border: int | None = None, verbose: bool = False) -> Iterator[Iterable[int]]: ... def show(self, delete_after: int | float = 20, scale: int | float = 10, border: int | None = None, dark: tuple | str = '#000', light: tuple | str = '#fff') -> None: ... def svg_data_uri(self, xmldecl: bool = False, encode_minimal: bool = False, omit_charset: bool = False, nl: bool = False, **kw: Any) -> str: ... def svg_inline(self, **kw: Any) -> str: ... def png_data_uri(self, **kw: Any) -> str: ... def terminal(self, out: TextIO | str | None = None, border: int | None = None, compact: bool = False) -> None: ... def save(self, out: IO[AnyStr] | str, kind: str | None = None, **kw: Any) -> None: ... def __getattr__(self, name: Any) -> Callable | None: ... def __eq__(self, other: Any) -> bool: ... __hash__: Any = None class QRCodeSequence(tuple): def terminal(self, out: TextIO | str | None = None, border: int | None = None, compact: bool = False) -> None: ... def save(self, out: IO[AnyStr] | str, kind: str | None = None, **kw: Any) -> None: ... def __getattr__(self, name: Any) -> Callable | None: ... ����������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/segno/cli.py����������������������������������������������������������������������������0000664�0000000�0000000�00000036061�14764403223�0015106�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env python # # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # # type: ignore """\ Command line script to generate (Micro) QR codes with Segno. "QR Code" and "Micro QR Code" are registered trademarks of DENSO WAVE INCORPORATED. """ import os import sys import argparse import segno from segno import writers # file extension to supported keywords mapping _EXT_TO_KW_MAPPING = {} def _get_args(func): func_code = func.__code__ args = func_code.co_varnames[:func_code.co_argcount] return args[-len(func.__defaults__):] for ext, func in writers._VALID_SERIALIZERS.items(): kws = set(_get_args(func)) try: kws.update(_get_args(func.__wrapped__)) except AttributeError: pass _EXT_TO_KW_MAPPING[ext] = frozenset(kws) del writers def make_parser(): """\ Returns the command line parser. """ def _convert_scale(val): val = float(val) return val if val != int(val) else int(val) parser = argparse.ArgumentParser(prog='segno', description=f'Segno QR Code and Micro QR Code generator version {segno.__version__}') # noqa: E501 parser.add_argument('--version', '-v', help='(Micro) QR Code version: 1 .. 40 or "M1", "M2", "M3", "M4"', required=False,) parser.add_argument('--error', '-e', help='Error correction level: "L": 7%% (default), "M": 15%%, "Q": 25%%, ' '"H": 30%%, "-": no error correction (used for M1 symbols)', choices=('L', 'M', 'Q', 'H', '-'), default=None, type=lambda x: x.upper()) parser.add_argument('--mode', '-m', help='Mode. If unspecified (default), an optimal mode is chosen for the given ' 'input.', choices=('numeric', 'alphanumeric', 'byte', 'kanji', 'hanzi'), default=None, type=lambda x: x.lower()) parser.add_argument('--encoding', help='Sets the encoding of the input. ' 'If not set (default), a minimal encoding is chosen.', default=None) parser.add_argument('--micro', help='Allow the creation of Micro QR Codes', dest='micro', action='store_true') parser.add_argument('--no-micro', help='Disallow creation of Micro QR Codes (default)', dest='micro', action='store_false') parser.add_argument('--pattern', '-p', help='Mask pattern to use. ' 'If unspecified (default), an optimal mask pattern is used. ' 'Valid values for QR Codes: 0 .. 7. ' 'Valid values for Micro QR Codes: 0 .. 3', required=False, default=None, type=int) parser.add_argument('--no-error-boost', help='Disables the automatic error correction level incrementation. ' 'By default, the maximal error correction level is used ' '(without changing the version).', dest='boost_error', action='store_false') parser.add_argument('--seq', help='Creates a sequence of QR Codes (Structured Append mode). ' 'Version or symbol count must be provided', dest='seq', action='store_true') parser.add_argument('--symbol-count', '-sc', help='Number of symbols to create', default=None, type=int) parser.add_argument('--border', '-b', help='Size of the border / quiet zone of the output. ' 'By default, the standard border (4 modules for QR Codes, ' '2 modules for Micro QR Codes) will be used. ' 'A value of 0 omits the border', default=None, type=int) parser.add_argument('--scale', '-s', help='Scaling factor. By default, a scaling factor of 1 is used. ' 'That may lead into too small images. ' 'Some output formats, i.e. SVG, accept a decimal value.', default=1, type=_convert_scale) parser.add_argument('--output', '-o', help='Output file. If not specified, the QR Code is printed to the terminal', required=False) color_group = parser.add_argument_group('Module Colors', 'Arguments to specify the module colors. ' 'Multiple colors are supported for SVG and PNG. ' 'The module color support varies between the ' 'serialization formats. ' 'Most serializers support at least "--dark" and "--light". ' # noqa: E501 'Unsupported arguments are ignored.') color_group.add_argument('--dark', help='Color of the dark modules. ' 'The color may be specified as web color name, i.e. "red" or ' 'as hexadecimal value, i.e. "#0033cc". ' 'Some serializers, i.e. SVG and PNG, support alpha channels ' '(8-digit hexadecimal value) and some support "transparent" / "trans" as ' 'color value for alpha transparency. ' 'The standard color is black.') color_group.add_argument('--light', help='Color of the light modules. ' 'See "dark" for a description of possible values. ' 'The standard light color is white.') color_group.add_argument('--finder-dark', help='Sets the color of the dark finder modules') color_group.add_argument('--finder-light', help='Sets the color of the light finder modules') color_group.add_argument('--separator', help='Sets the color of the separator modules') color_group.add_argument('--data-dark', help='Sets the color of the dark data modules') color_group.add_argument('--data-light', help='Sets the color of the light data modules') color_group.add_argument('--timing-dark', help='Sets the color of the dark timing modules') color_group.add_argument('--timing-light', help='Sets the color of the light timing modules') color_group.add_argument('--align-dark', help='Sets the color of the dark alignment modules', dest='alignment_dark', ) color_group.add_argument('--align-light', help='Sets the color of the light alignment modules', dest='alignment_light', ) color_group.add_argument('--quiet-zone', help='Sets the color of the quiet zone (border)') color_group.add_argument('--dark-module', help='Sets the color of the dark module') color_group.add_argument('--format-dark', help='Sets the color of the dark format information modules') color_group.add_argument('--format-light', help='Sets the color of the light format information modules') color_group.add_argument('--version-dark', help='Sets the color of the dark version information modules') color_group.add_argument('--version-light', help='Sets the color of the light version information modules') # SVG svg_group = parser.add_argument_group('SVG', 'SVG specific options') svg_group.add_argument('--no-classes', help='Omits the (default) SVG classes', action='store_true') svg_group.add_argument('--no-xmldecl', help='Omits the XML declaration header', dest='xmldecl', action='store_false') svg_group.add_argument('--no-namespace', help='Indicates that the SVG document should have no SVG namespace ' 'declaration', dest='svgns', action='store_false') svg_group.add_argument('--no-newline', help='Indicates that the SVG document should have no trailing newline', dest='nl', action='store_false') svg_group.add_argument('--title', help='Specifies the title of the SVG document') svg_group.add_argument('--desc', help='Specifies the description of the SVG document') svg_group.add_argument('--svgid', help='Indicates the ID of the element') svg_group.add_argument('--svgclass', help='Indicates the CSS class of the element. ' 'An empty string omits the attribute.') svg_group.add_argument('--lineclass', help='Indicates the CSS class of the elements. ' 'An empty string omits the attribute.') svg_group.add_argument('--no-size', help='Indicates that the SVG document should not have "width" and "height" ' 'attributes', dest='omitsize', action='store_true') svg_group.add_argument('--unit', help='Indicates SVG coordinate system unit') svg_group.add_argument('--svgversion', help='Indicates the SVG version', type=float) svg_group.add_argument('--svgencoding', help='Specifies the encoding of the document', default='utf-8') svg_group.add_argument('--draw-transparent', help='Indicates that transparent paths should be drawn', action='store_true') # PNG png_group = parser.add_argument_group('PNG', 'PNG specific options') png_group.add_argument('--dpi', help='Sets the DPI value of the PNG file', type=int) # Terminal terminal_group = parser.add_argument_group('Terminal', 'Terminal specific options') terminal_group.add_argument('--compact', help='Indicates that the QR code should be printed in a more compact manner', # noqa: E501 action='store_true') # Show Segno's version --version and -v are taken by QR Code version parser.add_mutually_exclusive_group().add_argument('--ver', '-V', help="Shows Segno's version", action='version', version=f'Segno {segno.__version__}') parser.add_argument('content', nargs='+', help='The content to encode') return parser def parse(args): """\ Parses the arguments and returns the result. """ parser = make_parser() if not len(args): parser.print_help() sys.exit(1) parsed_args = parser.parse_args(args) if parsed_args.error == '-': parsed_args.error = None # 'micro' is False by default. If version is set to a Micro QR Code version, # encoder.encode raises a VersionError. # Small problem: --version=M4 --no-micro is allowed version = parsed_args.version if version is not None: version = str(version).upper() if not parsed_args.micro and version in ('M1', 'M2', 'M3', 'M4'): parsed_args.micro = None return _AttrDict(vars(parsed_args)) def build_config(config, filename=None): """\ Builds a configuration and returns it. The config contains only keywords which are supported by the serializer. Unsupported values are removed. :param dict config: The configuration / dict returned by the :py:func:`parse` function. :param filename: Optional filename. If not ``None`` (default), the `filename` must provide a supported extension to identify the serializer. :return: A (maybe) modified configuration. """ # Done here since it seems not to be possible to detect if an argument # was supplied by the user or if it's the default argument. # If using type=lambda v: None if v in ('transparent', 'trans') else v # we cannot detect if "None" comes from "transparent" or the default value for clr in ('dark', 'light', 'finder_dark', 'finder_light', 'format_dark', 'format_light', 'alignment_dark', 'alignment_light', 'timing_dark', 'timing_light', 'data_dark', 'data_light', 'version_dark', 'version_light', 'quiet_zone', 'dark_module', 'separator'): val = config.pop(clr, None) if val in ('transparent', 'trans'): config[clr] = None elif val: config[clr] = val # SVG for name in ('svgid', 'svgclass', 'lineclass'): if config.get(name, None) is None: config.pop(name, None) if config.pop('no_classes', False): config['svgclass'] = None config['lineclass'] = None # encoding is used to provide the encoding to *create* a QR code config['encoding'] = config.pop('svgencoding', 'utf-8') if filename is not None: ext = filename[filename.rfind('.') + 1:].lower() if ext == 'svgz': # There is no svgz serializer, use same config as svg ext = 'svg' supported_args = _EXT_TO_KW_MAPPING.get(ext, ()) # Drop unsupported arguments from config rather than getting a # "unsupported keyword" exception config = {k: config[k] for k in config if k in supported_args} return config def make_code(config): """\ Creates the (Micro) QR Code (Sequence). Configuration parameters used for creating the Micro QR Code, QR Code or QR Code Sequence are removed from the configuration. :param config: Configuration, see :py:func:`build_config` :return: :py:class:`segno.QRCode` or :py:class:`segno.QRCodeSequence`. """ make = segno.make kw = dict(mode=config.pop('mode'), error=config.pop('error'), version=config.pop('version'), mask=config.pop('pattern'), encoding=config.pop('encoding'), boost_error=config.pop('boost_error')) if config.pop('seq'): make = segno.make_sequence kw['symbol_count'] = config.pop('symbol_count') else: kw['micro'] = config.pop('micro') return make(' '.join(config.pop('content')), **kw) def main(args=sys.argv[1:]): config = parse(args) try: qr = make_code(config) except ValueError as ex: sys.stderr.writelines([str(ex), os.linesep]) return sys.exit(1) output = config.pop('output') if output is None: qr.terminal(border=config['border'], compact=config.get('compact', False)) else: qr.save(output, **build_config(config, filename=output)) return 0 class _AttrDict(dict): """\ Internal helper class. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.__dict__ = self if __name__ == '__main__': main() �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/segno/consts.py�������������������������������������������������������������������������0000664�0000000�0000000�00000102635�14764403223�0015651�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Constants. Internal module. May change without further warning. """ from collections import namedtuple ALPHANUMERIC_CHARS = br'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:' # ISO/IEC 18004:2015(E) -- Table 2 — Mode indicators for QR Code (page 23) MODE_NUMERIC = 0x1 MODE_ALPHANUMERIC = 0x2 MODE_STRUCTURED_APPEND = 0x3 MODE_BYTE = 0x4 MODE_ECI = 0x7 MODE_KANJI = 0x8 # Hanzi is not part of ISO/IEC 18004 and must be enabled by the user explicitly MODE_HANZI = 0xD # Micro QR Code uses different mode indicators # ISO/IEC 18004:2015(E) -- Table 2 — Mode indicators for QR Code (page 23) MODE_TO_MICRO_MODE_MAPPING = { MODE_NUMERIC: 0x0, MODE_ALPHANUMERIC: 0x1, MODE_BYTE: 0x2, MODE_KANJI: 0x3, } # Rectangular Micro QR Code mode indicators # ISO/IEC 23941:2022(E) -- Table 2 - Mode and Mode indicators for rMQR (page 17) MODE_TO_RECT_MICRO_MODE_MAPPING = { MODE_NUMERIC: 0x1, MODE_ALPHANUMERIC: 0x2, MODE_BYTE: 0x3, MODE_KANJI: 0x64 } # Note: These versions must be comparable: Version 1 > M4 > M3 > M2 > M1 VERSION_M4 = 0 VERSION_M3 = -1 VERSION_M2 = -2 VERSION_M1 = -3 MICRO_VERSION_MAPPING = { 'M1': VERSION_M1, 'M2': VERSION_M2, 'M3': VERSION_M3, 'M4': VERSION_M4, } MICRO_VERSIONS = tuple(sorted(MICRO_VERSION_MAPPING.values())) # ISO/IEC 18004:2015(E) # Table 12 — Error correction level indicators for QR Code symbols (page 55) ERROR_LEVEL_L = 1 ERROR_LEVEL_M = 0 ERROR_LEVEL_Q = 3 ERROR_LEVEL_H = 2 ERROR_LEVEL_TO_MICRO_MAPPING = { VERSION_M1: {None: 0}, VERSION_M2: {ERROR_LEVEL_L: 1, ERROR_LEVEL_M: 2}, VERSION_M3: {ERROR_LEVEL_L: 3, ERROR_LEVEL_M: 4}, VERSION_M4: {ERROR_LEVEL_L: 5, ERROR_LEVEL_M: 6, ERROR_LEVEL_Q: 7}, } DEFAULT_BYTE_ENCODING = 'iso-8859-1' KANJI_ENCODING = 'shift_jis' HANZI_ENCODING = 'gb2312' MODE_MAPPING = { 'numeric': MODE_NUMERIC, 'alphanumeric': MODE_ALPHANUMERIC, 'byte': MODE_BYTE, 'kanji': MODE_KANJI, 'hanzi': MODE_HANZI, } ERROR_MAPPING = { 'L': ERROR_LEVEL_L, 'M': ERROR_LEVEL_M, 'Q': ERROR_LEVEL_Q, 'H': ERROR_LEVEL_H, } # # ISO/IEC 18004:2015(E) -- 7.3.2 Extended Channel Interpretation (ECI) mode (page 20) # # # ECI Reference # ------ --------- # 000000 Represents the default encodation scheme # 000001 Represents the GLI encodation scheme of a number of symbologies # with characters 0 to 127 being identical to those of # ISO/IEC 646 : 1991 IRV (equivalent to ANSI X3.4) and characters # 128 to 255 being identical to those values of ISO 8859-1 # 000002 An equivalent code table to ECI 000000, without the return-to-GLI 0 # logic. It is the default encodation scheme for encoders fully # compliant with this standard. # 000003 ISO/IEC 8859-1 Latin alphabet No. 1 # 000004 ISO/IEC 8859-2 Latin alphabet No. 2 # 000005 ISO/IEC 8859-3 Latin alphabet No. 3 # 000006 ISO/IEC 8859-4 Latin alphabet No. 4 # 000007 ISO/IEC 8859-5 Latin/Cyrillic alphabet # 000008 ISO/IEC 8859-6 Latin/Arabic alphabet # 000009 ISO/IEC 8859-7 Latin/Greek alphabet # 000010 ISO/IEC 8859-8 Latin/Hebrew alphabet # 000011 ISO/IEC 8859-9 Latin alphabet No. 5 # 000012 ISO/IEC 8859-10 Latin alphabet No. 6 # 000013 ISO/IEC 8859-11 Latin/Thai alphabet # 000014 Reserved # 000015 ISO/IEC 8859-13 Latin alphabet No. 7 (Baltic Rim) # 000016 ISO/IEC 8859-14 Latin alphabet No. 8 (Celtic) # 000017 ISO/IEC 8859-15 Latin alphabet No. 9 # 000018 ISO/IEC 8859-16 Latin alphabet No. 10 # 000019 Reserved # 000020 Shift JIS (JIS X 0208 Annex 1 + JIS X 0201) # 000021 Windows 1250 Latin 2 (Central Europe) # 000022 Windows 1251 Cyrillic # 000023 Windows 1252 Latin 1 # 000024 Windows 1256 Arabic # 000025 ISO/IEC 10646 UCS-2 (High order byte first) # 000026 ISO/IEC 10646 UTF-8 (See information above) # 000027 ISO/IEC 646:1991 International Reference Version of ISO 7-bit # coded character set # 000028 Big 5 (Taiwan) Chinese Character Set # 000029 GB (PRC) Chinese Character Set # 000030 Korean Character Set ECI_ASSIGNMENT_NUM = { # Codecs name (``codecs.lookup(some-charset).name``) -> ECI designator 'cp437': 1, 'iso8859-1': 3, 'iso8859-2': 4, 'iso8859-3': 5, 'iso8859-4': 6, 'iso8859-5': 7, 'iso8859-6': 8, 'iso8859-7': 9, 'iso8859-8': 10, 'iso8859-9': 11, 'iso8859-10': 12, 'iso8859-11': 13, 'iso8859-13': 15, 'iso8859-14': 16, 'iso8859-15': 17, 'iso8859-16': 18, 'shift_jis': 20, 'cp1250': 21, 'cp1251': 22, 'cp1252': 23, 'cp1256': 24, 'utf-16-be': 25, 'utf-8': 26, 'ascii': 27, 'big5': 28, 'gb18030': 29, 'gbk': 29, # GBK is treated as GB-18030 'euc_kr': 30, } # ISO/IEC 18004:2015(E) -- Table 2 — Mode indicators for QR Code (page 23) SUPPORTED_MODES = { MODE_NUMERIC: (None, VERSION_M1, VERSION_M2, VERSION_M3, VERSION_M4), MODE_ALPHANUMERIC: (None, VERSION_M2, VERSION_M3, VERSION_M4), MODE_BYTE: (None, VERSION_M3, VERSION_M4), MODE_ECI: (None,), MODE_KANJI: (None, VERSION_M3, VERSION_M4), MODE_HANZI: (None,), } # ISO/IEC 18004:2015(E) -- Table 2 — Mode indicators for QR Code (page 23) TERMINATOR_LENGTH = { None: 4, # QR Codes, all versions VERSION_M1: 3, VERSION_M2: 5, VERSION_M3: 7, VERSION_M4: 9 } VERSION_RANGE_01_09 = 1 # Version 1 .. 9 VERSION_RANGE_10_26 = 2 # Version 10 .. 26 VERSION_RANGE_27_40 = 3 # Version 27 .. 40 # ISO/IEC 18004:2015(E) # Table 3 — Number of bits in character count indicator for QR Code (page 23) CHAR_COUNT_INDICATOR_LENGTH = { MODE_NUMERIC: { VERSION_RANGE_01_09: 10, VERSION_RANGE_10_26: 12, VERSION_RANGE_27_40: 14, VERSION_M1: 3, VERSION_M2: 4, VERSION_M3: 5, VERSION_M4: 6}, MODE_ALPHANUMERIC: { VERSION_RANGE_01_09: 9, VERSION_RANGE_10_26: 11, VERSION_RANGE_27_40: 13, VERSION_M2: 3, VERSION_M3: 4, VERSION_M4: 5}, MODE_BYTE: { VERSION_RANGE_01_09: 8, VERSION_RANGE_10_26: 16, VERSION_RANGE_27_40: 16, VERSION_M3: 4, VERSION_M4: 5}, MODE_KANJI: { VERSION_RANGE_01_09: 8, VERSION_RANGE_10_26: 10, VERSION_RANGE_27_40: 12, VERSION_M3: 3, VERSION_M4: 4}, MODE_HANZI: { VERSION_RANGE_01_09: 8, VERSION_RANGE_10_26: 10, VERSION_RANGE_27_40: 12}, } # ISO/IEC 18004:2015(E) - 6.4.10 Bit stream to codeword conversion (page 33) # Table 7 — Number of symbol characters and input data capacity for QR Code SYMBOL_CAPACITY = { VERSION_M1: { None: 20}, VERSION_M2: { ERROR_LEVEL_L: 40, ERROR_LEVEL_M: 32}, VERSION_M3: { ERROR_LEVEL_L: 84, ERROR_LEVEL_M: 68}, VERSION_M4: { ERROR_LEVEL_L: 128, ERROR_LEVEL_M: 112, ERROR_LEVEL_Q: 80}, 1: {ERROR_LEVEL_L: 152, ERROR_LEVEL_M: 128, ERROR_LEVEL_Q: 104, ERROR_LEVEL_H: 72}, 2: {ERROR_LEVEL_L: 272, ERROR_LEVEL_M: 224, ERROR_LEVEL_Q: 176, ERROR_LEVEL_H: 128}, 3: {ERROR_LEVEL_L: 440, ERROR_LEVEL_M: 352, ERROR_LEVEL_Q: 272, ERROR_LEVEL_H: 208}, 4: {ERROR_LEVEL_L: 640, ERROR_LEVEL_M: 512, ERROR_LEVEL_Q: 384, ERROR_LEVEL_H: 288}, 5: {ERROR_LEVEL_L: 864, ERROR_LEVEL_M: 688, ERROR_LEVEL_Q: 496, ERROR_LEVEL_H: 368}, 6: {ERROR_LEVEL_L: 1088, ERROR_LEVEL_M: 864, ERROR_LEVEL_Q: 608, ERROR_LEVEL_H: 480}, 7: {ERROR_LEVEL_L: 1248, ERROR_LEVEL_M: 992, ERROR_LEVEL_Q: 704, ERROR_LEVEL_H: 528}, 8: {ERROR_LEVEL_L: 1552, ERROR_LEVEL_M: 1232, ERROR_LEVEL_Q: 880, ERROR_LEVEL_H: 688}, 9: {ERROR_LEVEL_L: 1856, ERROR_LEVEL_M: 1456, ERROR_LEVEL_Q: 1056, ERROR_LEVEL_H: 800}, 10: {ERROR_LEVEL_L: 2192, ERROR_LEVEL_M: 1728, ERROR_LEVEL_Q: 1232, ERROR_LEVEL_H: 976}, 11: {ERROR_LEVEL_L: 2592, ERROR_LEVEL_M: 2032, ERROR_LEVEL_Q: 1440, ERROR_LEVEL_H: 1120}, 12: {ERROR_LEVEL_L: 2960, ERROR_LEVEL_M: 2320, ERROR_LEVEL_Q: 1648, ERROR_LEVEL_H: 1264}, 13: {ERROR_LEVEL_L: 3424, ERROR_LEVEL_M: 2672, ERROR_LEVEL_Q: 1952, ERROR_LEVEL_H: 1440}, 14: {ERROR_LEVEL_L: 3688, ERROR_LEVEL_M: 2920, ERROR_LEVEL_Q: 2088, ERROR_LEVEL_H: 1576}, 15: {ERROR_LEVEL_L: 4184, ERROR_LEVEL_M: 3320, ERROR_LEVEL_Q: 2360, ERROR_LEVEL_H: 1784}, 16: {ERROR_LEVEL_L: 4712, ERROR_LEVEL_M: 3624, ERROR_LEVEL_Q: 2600, ERROR_LEVEL_H: 2024}, 17: {ERROR_LEVEL_L: 5176, ERROR_LEVEL_M: 4056, ERROR_LEVEL_Q: 2936, ERROR_LEVEL_H: 2264}, 18: {ERROR_LEVEL_L: 5768, ERROR_LEVEL_M: 4504, ERROR_LEVEL_Q: 3176, ERROR_LEVEL_H: 2504}, 19: {ERROR_LEVEL_L: 6360, ERROR_LEVEL_M: 5016, ERROR_LEVEL_Q: 3560, ERROR_LEVEL_H: 2728}, 20: {ERROR_LEVEL_L: 6888, ERROR_LEVEL_M: 5352, ERROR_LEVEL_Q: 3880, ERROR_LEVEL_H: 3080}, 21: {ERROR_LEVEL_L: 7456, ERROR_LEVEL_M: 5712, ERROR_LEVEL_Q: 4096, ERROR_LEVEL_H: 3248}, 22: {ERROR_LEVEL_L: 8048, ERROR_LEVEL_M: 6256, ERROR_LEVEL_Q: 4544, ERROR_LEVEL_H: 3536}, 23: {ERROR_LEVEL_L: 8752, ERROR_LEVEL_M: 6880, ERROR_LEVEL_Q: 4912, ERROR_LEVEL_H: 3712}, 24: {ERROR_LEVEL_L: 9392, ERROR_LEVEL_M: 7312, ERROR_LEVEL_Q: 5312, ERROR_LEVEL_H: 4112}, 25: {ERROR_LEVEL_L: 10208, ERROR_LEVEL_M: 8000, ERROR_LEVEL_Q: 5744, ERROR_LEVEL_H: 4304}, 26: {ERROR_LEVEL_L: 10960, ERROR_LEVEL_M: 8496, ERROR_LEVEL_Q: 6032, ERROR_LEVEL_H: 4768}, 27: {ERROR_LEVEL_L: 11744, ERROR_LEVEL_M: 9024, ERROR_LEVEL_Q: 6464, ERROR_LEVEL_H: 5024}, 28: {ERROR_LEVEL_L: 12248, ERROR_LEVEL_M: 9544, ERROR_LEVEL_Q: 6968, ERROR_LEVEL_H: 5288}, 29: {ERROR_LEVEL_L: 13048, ERROR_LEVEL_M: 10136, ERROR_LEVEL_Q: 7288, ERROR_LEVEL_H: 5608}, 30: {ERROR_LEVEL_L: 13880, ERROR_LEVEL_M: 10984, ERROR_LEVEL_Q: 7880, ERROR_LEVEL_H: 5960}, 31: {ERROR_LEVEL_L: 14744, ERROR_LEVEL_M: 11640, ERROR_LEVEL_Q: 8264, ERROR_LEVEL_H: 6344}, 32: {ERROR_LEVEL_L: 15640, ERROR_LEVEL_M: 12328, ERROR_LEVEL_Q: 8920, ERROR_LEVEL_H: 6760}, 33: {ERROR_LEVEL_L: 16568, ERROR_LEVEL_M: 13048, ERROR_LEVEL_Q: 9368, ERROR_LEVEL_H: 7208}, 34: {ERROR_LEVEL_L: 17528, ERROR_LEVEL_M: 13800, ERROR_LEVEL_Q: 9848, ERROR_LEVEL_H: 7688}, 35: {ERROR_LEVEL_L: 18448, ERROR_LEVEL_M: 14496, ERROR_LEVEL_Q: 10288, ERROR_LEVEL_H: 7888}, 36: {ERROR_LEVEL_L: 19472, ERROR_LEVEL_M: 15312, ERROR_LEVEL_Q: 10832, ERROR_LEVEL_H: 8432}, 37: {ERROR_LEVEL_L: 20528, ERROR_LEVEL_M: 15936, ERROR_LEVEL_Q: 11408, ERROR_LEVEL_H: 8768}, 38: {ERROR_LEVEL_L: 21616, ERROR_LEVEL_M: 16816, ERROR_LEVEL_Q: 12016, ERROR_LEVEL_H: 9136}, 39: {ERROR_LEVEL_L: 22496, ERROR_LEVEL_M: 17728, ERROR_LEVEL_Q: 12656, ERROR_LEVEL_H: 9776}, 40: {ERROR_LEVEL_L: 23648, ERROR_LEVEL_M: 18672, ERROR_LEVEL_Q: 13328, ERROR_LEVEL_H: 10208} } # ISO/IEC 23941:2022(E) - 7.4.10 Bit stream to codeword conversion (page 25) # Table 6 — Number of symbol characters and input data capacity for rMQR RSYMBOL_CAPACITY = { 'R7x43': {ERROR_LEVEL_M: 48, ERROR_LEVEL_H: 24}, 'R7x59': {ERROR_LEVEL_M: 96, ERROR_LEVEL_H: 56}, 'R7x77': {ERROR_LEVEL_M: 160, ERROR_LEVEL_H: 80}, 'R7x99': {ERROR_LEVEL_M: 224, ERROR_LEVEL_H: 112}, 'R7x139': {ERROR_LEVEL_M: 352, ERROR_LEVEL_H: 192}, 'R9x43': {ERROR_LEVEL_M: 96, ERROR_LEVEL_H: 56}, 'R9x59': {ERROR_LEVEL_M: 168, ERROR_LEVEL_H: 88}, 'R9x77': {ERROR_LEVEL_M: 248, ERROR_LEVEL_H: 136}, 'R9x99': {ERROR_LEVEL_M: 336, ERROR_LEVEL_H: 176}, 'R9x139': {ERROR_LEVEL_M: 504, ERROR_LEVEL_H: 264}, 'R11x27': {ERROR_LEVEL_M: 56, ERROR_LEVEL_H: 40}, 'R11x43': {ERROR_LEVEL_M: 152, ERROR_LEVEL_H: 88}, 'R11x59': {ERROR_LEVEL_M: 248, ERROR_LEVEL_H: 120}, 'R11x77': {ERROR_LEVEL_M: 344, ERROR_LEVEL_H: 184}, 'R11x99': {ERROR_LEVEL_M: 456, ERROR_LEVEL_H: 232}, 'R11x139': {ERROR_LEVEL_M: 672, ERROR_LEVEL_H: 336}, 'R13x27': {ERROR_LEVEL_M: 96, ERROR_LEVEL_H: 56}, 'R13x43': {ERROR_LEVEL_M: 216, ERROR_LEVEL_H: 104}, 'R13x59': {ERROR_LEVEL_M: 304, ERROR_LEVEL_H: 160}, 'R13x77': {ERROR_LEVEL_M: 424, ERROR_LEVEL_H: 232}, 'R13x99': {ERROR_LEVEL_M: 584, ERROR_LEVEL_H: 280}, 'R13x139': {ERROR_LEVEL_M: 848, ERROR_LEVEL_H: 432}, 'R15x43': {ERROR_LEVEL_M: 264, ERROR_LEVEL_H: 120}, 'R15x59': {ERROR_LEVEL_M: 384, ERROR_LEVEL_H: 208}, 'R15x77': {ERROR_LEVEL_M: 536, ERROR_LEVEL_H: 248}, 'R15x99': {ERROR_LEVEL_M: 704, ERROR_LEVEL_H: 384}, 'R15x139': {ERROR_LEVEL_M: 1016, ERROR_LEVEL_H: 552}, 'R17x43': {ERROR_LEVEL_M: 312, ERROR_LEVEL_H: 168}, 'R17x59': {ERROR_LEVEL_M: 448, ERROR_LEVEL_H: 224}, 'R17x77': {ERROR_LEVEL_M: 624, ERROR_LEVEL_H: 304}, 'R17x99': {ERROR_LEVEL_M: 800, ERROR_LEVEL_H: 448}, 'R17x139': {ERROR_LEVEL_M: 1216, ERROR_LEVEL_H: 608}, } # ISO/IEC 18004:2015(E) -- Table 9 — Error correction characteristics for QR Code (page 38) # ISO/IEC 23941:2022(E) -- Table 8 — Error correction characteristics for rMQR (page 29) EC = namedtuple('EC', 'num_blocks num_total num_data') ECC = { VERSION_M1: {None: (EC(1, 5, 3),)}, VERSION_M2: {ERROR_LEVEL_L: (EC(1, 10, 5),), ERROR_LEVEL_M: (EC(1, 10, 4),)}, VERSION_M3: {ERROR_LEVEL_L: (EC(1, 17, 11),), ERROR_LEVEL_M: (EC(1, 17, 9),)}, VERSION_M4: {ERROR_LEVEL_L: (EC(1, 24, 16),), ERROR_LEVEL_M: (EC(1, 24, 14),), ERROR_LEVEL_Q: (EC(1, 24, 10),)}, 1: { ERROR_LEVEL_L: (EC(1, 26, 19),), ERROR_LEVEL_M: (EC(1, 26, 16),), ERROR_LEVEL_Q: (EC(1, 26, 13),), ERROR_LEVEL_H: (EC(1, 26, 9),)}, 2: { ERROR_LEVEL_L: (EC(1, 44, 34),), ERROR_LEVEL_M: (EC(1, 44, 28),), ERROR_LEVEL_Q: (EC(1, 44, 22),), ERROR_LEVEL_H: (EC(1, 44, 16),)}, 3: { ERROR_LEVEL_L: (EC(1, 70, 55),), ERROR_LEVEL_M: (EC(1, 70, 44),), ERROR_LEVEL_Q: (EC(2, 35, 17),), ERROR_LEVEL_H: (EC(2, 35, 13),)}, 4: { ERROR_LEVEL_L: (EC(1, 100, 80),), ERROR_LEVEL_M: (EC(2, 50, 32),), ERROR_LEVEL_Q: (EC(2, 50, 24),), ERROR_LEVEL_H: (EC(4, 25, 9),)}, 5: { ERROR_LEVEL_L: (EC(1, 134, 108),), ERROR_LEVEL_M: (EC(2, 67, 43),), ERROR_LEVEL_Q: (EC(2, 33, 15), EC(2, 34, 16)), ERROR_LEVEL_H: (EC(2, 33, 11), EC(2, 34, 12))}, 6: { ERROR_LEVEL_L: (EC(2, 86, 68),), ERROR_LEVEL_M: (EC(4, 43, 27),), ERROR_LEVEL_Q: (EC(4, 43, 19),), ERROR_LEVEL_H: (EC(4, 43, 15),)}, 7: { ERROR_LEVEL_L: (EC(2, 98, 78),), ERROR_LEVEL_M: (EC(4, 49, 31),), ERROR_LEVEL_Q: (EC(2, 32, 14), EC(4, 33, 15)), ERROR_LEVEL_H: (EC(4, 39, 13), EC(1, 40, 14))}, 8: { ERROR_LEVEL_L: (EC(2, 121, 97),), ERROR_LEVEL_M: (EC(2, 60, 38), EC(2, 61, 39)), ERROR_LEVEL_Q: (EC(4, 40, 18), EC(2, 41, 19)), ERROR_LEVEL_H: (EC(4, 40, 14), EC(2, 41, 15))}, 9: { ERROR_LEVEL_L: (EC(2, 146, 116),), ERROR_LEVEL_M: (EC(3, 58, 36), EC(2, 59, 37)), ERROR_LEVEL_Q: (EC(4, 36, 16), EC(4, 37, 17)), ERROR_LEVEL_H: (EC(4, 36, 12), EC(4, 37, 13))}, 10: { ERROR_LEVEL_L: (EC(2, 86, 68), EC(2, 87, 69)), ERROR_LEVEL_M: (EC(4, 69, 43), EC(1, 70, 44)), ERROR_LEVEL_Q: (EC(6, 43, 19), EC(2, 44, 20)), ERROR_LEVEL_H: (EC(6, 43, 15), EC(2, 44, 16))}, 11: { ERROR_LEVEL_L: (EC(4, 101, 81),), ERROR_LEVEL_M: (EC(1, 80, 50), EC(4, 81, 51)), ERROR_LEVEL_Q: (EC(4, 50, 22), EC(4, 51, 23)), ERROR_LEVEL_H: (EC(3, 36, 12), EC(8, 37, 13))}, 12: { ERROR_LEVEL_L: (EC(2, 116, 92), EC(2, 117, 93)), ERROR_LEVEL_M: (EC(6, 58, 36), EC(2, 59, 37)), ERROR_LEVEL_Q: (EC(4, 46, 20), EC(6, 47, 21)), ERROR_LEVEL_H: (EC(7, 42, 14), EC(4, 43, 15))}, 13: { ERROR_LEVEL_L: (EC(4, 133, 107),), ERROR_LEVEL_M: (EC(8, 59, 37), EC(1, 60, 38)), ERROR_LEVEL_Q: (EC(8, 44, 20), EC(4, 45, 21)), ERROR_LEVEL_H: (EC(12, 33, 11), EC(4, 34, 12))}, 14: { ERROR_LEVEL_L: (EC(3, 145, 115), EC(1, 146, 116)), ERROR_LEVEL_M: (EC(4, 64, 40), EC(5, 65, 41)), ERROR_LEVEL_Q: (EC(11, 36, 16), EC(5, 37, 17)), ERROR_LEVEL_H: (EC(11, 36, 12), EC(5, 37, 13))}, 15: { ERROR_LEVEL_L: (EC(5, 109, 87), EC(1, 110, 88)), ERROR_LEVEL_M: (EC(5, 65, 41), EC(5, 66, 42)), ERROR_LEVEL_Q: (EC(5, 54, 24), EC(7, 55, 25)), ERROR_LEVEL_H: (EC(11, 36, 12), EC(7, 37, 13))}, 16: { ERROR_LEVEL_L: (EC(5, 122, 98), EC(1, 123, 99)), ERROR_LEVEL_M: (EC(7, 73, 45), EC(3, 74, 46)), ERROR_LEVEL_Q: (EC(15, 43, 19), EC(2, 44, 20)), ERROR_LEVEL_H: (EC(3, 45, 15), EC(13, 46, 16))}, 17: { ERROR_LEVEL_L: (EC(1, 135, 107), EC(5, 136, 108)), ERROR_LEVEL_M: (EC(10, 74, 46), EC(1, 75, 47)), ERROR_LEVEL_Q: (EC(1, 50, 22), EC(15, 51, 23)), ERROR_LEVEL_H: (EC(2, 42, 14), EC(17, 43, 15))}, 18: { ERROR_LEVEL_L: (EC(5, 150, 120), EC(1, 151, 121)), ERROR_LEVEL_M: (EC(9, 69, 43), EC(4, 70, 44)), ERROR_LEVEL_Q: (EC(17, 50, 22), EC(1, 51, 23)), ERROR_LEVEL_H: (EC(2, 42, 14), EC(19, 43, 15))}, 19: { ERROR_LEVEL_L: (EC(3, 141, 113), EC(4, 142, 114)), ERROR_LEVEL_M: (EC(3, 70, 44), EC(11, 71, 45)), ERROR_LEVEL_Q: (EC(17, 47, 21), EC(4, 48, 22)), ERROR_LEVEL_H: (EC(9, 39, 13), EC(16, 40, 14))}, 20: { ERROR_LEVEL_L: (EC(3, 135, 107), EC(5, 136, 108)), ERROR_LEVEL_M: (EC(3, 67, 41), EC(13, 68, 42)), ERROR_LEVEL_Q: (EC(15, 54, 24), EC(5, 55, 25)), ERROR_LEVEL_H: (EC(15, 43, 15), EC(10, 44, 16))}, 21: { ERROR_LEVEL_L: (EC(4, 144, 116), EC(4, 145, 117)), ERROR_LEVEL_M: (EC(17, 68, 42),), ERROR_LEVEL_Q: (EC(17, 50, 22), EC(6, 51, 23)), ERROR_LEVEL_H: (EC(19, 46, 16), EC(6, 47, 17))}, 22: { ERROR_LEVEL_L: (EC(2, 139, 111), EC(7, 140, 112)), ERROR_LEVEL_M: (EC(17, 74, 46),), ERROR_LEVEL_Q: (EC(7, 54, 24), EC(16, 55, 25)), ERROR_LEVEL_H: (EC(34, 37, 13),)}, 23: { ERROR_LEVEL_L: (EC(4, 151, 121), EC(5, 152, 122)), ERROR_LEVEL_M: (EC(4, 75, 47), EC(14, 76, 48)), ERROR_LEVEL_Q: (EC(11, 54, 24), EC(14, 55, 25)), ERROR_LEVEL_H: (EC(16, 45, 15), EC(14, 46, 16))}, 24: { ERROR_LEVEL_L: (EC(6, 147, 117), EC(4, 148, 118)), ERROR_LEVEL_M: (EC(6, 73, 45), EC(14, 74, 46)), ERROR_LEVEL_Q: (EC(11, 54, 24), EC(16, 55, 25)), ERROR_LEVEL_H: (EC(30, 46, 16), EC(2, 47, 17))}, 25: { ERROR_LEVEL_L: (EC(8, 132, 106), EC(4, 133, 107)), ERROR_LEVEL_M: (EC(8, 75, 47), EC(13, 76, 48)), ERROR_LEVEL_Q: (EC(7, 54, 24), EC(22, 55, 25)), ERROR_LEVEL_H: (EC(22, 45, 15), EC(13, 46, 16))}, 26: { ERROR_LEVEL_L: (EC(10, 142, 114), EC(2, 143, 115)), ERROR_LEVEL_M: (EC(19, 74, 46), EC(4, 75, 47)), ERROR_LEVEL_Q: (EC(28, 50, 22), EC(6, 51, 23)), ERROR_LEVEL_H: (EC(33, 46, 16), EC(4, 47, 17))}, 27: { ERROR_LEVEL_L: (EC(8, 152, 122), EC(4, 153, 123)), ERROR_LEVEL_M: (EC(22, 73, 45), EC(3, 74, 46)), ERROR_LEVEL_Q: (EC(8, 53, 23), EC(26, 54, 24)), ERROR_LEVEL_H: (EC(12, 45, 15), EC(28, 46, 16))}, 28: { ERROR_LEVEL_L: (EC(3, 147, 117), EC(10, 148, 118)), ERROR_LEVEL_M: (EC(3, 73, 45), EC(23, 74, 46)), ERROR_LEVEL_Q: (EC(4, 54, 24), EC(31, 55, 25)), ERROR_LEVEL_H: (EC(11, 45, 15), EC(31, 46, 16))}, 29: { ERROR_LEVEL_L: (EC(7, 146, 116), EC(7, 147, 117)), ERROR_LEVEL_M: (EC(21, 73, 45), EC(7, 74, 46)), ERROR_LEVEL_Q: (EC(1, 53, 23), EC(37, 54, 24)), ERROR_LEVEL_H: (EC(19, 45, 15), EC(26, 46, 16))}, 30: { ERROR_LEVEL_L: (EC(5, 145, 115), EC(10, 146, 116)), ERROR_LEVEL_M: (EC(19, 75, 47), EC(10, 76, 48)), ERROR_LEVEL_Q: (EC(15, 54, 24), EC(25, 55, 25)), ERROR_LEVEL_H: (EC(23, 45, 15), EC(25, 46, 16))}, 31: { ERROR_LEVEL_L: (EC(13, 145, 115), EC(3, 146, 116)), ERROR_LEVEL_M: (EC(2, 74, 46), EC(29, 75, 47)), ERROR_LEVEL_Q: (EC(42, 54, 24), EC(1, 55, 25)), ERROR_LEVEL_H: (EC(23, 45, 15), EC(28, 46, 16))}, 32: { ERROR_LEVEL_L: (EC(17, 145, 115),), ERROR_LEVEL_M: (EC(10, 74, 46), EC(23, 75, 47)), ERROR_LEVEL_Q: (EC(10, 54, 24), EC(35, 55, 25)), ERROR_LEVEL_H: (EC(19, 45, 15), EC(35, 46, 16))}, 33: { ERROR_LEVEL_L: (EC(17, 145, 115), EC(1, 146, 116)), ERROR_LEVEL_M: (EC(14, 74, 46), EC(21, 75, 47)), ERROR_LEVEL_Q: (EC(29, 54, 24), EC(19, 55, 25)), ERROR_LEVEL_H: (EC(11, 45, 15), EC(46, 46, 16))}, 34: { ERROR_LEVEL_L: (EC(13, 145, 115), EC(6, 146, 116)), ERROR_LEVEL_M: (EC(14, 74, 46), EC(23, 75, 47)), ERROR_LEVEL_Q: (EC(44, 54, 24), EC(7, 55, 25)), ERROR_LEVEL_H: (EC(59, 46, 16), EC(1, 47, 17))}, 35: { ERROR_LEVEL_L: (EC(12, 151, 121), EC(7, 152, 122)), ERROR_LEVEL_M: (EC(12, 75, 47), EC(26, 76, 48)), ERROR_LEVEL_Q: (EC(39, 54, 24), EC(14, 55, 25)), ERROR_LEVEL_H: (EC(22, 45, 15), EC(41, 46, 16))}, 36: { ERROR_LEVEL_L: (EC(6, 151, 121), EC(14, 152, 122)), ERROR_LEVEL_M: (EC(6, 75, 47), EC(34, 76, 48)), ERROR_LEVEL_Q: (EC(46, 54, 24), EC(10, 55, 25)), ERROR_LEVEL_H: (EC(2, 45, 15), EC(64, 46, 16))}, 37: { ERROR_LEVEL_L: (EC(17, 152, 122), EC(4, 153, 123)), ERROR_LEVEL_M: (EC(29, 74, 46), EC(14, 75, 47)), ERROR_LEVEL_Q: (EC(49, 54, 24), EC(10, 55, 25)), ERROR_LEVEL_H: (EC(24, 45, 15), EC(46, 46, 16))}, 38: { ERROR_LEVEL_L: (EC(4, 152, 122), EC(18, 153, 123)), ERROR_LEVEL_M: (EC(13, 74, 46), EC(32, 75, 47)), ERROR_LEVEL_Q: (EC(48, 54, 24), EC(14, 55, 25)), ERROR_LEVEL_H: (EC(42, 45, 15), EC(32, 46, 16))}, 39: { ERROR_LEVEL_L: (EC(20, 147, 117), EC(4, 148, 118)), ERROR_LEVEL_M: (EC(40, 75, 47), EC(7, 76, 48)), ERROR_LEVEL_Q: (EC(43, 54, 24), EC(22, 55, 25)), ERROR_LEVEL_H: (EC(10, 45, 15), EC(67, 46, 16))}, 40: { ERROR_LEVEL_L: (EC(19, 148, 118), EC(6, 149, 119)), ERROR_LEVEL_M: (EC(18, 75, 47), EC(31, 76, 48)), ERROR_LEVEL_Q: (EC(34, 54, 24), EC(34, 55, 25)), ERROR_LEVEL_H: (EC(20, 45, 15), EC(61, 46, 16))}, 'R7x43': {ERROR_LEVEL_M: 48, ERROR_LEVEL_H: 24}, 'R7x59': {ERROR_LEVEL_M: 96, ERROR_LEVEL_H: 56}, 'R7x77': {ERROR_LEVEL_M: 160, ERROR_LEVEL_H: 80}, 'R7x99': {ERROR_LEVEL_M: 224, ERROR_LEVEL_H: 112}, 'R7x139': {ERROR_LEVEL_M: 352, ERROR_LEVEL_H: 192}, 'R9x43': {ERROR_LEVEL_M: 96, ERROR_LEVEL_H: 56}, 'R9x59': {ERROR_LEVEL_M: 168, ERROR_LEVEL_H: 88}, 'R9x77': {ERROR_LEVEL_M: 248, ERROR_LEVEL_H: 136}, 'R9x99': {ERROR_LEVEL_M: 336, ERROR_LEVEL_H: 176}, 'R9x139': {ERROR_LEVEL_M: 504, ERROR_LEVEL_H: 264}, 'R11x27': {ERROR_LEVEL_M: 56, ERROR_LEVEL_H: 40}, 'R11x43': {ERROR_LEVEL_M: 152, ERROR_LEVEL_H: 88}, 'R11x59': {ERROR_LEVEL_M: 248, ERROR_LEVEL_H: 120}, 'R11x77': {ERROR_LEVEL_M: 344, ERROR_LEVEL_H: 184}, 'R11x99': {ERROR_LEVEL_M: 456, ERROR_LEVEL_H: 232}, 'R11x139': {ERROR_LEVEL_M: 672, ERROR_LEVEL_H: 336}, 'R13x27': {ERROR_LEVEL_M: 96, ERROR_LEVEL_H: 56}, 'R13x43': {ERROR_LEVEL_M: 216, ERROR_LEVEL_H: 104}, 'R13x59': {ERROR_LEVEL_M: 304, ERROR_LEVEL_H: 160}, 'R13x77': {ERROR_LEVEL_M: 424, ERROR_LEVEL_H: 232}, 'R13x99': {ERROR_LEVEL_M: 584, ERROR_LEVEL_H: 280}, 'R13x139': {ERROR_LEVEL_M: 848, ERROR_LEVEL_H: 432}, 'R15x43': {ERROR_LEVEL_M: 264, ERROR_LEVEL_H: 120}, 'R15x59': {ERROR_LEVEL_M: 384, ERROR_LEVEL_H: 208}, 'R15x77': {ERROR_LEVEL_M: 536, ERROR_LEVEL_H: 248}, 'R15x99': {ERROR_LEVEL_M: 704, ERROR_LEVEL_H: 384}, 'R15x139': {ERROR_LEVEL_M: 1016, ERROR_LEVEL_H: 552}, 'R17x43': {ERROR_LEVEL_M: 312, ERROR_LEVEL_H: 168}, 'R17x59': {ERROR_LEVEL_M: 448, ERROR_LEVEL_H: 224}, 'R17x77': {ERROR_LEVEL_M: 624, ERROR_LEVEL_H: 304}, 'R17x99': {ERROR_LEVEL_M: 800, ERROR_LEVEL_H: 448}, 'R17x139': {ERROR_LEVEL_M: 1216, ERROR_LEVEL_H: 608}, } # ISO/IEC 18004:2015 -- Annex C - D.1 Error correction bit calculation # Table C.1 — Valid format information bit sequences (page 80) FORMAT_INFO = ( # M: mask 0, mask 1 .. 7 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, # L 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976, # H 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b, # Q 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed, ) FORMAT_INFO_MICRO = ( 0x4445, 0x4172, 0x4e2b, 0x4b1c, 0x55ae, 0x5099, 0x5fc0, 0x5af7, 0x6793, 0x62a4, 0x6dfd, 0x68ca, 0x7678, 0x734f, 0x7c16, 0x7921, 0x06de, 0x03e9, 0x0cb0, 0x0987, 0x1735, 0x1202, 0x1d5b, 0x186c, 0x2508, 0x203f, 0x2f66, 0x2a51, 0x34e3, 0x31d4, 0x3e8d, 0x3bba, ) FORMAT_INFO_RECT_MICRO_LEFT = ( 0x1faB2, 0x1e597, 0x1dBdd, 0x1c4f8, 0x1B86c, 0x1a749, 0x19903, 0x18626, 0x17f0e, 0x1602B, 0x15e61, 0x14144, 0x13dd0, 0x122f5, 0x11cBf, 0x1039a, 0x0f1ca, 0x0eeef, 0x0d0a5, 0x0cf80, 0x0B314, 0x0ac31, 0x0927B, 0x08d5e, 0x07476, 0x06B53, 0x05519, 0x04a3c, 0x036a8, 0x0298d, 0x017c7, 0x008e2, 0x3f367, 0x3ec42, 0x3d208, 0x3cd2d, 0x3B1B9, 0x3ae9c, 0x390d6, 0x38ff3, 0x376dB, 0x369fe, 0x357B4, 0x34891, 0x33405, 0x32B20, 0x3156a, 0x30a4f, 0x2f81f, 0x2e73a, 0x2d970, 0x2c655, 0x2Bac1, 0x2a5e4, 0x29Bae, 0x2848B, 0x27da3, 0x26286, 0x25ccc, 0x243e9, 0x23f7d, 0x22058, 0x21e12, 0x20137 ) FORMAT_INFO_RECT_MICRO_RIGHT = ( 0x20a7b, 0x2155e, 0x22b14, 0x23431, 0x248a5, 0x25780, 0x269ca, 0x276ef, 0x28fc7, 0x290e2, 0x2aea8, 0x2b18d, 0x2cd19, 0x2d23c, 0x2ec76, 0x2f353, 0x30103, 0x31e26, 0x3206c, 0x33f49, 0x343dd, 0x35cf8, 0x362b2, 0x37d97, 0x384bf, 0x39b9a, 0x3a5d0, 0x3baf5, 0x3c661, 0x3d944, 0x3e70e, 0x3f82b, 0x003ae, 0x01c8b, 0x022c1, 0x03de4, 0x04170, 0x05e55, 0x0601f, 0x07f3a, 0x08612, 0x09937, 0x0a77d, 0x0b858, 0x0c4cc, 0x0dbe9, 0x0e5a3, 0x0fa86, 0x108d6, 0x117f3, 0x129b9, 0x1369c, 0x14a08, 0x1552d, 0x16b67, 0x17442, 0x18d6a, 0x1924f, 0x1ac05, 0x1b320, 0x1cfb4, 0x1d091, 0x1eedb, 0x1f1fe ) # ISO/IEC 18004:2015 -- Annex D - D.1 Error correction bit calculation # Table D.1 — Version information bit stream for each version (page 82) VERSION_INFO = ( # Version 7, 8, 9 .. 40 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, 0x27541, 0x28c69, ) # ISO/IEC 18004:2015 -- Annex E - Position of alignment patterns # Table E.1 — Row/column coordinates of center module of alignment patterns (page 83) ALIGNMENT_POS = ( (6, 18), # Version 2 (version 1 has no additional alignment patterns) (6, 22), # Version 3 (6, 26), # .. (6, 30), (6, 34), (6, 22, 38), # Version 7 (6, 24, 42), (6, 26, 46), (6, 28, 50), (6, 30, 54), (6, 32, 58), (6, 34, 62), (6, 26, 46, 66), # Version 14 (6, 26, 48, 70), (6, 26, 50, 74), (6, 30, 54, 78), (6, 30, 56, 82), (6, 30, 58, 86), (6, 34, 62, 90), (6, 28, 50, 72, 94), # Version 21 (6, 26, 50, 74, 98), (6, 30, 54, 78, 102), (6, 28, 54, 80, 106), (6, 32, 58, 84, 110), (6, 30, 58, 86, 114), (6, 34, 62, 90, 118), (6, 26, 50, 74, 98, 122), # Version 28 (6, 30, 54, 78, 102, 126), (6, 26, 52, 78, 104, 130), (6, 30, 56, 82, 108, 134), (6, 34, 60, 86, 112, 138), (6, 30, 58, 86, 114, 142), (6, 34, 62, 90, 118, 146), (6, 30, 54, 78, 102, 126, 150), # Version 35 (6, 24, 50, 76, 102, 128, 154), (6, 28, 54, 80, 106, 132, 158), (6, 32, 58, 84, 110, 136, 162), (6, 26, 54, 82, 110, 138, 166), (6, 30, 58, 86, 114, 142, 170), # Version 40 ) # ISO/IEC 23941:2022(E) -- Annex D - Position of alignment patterns # Table D.1 — Column coordinates of centre module of alignment patterns (page 61) RECT_MICRO_ALIGNMENT_POS = { 43: (21,), 59: (19, 39), 77: (25, 51), 99: (23, 49, 75), 139: (27, 55, 83, 111), } # ISO/IEC 18004:2015 -- Annex A - Error detection and correction generator polynomials # Table A.1 — Generator polynomials for Reed-Solomon error correction codewords (page 73) GEN_POLY = { 2: (25, 1), 5: (113, 164, 166, 119, 10), 6: (166, 0, 134, 5, 176, 15), 7: (87, 229, 146, 149, 238, 102, 21), 8: (175, 238, 208, 249, 215, 252, 196, 28), 10: (251, 67, 46, 61, 118, 70, 64, 94, 32, 45), 13: (74, 152, 176, 100, 86, 100, 106, 104, 130, 218, 206, 140, 78), 14: (199, 249, 155, 48, 190, 124, 218, 137, 216, 87, 207, 59, 22, 91), 15: (8, 183, 61, 91, 202, 37, 51, 58, 58, 237, 140, 124, 5, 99, 105), 16: (120, 104, 107, 109, 102, 161, 76, 3, 91, 191, 147, 169, 182, 194, 225, 120), 17: (43, 139, 206, 78, 43, 239, 123, 206, 214, 147, 24, 99, 150, 39, 243, 163, 136), 18: (215, 234, 158, 94, 184, 97, 118, 170, 79, 187, 152, 148, 252, 179, 5, 98, 96, 153), 20: (17, 60, 79, 50, 61, 163, 26, 187, 202, 180, 221, 225, 83, 239, 156, 164, 212, 212, 188, 190), 22: (210, 171, 247, 242, 93, 230, 14, 109, 221, 53, 200, 74, 8, 172, 98, 80, 219, 134, 160, 105, 165, 231), 24: (229, 121, 135, 48, 211, 117, 251, 126, 159, 180, 169, 152, 192, 226, 228, 218, 111, 0, 117, 232, 87, 96, 227, 21), # noqa: E501 26: (173, 125, 158, 2, 103, 182, 118, 17, 145, 201, 111, 28, 165, 53, 161, 21, 245, 142, 13, 102, 48, 227, 153, 145, 218, 70), # noqa: E501 28: (168, 223, 200, 104, 224, 234, 108, 180, 110, 190, 195, 147, 205, 27, 232, 201, 21, 43, 245, 87, 42, 195, 212, 119, 242, 37, 9, 123), # noqa: E501 30: (41, 173, 145, 152, 216, 31, 179, 182, 50, 48, 110, 86, 239, 96, 222, 125, 42, 173, 226, 193, 224, 130, 156, 37, 251, 216, 238, 40, 192, 180) # noqa: E501 } # Precomputed Galios Log tables # # prime polynomial: 0x11d (285) / generator: 2 # GF(256) log GALIOS_LOG = ( 0, 0, 1, 25, 2, 50, 26, 198, 3, 223, 51, 238, 27, 104, 199, 75, 4, 100, 224, 14, 52, 141, 239, 129, 28, 193, 105, 248, 200, 8, 76, 113, 5, 138, 101, 47, 225, 36, 15, 33, 53, 147, 142, 218, 240, 18, 130, 69, 29, 181, 194, 125, 106, 39, 249, 185, 201, 154, 9, 120, 77, 228, 114, 166, 6, 191, 139, 98, 102, 221, 48, 253, 226, 152, 37, 179, 16, 145, 34, 136, 54, 208, 148, 206, 143, 150, 219, 189, 241, 210, 19, 92, 131, 56, 70, 64, 30, 66, 182, 163, 195, 72, 126, 110, 107, 58, 40, 84, 250, 133, 186, 61, 202, 94, 155, 159, 10, 21, 121, 43, 78, 212, 229, 172, 115, 243, 167, 87, 7, 112, 192, 247, 140, 128, 99, 13, 103, 74, 222, 237, 49, 197, 254, 24, 227, 165, 153, 119, 38, 184, 180, 124, 17, 68, 146, 217, 35, 32, 137, 46, 55, 63, 209, 91, 149, 188, 207, 205, 144, 135, 151, 178, 220, 252, 190, 97, 242, 86, 211, 171, 20, 42, 93, 158, 132, 60, 57, 83, 71, 109, 65, 162, 31, 45, 67, 216, 183, 123, 164, 118, 196, 23, 73, 236, 127, 12, 111, 246, 108, 161, 59, 82, 41, 157, 85, 170, 251, 96, 134, 177, 187, 204, 62, 90, 203, 89, 95, 176, 156, 169, 160, 81, 11, 245, 22, 235, 122, 117, 44, 215, 79, 174, 213, 233, 230, 231, 173, 232, 116, 214, 244, 234, 168, 80, 88, 175 ) # GF(256) antilog # Inverse of the logarithm table. Maps integer logarithms to members # of the field. GALIOS_EXP = ([ 1, 2, 4, 8, 16, 32, 64, 128, 29, 58, 116, 232, 205, 135, 19, 38, 76, 152, 45, 90, 180, 117, 234, 201, 143, 3, 6, 12, 24, 48, 96, 192, 157, 39, 78, 156, 37, 74, 148, 53, 106, 212, 181, 119, 238, 193, 159, 35, 70, 140, 5, 10, 20, 40, 80, 160, 93, 186, 105, 210, 185, 111, 222, 161, 95, 190, 97, 194, 153, 47, 94, 188, 101, 202, 137, 15, 30, 60, 120, 240, 253, 231, 211, 187, 107, 214, 177, 127, 254, 225, 223, 163, 91, 182, 113, 226, 217, 175, 67, 134, 17, 34, 68, 136, 13, 26, 52, 104, 208, 189, 103, 206, 129, 31, 62, 124, 248, 237, 199, 147, 59, 118, 236, 197, 151, 51, 102, 204, 133, 23, 46, 92, 184, 109, 218, 169, 79, 158, 33, 66, 132, 21, 42, 84, 168, 77, 154, 41, 82, 164, 85, 170, 73, 146, 57, 114, 228, 213, 183, 115, 230, 209, 191, 99, 198, 145, 63, 126, 252, 229, 215, 179, 123, 246, 241, 255, 227, 219, 171, 75, 150, 49, 98, 196, 149, 55, 110, 220, 165, 87, 174, 65, 130, 25, 50, 100, 200, 141, 7, 14, 28, 56, 112, 224, 221, 167, 83, 166, 81, 162, 89, 178, 121, 242, 249, 239, 195, 155, 43, 86, 172, 69, 138, 9, 18, 36, 72, 144, 61, 122, 244, 245, 247, 243, 251, 235, 203, 139, 11, 22, 44, 88, 176, 125, 250, 233, 207, 131, 27, 54, 108, 216, 173, 71, 142] * 2 ) # Constants for module types TYPE_FINDER_PATTERN_LIGHT = 6 """\ Light finder module """ TYPE_FINDER_PATTERN_DARK = TYPE_FINDER_PATTERN_LIGHT << 8 """\ Dark finder module. """ TYPE_SEPARATOR = 8 """\ Separator around the finder patterns (light module) """ TYPE_ALIGNMENT_PATTERN_LIGHT = 10 """\ Light alignment pattern module. """ TYPE_ALIGNMENT_PATTERN_DARK = TYPE_ALIGNMENT_PATTERN_LIGHT << 8 """\ Dark alignment pattern module. """ TYPE_TIMING_LIGHT = 12 """\ Light timing pattern module. """ TYPE_TIMING_DARK = TYPE_TIMING_LIGHT << 8 """\ Dark timing patten module. """ TYPE_FORMAT_LIGHT = 14 """\ Light format information module. """ TYPE_FORMAT_DARK = TYPE_FORMAT_LIGHT << 8 """\ Dark format information module. """ TYPE_VERSION_LIGHT = 16 """\ Light version information module. """ TYPE_VERSION_DARK = TYPE_VERSION_LIGHT << 8 """\ Dark version information module. """ TYPE_DARKMODULE = 512 """\ A single dark module which occurs in QR Codes (but not in Micro QR Codes). """ TYPE_DATA_LIGHT = 4 """\ Light module in the encoding area (either a data module or an error correction module). """ TYPE_DATA_DARK = TYPE_DATA_LIGHT << 8 """\ Dark module in the encoding area (either a data module or an error correction module). """ TYPE_QUIET_ZONE = 18 """\ Border of light modules. """ ���������������������������������������������������������������������������������������������������segno-1.6.6/segno/encoder.py������������������������������������������������������������������������0000664�0000000�0000000�00000200766�14764403223�0015763�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ QR Code and Micro QR Code encoder. DOES NOT belong to the public API. "QR Code" and "Micro QR Code" are registered trademarks of DENSO WAVE INCORPORATED. """ from operator import itemgetter, gt, lt, xor from functools import partial, reduce from itertools import islice, chain, product import re import math import codecs from collections import namedtuple from . import consts from itertools import zip_longest import sys _MAX_PENALTY_SCORE = sys.maxsize del sys __all__ = ('encode', 'encode_sequence', 'DataOverflowError') class DataOverflowError(ValueError): """\ Indicates a problem that the provided data does not fit into the provided QR Code version or the data is too large in general. This exception is inherited from :py:exc:`ValueError` and is only raised if the data does not fit into the provided (Micro) QR Code version. Basically it is sufficient to catch a :py:exc:`ValueError`. """ Code = namedtuple('Code', 'matrix version error mask segments') def encode(content, error=None, version=None, mode=None, mask=None, encoding=None, eci=False, micro=None, boost_error=True): """\ Creates a (Micro) QR code. See :py:func:`segno.make` for a detailed description of the parameters. Contrary to ``make`` this function returns a named tuple: ``(matrix, version, error, mask, segments)`` Note that ``version`` is always an integer referring to the values of the :py:mod:`segno.consts` constants. ``error`` is ``None`` iff a M1 QR Code was generated, otherwise it is always an integer. :rtype: namedtuple """ version = normalize_version(version) if not micro and micro is not None and version in consts.MICRO_VERSIONS: raise ValueError(f'A Micro QR Code version ("{get_version_name(version)}") ' 'is provided but parameter "micro" is False') if micro and version is not None and version not in consts.MICRO_VERSIONS: raise ValueError(f'Illegal Micro QR Code version "{get_version_name(version)}"') error = normalize_errorlevel(error, accept_none=True) mode = normalize_mode(mode) if mode is not None and version is not None \ and not is_mode_supported(mode, version): raise ValueError(f'Mode "{get_mode_name(mode)}" is not available in version "{get_version_name(version)}"') if error == consts.ERROR_LEVEL_H and (micro or version in consts.MICRO_VERSIONS): raise ValueError('Error correction level "H" is not available for Micro QR Codes') if eci and (micro or version in consts.MICRO_VERSIONS): raise ValueError('The ECI mode is not available for Micro QR Codes') segments = prepare_data(content, mode, encoding) guessed_version = find_version(segments, error, eci=eci, micro=micro) if version is None: version = guessed_version elif guessed_version > version: raise DataOverflowError(f'The provided data does not fit into version "{get_version_name(version)}"' f'Proposal: version {get_version_name(guessed_version)}') if error is None and version != consts.VERSION_M1: error = consts.ERROR_LEVEL_L is_micro = version < 1 mask = normalize_mask(mask, is_micro) return _encode(segments, error, version, mask, eci, boost_error) def encode_sequence(content, error=None, version=None, mode=None, mask=None, encoding=None, eci=False, boost_error=True, symbol_count=None): """\ EXPERIMENTAL: Creates a sequence of QR codes in Structured Append mode. :return: Iterable of named tuples, see :py:func:`encode` for details. """ def one_item_segments(chunk, mode): """\ Creates a Segments sequence with one item. """ segs = Segments() segs.add_segment(make_segment(chunk, mode=mode, encoding=encoding)) return segs def divide_into_chunks(data, num): k, m = divmod(len(data), num) return [data[i * k + min(i, m):(i + 1) * k + min(i + 1, m)] for i in range(num)] def calc_qrcode_bit_length(char_count, ver_range, mode, encoding=None, is_eci=False, is_sa=False): overhead = 4 # Mode indicator for QR Codes, only # Number of bits in character count indicator overhead += consts.CHAR_COUNT_INDICATOR_LENGTH[mode][ver_range] if is_eci and mode == consts.MODE_BYTE and encoding != consts.DEFAULT_BYTE_ENCODING: overhead += 4 # ECI indicator overhead += 8 # ECI assignment no if is_sa: # 4 bit for mode, 4 bit for the position, 4 bit for total number of symbols # 8 bit for parity data overhead += 5 * 4 bits = 0 if mode == consts.MODE_NUMERIC: num, remainder = divmod(char_count, 3) bits += num * 10 + (4 if remainder == 1 else 7) elif mode == consts.MODE_ALPHANUMERIC: num, remainder = divmod(char_count, 2) bits += num * 11 + (6 if remainder else 0) elif mode == consts.MODE_BYTE: bits += char_count * 8 elif mode in (consts.MODE_KANJI, consts.MODE_HANZI): bits += char_count * 13 return overhead + bits def number_of_symbols_by_version(content, version, error, mode): """\ Returns the number of symbols for the provided version. """ length = len(content) ver_range = version_range(version) bit_length = calc_qrcode_bit_length(length, ver_range, mode, encoding, is_eci=eci, is_sa=True) capacity = consts.SYMBOL_CAPACITY[version][error] # Initial result does not contain the overhead of SA mode for all QR Codes cnt = int(math.ceil(bit_length / capacity)) # Overhead of SA mode for all QR Codes bit_length += 5 * 4 * (cnt - 1) + (12 * (cnt - 1) if eci else 0) return int(math.ceil(bit_length / capacity)) version = normalize_version(version) if version is not None: if version < 1: raise ValueError('This function does not accept Micro QR Code versions. ' f'Provided: "{get_version_name(version)}"') elif symbol_count is None: raise ValueError('Please provide either a QR Code version or the symbol count') if symbol_count is not None and not 1 <= symbol_count <= 16: raise ValueError('The symbol count must be in range 1 .. 16') error = normalize_errorlevel(error, accept_none=True) if error is None: error = consts.ERROR_LEVEL_L mode = normalize_mode(mode) mask = normalize_mask(mask, is_micro=False) segments = prepare_data(content, mode, encoding) guessed_version = None if symbol_count is None: try: # Try to find a version which fits without using Structured Append guessed_version = find_version(segments, error, eci=eci, micro=False) except DataOverflowError: # Data does fit into a usual QR Code but ignore the error silently, # guessed_version is None pass if guessed_version and guessed_version <= (version or guessed_version): # Return iterable of size 1 return [_encode(segments, error=error, version=(version or guessed_version), mask=mask, eci=eci, boost_error=boost_error)] if len(segments.modes) > 1: raise ValueError('This function cannot handle more than one mode (yet). Sorry.') mode = segments.modes[0] # CHANGE iff more than one mode is supported! # Creating one QR code failed or max_no is not None if mode == consts.MODE_NUMERIC: content = str(content) if symbol_count is not None and len(content) < symbol_count: raise ValueError(f'The content is not long enough to be divided into {symbol_count} symbols') sa_parity_data = calc_structured_append_parity(content) num_symbols = symbol_count or 16 if version is not None: num_symbols = number_of_symbols_by_version(content, version, error, mode) if num_symbols > 16: raise DataOverflowError(f'The data does not fit into Structured Append version {version}') chunks = divide_into_chunks(content, num_symbols) if symbol_count is not None: segments = one_item_segments(max(chunks, key=len), mode) version = find_version(segments, error, eci=eci, micro=False, is_sa=True) sa_info = partial(_StructuredAppendInfo, total=len(chunks) - 1, parity=sa_parity_data) return [_encode(one_item_segments(chunk, mode), error=error, version=version, mask=mask, eci=eci, boost_error=boost_error, sa_info=sa_info(i)) for i, chunk in enumerate(chunks)] def _encode(segments, error, version, mask, eci, boost_error, sa_info=None): """\ Creates a (Micro) QR code. NOTE: This function does not check if the input is valid and does not belong to the public API. """ is_micro = version < 1 sa_mode = sa_info is not None buff = Buffer() ver = version ver_range = version if not is_micro: ver = None ver_range = version_range(version) if boost_error: error = boost_error_level(version, error, segments, eci, is_sa=sa_mode) if sa_mode: # ISO/IEC 18004:2015(E) -- 8 Structured Append (page 59) for i in sa_info[:3]: buff.append_bits(i, 4) buff.append_bits(sa_info.parity, 8) # ISO/IEC 18004:2015(E) -- 7.4 Data encoding (page 22) for segment in segments: write_segment(buff, segment, ver, ver_range, eci) capacity = consts.SYMBOL_CAPACITY[version][error] # ISO/IEC 18004:2015(E) -- 7.4.9 Terminator (page 32) write_terminator(buff, capacity, ver, len(buff)) # ISO/IEC 18004:2015(E) -- 7.4.10 Bit stream to codeword conversion (page 34) write_padding_bits(buff, version, len(buff)) # ISO/IEC 18004:2015(E) -- 7.4.10 Bit stream to codeword conversion (page 34) write_pad_codewords(buff, version, capacity, len(buff)) # ISO/IEC 18004:2015(E) -- 7.6 Constructing the final message codeword sequence (page 45) buff = make_final_message(version, error, buff) # Matrix with timing pattern and reserved format / version regions width = calc_matrix_size(version) height = width matrix = make_matrix(width, height) # ISO/IEC 18004:2015 -- 6.3.3 Finder pattern (page 16) add_finder_patterns(matrix, width, height) # ISO/IEC 18004:2015 -- 6.3.6 Alignment patterns (page 17) add_alignment_patterns(matrix, width, height) # ISO/IEC 18004:2015 -- 7.7 Codeword placement in matrix (page 46) add_codewords(matrix, buff, version) # ISO/IEC 18004:2015(E) -- 7.8.2 Data mask patterns (page 50) # ISO/IEC 18004:2015(E) -- 7.8.3 Evaluation of data masking results (page 53) mask, matrix = find_and_apply_best_mask(matrix, width, height, mask) # ISO/IEC 18004:2015(E) -- 7.9 Format information (page 55) add_format_info(matrix, version, error, mask) # ISO/IEC 18004:2015(E) -- 7.10 Version information (page 58) add_version_info(matrix, version) return Code(matrix, version, error, mask, segments) def boost_error_level(version, error, segments, eci, is_sa=False): """\ Increases the error correction level if possible. Returns either the provided or a better error correction level which works while keeping the (Micro) QR Code version. :param int version: Version constant. :param int|None error: Error level constant or ``None`` :param Segments segments: Instance of :py:class:`Segments` :param bool eci: Indicates if ECI designator should be written. :param bool is_sa: Indicates if Structured Append mode is used. """ if error not in (consts.ERROR_LEVEL_H, None) and len(segments) == 1: levels = [consts.ERROR_LEVEL_L, consts.ERROR_LEVEL_M, consts.ERROR_LEVEL_Q, consts.ERROR_LEVEL_H] if version < 1: levels.pop() # H isn't support by Micro QR Codes if version < consts.VERSION_M4: levels.pop() # Error level Q isn't supported by M2 and M3 data_length = segments.bit_length_with_overhead(version, eci, is_sa=is_sa) for error_level in levels[levels.index(error) + 1:]: if consts.SYMBOL_CAPACITY[version][error_level] >= data_length: error = error_level else: break return error def write_segment(buff, segment, ver, ver_range, eci=False): """\ Writes a segment. :param buff: The byte buffer. :param _Segment segment: The segment to serialize. :param ver: ``None`` if a QR Code is written, "M1", "M2", "M3", or "M4" if a Micro QR Code is written. :param ver_range: "M1", "M2", "M3", or "M4" if a Micro QR Code is written, otherwise a constant representing a range of QR Code versions. """ mode = segment.mode append_bits = buff.append_bits # Write ECI header if requested if eci and mode == consts.MODE_BYTE \ and segment.encoding != consts.DEFAULT_BYTE_ENCODING: append_bits(consts.MODE_ECI, 4) append_bits(get_eci_assignment_number(segment.encoding), 8) if ver is None: # QR Code append_bits(mode, 4) if mode == consts.MODE_HANZI: subset = 1 # Indicator for GB2312 subset append_bits(subset, 4) elif ver > consts.VERSION_M1: # Micro QR Code (M1 has no mode indicator) append_bits(consts.MODE_TO_MICRO_MODE_MAPPING[mode], ver + 3) # Character count indicator append_bits(segment.char_count, consts.CHAR_COUNT_INDICATOR_LENGTH[mode][ver_range]) buff.extend(segment.bits) def write_terminator(buff, capacity, ver, length): """\ Writes the terminator. :param buff: The byte buffer. :param capacity: Symbol capacity. :param ver: ``None`` if a QR Code is written, "M1", "M2", "M3", or "M4" if a Micro QR Code is written. :param length: Length of the data bit stream. """ # ISO/IEC 18004:2015 -- 7.4.9 Terminator (page 32) buff.extend([0] * min(capacity - length, consts.TERMINATOR_LENGTH[ver])) def write_padding_bits(buff, version, length): """\ Writes padding bits if the data stream does not meet the codeword boundary. :param buff: The byte buffer. :param int length: Data stream length. """ # ISO/IEC 18004:2015(E) - 7.4.10 Bit stream to codeword conversion -- page 32 # [...] # All codewords are 8 bits in length, except for the final data symbol # character in Micro QR Code versions M1 and M3 symbols, which is 4 bits # in length. If the bit stream length is such that it does not end at a # codeword boundary, padding bits with binary value 0 shall be added after # the final bit (least significant bit) of the data stream to extend it # to the codeword boundary. [...] if version not in (consts.VERSION_M1, consts.VERSION_M3): buff.extend([0] * (8 - (length % 8))) def write_pad_codewords(buff, version, capacity, length): """\ Writes the pad codewords iff the data does not fill the capacity of the symbol. :param buff: The byte buffer. :param int version: The (Micro) QR Code version. :param int capacity: The total capacity of the symbol (incl. error correction) :param int length: Length of the data bit stream. """ # ISO/IEC 18004:2015(E) -- 7.4.10 Bit stream to codeword conversion (page 32) # The message bit stream shall then be extended to fill the data capacity # of the symbol corresponding to the Version and Error Correction Level, as # defined in Table 8, by adding the Pad Codewords 11101100 and 00010001 # alternately. For Micro QR Code versions M1 and M3 symbols, the final data # codeword is 4 bits long. The Pad Codeword used in the final data symbol # character position in Micro QR Code versions M1 and M3 symbols shall be # represented as 0000. write = buff.extend if version in (consts.VERSION_M1, consts.VERSION_M3): write([0] * (capacity - length)) else: pad_codewords = ((1, 1, 1, 0, 1, 1, 0, 0), (0, 0, 0, 1, 0, 0, 0, 1)) for i in range(capacity // 8 - length // 8): write(pad_codewords[i % 2]) # Finder pattern (includes separator around each side!) _FINDER_PATTERN = ((0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0), (0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0), (0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0), (0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x1, 0x0), (0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x1, 0x0), (0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x1, 0x0), (0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0), (0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0), (0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)) def add_finder_patterns(matrix, width, height): """\ Adds the finder pattern(s) with the separators to the matrix. QR Codes get three finder patterns, Micro QR Codes have just one finder pattern. ISO/IEC 18004:2015(E) -- 6.3.3 Finder pattern (page 16) ISO/IEC 18004:2015(E) -- 6.3.4 Separator (page 17) :param matrix: The matrix. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. """ is_square = width == height corners = ((0, 0), (0, len(matrix) - 8), (-8, 0)) # Upper left, upper right, bottom left if is_square and width < 21: corners = ((0, 0),) finder_range = range(8) for i, j in corners: offset = 1 if i == 0 else 0 sepoffset = 0 if j != 0 else 1 for r in finder_range: matrix[i + r][j:j + 8] = _FINDER_PATTERN[offset + r][sepoffset:sepoffset + 8] def add_timing_pattern(matrix, is_micro): """\ Adds the (horizontal and vertical) timinig pattern to the provided `matrix`. ISO/IEC 18004:2015(E) -- 6.3.5 Timing pattern (page 17) :param matrix: Matrix to add the timing pattern into. :param bool is_micro: Indicates if the timing pattern for a Micro QR Code should be added. """ j, stop = (0, len(matrix)) if is_micro else (6, len(matrix) - 8) col = matrix[j] bit = 0x1 for i in range(8, stop): matrix[i][j] = bit col[i] = bit bit ^= 0x1 def add_alignment_patterns(matrix, width, height): """\ Adds the adjustment patterns to the matrix. For versions < 2 this is a no-op. ISO/IEC 18004:2015(E) -- 6.3.6 Alignment patterns (page 17) ISO/IEC 18004:2015(E) -- Annex E Position of alignment patterns (page 83) :param matrix: An iterable of bytearrays. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. """ is_square = width == height version = (width - 17) // 4 # QR Codes: version * 4 + 17 == width / height of the matrix w/o border if is_square and version < 2: # QR Codes version < 2 don't have alignment patterns return pattern = (0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1) positions = consts.ALIGNMENT_POS[version - 2] alignment_range = range(5) min_pos = positions[0] max_pos = positions[-1] finder_positions = ((min_pos, min_pos), (min_pos, max_pos), (max_pos, min_pos)) for x, y in product(positions, repeat=2): if (x, y) in finder_positions: continue # The x and y values represent the center of the alignment pattern i, j = x - 2, y - 2 for r in alignment_range: matrix[i + r][j:j + 5] = pattern[r * 5:r * 5 + 5] def add_codewords(matrix, codewords, version): """\ Adds the codewords (data and error correction) to the provided matrix. ISO/IEC 18004:2015(E) -- 7.7.3 Symbol character placement (page 46) :param matrix: The matrix to add the codewords into. :param codewords: Sequence of bits :param int version: The (Micro) QR Code version constant. """ matrix_size = len(matrix) is_micro = version < 1 # Necessary for M1 and M3: The algorithm would start at the upper right # corner, see inc = 0 if version not in (consts.VERSION_M1, consts.VERSION_M3) else 2 idx = 0 # Pointer to the current codeword # ISO/IEC 18004:2015(E) - page 48 # [...] An alternative method for placement in the symbol [...] is to regard # the interleaved codeword sequence as a single bit stream, which is placed # (starting with the most significant bit) in the two-module wide columns # alternately upwards and downwards from the right to left of the symbol. # [...] codeword_length = len(codewords) range_two = range(2) for right in range(matrix_size - 1, 0, -2): if not is_micro and right <= 6: right -= 1 for vertical in range(matrix_size): for z in range_two: j = right - z upwards = ((right + inc) & 2) == 0 if not is_micro: upwards ^= j < 6 i = (matrix_size - 1 - vertical) if upwards else vertical row = matrix[i] if row[j] == 0x2 and idx < codeword_length: row[j] = codewords[idx] idx += 1 if idx != len(codewords): # pragma: no cover raise ValueError('Internal error: Adding codewords to matrix failed. ' f'Added {idx} of {len(codewords)} codewords') def make_final_message(version, error, buff): """\ Constructs the final message (codewords incl. error correction). ISO/IEC 18004:2015(E) -- 7.6 Constructing the final message codeword sequence (page 45) :param int version: (Micro) QR Code version constant. :param int error: Error level constant. :param buff: Byte buffer. :return: Byte buffer representing the final message. """ def to_binary(val, length=8): return ((val >> i) & 1 for i in reversed(range(length))) ec_infos = consts.ECC[version][error] data_blocks, error_blocks = make_blocks(ec_infos, buff) cw_four = None if version in (consts.VERSION_M1, consts.VERSION_M3): # All codewords are 8 bit by default, M1 and M3 symbols use 4 bits # to represent the last codeword. # datablocks[0] is save since Micro QR Codes use just one datablock and # one error block cw_four = to_binary(data_blocks[0].pop(-1) >> 4, 4) res = Buffer() # Write codewords res.extend(chain(*map(to_binary, (x for x in chain.from_iterable(zip_longest(*data_blocks)) if x is not None)))) if cw_four is not None: res.extend(cw_four) # Write error codewords res.extend(chain(*map(to_binary, (x for x in chain.from_iterable(zip_longest(*error_blocks)) if x is not None)))) # ISO/IEC 18004:2015(E) -- 7.6 Constructing the final message codeword sequence # [...] In certain QR Code versions, however, where the number of modules # available for data and error correction codewords is not an exact multiple # of 8, there may be a need for 3, 4 or 7 Remainder Bits to be appended to # the final message bit stream in order to fill exactly the number of # modules in the encoding region remainder = 0 if version in (2, 3, 4, 5, 6): remainder = 7 elif version in (14, 15, 16, 17, 18, 19, 20, 28, 29, 30, 31, 32, 33, 34): remainder = 3 elif version in (21, 22, 23, 24, 25, 26, 27): remainder = 4 res.extend(b'\0' * remainder) return res def make_blocks(ec_infos, buff): """\ Returns the data and error blocks. :param ec_infos: Iterable of ECC information :param buff: Byte buffer. """ codewords = buff.toints() data_blocks, error_blocks = [], [] append_data_block = data_blocks.append append_error_block = error_blocks.append gen_log = consts.GALIOS_LOG gen_exp = consts.GALIOS_EXP for ec_info in ec_infos: num_error_words = ec_info.num_total - ec_info.num_data gen = consts.GEN_POLY[num_error_words] range_error_words = range(num_error_words) for i in range(ec_info.num_blocks): block = bytearray(islice(codewords, ec_info.num_data)) append_data_block(block) len_data = len(block) error_block = bytearray(block) error_block.extend([0] * num_error_words) # Extended synthetic division, see http://research.swtch.com/field for k in range(len_data): coef = error_block[k] if coef != 0: # log(0) is undefined lcoef = gen_log[coef] for n in range_error_words: error_block[k + n + 1] ^= gen_exp[lcoef + gen[n]] append_error_block(error_block[len_data:]) return data_blocks, error_blocks def find_and_apply_best_mask(matrix, width, height, proposed_mask=None): """\ Applies all mask patterns against the provided QR Code matrix and returns the best matrix and best pattern. ISO/IEC 18004:2015(E) -- 7.8.2 Data mask patterns (page 50) ISO/IEC 18004:2015(E) -- 7.8.3 Evaluation of data masking results (page 53) ISO/IEC 18004:2015(E) -- 7.8.3.1 Evaluation of QR Code symbols (page 53/54) ISO/IEC 18004:2015(E) -- 7.8.3.2 Evaluation of Micro QR Code symbols (page 54/55) :param matrix: A matrix. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param proposed_mask: Optional int to indicate the preferred mask. :rtype: tuple :return: A tuple of the best matrix and best data mask pattern index. """ # ISO/IEC 18004:2015 -- 7.8.3.1 Evaluation of QR Code symbols (page 53/54) # The data mask pattern which results in the lowest penalty score shall # be selected for the symbol. is_better = lt best_score = _MAX_PENALTY_SCORE eval_mask = evaluate_mask is_micro = width == height and width < 21 if is_micro: # ISO/IEC 18004:2015(E) - 7.8.3.2 Evaluation of Micro QR Code symbols (page 54/55) # The data mask pattern which results in the highest score shall be # selected for the symbol. is_better = gt best_score = -1 eval_mask = evaluate_micro_mask # Matrix to check if a module belongs to the encoding region # or to the function patterns function_matrix = make_matrix(width, height) add_finder_patterns(function_matrix, width, height) add_alignment_patterns(function_matrix, width, height) if not is_micro: function_matrix[-8][8] = 0x1 def is_encoding_region(i, j): return function_matrix[i][j] > 0x1 mask_patterns = get_data_mask_functions(is_micro) # If the user supplied a mask pattern, the evaluation step is skipped if proposed_mask is not None: apply_mask(matrix, mask_patterns[proposed_mask], width, height, is_encoding_region) return proposed_mask, matrix best_matrix = None for mask_number, mask_pattern in enumerate(mask_patterns): m = [ba[:] for ba in matrix] apply_mask(m, mask_pattern, width, height, is_encoding_region) # NOTE: DO NOT add format / version info in advance of evaluation # See ISO/IEC 18004:2015(E) -- 7.8. Data masking (page 50) score = eval_mask(m, width, height) if is_better(score, best_score): best_score = score best_pattern = mask_number best_matrix = tuple(m) return best_pattern, best_matrix def apply_mask(matrix, mask_pattern, width, height, is_encoding_region): """\ Applies the provided mask pattern on the `matrix`. ISO/IEC 18004:2015(E) -- 7.8.2 Data mask patterns (page 50) :param tuple matrix: A tuple of bytearrays :param mask_pattern: A mask pattern (a function) :param int matrix_size: width or height of the matrix :param is_encoding_region: A function which returns ``True`` iff the row index / col index belongs to the data region. """ width_range = range(width) for i in range(height): row = matrix[i] for j in width_range: if is_encoding_region(i, j): row[j] ^= mask_pattern(i, j) def evaluate_mask(matrix, width, height): """\ Evaluates the provided `matrix` of a QR code. ISO/IEC 18004:2015(E) -- 7.8.3 Evaluation of data masking results (page 53) :param matrix: The matrix to evaluate :param matrix_size: The width (or height) of the matrix. :return int: The penalty score of the matrix. """ return sum(mask_scores(matrix, width, height)) def mask_scores(matrix, width, height): """\ Returns the penalty score features of the matrix. The returned value is a tuple of all penalty scores (N1, N2, N3, N4). Use :py:func:`evaluate_mask` for a single value (sum of all scores). ISO/IEC 18004:2015(E) -- 7.8.3 Evaluation of data masking results - Table 11 (page 54) ============================================ ==================================== =============== Feature Evaluation condition Points ============================================ ==================================== =============== Adjacent modules in row/column in same color No. of modules = (5 + i) N1 + i Block of modules in same color Block size = m × n N2 ×(m-1)×(n-1) 1 : 1 : 3 : 1 : 1 ratio Existence of the pattern N3 (dark:light:dark:light:dark) pattern in row/column, preceded or followed by light area 4 modules wide Proportion of dark modules in entire symbol 50 × (5 × k)% to 50 × (5 × (k + 1))% N4 × k ============================================ ==================================== =============== N1 = 3 N2 = 3 N3 = 40 N4 = 10 :param matrix: The matrix to evaluate :param matrix_size: The width (or height) of the matrix. :return tuple: A tuple of penalty scores (ints): ``(n1, n2, n3, n4)``. """ # noqa: RUF002 n3_pattern = bytearray((0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x1)) def n3_pattern_occurrences(seq): count = 0 idx = seq.find(n3_pattern) while idx != -1: offset = idx + 7 if idx in (0, qr_size - 7) \ or not any(seq[max(idx - 4, 0):min(idx, qr_size)]) \ or not any(seq[max(offset, 0):min(offset + 4, qr_size)]): count += 40 # N3 = 40 else: # Found no / not enough light modules, start at next possible # match: # v # dark light dark dark dark light dark # ^ offset = idx + 4 idx = seq.find(n3_pattern, offset) return count score_n1 = 0 score_n2 = 0 score_n3 = 0 assert width == height qr_size = width qr_module_range = range(qr_size) dark_module_counter = 0 last_row = None # Collects the bytes column-wise (required to calculate score N3) n3_column = bytearray(qr_size) for i in qr_module_range: row = matrix[i] row_prev_bit = -1 col_prev_bit = -1 # N1 n1_row_counter = 0 n1_col_counter = 0 for j in qr_module_range: row_current_bit = row[j] col_current_bit = matrix[j][i] n3_column[j] = col_current_bit dark_module_counter += row_current_bit # N1 -- row-wise if row_current_bit == row_prev_bit: n1_row_counter += 1 else: if n1_row_counter >= 5: score_n1 += n1_row_counter - 2 n1_row_counter = 1 # N1 -- col-wise if col_current_bit == col_prev_bit: n1_col_counter += 1 else: if n1_col_counter >= 5: score_n1 += n1_col_counter - 2 n1_col_counter = 1 # N2 if last_row and j and row_current_bit == row_prev_bit == last_row[j] == last_row[j - 1]: score_n2 += 3 row_prev_bit = row_current_bit col_prev_bit = col_current_bit last_row = row # N3 score_n3 += n3_pattern_occurrences(row) score_n3 += n3_pattern_occurrences(n3_column) # N1 if n1_row_counter >= 5: score_n1 += n1_row_counter - 2 if n1_col_counter >= 5: score_n1 += n1_col_counter - 2 # N4 percent = float(dark_module_counter) / (qr_size ** 2) score_n4 = 10 * int(abs(percent * 100 - 50) / 5) # N4 = 10 return score_n1, score_n2, score_n3, score_n4 def evaluate_micro_mask(matrix, width, height): """\ Evaluates the provided `matrix` of a Micro QR code. ISO/IEC 18004:2015(E) -- 7.8.3.2 Evaluation of Micro QR Code symbols (page 54) :param matrix: The matrix to evaluate :param matrix_size: The width (or height) of the matrix. :return int: The penalty score of the matrix. """ module_range = range(1, width) last_row = matrix[-1] sum1 = sum(matrix[i][-1] for i in module_range) sum2 = sum(last_row[i] for i in module_range) return sum1 * 16 + sum2 if sum1 <= sum2 else sum2 * 16 + sum1 def calc_format_info(version, error, mask_pattern): """\ Returns the format information for the provided error level and mask patttern. ISO/IEC 18004:2015(E) -- 7.9 Format information (page 55) ISO/IEC 18004:2015(E) -- Table C.1 — Valid format information bit sequences (page 80) :param int version: Version constant :param int error: Error level constant. :param int mask_pattern: Mask pattern number. """ fmt = mask_pattern if version > 0: if error == consts.ERROR_LEVEL_L: fmt += 0x08 elif error == consts.ERROR_LEVEL_H: fmt += 0x10 elif error == consts.ERROR_LEVEL_Q: fmt += 0x18 format_info = consts.FORMAT_INFO[fmt] else: fmt += consts.ERROR_LEVEL_TO_MICRO_MAPPING[version][error] << 2 format_info = consts.FORMAT_INFO_MICRO[fmt] return format_info def add_format_info(matrix, version, error, mask_pattern): """\ Adds the format information into the provided matrix. ISO/IEC 18004:2015(E) -- 7.9 Format information (page 55) ISO/IEC 18004:2015(E) -- 7.9.1 QR Code symbols ISO/IEC 18004:2015(E) -- 7.9.2 Micro QR Code symbols :param matrix: The matrix. :param int version: Version constant :param int error: Error level constant. :param int mask_pattern: Mask pattern number. """ # 14: most significant bit # 0: least significant bit # # QR Code format info: Micro QR format info # col 0 col 7 col matrix[-1] col 1 # 0 | | [ ] # 1 0 # 2 1 # 3 2 # 4 3 # 5 4 # [ ] 5 # 6 6 # 14 13 12 11 10 9 [ ] 8 7 ... 7 6 5 4 3 2 1 0 14 13 12 11 10 9 8 7 # # ... # [ ] (dark module) # 8 # 9 # 10 # 11 # 12 # 13 # 14 is_micro = version < 1 format_info = calc_format_info(version, error, mask_pattern) voffset = int(is_micro) hoffset = voffset row_eight = matrix[8] for i in range(8): vbit = (format_info >> i) & 0x01 hbit = (format_info >> (14 - i)) & 0x01 if i == 6 and not is_micro: # Timing pattern voffset += 1 hoffset = 1 # vertical row, upper left corner matrix[i + voffset][8] = vbit # horizontal row, upper left corner row_eight[i + hoffset] = hbit if not is_micro: # horizontal row, upper right corner row_eight[-1 - i] = vbit # vertical row, bottom left corner matrix[-1 - i][8] = hbit if not is_micro: # Dark module matrix[-8][8] = 0x1 def add_version_info(matrix, version): """\ Adds the version information to the matrix, for versions < 7 this is a no-op. ISO/IEC 18004:2015(E) -- 7.10 Version information (page 58) """ # # module 0 = least significant bit # module 17 = most significant bit # # Figure 27 — Version information positioning (page 58) # # Lower left Upper right # ---------- ----------- # 0 3 6 9 12 15 0 1 2 # 1 4 7 10 13 16 3 4 5 # 2 5 8 11 14 17 6 7 8 # 9 10 11 # 12 13 14 # 15 16 17 # if version < 7: return version_info = consts.VERSION_INFO[version - 7] for i in range(6): bit1 = (version_info >> (i * 3)) & 0x01 bit2 = (version_info >> ((i * 3) + 1)) & 0x01 bit3 = (version_info >> ((i * 3) + 2)) & 0x01 # Lower left matrix[-11][i] = bit1 matrix[-10][i] = bit2 matrix[-9][i] = bit3 # Upper right row = matrix[i] row[-11] = bit1 row[-10] = bit2 row[-9] = bit3 def prepare_data(content, mode, encoding): """\ Returns an iterable of `Segment` instances. If `content` is a string, an integer, or bytes, the returned tuple will have a single item. If `content` is a list or a tuple, a tuple of `Segment` instances of the same length is returned. :param content: Either a string, bytes, an integer or an iterable. :type content: str, bytes, int, tuple, list or any iterable :param mode: The global mode. If `content` is list/tuple, the `Segment` instances may have a different mode. :param encoding: The global encoding. If `content` is a list or a tuple, the `Segment` instances may have a different encoding. :rtype: Segments """ segments = Segments() add_segment = segments.add_segment if isinstance(content, (str, bytes, int)): add_segment(make_segment(content, mode, encoding)) return segments for item in content: seg_content, seg_mode, seg_encoding = item, mode, encoding if isinstance(item, tuple): seg_content = item[0] if len(item) > 1: seg_mode = item[1] or mode # item[1] could be None if len(item) > 2: seg_encoding = item[2] or encoding # item[2] may be None add_segment(make_segment(seg_content, seg_mode, seg_encoding)) return segments def data_to_bytes(data, encoding): """\ Converts the provided data into bytes. If the data is already a byte sequence, it will be left unchanged. This function tries to use the provided `encoding` (if not ``None``) or the default encoding (ISO/IEC 8859-1). It uses UTF-8 as fallback. Returns the (byte) data, the length of the data and the encoding of the data. :param data: The data to encode :type data: str or bytes :param encoding: str or ``None`` :rtype: tuple: data, data length, encoding """ if isinstance(data, bytes): return data, len(data), encoding or consts.DEFAULT_BYTE_ENCODING data = str(data) if encoding is not None: # Use the provided encoding; could raise an exception by intention data = data.encode(encoding) else: try: # Try to use the default byte encoding encoding = consts.DEFAULT_BYTE_ENCODING data = data.encode(encoding) except UnicodeError: try: # Try Kanji / Shift_JIS encoding = consts.KANJI_ENCODING data = data.encode(encoding) except UnicodeError: # Use UTF-8 encoding = 'utf-8' data = data.encode(encoding) return data, len(data), encoding def make_segment(data, mode, encoding=None): """\ Creates a :py:class:`Segment`. :param data: The segment data :param mode: The mode. :param encoding: The encoding. :rtype: _Segment """ if mode == consts.MODE_HANZI: encoding = consts.HANZI_ENCODING segment_data, segment_length, segment_encoding = data_to_bytes(data, encoding) segment_mode = mode # If the user prefers BYTE, use BYTE and do not try to find a better mode # Necessary since BYTE < KANJI and find_mode may return KANJI as (more) # appropriate mode and the encoder throws an exception # if "user provided mode" < "found mode" guessed_mode = find_mode(segment_data) if segment_mode != consts.MODE_BYTE else consts.MODE_BYTE if segment_mode is not None: # Check if user provided mode is applicable for the given segment_data if segment_mode < guessed_mode: raise ValueError(f'The provided mode "{get_mode_name(segment_mode)}" ' f'is not applicable for {segment_data!r}. ' f'Proposal: {get_mode_name(guessed_mode)}') else: segment_mode = guessed_mode if segment_mode != consts.MODE_BYTE: segment_encoding = None char_count = segment_length if segment_mode not in (consts.MODE_KANJI, consts.MODE_HANZI) else segment_length // 2 buff = Buffer() append_bits = buff.append_bits if segment_mode == consts.MODE_NUMERIC: # ISO/IEC 18004:2015(E) -- 7.4.3 Numeric mode (page 25) # The input data string is divided into groups of three digits, and # each group is converted to its 10-bit binary equivalent. If the number # of input digits is not an exact multiple of three, the final one or # two digits are converted to 4 or 7 bits respectively. for i in range(0, segment_length, 3): chunk = segment_data[i:i + 3] append_bits(int(chunk), len(chunk) * 3 + 1) elif segment_mode == consts.MODE_ALPHANUMERIC: # ISO/IEC 18004:2015(E) -- 7.4.4 Alphanumeric mode (page 26) to_byte = consts.ALPHANUMERIC_CHARS.find for i in range(0, segment_length, 2): chunk = segment_data[i:i + 2] # Input data characters are divided into groups of two characters # which are encoded as 11-bit binary codes. The character value of # the first character is multiplied by 45 and the character value # of the second digit is added to the product. The sum is then # converted to an 11-bit binary number. if len(chunk) > 1: append_bits(to_byte(chunk[0]) * 45 + to_byte(chunk[1]), 11) else: # If the number of input data characters is not a multiple of # two, the character value of the final character is encoded # as a 6-bit binary number. append_bits(to_byte(chunk), 6) elif segment_mode == consts.MODE_BYTE: # ISO/IEC 18004:2015(E) -- 7.4.5 Byte mode (page 27) for b in segment_data: append_bits(b, 8) elif segment_mode == consts.MODE_HANZI: # GBT 18284-2000 -- 6.4.5 Hanzi mode (page 18) # Note: len(segment.data)! segment.data_length = len(segment.data) / 2!! for i in range(0, segment_length, 2): code = (segment_data[i] << 8) | segment_data[i + 1] if 0xa1a1 <= code <= 0xaafe: # For characters with GB2312 values from A1A1HEX to AAFEHEX: # a) Subtract A1A1HEX from GB2312 value; diff = code - 0xa1a1 elif 0xb0a1 <= code <= 0xfafe: # For characters with GB2312 values from B0A1HEX to FAFEHEX: # a) Subtract A6A1HEX from GB2312 value; diff = code - 0xa6a1 else: # pragma: no cover raise ValueError(f'Invalid Hanzi bytes: {code}') # b) Multiply most significant byte of result by 60HEX; # c) Add least significant byte to product from b); # d) Convert result to a 13-bit binary string. append_bits(((diff >> 8) * 0x60) + (diff & 0xff), 13) else: # ISO/IEC 18004:2015(E) -- 7.4.6 Kanji mode (page 29) for i in range(0, segment_length, 2): code = (segment_data[i] << 8) | segment_data[i + 1] if 0x8140 <= code <= 0x9ffc: # 1. a) For characters with Shift JIS values from 8140HEX to 9FFCHEX: # Subtract 8140HEX from Shift JIS value; diff = code - 0x8140 elif 0xe040 <= code <= 0xebbf: # 2. a) For characters with Shift JIS values from E040HEX to EBBFHEX: # Subtract C140HEX from Shift JIS value; diff = code - 0xc140 else: # pragma: no cover raise ValueError(f'Invalid Kanji bytes: {code}') # b) Multiply most significant byte of result by C0HEX; # c) Add least significant byte to product from b); # d) Convert result to a 13-bit binary string. append_bits(((diff >> 8) * 0xc0) + (diff & 0xff), 13) return _Segment(buff.getbits(), char_count, segment_mode, segment_encoding) def make_matrix(width, height, reserve_regions=True, add_timing=True): """\ Creates a matrix of the provided `size` (w x h) initialized with the (illegal) value 0x2. The "timing pattern" is already added to the matrix and the version and format areas are initialized with 0x0. :param int width: Matrix width :param int height: Matrix height. :rtype: tuple of bytearrays """ is_square = width == height is_micro = is_square and width < 21 row = [0x2] * width matrix = tuple(bytearray(row) for i in range(height)) if reserve_regions: if is_square and width > 41: # QR Codes < version 7 don't have a version pattern # Reserve version pattern areas for i in range(6): row = matrix[i] # Upper right row[-11] = 0x0 row[-10] = 0x0 row[-9] = 0x0 # Lower left matrix[-11][i] = 0x0 matrix[-10][i] = 0x0 matrix[-9][i] = 0x0 # Reserve format pattern areas row_eight = matrix[8] for i in range(9): matrix[i][8] = 0x0 # Upper left row_eight[i] = 0x0 # Upper bottom if not is_micro: matrix[-i][8] = 0x0 # Bottom left row_eight[-i] = 0x0 # Upper right if add_timing: # ISO/IEC 18004:2015 -- 6.3.5 Timing pattern (page 17) add_timing_pattern(matrix, is_micro) return matrix def normalize_version(version): """\ Canonicalization of the provided `version`. If the `version` is ``None``, this function returns ``None``. Otherwise this function checks if `version` is an integer or a Micro QR Code version. In case the string represents a Micro QR Code version, an uppercased string identifier is returned. If the `version` does not represent a valid version identifier (aside of ``None``) a :py:exc:`ValueError` is raised. :param version: An integer, a string or ``None``. :raises: :py:exc:`ValueError`: In case the version is not ``None`` and does not represent a valid (Micro) QR Code version. :rtype: int, str or ``None`` """ if version is None: return None error = False try: version = int(version) # Don't want Micro QR Code constants as input error = version < 1 except (ValueError, TypeError): try: version = consts.MICRO_VERSION_MAPPING[version.upper()] except (KeyError, AttributeError): error = True if error or (not 0 < version < 41 and version not in consts.MICRO_VERSIONS): raise ValueError(f'Unsupported version "{version}". ' f'Supported: {", ".join(sorted(consts.MICRO_VERSION_MAPPING.keys()))} and 1 .. 40') return version def normalize_mode(mode): """\ Returns a (Micro) QR Code mode constant which is equivalent to the provided `mode`. In case the provided `mode` is ``None``, this function returns ``None``. Otherwise a mode constant is returned unless the provided parameter cannot be mapped to a valid mode. In the latter case, a :py:exc:`ValueError` is raised. :param mode: An integer or string or ``None``. :raises: :py:exc:`ValueError` In case the provided `mode` does not represent a valid QR Code mode. :rtype: int or None """ if mode is None or mode in consts.MODE_MAPPING.values(): return mode try: return consts.MODE_MAPPING[mode.lower()] except (KeyError, AttributeError): raise ValueError(f'Illegal mode "{mode}". ' f'Supported values: {", ".join(sorted(consts.MODE_MAPPING.keys()))}') def normalize_mask(mask, is_micro): """\ Normalizes the (user specified) mask. :param mask: A mask constant :type mask: int or None :param bool is_micro: Indicates if the mask is meant to be used for a Micro QR Code. :raises: :py:exc:`ValueError` in case of an invalid mask. :rtype: int """ if mask is None: return None try: mask = int(mask) except ValueError: raise ValueError(f'Invalid data mask "{mask}". ' 'Must be an integer or a string which represents an integer value.') if is_micro: if not 0 <= mask < 4: raise ValueError(f'Invalid data mask "{mask}" for Micro QR Code. Must be in range 0 .. 3') else: if not 0 <= mask < 8: raise ValueError(f'Invalid data mask "{mask}". Must be in range 0 .. 7') return mask def normalize_errorlevel(error, accept_none=False): """\ Returns a constant for the provided error level. This function returns ``None`` if the provided parameter is ``None`` and `accept_none` is set to ``True`` (default: ``False``). If `error` is ``None`` and `accept_none` is ``False`` or if the provided parameter cannot be mapped to a valid QR Code error level, a :py:exc:`ValueError` is raised. :param error: String or ``None``. :param bool accept_none: Indicates if ``None`` is accepted as error level. :raises: :py:exc:`ValueError` in case of an invalid mode. :rtype: int """ if error is None: if not accept_none: raise ValueError('The error level must be provided') return error try: return consts.ERROR_MAPPING[error.upper()] except (KeyError, AttributeError): if error in consts.ERROR_MAPPING.values(): return error raise ValueError(f'Illegal error correction level: "{error}". Supported levels: L, M, Q, H') def get_mode_name(mode_const): """\ Returns the mode name for the provided mode constant. :param int mode_const: The mode constant (see :py:module:`segno.consts`) :raises: :py:exc:`ValueError` in case of an unknown mode constant. :rtype: str """ for name, val in consts.MODE_MAPPING.items(): if val == mode_const: return name raise ValueError(f'Unknown mode "{mode_const}"') def get_error_name(error_const): """\ Returns the error name for the provided error constant. :param int error_const: The error constant (see :py:module:`segno.consts`) :raises: :py:exc:`ValueError` in case of an unknown error correction level. :rtype: str """ for name, val in consts.ERROR_MAPPING.items(): if val == error_const: return name raise ValueError(f'Unknown error level "{error_const}"') def get_version_name(version_const): """\ Returns the version name. For version 1 .. 40 it returns the version as integer, for Micro QR Codes it returns a string like ``M1`` etc. :raises: :py:exc:`VersionError`: In case the `version_constant` is unknown. :rtype: str or int """ if 0 < version_const < 41: return version_const for name, v in consts.MICRO_VERSION_MAPPING.items(): if v == version_const: return name raise ValueError(f'Unknown version constant "{version_const}"') _ALPHANUMERIC_PATTERN = re.compile(br'^[' + re.escape(consts.ALPHANUMERIC_CHARS) + br']+\Z') def is_alphanumeric(data): """\ Returns if the provided `data` can be encoded in "alphanumeric" mode. :param bytes data: The data to check. :rtype: bool """ return _ALPHANUMERIC_PATTERN.match(data) def is_kanji(data): """\ Returns if the `data` can be encoded in "kanji" mode. :param bytes data: The data to check. :rtype: bool """ data_len = len(data) if not data_len or data_len % 2: return False data_iter = iter(data) for i in range(0, data_len, 2): code = (next(data_iter) << 8) | next(data_iter) if not (0x8140 <= code <= 0x9ffc or 0xe040 <= code <= 0xebbf): return False return True def find_mode(data): """\ Returns the appropriate QR Code mode (an integer constant) for the provided `data`. :param bytes data: Data to check. :rtype: int """ if data.isdigit(): return consts.MODE_NUMERIC if is_alphanumeric(data): return consts.MODE_ALPHANUMERIC if is_kanji(data): return consts.MODE_KANJI return consts.MODE_BYTE def find_version(segments, error, eci, micro, is_sa=False): """\ Returns the minimal (Micro) QR Code version constant for the provided input. :param segments: Iterable of Segment instances. :param error: The error correction level constant. :type error: int or None :param bool eci: Indicates if the ECI mode should be used. :param micro: Boolean value if a Micro QR Code should be created or ``None`` :type micro: bool or None :param bool is_sa: Indicator if Structured Append is used. :raises: :py:exc:`ValueError` if the content does not fit into a QR Code. :rtype: int """ assert not (eci and micro) micro_allowed = micro or micro is None min_version = consts.VERSION_M1 if micro_allowed else 1 max_version = consts.VERSION_M4 if micro else 40 if min_version < 1: min_version = max([find_minimum_version_for_mode(mode) for mode in segments.modes]) if error is not None and micro_allowed: min_version = consts.VERSION_M2 for version in range(min_version, max_version + 1): if error is None and version != consts.VERSION_M1: error = consts.ERROR_LEVEL_L try: if consts.SYMBOL_CAPACITY[version][error] >= segments.bit_length_with_overhead(version, eci, is_sa): return version except KeyError: pass help_txt = '' if micro is None: help_txt = '(Micro) ' elif micro: help_txt = 'Micro ' raise DataOverflowError(f'Data too large. No {help_txt}QR Code can handle the provided data') def calc_matrix_size(ver): """\ Returns the matrix size according to the provided `version`. Note: This function does not check if `version` is actually a valid (Micro) QR Code version. Invalid versions like ``41`` may return a size as well. :param int ver: (Micro) QR Code version constant. :rtype: int """ return ver * 4 + 17 if ver > 0 else (ver + 4) * 2 + 9 def calc_structured_append_parity(content): """\ Calculates the parity data for the Structured Append mode. :param str content: The content. :rtype: int """ if not isinstance(content, str): content = str(content) try: data = content.encode('iso-8859-1') except UnicodeError: try: data = content.encode('shift-jis') except (LookupError, UnicodeError): data = content.encode('utf-8') return reduce(xor, data) def is_mode_supported(mode, ver): """\ Returns if `mode` is supported by `version`. Note: This function does not check if `version` is actually a valid (Micro) QR Code version. Invalid versions like ``41`` may return an illegal value. :param int mode: Canonicalized mode. :param int or None ver: (Micro) QR Code version constant. :rtype: bool """ ver = None if ver > 0 else ver try: return ver in consts.SUPPORTED_MODES[mode] except KeyError: raise ValueError(f'Unknown mode "{mode}"') def find_minimum_version_for_mode(mode): """\ Returns the minimum Micro QR Code version which supports the provided mode. :param int mode: Canonicalized mode. :rtype: int """ for v in consts.MICRO_VERSIONS: if is_mode_supported(mode, v): return v return 1 def version_range(version): """\ Returns the version range for the provided version. This applies to QR Code versions, only. :param int version: The QR Code version (1 .. 40) :rtype: int """ # ISO/IEC 18004:2015(E) # Table 3 — Number of bits in character count indicator for QR Code (page 23) if 0 < version < 10: return consts.VERSION_RANGE_01_09 elif 9 < version < 27: return consts.VERSION_RANGE_10_26 elif 26 < version < 41: return consts.VERSION_RANGE_27_40 raise ValueError(f'Unknown version "{version}"') def get_eci_assignment_number(encoding): """\ Returns the ECI number for the provided encoding. :param str encoding: A encoding name :return str: The ECI number. """ try: return consts.ECI_ASSIGNMENT_NUM[codecs.lookup(encoding).name] except KeyError: raise ValueError(f'Unknown ECI assignment number for encoding "{encoding}".') def get_data_mask_functions(is_micro): """ Returns the data mask functions. ISO/IEC 18004:2015(E) -- 7.8.2 Data mask patterns (page 50) Table 10 — Data mask pattern generation conditions (page 50) =============== ===================== ===================================== QR Code Pattern Micro QR Code Pattern Condition =============== ===================== ===================================== 000 (i + j) mod 2 = 0 001 00 i mod 2 = 0 010 j mod 3 = 0 011 (i + j) mod 3 = 0 100 01 ((i div 2) + (j div 3)) mod 2 = 0 101 (i j) mod 2 + (i j) mod 3 = 0 110 10 ((i j) mod 2 + (i j) mod 3) mod 2 = 0 111 11 ((i+j) mod 2 + (i j) mod 3) mod 2 = 0 =============== ===================== ===================================== :param is_micro: Indicates if data mask functions for a Micro QR Code should be returned :return: A tuple of functions """ # i = row position, j = col position; (i, j) = (0, 0) = upper left corner def fn0(i, j): return (i + j) & 0x1 == 0 def fn1(i, j): return i & 0x1 == 0 def fn2(i, j): return j % 3 == 0 def fn3(i, j): return (i + j) % 3 == 0 def fn4(i, j): return (i // 2 + j // 3) & 0x1 == 0 def fn5(i, j): tmp = i * j return (tmp & 0x1) + (tmp % 3) == 0 def fn6(i, j): tmp = i * j return ((tmp & 0x1) + (tmp % 3)) & 0x1 == 0 def fn7(i, j): return (((i + j) & 0x1) + (i * j) % 3) & 0x1 == 0 if is_micro: return fn1, fn4, fn6, fn7 return fn0, fn1, fn2, fn3, fn4, fn5, fn6, fn7 class Segments: """\ Represents a sequence of `Segment` instances. Note: len(segments) returns the number of Segments and not the data length; use segments.data_length """ __slots__ = ('bit_length', 'modes', 'segments') def __init__(self): self.segments = [] self.bit_length = 0 self.modes = [] def add_segment(self, segment): """\ :param _Segment segment: Segment to add. """ if self.segments: prev_seg = self.segments[-1] if prev_seg.mode == segment.mode and prev_seg.encoding == segment.encoding: # Merge segment with previous segment segment = _Segment(prev_seg.bits + segment.bits, prev_seg.char_count + segment.char_count, segment.mode, segment.encoding) self.bit_length -= len(prev_seg.bits) del self.segments[-1] del self.modes[-1] self.segments.append(segment) self.bit_length += len(segment.bits) self.modes.append(segment.mode) def __len__(self): return len(self.segments) def __getitem__(self, item): return self.segments[item] def __iter__(self): return iter(self.segments) def bit_length_with_overhead(self, version, eci, is_sa=False): overhead = 0 # ECI overhead if eci: no_eci_indicators = sum(1 for segment in self.segments if segment.mode == consts.MODE_BYTE and segment.encoding != consts.DEFAULT_BYTE_ENCODING) overhead += no_eci_indicators * 4 # ECI indicator overhead += no_eci_indicators * 8 # ECI assignment no if is_sa: # 4 bit for mode, 4 bit for the position, 4 bit for total number of symbols # 8 bit for parity data overhead += 5 * 4 # Mode indicator overhead if version > 0: # QR Code overhead += len(self.modes) * 4 elif version > consts.VERSION_M1: # Micro QR Code (M1 has no mode indicator) overhead += len(self.modes) * (version + 3) # Char count indicator overhead ver_range = version_range(version) if version > 0 else version overhead += sum(consts.CHAR_COUNT_INDICATOR_LENGTH[mode][ver_range] for mode in self.modes) return overhead + self.bit_length class _Segment(tuple): """\ Represents a data segment. A segment provides the (encoding specific) byte data, the data length, the QR Code mode, and the used encoding. The latter is ``None`` iff mode is not "byte". Note that `data_length` may not be equal to len(data)! See also ISO/IEC 18004:2015(E) - 7.4.7 Mixing modes (page 30) """ __slots__ = () def __new__(cls, bits, char_count, mode, encoding=None): return tuple.__new__(cls, (bits, char_count, mode, encoding)) bits = property(itemgetter(0)) char_count = property(itemgetter(1)) mode = property(itemgetter(2)) encoding = property(itemgetter(3)) class Buffer: """\ Wraps a :cls:`bytearray` and provides some useful methods to add bits. """ __slots__ = ['_data'] def __init__(self, iterable=()): self._data = bytearray(iterable) def extend(self, iterable): self._data.extend(iterable) def append_bits(self, val, length): self._data.extend((val >> i) & 1 for i in reversed(range(length))) def getbits(self): return self._data def toints(self): """\ Returns an iterable of integers interpreting the content of `seq` as sequence of binary numbers of length 8. """ return (int(''.join(map(str, g)), 2) for g in zip_longest(*[iter(self._data)] * 8, fillvalue=0)) def __len__(self): return len(self._data) def __getitem__(self, item): return self._data[item] class _StructuredAppendInfo(tuple): """\ Represents Structured Append information. Note: This class provides the Structured Append header information in correct order (incl. Structured Append mode indicator); cf. ISO/IEC 18004:2015(E) -- 8 Structured Append (page 59). """ __slots__ = () def __new__(cls, number, total, parity): """\ :param int number: Symbol number ``[0 .. 15]`` :param int total: Total symbol count ``[2 .. 15]`` :param int parity: Parity data. """ return super().__new__(cls, (consts.MODE_STRUCTURED_APPEND, number, total, parity)) mode = property(itemgetter(0)) number = property(itemgetter(1)) total = property(itemgetter(2)) parity = property(itemgetter(3)) ����������segno-1.6.6/segno/helpers.py������������������������������������������������������������������������0000664�0000000�0000000�00000064637�14764403223�0016013�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Additional factory functions for common QR codes. Aside from :py:func:`make_epc_qr`, the factory functions return a QR code with the minimum error correction level "L" (or better). To create a (Micro) QR code which should use a specific error correction level or version etc., use the "_data" factory functions which return a string which can be used as input for :py:func:`segno.make()`. """ import re import decimal import segno from urllib.parse import quote _MECARD_ESCAPE = { ord('\\'): "\\\\", ord(';'): "\\;", ord(':'): "\\:", ord('"'): '\\"', } _VCARD_ESCAPE = { ord(','): '\\,', ord(';'): '\\;', } def _escape_mecard(s): """\ Escapes ``\\``, ``;``, ``"`` and ``:`` in the provided string. :param str s: The string to escape. :rtype str """ return str(s).translate(_MECARD_ESCAPE) def _escape_vcard(s): """\ Escapes ``\\``, ``;``, ``"`` and ``:`` in the provided string. :param str s: The string to escape. :rtype str """ return str(s).translate(_VCARD_ESCAPE) def make_wifi_data(ssid, password=None, security=None, hidden=False): """\ Creates WIFI configuration string. :param str ssid: The SSID of the network. :param password: The password. :type password: str or None :param security: Authentication type; the value should be "WEP" or "WPA". Set to ``None`` to omit the value. "nopass" is equivalent to setting the value to ``None`` but in the former case, the value is not omitted. :type security: str or None :param bool hidden: Indicates if the network is hidden (default: ``False``) :rtype: str """ escape = _escape_mecard data = 'WIFI:' if security: data += f'T:{security.upper() if security != "nopass" else security};' data += f'S:{escape(ssid)};' if password is not None: data += f'P:{escape(password)};' data += 'H:true;' if hidden else ';' return data def make_wifi(ssid, password=None, security=None, hidden=False): """\ Creates a WIFI configuration QR code. :param str ssid: The SSID of the network. :param password: The password. :type password: str or None :param security: Authentication type; the value should be "WEP" or "WPA". Set to ``None`` to omit the value. "nopass" is equivalent to setting the value to ``None`` but in the former case, the value is not omitted. :type security: str or None :param bool hidden: Indicates if the network is hidden (default: ``False``) :rtype: segno.QRCode """ return segno.make_qr(make_wifi_data(ssid, password, security, hidden)) def make_mecard_data(name, reading=None, email=None, phone=None, videophone=None, memo=None, nickname=None, birthday=None, url=None, pobox=None, roomno=None, houseno=None, city=None, prefecture=None, zipcode=None, country=None): """\ Creates a string encoding the contact information as MeCard. :param str name: Name. If it contains a comma, the first part is treated as lastname and the second part is treated as forename. :param reading: Designates a text string to be set as the kana name in the phonebook :type reading: str or None :param email: E-mail address. Multiple values are allowed. :type email: str, iterable of strings, or None :param phone: Phone number. Multiple values are allowed. :type phone: str, iterable of strings, or None :param videophone: Phone number for video calls. Multiple values are allowed. :type videophone: str, iterable of strings, or None :param memo: A notice for the contact. :type memo: str or None :param nickname: Nickname. :type nickname: str or None :param birthday: Birthday. If a string is provided, it should encode the date as YYYYMMDD value. :type birthday: str, datetime.date or None :param url: Homepage. Multiple values are allowed. :type url: str, iterable of strings, or None :param pobox: P.O. box (address information). :type pobox: str or None :param roomno: Room number (address information). :type roomno: str or None :param houseno: House number (address information). :type houseno: str or None :param city: City (address information). :type city: str or None :param prefecture: Prefecture (address information). :type prefecture: str or None :param zipcode: Zip code (address information). :type zipcode: str or None :param country: Country (address information). :type country: str or None :rtype: str """ def make_multifield(name, val): if not val: return () if isinstance(val, str): val = (val,) return [f'{name}:{escape(i)};' for i in val] escape = _escape_mecard data = [f'MECARD:N:{escape(name)};'] if reading: data.append(f'SOUND:{escape(reading)};') data.extend(make_multifield('TEL', phone)) data.extend(make_multifield('TELAV', videophone)) data.extend(make_multifield('EMAIL', email)) if nickname: data.append(f'NICKNAME:{escape(nickname)};') if birthday: try: birthday = birthday.strftime('%Y%m%d') except AttributeError: pass data.append(f'BDAY:{birthday};') data.extend(make_multifield('URL', url)) adr_properties = (pobox, roomno, houseno, city, prefecture, zipcode, country) if any(adr_properties): adr_data = [escape(i or '') for i in adr_properties] data.append('ADR:{0},{1},{2},{3},{4},{5},{6};'.format(*adr_data)) # noqa UP030 if memo: data.append(f'MEMO:{escape(memo)};') data.append(';') return ''.join(data) def make_mecard(name, reading=None, email=None, phone=None, videophone=None, memo=None, nickname=None, birthday=None, url=None, pobox=None, roomno=None, houseno=None, city=None, prefecture=None, zipcode=None, country=None): """\ Returns a QR code which encodes a `MeCard `_ :param str name: Name. If it contains a comma, the first part is treated as lastname and the second part is treated as forename. :param reading: Designates a text string to be set as the kana name in the phonebook :type reading: str or None :param email: E-mail address. Multiple values are allowed. :type email: str, iterable of strings, or None :param phone: Phone number. Multiple values are allowed. :type phone: str, iterable of strings, or None :param videophone: Phone number for video calls. Multiple values are allowed. :type videophone: str, iterable of strings, or None :param memo: A notice for the contact. :type memo: str or None :param nickname: Nickname. :type nickname: str or None :param birthday: Birthday. If a string is provided, it should encode the date as YYYYMMDD value. :type birthday: str, datetime.date or None :param url: Homepage. Multiple values are allowed. :type url: str, iterable of strings, or None :param pobox: P.O. box (address information). :type pobox: str or None :param roomno: Room number (address information). :type roomno: str or None :param houseno: House number (address information). :type houseno: str or None :param city: City (address information). :type city: str or None :param prefecture: Prefecture (address information). :type prefecture: str or None :param zipcode: Zip code (address information). :type zipcode: str or None :param country: Country (address information). :type country: str or None :rtype: segno.QRCode """ return segno.make_qr(make_mecard_data(name=name, reading=reading, email=email, phone=phone, videophone=videophone, memo=memo, nickname=nickname, birthday=birthday, url=url, pobox=pobox, roomno=roomno, houseno=houseno, city=city, prefecture=prefecture, zipcode=zipcode, country=country)) _looks_like_datetime = re.compile(r'^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:(?:-?\d{2}:\d{2})|Z)?)?$').match def make_vcard_data(name, displayname, email=None, phone=None, fax=None, videophone=None, memo=None, nickname=None, birthday=None, url=None, pobox=None, street=None, city=None, region=None, zipcode=None, country=None, org=None, lat=None, lng=None, source=None, rev=None, title=None, photo_uri=None, cellphone=None, homephone=None, workphone=None): """\ Creates a string encoding the contact information as vCard 3.0. Only a subset of available `vCard 3.0 properties ` is supported. :param str name: The name. If it contains a semicolon, , the first part is treated as lastname and the second part is treated as forename. :param str displayname: Common name. :param email: E-mail address. Multiple values are allowed. :type email: str, iterable of strings, or None :param phone: Phone number. Multiple values are allowed. :type phone: str, iterable of strings, or None :param fax: Fax number. Multiple values are allowed. :type fax: str, iterable of strings, or None :param videophone: Phone number for video calls. Multiple values are allowed. :type videophone: str, iterable of strings, or None :param memo: A notice for the contact. :type memo: str or None :param nickname: Nickname. :type nickname: str or None :param birthday: Birthday. If a string is provided, it should encode the date as ``YYYY-MM-DD`` value. :type birthday: str, datetime.date or None :param url: Homepage. Multiple values are allowed. :type url: str, iterable of strings, or None :param pobox: P.O. box (address information). :type pobox: str or None :param street: Street address. :type street: str or None :param city: City (address information). :type city: str or None :param region: Region (address information). :type region: str or None :param zipcode: Zip code (address information). :type zipcode: str or None :param country: Country (address information). :type country: str or None :param org: Company / organization name. :type org: str or None :param lat: Latitude. :type lat: float or None :param lng: Longitude. :type lng: float or None :param source: URL where to obtain the vCard. :type source: str or None :param rev: Revision of the vCard / last modification date. :type rev: str, datetime.date or None :param title: Job Title. Multiple values are allowed. :type title: str, iterable of strings, or None :param photo_uri: Photo URI. Multiple values are allowed. :type photo_uri: str, iterable of strings, or None :param cellphone: Cell phone number. Multiple values are allowed. :type cellphone: str, iterable of strings, or None :param homephone: Home phone number. Multiple values are allowed. :type homephone: str, iterable of strings, or None :param workphone: Work phone number. Multiple values are allowed. :type workphone: str, iterable of strings, or None :rtype: str """ def make_multifield(name, val): if not val: return () if isinstance(val, str): val = (val,) return [f'{name}:{escape(i)}' for i in val] escape = _escape_vcard data = ['BEGIN:VCARD', 'VERSION:3.0', f'N:{name}', f'FN:{escape(displayname)}'] if org: data.append(f'ORG:{escape(org)}') data.extend(make_multifield('EMAIL', email)) data.extend(make_multifield('TEL', phone)) data.extend(make_multifield('TEL;TYPE=FAX', fax)) data.extend(make_multifield('TEL;TYPE=VIDEO', videophone)) data.extend(make_multifield('TEL;TYPE=CELL', cellphone)) data.extend(make_multifield('TEL;TYPE=HOME', homephone)) data.extend(make_multifield('TEL;TYPE=WORK', workphone)) data.extend(make_multifield('URL', url)) data.extend(make_multifield('TITLE', title)) data.extend(make_multifield('PHOTO;VALUE=uri', photo_uri)) if nickname: data.append(f'NICKNAME:{escape(nickname)}') adr_properties = (pobox, street, city, region, zipcode, country) if any(adr_properties): adr_data = [escape(i or '') for i in adr_properties] data.append('ADR:{0};;{1};{2};{3};{4};{5}'.format(*adr_data)) # noqa UP030 if birthday: try: birthday = birthday.strftime('%Y-%m-%d') except AttributeError: pass if not isinstance(birthday, str) or not _looks_like_datetime(birthday): raise ValueError('"birthday" does not seem to be a valid date or date/time representation') data.append(f'BDAY:{birthday}') if (lat and not lng) or (lng and not lat): raise ValueError('Incomplete geo information, please specify latitude and longitude.') if lat and lng: data.append(f'GEO:{lat};{lng}') if source: data.append(f'SOURCE:{escape(source)}') if memo: data.append(f'NOTE:{escape(memo)}') if rev: try: rev = rev.strftime('%Y-%m-%d') except AttributeError: pass if not isinstance(rev, str) or not _looks_like_datetime(rev): raise ValueError('"rev" does not seem to be a valid date or date/time representation') data.append(f'REV:{rev}') data.append('END:VCARD') data.append('') return '\r\n'.join(data) def make_vcard(name, displayname, email=None, phone=None, fax=None, videophone=None, memo=None, nickname=None, birthday=None, url=None, pobox=None, street=None, city=None, region=None, zipcode=None, country=None, org=None, lat=None, lng=None, source=None, rev=None, title=None, photo_uri=None, cellphone=None, homephone=None, workphone=None): """\ Creates a QR code which encodes a `vCard `_ version 3.0. Only a subset of available `vCard 3.0 properties ` is supported. :param str name: The name. If it contains a semicolon, , the first part is treated as lastname and the second part is treated as forename. :param str displayname: Common name. :param email: E-mail address. Multiple values are allowed. :type email: str, iterable of strings, or None :param phone: Phone number. Multiple values are allowed. :type phone: str, iterable of strings, or None :param fax: Fax number. Multiple values are allowed. :type fax: str, iterable of strings, or None :param videophone: Phone number for video calls. Multiple values are allowed. :type videophone: str, iterable of strings, or None :param memo: A notice for the contact. :type memo: str or None :param nickname: Nickname. :type nickname: str or None :param birthday: Birthday. If a string is provided, it should encode the date as ``YYYY-MM-DD`` value. :type birthday: str, datetime.date or None :param url: Homepage. Multiple values are allowed. :type url: str, iterable of strings, or None :param pobox: P.O. box (address information). :type pobox: str or None :param street: Street address. :type street: str or None :param city: City (address information). :type city: str or None :param region: Region (address information). :type region: str or None :param zipcode: Zip code (address information). :type zipcode: str or None :param country: Country (address information). :type country: str or None :param org: Company / organization name. :type org: str or None :param lat: Latitude. :type lat: float or None :param lng: Longitude. :type lng: float or None :param source: URL where to obtain the vCard. :type source: str or None :param rev: Revision of the vCard / last modification date. :type rev: str, datetime.date or None :param title: Job Title. Multiple values are allowed. :type title: str, iterable of strings, or None :param photo_uri: Photo URI. Multiple values are allowed. :type photo_uri: str, iterable of strings, or None :param cellphone: Cell phone number. Multiple values are allowed. :type cellphone: str, iterable of strings, or None :param homephone: Home phone number. Multiple values are allowed. :type homephone: str, iterable of strings, or None :param workphone: Work phone number. Multiple values are allowed. :type workphone: str, iterable of strings, or None :rtype: segno.QRCode """ return segno.make_qr(make_vcard_data(name, displayname, email=email, phone=phone, fax=fax, videophone=videophone, memo=memo, nickname=nickname, birthday=birthday, url=url, pobox=pobox, street=street, city=city, region=region, zipcode=zipcode, country=country, org=org, lat=lat, lng=lng, source=source, rev=rev, title=title, photo_uri=photo_uri, cellphone=cellphone, homephone=homephone, workphone=workphone)) def make_geo_data(lat, lng): """\ Creates a geo location URI. :param float lat: Latitude :param float lng: Longitude :rtype: str """ def float_to_str(f): return f'{f:.8f}'.rstrip('0').rstrip('.') return f'geo:{float_to_str(lat)},{float_to_str(lng)}' def make_geo(lat, lng): """\ Returns a QR code which encodes geographic location using the ``geo`` URI scheme. :param float lat: Latitude :param float lng: Longitude :rtype: segno.QRCode """ return segno.make_qr(make_geo_data(lat, lng)) def make_make_email_data(to, cc=None, bcc=None, subject=None, body=None): """\ Creates either a simple "mailto:" URL or complete e-mail message with (blind) carbon copies and a subject and a body. :param to: The email address (recipient). Multiple values are allowed. :type to: str or iterable of strings :param cc: The carbon copy recipient. Multiple values are allowed. :type cc: str, iterable of strings, or None :param bcc: The blind carbon copy recipient. Multiple values are allowed. :type bcc: str, iterable of strings, or None :param subject: The subject. :type subject: str or None :param body: The message body. :type body: str or None :rtype: str """ def multi(val): if not val: return () if isinstance(val, str): return (val,) return tuple(val) delim = '?' data = ['mailto:'] if not to: raise ValueError('"to" must not be empty or None') data.append(','.join(multi(to))) for key, val in (('cc', cc), ('bcc', bcc)): vals = multi(val) if vals: data.append(f'{delim}{key}={",".join(vals)}') delim = '&' for key, val in (('subject', subject), ('body', body)): if val is not None: data.append(f'{delim}{key}={quote(val.encode("utf-8"))}') delim = '&' return ''.join(data) def make_email(to, cc=None, bcc=None, subject=None, body=None): """\ Encodes either a simple e-mail address or a complete message with (blind) carbon copies and a subject and a body. :param to: The email address (recipient). Multiple values are allowed. :type to: str or iterable of strings :param cc: The carbon copy recipient. Multiple values are allowed. :type cc: str, iterable of strings, or None :param bcc: The blind carbon copy recipient. Multiple values are allowed. :type bcc: str, iterable of strings, or None :param subject: The subject. :type subject: str or None :param body: The message body. :type body: str or None :rtype: segno.QRCode """ return segno.make_qr(make_make_email_data(to=to, cc=cc, bcc=bcc, subject=subject, body=body)) def _make_epc_qr_data(name, iban, amount, text=None, reference=None, bic=None, purpose=None, encoding=None): """\ Validates the input and creates the data for an EPC QR Code. DOES NOT belong to the public API, kept separate from make_epc_qr to apply tests on the raw data. See :py:func:`make_epc_qr` for a description of the parameters. """ # Ordering is important! encodings = ('utf-8', 'iso-8859-1', 'iso-8859-2', 'iso-8859-4', 'iso-8859-5', 'iso-8859-7', 'iso-8859-10', 'iso-8859-15') min_amount = decimal.Decimal('0.01') max_amount = decimal.Decimal('999999999.99') text = text.rstrip() if text else text reference = reference.rstrip() if reference else reference bic = bic.strip() if bic else bic name = name.strip() if name else name if encoding is not None: if isinstance(encoding, str): try: encoding = encodings.index(encoding.lower()) + 1 except ValueError: raise ValueError(f'Invalid encoding "{encoding}", use one of {encodings}') elif not isinstance(encoding, int) or not 1 <= encoding <= len(encodings): raise ValueError(f'Invalid encoding number only 1 .. 8 are allowed, got "{encoding}"') if (not text and not reference) or (text and reference): raise ValueError('Either a text or a creditor reference (ISO 11649) must be provided') if text and not 0 < len(text) <= 140: raise ValueError(f'Invalid text, max. 140 characters are allowed, got "{len(text)}"') elif reference and not 0 < len(reference) <= 35: raise ValueError('Invalid creditor reference (ISO 11649), max. 35 characters are allowed, ' f'got "{len(reference)}"') if name is None or not 0 < len(name) <= 70: raise ValueError(f'Invalid name, max. 70 characters are allowed, got "{name}"') if iban is None or not 4 < len(iban) <= 34: raise ValueError(f'Invalid IBAN, min. 5 and max. 34 characters are allowed, got "{iban}"') if bic and len(bic) not in (8, 11): raise ValueError(f'Invalid BIC, should be 8 or 11 characters long, got "{bic}"') if purpose and len(purpose) != 4: raise ValueError(f'Invalid purpose, 4 characters are allowed, got "{purpose}"') amount = decimal.Decimal(amount) if not min_amount <= amount <= max_amount: raise ValueError(f'Invalid amount, must be in bigger or equal {min_amount} and less or equal {max_amount}') tmp_data = ['BCD', # Service tag '002', # Version '', # character set (will be set later) 'SCT', # Identification bic or '', # BIC name, # Name of the recipient iban, # IBAN f'EUR{amount:.2f}'.rstrip('0').rstrip('.'), # Amount purpose or '', # Purpose reference or '', # Remittance ] if text: tmp_data.append(text) data = '\n'.join(tmp_data) charset = -1 if encoding is None else encoding if charset < 0: for idx, enc in enumerate(encodings[1:], start=2): try: data.encode(enc) charset = idx break except UnicodeEncodeError: pass if charset < 0: charset = 1 # Use UTF-8 tmp_data[2] = str(charset) # Set character set data = '\n'.join(tmp_data).encode(encodings[charset - 1]) # Max. payload: 331 bytes if len(data) > 331: # pragma: no cover raise ValueError(f'Payload is too big: Max. 331 bytes allowed, got {len(data)} bytes') return data def make_epc_qr(name, iban, amount, text=None, reference=None, bic=None, purpose=None, encoding=None): """\ Creates and returns an European Payments Council Quick Response Code (EPC QR Code) version 002. The returned :py:class:`segno.QRCode` uses always the error correction level "M" and utilizes max. version 13 to fulfill the constraints of the EPC QR Code standard. .. note:: Either the ``text`` or ``reference`` must be provided but not both .. note:: Neither the IBAN, BIC, nor remittance reference number or any other information is validated (aside from checks regarding the allowed string lengths). :param str name: Name of the recipient. :param str iban: International Bank Account Number (IBAN) :param amount: The amount (in EUR) to transfer. The currency is always Euro, no other currencies are supported. :type amount: int, float, decimal.Decimal :param str text: Remittance Information (unstructured) :param str reference: Remittance Information (structured) :param str bic: Bank Identifier Code (BIC). Optional, only required for non-EEA countries. :param str purpose: SEPA purpose code. :param encoding: By default, this function tries to find the best, minimal encoding. If another encoding should be used, the encoding name or the encoding constant (an integer) can be provided: ``1``: "UTF-8", ``2``: "ISO 8859-1", ``3``: "ISO 8859-2", ``4``: "ISO 8859-4", ``5``: "ISO 8859-5", ``6``: "ISO 8859-7", ``7``: "ISO 8859-10", ``8``: "ISO 8859-15" The encoding is case-insensitive. :type encoding: str or int :rtype: segno.QRCode """ # Create a QR Code, error correction level "M". # It's not allowed to use another level therefore boost_error must be disabled qr = segno.make_qr(_make_epc_qr_data(name, iban, amount, text, reference, bic, purpose, encoding), error='m', boost_error=False) # This shouldn't happen if qr.version > 13: # pragma: no cover raise ValueError(f'Invalid EPC QR Code, max. QR Code version 13 is allowed, got "{qr.designator}"') return qr �������������������������������������������������������������������������������������������������segno-1.6.6/segno/helpers.pyi�����������������������������������������������������������������������0000664�0000000�0000000�00000012756�14764403223�0016157�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from . import QRCode import decimal import datetime from collections.abc import Iterable def make_wifi_data(ssid: str, password: str | None, security: str | None, hidden: bool = False) -> str: ... def make_wifi(ssid: str, password: str | None, security: str | None, hidden: bool = False) -> QRCode: ... def make_mecard_data(name: str | Iterable[str], reading: str | None = None, email: str | Iterable[str] | None = None, phone: str | Iterable[str] | None = None, videophone: str | Iterable[str] | None = None, memo: str | None = None, nickname: str | None = None, birthday: str | datetime.date | None = None, url: str | Iterable[str] | None = None, pobox: str | None = None, roomno: str | None = None, houseno: str | None = None, city: str | None = None, prefecture: str | None = None, zipcode: str | None = None, country: str | None = None) -> str: ... def make_mecard(name: str | Iterable[str], reading: str | None = None, email: str | Iterable[str] | None = None, phone: str | Iterable[str] | None = None, videophone: str | Iterable[str] | None = None, memo: str | None = None, nickname: str | None = None, birthday: str | datetime.date | None = None, url: str | Iterable[str] | None = None, pobox: str | None = None, roomno: str | None = None, houseno: str | None = None, city: str | None = None, prefecture: str | None = None, zipcode: str | None = None, country: str | None = None) -> QRCode: ... def make_vcard_data(name: str, displayname: str, email: str | Iterable[str] | None = None, phone: str | Iterable[str] | None = None, fax: str | Iterable[str] | None = None, videophone: str | Iterable[str] | None = None, memo: str | None = None, nickname: str | None = None, birthday: str | datetime.date | None = None, url: str | Iterable[str] | None = None, pobox: str | None = None, street: str | None = None, city: str | None = None, region: str | None = None, zipcode: str | None = None, country: str | None = None, org: str | None = None, lat: float | None = None, lng: float | None = None, source: str | None = None, rev: str | datetime.date | None = None, title: str | Iterable[str] | None = None, photo_uri: str | Iterable[str] | None = None, cellphone: str | Iterable[str] | None = None, homephone: str | Iterable[str] | None = None, workphone: str | Iterable[str] | None = None) -> str: ... def make_vcard(name: str, displayname: str, email: str | Iterable[str] | None = None, phone: str | Iterable[str] | None = None, fax: str | Iterable[str] | None = None, videophone: str | Iterable[str] | None = None, memo: str | None = None, nickname: str | None = None, birthday: str | datetime.date | None = None, url: str | Iterable[str] | None = None, pobox: str | None = None, street: str | None = None, city: str | None = None, region: str | None = None, zipcode: str | None = None, country: str | None = None, org: str | None = None, lat: float | None = None, lng: float | None = None, source: str | None = None, rev: str | datetime.date | None = None, title: str | Iterable[str] | None = None, photo_uri: str | Iterable[str] | None = None, cellphone: str | Iterable[str] | None = None, homephone: str | Iterable[str] | None = None, workphone: str | Iterable[str] | None = None) -> QRCode: ... def make_geo_data(lat: float, lng: float) -> str: ... def make_geo(lat: float, lng: float) -> QRCode: ... def make_make_email_data(to: str | Iterable[str], cc: str | Iterable[str] | None = None, bcc: str | Iterable[str] | None = None, subject: str | None = None, body: str | None = None) -> str: ... def make_email(to: str | Iterable[str], cc: str | Iterable[str] | None = None, bcc: str | Iterable[str] | None = None, subject: str | None = None, body: str | None = None) -> QRCode: ... def make_epc_qr(name: str, iban: str, amount: int | float | decimal.Decimal, text: str | None = None, reference: str | None = None, bic: str | None = None, purpose: str | None = None, encoding: str | int | None = None) -> QRCode: ... ������������������segno-1.6.6/segno/py.typed��������������������������������������������������������������������������0000664�0000000�0000000�00000000000�14764403223�0015444�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/segno/utils.py��������������������������������������������������������������������������0000664�0000000�0000000�00000021661�14764403223�0015477�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # # type: ignore """\ Utility functions useful for writers or QR Code objects. DOES NOT belong to the public API. """ from itertools import chain, repeat from . import consts __all__ = ('get_default_border_size', 'get_border', 'get_symbol_size', 'check_valid_scale', 'check_valid_border', 'matrix_to_lines', 'matrix_iter', 'matrix_iter_verbose') def get_default_border_size(matrix_size): """\ Returns the default border size (quiet zone) for the provided version. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :rtype: int """ width, height = matrix_size return 4 if width > 17 and width == height else 2 def get_border(matrix_size, border): """\ Returns `border` if not ``None``, otherwise the default border size for the provided QR Code. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param border: The size of the quiet zone or ``None``. :type border: int or None :rtype: int """ return border if border is not None else get_default_border_size(matrix_size) def get_symbol_size(matrix_size, scale=1, border=None): """\ Returns the symbol size (width x height) with the provided border and scaling factor. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param scale: Indicates the size of a single module (default: 1). The size of a module depends on the used output format; i.e. in a PNG context, a scaling factor of 2 indicates that a module has a size of 2 x 2 pixel. Some outputs (i.e. SVG) accept floating point values. :type scale: int or float :param int border: The border size or ``None`` to specify the default quiet zone (4 for QR Codes, 2 for Micro QR Codes). :rtype: tuple (width, height) """ if border is None: border = get_default_border_size(matrix_size) width, height = matrix_size width += 2 * border height += 2 * border return width * scale, height * scale def check_valid_scale(scale): """\ Raises a :py:exc:`ValueError` iff `scale` is negative or zero. :param scale: Scaling factor. :type scale: float or int """ if scale <= 0: raise ValueError(f'The scale must not be negative or zero. Got: "{scale}"') def check_valid_border(border): """\ Raises a :py:exc:`ValueError` iff `border` is negative. :param int border: Indicating the size of the quiet zone. """ if border is not None and (int(border) != border or border < 0): raise ValueError(f'The border must not a non-negative integer value. Got: "{border}"') def matrix_to_lines(matrix, x, y, incby=1): """\ Converts the `matrix` into an iterable of ((x1, y1), (x2, y2)) tuples which represent a sequence (horizontal line) of dark modules. The path starts at the 1st row of the matrix and moves down to the last row. :param matrix: An iterable of bytearrays. :param x: Initial position on the x-axis. :param y: Initial position on the y-axis. :param incby: Value to move along the y-axis (default: 1). :rtype: iterable of (x1, y1), (x2, y2) tuples """ y -= incby # Move along y-axis so we can simply increment y in the loop last_bit = 0x1 for row in matrix: x1, x2 = x, x y += incby for bit in row: if last_bit != bit and not bit: yield (x1, y), (x2, y) x1 = x2 x2 += 1 if not bit: x1 += 1 last_bit = bit if last_bit: yield (x1, y), (x2, y) last_bit = 0x0 def matrix_iter(matrix, matrix_size, scale=1, border=None): """\ Returns an iterator / generator over the provided matrix which includes the border and the scaling factor. If either the `scale` or `border` value is invalid, a :py:exc:`ValueError` is raised. :param matrix: An iterable of bytearrays. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param int scale: The scaling factor (default: ``1``). :param int border: The border size or ``None`` to specify the default quiet zone (4 for QR Codes, 2 for Micro QR Codes). :raises: :py:exc:`ValueError` if an illegal scale or border value is provided """ check_valid_border(border) scale = int(scale) check_valid_scale(scale) border = get_border(matrix_size, border) width, height = matrix_size border_row = [0x0] * width width_range, height_range = range(-border, width + border), range(-border, height + border) for i in height_range: r = matrix[i] if 0 <= i < height else border_row row = tuple(chain.from_iterable(repeat(r[j] if 0 <= j < width else 0x0, scale) for j in width_range)) for s in repeat(None, scale): yield row def matrix_iter_verbose(matrix, matrix_size, scale=1, border=None): """\ Returns an iterator / generator over the provided matrix which includes the border and the scaling factor. This iterator / generator returns different values for dark / light modules and therefor the different parts (like the finder patterns, alignment patterns etc.) are distinguishable. If this information isn't necessary, use the :py:func:`matrix_iter()` function because it is much cheaper and faster. If either the `scale` or `border` value is invalid, a py:exc:`ValueError` is raised. :param matrix: An iterable of bytearrays. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param int scale: The scaling factor (default: ``1``). :param int border: The border size or ``None`` to specify the default quiet zone (4 for QR Codes, 2 for Micro QR Codes). :raises: :py:exc:`ValueError` if an illegal scale or border value is provided """ from segno import encoder check_valid_border(border) scale = int(scale) check_valid_scale(scale) border = get_border(matrix_size, border) width, height = matrix_size is_square = width == height is_micro = is_square and width < 21 # 21 == QR Code version 1 # Create an empty matrix with invalid 0x2 values alignment_matrix = encoder.make_matrix(width, height, reserve_regions=False, add_timing=False) encoder.add_alignment_patterns(alignment_matrix, width, height) def get_bit(i, j): # Check if we operate upon the matrix or the "virtual" border if 0 <= i < height and 0 <= j < width: val = matrix[i][j] if not is_micro: # Alignment pattern alignment_val = alignment_matrix[i][j] if alignment_val != 0x2: return (consts.TYPE_ALIGNMENT_PATTERN_LIGHT, consts.TYPE_ALIGNMENT_PATTERN_DARK)[alignment_val] if is_square and width > 41: # QR Codes < version 7 do not carry any version information if (i < 6 and width - 12 < j < width - 8) \ or (height - 12 < i < height - 8 and j < 6): return (consts.TYPE_VERSION_LIGHT, consts.TYPE_VERSION_DARK)[val] # Dark module if i == height - 8 and j == 8: return consts.TYPE_DARKMODULE # Timing - IMPORTANT: Check alignment (see above) in advance! if (not is_micro and ((i == 6 and 7 < j < width - 8) or (j == 6 and 7 < i < height - 8))) \ or (is_micro and ((i == 0 and j > 7) or (j == 0 and i > 7))): return (consts.TYPE_TIMING_LIGHT, consts.TYPE_TIMING_DARK)[val] # Format - IMPORTANT: Check timing (see above) in advance! if (i == 8 and (j < 9 or (not is_micro and j > width - 10))) \ or (j == 8 and (i < 8 or (not is_micro and i > height - 9))): return (consts.TYPE_FORMAT_LIGHT, consts.TYPE_FORMAT_DARK)[val] # Finder pattern # top left top right if (i < 7 and (j < 7 or (not is_micro and j > width - 8))) \ or (not is_micro and i > height - 8 and j < 7): # bottom left return (consts.TYPE_FINDER_PATTERN_LIGHT, consts.TYPE_FINDER_PATTERN_DARK)[val] # Separator # top left top right if (i < 8 and (j < 8 or (not is_micro and j > width - 9))) \ or (not is_micro and (i > height - 9 and j < 8)): # bottom left return consts.TYPE_SEPARATOR return (consts.TYPE_DATA_LIGHT, consts.TYPE_DATA_DARK)[val] else: return consts.TYPE_QUIET_ZONE width_range, height_range = range(-border, width + border), range(-border, height + border) for i in height_range: row = tuple(chain.from_iterable(repeat(get_bit(i, j), scale) for j in width_range)) for s in repeat(None, scale): yield row �������������������������������������������������������������������������������segno-1.6.6/segno/writers.py������������������������������������������������������������������������0000664�0000000�0000000�00000206557�14764403223�0016047�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # # type: ignore """\ Standard serializers and utility functions for serializers. DOES NOT belong to the public API. The serializers are independent of the :py:class:`segno.QRCode` (and the :py:class:`segno.encoder.Code`) class; they just need a matrix (tuple of bytearrays). """ import io import re import zlib import codecs import base64 import gzip from xml.sax.saxutils import quoteattr, escape from struct import pack from itertools import chain, repeat import functools from functools import partial from functools import reduce from operator import itemgetter from contextlib import contextmanager from collections import defaultdict import time from . import consts from .utils import matrix_to_lines, get_symbol_size, get_border, \ check_valid_scale, check_valid_border, matrix_iter, matrix_iter_verbose from itertools import zip_longest from urllib.parse import quote __all__ = ('writable', 'write_svg', 'write_png', 'write_eps', 'write_pdf', 'write_txt', 'write_pbm', 'write_pam', 'write_ppm', 'write_xpm', 'write_xbm', 'write_tex', 'write_terminal') # Standard creator name CREATOR = 'Segno ' @contextmanager def writable(file_or_path, mode, encoding=None): """\ Returns a writable file-like object. Usage:: with writable(file_name_or_path, 'wb') as f: ... :param file_or_path: Either a file-like object or a filename. :param str mode: String indicating the writing mode (i.e. ``'wb'``) """ f = file_or_path must_close = False try: file_or_path.write if encoding is not None: f = codecs.getwriter(encoding)(file_or_path) except AttributeError: f = open(file_or_path, mode, encoding=encoding) must_close = True try: yield f finally: if must_close: f.close() def colorful(dark, light): """\ Decorator to inject a module type -> color mapping into the decorated function. """ def decorate(f): @functools.wraps(f) def wrapper(matrix, matrix_size, out, dark=dark, light=light, finder_dark=False, finder_light=False, data_dark=False, data_light=False, version_dark=False, version_light=False, format_dark=False, format_light=False, alignment_dark=False, alignment_light=False, timing_dark=False, timing_light=False, separator=False, dark_module=False, quiet_zone=False, **kw): cm = _make_colormap(*matrix_size, dark=dark, light=light, finder_dark=finder_dark, finder_light=finder_light, data_dark=data_dark, data_light=data_light, version_dark=version_dark, version_light=version_light, format_dark=format_dark, format_light=format_light, alignment_dark=alignment_dark, alignment_light=alignment_light, timing_dark=timing_dark, timing_light=timing_light, separator=separator, dark_module=dark_module, quiet_zone=quiet_zone) return f(matrix, matrix_size, out, cm, **kw) return wrapper return decorate def _valid_width_height_and_border(matrix_size, scale, border): """"\ Validates the scale and border and returns the width, height and the border. If the border is ``None`` the default border is returned. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. """ check_valid_scale(scale) check_valid_border(border) border = get_border(matrix_size, border) width, height = get_symbol_size(matrix_size, scale, border) return width, height, border @colorful(dark='#000', light=None) def write_svg(matrix, matrix_size, out, colormap, scale=1, border=None, xmldecl=True, svgns=True, title=None, desc=None, svgid=None, svgclass='segno', lineclass='qrline', omitsize=False, unit=None, encoding='utf-8', svgversion=None, nl=True, draw_transparent=False): """\ Serializes the QR code as SVG document. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write bytes. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 x 1 pixel per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for a Micro QR Codes). :param bool xmldecl: Inidcates if the XML declaration header should be written (default: ``True``) :param bool svgns: Indicates if the SVG namespace should be written (default: ``True``). :param str title: Optional title of the generated SVG document. :param str desc: Optional description of the generated SVG document. :param svgid: The ID of the SVG document (if set to ``None`` (default), the SVG element won't have an ID). :param svgclass: The CSS class of the SVG document (if set to ``None``, the SVG element won't have a class). :param lineclass: The CSS class of the path element (which draws the "black" modules (if set to ``None``, the path won't have a class). :param bool omitsize: Indicates if width and height attributes should be omitted (default: ``False``). If these attributes are omitted, a ``viewBox`` attribute will be added to the document. :param str unit: Unit for width / height and other coordinates. By default, the unit is unspecified and all values are in the user space. Valid values: em, ex, px, pt, pc, cm, mm, in, and percentages :param str encoding: Encoding of the XML document. "utf-8" by default. :param float svgversion: SVG version (default: None) :param bool nl: Indicates if the document should have a trailing newline (default: ``True``) :param bool draw_transparent: Indicates if transparent SVG paths should be added to the graphic (default: ``False``) """ def svg_color(clr): return _color_to_webcolor(clr, allow_css3_colors=allow_css3_colors) if clr is not None else None def matrix_to_lines_verbose(): j = -.5 # stroke width / 2 invalid_color = -1 for row in matrix_iter_verbose(matrix, matrix_size, scale=1, border=border): last_color = invalid_color x1, x2 = 0, 0 j += 1 for c in (colormap[mt] for mt in row): if last_color != invalid_color and last_color != c: yield last_color, (x1, x2, j) x1 = x2 x2 += 1 last_color = c yield last_color, (x1, x2, j) width, height, border = _valid_width_height_and_border(matrix_size, scale, border) unit = unit or '' if unit and omitsize: raise ValueError(f'The unit "{unit}" has no effect if the size ' '(width and height) is omitted.') omit_encoding = encoding is None if omit_encoding: encoding = 'utf-8' allow_css3_colors = svgversion is not None and svgversion >= 2.0 is_multicolor = len(set(colormap.values())) > 2 need_background = not is_multicolor and colormap[consts.TYPE_QUIET_ZONE] is not None and not draw_transparent need_svg_group = scale != 1 and (need_background or is_multicolor) if is_multicolor: miter = matrix_to_lines_verbose() else: x, y = border, border + .5 dark = colormap[consts.TYPE_DATA_DARK] miter = ((dark, (x1, x2, y1)) for (x1, y1), (x2, y2) in matrix_to_lines(matrix, x, y)) xy = defaultdict(lambda: (0, 0)) coordinates = defaultdict(list) for clr, (x1, x2, y1) in miter: x, y = xy[clr] coordinates[clr].append((x1 - x, y1 - y, x2 - x1)) xy[clr] = x2, y1 if need_background: # Additional path for the background, will be modified after # the SVG paths have been generated coordinates[colormap[consts.TYPE_QUIET_ZONE]] = [(0, 0, width // scale)] if not draw_transparent: try: del coordinates[None] except KeyError: pass paths = {} scale_info = f' transform="scale({scale})"' if scale != 1 else '' p = ' 0 else 'M'), x=x, l=length, y=(int(y) if int(y) == y else y)) for i, (x, y, length) in enumerate(coord)) path += '"/>' paths[color] = path if need_background: # This code is necessary since the path was generated by the loop above # but the background path is special: It has no stroke-color but a fill-color. # The fill-color needs to be closed. Further, it has no class attribute. k = colormap[consts.TYPE_QUIET_ZONE] paths[k] = re.sub(r'\sclass="[^"]+"', '', paths[k].replace('stroke', 'fill') .replace('"/>', f'v{height // scale}h-{width // scale}z"/>')) svg = '' if xmldecl: svg += '\n' svg += '{escape(title)}' if desc is not None: svg += f'{escape(desc)}' if need_svg_group: svg += f'' svg += ''.join(sorted(paths.values(), key=len)) if need_svg_group: svg += '' svg += '' if nl: svg += '\n' with writable(out, 'wt', encoding=encoding) as f: f.write(svg) _replace_quotes = partial(re.compile(br'(=)"([^"]+)"').sub, br"\1'\2'") def as_svg_data_uri(matrix, matrix_size, scale=1, border=None, xmldecl=False, svgns=True, title=None, desc=None, svgid=None, svgclass='segno', lineclass='qrline', omitsize=False, unit='', encoding='utf-8', svgversion=None, nl=False, encode_minimal=False, omit_charset=False, **kw): """\ Converts the matrix to a SVG data URI. The XML declaration is omitted by default (set ``xmldecl`` to ``True`` to enable it), further the newline is omitted by default (set ``nl`` to ``True`` to enable it). Aside from the missing ``out`` parameter and the different ``xmldecl`` and ``nl`` default values and the additional parameter ``encode_minimal`` and ``omit_charset`` this function uses the same parameters as the usual SVG serializer. :param bool encode_minimal: Indicates if the resulting data URI should use minimal percent encoding (disabled by default). :param bool omit_charset: Indicates if the ``;charset=...`` should be omitted (disabled by default) :rtype: str """ encode = partial(quote, safe=b"") if not encode_minimal else partial(quote, safe=b" :/='") buff = io.BytesIO() write_svg(matrix, matrix_size, buff, scale=scale, border=border, xmldecl=xmldecl, svgns=svgns, title=title, desc=desc, svgclass=svgclass, lineclass=lineclass, omitsize=omitsize, encoding=encoding, svgid=svgid, unit=unit, svgversion=svgversion, nl=nl, **kw) return f'data:image/svg+xml{(";charset=" + encoding if not omit_charset else "")},' \ + encode(_replace_quotes(buff.getvalue())) def write_svg_debug(matrix, matrix_size, out, scale=15, border=None, fallback_color='fuchsia', colormap=None, add_legend=True): # pragma: no cover """\ Internal SVG serializer which is useful for debugging purposes. This function is not exposed to the QRCode class by intention and the resulting SVG document is very inefficient (a lot of ```` elements). Dark modules are black and light modules are white by default. Provide a custom `colormap` to override these defaults. Unknown modules are red by default. :param matrix: The matrix :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: binary file-like object or file name :param scale: Scaling factor :param border: Quiet zone :param fallback_color: Color which is used for modules which are not 0x0 or 0x1 and for which no entry in `color_mapping` is defined. :param colormap: dict of module values to color mapping (optional) :param bool add_legend: Indicates if the bit values should be added to the matrix (default: True) """ clr_mapping = { 0x0: '#fff', 0x1: '#000', 0x2: 'red', 0x3: 'orange', 0x4: 'gold', 0x5: 'green', } if colormap is not None: clr_mapping.update(colormap) width, height, border = _valid_width_height_and_border(matrix_size, scale, border) matrix_width, matrix_height = matrix_size with writable(out, 'wt', encoding='utf-8') as f: legend = [] write = f.write write('\n') write(f'') write('') write(f'') for i in range(matrix_height): y = i + border for j in range(matrix_width): x = j + border bit = matrix[i][j] if add_legend and bit not in (0x0, 0x1): legend.append((x, y, bit)) fill = clr_mapping.get(bit, fallback_color) write(f'') # legend may be empty if add_legend == False for x, y, val in legend: write(f'{val}') write('\n') def write_eps(matrix, matrix_size, out, scale=1, border=None, dark='#000', light=None): """\ Serializes the QR code as EPS document. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write strings. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 point (1/72 inch) per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param dark: Color of the modules (default: black). The color can be provided as ``(R, G, B)`` tuple (this method acceppts floats as R, G, B values), as web color name (like "red") or in hexadecimal format (``#RGB`` or ``#RRGGBB``). :param light: Optional background color (default: ``None`` = no background color). See `color` for valid values. """ import textwrap def write_line(writemeth, content): """\ Writes `content` and ``LF``. """ # Postscript: Max. 255 characters per line for line in textwrap.wrap(content, 254): writemeth(line) writemeth('\n') def rgb_to_floats(clr): """\ Converts the provided color into an acceptable format for Postscript's ``setrgbcolor`` """ def to_float(c): if isinstance(c, float): if not 0.0 <= c <= 1.0: raise ValueError(f'Invalid color "{c}". Not in range 0 .. 1') return c return 1 / 255.0 * c if c != 1 else c return tuple([to_float(i) for i in _color_to_rgb(clr)]) width, height, border = _valid_width_height_and_border(matrix_size, scale, border) stroke_color_is_black = _color_is_black(dark) stroke_color = dark if stroke_color_is_black else rgb_to_floats(dark) with writable(out, 'wt') as f: writeline = partial(write_line, f.write) writeline('%!PS-Adobe-3.0 EPSF-3.0') writeline(f'%%Creator: {CREATOR}') writeline(f'%%CreationDate: {time.strftime("%Y-%m-%d %H:%M:%S")}') writeline('%%DocumentData: Clean7Bit') writeline(f'%%BoundingBox: 0 0 {width} {height}') # Write the shortcuts writeline('/m { rmoveto } bind def') writeline('/l { rlineto } bind def') if light is not None: writeline('{0:f} {1:f} {2:f} setrgbcolor clippath fill'.format(*rgb_to_floats(light))) # noqa UP030 if stroke_color_is_black: # Reset RGB color back to black iff stroke color is black # In case stroke color != black set the RGB color later writeline('0 0 0 setrgbcolor') if not stroke_color_is_black: writeline('{0:f} {1:f} {2:f} setrgbcolor'.format(*stroke_color)) # noqa UP030 if scale != 1: writeline(f'{scale} {scale} scale') writeline('newpath') # Current pen position y-axis # Note: 0, 0 = lower left corner in PS coordinate system y = get_symbol_size(matrix_size, scale=1, border=0)[1] + border - .5 # .5 = linewidth / 2 line_iter = matrix_to_lines(matrix, border, y, incby=-1) # EPS supports absolute coordinates as well, but relative coordinates # are more compact and IMO nicer; so the 1st coordinate is absolute, all # other coordinates are relative (x1, y1), (x2, y2) = next(line_iter) coord = [f'{x1} {y1} moveto {x2 - x1} 0 l'] append_coord = coord.append x = x2 for (x1, y1), (x2, y2) in line_iter: append_coord(f' {x1 - x} {int(y1 - y)} m {x2 - x1} 0 l') x, y = x2, y2 writeline(''.join(coord)) writeline('stroke') writeline('%%EOF') def as_png_data_uri(matrix, matrix_size, scale=1, border=None, compresslevel=9, **kw): """\ Converts the provided matrix into a PNG data URI. See :func:`write_png` for a description of supported parameters. :rtype: str """ buff = io.BytesIO() write_png(matrix, matrix_size, buff, scale=scale, border=border, compresslevel=compresslevel, **kw) return f'data:image/png;base64,{base64.b64encode(buff.getvalue()).decode("ascii")}' @colorful(dark='#000', light='#fff') def write_png(matrix, matrix_size, out, colormap, scale=1, border=None, compresslevel=9, dpi=None): """\ Serializes the QR code as PNG image. By default, the generated PNG will be a greyscale image (black / white) with a bit depth of 1. If different colors are provided, an indexed-color image with the same bit depth is generated unless more than two colors are provided. This may require a bit depth of of 2 or 4. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write bytes. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 x 1 pixel per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param int dpi: Optional DPI setting. By default (``None``), the PNG won't have any DPI information. Note that the DPI value is converted into meters since PNG does not support any DPI information. :param int compresslevel: Integer indicating the compression level (default: 9). 1 is fastest and produces the least compression, 9 is slowest and produces the most. 0 is no compression. :param dict colormap: Optional module type -> color mapping. If provided, the `color` and `background` arguments are ignored. All undefined module types will have the default colors (light: white, dark: black). See `color` for valid color values. ``None`` is accepted as valid color value as well (becomes transparent). """ def png_color(clr): return _color_to_rgb_or_rgba(clr, alpha_float=False) if clr is not None else transparent def chunk(name, data): """\ Returns a PNG chunk with checksum. """ chunk_head = name + data return pack(b'>I', len(data)) + chunk_head + pack(b'>I', zlib.crc32(chunk_head)) def scanline(row, filter_type=b'\0'): """\ Returns a single scanline. """ return bytearray(chain(filter_type, # See _pack_bits_into_byte, same code, but the bit depth is taken # into account (reduce(lambda x, y: (x << png_bit_depth) + y, e) for e in zip_longest(*[iter(row)] * (8 // png_bit_depth), fillvalue=0x0)))) scale = int(scale) width, height, border = _valid_width_height_and_border(matrix_size, scale, border) if dpi: dpi = int(dpi) if dpi < 0: raise ValueError('DPI value must not be negative') dpi = int(dpi // 0.0254) black = (0, 0, 0) white = (255, 255, 255) transparent = (-1, -1, -1, -1) # Invalid placeholder for transparent color dark_idx = consts.TYPE_FINDER_PATTERN_DARK qz_idx = consts.TYPE_QUIET_ZONE clr_map = {k: png_color(colormap[k]) for k in colormap} # Creating a palette here regardless of the image type (greyscale vs. index-colors) palette = sorted(set(clr_map.values()), key=itemgetter(0, 1, 2)) is_transparent = transparent in palette number_of_colors = len(palette) # Check if greyscale mode is applicable is_greyscale = number_of_colors == 2 and all(clr in (transparent, black, white) for clr in palette) png_color_type = 0 if is_greyscale else 3 png_bit_depth = 1 # Assume a bit depth of 1 (may change if PLTE is used) png_trans_idx = None if not is_greyscale: # PLTE if number_of_colors > 2: # Max. 15 different colors are supported, no need to support # bit depth 8 (more than 16 colors) png_bit_depth = 2 if number_of_colors < 5 else 4 palette.sort(key=len, reverse=True) # RGBA colors first if is_transparent: png_trans_idx = 0 rgb_values = _NAME2RGB.values() if len(palette[1]) == 3 else ((*clr, 0) for clr in _NAME2RGB.values()) # Choose a random color which becomes transparent. transparent_color = next(clr for clr in rgb_values if clr not in palette) palette[0] = transparent_color # Replace the placeholder "transparent" with the actual RGB(A) value clr_map.update({module_type: transparent_color for module_type, clr in clr_map.items() if clr == transparent}) elif is_transparent: # Greyscale and transparent if black in palette: # Since black is zero, it should be the first entry palette = [black, transparent] png_trans_idx = palette.index(transparent) if number_of_colors > 2: # Need the more expensive matrix iterator miter = matrix_iter_verbose(matrix, matrix_size, scale=1, border=0) color_index = {module_type: palette.index(clr) for module_type, clr in clr_map.items()} else: # Just two colors, use the cheap iterator which returns 0x0 or 0x1 miter = iter(matrix) # The code to create the image requires that TYPE_QUIET_ZONE is available color_index = {qz_idx: palette.index(clr_map[qz_idx])} color_index.update({0: color_index[qz_idx], 1: palette.index(clr_map[dark_idx])}) miter = ((color_index[b] for b in r) for r in miter) horizontal_border = b'' vertical_border = b'' if border > 0: # Calculate horizontal and vertical border qz_value = color_index[qz_idx] horizontal_border = scanline(repeat(qz_value, width)) * border * scale vertical_border = [qz_value] * border * scale # # This variable holds the "Up" filter which indicates that this scanline # is equal to the above scanline (since it is filled with null bytes) same_as_above = b'' if scale > 1: # 2 == PNG Filter "Up" same_as_above = scanline(repeat(0x0, width), filter_type=b'\2') * (scale - 1) miter = (chain(*(repeat(b, scale) for b in row)) for row in miter) idat = bytearray(horizontal_border) for row in miter: # Chain precalculated left border with row and right border idat += scanline(chain(vertical_border, row, vertical_border)) idat += same_as_above # This is b'' if no scaling factor was provided idat += horizontal_border with writable(out, 'wb') as f: write = f.write write(b'\211PNG\r\n\032\n') # Magic number # Header: # width, height, bitdepth, colortype, compression meth., filter, interlance write(chunk(b'IHDR', pack(b'>2I5B', width, height, png_bit_depth, png_color_type, 0, 0, 0))) if dpi: write(chunk(b'pHYs', pack(b'>LLB', dpi, dpi, 1))) if not is_greyscale: write(chunk(b'PLTE', b''.join(pack(b'>3B', *clr[:3]) for clr in palette))) # if len(palette[0]) > 3: # Color with alpha channel is the first entry in the palette write(chunk(b'tRNS', b''.join(pack(b'>B', clr[3]) for clr in palette if len(clr) > 3))) elif is_transparent: write(chunk(b'tRNS', pack(b'>B', png_trans_idx))) elif is_transparent: # Grayscale with Transparency # # 2 bytes for color type == 0 (greyscale) write(chunk(b'tRNS', pack(b'>1H', png_trans_idx))) write(chunk(b'IDAT', zlib.compress(idat, compresslevel))) write(chunk(b'IEND', b'')) def write_pdf(matrix, matrix_size, out, scale=1, border=None, dark='#000', light=None, compresslevel=9): """\ Serializes the QR code as PDF document. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write bytes. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 x 1 pixel per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param dark: Color of the modules (default: black). The color can be provided as ``(R, G, B)`` tuple, as web color name (like "red") or in hexadecimal format (``#RGB`` or ``#RRGGBB``). :param light: Optional background color (default: ``None`` = no background color). See `color` for valid values. :param int compresslevel: Integer indicating the compression level (default: 9). 1 is fastest and produces the least compression, 9 is slowest and produces the most. 0 is no compression. """ def write_string(writemeth, s): writemeth(s.encode('ascii')) def to_pdf_color(clr): """\ Converts the provided color into an acceptable format for PDF's "DeviceRGB" color space. """ def to_float(c): if isinstance(c, float): if not 0.0 <= c <= 1.0: raise ValueError(f'Invalid color "{c}". Not in range 0 .. 1') return c return 1 / 255.0 * c if c != 1 else c return tuple([to_float(i) for i in _color_to_rgb(clr)]) width, height, border = _valid_width_height_and_border(matrix_size, scale, border) creation_date = f"{time.strftime('%Y%m%d%H%M%S')}{(time.timezone // 3600):+03d}'{(abs(time.timezone) % 60):02d}'" cmds = [] append_cmd = cmds.append if light is not None: # If the background color is defined, a rect is drawn in the background append_cmd('{} {} {} rg'.format(*to_pdf_color(light))) append_cmd(f'0 0 {width} {height} re') append_cmd('f q') # Set the stroke color only iff it is not black (default) if not _color_is_black(dark): append_cmd('{} {} {} RG'.format(*to_pdf_color(dark))) if scale > 1: append_cmd(f'{scale} 0 0 {scale} 0 0 cm') # Current pen position y-axis # Note: 0, 0 = lower left corner in PDF coordinate system y = get_symbol_size(matrix_size, scale=1, border=0)[1] + border - .5 # Set the origin in the upper left corner append_cmd(f'1 0 0 1 {border} {y} cm') miter = matrix_to_lines(matrix, 0, 0, incby=-1) # PDF supports absolute coordinates, only cmds.extend(f'{x1} {y1} m {x2} {y1} l' for (x1, y1), (x2, y2) in miter) append_cmd('S') graphic = zlib.compress((' '.join(cmds)).encode('ascii'), compresslevel) with writable(out, 'wb') as f: write = f.write writestr = partial(write_string, write) object_pos = [] write(b'%PDF-1.4\r%\xE2\xE3\xCF\xD3\r\n') for obj in ('obj <>\r\nendobj\r\n', 'obj <>\r\nendobj\r\n', f'obj <>\r\nendobj\r\n', f'obj <>\r\nstream\r\n'): object_pos.append(f.tell()) writestr(f'{len(object_pos)} 0 {obj}') write(graphic) write(b'\r\nendstream\r\nendobj\r\n') object_pos.append(f.tell()) writestr(f'{len(object_pos)} 0 obj <>\r\nendobj\r\n') object_pos.append(f.tell()) writestr(f'xref\r\n0 {len(object_pos)}\r\n0000000000 65535 f\r\n') for pos in object_pos[:-1]: writestr(f'{pos:010d} {0:05d} n\r\n') writestr(f'trailer <>\r\n') xref_location = object_pos[-1] writestr(f'startxref\r\n{xref_location}\r\n%%EOF\r\n') def write_txt(matrix, matrix_size, out, border=None, dark='1', light='0'): """\ Serializes QR code in a text format. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write text. :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param dark: Character to use for the black modules (default: '1') :param light: Character to use for the white modules (default: '0') """ row_iter = matrix_iter(matrix, matrix_size, scale=1, border=border) colours = (str(light), str(dark)) with writable(out, 'wt') as f: write = f.write for row in row_iter: write(''.join(colours[i] for i in row)) write('\n') def write_pbm(matrix, matrix_size, out, scale=1, border=None, plain=False): """\ Serializes the matrix as `PBM `_ image. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write binary data. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 x 1 pixel per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param bool plain: Indicates if a P1 (ASCII encoding) image should be created (default: False). By default a (binary) P4 image is created. """ def pack_row(iterable): """\ Packs eight bits into one byte. """ return (reduce(lambda x, y: (x << 1) + y, e) for e in zip_longest(*[iter(iterable)] * 8, fillvalue=0x0)) width, height, border = _valid_width_height_and_border(matrix_size, scale, border) row_iter = matrix_iter(matrix, matrix_size, scale, border) with writable(out, 'wb') as f: write = f.write write(f'{("P4" if not plain else "P1")}\n' f'# Created by {CREATOR}\n' f'{width} {height}\n'.encode('ascii')) if not plain: for row in row_iter: write(bytearray(pack_row(row))) else: for row in row_iter: write(b''.join(str(i).encode('ascii') for i in row)) write(b'\n') def write_pam(matrix, matrix_size, out, scale=1, border=None, dark='#000', light='#fff'): """\ Serializes the matrix as `PAM `_ image. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write binary data. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 x 1 pixel per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param dark: Color of the modules (default: black). The color can be provided as ``(R, G, B)`` tuple, as web color name (like "red") or in hexadecimal format (``#RGB`` or ``#RRGGBB``). :param light: Optional background color (default: white). See `color` for valid values. In addition, ``None`` is accepted which indicates a transparent background. """ def invert_row_bits(row): """\ Inverts the row bits 0 -> 1, 1 -> 0 """ return bytearray([b ^ 0x1 for b in row]) def row_to_color_values(row, colours): return b''.join(colours[b] for b in row) if not dark: raise ValueError(f'Invalid stroke color "{dark}"') width, height, border = _valid_width_height_and_border(matrix_size, scale, border) row_iter = matrix_iter(matrix, matrix_size, scale, border) depth, maxval, tuple_type = 1, 1, 'BLACKANDWHITE' transparency = False stroke_color = _color_to_rgb_or_rgba(dark, alpha_float=False) bg_color = _color_to_rgb_or_rgba(light, alpha_float=False) if light is not None else None colored_stroke = not (_color_is_black(stroke_color) or _color_is_white(stroke_color)) if bg_color is None: tuple_type = 'GRAYSCALE_ALPHA' if not colored_stroke else 'RGB_ALPHA' transparency = True bg_color = _invert_color(stroke_color[:3]) bg_color += (0,) if len(stroke_color) != 4: stroke_color += (255,) elif colored_stroke or not (_color_is_black(bg_color) or _color_is_white(bg_color)): tuple_type = 'RGB' is_rgb = tuple_type.startswith('RGB') colours = None if not is_rgb and transparency: depth = 2 colours = (b'\x01\x00', b'\x00\x01') elif is_rgb: maxval = max(chain(stroke_color, bg_color)) depth = 3 if not transparency else 4 fmt = f'>{depth}B'.encode('ascii') colours = (pack(fmt, *bg_color), pack(fmt, *stroke_color)) row_filter = invert_row_bits if colours is None else partial(row_to_color_values, colours=colours) with writable(out, 'wb') as f: write = f.write write('P7\n' f'# Created by {CREATOR}\n' f'WIDTH {width}\n' f'HEIGHT {height}\n' f'DEPTH {depth}\n' f'MAXVAL {maxval}\n' f'TUPLTYPE {tuple_type}\n' 'ENDHDR\n'.encode('ascii')) for row in row_iter: write(row_filter(row)) @colorful(dark='#000', light='#fff') def write_ppm(matrix, matrix_size, out, colormap, scale=1, border=None): """\ Serializes the matrix as `PPM `_ image. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write binary data. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 x 1 pixel per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). """ scale = int(scale) width, height, border = _valid_width_height_and_border(matrix_size, scale, border) if None in colormap.values(): raise ValueError('Transparency is not supported') for mt, clr in colormap.items(): colormap[mt] = _color_to_rgb(clr) row_iter = matrix_iter_verbose(matrix, matrix_size, scale, border) with writable(out, 'wb') as f: write = f.write write(f'P6 # Created by {CREATOR}\n{width} {height} 255\n'.encode('ascii')) for row in row_iter: write(b''.join(pack(b'>3B', *colormap[mt]) for mt in row)) def write_xpm(matrix, matrix_size, out, scale=1, border=None, dark='#000', light='#fff', name='img'): """\ Serializes the matrix as `XPM `_ image. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write binary data. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 x 1 pixel per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param dark: Color of the modules (default: black). The color can be provided as ``(R, G, B)`` tuple, as web color name (like "red") or in hexadecimal format (``#RGB`` or ``#RRGGBB``). :param light: Optional background color (default: white). See `color` for valid values. ``None`` indicates a transparent background. :param str name: Name of the image (must be a valid C-identifier). Default: "img". """ width, height, border = _valid_width_height_and_border(matrix_size, scale, border) row_iter = matrix_iter(matrix, matrix_size, scale, border) stroke_color = color_to_rgb_hex(dark) if dark is not None else 'None' bg_color = color_to_rgb_hex(light) if light is not None else 'None' with writable(out, 'wt') as f: write = f.write write('/* XPM */\n' f'static char *{name}[] = {{\n' f'"{width} {height} 2 1",\n' f'" c {bg_color}",\n' f'"X c {stroke_color}",\n') for i, row in enumerate(row_iter): write(''.join(chain(['"'], (" " if not b else "X" for b in row), [f'"{("," if i < height - 1 else "")}\n']))) write('};\n') def write_xbm(matrix, matrix_size, out, scale=1, border=None, name='img'): """\ Serializes the matrix as `XBM `_ image. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write text data. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 x 1 in the provided unit per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param name: Prefix for the variable names. Default: "img". The prefix is used to construct the variable names: ```#define _width``` ```static unsigned char _bits[]``` """ width, height, border = _valid_width_height_and_border(matrix_size, scale, border) row_iter = matrix_iter(matrix, matrix_size, scale, border) with writable(out, 'wt') as f: write = f.write write(f'#define {name}_width {width}\n' f'#define {name}_height {height}\n' f'static unsigned char {name}_bits[] = {{\n') for i, row in enumerate(row_iter, start=1): iter_ = zip_longest(*[iter(row)] * 8, fillvalue=0x0) # Reverse bits since XBM uses little endian bits = [f'0x{reduce(lambda x, y: (x << 1) + y, bits[::-1]):02x}' for bits in iter_] write(' ') write(', '.join(bits)) write(',\n' if i < height else '\n') write('};\n') def write_tex(matrix, matrix_size, out, scale=1, border=None, dark='black', unit='pt', url=None): """\ Serializes the matrix as LaTeX PGF picture. Requires the `PGF/TikZ `_ package (i.e. ``\\usepackage{pgf}``) in the LaTeX source. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write text data. :param scale: Indicates the size of a single module (default: 1 which corresponds to 1 x 1 in the provided unit per module). :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). :param str dark: LaTeX color name. The color name is taken at it is, so ensure that it refers either to a default color name or that the color was defined previously. :param unit: Unit of the drawing (default: ``pt``) :param url: Optional URL where the QR code should point to. Requires the "hyperref" package. Default: ``None``. """ def point(x, y): return f'\\pgfqpoint{{{x}{unit}}}{{{y}{unit}}}' check_valid_scale(scale) check_valid_border(border) border = get_border(matrix_size, border) end_marker = '' with writable(out, 'wt') as f: write = f.write write(f'% Creator: {CREATOR}\n') write(f'% Date: {time.strftime("%Y-%m-%dT%H:%M:%S")}\n') if url: write(f'\\href{{{url}}}{{') end_marker = '}' write('\\begin{pgfpicture}\n') write(f' \\pgfsetlinewidth{{{scale}{unit}}}\n') if dark and dark != 'black': write(f' \\color{{{dark}}}\n') x, y = border, -border for (x1, y1), (x2, y2) in matrix_to_lines(matrix, x, y, incby=-1): write(f' \\pgfpathmoveto{{{point(x1 * scale, y1 * scale)}}}\n') write(f' \\pgfpathlineto{{{point(x2 * scale, y2 * scale)}}}\n') write(' \\pgfusepath{stroke}\n') write(f'\\end{{pgfpicture}}{end_marker}\n') def write_terminal(matrix, matrix_size, out, border=None): """\ Function to write to a terminal which supports ANSI escape codes. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write text. :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). """ with writable(out, 'wt') as f: write = f.write colours = [f'\033[{i}m' for i in (7, 49)] for row in matrix_iter(matrix, matrix_size, scale=1, border=border): prev_bit = -1 cnt = 0 for bit in row: if bit == prev_bit: cnt += 1 else: if cnt: write(colours[prev_bit]) write(' ' * cnt) write('\033[0m') # reset color prev_bit = bit cnt = 1 if cnt: write(colours[prev_bit]) write(' ' * cnt) write('\033[0m') # reset color write('\n') def write_terminal_win(matrix, matrix_size, border=None): # pragma: no cover """\ Function to write a QR code to a MS Windows terminal. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). """ import sys import struct import ctypes write = sys.stdout.write std_out = ctypes.windll.kernel32.GetStdHandle(-11) csbi = ctypes.create_string_buffer(22) res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(std_out, csbi) if not res: raise OSError('Cannot find information about the console. ' 'Not running on the command line?') default_color = struct.unpack(b'hhhhHhhhhhh', csbi.raw)[4] set_color = partial(ctypes.windll.kernel32.SetConsoleTextAttribute, std_out) colours = (240, default_color) for row in matrix_iter(matrix, matrix_size, scale=1, border=border): prev_bit = -1 cnt = 0 for bit in row: if bit == prev_bit: cnt += 1 else: if cnt: set_color(colours[prev_bit]) write(' ' * cnt) prev_bit = bit cnt = 1 if cnt: set_color(colours[prev_bit]) write(' ' * cnt) set_color(default_color) # reset color write('\n') def write_terminal_compact(matrix, matrix_size, out, border=None): """\ Function to write a QR code to a terminal using unicode half-block characters. Custom colors are not used. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: Filename or a file-like object supporting to write text. :param int border: Integer indicating the size of the quiet zone. If set to ``None`` (default), the recommended border size will be used (``4`` for QR Codes, ``2`` for Micro QR Codes). """ blocks = {(1, 1): ' ', (0, 1): '\u2580', # Upper half block (1, 0): '\u2584', # Lower half block (0, 0): '\u2588', # Full block } it = [matrix_iter(matrix, matrix_size, scale=1, border=border)] * 2 with writable(out, 'wt') as f: write = f.write for top_row, bottom_row in zip_longest(*it, fillvalue=repeat(1)): write(''.join(blocks[pair] for pair in zip(top_row, bottom_row))) write('\n') def _color_to_rgb_or_rgba(color, alpha_float=True): """\ Returns the provided color as ``(R, G, B)`` or ``(R, G, B, A)`` tuple. If the alpha value is opaque, an RGB tuple is returned, otherwise an RGBA tuple. :param color: A web color name (i.e. ``darkblue``) or a hexadecimal value (``#RGB`` or ``#RRGGBB``) or a RGB(A) tuple (i.e. ``(R, G, B)`` or ``(R, G, B, A)``) :param bool alpha_float: Indicates if the alpha value should be returned as float value. If ``False``, the alpha value is an integer value in the range of ``0 .. 254``. :rtype: tuple """ rgba = _color_to_rgba(color, alpha_float=alpha_float) if rgba[3] in (1.0, 255): return rgba[:3] return rgba def _color_to_webcolor(color, allow_css3_colors=True, optimize=True): """\ Returns either a hexadecimal code or a color name. :param color: A web color name (i.e. ``darkblue``) or a hexadecimal value (``#RGB`` or ``#RRGGBB``) or a RGB(A) tuple (i.e. ``(R, G, B)`` or ``(R, G, B, A)``) :param bool allow_css3_colors: Indicates if a CSS3 color value like rgba(R G, B, A) is an acceptable result. :param bool optimize: Inidcates if the shortest possible color value should be returned (default: ``True``). :rtype: str :return: The provided color as web color: ``#RGB``, ``#RRGGBB``, ``rgba(R, G, B, A)``, or web color name. """ if _color_is_black(color): return '#000' elif _color_is_white(color): return '#fff' clr = _color_to_rgb_or_rgba(color) alpha_channel = None if len(clr) == 4: if allow_css3_colors: return 'rgba({0},{1},{2},{3})'.format(*clr) # noqa UP030 alpha_channel = clr[3] clr = clr[:3] hx = '#{0:02x}{1:02x}{2:02x}'.format(*clr) # noqa UP030 if optimize: if hx == '#d2b48c': hx = 'tan' # shorter elif hx == '#ff0000': hx = 'red' # shorter elif hx[1] == hx[2] and hx[3] == hx[4] and hx[5] == hx[6]: hx = f'#{hx[1]}{hx[3]}{hx[5]}' return hx if alpha_channel is None else (hx, alpha_channel) def color_to_rgb_hex(color): """\ Returns the provided color in hexadecimal representation. :param color: A web color name (i.e. ``darkblue``) or a hexadecimal value (``#RGB`` or ``#RRGGBB``) or a RGB(A) tuple (i.e. ``(R, G, B)`` or ``(R, G, B, A)``) :returns: ``#RRGGBB``. """ return '#{0:02x}{1:02x}{2:02x}'.format(*_color_to_rgb(color)) # noqa UP030 def _color_is_black(color): """\ Returns if the provided color represents "black". :param color: A web color name (i.e. ``darkblue``) or a hexadecimal value (``#RGB`` or ``#RRGGBB``) or a RGB(A) tuple (i.e. ``(R, G, B)`` or ``(R, G, B, A)``) :return: ``True`` if color is represents black, otherwise ``False``. """ try: color = color.lower() except AttributeError: pass return color in ('#000', '#000000', 'black', (0, 0, 0), (0, 0, 0, 255), (0, 0, 0, 1.0)) def _color_is_white(color): """\ Returns if the provided color represents "black". :param color: A web color name (i.e. ``darkblue``) or a hexadecimal value (``#RGB`` or ``#RRGGBB``) or a RGB(A) tuple (i.e. ``(R, G, B)`` or ``(R, G, B, A)``) :return: ``True`` if color is represents white, otherwise ``False``. """ try: color = color.lower() except AttributeError: pass return color in ('#fff', '#ffffff', 'white', (255, 255, 255), (255, 255, 255, 255), (255, 255, 255, 1.0)) def _color_to_rgb(color): """\ Converts web color names like "red" or hexadecimal values like "#36c", "#FFFFFF" and RGB tuples like ``(255, 255 255)`` into a (R, G, B) tuple. :param color: A web color name (i.e. ``darkblue``) or a hexadecimal value (``#RGB`` or ``#RRGGBB``) or a RGB tuple (i.e. ``(R, G, B)``)) :return: ``(R, G, B)`` tuple. """ rgb = _color_to_rgb_or_rgba(color) if len(rgb) != 3: raise ValueError(f'The alpha channel {rgb[3]} in color "{color}" cannot be ' 'converted to RGB') return rgb def _color_to_rgba(color, alpha_float=True): """\ Returns a (R, G, B, A) tuple. :param color: A web color name (i.e. ``darkblue``) or a hexadecimal value (``#RGB`` or ``#RRGGBB``) or a RGB(A) tuple (i.e. ``(R, G, B)`` or ``(R, G, B, A)``) :param bool alpha_float: Indicates if the alpha value should be returned as float value. If ``False``, the alpha value is an integer value in the range of ``0 .. 254``. :return: ``(R, G, B, A)`` tuple. """ res = [] alpha_channel = (1.0,) if alpha_float else (255,) if isinstance(color, tuple): col_length = len(color) is_valid = False if 3 <= col_length <= 4: for i, part in enumerate(color[:3]): is_valid = 0 <= part <= 255 res.append(part) if not is_valid or i == 2: break if is_valid: if col_length == 4: res.append(_alpha_value(color[3], alpha_float)) else: res.append(alpha_channel[0]) if is_valid: return tuple(res) raise ValueError(f'Unsupported color "{color}"') try: return _NAME2RGB[color.lower()] + alpha_channel except KeyError: try: clr = _hex_to_rgb_or_rgba(color, alpha_float=alpha_float) if len(clr) == 4: return clr else: return clr + alpha_channel except ValueError: raise ValueError(f'Unsupported color "{color}". Neither a known web ' 'color name nor a color in hexadecimal format.') def _hex_to_rgb_or_rgba(color, alpha_float=True): """\ Helper function to convert a color provided in hexadecimal format (``#RGB`` or ``#RRGGBB``) to a RGB(A) tuple. :param str color: Hexadecimal color name. :param bool alpha_float: Indicates if the alpha value should be returned as float value. If ``False``, the alpha value is an integer value in the range of ``0 .. 254``. :return: Tuple of integer values representing a RGB(A) color. :rtype: tuple :raises: :py:exc:`ValueError` in case the provided string could not converted into a RGB(A) tuple """ if color[0] == '#': color = color[1:] if 2 < len(color) < 5: # Expand RGB -> RRGGBB and RGBA -> RRGGBBAA color = ''.join([color[i] * 2 for i in range(len(color))]) color_len = len(color) if color_len not in (6, 8): raise ValueError(f'Input #{color} is not in #RRGGBB nor in #RRGGBBAA format') res = tuple([int(color[i:i + 2], 16) for i in range(0, color_len, 2)]) if alpha_float and color_len == 8: res = res[:3] + (_alpha_value(res[3], alpha_float),) return res _ALPHA_COMMONS = {255: 1.0, 128: .5, 64: .25, 32: .125, 16: .625, 0: 0.0} def _alpha_value(color, alpha_float): if alpha_float: if not isinstance(color, float): if 0 <= color <= 255: return _ALPHA_COMMONS.get(color, float('%.02f' % (color / 255.0))) else: if 0 <= color <= 1.0: return color else: if not isinstance(color, float): if 0 <= color <= 255: return color else: if 0 <= color <= 1.0: return color * 255.0 raise ValueError(f'Invalid alpha channel value: {color}') def _invert_color(rgb_or_rgba): """\ Returns the inverse color for the provided color. This function does not check if the color is a valid RGB / RGBA color. :param rgb: (R, G, B) or (R, G, B, A) tuple. """ return tuple([255 - c for c in rgb_or_rgba]) # _NAME2RGB = { 'aliceblue': (240, 248, 255), 'antiquewhite': (250, 235, 215), 'aqua': (0, 255, 255), 'aquamarine': (127, 255, 212), 'azure': (240, 255, 255), 'beige': (245, 245, 220), 'bisque': (255, 228, 196), 'black': (0, 0, 0), 'blanchedalmond': (255, 235, 205), 'blue': (0, 0, 255), 'blueviolet': (138, 43, 226), 'brown': (165, 42, 42), 'burlywood': (222, 184, 135), 'cadetblue': (95, 158, 160), 'chartreuse': (127, 255, 0), 'chocolate': (210, 105, 30), 'coral': (255, 127, 80), 'cornflowerblue': (100, 149, 237), 'cornsilk': (255, 248, 220), 'crimson': (220, 20, 60), 'cyan': (0, 255, 255), 'darkblue': (0, 0, 139), 'darkcyan': (0, 139, 139), 'darkgoldenrod': (184, 134, 11), 'darkgray': (169, 169, 169), 'darkgreen': (0, 100, 0), 'darkgrey': (169, 169, 169), 'darkkhaki': (189, 183, 107), 'darkmagenta': (139, 0, 139), 'darkolivegreen': (85, 107, 47), 'darkorange': (255, 140, 0), 'darkorchid': (153, 50, 204), 'darkred': (139, 0, 0), 'darksalmon': (233, 150, 122), 'darkseagreen': (143, 188, 143), 'darkslateblue': (72, 61, 139), 'darkslategray': (47, 79, 79), 'darkslategrey': (47, 79, 79), 'darkturquoise': (0, 206, 209), 'darkviolet': (148, 0, 211), 'deeppink': (255, 20, 147), 'deepskyblue': (0, 191, 255), 'dimgray': (105, 105, 105), 'dimgrey': (105, 105, 105), 'dodgerblue': (30, 144, 255), 'firebrick': (178, 34, 34), 'floralwhite': (255, 250, 240), 'forestgreen': (34, 139, 34), 'fuchsia': (255, 0, 255), 'gainsboro': (220, 220, 220), 'ghostwhite': (248, 248, 255), 'gold': (255, 215, 0), 'goldenrod': (218, 165, 32), 'gray': (128, 128, 128), 'green': (0, 128, 0), 'greenyellow': (173, 255, 47), 'grey': (128, 128, 128), 'honeydew': (240, 255, 240), 'hotpink': (255, 105, 180), 'indianred': (205, 92, 92), 'indigo': (75, 0, 130), 'ivory': (255, 255, 240), 'khaki': (240, 230, 140), 'lavender': (230, 230, 250), 'lavenderblush': (255, 240, 245), 'lawngreen': (124, 252, 0), 'lemonchiffon': (255, 250, 205), 'lightblue': (173, 216, 230), 'lightcoral': (240, 128, 128), 'lightcyan': (224, 255, 255), 'lightgoldenrodyellow': (250, 250, 210), 'lightgray': (211, 211, 211), 'lightgreen': (144, 238, 144), 'lightgrey': (211, 211, 211), 'lightpink': (255, 182, 193), 'lightsalmon': (255, 160, 122), 'lightseagreen': (32, 178, 170), 'lightskyblue': (135, 206, 250), 'lightslategray': (119, 136, 153), 'lightslategrey': (119, 136, 153), 'lightsteelblue': (176, 196, 222), 'lightyellow': (255, 255, 224), 'lime': (0, 255, 0), 'limegreen': (50, 205, 50), 'linen': (250, 240, 230), 'magenta': (255, 0, 255), 'maroon': (128, 0, 0), 'mediumaquamarine': (102, 205, 170), 'mediumblue': (0, 0, 205), 'mediumorchid': (186, 85, 211), 'mediumpurple': (147, 112, 219), 'mediumseagreen': (60, 179, 113), 'mediumslateblue': (123, 104, 238), 'mediumspringgreen': (0, 250, 154), 'mediumturquoise': (72, 209, 204), 'mediumvioletred': (199, 21, 133), 'midnightblue': (25, 25, 112), 'mintcream': (245, 255, 250), 'mistyrose': (255, 228, 225), 'moccasin': (255, 228, 181), 'navajowhite': (255, 222, 173), 'navy': (0, 0, 128), 'oldlace': (253, 245, 230), 'olive': (128, 128, 0), 'olivedrab': (107, 142, 35), 'orange': (255, 165, 0), 'orangered': (255, 69, 0), 'orchid': (218, 112, 214), 'palegoldenrod': (238, 232, 170), 'palegreen': (152, 251, 152), 'paleturquoise': (175, 238, 238), 'palevioletred': (219, 112, 147), 'papayawhip': (255, 239, 213), 'peachpuff': (255, 218, 185), 'peru': (205, 133, 63), 'pink': (255, 192, 203), 'plum': (221, 160, 221), 'powderblue': (176, 224, 230), 'purple': (128, 0, 128), 'red': (255, 0, 0), 'rosybrown': (188, 143, 143), 'royalblue': (65, 105, 225), 'saddlebrown': (139, 69, 19), 'salmon': (250, 128, 114), 'sandybrown': (244, 164, 96), 'seagreen': (46, 139, 87), 'seashell': (255, 245, 238), 'sienna': (160, 82, 45), 'silver': (192, 192, 192), 'skyblue': (135, 206, 235), 'slateblue': (106, 90, 205), 'slategray': (112, 128, 144), 'slategrey': (112, 128, 144), 'snow': (255, 250, 250), 'springgreen': (0, 255, 127), 'steelblue': (70, 130, 180), 'tan': (210, 180, 140), 'teal': (0, 128, 128), 'thistle': (216, 191, 216), 'tomato': (255, 99, 71), 'turquoise': (64, 224, 208), 'violet': (238, 130, 238), 'wheat': (245, 222, 179), 'white': (255, 255, 255), 'whitesmoke': (245, 245, 245), 'yellow': (255, 255, 0), 'yellowgreen': (154, 205, 50), } def _make_colormap(matrix_width, matrix_height, dark, light, finder_dark=False, finder_light=False, data_dark=False, data_light=False, version_dark=False, version_light=False, format_dark=False, format_light=False, alignment_dark=False, alignment_light=False, timing_dark=False, timing_light=False, separator=False, dark_module=False, quiet_zone=False): """\ Creates and returns a module type -> color map. The result can be used for serializers which support more than two colors. Examples .. code-block:: python # All dark modules (data, version, ...) will be dark red, the dark # modules of the finder patterns will be blue # The light modules will be rendered in the serializer's default color # (usually white) cm = colormap(dark='darkred', finder_dark='blue') # Use the serializer's default colors for dark / light modules # (usually black and white) but the dark modules of the timing patterns # will be brown cm = colormap(timing_dark=(165, 42, 42)) :param int matrix_width: Matrix width :param int matrix_height: Matrix height :param dark: Default color of dark modules :param light: Default color of light modules :param finder_dark: Color of the dark modules of the finder patterns. :param finder_light: Color of the light modules of the finder patterns. :param data_dark: Color of the dark data modules. :param data_light: Color of the light data modules. :param version_dark: Color of the dark modules of the version information. :param version_light: Color of the light modules of the version information. :param format_dark: Color of the dark modules of the format information. :param format_light: Color of the light modules of the format information. :param alignment_dark: Color of the dark modules of the alignment patterns. :param alignment_light: Color of the light modules of the alignment patterns. :param timing_dark: Color of the dark modules of the timing patterns. :param timing_light: Color of the light modules of the timing patterns. :param separator: Color of the separator. :param dark_module: Color of the dark module. :param quiet_zone: Color of the quiet zone / border. :rtype: dict """ unsupported = () is_square = matrix_width == matrix_height if not is_square: # rMQR unsupported = [consts.TYPE_DARKMODULE, consts.TYPE_VERSION_DARK, consts.TYPE_VERSION_LIGHT] if matrix_width < 43: # rMQR R11x27, R13x27, … unsupported.extend((consts.TYPE_ALIGNMENT_PATTERN_DARK, consts.TYPE_ALIGNMENT_PATTERN_LIGHT)) elif matrix_width < 45: # QR Code version 7 unsupported = [consts.TYPE_VERSION_DARK, consts.TYPE_VERSION_LIGHT] if matrix_width < 21: # Lesser than QR Code version 1 => Micro QR code unsupported.extend([consts.TYPE_DARKMODULE, consts.TYPE_ALIGNMENT_PATTERN_DARK, consts.TYPE_ALIGNMENT_PATTERN_LIGHT]) mt2color = { consts.TYPE_FINDER_PATTERN_DARK: finder_dark if finder_dark is not False else dark, consts.TYPE_FINDER_PATTERN_LIGHT: finder_light if finder_light is not False else light, consts.TYPE_DATA_DARK: data_dark if data_dark is not False else dark, consts.TYPE_DATA_LIGHT: data_light if data_light is not False else light, consts.TYPE_VERSION_DARK: version_dark if version_dark is not False else dark, consts.TYPE_VERSION_LIGHT: version_light if version_light is not False else light, consts.TYPE_ALIGNMENT_PATTERN_DARK: alignment_dark if alignment_dark is not False else dark, consts.TYPE_ALIGNMENT_PATTERN_LIGHT: alignment_light if alignment_light is not False else light, consts.TYPE_TIMING_DARK: timing_dark if timing_dark is not False else dark, consts.TYPE_TIMING_LIGHT: timing_light if timing_light is not False else light, consts.TYPE_FORMAT_DARK: format_dark if format_dark is not False else dark, consts.TYPE_FORMAT_LIGHT: format_light if format_light is not False else light, consts.TYPE_SEPARATOR: separator if separator is not False else light, consts.TYPE_DARKMODULE: dark_module if dark_module is not False else dark, consts.TYPE_QUIET_ZONE: quiet_zone if quiet_zone is not False else light, } return {mt: val for mt, val in mt2color.items() if mt not in unsupported} _VALID_SERIALIZERS = { 'svg': write_svg, 'png': write_png, 'eps': write_eps, 'txt': write_txt, 'pdf': write_pdf, 'ans': write_terminal, 'pbm': write_pbm, 'pam': write_pam, 'ppm': write_ppm, 'tex': write_tex, 'xbm': write_xbm, 'xpm': write_xpm, } def save(matrix, matrix_size, out, kind=None, **kw): """\ Serializes the matrix in any of the supported formats. :param matrix: The matrix to serialize. :param tuple(int, int) matrix_size: Tuple of width and height of the matrix. :param out: A filename or a writable file-like object with a ``name`` attribute. If a stream like :py:class:`io.ByteIO` or :py:class:`io.StringIO` object without a ``name`` attribute is provided, use the `kind` parameter to specify the serialization format. :param kind: If the desired output format cannot be extracted from the filename, this parameter can be used to indicate the serialization format (i.e. "svg" to enforce SVG output) :param kw: Any of the supported keywords by the specific serialization method. """ is_stream = False if kind is None: try: fname = out.name is_stream = True except AttributeError: fname = out ext = fname[fname.rfind('.') + 1:].lower() else: ext = kind.lower() is_svgz = not is_stream and ext == 'svgz' try: serializer = _VALID_SERIALIZERS[ext if not is_svgz else 'svg'] except KeyError: raise ValueError(f'Unknown file extension ".{ext}"') if is_svgz: with gzip.open(out, 'wb', compresslevel=kw.pop('compresslevel', 9)) as f: serializer(matrix, matrix_size, f, **kw) else: serializer(matrix, matrix_size, out, **kw) �������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/����������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14764403223�0014006�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/__init__.py�����������������������������������������������������������������������0000664�0000000�0000000�00000000000�14764403223�0016105�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/alltests.py�����������������������������������������������������������������������0000664�0000000�0000000�00000000272�14764403223�0016214�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Executes all tests. """ if __name__ == '__main__': import pytest pytest.main() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/����������������������������������������������������������������0000775�0000000�0000000�00000000000�14764403223�0017477�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/iso-fig-29.txt��������������������������������������������������0000664�0000000�0000000�00000003272�14764403223�0022031�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������00000000000000000000000000000000000000000 00000000000000000000000000000000000000000 00000000000000000000000000000000000000000 00000000000000000000000000000000000000000 00001111111011001100100100101011111110000 00001000001000101110101110001010000010000 00001011101000000011011011000010111010000 00001011101010100001110001100010111010000 00001011101011011000110100100010111010000 00001000001011000101000011011010000010000 00001111111010101010101010101011111110000 00000000000010100000000111001000000000000 00001000101111000011001000110111110010000 00001001010001110010010001100001011000000 00000100011000111110101010000110110010000 00001011010111010100100000100100000000000 00000011111100110101100100111010011000000 00000110010001010010001111001101010010000 00001010011110011111010011110001101110000 00001001000100010001111001011111000000000 00001100101111011100000111101111111000000 00000100000101111000100010000100001110000 00001111111111110101010001100100011110000 00000011000100000001111001010101011100000 00001111011110111010001110010100100010000 00001001100001010010100101110001000010000 00000001101111101110100100010110010000000 00000010110100111010000111110111011110000 00001110111110000101110010011111100000000 00000000000011101100111111001000101000000 00001111111010001101001010001010100110000 00001000001000010100100010111000100000000 00001011101011110110100000101111111000000 00001011101000001110001111000000001010000 00001011101001010101000010000101101000000 00001000001000101101110001101010010010000 00001111111011011010110100001111000110000 00000000000000000000000000000000000000000 00000000000000000000000000000000000000000 00000000000000000000000000000000000000000 00000000000000000000000000000000000000000 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/m2-finder-dark-and-light.txt������������������������������������0000664�0000000�0000000�00000000266�14764403223�0024613�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������1111111222222 1111111222222 1111111222222 1111111222222 1111111222222 1111111222222 1111111222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/m2-finder-dark.txt����������������������������������������������0000664�0000000�0000000�00000000266�14764403223�0022746�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������1111111222222 1222221222222 1211121222222 1211121222222 1211121222222 1222221222222 1111111222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/m2-finder-light.txt���������������������������������������������0000664�0000000�0000000�00000000266�14764403223�0023134�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������2222222222222 2000002222222 2022202222222 2022202222222 2022202222222 2000002222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/m2-quietzone-2.txt����������������������������������������������0000664�0000000�0000000�00000000462�14764403223�0022740�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������00000000000000000 00000000000000000 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00111111111111100 00000000000000000 00000000000000000 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/m2-quietzone-5.txt����������������������������������������������0000664�0000000�0000000�00000001050�14764403223�0022735�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000111111111111100000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/m2-separator.txt������������������������������������������������0000664�0000000�0000000�00000000266�14764403223�0022560�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������2222222022222 2222222022222 2222222022222 2222222022222 2222222022222 2222222022222 2222222022222 0000000022222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/m2-timing-dark-and-light.txt������������������������������������0000664�0000000�0000000�00000000266�14764403223�0024633�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������2222222211111 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 1222222222222 1222222222222 1222222222222 1222222222222 1222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/m2-timing-dark.txt����������������������������������������������0000664�0000000�0000000�00000000266�14764403223�0022766�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������2222222212121 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 1222222222222 2222222222222 1222222222222 2222222222222 1222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/m2-timing-light.txt���������������������������������������������0000664�0000000�0000000�00000000266�14764403223�0023154�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������2222222220202 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 2222222222222 0222222222222 2222222222222 0222222222222 2222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-darkmodule.txt�����������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0022717�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222221222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-finder-dark-and-light.txt������������������������������������0000664�0000000�0000000�00000000716�14764403223�0024623�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111122222221111111 111111122222221111111 111111122222221111111 111111122222221111111 111111122222221111111 111111122222221111111 111111122222221111111 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 111111122222222222222 111111122222222222222 111111122222222222222 111111122222222222222 111111122222222222222 111111122222222222222 111111122222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-finder-dark.txt����������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0022756�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111122222221111111 122222122222221222221 121112122222221211121 121112122222221211121 121112122222221211121 122222122222221222221 111111122222221111111 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 111111122222222222222 122222122222222222222 121112122222222222222 121112122222222222222 121112122222222222222 122222122222222222222 111111122222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-finder-light.txt���������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023144�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222222222222222222 200000222222222000002 202220222222222022202 202220222222222022202 202220222222222022202 200000222222222000002 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 200000222222222222222 202220222222222222222 202220222222222222222 202220222222222222222 200000222222222222222 222222222222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-format-dark-and-light.txt������������������������������������0000664�0000000�0000000�00000000716�14764403223�0024644�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222221222222222222 222222221222222222222 222222221222222222222 222222221222222222222 222222221222222222222 222222221222222222222 222222222222222222222 222222221222222222222 111111211222111111111 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222221222222222222 222222221222222222222 222222221222222222222 222222221222222222222 222222221222222222222 222222221222222222222 222222221222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-format-dark.txt����������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0022777�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222222222222222222 222222221222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222221222222222222 222222222222222222222 222222221222222222222 222211212222221122212 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222221222222222222 222222221222222222222 222222221222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-format-light.txt���������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023165�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222220222222222222 222222222222222222222 222222220222222222222 222222220222222222222 222222220222222222222 222222222222222222222 222222222222222222222 222222222222222222222 000022220222002200020 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222220222222222222 222222220222222222222 222222220222222222222 222222220222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-quietzone-1.txt����������������������������������������������0000664�0000000�0000000�00000001050�14764403223�0022741�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������00000000000000000000000 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 02222222222222222222220 00000000000000000000000 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-quietzone-4.txt����������������������������������������������0000664�0000000�0000000�00000001546�14764403223�0022756�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00002222222222222222222220000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 ����������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-separator.txt������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0022570�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222202222202222222 222222202222202222222 222222202222202222222 222222202222202222222 222222202222202222222 222222202222202222222 222222202222202222222 000000002222200000000 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 000000002222222222222 222222202222222222222 222222202222222222222 222222202222222222222 222222202222222222222 222222202222222222222 222222202222222222222 222222202222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-timing-dark.txt����������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0022776�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222221212122222222 222222222222222222222 222222122222222222222 222222222222222222222 222222122222222222222 222222222222222222222 222222122222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v1-timing-light.txt���������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023164�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222020222222222 222222222222222222222 222222222222222222222 222222022222222222222 222222222222222222222 222222022222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 222222222222222222222 ��������������������������������������������������segno-1.6.6/tests/feature_decompose/v12-alignment-dark-and-light.txt��������������������������������0000664�0000000�0000000�00000010302�14764403223�0025404�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222211111222222222222222222222222222222 22222222222222222222222222222211111222222222222222222222222222222 22222222222222222222222222222211111222222222222222222222222222222 22222222222222222222222222222211111222222222222222222222222222222 22222222222222222222222222222211111222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22221111122222222222222222222211111222222222222222222222111112222 22221111122222222222222222222211111222222222222222222222111112222 22221111122222222222222222222211111222222222222222222222111112222 22221111122222222222222222222211111222222222222222222222111112222 22221111122222222222222222222211111222222222222222222222111112222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222211111222222222222222222222111112222 22222222222222222222222222222211111222222222222222222222111112222 22222222222222222222222222222211111222222222222222222222111112222 22222222222222222222222222222211111222222222222222222222111112222 22222222222222222222222222222211111222222222222222222222111112222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/v12-alignment-dark.txt������������������������������������������0000664�0000000�0000000�00000010302�14764403223�0023537�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222211111222222222222222222222222222222 22222222222222222222222222222212221222222222222222222222222222222 22222222222222222222222222222212121222222222222222222222222222222 22222222222222222222222222222212221222222222222222222222222222222 22222222222222222222222222222211111222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22221111122222222222222222222211111222222222222222222222111112222 22221222122222222222222222222212221222222222222222222222122212222 22221212122222222222222222222212121222222222222222222222121212222 22221222122222222222222222222212221222222222222222222222122212222 22221111122222222222222222222211111222222222222222222222111112222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222211111222222222222222222222111112222 22222222222222222222222222222212221222222222222222222222122212222 22222222222222222222222222222212121222222222222222222222121212222 22222222222222222222222222222212221222222222222222222222122212222 22222222222222222222222222222211111222222222222222222222111112222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/v12-alignment-light.txt�����������������������������������������0000664�0000000�0000000�00000010302�14764403223�0023725�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222220002222222222222222222222222222222 22222222222222222222222222222220202222222222222222222222222222222 22222222222222222222222222222220002222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222000222222222222222222222220002222222222222222222222200022222 22222020222222222222222222222220202222222222222222222222202022222 22222000222222222222222222222220002222222222222222222222200022222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222220002222222222222222222222200022222 22222222222222222222222222222220202222222222222222222222202022222 22222222222222222222222222222220002222222222222222222222200022222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 22222222222222222222222222222222222222222222222222222222222222222 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/v7-version-dark-and-light.txt�����������������������������������0000664�0000000�0000000�00000004026�14764403223�0025045�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222222222222222222222222222222211122222222 222222222222222222222222222222222211122222222 222222222222222222222222222222222211122222222 222222222222222222222222222222222211122222222 222222222222222222222222222222222211122222222 222222222222222222222222222222222211122222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 111111222222222222222222222222222222222222222 111111222222222222222222222222222222222222222 111111222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/v7-version-dark.txt���������������������������������������������0000664�0000000�0000000�00000004026�14764403223�0023200�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222222222222222222222222222222222122222222 222222222222222222222222222222222221222222222 222222222222222222222222222222222221222222222 222222222222222222222222222222222221122222222 222222222222222222222222222222222211122222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222212222222222222222222222222222222222222222 211112222222222222222222222222222222222222222 122112222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/feature_decompose/v7-version-light.txt��������������������������������������������0000664�0000000�0000000�00000004026�14764403223�0023366�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������222222222222222222222222222222222200222222222 222222222222222222222222222222222202022222222 222222222222222222222222222222222202022222222 222222222222222222222222222222222202222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222200022222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 000020222222222222222222222222222222222222222 022220222222222222222222222222222222222222222 200220222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 222222222222222222222222222222222222222222222 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/issue-84/�������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14764403223�0015367�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/issue-84/issue-84-iso-8859-1.txt��������������������������������������������������0000664�0000000�0000000�00000001546�14764403223�0021060�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 00001111111000110011111110000 00001000001001111010000010000 00001011101011010010111010000 00001011101011011010111010000 00001011101000101010111010000 00001000001001001010000010000 00001111111010101011111110000 00000000000001100000000000000 00000001101101111000011000000 00001100110111001110110100000 00001101101100111101011100000 00001011010100010100101100000 00000110111001100001110000000 00000000000011001000010110000 00001111111011100011101000000 00001000001001110000011000000 00001011101011101001010110000 00001011101010110011000000000 00001011101000010000111110000 00001000001000101101011110000 00001111111000100010100000000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 ����������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/issue-84/issue-84-utf-8.txt�������������������������������������������������������0000664�0000000�0000000�00000001546�14764403223�0020460�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 00001111111010111011111110000 00001000001011111010000010000 00001011101011011010111010000 00001011101001101010111010000 00001011101001010010111010000 00001000001010000010000010000 00001111111010101011111110000 00000000000010100000000000000 00000011101010010111001110000 00000111100111000011001000000 00001101001101011001010110000 00001101100100011011100100000 00001111111101000001010110000 00000000000010001100110000000 00001111111000110010001100000 00001000001001111110011110000 00001011101011010000000100000 00001011101010100011110000000 00001011101011101000001000000 00001000001000000111011000000 00001111111000011100100100000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 00000000000000000000000000000 ����������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/�����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14764403223�0016146�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/README.txt�������������������������������������������������������������0000664�0000000�0000000�00000000423�14764403223�0017643�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������This directory contains matrices in the following format: 0 = white module 1 = dark module Example finder pattern: 1111111 1000001 1011101 1011101 1011101 1000001 1111111 No border / quiet zone should be defined, just the pure matrix. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/covid-cert.txt���������������������������������������������������������0000664�0000000�0000000�00000013566�14764403223�0020761�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101101110101011101000110111010010010010001010010011111010000001111111 10000010110101101011100111011010001011111011011010101000001101111110101000001 10111010111011110110100101010101000111000100001001000110110001010100101011101 10111010011100100100011000100001000101101010010111111001111110011100101011101 10111010100000110010000111111011011101011111111111100111000111111011101011101 10000010000111000011101010001000001111110100001000111100010011001010001000001 11111110101010101010101010101010101010101010101010101010101010101010101111111 00000000010110011110110010001000011111010111101000111101001000110010000000000 10011111111001110110010111111010010011100100101111100010100110100100110010111 01100000010111001100010011100110110111011000000111111001101100101100001000100 10110010011110111010000010111000110100101011001000010000101001010110101100110 00011100011101100010100101101111000000101101100001010111001000000110111100100 01001110010000101001100011100010011010011010001000001110011101111100100010110 10101001000100000111110010000100110001011111100000101010100101001101110001000 01011110010000110111111001001010001111101111010101100010110100101001011011010 00101101101001010111001110011101000100100110001011110010110110100010010101100 10000011000001101111011100011100010111101100010000101101001010100111101100101 11000001101011100011100111101000101011101001100110110011000010110100000100011 00001010001101010011111000111111110010110011011100010010011010000111100000110 01110000101000101100011010111001010010000010111101011010011110000101100111100 10101011000011101100111101100101111001010100111110000110011010110011111110010 10010101111101010011000101001101010000011010000011110011001001110000011111011 11110111000001101111000100001110011100001011000111011101101000011011111100100 00111100010111111000010001110111010011010011000011000100010110000100111110010 10101111111011111111010111111111110111010011101111100011110101110101111111000 00011000111101001011010010001110110010101000011000101100101001011000100011011 00111010110100100101100110101101011100101101011010101010100101001111101010011 10001000100101001011110010001111101100000101011000111111110010011011100010011 11001111110001010111000111111100100001111110101111110011100010101100111110010 00111000000100000110100110100001000011000100000110011110110010000101010110110 11110110011100101001111100001000101010001111111111100111100110111100001100101 00001001110010000010011100000011100111010010011011100100101101010010110011111 01010011011001000010000010000011100010100110111000010101011010110100100101011 00001100001111110111101101000011111111101011101011101110000111000011110101001 00010011110100010110111000111110010110100010111101110010010100101110100011000 11101101110101110010011101011111111000111010100011001110000100001111100000110 11110110011101110000011001100010111010001100100001101101010011110101011111111 10001100110010001101110100010011010110110010010111000010101111100110010111100 01000110001101100111001111111110111011001010111011010101100101011010010010000 11011000111100100101011011110001101100111011111110011010110101000011100110100 01110010101000001001000001111100111111110001011101001110010111010001011100101 01011100000110101101011100110111111100011110100000011100011101111011010110000 00010010010111100011101101111001100000111001000101110111110111100011110000010 01010000111010111111000101010010110101110000110000110100110111010100001110110 10010011100010011000000000101010000010101100101101000100000000101001110010111 10100100100101101010000000000001110100000010100010111001111011100101110111011 10111111101101101100011111111010110110001000011111100011101100010110111110110 01101000101000011100110110001101001100001111001000100010111110111010100010100 00001010110011000011111110101011101101000111111010111101101101110000101011100 11101000101000010110100010001000000110110100101000101001111011011101100011011 11011111100100110110111111111110101001110101011111110100100010011011111111000 00001001100111101011111001101000011011110101100001000100101101110110111010101 01100111111101010010011111010101101010101111110110100101101000000000010111100 10110100010110000100101101000110001001111111100111011010010111100001011010000 10101111101101100111101101011001001100110111111111101010011100010111011001000 01101100111110110100110101100010001100011110001101101111111111100111110001101 10000111001100110010101001011110011011000011000000100011111001010101101010101 01000100100011111001111000010111100111000100100000011001110110001111011001010 11111110011100001001111110001101101000000000000111010100001111011101101110011 11000000101010101001111110100101001111011010010100011010100011011111001101101 01000011110100111110100011000100101001100001101001110101100111000001111011111 01010101110100110011000010110010101011000010111011011011010100101101010000110 10011011100110111101000101010111000110011010001111011011011000011000101001001 00001001011010001001000011000110111100100001000100011101010111110110111100100 10101111001010010001000111111011011100000100110010101100101011010100101100010 10111100010101000101001010111110101001000101000011100100010111000000001110101 01001111110110111001101000010000001100110111110011100001110111011100111110100 00001001001100001000000000000110110101001100001000110111010000111001110001011 01111010110111110000010011111101110011110101101111111011111110010010111111111 00000000110100101000010110001101101010001011011000110011100101100100100010101 11111110100010001010011110101011101100000010111010100111010000110110101011000 10000010101011010111011110001000011110011000001000100001010110110110100011010 10111010101010111101100011111101011000001101001111101011000011111101111111111 10111010100010000100001111100110001001001101100110111000010011111101000111100 10111010000000010110000110100001110100101011110111001111010000001101101101001 10000010001100100001101100111001001111011111100010100000101000101111011100000 11111110100001010000001000011000011000001111001010001101100001110101100010010 ������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/fig-22-mask-0.txt������������������������������������������������������0000664�0000000�0000000�00000000462�14764403223�0020765�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101010101 10000010100000000 10111010111111111 10111010100000000 10111010111111111 10000010100000000 11111110111111111 00000000100000000 11111111111111111 00000000000000000 11111111111111111 00000000000000000 11111111111111111 00000000000000000 11111111111111111 00000000000000000 11111111111111111 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/fig-22-mask-1.txt������������������������������������������������������0000664�0000000�0000000�00000000462�14764403223�0020766�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101010101 10000010100011100 10111010111100011 10111010111100011 10111010100011100 10000010100011100 11111110111100011 00000000111100011 11111111100011100 01100011100011100 10011100011100011 00011100011100011 11100011100011100 01100011100011100 10011100011100011 00011100011100011 11100011100011100 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/fig-22-mask-2.txt������������������������������������������������������0000664�0000000�0000000�00000000462�14764403223�0020767�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101010101 10000010100011100 10111010111011011 10111010101010101 10111010110110110 10000010101110001 11111110111111111 00000000100011100 11111111111011011 00101010101010101 10110110110110110 00001110001110001 11111111111111111 01100011100011100 11011011011011011 00101010101010101 10110110110110110 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/fig-22-mask-3.txt������������������������������������������������������0000664�0000000�0000000�00000000462�14764403223�0020770�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101010101 10000010111100011 10111010101110001 10111010110101010 10111010100011100 10000010110001110 11111110101010101 00000000111100011 11111111101110001 01010101010101010 11100011100011100 01110001110001110 10101010101010101 00011100011100011 10001110001110001 01010101010101010 11100011100011100 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/fig-23-mask-0.txt������������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0020770�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100101001111111 100000100010101000001 101110100101001011101 101110100010101011101 101110100101001011101 100000100101001000001 111111101010101111111 000000000101000000000 000000100010100000000 101010001010101010101 010101110101010101010 101010001010101010101 101010101010101010101 000000000101010101010 111111100111011110101 100000100000100001010 101110100111011110101 101110100000100001010 101110100111011110101 100000100000100001010 111111100111011110101 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/fig-23-unmasked.txt����������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0021507�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100111101111111 100000100111101000001 101110100111101011101 101110100111101011101 101110100111101011101 100000100000001000001 111111101010101111111 000000000000000000000 000000100000000000000 111111011111111111111 111111111111111111111 111111011111111111111 000000100000000000000 000000000000000000000 111111100101110100000 100000100101110100000 101110100101110100000 101110100101110100000 101110100101110100000 100000100101110100000 111111100101110100000 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/fig-26.txt�������������������������������������������������������������0000664�0000000�0000000�00000000204�14764403223�0017675�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101 10000010000 10111010000 10111010100 10111010100 10000010100 11111110000 00000000000 11001011000 00000000000 10000000000 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/iso-fig-1.txt����������������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0020406�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100001101111111 100000101001101000001 101110101110101011101 101110101010001011101 101110100000101011101 100000100010101000001 111111101010101111111 000000001100100000000 100000101111011001110 100010001110001000111 011101111001100100010 110100001011010100110 011111111110001011011 000000001000000010110 111111100111111000110 100000100010011011100 101110100000111000111 101110100100001010100 101110100100101010011 100000100001110111100 111111101011001010010 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/iso-fig-29.txt���������������������������������������������������������0000664�0000000�0000000�00000002142�14764403223�0020473�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101100110010010010101111111 100000100010111010111000101000001 101110100000001101101100001011101 101110101010000111000110001011101 101110101101100011010010001011101 100000101100010100001101101000001 111111101010101010101010101111111 000000001010000000011100100000000 100010111100001100100011011111001 100101000111001001000110000101100 010001100011111010101000011011001 101101011101010010000010010000000 001111110011010110010011101001100 011001000101001000111100110101001 101001111001111101001111000110111 100100010001000111100101111100000 110010111101110000011110111111100 010000010111100010001000010000111 111111111111010101000110010001111 001100010000000111100101010101110 111101111011101000111001010010001 100110000101001010010111000100001 000110111110111010010001011001000 001011010011101000011111011101111 111011111000010111001001111110000 000000001110110011111100100010100 111111101000110100101000101010011 100000100001010010001011100010000 101110101111011010000010111111100 101110100000111000111100000000101 101110100101010100001000010110100 100000100010110111000110101001001 111111101101101011010000111100011 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/iso-i2.txt�������������������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0020015�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100101101111111 100000100111101000001 101110101000001011101 101110101100001011101 101110101011101011101 100000101000101000001 111111101010101111111 000000001001100000000 101111100100101111100 000101011010100101100 001000110101010011111 000010000100000111100 000111111001010010000 000000001011111001100 111111100110101100000 100000101011111000101 101110101000100101100 101110101100100100000 101110101011010010100 100000100000000110110 111111101111010010100 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/iso-i2_code_placement.txt����������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023037�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100001001111111 100000100011001000001 101110100100101011101 101110100000101011101 101110100111001011101 100000100100001000001 111111101010101111111 000000000101000000000 000000100000000000000 100001011110000001000 101100110001110111011 100110000000100011000 100011111101110110100 000000000111011101000 111111100010001000100 100000100111011100001 101110100100000001000 101110100000000000100 101110100111110110000 100000100100100010010 111111100011110110000 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/iso-i3.txt�������������������������������������������������������������0000664�0000000�0000000�00000000266�14764403223�0020016�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������1111111010101 1000001011101 1011101001101 1011101001111 1011101011100 1000001010001 1111111001111 0000000001100 1101000010001 0110101010101 1110011111110 0001010000110 1110100110111 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/iso-i3_code_placement.txt����������������������������������������������0000664�0000000�0000000�00000000266�14764403223�0023040�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������1111111010101 1000001001100 1011101000011 1011101000001 1011101001101 1000001000000 1111111000001 0000000000010 1000000000000 0000100100100 1111101110000 0000100001000 1000101000110 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/iso_6.8.2.2.txt��������������������������������������������������������0000664�0000000�0000000�00000000462�14764403223�0020376�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������00000000000000001 00000000000000001 00000000000000001 00000000000000000 00000000000000000 00000000000000001 00000000000000001 00000000000000000 00000000000000001 00000000000000000 00000000000000001 00000000000000000 00000000000000001 00000000000000000 00000000000000000 00000000000000001 10011100101001000 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/issue-33-m1-1234.txt���������������������������������������������������0000664�0000000�0000000�00000000204�14764403223�0021160�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101 10000010100 10111010111 10111010000 10111010111 10000010011 11111110100 00000000011 11001110011 01000001001 11111001011 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/issue-33-m1-12345.txt��������������������������������������������������0000664�0000000�0000000�00000000204�14764403223�0021245�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101 10000010110 10111010100 10111010000 10111010111 10000010011 11111110100 00000000011 11001110011 01010001100 11110000011 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/issue-33-m1-50041.txt��������������������������������������������������0000664�0000000�0000000�00000000204�14764403223�0021240�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101 10000010110 10111010010 10111010101 10111010011 10000010001 11111110010 00000000111 11000100000 00100110101 11111000110 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/issue-33-m3-l-12345678901234567890123.txt������������������������������0000664�0000000�0000000�00000000360�14764403223�0023364�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101010101 100000100110110 101110100011111 101110100100110 101110101101010 100000101010111 111111101111110 000000001000010 111101100000100 011110110100111 110111110001111 001111011000101 110000101011000 010011000101101 100111010001111 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/issue-33-m3-l-to-m4-l-jump.txt�����������������������������������������0000664�0000000�0000000�00000000462�14764403223�0023172�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101010101 10000010100000001 10111010011111001 10111010100000100 10111010011111001 10000010111100001 11111110110011100 00000000011111001 10010111011011001 00001100000010011 11100001101101000 00110111100000100 11111011101110011 01100110111110000 11010110110010000 01001001011111000 10011101111110111 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/issue-33-m3-l-to-m4-m-jump.txt�����������������������������������������0000664�0000000�0000000�00000000462�14764403223�0023173�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������11111110101010101 10000010000011101 10111010111011101 10111010101010001 10111010010110000 10000010010010000 11111110110011100 00000000111100101 10101111011111101 01110100001000110 11110111010100001 01010010111110101 10111111010110011 00101101111101100 11011010001110100 00000110110101101 11111001101111110 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/issue-33-m3-l-wikipedia.txt��������������������������������������������0000664�0000000�0000000�00000000360�14764403223�0022773�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101010101 100000100001010 101110101111111 101110101010011 101110100001011 100000101010101 111111100100110 000000000101001 111111000010101 000100110000111 111011011110111 010000100111010 101111101110101 010000100101110 111011010101111 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/ref_matrix/seq-iso-04-01.txt������������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0020732�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101010001111111 100000100111101000001 101110100001101011101 101110101101101011101 101110101110101011101 100000101000101000001 111111101010101111111 000000001101000000000 100010111010011111001 100001010000111110110 111000101011100011000 100000000101101011110 000000101100100100111 000000001110011100111 111111101110011110000 100000100010011100111 101110101111001010111 101110100101001011011 101110100110111110000 100000100111100010011 111111101010100100111 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/seq-iso-04-02.txt������������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0020733�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101000001111111 100000100110001000001 101110100011101011101 101110101101101011101 101110101010101011101 100000101000101000001 111111101010101111111 000000001011000000000 100010111100011111001 000111001100111010110 110101100000100001000 100101011110011101110 001010101111110100111 000000001100111101111 111111101100010101000 100000100110111011111 101110101111101100011 101110100101111111001 101110100101000110000 100000100001100011111 111111101000111000011 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/seq-iso-04-03.txt������������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0020734�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101101001111111 100000100010001000001 101110100111101011101 101110101100001011101 101110101010101011101 100000101010101000001 111111101010101111111 000000001111000000000 100010111110111111001 100100011000101100110 101101111001000111000 010110011101001010010 100110100011110101011 000000001011110110011 111111101110000110000 100000100110110001011 101110101111001101111 101110100010101011110 101110100000110110000 100000100011111101011 111111101100111110011 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/seq-iso-04-04.txt������������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0020735�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101011101111111 100000100111101000001 101110100000001011101 101110101111101011101 101110101110101011101 100000101010101000001 111111101010101111111 000000001011000000000 100010111100111111001 110100010110100010110 001101100001010011000 111110001110111100010 011111100100101111011 000000001100011110011 111111101100111000100 100000100110110010111 101110101110000000111 101110100111010111100 101110100000011010100 100000100110100111111 111111101001110100111 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking-1.txt�����������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0022730�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101100001111111 100000101001001000001 101110101001101011101 101110101000001011101 101110101010001011101 100000100010001000001 111111101010101111111 000000001000000000000 011010110000101011111 010000001111000010001 001101110110001011000 011011010011010101110 100010101011101110101 000000001101001000101 111111101010000101100 100000100101101101000 101110101010001111111 101110100101010100010 101110101000111101001 100000101011010001011 111111100000111100001 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking-2.txt�����������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0022731�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100010001111111 100000101101001000001 101110101001001011101 101110100001101011101 101110100001101011101 100000100101001000001 111111101010101111111 000000000100000000000 011101100000000000110 100001011110110011111 101110110101101000100 011100010100010010110 101100100001100000100 000000001001010100110 111111100010111101011 100000101100011100110 101110100001101100011 101110101010010011010 101110101110110011000 100000101111001101000 111111100000000100110 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking_mask-0.txt������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023742�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101100001111111 100000101001001000001 101110101001101011101 101110101000001011101 101110101010001011101 100000100010001000001 111111101010101111111 000000001000000000000 011010110000101011111 010000001111000010001 001101110110001011000 011011010011010101110 100010101011101110101 000000001101001000101 111111101010000101100 100000100101101101000 101110101010001111111 101110100101010100010 101110101000111101001 100000101011010001011 111111100000111100001 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking_mask-1.txt������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023743�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100001001111111 100000100100001000001 101110100100101011101 101110101101001011101 101110100111001011101 100000101111001000001 111111101010101111111 000000001101000000000 011000100101101101000 000101011010010111011 011000100011011110010 001110000110000000100 110111111110111011111 000000001000011101111 111111100111010000110 100000100000111000010 101110100111011010101 101110100000000001000 101110101101101000011 100000101110000100001 111111100101101001011 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking_mask-2.txt������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023744�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101010001111111 100000100000101000001 101110100111101011101 101110100001101011101 101110101100001011101 100000101011101000001 111111101010101111111 000000000001100000000 011111110110100110001 100001011110110011111 000011111000000101001 101010000010100100000 101100100101100000100 000000001100111001011 111111101100001011101 100000101100011100110 101110101100000001110 101110101100100101100 101110101110110011000 100000101010100000101 111111100110110010000 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking_mask-3.txt������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023745�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100010001111111 100000101101001000001 101110101001001011101 101110100001101011101 101110100001101011101 100000100101001000001 111111101010101111111 000000000010000000000 011101100000000000110 100001011110110011111 101110110101101000100 011100010100010010110 101100100101100000100 000000001001010100110 111111100010111101011 100000101100011100110 101110100001101100011 101110101010010011010 101110101110110011000 100000101111001101000 111111100000000100110 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking_mask-4.txt������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023746�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100110001111111 100000100100101000001 101110101100001011101 101110100010001011101 101110101000001011101 100000101111101000001 111111101010101111111 000000000010000000000 010010101010110110100 111101000010101111100 100000111011100110101 001001000001000111100 110000111001111100111 000000001000100101000 111111100111101000001 100000100111111111010 101110101000011101101 101110100000111001111 101110100101010000100 100000101001000011001 111111100010101110011 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking_mask-5.txt������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023747�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101001001111111 100000101100101000001 101110100111101011101 101110100111101011101 101110100100001011101 100000100111101000001 111111101010101111111 000000000101100000000 010000111110110000011 101111010000111101110 000011111000000101001 101110000110100000000 110111111110111011111 000000001000111101011 111111101100001011101 100000100010010010111 101110100100000001110 101110100000100001100 101110100101101000011 100000101110100100101 111111100110110010000 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking_mask-6.txt������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023750�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111100001001111111 100000101100101000001 101110100101101011101 101110101111101011101 101110101101001011101 100000100100101000001 111111101010101111111 000000001101100000000 010111101100111011010 101111010000111101110 001010110001001100000 101101000101100011000 110111111110111011111 000000001000100101000 111111100110011001111 100000101010010010111 101110101101001000111 101110101011100010100 101110100101101000011 100000101110111100110 111111100100100000010 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_datamasking_mask-7.txt������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0023751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101100001111111 100000100011001000001 101110101000101011101 101110101000001011101 101110100000001011101 100000101011001000001 111111101010101111111 000000001010000000000 010101111001111101101 010000001111000010001 011111100100011001010 010010011010011100111 100010101011101110101 000000001111011010111 111111101011001100101 100000101101101101000 101110100000011101101 101110101100011101011 101110100000111101001 100000101001000011001 111111100001110101000 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_format.txt������������������������������������������������������0000664�0000000�0000000�00000000716�14764403223�0021577�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111101222201111111 100000101222201000001 101110101222201011101 101110101222201011101 101110100222201011101 100000101222201000001 111111101010101111111 000000000222200000000 110011100222200101111 222222022222222222222 222222122222222222222 222222022222222222222 222222122222222222222 000000001222222222222 111111100222222222222 100000101222222222222 101110101222222222222 101110100222222222222 101110100222222222222 100000101222222222222 111111101222222222222 ��������������������������������������������������segno-1.6.6/tests/ref_matrix/thonky_version.txt�����������������������������������������������������0000664�0000000�0000000�00000004025�14764403223�0021771�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������111111102222222222222222222222222200101111111 100000102222222222222222222222222201001000001 101110102222222222222222222222222201001011101 101110102222222222222222222222222201101011101 101110102222222222221111122222222211101011101 100000102222222222221000122222222200001000001 111111101010101010101010101010101010101111111 000000002222222222221000122222222222200000000 222222122222222222221111122222222222222222222 222222022222222222222222222222222222222222222 222222122222222222222222222222222222222222222 222222022222222222222222222222222222222222222 222222122222222222222222222222222222222222222 222222022222222222222222222222222222222222222 222222122222222222222222222222222222222222222 222222022222222222222222222222222222222222222 222222122222222222222222222222222222222222222 222222022222222222222222222222222222222222222 222222122222222222222222222222222222222222222 222222022222222222222222222222222222222222222 222211111222222222221111122222222222111112222 222210001222222222221000122222222222100012222 222210101222222222221010122222222222101012222 222210001222222222221000122222222222100012222 222211111222222222221111122222222222111112222 222222022222222222222222222222222222222222222 222222122222222222222222222222222222222222222 222222022222222222222222222222222222222222222 222222122222222222222222222222222222222222222 222222022222222222222222222222222222222222222 222222122222222222222222222222222222222222222 222222022222222222222222222222222222222222222 222222122222222222222222222222222222222222222 222222022222222222222222222222222222222222222 000010122222222222222222222222222222222222222 011110022222222222222222222222222222222222222 100110122222222222221111122222222222111112222 000000001222222222221000122222222222100012222 111111102222222222221010122222222222101012222 100000102222222222221000122222222222100012222 101110102222222222221111122222222222111112222 101110102222222222222222222222222222222222222 101110102222222222222222222222222222222222222 100000102222222222222222222222222222222222222 111111102222222222222222222222222222222222222�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/requirements.txt������������������������������������������������������������������0000664�0000000�0000000�00000000231�14764403223�0017266�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Requirements to run the tests pytest pytest-cov pypng~=0.0.20 pyzbar~=0.1.8 qrcode-artistic Pillow importlib-metadata>=3.6.0; python_version < '3.10' �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_boosterror.py����������������������������������������������������������������0000664�0000000�0000000�00000003613�14764403223�0017622�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #16. """ import segno def test_boost_error_automatic(): qr = segno.make_qr('ABCDEF') assert '1-H' == qr.designator def test_boost_error_automatic_disabled(): qr = segno.make_qr('ABCDEF', boost_error=False) assert '1-L' == qr.designator def test_boost_error_automatic_arg_error(): qr = segno.make_qr('ABCDEF', error='l') assert '1-H' == qr.designator def test_boost_error_disabled_arg_error(): qr = segno.make_qr('ABCDEF', error='l', boost_error=False) assert '1-L' == qr.designator def test_boost_error_m1(): qr = segno.make('01234') assert qr.is_micro assert 'M1' == qr.version assert qr.error is None def test_boost_error_micro(): qr = segno.make('A', error='l') assert qr.is_micro assert 'M2' == qr.version assert 'M' == qr.error def test_boost_error_micro_boost_disabled(): qr = segno.make('A', error='l', boost_error=False) assert qr.is_micro assert 'M2' == qr.version assert 'L' == qr.error def test_boost_error_m3(): qr = segno.make('A', error='l', version='M3') assert qr.is_micro assert 'M3' == qr.version assert 'M' == qr.error def test_boost_error_m3_boost_disabled(): qr = segno.make('A', error='l', version='M3', boost_error=False) assert qr.is_micro assert 'M3' == qr.version assert 'L' == qr.error def test_boost_error_m4(): qr = segno.make('A', error='l', version='M4') assert qr.is_micro assert 'M4' == qr.version assert 'Q' == qr.error def test_boost_error_m4_boost_disabled(): qr = segno.make('A', error='l', version='M4', boost_error=False) assert qr.is_micro assert 'M4' == qr.version assert 'L' == qr.error if __name__ == '__main__': import pytest pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_cli.py�����������������������������������������������������������������������0000664�0000000�0000000�00000041120�14764403223�0016164�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against the command line script. """ import os import io import tempfile import gzip import shutil import xml.etree.ElementTree as etree import pytest from segno import cli def test_defaults(): args = cli.parse(['']) assert args.content == [''] assert args.error is None assert args.mode is None assert args.pattern is None assert args.version is None assert args.scale == 1 assert args.encoding is None assert not args.micro assert args.output is None assert args.border is None assert args.dark is None assert args.light is None assert args.boost_error assert not args.seq assert args.symbol_count is None # PNG assert not args.dpi assert args.finder_dark is None assert args.finder_light is None assert args.data_dark is None assert args.data_light is None assert args.alignment_dark is None assert args.alignment_light is None assert args.timing_dark is None assert args.timing_light is None assert args.format_dark is None assert args.format_light is None assert args.version_dark is None assert args.version_light is None assert args.quiet_zone is None assert args.dark_module is None assert args.separator is None # SVG assert args.xmldecl assert not args.no_classes assert args.svgencoding == 'utf-8' assert args.title is None assert args.desc is None assert args.svgns is True assert args.svgid is None assert args.svgclass is None assert args.lineclass is None assert args.omitsize is False assert args.unit is None assert args.svgversion is None assert args.nl is True assert args.draw_transparent is False # Terminal assert args.compact is False def test_segno_version(): try: cli.parse(['--ver', '']) except SystemExit as ex: assert 0 == ex.code def test_segno_version_shortcut(): try: cli.parse(['-V', '']) except SystemExit as ex: assert 0 == ex.code def test_noargs(): try: cli.parse([]) except SystemExit as ex: assert 1 == ex.code def test_error(): args = cli.parse(['-e', 'm', '']) assert args.error == 'M' qr = cli.make_code(args) assert 'H' == qr.error def test_error2(): args = cli.parse(['-e', 'M', '']) assert args.error == 'M' qr = cli.make_code(args) assert 'H' == qr.error def test_error3(): args = cli.parse(['-e', '-', '123']) assert args.error is None qr = cli.make_code(args) assert not qr.is_micro assert 1 == qr.version assert 'H' == qr.error def test_error_allow_micro(): args = cli.parse(['-e', '-', '--micro', '123']) assert args.error is None qr = cli.make_code(args) assert qr.is_micro assert 'M1' == qr.version assert qr.error is None def test_error4(): args = cli.parse(['--error=q', '--no-error-boost', '']) assert args.error == 'Q' qr = cli.make_code(args) assert 'Q' == qr.error def test_version(): args = cli.parse(['-v', '1', '']) assert args.version == '1' qr = cli.make_code(args) assert 1 == qr.version def test_version2(): args = cli.parse(['--version', '40', '']) assert args.version == '40' qr = cli.make_code(args) assert 40 == qr.version def test_version_micro(): args = cli.parse(['-v', 'M1', '0']) assert args.version == 'M1' qr = cli.make_code(args) assert 'M1' == qr.version def test_version_micro_m1(): args = cli.parse(['-v', 'M1', '12345']) assert args.version == 'M1' qr = cli.make_code(args) assert 'M1' == qr.version def test_version_micro_m1_automatic(): args = cli.parse(['--micro', '12345']) qr = cli.make_code(args) assert 'M1' == qr.version def test_version_micro_m2_automatic(): args = cli.parse(['--micro', '123456']) qr = cli.make_code(args) assert 'M2' == qr.version def test_mode(): args = cli.parse(['-m', 'alphanumeric', 'A']) assert args.mode == 'alphanumeric' qr = cli.make_code(args) assert 'alphanumeric' == qr.mode def test_mode2(): args = cli.parse(['--mode=byte', '']) assert args.mode == 'byte' qr = cli.make_code(args) assert 'byte' == qr.mode def test_pattern(): args = cli.parse(['-p', '1', '']) assert args.pattern == 1 qr = cli.make_code(args) assert qr.mask == 1 def test_pattern2(): args = cli.parse(['--pattern', '5', '']) assert args.pattern == 5 qr = cli.make_code(args) assert qr.mask == 5 def test_micro_false(): args = cli.parse(['--no-micro', '']) assert not args.micro qr = cli.make_code(args) assert not qr.is_micro def test_micro_true(): args = cli.parse(['--micro', '']) assert args.micro qr = cli.make_code(args) assert qr.is_micro def test_boost_error_disable(): args = cli.parse(['--no-error-boost', '']) assert not args.boost_error def test_border(): args = cli.parse(['--border', '0', '']) assert args.border == 0 def test_border_shortcut(): args = cli.parse(['-b', '10', '']) assert args.border == 10 def test_scale(): args = cli.parse(['--scale=1.6', '']) assert args.scale == 1.6 def test_scale2(): args = cli.parse(['--scale=2.0', '']) assert args.scale == 2 assert isinstance(args.scale, int) def test_scale_shortcut(): args = cli.parse(['-s=1.6', '']) assert args.scale == 1.6 def test_sequence(): args = cli.parse(['--seq', '-v=1', '']) assert args.seq assert '1' == args.version def test_sequence_symbol_count(): args = cli.parse(['--seq', '--symbol-count=4', '']) assert args.seq assert 4 == args.symbol_count def test_sequence_symbol_count_shortcut(): args = cli.parse(['--seq', '-sc=8', '']) assert args.seq assert 8 == args.symbol_count def test_sequence_output(): directory = tempfile.mkdtemp() assert 0 == len(os.listdir(directory)) cli.main(['--seq', '-v=1', '-e=m', '-o=' + os.path.join(directory, 'test.svg'), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ']) number_of_files = len(os.listdir(directory)) shutil.rmtree(directory) assert 4 == number_of_files def test_dark(): args = cli.parse(['--dark', 'green', '']) assert args.dark == 'green' assert cli.build_config(args)['dark'] == 'green' @pytest.mark.parametrize('arg', ['transparent', 'trans']) def test_dark_transparent(arg): args = cli.parse([f'--dark={arg}', '-output=x.png', '']) assert args.dark == arg assert cli.build_config(args)['dark'] is None def test_light(): args = cli.parse(['--light', 'red', '']) assert args.light == 'red' @pytest.mark.parametrize('arg', ['transparent', 'trans']) def test_light_transparent(arg): args = cli.parse([f'--light={arg}', '-output=x.png', '']) assert args.light == arg assert cli.build_config(args)['light'] is None def test_error_code(): try: cli.main(['--version=M1', '--seq', '"This is a test"']) except SystemExit as ex: assert 1 == ex.code @pytest.mark.parametrize('arg', ['-o', '--output']) @pytest.mark.parametrize('ext, expected, mode', [('svg', b' * """ import segno try: from .tutils import read_matrix # Attempted relative import in non-package except (ValueError, SystemError, ImportError): from tutils import read_matrix def test_covid_cert(): cert_raw = "HC1:6BFOXN*TS0BI$ZD8UH76PCM7ZJ7GZ20II/P3 43JUB/EBUMIU/3%$C2L9KST--M:UC*GPXS40 LHZA KEW%G%9DJ6K1AD1WMN" \ "+I0JK1WLB4DCHGLII3LN25OVLNF7LHCIZ09.9DM*GC9M$7JE9MZIIDOM1JAF.7IFNDXI03L9ZI4Q5%H0AN8EH06YB-TIP+P6OIB.V" \ "T*QNC2BFUF$SU%BO*N5PIBPIAOI-+R2YBV44PZB6H0CJ0QCK0YQK*R3T3+7A.N88J4R$F/MAITH6QS03L0QIRR97I2HOAXL92L0. " \ "KOKGTM8$M8SNCT64RR7+V4YC5/HQRPOHCR6W9.DPEA7IB65C94JB+ONS.CUIA7LE9JAF+B**O3-SY$NRUEG1AK/4C6DM.SY$NWYMG" \ "3GUBRCEIFRMLNKNM8POCJPG8/0NOLZGIZCUOY55*LTUJS1D7.J9$7$.IWQOMJV$6M53AA:6Z2S./BXPHRKGJUHB1WN5LH/M0:3P+E" \ "$$BWWNB8V5ZRF9JMKAX AAOL3H02YF*OF" # Don't use another error correction mode than "M", not sure if this is a requirement, though qr = segno.make(cert_raw, error='m', boost_error=False) assert 'M' == qr.error assert 15 == qr.version ref_matrix = read_matrix('covid-cert')[0] assert ref_matrix assert ref_matrix == qr.matrix if __name__ == '__main__': import pytest pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_data_uri.py������������������������������������������������������������������0000664�0000000�0000000�00000002201�14764403223�0017202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against Segno data URI. """ import segno def test_data_svg(): qr = segno.make_qr('A') val = qr.svg_data_uri() assert val expected = "data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27" assert expected == val[:len(expected)] assert val.endswith('%3C%2Fsvg%3E') def test_data_svg_minimal_encoding(): qr = segno.make_qr('A') val = qr.svg_data_uri(encode_minimal=True) assert val expected = "data:image/svg+xml;charset=utf-8,%3Csvg xmlns='" assert expected == val[:len(expected)] assert val.endswith('%3C/svg%3E') def test_data_svg_no_charset(): qr = segno.make_qr('A') val = qr.svg_data_uri(omit_charset=True) assert val expected = "data:image/svg+xml,%3Csvg%20xmlns%3D%27" assert expected == val[:len(expected)] assert val.endswith('%3C%2Fsvg%3E') def test_data_png(): qr = segno.make_qr('A') val = qr.png_data_uri() assert val assert val.startswith('data:image/png;base64,') if __name__ == '__main__': import pytest pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_encode_decode.py�������������������������������������������������������������0000664�0000000�0000000�00000004774�14764403223�0020173�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2020 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test suite which decodes generated QR Codes. Requires pyzbar and additional libs (libzbar0). """ import io import pytest import segno import platform try: from pyzbar.pyzbar import decode as zbardecode except (ImportError, FileNotFoundError): # The latter may occur under Windows pytestmark = pytest.mark.skip _libc, _ = platform.libc_ver() IS_MUSL = _libc != 'glibc' def decode(qrcode): if qrcode.is_micro: raise Exception('Cannot decode Micro QR codes') scale = 3 width, height = qrcode.symbol_size(scale=scale) out = io.BytesIO() for row in qrcode.matrix_iter(scale=scale): out.write(bytearray(0x0 if b else 0xff for b in row)) decoded = zbardecode((out.getvalue(), width, height)) assert 1 == len(decoded) assert 'QRCODE' == decoded[0].type return decoded[0].data.decode('utf-8') @pytest.mark.parametrize('content, mode', [('漢字', 'kanji'), ('続きを読む', 'kanji'), ('汉字', 'byte'), ]) def test_encode_decode(content, mode): qr = segno.make_qr(content) assert mode == qr.mode assert content == decode(qr) @pytest.mark.skipif(IS_MUSL, reason="zbar does not support latin1 with musl") def test_encode_decode_latin1(): # See content = 'Märchenbücher' qr = segno.make_qr(content) assert 'byte' == qr.mode assert content == decode(qr) def test_stackoverflow_issue(): # See # and content = 'Thomsôn Gonçalves Ámaral,325.432.123-21' qr = segno.make(content, encoding='utf-8') assert 'byte' == qr.mode decoded = decode(qr).encode('shift-jis').decode('utf-8') assert content == decoded def test_pyqrcode_issue76(): # See content = 'АБВГД' qr = segno.make(content, micro=False) assert 'kanji' == qr.mode assert content == decode(qr) qr = segno.make(content, encoding='utf-8', micro=False) assert 'byte' == qr.mode assert content == decode(qr) qr = segno.make(content.encode('utf-8'), micro=False) assert 'byte' == qr.mode assert content == decode(qr) if __name__ == '__main__': pytest.main([__file__]) ����segno-1.6.6/tests/test_encoder.py�������������������������������������������������������������������0000664�0000000�0000000�00000140435�14764403223�0017045�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against the encoder module. """ import pytest from segno import consts from segno import encoder from segno.encoder import Buffer try: from .tutils import read_matrix # Attempted relative import in non-package except (ValueError, SystemError, ImportError): from tutils import read_matrix def bits(s): return bytearray([int(x, 2) for x in s if x != ' ']) def check_prepare_data(expected, data, mode, encoding): assert expected[1:] == tuple(encoder.prepare_data(data, mode, encoding))[1:] def test_version_as_str(): qr = encoder.encode('test', version='1', error=None, mode=None, mask=None, eci=None, micro=None, encoding=None) assert 1 == qr.version @pytest.mark.parametrize('data', ['1234567', '666']) @pytest.mark.parametrize('mode', [None, consts.MODE_NUMERIC]) def test_prepare_data_numeric(data, mode): expected = ((data.encode('ascii'), len(data), consts.MODE_NUMERIC, None),) check_prepare_data(expected, data, mode, None) @pytest.mark.parametrize('data', ['1234567', '666']) @pytest.mark.parametrize('mode', [None, consts.MODE_NUMERIC, consts.MODE_ALPHANUMERIC, consts.MODE_BYTE]) def test_prepare_data_override_numeric(data, mode): encoding = None if mode != consts.MODE_BYTE else consts.DEFAULT_BYTE_ENCODING expected = ((data.encode('ascii'), len(data), mode or consts.MODE_NUMERIC, encoding),) check_prepare_data(expected, data, mode, None) @pytest.mark.parametrize('data', ( 'HELLO WORLD', 'ABCDEF', 'HELLO WORLD ', '-123', )) @pytest.mark.parametrize('mode', [None, consts.MODE_ALPHANUMERIC]) def test_prepare_data_alphanumeric(data, mode): expected = ((data.encode('ascii'), len(data), consts.MODE_ALPHANUMERIC, None),) check_prepare_data(expected, data, mode, None) @pytest.mark.parametrize('data', ( 'HELLO WORLD', 'ABCDEF', 'HELLO WORLD ', )) @pytest.mark.parametrize('mode', (None, consts.MODE_ALPHANUMERIC, consts.MODE_BYTE)) def test_prepare_data_override_alphanumeric(data, mode): encoding = None if mode != consts.MODE_BYTE else consts.DEFAULT_BYTE_ENCODING expected = ((data.encode('ascii'), len(data), mode or consts.MODE_ALPHANUMERIC, encoding),) check_prepare_data(expected, data, mode, None) def _make_test_prepare_data_byte_data(): test_data = ( ('HeLLO WORLD', consts.DEFAULT_BYTE_ENCODING), ('HELLO\nWORLD', consts.DEFAULT_BYTE_ENCODING), ('☺', 'utf-8'), ('12345a', consts.DEFAULT_BYTE_ENCODING), ('abcdef', consts.DEFAULT_BYTE_ENCODING), ) for data, encoding in test_data: for mode in (None, consts.MODE_BYTE): for param_encoding in (None, encoding): encoded_data = data.encode(encoding) expected = ((encoded_data, len(encoded_data), consts.MODE_BYTE, encoding),) yield expected, data, mode, param_encoding @pytest.mark.parametrize('expected, data, mode, param_encoding', _make_test_prepare_data_byte_data()) def test_prepare_data_byte(expected, data, mode, param_encoding): check_prepare_data(expected, data, mode, param_encoding) def test_prepare_data_multiple(): test_data = ['a', '1'] segments = encoder.prepare_data(test_data, None, None) assert 2 == len(segments) assert 12 == segments.bit_length assert (1, consts.MODE_BYTE, consts.DEFAULT_BYTE_ENCODING) == segments[0][1:] assert (1, consts.MODE_NUMERIC, None) == segments[1][1:] def test_prepare_data_multiple2(): test_data = ['a'] segments = encoder.prepare_data(test_data, None, None) assert 1 == len(segments) assert 8 == segments.bit_length assert (1, consts.MODE_BYTE, consts.DEFAULT_BYTE_ENCODING) == segments[0][1:] def test_prepare_data_multiple_int(): test_data = [1] segments = encoder.prepare_data(test_data, None, None) assert 1 == len(segments) assert 4 == segments.bit_length assert (1, consts.MODE_NUMERIC, None) == segments[0][1:] def test_prepare_data_multiple_override(): test_data = [(1, consts.MODE_ALPHANUMERIC), 2] segments = encoder.prepare_data(test_data, None, None) assert 2 == len(segments) assert 10 == segments.bit_length assert (1, consts.MODE_ALPHANUMERIC, None) == segments[0][1:] assert (1, consts.MODE_NUMERIC, None) == segments[1][1:] def test_prepare_data_multiple_mode_none(): test_data = [(1, None), ('A', None)] segments = encoder.prepare_data(test_data, None, None) assert 2 == len(segments) assert 10 == segments.bit_length assert (1, consts.MODE_NUMERIC, None) == segments[0][1:] assert (1, consts.MODE_ALPHANUMERIC, None) == segments[1][1:] def test_prepare_data_multiple_mode_none_ignore_encoding(): test_data = [(1, None, consts.DEFAULT_BYTE_ENCODING), ('A', None, 'utf-8')] segments = encoder.prepare_data(test_data, None, None) assert 2 == len(segments) assert 10 == segments.bit_length assert (1, consts.MODE_NUMERIC, None) == segments[0][1:] assert (1, consts.MODE_ALPHANUMERIC, None) == segments[1][1:] def test_prepare_data_multiple_mode_none_encoding(): test_data = [('Ä', None, consts.DEFAULT_BYTE_ENCODING), ('Ä', None, 'utf-8'), ('Ä', None, None)] segments = encoder.prepare_data(test_data, None, None) assert 3 == len(segments) assert 32 == segments.bit_length seg1, seg2, seg3 = segments mode, encoding = consts.MODE_BYTE, consts.DEFAULT_BYTE_ENCODING assert (len('Ä'.encode(consts.DEFAULT_BYTE_ENCODING)), mode, encoding) == seg1[1:] encoding = 'utf-8' assert (len('Ä'.encode()), mode, encoding) == seg2[1:] assert seg1 == seg3 # Encoding detection should produce the same result as 1st tuple def test_prepare_data_multiple_tuple(): test_data = ('a', '1') segments = encoder.prepare_data(test_data, None, None) assert 2 == len(segments) assert 12 == segments.bit_length assert (1, consts.MODE_BYTE, consts.DEFAULT_BYTE_ENCODING) == segments[0][1:] assert (1, consts.MODE_NUMERIC, None) == segments[1][1:] def test_write_segment_eci_standard_value(): # See ISO/IEC 18004:2006(E) -- 6.4.2.1 ECI Designator - EXAMPLE (page 24) encoding = 'ISO-8859-7' # TODO: ? # NOTE: ISO/IEC 18004:2006(E) uses "ΑΒΓΔΕ" but text says: # (character values A1HEX, A2HEX, A3HEX, A4HEX, A5HEX) and result seems # to use the A...HEX values as well s = '\u2018\u2019\u00A3\u20AC\u20AF'.encode(encoding) seg = encoder.make_segment(s, consts.MODE_BYTE, encoding) buff = Buffer() v, vrange = None, consts.VERSION_RANGE_01_09 encoder.write_segment(buff, seg, v, vrange, True) expected = bits('0111 00001001 0100 00000101 10100001 10100010 10100011 10100100 10100101') result = buff.getbits() assert len(expected) == len(result) assert expected == result @pytest.mark.parametrize('eci', [True, False]) def test_write_segment_numeric_standard_value_example1(eci): # See ISO/IEC 18004:2006(E) -- 6.4.3 Numeric mode - EXAMPLE 1 (page 25) s = b'01234567' seg = encoder.make_segment(s, consts.MODE_NUMERIC) buff = Buffer() v, vrange = None, consts.VERSION_RANGE_01_09 encoder.write_segment(buff, seg, v, vrange, eci=eci) assert bits('00010000001000000000110001010110011000011') == buff.getbits() @pytest.mark.parametrize('eci', [True, False]) def test_write_segment_numeric_standard_value_example2(eci): # See ISO/IEC 18004:2006(E) -- 6.4.3 Numeric mode - EXAMPLE 2 (page 25) s = b'0123456789012345' seg = encoder.make_segment(s, consts.MODE_NUMERIC) buff = Buffer() v, vrange = consts.VERSION_M3, consts.VERSION_M3 encoder.write_segment(buff, seg, v, vrange, eci=eci) assert bits('0010000000000110001010110011010100110111000010100111010100101') == buff.getbits() @pytest.mark.parametrize('eci', [True, False]) def test_write_segment_numeric_standard_value_i3(eci): # See ISO/IEC 18004:2006(E) -- I.3 Encoding a Micro QR Code symbol (page 96) s = b'01234567' seg = encoder.make_segment(s, consts.MODE_NUMERIC) buff = Buffer() v, vrange = consts.VERSION_M2, consts.VERSION_M2 encoder.write_segment(buff, seg, v, vrange, eci=eci) assert bits('01000000000110001010110011000011') == buff.getbits() @pytest.mark.parametrize('eci', [True, False]) def test_write_segment_alphanumeric_standard_value_example(eci): # See ISO/IEC 18004:2006(E) -- 6.4.3 Numeric mode - EXAMPLE (page 26) s = b'AC-42' seg = encoder.make_segment(s, consts.MODE_ALPHANUMERIC) buff = Buffer() v, vrange = None, consts.VERSION_RANGE_01_09 encoder.write_segment(buff, seg, v, vrange, eci=eci) assert bits('00100000001010011100111011100111001000010') == buff.getbits() @pytest.mark.parametrize('eci', [True, False]) def test_write_segment_alphanumeric_thonky(eci): # s = b'HELLO WORLD' seg = encoder.make_segment(s, consts.MODE_ALPHANUMERIC, None) buff = Buffer() v, vrange = None, consts.VERSION_RANGE_01_09 encoder.write_segment(buff, seg, v, vrange, eci) assert bits('00100000010110110000101101111000110100010111001011011100010011010100001101') == buff.getbits() @pytest.mark.parametrize('eci', [True, False]) def test_write_segment_bytes_thonky(eci): # s = b'Hello, world!' seg = encoder.make_segment(s, consts.MODE_BYTE, consts.DEFAULT_BYTE_ENCODING) buff = Buffer() v, vrange = None, consts.VERSION_RANGE_01_09 encoder.write_segment(buff, seg, v, vrange, eci=eci) assert bits('010000001101' '01001000' '01100101' '01101100' '01101100' '01101111' '00101100' '00100000' '01110111' '01101111' '01110010' '01101100' '01100100' '00100001') == buff.getbits() def test_write_terminator_thonky(): # data = bits('00100000010110110000101101111000110100010111001011011100010011010100001101') buff = Buffer(data) version = 1 v = None capacity = consts.SYMBOL_CAPACITY[version][consts.ERROR_LEVEL_Q] encoder.write_terminator(buff, capacity, v, len(data)) assert data + bits('0000') == buff.getbits() def test_write_terminator_standard_value_i2(): # See ISO/IEC 18004:2006(E) -- I.2 Encoding a QR Code symbol (page 94) data = bits('000100000010000000001100010101100110000110000') buff = Buffer(data) version = 1 v = None capacity = consts.SYMBOL_CAPACITY[version][consts.ERROR_LEVEL_M] encoder.write_terminator(buff, capacity, v, len(data)) assert data + bits('0000') == buff.getbits() def test_write_terminator_standard_value_i3(): # See ISO/IEC 18004:2006(E) -- I.3 Encoding a Micro QR Code symbol (page 96) data = bits('01000000000110001010110011000011') buff = Buffer(data) version = consts.VERSION_M2 capacity = consts.SYMBOL_CAPACITY[version][consts.ERROR_LEVEL_L] encoder.write_terminator(buff, capacity, version, len(data)) assert data + bits('00000') == buff.getbits() def test_write_padding_bits_iso_i2(): # See ISO/IEC 18004:2006(E) -- I.2 Encoding a QR Code symbol (page 94) data = bits('0001 0000001000 0000001100 0101011001 1000011 0000') buff = Buffer(data) version = 1 encoder.write_padding_bits(buff, version, len(buff)) assert bits('00010000 00100000 00001100 01010110 01100001 10000000') == buff.getbits() def test_write_padding_bits_iso_i3(): # See ISO/IEC 18004:2006(E) -- I.3 Encoding a Micro QR Code symbol (page 96) data = bits('0 1000 0000001100 0101011001 1000011 00000') buff = Buffer(data) version = consts.VERSION_M2 encoder.write_padding_bits(buff, version, len(buff)) assert bits('01000000 00011000 10101100 11000011 00000000') == buff.getbits() def test_write_padding_bits_thonky(): # data = bits('00100000 01011011 00001011 01111000 11010001 01110010 11011100 ' '01001101 01000011 010000') buff = Buffer(data) version = 1 encoder.write_padding_bits(buff, version, len(buff)) assert bits('00100000 01011011 00001011 01111000 11010001 01110010 11011100 ' '01001101 01000011 01000000') == buff.getbits() def test_write_pad_codewords_standard_value_i2(): # See ISO/IEC 18004:2006(E) -- I.2 Encoding a QR Code symbol (page 94) data = bits('00010000 00100000 00001100 01010110 01100001 10000000') buff = Buffer(data) version = 1 error = consts.ERROR_LEVEL_M capacity = consts.SYMBOL_CAPACITY[version][error] encoder.write_pad_codewords(buff, version, capacity, len(buff)) assert data + bits('1110110000010001111011000001000111101100000100011110110' '0000100011110110000010001') == buff.getbits() def test_write_pad_codewords_standard_value_i3(): # See ISO/IEC 18004:2006(E) -- I.3 Encoding a Micro QR Code symbol (page 96) data = bits('0100000000011000101011001100001100000000') buff = Buffer(data) version = consts.VERSION_M2 error = consts.ERROR_LEVEL_L capacity = consts.SYMBOL_CAPACITY[version][error] encoder.write_pad_codewords(buff, version, capacity, len(buff)) assert data == buff.getbits() @pytest.mark.parametrize('data', [b'ABCDEF', b'A', b'A1', b'1A', b'HTTP://WWW.EXAMPLE.ORG', b'666', b' ', b'HELLO WORLD', b'AC-42', consts.ALPHANUMERIC_CHARS]) def test_is_alphanumeric(data): assert encoder.is_alphanumeric(data) @pytest.mark.parametrize('data', [b'a', b'0123b', b'_', b'http://www.example.org/', b'', 'ü'.encode(), 'Ü'.encode(), 'ä'.encode(consts.DEFAULT_BYTE_ENCODING), b'HELLO\nWORLD', b'Ab']) def test_is_not_alphanumeric(data): assert not encoder.is_alphanumeric(data) @pytest.mark.parametrize('data', ['点', '漢字', '外来語', 'あめかんむり', 'ひへん', 'くさかんむり']) def test_is_kanji(data): assert encoder.is_kanji(data.encode('shift_jis')) @pytest.mark.parametrize('data', ['abcdef', '1234', '1234a', 'ABCDEF']) def test_is_not_kanji(data): assert not encoder.is_kanji(data.encode('shift_jis')) _test_find_mode_test_data = ( (b'123', consts.MODE_NUMERIC), (b'-123', consts.MODE_ALPHANUMERIC), (b'123a', consts.MODE_BYTE), (b'123A', consts.MODE_ALPHANUMERIC), (b'HELLO WORLD', consts.MODE_ALPHANUMERIC), (b'HELLO \n WORLD', consts.MODE_BYTE), (b'HTTP://WWW.EXAMPLE.ORG/', consts.MODE_ALPHANUMERIC), (b'http://www.example.org/', consts.MODE_BYTE), (b'#', consts.MODE_BYTE), (b'', consts.MODE_BYTE), (b'a', consts.MODE_BYTE), ('点'.encode('shift_jis'), consts.MODE_KANJI), ('茗'.encode('shift_jis'), consts.MODE_KANJI), ('漢字'.encode('shift_jis'), consts.MODE_KANJI), ('外来語'.encode('shift_jis'), consts.MODE_KANJI), ('外来語'.encode(), consts.MODE_BYTE), ) @pytest.mark.parametrize('data, expected', _test_find_mode_test_data) def test_find_mode(data, expected): assert expected == encoder.find_mode(data) @pytest.mark.parametrize('version, expected', # Version, matrix size [('M1', 11), ('M2', 13), ('M3', 15), ('M4', 17), (1, 21), (27, 125), (40, 177)]) def test_get_matrix_size(version, expected): try: v = consts.MICRO_VERSION_MAPPING[version] except KeyError: v = version assert expected == encoder.calc_matrix_size(v) # See ISO/IEC 18004:2006(E) - Table 2 (page 22) _test_is_mode_supported_micro_data = ( (consts.MODE_NUMERIC, 'M1', True), (consts.MODE_NUMERIC, 'M2', True), (consts.MODE_NUMERIC, 'M3', True), (consts.MODE_NUMERIC, 'M4', True), (consts.MODE_ALPHANUMERIC, 'M1', False), (consts.MODE_ALPHANUMERIC, 'M2', True), (consts.MODE_ALPHANUMERIC, 'M3', True), (consts.MODE_ALPHANUMERIC, 'M4', True), (consts.MODE_ECI, 'M1', False), (consts.MODE_ECI, 'M2', False), (consts.MODE_ECI, 'M3', False), (consts.MODE_ECI, 'M4', False), (consts.MODE_BYTE, 'M1', False), (consts.MODE_BYTE, 'M2', False), (consts.MODE_BYTE, 'M3', True), (consts.MODE_BYTE, 'M4', True), (consts.MODE_KANJI, 'M3', True), (consts.MODE_KANJI, 'M4', True), ) @pytest.mark.parametrize('mode, version, expected', _test_is_mode_supported_micro_data) def test_is_mode_supported_micro(mode, version, expected): v = consts.MICRO_VERSION_MAPPING[version] assert expected == encoder.is_mode_supported(mode, v) @pytest.mark.parametrize('version', tuple(range(1, 41))) @pytest.mark.parametrize('mode', (consts.MODE_NUMERIC, consts.MODE_ALPHANUMERIC, consts.MODE_BYTE, consts.MODE_ECI, consts.MODE_KANJI)) def test_is_mode_supported_micro2(version, mode): assert encoder.is_mode_supported(mode, version) @pytest.mark.parametrize('mode, version', [(-1, 1), (-2, consts.VERSION_M2), (10, 1), (10, consts.VERSION_M1), (9, 39)]) def test_is_mode_supported_invalid_mode(mode, version): with pytest.raises(ValueError) as ex: encoder.is_mode_supported(mode, version) assert 'mode' in str(ex.value) @pytest.mark.parametrize('mode', ('kanij', 'binary', 'blub', '')) def test_normalize_mode_illegal(mode): with pytest.raises(ValueError) as ex: encoder.normalize_mode(mode) assert 'mode' in str(ex.value) @pytest.mark.parametrize('mask', tuple(range(8))) def test_normalize_mask(mask): assert mask == encoder.normalize_mask(mask, is_micro=False) @pytest.mark.parametrize('mask', tuple(range(4))) def test_normalize_mask_micro(mask): assert mask == encoder.normalize_mask(mask, is_micro=True) def test_normalize_mask_none(): assert encoder.normalize_mask(None, is_micro=True) is None assert encoder.normalize_mask(None, is_micro=False) is None @pytest.mark.parametrize('version, mask', [(consts.VERSION_M1, 8), (1, 9), (1, -1)]) def test_normalize_mask_illegal(version, mask): with pytest.raises(ValueError): encoder.normalize_mask(mask, version < 1) def test_mode_name_illegal(): with pytest.raises(ValueError): encoder.get_mode_name(7) def test_error_name_illegal(): with pytest.raises(ValueError): encoder.get_error_name(7) def test_version_name_illegal(): with pytest.raises(ValueError): encoder.get_version_name(41) def test_version_range_illegal(): with pytest.raises(ValueError): encoder.version_range(41) def test_normalize_errorlevel(): assert consts.ERROR_LEVEL_H == encoder.normalize_errorlevel('h') assert consts.ERROR_LEVEL_Q == encoder.normalize_errorlevel('Q') assert encoder.normalize_errorlevel(None, accept_none=True) is None assert consts.ERROR_LEVEL_M == encoder.normalize_errorlevel(consts.ERROR_LEVEL_M) def test_normalize_errorlevel_illegal(): with pytest.raises(ValueError): encoder.normalize_errorlevel('g') def test_normalize_errorlevel_illegal2(): with pytest.raises(ValueError) as ex: encoder.normalize_errorlevel(None) assert 'error' in str(ex.value) _test_find_version_test_data = ( # data, error, micro, expected version ('12345', None, True, consts.VERSION_M1), ('12345', consts.ERROR_LEVEL_L, True, consts.VERSION_M2), # Error level Q isn't suppoted by M1 - M3 ('12345', consts.ERROR_LEVEL_Q, True, consts.VERSION_M4), # Error level H isn't supported by Micro QR Codes ('12345', consts.ERROR_LEVEL_H, None, 1), ('12345', None, False, 1), (12345, None, True, consts.VERSION_M1), (-12345, None, True, consts.VERSION_M2), # Negative number (-12345, consts.ERROR_LEVEL_M, True, consts.VERSION_M3), # Negative number (12345, None, False, 1), ('123456', None, True, consts.VERSION_M2), ('123456', None, False, 1), (123456, None, True, consts.VERSION_M2), (123456, None, False, 1), ('ABCDE', None, True, consts.VERSION_M2), # Alphanumeric isn't supported by M1 ('ABCDEF', consts.ERROR_LEVEL_L, True, consts.VERSION_M2), ('ABCDEF', consts.ERROR_LEVEL_M, True, consts.VERSION_M3), # Too much data for error level M and version M2 ('ABCDEF', consts.ERROR_LEVEL_L, False, 1), ('ABCDEF', consts.ERROR_LEVEL_L, False, 1), ('Märchenbuch', None, True, consts.VERSION_M4), ('Märchenbücher', None, False, 1), ('Märchenbücherei', None, None, consts.VERSION_M4), ('Märchenbücherei', consts.ERROR_LEVEL_M, None, 2), ) @pytest.mark.parametrize('data, error, micro, expected_version', _test_find_version_test_data) def test_find_version(data, error, micro, expected_version): segments = encoder.prepare_data(data, None, None) assert expected_version == encoder.find_version(segments, error, eci=False, micro=micro) def test_thonky_add_format_info(): # version = 1 width, height = 21, 21 # Version 1 matrix = encoder.make_matrix(width, height, reserve_regions=False) encoder.add_finder_patterns(matrix, width, height) encoder.add_format_info(matrix, version, consts.ERROR_LEVEL_L, 4) ref_matrix, ref_matrix_width, ref_matrix_height = read_matrix('thonky_format') assert ref_matrix_width, ref_matrix_height == (width, height) assert ref_matrix == matrix def test_thonky_add_version_info(): # version = 7 width, height = 45, 45 # Version 7 matrix = encoder.make_matrix(width, height, reserve_regions=False) encoder.add_finder_patterns(matrix, width, height) encoder.add_alignment_patterns(matrix, width, height) encoder.add_version_info(matrix, version) matrix[-8][8] = 0x1 # dark module ref_matrix, ref_matrix_width, ref_matrix_height = read_matrix('thonky_version') assert ref_matrix_width, ref_matrix_height == (width, height) assert ref_matrix == matrix def test_eval_micro(): # ISO/IEC 18004:2006(E) page 54 # 6.8.2.2 Evaluation of Micro QR Code symbols matrix, width, height = read_matrix('iso_6.8.2.2') res = encoder.evaluate_micro_mask(matrix, width, height) assert 104 == res def make_thonky_score_matrix(): # http://www.thonky.com/qr-code-tutorial/data-masking return read_matrix('thonky_datamasking-1') def test_score_n1(): matrix, width, height = make_thonky_score_matrix() scores = encoder.mask_scores(matrix, width, height) score = scores[0] assert 180 == score def test_score_n2(): matrix, width, height = make_thonky_score_matrix() scores = encoder.mask_scores(matrix, width, height) score = scores[1] assert 90 == score def test_score_n3(): matrix, width, height = make_thonky_score_matrix() scores = encoder.mask_scores(matrix, width, height) score = scores[2] # Thonky: 80 assert 760 == score def test_score_n4(): matrix, width, height = read_matrix('thonky_datamasking-2') scores = encoder.mask_scores(matrix, width, height) score = scores[3] assert 0 == score def test_thonky_pattern_0(): # http://www.thonky.com/qr-code-tutorial/data-masking matrix, width, height = read_matrix('thonky_datamasking_mask-0') scores = encoder.mask_scores(matrix, width, height) assert 180 == scores[0] assert 90 == scores[1] # Thonky: 80 assert 760 == scores[2] assert 0 == scores[3] # See score 3 assert 350 - 80 + 760 == encoder.evaluate_mask(matrix, width, height) def test_thonky_pattern_1(): # http://www.thonky.com/qr-code-tutorial/data-masking matrix, width, height = read_matrix('thonky_datamasking_mask-1') scores = encoder.mask_scores(matrix, width, height) assert 172 == scores[0] assert 129 == scores[1] # Thonky: 120 assert 760 == scores[2] assert 0 == scores[3] # See score 3 assert 421 - 120 + 760 == encoder.evaluate_mask(matrix, width, height) def test_thonky_pattern_2(): # http://www.thonky.com/qr-code-tutorial/data-masking matrix, width, height = read_matrix('thonky_datamasking_mask-2') scores = encoder.mask_scores(matrix, width, height) assert 206 == scores[0] assert 141 == scores[1] # Thonky: 160 assert 800 == scores[2] assert 0 == scores[3] assert 507 - 160 + 800 == encoder.evaluate_mask(matrix, width, height) def test_thonky_pattern_3(): # http://www.thonky.com/qr-code-tutorial/data-masking matrix, width, height = read_matrix('thonky_datamasking_mask-3') scores = encoder.mask_scores(matrix, width, height) assert 180 == scores[0] assert 141 == scores[1] # Thonky: 120 assert 760 == scores[2] # Thonky: 2, but that's impossible: Either 0 or a multiple of 10 (N4 = 10) assert 0 == scores[3] assert 443 - 2 - 120 + 760 == encoder.evaluate_mask(matrix, width, height) def test_thonky_pattern_4(): # http://www.thonky.com/qr-code-tutorial/data-masking matrix, width, height = read_matrix('thonky_datamasking_mask-4') scores = encoder.mask_scores(matrix, width, height) assert 195 == scores[0] assert 138 == scores[1] # Thonky: 200 assert 800 == scores[2] assert 0 == scores[3] # See score 3 assert 533 - 200 + 800 == encoder.evaluate_mask(matrix, width, height) def test_thonky_pattern_5(): # http://www.thonky.com/qr-code-tutorial/data-masking matrix, width, height = read_matrix('thonky_datamasking_mask-5') scores = encoder.mask_scores(matrix, width, height) assert 189 == scores[0] assert 156 == scores[1] # Thonky: 200 assert 800 == scores[2] # Thonky: 2, but that's impossible: Either 0 or a multiple of 10 (N4 = 10) assert 0 == scores[3] # See score 3 and 4 assert 547 - 2 - 200 + 800 == encoder.evaluate_mask(matrix, width, height) def test_thonky_pattern_6(): # http://www.thonky.com/qr-code-tutorial/data-masking matrix, width, height = read_matrix('thonky_datamasking_mask-6') scores = encoder.mask_scores(matrix, width, height) assert 171 == scores[0] assert 102 == scores[1] # Thonky: 80 assert 840 == scores[2] # Thonky: 4, but that's impossible: Either 0 or a multiple of 10 (N4 = 10) assert 0 == scores[3] # See score 3 and 4 assert 357 - 4 - 80 + 840 == encoder.evaluate_mask(matrix, width, height) def test_thonky_pattern_7(): # http://www.thonky.com/qr-code-tutorial/data-masking matrix, width, height = read_matrix('thonky_datamasking_mask-7') scores = encoder.mask_scores(matrix, width, height) assert 197 == scores[0] assert 123 == scores[1] # Thonky: 200 assert 720 == scores[2] assert 0 == scores[3] # See score 3 assert 520 - 200 + 720 == encoder.evaluate_mask(matrix, width, height) def test_score_n1_iso(): # For example, impose 5 penalty points on the block of “dark:dark:dark:dark:dark:dark:dark” # module pattern, where a series of seven consecutive modules is counted as one block matrix = tuple(bytearray([1] * 7) for i in range(7)) width, height = [len(matrix)] * 2 scores = encoder.mask_scores(matrix, width, height) score = scores[0] assert 5 * 7 * 2 == score def test_score_n2_iso(): # Take a block consisting of 3 x 3 dark # modules for an example. Considering that up to four 2 x 2 dark modules can # be included in this block, the penalty applied to this block shall be # calculated as 4 (blocks) x 3 (points) = 12 points. matrix = (bytearray([1, 1, 1]), bytearray([1, 1, 1]), bytearray([1, 1, 1])) width, height = [len(matrix)] * 2 scores = encoder.mask_scores(matrix, width, height) score = scores[1] assert 12 == score matrix = (bytearray([0, 0, 0]), bytearray([0, 0, 0]), bytearray([0, 0, 0])) scores = encoder.mask_scores(matrix, width, height) score = scores[1] assert 12 == score def _make_score_n4_data(): for p in range(41, 46): yield 10, p for p in range(55, 60): yield 10, p for p in range(46, 55): yield 0, p yield 3 * 10, 35 @pytest.mark.parametrize('score, percent', _make_score_n4_data()) def test_score_n4_iso(score, percent): # Add 10 points to a deviation of 5% increment or decrement in the # proportion ratio of dark module from the referential 50% (or 0 point) # level. For example, assign 0 points as a penalty if the ratio of dark # module is between 45% and 55%, or 10 points if the ratio of dark module # is between 40% and 60% def make_matrix(): row = [0x0] * 10 return tuple([bytearray(row) for i in range(10)]) def fill_matrix(matrix, percent): cnt = 0 finished = False for i in range(len(matrix)): for j in range(len(matrix)): matrix[i][j] = 0x1 cnt += 1 finished = cnt == percent if finished: break if finished: break matrix = make_matrix() fill_matrix(matrix, percent) width, height = [len(matrix)] * 2 scores = encoder.mask_scores(matrix, width, height) score = scores[3] assert score == score def test_binary_sequence_to_integers(): # # HELLO WORLD as a 1-M code data = bits('00100000 01011011 00001011 01111000 11010001 01110010 11011100 ' '01001101 01000011 01000000 11101100 00010001 11101100 00010001 ' '11101100 00010001') expected = [32, 91, 11, 120, 209, 114, 220, 77, 67, 64, 236, 17, 236, 17, 236, 17] res_int = list(Buffer(data).toints()) assert len(data) // 8 == len(res_int) assert expected == res_int def test_split_into_blocks(): # # HELLO WORLD as a 5-Q code s = '01000011 01010101 01000110 10000110 01010111 00100110 01010101 ' \ '11000010 01110111 00110010 00000110 00010010 00000110 01100111 ' \ '00100110 11110110 11110110 01000010 00000111 01110110 10000110 ' \ '11110010 00000111 00100110 01010110 00010110 11000110 11000111 ' \ '10010010 00000110 10110110 11100110 11110111 01110111 00110010 ' \ '00000111 01110110 10000110 01010111 00100110 01010010 00000110 ' \ '10000110 10010111 00110010 00000111 01000110 11110111 01110110 ' \ '01010110 11000010 00000110 10010111 00110010 11100000 11101100 ' \ '00010001 11101100 00010001 11101100 00010001 11101100' data = bits(s) buff = Buffer(data) codewords = list(buff.toints()) assert 62 == len(codewords) ec_infos = consts.ECC[5][consts.ERROR_LEVEL_Q] assert ec_infos assert 2 == len(ec_infos) blocks, error_blocks = encoder.make_blocks(ec_infos, buff) assert 4 == len(blocks) assert 15 == len(blocks[0]) assert bytearray(codewords[:15]) == blocks[0] assert 15 == len(blocks[1]) assert 16 == len(blocks[2]) assert 16 == len(blocks[3]) def test_make_error_block0(): # # 1-M codeword = '00100000 01011011 00001011 01111000 11010001 01110010 11011100 ' \ '01001101 01000011 01000000 11101100 00010001 11101100 00010001 ' \ '11101100 00010001' codeword_ints = [32, 91, 11, 120, 209, 114, 220, 77, 67, 64, 236, 17, 236, 17, 236, 17] buff = Buffer(bits(codeword)) assert codeword_ints == list(buff.toints()) error_block = bytearray([196, 35, 39, 119, 235, 215, 231, 226, 93, 23]) ec_infos = consts.ECC[1][consts.ERROR_LEVEL_M] assert 1 == len(ec_infos) ec_info = ec_infos[0] assert 1 == ec_info.num_blocks assert 10 == ec_info.num_total - ec_info.num_data data_blocks, error_blocks = encoder.make_blocks(ec_infos, buff) assert len(error_block) == len(error_blocks[0]) assert error_block == error_blocks[0] def test_make_error_block1(): # # 5-Q codeword = '01000011 01010101 01000110 10000110 01010111 00100110 01010101 ' \ '11000010 01110111 00110010 00000110 00010010 00000110 01100111 ' \ '00100110' codeword_ints = [67, 85, 70, 134, 87, 38, 85, 194, 119, 50, 6, 18, 6, 103, 38] buff = Buffer(bits(codeword)) assert codeword_ints == list(buff.toints()) error_block = bytearray([213, 199, 11, 45, 115, 247, 241, 223, 229, 248, 154, 117, 154, 111, 86, 161, 111, 39]) ec_infos = consts.ECC[5][consts.ERROR_LEVEL_Q] data_blocks, error_blocks = encoder.make_blocks(ec_infos, buff) assert error_block == error_blocks[0] def test_make_error_block2(): # # 5-Q codeword = '11110110 11110110 01000010 00000111 01110110 10000110 11110010 ' \ '00000111 00100110 01010110 00010110 11000110 11000111 10010010 ' \ '00000110' codeword_ints = [246, 246, 66, 7, 118, 134, 242, 7, 38, 86, 22, 198, 199, 146, 6] buff = Buffer(bits(codeword)) assert codeword_ints == list(buff.toints()) error_block = bytearray([87, 204, 96, 60, 202, 182, 124, 157, 200, 134, 27, 129, 209, 17, 163, 163, 120, 133]) ec_infos = consts.ECC[5][consts.ERROR_LEVEL_Q] data_blocks, error_blocks = encoder.make_blocks(ec_infos, buff) assert error_block == error_blocks[0] def test_make_error_block3(): # # 5-Q codeword = '10110110 11100110 11110111 01110111 00110010 00000111 01110110 ' \ '10000110 01010111 00100110 01010010 00000110 10000110 10010111 ' \ '00110010 00000111' codeword_ints = [182, 230, 247, 119, 50, 7, 118, 134, 87, 38, 82, 6, 134, 151, 50, 7] buff = Buffer(bits(codeword)) assert codeword_ints == list(buff.toints()) error_block = bytearray([148, 116, 177, 212, 76, 133, 75, 242, 238, 76, 195, 230, 189, 10, 108, 240, 192, 141]) ec_infos = (consts.ECC[5][consts.ERROR_LEVEL_Q][1],) data_blocks, error_blocks = encoder.make_blocks(ec_infos, buff) assert error_block == error_blocks[0] def test_make_error_block4(): # # 5-Q codeword = '01000110 11110111 01110110 01010110 11000010 00000110 10010111 ' \ '00110010 00010000 11101100 00010001 11101100 00010001 11101100 ' \ '00010001 11101100' codeword_ints = [70, 247, 118, 86, 194, 6, 151, 50, 16, 236, 17, 236, 17, 236, 17, 236] buff = Buffer(bits(codeword)) assert codeword_ints == list(buff.toints()) error_block = bytearray([235, 159, 5, 173, 24, 147, 59, 33, 106, 40, 255, 172, 82, 2, 131, 32, 178, 236]) ec_infos = (consts.ECC[5][consts.ERROR_LEVEL_Q][1],) data_blocks, error_blocks = encoder.make_blocks(ec_infos, buff) assert error_block == error_blocks[0] def test_make_error_block_iso_i2(): # ISO/IEC 18004:2006(E) - I.2 Encoding a QR Code symbol -- page 94 # Input: 01234567 # Symbol: 1-M s = '00010000 00100000 00001100 01010110 01100001 10000000 11101100 ' \ '00010001 11101100 00010001 11101100 00010001 11101100 00010001 ' \ '11101100 00010001' data_block = Buffer(bits(s)) error_s = '10100101 00100100 11010100 11000001 11101101 00110110 11000111 ' \ '10000111 00101100 01010101' error_block = list(Buffer(bits(error_s)).toints()) ec_infos = consts.ECC[1][consts.ERROR_LEVEL_M] ec_info = ec_infos[0] assert ec_info.num_total - ec_info.num_data == len(error_block) data_blocks, error_blocks = encoder.make_blocks(ec_infos, data_block) assert bytearray(error_block) == error_blocks[0] def test_make_error_block_iso_i3(): # ISO/IEC 18004:2006(E) - I.3 Encoding a Micro QR Code symbol -- page 96 # Input: 01234567 # Symbol: M2-L s = '01000000 00011000 10101100 11000011 00000000' buff = Buffer(bits(s)) error_s = '10000110 00001101 00100010 10101110 00110000' error_block = list(Buffer(bits(error_s)).toints()) ec_infos = consts.ECC[consts.VERSION_M2][consts.ERROR_LEVEL_L] ec_info = ec_infos[0] assert ec_info.num_total - ec_info.num_data == len(error_block) data_blocks, error_blocks = encoder.make_blocks(ec_infos, buff) assert bytearray(error_block) == error_blocks[0] def test_make_final_message_iso_i2(): # ISO/IEC 18004:2015(E) - I.2 Encoding a QR Code symbol -- page 94 # Input: 01234567 # Symbol: 1-M s = '00010000 00100000 00001100 01010110 01100001 10000000 11101100 ' \ '00010001 11101100 00010001 11101100 00010001 11101100 00010001 ' \ '11101100 00010001' codewords = Buffer(bits(s)) expected_s = '00010000 00100000 00001100 01010110 01100001 10000000 ' \ '11101100 00010001 11101100 00010001 11101100 00010001 ' \ '11101100 00010001 11101100 00010001 10100101 00100100 ' \ '11010100 11000001 11101101 00110110 11000111 10000111 ' \ '00101100 01010101' expected = bits(expected_s) assert expected == encoder.make_final_message(1, consts.ERROR_LEVEL_M, codewords).getbits() def test_make_final_message_iso_i3(): # ISO/IEC 18004:2015(E) - I.3 Encoding a Micro QR Code symbol -- page 96 # Input: 01234567 # Symbol: M2-L s = '01000000 00011000 10101100 11000011 00000000' codewords = Buffer(bits(s)) expected_s = '01000000 00011000 10101100 11000011 00000000 10000110 ' \ '00001101 00100010 10101110 00110000' expected = bits(expected_s) assert expected == encoder.make_final_message(consts.VERSION_M2, consts.ERROR_LEVEL_L, codewords).getbits() def test_make_final_message_thonky(): # # 5-Q codewords = '01000011 01010101 01000110 10000110 01010111 00100110 01010101 ' \ '11000010 01110111 00110010 00000110 00010010 00000110 01100111 ' \ '00100110 11110110 11110110 01000010 00000111 01110110 10000110 ' \ '11110010 00000111 00100110 01010110 00010110 11000110 11000111 ' \ '10010010 00000110 10110110 11100110 11110111 01110111 00110010 ' \ '00000111 01110110 10000110 01010111 00100110 01010010 00000110 ' \ '10000110 10010111 00110010 00000111 01000110 11110111 01110110 ' \ '01010110 11000010 00000110 10010111 00110010 00010000 11101100 ' \ '00010001 11101100 00010001 11101100 00010001 11101100' codewords_int = [67, 85, 70, 134, 87, 38, 85, 194, 119, 50, 6, 18, 6, 103, 38, 246, 246, 66, 7, 118, 134, 242, 7, 38, 86, 22, 198, 199, 146, 6, 182, 230, 247, 119, 50, 7, 118, 134, 87, 38, 82, 6, 134, 151, 50, 7, 70, 247, 118, 86, 194, 6, 151, 50, 16, 236, 17, 236, 17, 236, 17, 236] s = '0100001111110110101101100100011001010101111101101110011011110111010001' \ '1001000010111101110111011010000110000001110111011101010110010101110111' \ '0110001100101100001000100110100001100000011100000110010101011111001001' \ '1101101001011111000010000001111000011000110010011101110010011001010111' \ '0001000000110010010101100010011011101100000001100001011001010010000100' \ '0100010010110001100000011011101100000001101100011110000110000100010110' \ '0111100100101001011111101100001001100000011000110010000100010000011111' \ '1011001101010101010111100101001110101111000111110011000111010010011111' \ '0000101101100000101100010000010100101101001111001101010010101101011100' \ '1111001010010011000001100011110111101101101000010110010011111100010111' \ '1100010010110011101111011111100111011111001000100001111001011100100011' \ '1011100110101011111000100001100100110000101000100110100001101111000011' \ '1111111101110101100000011110011010101100100110101101000110111101010100' \ '1001101111000100010000101000000010010101101010001101101100100000111010' \ '0001101000111111000000100000011011110111100011000000101100100010011110' \ '00010110001101111011000000000' expected = bits(s) buff = Buffer(bits(codewords)) assert codewords_int == list(buff.toints()) res = encoder.make_final_message(5, consts.ERROR_LEVEL_Q, buff) assert len(expected) == len(res) assert expected == res.getbits() def test_encode_iso_fig1(): # ISO/IEC 18004:2015(E) - page 7 # 'QR Code Symbol' as 1-M symbol qr = encoder.encode('QR Code Symbol', error='M', mask=None, micro=False, boost_error=False) assert consts.ERROR_LEVEL_M == qr.error assert 1 == qr.version assert 5 == qr.mask, f'Wrong mask, got: {qr.mask}' ref_matrix = read_matrix('iso-fig-1')[0] assert ref_matrix == qr.matrix def test_encode_iso_i2(): # ISO/IEC 18004:2015(E) - page 94 # 01234567 as 1-M symbol # TODO: Without the mask param Segno chooses mask 3 which seems to be correct # Mask 2 is IMO an error in the standard qr = encoder.encode('01234567', error='m', version=1, mask=2, micro=False, boost_error=False) assert consts.ERROR_LEVEL_M == qr.error assert 1 == qr.version assert 2 == qr.mask, f'Wrong mask, got: {qr.mask}' qr = encoder.encode('01234567', error='m', mask=2, micro=False, boost_error=False) assert consts.ERROR_LEVEL_M == qr.error assert 1 == qr.version assert 2 == qr.mask, f'Wrong mask, got: {qr.mask}' ref_matrix = read_matrix('iso-i2')[0] assert ref_matrix == qr.matrix def test_encode_iso_i3(): # ISO/IEC 18004:2015(E) - page 96 # 01234567 as M2-L symbol ref_matrix = read_matrix('iso-i3')[0] qr = encoder.encode('01234567', error='l', version='m2', boost_error=False) assert consts.ERROR_LEVEL_L == qr.error assert consts.VERSION_M2 == qr.version assert 1 == qr.mask, f'Wrong mask, got: {qr.mask}' assert ref_matrix == qr.matrix qr = encoder.encode('01234567', error='l', version=None, micro=True, boost_error=False) assert consts.ERROR_LEVEL_L == qr.error assert consts.VERSION_M2 == qr.version assert 1 == qr.mask, f'Wrong mask, got: {qr.mask}' assert ref_matrix == qr.matrix def test_encode_iso_fig29(): # ISO/IEC 18004:2015(E) - page 60 # ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ # TODO: If mask is None, Segno chooses mask 3, but the figure uses mask 4... qr = encoder.encode('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', error='m', mask=4, boost_error=False) assert 4 == qr.mask assert 4 == qr.version ref_matrix = read_matrix('iso-fig-29')[0] assert ref_matrix == qr.matrix def test_codeword_placement_iso_i2(): # ISO/IEC 18004:2015(E) - page 94 # 01234567 as 1-M symbol s = '00010000 00100000 00001100 01010110 01100001 10000000 11101100 00010001 ' \ '11101100 00010001 11101100 00010001 11101100 00010001 11101100 00010001' codewords = Buffer(bits(s)) version = 1 width, height = 21, 21 buff = encoder.make_final_message(version, consts.ERROR_LEVEL_M, codewords) expected_s = '00010000 00100000 00001100 01010110 01100001 10000000 11101100 ' \ '00010001 11101100 00010001 11101100 00010001 11101100 00010001 ' \ '11101100 00010001 10100101 00100100 11010100 11000001 11101101 ' \ '00110110 11000111 10000111 00101100 01010101' expected = bits(expected_s) assert expected == buff.getbits() matrix = encoder.make_matrix(width, height) encoder.add_finder_patterns(matrix, width, height) encoder.add_codewords(matrix, buff, version=version) ref_matrix = read_matrix('iso-i2_code_placement')[0] assert ref_matrix == matrix def test_codeword_placement_iso_i3(): # ISO/IEC 18004:2015(E) - page 96 # 01234567 as M2-L symbol s = '01000000 00011000 10101100 11000011 00000000' codewords = Buffer(bits(s)) version = consts.VERSION_M2 width, height = 13, 13 buff = encoder.make_final_message(version, consts.ERROR_LEVEL_L, codewords) expected_s = '01000000 00011000 10101100 11000011 00000000 10000110 00001101 ' \ '00100010 10101110 00110000' expected = bits(expected_s) assert expected == buff.getbits() matrix = encoder.make_matrix(width, height) encoder.add_finder_patterns(matrix, width, height) encoder.add_codewords(matrix, buff, version=version) ref_matrix = read_matrix('iso-i3_code_placement')[0] assert ref_matrix == matrix def _make_figure22_matrix(): width, height = 17, 17 # M4 matrix = encoder.make_matrix(width, height) for row in matrix: for i in range(len(row)): if row[i] == 0x2: row[i] = 0x0 encoder.add_finder_patterns(matrix, width, height) return matrix, width, height def test_figure22_mask0(): # ISO/IEC 18004:2015(E) - 7.8.2 Data mask patterns # Figure 22 - Mask 0 matrix, width, height = _make_figure22_matrix() mask, matrix = encoder.find_and_apply_best_mask(matrix, width, height, proposed_mask=0) assert 0 == mask # Format info = dark modules for i in range(9): matrix[8][i] = 0x1 matrix[i][8] = 0x1 ref_matrix, ref_width, ref_height = read_matrix('fig-22-mask-0') assert ref_width, ref_height == (width, height) assert ref_matrix == matrix def test_figure22_mask1(): # ISO/IEC 18004:2015(E) - 7.8.2 Data mask patterns # Figure 22 - Mask 1 matrix, width, height = _make_figure22_matrix() mask, matrix = encoder.find_and_apply_best_mask(matrix, width, height, proposed_mask=1) assert 1 == mask # Format info = dark modules for i in range(9): matrix[8][i] = 0x1 matrix[i][8] = 0x1 ref_matrix, ref_width, ref_height = read_matrix('fig-22-mask-1') assert ref_width, ref_height == (width, height) assert ref_matrix == matrix def test_figure22_mask2(): # ISO/IEC 18004:2015(E) - 7.8.2 Data mask patterns # Figure 22 - Mask 2 matrix, width, height = _make_figure22_matrix() mask, matrix = encoder.find_and_apply_best_mask(matrix, width, height, proposed_mask=2) assert 2 == mask # Format info = dark modules for i in range(9): matrix[8][i] = 0x1 matrix[i][8] = 0x1 ref_matrix, ref_width, ref_height = read_matrix('fig-22-mask-2') assert ref_width, ref_height == (width, height) assert ref_matrix == matrix def test_figure22_mask3(): # ISO/IEC 18004:2015(E) - 7.8.2 Data mask patterns # Figure 22 - Mask 3 matrix, width, height = _make_figure22_matrix() mask, matrix = encoder.find_and_apply_best_mask(matrix, width, height, proposed_mask=3) assert 3 == mask # Format info = dark modules for i in range(9): matrix[8][i] = 0x1 matrix[i][8] = 0x1 ref_matrix, ref_width, ref_height = read_matrix('fig-22-mask-3') assert ref_width, ref_height == (width, height) assert ref_matrix == matrix def test_fig23_best_mask(): # ISO/IEC 18004:2015(E) - 7.8.2 Data mask patterns # Figure 23 matrix, width, height = read_matrix('fig-23-unmasked') mask, matrix = encoder.find_and_apply_best_mask(matrix, width, height) assert 0 == mask ref_matrix, ref_width, ref_height = read_matrix('fig-23-mask-0') assert ref_width, ref_height == (width, height) assert ref_matrix == matrix def test_format_info_figure26(): # 7.9.2 Micro QR Code symbols (page 57) version = consts.VERSION_M1 width, height = 10, 10 mask = 3 matrix = tuple([bytearray([0x0] * 11) for i in range(11)]) encoder.add_timing_pattern(matrix, is_micro=True) encoder.add_finder_patterns(matrix, width, height) encoder.add_format_info(matrix, version=version, error=None, mask_pattern=mask) ref_matrix = read_matrix('fig-26')[0] assert ref_matrix == matrix if __name__ == '__main__': pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_eps.py�����������������������������������������������������������������������0000664�0000000�0000000�00000010104�14764403223�0016202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ EPS related tests. """ import re import io import pytest import segno def test_illegal_color_float(): color = (.1, 1.1, .1) qr = segno.make_qr('test') out = io.StringIO() with pytest.raises(ValueError): qr.save(out, kind='eps', dark=color) def test_illegal_color_float2(): color = (-.1, 1.0, .1) qr = segno.make_qr('test') out = io.StringIO() with pytest.raises(ValueError): qr.save(out, kind='eps', dark=color) def test_illegal_color_int(): color = (255, 255, 256) qr = segno.make_qr('test') out = io.StringIO() with pytest.raises(ValueError): qr.save(out, kind='eps', dark=color) def test_illegal_color_int2(): color = (-1, 1, 1) qr = segno.make_qr('test') out = io.StringIO() with pytest.raises(ValueError): qr.save(out, kind='eps', dark=color) def test_default_color(): qr = segno.make_qr('test') out = io.StringIO() qr.save(out, kind='eps') assert 'setrgbcolor' not in out.getvalue() def test_color(): qr = segno.make_qr('test') out = io.StringIO() qr.save(out, kind='eps', dark='#195805') assert 'setrgbcolor' in out.getvalue() def test_color_omit_black(): qr = segno.make_qr('test') out = io.StringIO() # Black does not need setrgbcolor since it is the default stroke color qr.save(out, kind='eps', dark='#000') assert 'setrgbcolor' not in out.getvalue() def test_color_omit_black2(): qr = segno.make_qr('test') out = io.StringIO() # Black does not need setrgbcolor since it is the default stroke color qr.save(out, kind='eps', dark='Black') assert 'setrgbcolor' not in out.getvalue() def test_color_omit_black3(): qr = segno.make_qr('test') out = io.StringIO() # Black does not need setrgbcolor since it is the default stroke color qr.save(out, kind='eps', dark=(0, 0, 0)) assert 'setrgbcolor' not in out.getvalue() def test_background(): qr = segno.make_qr('test') out = io.StringIO() qr.save(out, kind='eps', light='#EEE') assert 'setrgbcolor' in out.getvalue() assert 'clippath' in out.getvalue() def test_default_scale(): qr = segno.make_qr('test') out = io.StringIO() qr.save(out, kind='eps') assert 'scale' not in out.getvalue() def test_scale(): qr = segno.make_qr('test') out = io.StringIO() qr.save(out, kind='eps', scale=2) assert '2 2 scale' in out.getvalue() def test_scale_float(): qr = segno.make_qr('test') out = io.StringIO() scale = 1.34 qr.save(out, kind='eps', scale=scale) assert f'{scale} {scale} scale' in out.getvalue() def eps_as_matrix(buff, border): """\ Reads the path in the EPS and returns it as list of 0, 1 lists. :param io.StringIO buff: Buffer to read the matrix from. """ eps = buff.getvalue() h, w = re.search(r'^%%BoundingBox: 0 0 ([0-9]+) ([0-9]+)', eps, flags=re.MULTILINE).groups() if h != w: raise ValueError(f'Expected equal height/width, got height="{h}" width="{w}"') size = int(w) - 2 * border path = re.search(r'^newpath[\s+](.+?)(^stroke)', eps, flags=re.DOTALL | re.MULTILINE).group(1).strip() res = [] res_row = None absolute_x = -border for x, y, op in re.findall(r'(-?[0-9]+(?:\.[0-9]+)?)\s+(-?[0-9]+(?:\.[0-9]+)?)\s+([a-z]+)', path): x = int(x) y = float(y) if y != 0.0: # New row if res_row: res_row.extend([0] * (size - len(res_row))) res_row = [] res.append(res_row) if op == 'moveto': absolute_x = 0 if x != border: raise ValueError(f'Unexpected border width. Expected "{border}", got "{x}"') else: absolute_x += x bit = 0 if op == 'm' else 1 length = absolute_x if x < 0 else x res_row.extend([bit] * length) res_row.extend([0] * (size - len(res_row))) return res if __name__ == '__main__': pytest.main([__file__]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_hanzi.py���������������������������������������������������������������������0000664�0000000�0000000�00000006167�14764403223�0016542�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Shi Yan # All rights reserved. # # License: BSD License # """\ Tests against Hanzi encoding. """ import pytest import segno from segno import consts, encoder def test_detect_hanzi(): qr = segno.make('汉字') assert 'byte' == qr.mode assert qr.is_micro assert 'M3-M' == qr.designator def test_default_hanzi_mode(): qr = segno.make('书读百遍其义自现') assert 'byte' == qr.mode assert '2-M' == qr.designator def test_force_hanzi_mode(): qr = segno.make('书读百遍其义自现', mode='hanzi') assert 'hanzi' == qr.mode assert '1-M' == qr.designator def test_default_hanzi_mode2(): qr = segno.make('大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,' '惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。' '羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。') assert 'byte' == qr.mode assert '12-L' == qr.designator def test_force_hanzi_mode2(): qr = segno.make('大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,' '惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,' '雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。', mode='hanzi') assert 'hanzi' == qr.mode assert '9-L' == qr.designator def test_force_hanzi_mode_and_encoding(): qr = segno.make('书读百遍其义自现', mode='hanzi', encoding='gb2312') assert 'hanzi' == qr.mode assert '1-M' == qr.designator def test_default_utf8_encoder(): qr = encoder.encode('书读百遍其义自现') assert 1 == len(qr.segments) segment = qr.segments[0] assert consts.MODE_BYTE == segment.mode assert 24 == segment.char_count def test_force_hanzi_encoder(): qr = encoder.encode('书读百遍其义自现', mode='hanzi') assert 1 == len(qr.segments) segment = qr.segments[0] assert consts.MODE_HANZI == segment.mode assert 8 == segment.char_count def test_detect_hanzi_encoder2(): # detect as utf8 qr = encoder.encode('汉字') assert 1 == len(qr.segments) segment = qr.segments[0] assert consts.MODE_BYTE == segment.mode assert 6 == segment.char_count def test_hanzi_bytes(): qr = encoder.encode('书读百遍其义自现'.encode(consts.HANZI_ENCODING), mode='hanzi') assert 1 == len(qr.segments) segment = qr.segments[0] assert consts.MODE_HANZI == segment.mode assert 8 == segment.char_count def test_not_hanzi(): qr = segno.make_qr('Ä') assert 'byte' == qr.mode assert '1-H' == qr.designator def test_not_hanzi2(): qr = segno.make_qr('Ä'.encode()) assert 'byte' == qr.mode assert '1-H' == qr.designator if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_helpers.py�������������������������������������������������������������������0000664�0000000�0000000�00000036513�14764403223�0017071�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against the helper factory functions. Issue """ import pytest import segno from segno import helpers from datetime import date def test_geo_default(): qr = helpers.make_geo(38.8976763, -77.0365297) assert not qr.is_micro def test_geo_data(): data = helpers.make_geo_data(38.8976763, -77.0365297) assert 'geo:38.8976763,-77.0365297' == data def test_geo_data2(): data = helpers.make_geo_data(38.89, -77.0365297) assert 'geo:38.89,-77.0365297' == data @pytest.mark.parametrize('expected, ssid, password, security, hidden', (('WIFI:S:SSID;;', 'SSID', None, None, False), ('WIFI:T:SECURITY;S:SSID;;', 'SSID', None, 'security', False), ('WIFI:T:SECURITY;S:SSID;P:secret;;', 'SSID', 'secret', 'security', False), ('WIFI:T:WPA;S:SSID;P:secret;;', 'SSID', 'secret', 'wpa', False), ('WIFI:T:nopass;S:SSID;P:secret;;', 'SSID', 'secret', 'nopass', False), ('WIFI:T:nopass;S:SSID;P:secret;H:true;', 'SSID', 'secret', 'nopass', True), ('WIFI:T:nopass;S:ABCDE;P:abcde;H:true;', 'ABCDE', 'abcde', 'nopass', True), ('WIFI:S:\\"foo\\;bar\\\\baz\\";;', '"foo;bar\\baz"', None, None, False), ('WIFI:T:WPA2;S:\\"foo\\;bar\\\\baz\\";P:a\\:password;;', '"foo;bar\\baz"', 'a:password', 'wpa2', False), )) def test_wifi_data(expected, ssid, password, security, hidden): data = helpers.make_wifi_data(ssid=ssid, password=password, security=security, hidden=hidden) assert expected == data def test_wifi(): qr = helpers.make_wifi(ssid='SSID', password=None, security='WEP') assert qr assert not qr.is_micro def test_mecard_data(): mecard = helpers.make_mecard_data(name='Mustermann,Max') assert 'MECARD:N:Mustermann,Max;;' == mecard mecard = helpers.make_mecard_data(name='Mustermann,Max', nickname='Maexchen') assert 'MECARD:N:Mustermann,Max;NICKNAME:Maexchen;;' == mecard mecard = helpers.make_mecard_data(name='Mustermann,Max', phone=['+1', '+2']) assert 'MECARD:N:Mustermann,Max;TEL:+1;TEL:+2;;' == mecard mecard = helpers.make_mecard_data(name='Mustermann,Max', email='me@example.org') assert 'MECARD:N:Mustermann,Max;EMAIL:me@example.org;;' == mecard mecard = helpers.make_mecard_data(name='Mustermann,Max', birthday=date.today()) assert 'MECARD:N:Mustermann,Max;BDAY:{0};;'.format(date.today().strftime('%Y%m%d')) == mecard mecard = helpers.make_mecard_data(name='Mustermann,Max', birthday=19760919) assert 'MECARD:N:Mustermann,Max;BDAY:19760919;;' == mecard mecard = helpers.make_mecard_data(name='Mustermann,Max', country='Germany') assert 'MECARD:N:Mustermann,Max;ADR:,,,,,,Germany;;' == mecard mecard = helpers.make_mecard_data(name='Mustermann,Max', memo='this,is;a\\memo') assert 'MECARD:N:Mustermann,Max;MEMO:this,is\\;a\\\\memo;;' == mecard mecard = helpers.make_mecard_data(name='Mustermann,Max', reading='this,is;a\\sound') assert 'MECARD:N:Mustermann,Max;SOUND:this,is\\;a\\\\sound;;' == mecard def test_mecard(): qr = helpers.make_mecard(name='Mustermann,Max') assert qr def test_vcard_data(): vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann') assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Mustermann;Max\r\n' \ 'FN:Max Mustermann\r\n' \ 'END:VCARD\r\n' == vcard vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', org='ABC, Inc.') assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Mustermann;Max\r\n' \ 'FN:Max Mustermann\r\n' \ 'ORG:ABC\\, Inc.\r\n' \ 'END:VCARD\r\n' == vcard vcard = helpers.make_vcard_data('Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.', 'John Stevenson') assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.\r\n' \ 'FN:John Stevenson\r\n' \ 'END:VCARD\r\n' == vcard vcard = helpers.make_vcard_data('Doe;John', 'John Doe', street='Street', city='City', zipcode='123456') assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Doe;John\r\n' \ 'FN:John Doe\r\n' \ 'ADR:;;Street;City;;123456;\r\n' \ 'END:VCARD\r\n' == vcard vcard = helpers.make_vcard_data('Doe;John', 'John Doe', street='123 Main Street', city='Any Town', region='CA', zipcode='91921-1234', country='Nummerland') assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Doe;John\r\n' \ 'FN:John Doe\r\n' \ 'ADR:;;123 Main Street;Any Town;CA;91921-1234;Nummerland\r\n' \ 'END:VCARD\r\n' == vcard vcard = helpers.make_vcard_data('Doe;John', 'John Doe', title='Python wrangler') assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Doe;John\r\nFN:John Doe\r\n' \ 'TITLE:Python wrangler\r\n' \ 'END:VCARD\r\n' == vcard vcard = helpers.make_vcard_data('Doe;John', 'John Doe', title=['Python wrangler', 'Snake charmer']) assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Doe;John\r\n' \ 'FN:John Doe\r\n' \ 'TITLE:Python wrangler\r\n' \ 'TITLE:Snake charmer\r\n' \ 'END:VCARD\r\n' == vcard photo_uri = 'https://www.example.org/image.jpg' vcard = helpers.make_vcard_data('Doe;John', 'John Doe', photo_uri=photo_uri) assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Doe;John\r\n' \ 'FN:John Doe\r\n' \ f'PHOTO;VALUE=uri:{photo_uri}\r\n' \ 'END:VCARD\r\n' == vcard photo_uris = ('https://www.example.org/image.jpg', 'https://www.example.com/image_another.gif') vcard = helpers.make_vcard_data('Doe;John', 'John Doe', photo_uri=photo_uris) assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Doe;John\r\n' \ 'FN:John Doe\r\n' \ 'PHOTO;VALUE=uri:{0}\r\n' \ 'PHOTO;VALUE=uri:{1}\r\n' \ 'END:VCARD\r\n'.format(*photo_uris) == vcard vcard = helpers.make_vcard_data('Doe;John', 'John Doe', phone='+1', fax='+12', videophone='+123', cellphone='+1234', homephone='+12345', workphone='+123456') assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Doe;John\r\n' \ 'FN:John Doe\r\n' \ 'TEL:+1\r\n' \ 'TEL;TYPE=FAX:+12\r\n' \ 'TEL;TYPE=VIDEO:+123\r\n' \ 'TEL;TYPE=CELL:+1234\r\n' \ 'TEL;TYPE=HOME:+12345\r\n' \ 'TEL;TYPE=WORK:+123456\r\n' \ 'END:VCARD\r\n' == vcard def test_photo_uri(): photo_uris = ('https://www.example.org/image.jpg', 'https://www.example.com/image_another.gif') vcard = helpers.make_vcard_data('Doe;John', 'John Doe', photo_uri=photo_uris) assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Doe;John\r\n' \ 'FN:John Doe\r\n' \ 'PHOTO;VALUE=uri:{0}\r\n' \ 'PHOTO;VALUE=uri:{1}\r\n' \ 'END:VCARD\r\n'.format(*photo_uris) == vcard qr_from_data = segno.make_qr(vcard) assert qr_from_data assert qr_from_data.error == 'L' qr_from_vcard = helpers.make_vcard('Doe;John', 'John Doe', photo_uri=photo_uris) assert qr_from_vcard assert qr_from_vcard.error == 'L' assert qr_from_data == qr_from_vcard def test_vcard_title_escape(): vcard = helpers.make_vcard_data('Doe;John', 'John Doe', title='Director, Research and Development') assert 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Doe;John\r\n' \ 'FN:John Doe\r\n' \ 'TITLE:Director\\, Research and Development\r\n' \ 'END:VCARD\r\n' == vcard def test_vcard_data_valid_bday(): expected_vcard_data = 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Mustermann;Max\r\n' \ 'FN:Max Mustermann\r\n' \ 'BDAY:1976-09-19\r\n' \ 'END:VCARD\r\n' vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', birthday='1976-09-19') assert expected_vcard_data == vcard vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', birthday=date(year=1976, month=9, day=19)) assert expected_vcard_data == vcard def test_vcard_data_invalid_bday(): with pytest.raises(ValueError): helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', birthday='19760919') with pytest.raises(ValueError): helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', birthday='1976-09-19TZ') def test_vcard_data_source_url(): source_url = 'https://example.org/this-is-the-SOURCE-url' expected_vcard_data = 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Mustermann;Max\r\n' \ 'FN:Max Mustermann\r\n' \ f'SOURCE:{source_url}\r\n' \ 'END:VCARD\r\n' vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', source=source_url) assert expected_vcard_data == vcard def test_vcard_data_nickname(): nickname = 'Mäxchen' expected_vcard_data = 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Mustermann;Max\r\n' \ 'FN:Max Mustermann\r\n' \ f'NICKNAME:{nickname}\r\n' \ 'END:VCARD\r\n' vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', nickname=nickname) assert expected_vcard_data == vcard def test_vcard_data_note(): note = 'test cases,; we need more test cases' expected_vcard_data = 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Mustermann;Max\r\n' \ 'FN:Max Mustermann\r\n' \ 'NOTE:test cases\\,\\; we need more test cases\r\n' \ 'END:VCARD\r\n' vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', memo=note) assert expected_vcard_data == vcard def test_vcard_data_rev(): expected_vcard_data = 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Mustermann;Max\r\n' \ 'FN:Max Mustermann\r\n' \ 'REV:1976-09-19\r\n' \ 'END:VCARD\r\n' vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', rev='1976-09-19') assert expected_vcard_data == vcard vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', rev=date(year=1976, month=9, day=19)) assert expected_vcard_data == vcard @pytest.mark.parametrize('rev', ['19760919' '1976-09-19TZ', '1976-09-19T-06', 1.2, 1 ]) def test_vcard_data_invalid_rev(rev): with pytest.raises(ValueError): helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', rev=rev) def test_vcard_data_invalid_geo(): with pytest.raises(ValueError): helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', lat=1.234) with pytest.raises(ValueError): helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', lng=1.234) def test_vcard_data_valid_geo(): expected_vcard_data = 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Mustermann;Max\r\n' \ 'FN:Max Mustermann\r\n' \ 'GEO:46.235197;8.015445\r\n' \ 'END:VCARD\r\n' vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', lat=46.235197, lng=8.015445) assert expected_vcard_data == vcard def test_vcard(): qr = helpers.make_vcard(name='Mustermann;Max', displayname='Max Mustermann') assert qr def test_email_data(): data = helpers.make_make_email_data('me@example.org') assert 'mailto:me@example.org' == data data = helpers.make_make_email_data(('me@example.org', 'you@example.org')) assert 'mailto:me@example.org,you@example.org' == data data = helpers.make_make_email_data('me@example.org', cc='you@example.org') assert 'mailto:me@example.org?cc=you@example.org' == data data = helpers.make_make_email_data('me@example.org', bcc='you@example.org') assert 'mailto:me@example.org?bcc=you@example.org' == data data = helpers.make_make_email_data('me@example.org', cc=('me@example.org', 'you@example.org')) assert 'mailto:me@example.org?cc=me@example.org,you@example.org' == data data = helpers.make_make_email_data('me@example.org', bcc=('me@example.org', 'you@example.org')) assert 'mailto:me@example.org?bcc=me@example.org,you@example.org' == data data = helpers.make_make_email_data('me@example.org', cc=('me@example.org', 'you@example.org'), subject='Test') assert 'mailto:me@example.org?cc=me@example.org,you@example.org&subject=Test' == data data = helpers.make_make_email_data('me@example.org', cc=('me@example.org', 'you@example.org'), subject='Subject', body='Body') assert 'mailto:me@example.org?cc=me@example.org,you@example.org&subject=Subject&body=Body' == data data = helpers.make_make_email_data('me@example.org', subject='A subject', body='Hellöö') assert 'mailto:me@example.org?subject=A%20subject&body=Hell%C3%B6%C3%B6' == data def test_email_data_illegal(): with pytest.raises(ValueError): helpers.make_make_email_data(None) with pytest.raises(ValueError): helpers.make_make_email_data('') with pytest.raises(ValueError): helpers.make_make_email_data([]) def test_email(): qr = helpers.make_email('me@example.org') assert qr if __name__ == '__main__': pytest.main([__file__]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_helpers_epcqr.py�������������������������������������������������������������0000664�0000000�0000000�00000020431�14764403223�0020253�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ EPC QR Codes. Test against issue . """ import decimal import pytest from segno.helpers import make_epc_qr, _make_epc_qr_data as make_epc_qr_data @pytest.mark.parametrize('amount', [12.3, 12.30, decimal.Decimal('12.3'), decimal.Decimal('12.30'), '12.3', '12.30']) def test_text_002(amount): name = "François D'Alsace S.A." iban = 'FR1420041010050500013M02606' text = 'Client:Marie Louise La Lune' kw = dict(name=name, iban=iban, text=text, amount=amount) data = make_epc_qr_data(**kw) # See. EPC069-12 Version 2.1 dtd. 9 February 2012 example 2 assert len(data) == 103 encoding = 'iso-8859-1' d = [x.decode(encoding) for x in data.split(b'\n')] assert 11 == len(d) assert 'BCD' == d[0] assert '002' == d[1] assert '2' == d[2] assert 'SCT' == d[3] assert name == d[5] assert iban == d[6] assert 'EUR12.3' == d[7] assert '' == d[8] assert '' == d[9] assert text == d[10] qr = make_epc_qr(**kw) assert qr assert not qr.is_micro assert qr.version <= 13 assert 'M' == qr.error @pytest.mark.parametrize('expected_amount, amount', [('EUR1000', 1000), ('EUR1000', 1000.0), ('EUR2000', decimal.Decimal('2000'))]) def test_trailing_zeros(expected_amount, amount): name = "François D'Alsace S.A." iban = 'FR1420041010050500013M02606' text = 'Client:Marie Louise La Lune' kw = dict(name=name, iban=iban, text=text, amount=amount) data = make_epc_qr_data(**kw) assert len(data) == 103 # See. EPC069-12 Version 2.1 dtd. 9 February 2012 example 2 encoding = 'iso-8859-1' d = [x.decode(encoding) for x in data.split(b'\n')] assert expected_amount == d[7] @pytest.mark.parametrize('amount', [5.0, 5, '5.00', decimal.Decimal('5.00000')]) def test_remove_dot(amount): kw = _make_valid_kw() kw['amount'] = amount d = make_epc_qr_data(**kw).split(b'\n') assert b'EUR5' == d[7] @pytest.mark.parametrize('amount', [12.3, 12.30, decimal.Decimal('12.3'), decimal.Decimal('12.30'), '12.3', '12.30']) def test_reference_002(amount): name = 'Franz Mustermänn' iban = 'DE71110220330123456789' reference = 'RF18539007547034' purpose = 'GDDS' bic = 'BHBLDEHHXXX' kw = dict(name=name, iban=iban, reference=reference, bic=bic, purpose=purpose, amount=amount, encoding=1) data = make_epc_qr_data(**kw) assert len(data) == 96 # See. EPC069-12 Version 2.1 dtd. 9 February 2012 example 1 encoding = 'utf-8' d = [x.decode(encoding) for x in data.split(b'\n')] assert 10 == len(d) assert 'BCD' == d[0] assert '002' == d[1] assert '1' == d[2] assert 'SCT' == d[3] assert name == d[5] assert iban == d[6] assert 'EUR12.3' == d[7] assert purpose == d[8] assert reference == d[9] qr = make_epc_qr(**kw) assert qr assert not qr.is_micro assert qr.version <= 13 assert 'M' == qr.error def _make_valid_kw(): return dict(name="François D'Alsace S.A.", iban='FR1420041010050500013M02606', text='Client:Marie Louise La Lune', amount=12.3) @pytest.mark.parametrize('amount', [0, 0.004, '0.001', '999999999.999', 9999999990.99]) def test_invalid_amount(amount): kw = _make_valid_kw() kw['amount'] = amount with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'amount' in str(ex.value) with pytest.raises(ValueError) as ex: make_epc_qr(**kw) assert 'amount' in str(ex.value) @pytest.mark.parametrize('bic', ['BHBLDE', # Too short 'BHBLDEHHXXXX', # Too long 'BHBLDEHHXX', # Too short (either 8 or 11) not 8 <= bic <= 11 'BHBLDEH ', # Too short after removing trailing WS ]) def test_invalid_bic(bic): kw = _make_valid_kw() kw['bic'] = bic with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'BIC' in str(ex.value) with pytest.raises(ValueError) as ex: make_epc_qr(**kw) assert 'BIC' in str(ex.value) def test_utf8_required(): kw = _make_valid_kw() kw['name'] = 'Funny 😃 name' d = make_epc_qr_data(**kw).split(b'\n') assert b'1' == d[2] def test_utf8_explicit(): kw = _make_valid_kw() kw['encoding'] = 'utf-8' kw['name'] = 'Funny 😃 name' d = make_epc_qr_data(**kw).split(b'\n') assert b'1' == d[2] def test_utf8_explicit2(): kw = _make_valid_kw() kw['encoding'] = 1 kw['name'] = 'Funny 😃 name' d = make_epc_qr_data(**kw).split(b'\n') assert b'1' == d[2] @pytest.mark.parametrize('encoding', range(1, 9)) def test_valid_encoding(encoding): kw = _make_valid_kw() kw['name'] = 'Simple name' kw['encoding'] = encoding d = make_epc_qr_data(**kw).split(b'\n') assert str(encoding).encode() == d[2] qr = make_epc_qr(**kw) assert qr @pytest.mark.parametrize('encoding', [0, 9, '1', b'8', 1.0, 'shift-jis']) def test_illegal_encoding(encoding): kw = _make_valid_kw() kw['encoding'] = encoding with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'encoding' in str(ex.value) with pytest.raises(ValueError) as ex: make_epc_qr(**kw) assert 'encoding' in str(ex.value) @pytest.mark.parametrize('text,reference', [('', ''), (' ', ' '), ('', None), (None, None), (None, ' '), ]) def test_no_text_no_reference(text, reference): kw = _make_valid_kw() kw['text'] = text kw['reference'] = reference with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'reference' in str(ex.value) with pytest.raises(ValueError) as ex: make_epc_qr(**kw) assert 'reference' in str(ex.value) @pytest.mark.parametrize('iban', ['DE1' + '1' * 34, '', None]) def test_illegal_iban(iban): kw = _make_valid_kw() kw['iban'] = iban with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'IBAN' in str(ex.value) with pytest.raises(ValueError) as ex: make_epc_qr(**kw) assert 'IBAN' in str(ex.value) @pytest.mark.parametrize('purpose', ['DE1', 'x', 'CDCBC']) def test_illegal_purpose(purpose): kw = _make_valid_kw() kw['purpose'] = purpose with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'purpose' in str(ex.value) with pytest.raises(ValueError) as ex: make_epc_qr(**kw) assert 'purpose' in str(ex.value) @pytest.mark.parametrize('name', [None, '', 'a' * 71, # too long ]) def test_illegal_name(name): kw = _make_valid_kw() kw['name'] = name with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'name' in str(ex.value) with pytest.raises(ValueError) as ex: make_epc_qr(**kw) assert 'name' in str(ex.value) def test_text_too_long(): kw = _make_valid_kw() kw['text'] = 'a' * 141 kw['reference'] = None with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'text' in str(ex.value) def test_reference_too_long(): kw = _make_valid_kw() kw['text'] = None kw['reference'] = 'r' * 36 with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'reference' in str(ex.value) if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue124_trailing_geo_dot.py�������������������������������������������������0000664�0000000�0000000�00000000571�14764403223�0022372�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """"\ Test against PR 124 """ import pytest from segno import helpers def test_remove_trailing_zero_and_dot(): data = helpers.make_geo_data(38.0, -77.0) assert 'geo:38,-77' == data if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue18.py�������������������������������������������������������������������0000664�0000000�0000000�00000002143�14764403223�0016720�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #18. """ import segno def test_issue_18(): qr = segno.make_qr('') assert 1 == qr.version assert 'byte' == qr.mode assert 'H' == qr.error def test_issue_18_micro(): qr = segno.make_micro('') assert 'M3' == qr.version assert 'byte' == qr.mode assert 'M' == qr.error def test_issue_18_automatic(): qr = segno.make('') assert 'M3' == qr.version assert 'byte' == qr.mode assert 'M' == qr.error def test_issue_18_zero(): qr = segno.make_qr(0) assert 1 == qr.version assert 'numeric' == qr.mode assert 'H' == qr.error def test_issue_18_zero_micro(): qr = segno.make_micro(0) assert 'M1' == qr.version assert 'numeric' == qr.mode assert qr.error is None def test_issue_18_zero_automatic(): qr = segno.make(0) assert 'M1' == qr.version assert 'numeric' == qr.mode assert qr.error is None if __name__ == '__main__': import pytest pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue23_boosterror.py��������������������������������������������������������0000664�0000000�0000000�00000001635�14764403223�0021201�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #23. """ import segno def test_boost_error_automatic(): qr = segno.make('http://www.example.org/') assert '2-M' == qr.designator def test_boost_error_disabled(): qr = segno.make('http://www.example.org/', error='q', boost_error=False) assert '3-Q' == qr.designator def test_boost_error_automatic2(): qr = segno.make('http://www.example.org/', error='q') assert '3-H' == qr.designator def test_boost_error_disabled2(): qr = segno.make('http://www.example.org/', error='l', boost_error=False) assert '2-L' == qr.designator def test_boost_error_disabled3(): qr = segno.make('http://www.example.org/', error='h') assert '3-H' == qr.designator if __name__ == '__main__': import pytest pytest.main([__file__]) ���������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue3.py��������������������������������������������������������������������0000664�0000000�0000000�00000001713�14764403223�0016634�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #3. """ import io import segno try: from .tutils import matrix_looks_valid # Attempted relative import in non-package except (ValueError, SystemError, ImportError): from tutils import matrix_looks_valid def test_issue_3(): qr = segno.make_micro('test') assert 'M3' == qr.version # This fails since PNG operates with a fixed set of two colors qr.save(io.BytesIO(), kind='png') def test_issue_3_autodetect_micro(): qr = segno.make('test') assert 'M3' == qr.version # This fails since PNG operates with a fixed set of two colors qr.save(io.BytesIO(), kind='png') def test_issue_3_matrix(): qr = segno.make_micro('test') is_ok, msg = matrix_looks_valid(qr.matrix) assert is_ok, msg if __name__ == '__main__': import pytest pytest.main([__file__]) �����������������������������������������������������segno-1.6.6/tests/test_issue32_svg2.py��������������������������������������������������������������0000664�0000000�0000000�00000003014�14764403223�0017653�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #32. SVG version 2.0 shouldn't have a version attribute. """ import io import xml.etree.ElementTree as etree import pytest import segno _SVG_NS = 'http://www.w3.org/2000/svg' def _parse_xml(buff): """\ Parses XML and returns the root element. """ buff.seek(0) return etree.parse(buff).getroot() def _get_svg_el(root, name): return root.find('{%s}%s' % (_SVG_NS, name)) def _get_path(root): return _get_svg_el(root, 'path') def test_version_none(): qr = segno.make('Test') out = io.BytesIO() qr.save(out, kind='svg', dark='#0000ffcc') root = _parse_xml(out) assert root.get('version') is None assert b'stroke-opacity' in out.getvalue() assert b'rgba(' not in out.getvalue() def test_version_1_1(): qr = segno.make('Test') out = io.BytesIO() qr.save(out, svgversion=1.1, kind='svg', dark='#0000ffcc') root = _parse_xml(out) assert '1.1' == root.get('version') assert b'stroke-opacity' in out.getvalue() assert b'rgba(' not in out.getvalue() def test_version_2_0(): qr = segno.make('Test') out = io.BytesIO() qr.save(out, svgversion=2.0, kind='svg', dark='#0000ffcc') root = _parse_xml(out) assert root.get('version') is None assert b'stroke-opacity' not in out.getvalue() assert b'rgba(' in out.getvalue() if __name__ == '__main__': pytest.main([__file__]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue33_microcode.py���������������������������������������������������������0000664�0000000�0000000�00000005427�14764403223�0020751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against issue 33 and 37 """ import pytest import segno from segno import consts from segno import encoder try: from .tutils import read_matrix # Attempted relative import in non-package except (ValueError, SystemError, ImportError): from tutils import read_matrix def test_format_info_figure25(): # 7.9.1 QR Code symbols (page 55) version = 1 mask_pattern = 5 error = consts.ERROR_LEVEL_M # 100000011001110 assert 0x40ce == encoder.calc_format_info(version, error, mask_pattern) def test_format_info_figure26(): # 7.9.2 Micro QR Code symbols (page 57) version = consts.VERSION_M1 mask_pattern = 3 error = None # 100101100011100 assert 0x4b1c == encoder.calc_format_info(version, error, mask_pattern) @pytest.mark.parametrize('data', ['50041', 50041]) @pytest.mark.parametrize('version', [None, 'm1']) def test_m1_50041(data, version): qr = segno.make(data, version=version) assert 'M1' == qr.designator ref_matrix = read_matrix('issue-33-m1-50041')[0] assert ref_matrix == qr.matrix @pytest.mark.parametrize('data', ['1234', 1234]) @pytest.mark.parametrize('version', [None, 'm1']) def test_m1_1234(data, version): qr = segno.make(data, version=version) assert 'M1' == qr.designator ref_matrix = read_matrix('issue-33-m1-1234')[0] assert ref_matrix == qr.matrix @pytest.mark.parametrize('data', ['12345', 12345]) @pytest.mark.parametrize('version', [None, 'm1']) def test_m1_12345(data, version): qr = segno.make(data, version=version) assert 'M1' == qr.designator ref_matrix = read_matrix('issue-33-m1-12345')[0] assert ref_matrix == qr.matrix def test_m3_wikipedia(): qr = segno.make('Wikipedia', version='m3', error='l') assert 'M3-L' == qr.designator ref_matrix = read_matrix('issue-33-m3-l-wikipedia')[0] assert ref_matrix == qr.matrix def test_m3_max_numeric(): qr = segno.make('12345678901234567890123', version='m3', error='l') assert 'M3-L' == qr.designator ref_matrix = read_matrix('issue-33-m3-l-12345678901234567890123')[0] assert ref_matrix == qr.matrix def test_jump_from_m3_to_m4_dont_boost_error(): qr = segno.make('123456789012345678901234', boost_error=False) assert 'M4-L' == qr.designator ref_matrix = read_matrix('issue-33-m3-l-to-m4-l-jump')[0] assert ref_matrix == qr.matrix def test_jump_from_m3_to_m4_boost_error(): qr = segno.make('123456789012345678901234') assert 'M4-M' == qr.designator ref_matrix = read_matrix('issue-33-m3-l-to-m4-m-jump')[0] assert ref_matrix == qr.matrix if __name__ == '__main__': pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue34_errorlevel.py��������������������������������������������������������0000664�0000000�0000000�00000001156�14764403223�0021162�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against issue 34 """ import pytest import segno try: from .tutils import read_matrix # Attempted relative import in non-package except (ValueError, SystemError, ImportError): from tutils import read_matrix def test_m3_wikipedia(): qr = segno.make('Wikipedia', version='m3') assert 'M3-L' == qr.designator ref_matrix = read_matrix('issue-33-m3-l-wikipedia')[0] assert ref_matrix == qr.matrix if __name__ == '__main__': pytest.main([__file__]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue35_maskcheck.py���������������������������������������������������������0000664�0000000�0000000�00000002011�14764403223�0020722�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against issue 35 """ import pytest from segno import consts from segno import encoder @pytest.mark.parametrize('version, mask', [(consts.VERSION_M1, 4), (1, 8), (1, -1), (consts.VERSION_M2, -1)]) def test_normalize_mask_illegal(version, mask): with pytest.raises(ValueError) as ex: encoder.normalize_mask(mask, version < 1) assert 'Invalid data mask' in str(ex.value) @pytest.mark.parametrize('version, mask', [(consts.VERSION_M1, 'A'), (1, 'B')]) def test_normalize_mask_not_int(version, mask): with pytest.raises(ValueError) as ex: encoder.normalize_mask(mask, version < 1) assert 'Invalid data mask' in str(ex.value) if __name__ == '__main__': pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue39_unquoted.py����������������������������������������������������������0000664�0000000�0000000�00000002411�14764403223�0020645�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against issue 39 """ import os import io import tempfile import pytest import segno from segno import cli def test_output(): out = io.BytesIO() segno.make_qr('Good Times', error='M').save(out, kind='png', scale=10, dark='red') f = tempfile.NamedTemporaryFile('w', suffix='.png', delete=False) f.close() cli.main(['-e=M', '--scale=10', '--dark=red', f'--output={f.name}', 'Good Times']) f = open(f.name, 'rb') content = f.read() f.close() os.unlink(f.name) assert out.getvalue() == content def test_output2(): out = io.BytesIO() segno.make_qr('Good Times', error='M').save(out, kind='png', scale=10, dark='red') f = tempfile.NamedTemporaryFile('w', suffix='.png', delete=False) f.close() cli.main(['-e=M', '--scale=10', '--dark=red', f'--output={f.name}', 'Good', 'Times']) f = open(f.name, 'rb') content = f.read() f.close() os.unlink(f.name) assert out.getvalue() == content if __name__ == '__main__': pytest.main([__file__]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue4.py��������������������������������������������������������������������0000664�0000000�0000000�00000001514�14764403223�0016634�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #4. """ from segno import consts, encoder def test_issue_4(): qr = encoder.encode(0) assert consts.VERSION_M1 == qr.version assert qr.error is None def test_issue_4_autodetect_micro(): qr = encoder.encode(1) assert consts.VERSION_M1 == qr.version assert qr.error is None def test_issue_4_explicit_error(): qr = encoder.encode(1, error=None) assert consts.VERSION_M1 == qr.version assert qr.error is None def test_issue_4_explicit_error2(): qr = encoder.encode(1, error='m') assert consts.VERSION_M2 == qr.version assert consts.ERROR_LEVEL_M == qr.error if __name__ == '__main__': import pytest pytest.main([__file__]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue45_cli_returncodes.py���������������������������������������������������0000664�0000000�0000000�00000001146�14764403223�0022166�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against issue #45. """ from segno import cli import pytest def test_issue_45_error(capsys): try: cli.main(['--version=M1', '--seq', '"This is a test"']) except SystemExit as ex: assert 1 == ex.code assert capsys.readouterr() def test_issue_45_no_error(): assert 0 == cli.main(['--version=1', '--seq', '"This is a test, test test test test"']) if __name__ == '__main__': pytest.main([__file__]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue54_png_greyscale.py�����������������������������������������������������0000664�0000000�0000000�00000004471�14764403223�0021630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #54. """ import io import pytest from png import Reader as PNGReader import segno @pytest.mark.parametrize('dark, light, transparent', [('white', None, (0,)), ('white', 'black', None), (None, 'black', (1,))]) def test_issue_54_inverted(dark, light, transparent): qr = segno.make('The Beatles') assert 'M4-M' == qr.designator out = io.BytesIO() scale = 5 qr.save(out, kind='png', scale=scale, dark=dark, light=light) out.seek(0) reader = PNGReader(file=out) w, h, pixels, meta = reader.read() width, height = qr.symbol_size(scale=scale) assert width == w assert height == h assert meta['greyscale'] border_row = tuple([0] * w) expected_row = tuple([0] * 2 * scale + [1] * 7 * scale + [0]) for idx, row in enumerate(pixels): if idx < 10: assert border_row == tuple(row) elif idx == 10: assert expected_row == tuple(row)[:len(expected_row)] break assert transparent == reader.transparent @pytest.mark.parametrize('dark, light, transparent', [('black', None, (1,)), ('black', 'white', None), (None, 'white', (0,))]) def test_issue_54_notinverted(dark, light, transparent): qr = segno.make('The Beatles') assert 'M4-M' == qr.designator out = io.BytesIO() scale = 5 qr.save(out, kind='png', scale=scale, dark=dark, light=light) out.seek(0) reader = PNGReader(file=out) w, h, pixels, meta = reader.read() width, height = qr.symbol_size(scale=scale) assert width == w assert height == h assert meta['greyscale'] border_row = tuple([1] * w) expected_row = tuple([1] * 2 * scale + [0] * 7 * scale + [1]) for idx, row in enumerate(pixels): if idx < 10: assert border_row == tuple(row) elif idx == 10: assert expected_row == tuple(row)[:len(expected_row)] break assert transparent == reader.transparent if __name__ == '__main__': pytest.main([__file__]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue65_colorful_datauris.py�������������������������������������������������0000664�0000000�0000000�00000002576�14764403223�0022535�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #65. """ import io import base64 import pytest import segno from urllib.parse import quote def test_png_colorful(): dark = 'darkred' data_dark = 'darkorange' data_light = 'yellow' qr = segno.make('Penny Lane', error='h') out = io.BytesIO() qr.save(out, 'png', dark=dark, data_dark=data_dark, data_light=data_light) data_uri = qr.png_data_uri(dark=dark, data_dark=data_dark, data_light=data_light) assert data_uri d = base64.b64decode(data_uri[len('data:image/png;base64,'):]) assert out.getvalue() == d def test_svg_colorful(): from segno.writers import _replace_quotes as replace_quotes dark = 'darkred' data_dark = 'darkorange' data_light = 'yellow' qr = segno.make('Penny Lane', error='h') out = io.BytesIO() qr.save(out, 'svg', xmldecl=False, nl=False, dark=dark, data_dark=data_dark, data_light=data_light) data_uri = qr.svg_data_uri(dark=dark, data_dark=data_dark, data_light=data_light) assert data_uri d = data_uri[len('data:image/svg+xml;charset=utf-8,'):] assert quote(replace_quotes(out.getvalue()), safe=b'') == d if __name__ == '__main__': pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue71_colormap.py����������������������������������������������������������0000664�0000000�0000000�00000001057�14764403223�0020616�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against issue 71 """ import pytest from segno import consts, writers def test_issue71(): width, height = 45, 45 # Version 7 cm = writers._make_colormap(width, height, dark='blue', light='white', finder_dark=None, finder_light=None) assert cm[consts.TYPE_FINDER_PATTERN_DARK] is None assert cm[consts.TYPE_FINDER_PATTERN_LIGHT] is None if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue72_epc_encoding_name.py�������������������������������������������������0000664�0000000�0000000�00000003145�14764403223�0022420�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against issue 72 """ import pytest from segno.helpers import _make_epc_qr_data as make_epc_qr_data, make_epc_qr from .test_helpers_epcqr import _make_valid_kw @pytest.mark.parametrize('encoding, number', (('uTf-8', 1), ('utf-8', 1), ('iso-8859-1', 2), ('ISO-8859-2', 3), ('iSo-8859-4', 4), ('iso-8859-5', 5), ('iso-8859-7', 6), ('iso-8859-10', 7), ('iso-8859-15', 8))) def test_valid_encoding(encoding, number): kw = _make_valid_kw() kw['name'] = 'Simple name' kw['encoding'] = encoding d = make_epc_qr_data(**kw).split(b'\n') assert str(number).encode() == d[2] qr = make_epc_qr(**kw) assert qr @pytest.mark.parametrize('encoding', ('utf-16', 'iso-8859-6', 'ascii', 'something')) def test_illegal_encoding(encoding): kw = _make_valid_kw() kw['encoding'] = encoding with pytest.raises(ValueError) as ex: make_epc_qr_data(**kw) assert 'encoding' in str(ex.value) with pytest.raises(ValueError) as ex: make_epc_qr(**kw) assert 'encoding' in str(ex.value) if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue82_svg_inline.py��������������������������������������������������������0000664�0000000�0000000�00000031151�14764403223�0021137�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ SVG embeddable into HTML tests. """ import xml.etree.ElementTree as etree import pytest import segno _CSS_CLASS = 'segno' _PATH_CLASS = 'qrline' def _get_svg_el(root, name): return root.find('%s' % name) def _get_group(root): return _get_svg_el(root, 'g') def _get_first_path(root): g = _get_group(root) return _get_svg_el(root if g is None else g, 'path') def _get_title(root): return _get_svg_el(root, 'title') def _get_desc(root): return _get_svg_el(root, 'desc') def _parse_xml(s): """\ Parses XML and returns the root element. """ return etree.fromstring(s) def test_write_svg(): qr = segno.make_qr('test') svg = qr.svg_inline() assert svg.startswith(' no group assert _get_group(root) is None assert 'viewBox' not in root.attrib assert 'height' in root.attrib assert 'width' in root.attrib css_class = root.attrib.get('class') assert css_class assert _CSS_CLASS == css_class path_el = _get_first_path(root) assert path_el is not None path_class = path_el.get('class') assert _PATH_CLASS == path_class stroke = path_el.get('stroke') assert stroke == '#000' title_el = _get_title(root) assert title_el is None desc_el = _get_desc(root) assert desc_el is None @pytest.mark.parametrize('dark', ['bLack', '#000000', (0, 0, 0)]) def test_write_svg_black(dark): qr = segno.make_qr('test') svg = qr.svg_inline(dark=dark) assert svg.startswith(' no group assert _get_group(root) is None assert 'viewBox' not in root.attrib assert 'height' in root.attrib assert 'width' in root.attrib css_class = root.attrib.get('class') assert css_class assert _CSS_CLASS == css_class path_el = _get_first_path(root) assert path_el is not None path_class = path_el.get('class') assert _PATH_CLASS == path_class stroke = path_el.get('stroke') assert stroke == '#000' title_el = _get_title(root) assert title_el is None desc_el = _get_desc(root) assert desc_el is None def test_write_svg_background_omitted(): qr = segno.make_qr('test') svg = qr.svg_inline() assert svg.startswith(' no group assert _get_group(root) is None # Background should be the first path in the doc path = _get_first_path(root) assert path is not None assert not path.attrib.get('fill') @pytest.mark.parametrize('light', ['wHitE', '#fff', (255, 255, 255), '#ffffff']) def test_write_svg_background_white(light): qr = segno.make_qr('test') svg = qr.svg_inline(light=light) assert svg.startswith(' no group assert _get_group(root) is None # Background should be the first path in the doc path = _get_first_path(root) assert path is not None assert '#fff' == path.attrib.get('fill') assert path.attrib.get('class') is None d = path.attrib.get('d') assert d expected = 'M0 0h{1}v{0}h-{1}z'.format(*qr.symbol_size()) assert expected == d g = _get_group(root) assert g is None def test_scale_background(): qr = segno.make_qr('test') svg = qr.svg_inline(dark='green', light='yellow', scale=10) root = _parse_xml(svg) g = _get_group(root) assert g is not None assert 'scale(10)' == g.attrib.get('transform') def test_write_svg_color_rgb(): qr = segno.make_qr('test') svg = qr.svg_inline(dark=(76, 131, 205)) assert svg.startswith('<title>&</title>' in svg root = _parse_xml(svg) title_el = _get_title(root) assert title_el is not None assert title == title_el.text def test_desc(): qr = segno.make_qr('test') desc = 'Test' svg = qr.svg_inline(desc=desc) root = _parse_xml(svg) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_desc2(): qr = segno.make_qr('test') desc = 'Määhhhh' svg = qr.svg_inline(desc=desc) root = _parse_xml(svg) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_desc3(): qr = segno.make_qr('test') desc = '点' svg = qr.svg_inline(desc=desc) root = _parse_xml(svg) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_desc4(): qr = segno.make_qr('test') encoding = 'ISO-8859-1' desc = 'áà' svg = qr.svg_inline(desc='áà', encoding=encoding) root = _parse_xml(svg) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_desc_escape(): qr = segno.make_qr('test') desc = '&' svg = qr.svg_inline(desc=desc) assert '<desc>&</desc>' in svg root = _parse_xml(svg) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_background(): qr = segno.make_qr('test') color = '#800080' svg = qr.svg_inline(light=color) root = _parse_xml(svg) # Background should be the first path in the doc rect = _get_first_path(root) assert rect is not None assert color == rect.attrib['fill'] def test_module_color(): qr = segno.make_qr('test') color = '#800080' svg = qr.svg_inline(dark=color) root = _parse_xml(svg) path = _get_first_path(root) assert path is not None assert color == path.attrib['stroke'] def test_scale(): qr = segno.make_qr('test') svg = qr.svg_inline(scale=2) root = _parse_xml(svg) path = _get_first_path(root) assert path is not None assert 'scale(2)' in path.attrib['transform'] def test_scale_float(): qr = segno.make_qr('test') scale = 2.13 svg = qr.svg_inline(scale=scale) root = _parse_xml(svg) path = _get_first_path(root) assert path is not None assert f'scale({scale})' in path.attrib['transform'] def test_unit_omitsize(): qr = segno.make_qr('test') with pytest.raises(ValueError): qr.svg_inline(unit='cm', omitsize=True) def test_unit(): qr = segno.make_qr('test') svg = qr.svg_inline(unit='mm') width, height = qr.symbol_size() root = _parse_xml(svg) assert 'width' in root.attrib assert '%dmm' % width == root.attrib['width'] assert 'height' in root.attrib assert '%dmm' % height == root.attrib['height'] assert 'viewBox' in root.attrib assert '0 0 %d %d' % (width, height) == root.attrib['viewBox'] def test_unit_none(): qr = segno.make_qr('test') svg = qr.svg_inline(unit=None) width, height = qr.symbol_size() root = _parse_xml(svg) assert 'width' in root.attrib assert str(width) == root.attrib['width'] assert 'height' in root.attrib assert str(height) == root.attrib['height'] assert 'viewBox' not in root.attrib def test_draw_transparent(): qr = segno.make_qr('test') svg = qr.svg_inline(dark='green', finder_dark='green', dark_module='blue', alignment_light='yellow', quiet_zone='yellow', draw_transparent=False) root = _parse_xml(svg) paths = root.findall('.//path') assert 3 == len(paths) svg = qr.svg_inline(dark='green', finder_dark='green', dark_module='blue', alignment_light='yellow', quiet_zone='yellow', draw_transparent=True) root = _parse_xml(svg) paths = root.findall('.//path') assert 4 == len(paths) assert 1 == len([p for p in paths if p.attrib.get('stroke') is None]) if __name__ == '__main__': pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue84_cli_encoding.py������������������������������������������������������0000664�0000000�0000000�00000003415�14764403223�0021423�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against issue #84. """ import os import tempfile from segno import cli import pytest def test_issue_84_default_encoding(): with open(os.path.join(os.path.dirname(__file__), 'issue-84', 'issue-84-iso-8859-1.txt')) as f: expected = f.read() f = tempfile.NamedTemporaryFile('w', suffix='.txt', delete=False) f.close() try: cli.main(['-o', f.name, 'Müller']) with open(f.name) as f: result = f.read() assert expected == result # Explicit but default encoding cli.main(['-o', f.name, '--encoding', 'iso-8859-1', 'Müller']) with open(f.name) as f: result = f.read() assert expected == result # Explicit but default encoding cli.main(['-o', f.name, '--encoding', 'latin1', 'Müller']) with open(f.name) as f: result = f.read() assert expected == result finally: os.unlink(f.name) def test_issue_84_utf8(): with open(os.path.join(os.path.dirname(__file__), 'issue-84', 'issue-84-utf-8.txt')) as f: expected = f.read() f = tempfile.NamedTemporaryFile('w', suffix='.txt', delete=False) f.close() try: cli.main(['-o', f.name, '--encoding', 'utf-8', 'Müller']) with open(f.name) as f: result = f.read() assert expected == result cli.main(['-o', f.name, '--encoding', 'UTf-8', 'Müller']) with open(f.name) as f: result = f.read() assert expected == result finally: os.unlink(f.name) if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue95_wifi.py��������������������������������������������������������������0000664�0000000�0000000�00000015110�14764403223�0017741�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #95. See This module borrows a lot of code from # noqa: E501 copyrighted by ZXing authors: Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ import io import pytest import segno from segno import helpers _qr_decoder_available = False try: from pyzbar.pyzbar import decode as zbardecode _qr_decoder_available = True except (ImportError, FileNotFoundError): # The latter may occur under Windows pass def qr_to_bytes(qrcode, scale): if qrcode.is_micro: raise Exception('zbar cannot decode Micro QR codes') buff = io.BytesIO() for row in qrcode.matrix_iter(scale=scale): buff.write(bytearray(0x0 if b else 0xff for b in row)) return buff.getvalue() def decode(data): scale = 3 qrcode = segno.make(data, micro=False) width, height = qrcode.symbol_size(scale=scale) qr_bytes = qr_to_bytes(qrcode, scale) decoded = zbardecode((qr_bytes, width, height)) assert 1 == len(decoded) assert 'QRCODE' == decoded[0].type return decoded[0].data.decode('utf-8') def test_issue_95(): expected = 'WIFI:S:\\"foo\\;bar\\\\baz\\";;' data = helpers.make_wifi_data('"foo;bar\\baz"') assert data == expected if _qr_decoder_available: assert decode(data) == expected # See # noqa: E501 # See # noqa: E501 @pytest.mark.parametrize('expected, ssid, password', (('WIFI:T:WEP;S:TenChars;P:0123456789;;', 'TenChars', '0123456789'), ('WIFI:T:WEP;S:TenChars;P:abcde56789;;', 'TenChars', 'abcde56789'), ('WIFI:T:WEP;S:TenChars;P:hellothere;;', 'TenChars', 'hellothere'), ('WIFI:T:WEP;S:Ten\\;\\;Chars;P:0123456789;;', 'Ten;;Chars', '0123456789'), ('WIFI:T:WEP;S:Ten\\:\\:Chars;P:0123456789;;', 'Ten::Chars', '0123456789'), ('WIFI:T:WEP;S:TenChars;P:hellothere;;', 'TenChars', 'hellothere'), ('WIFI:T:WEP;S:TenChars;P:hellothere;;', 'TenChars', 'hellothere'), ('WIFI:T:WEP;S:Ten\\;\\;Chars;P:0123456789;;', 'Ten;;Chars', '0123456789'), ('WIFI:T:WEP;S:Ten\\:\\:Chars;P:0123456789;;', 'Ten::Chars', '0123456789'), # Escaped semicolons ('WIFI:T:WEP;S:TenChars;P:hello\\;there;;', 'TenChars', 'hello;there'), # Escaped colons ('WIFI:T:WEP;S:TenChars;P:hello\\:there;;', 'TenChars', 'hello:there') ) ) def test_wep(expected, ssid, password): data = helpers.make_wifi_data(ssid=ssid, password=password, security='WEP') assert data == expected if _qr_decoder_available: assert decode(data) == expected # See # noqa: E501 @pytest.mark.parametrize('expected, ssid, password', (('WIFI:T:WPA;S:TenChars;P:wow;;', 'TenChars', 'wow'), ('WIFI:T:WPA;S:TenChars;P:space is silent;;', 'TenChars', 'space is silent'), ) ) def test_wpa(expected, ssid, password): data = helpers.make_wifi_data(ssid=ssid, password=password, security='WPA') assert data == expected if _qr_decoder_available: assert decode(data) == expected # See # noqa: E501 @pytest.mark.parametrize('expected, ssid, password, security', (('WIFI:T:WPA;S:test;P:my_password\\\\;;', 'test', 'my_password\\', 'WPA'), ('WIFI:T:WPA;S:My_WiFi_SSID;P:abc123/;;', 'My_WiFi_SSID', 'abc123/', 'WPA'), ('WIFI:T:WPA;S:\\"foo\\;bar\\\\baz\\";;', '"foo;bar\\baz"', None, 'WPA'))) def test_escape(expected, ssid, password, security): data = helpers.make_wifi_data(ssid=ssid, password=password, security=security) assert data == expected if _qr_decoder_available: assert decode(data) == expected if __name__ == '__main__': import pytest pytest.main([__file__]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue_105_epc_slash.py�������������������������������������������������������0000664�0000000�0000000�00000002400�14764403223�0021151�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2022 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #105. Requires pyzbar and additional libs (libzbar0). """ import io import pytest from segno.helpers import make_epc_qr try: from pyzbar.pyzbar import decode as zbardecode except (ImportError, FileNotFoundError): # The latter may occur under Windows pytestmark = pytest.mark.skip def decode(qrcode): scale = 3 width, height = qrcode.symbol_size(scale=scale) out = io.BytesIO() for row in qrcode.matrix_iter(scale=scale): out.write(bytearray(0x0 if b else 0xff for b in row)) decoded = zbardecode((out.getvalue(), width, height)) assert 1 == len(decoded) assert 'QRCODE' == decoded[0].type return decoded[0].data.decode('utf-8') @pytest.mark.parametrize('text', ['/', 'Heiz-/Nebenkosten']) def test_epc_slash(text): name = "This is a Test" iban = 'FR1420041010050500013M02606' amount = 111.7 kw = dict(name=name, iban=iban, text=text, amount=amount) qr_code = make_epc_qr(**kw) assert qr_code decoded = decode(qr_code) assert text in decoded if __name__ == '__main__': pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue_109_bytes.py�����������������������������������������������������������0000664�0000000�0000000�00000002575�14764403223�0020357�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2022 -2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue #109. Requires pyzbar and additional libs (libzbar0). """ import platform import io import pytest import segno try: from pyzbar.pyzbar import decode as zbardecode except (ImportError, FileNotFoundError): # The latter may occur under Windows pytestmark = pytest.mark.skip _libc, _ = platform.libc_ver() if _libc != 'glibc': # Does not work with zbar/musl pytestmark = pytest.mark.skip def decode(qrcode): scale = 3 width, height = qrcode.symbol_size(scale=scale) out = io.BytesIO() for row in qrcode.matrix_iter(scale=scale): out.write(bytearray(0x0 if b else 0xff for b in row)) decoded = zbardecode((out.getvalue(), width, height)) assert 1 == len(decoded) assert 'QRCODE' == decoded[0].type return decoded[0].data.decode('utf-8').encode('cp932') def test_issue_109_bytes(): data = b'\xb8\xd6\x90\xaf' qr_code = segno.make(data, micro=False, mode='byte') assert qr_code decoded = decode(qr_code) assert data == decoded def test_issue_109_bytes_auto(): data = b'\xb8\xd6\x90\xaf' qr_code = segno.make(data, micro=False) assert qr_code decoded = decode(qr_code) assert data == decoded if __name__ == '__main__': pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_issue_125.py�����������������������������������������������������������������0000664�0000000�0000000�00000002040�14764403223�0017132�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Issue Don't include blank vcard/mecard fields. """ import pytest from segno import helpers def test_mecard_data(): mecard = helpers.make_mecard_data(name='Mustermann,Max', phone=[]) assert 'MECARD:N:Mustermann,Max;;' == mecard mecard = helpers.make_mecard_data(name='Mustermann,Max', email="") assert 'MECARD:N:Mustermann,Max;;' == mecard def test_vcard_data(): res = 'BEGIN:VCARD\r\n' \ 'VERSION:3.0\r\n' \ 'N:Mustermann;Max\r\n' \ 'FN:Max Mustermann\r\n' \ 'END:VCARD\r\n' vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', phone="") assert res == vcard vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', email="") assert res == vcard vcard = helpers.make_vcard_data('Mustermann;Max', 'Max Mustermann', fax="") assert res == vcard if __name__ == '__main__': pytest.main([__file__]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_kanji.py���������������������������������������������������������������������0000664�0000000�0000000�00000003113�14764403223�0016511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against Kanji encoding. """ import pytest import segno from segno import consts, encoder def test_detect_kanji(): qr = segno.make('続きを読む') assert 'kanji' == qr.mode assert qr.is_micro assert 'M3-L' == qr.designator def test_detect_kanji_encoder(): qr = encoder.encode('続きを読む') assert 1 == len(qr.segments) segment = qr.segments[0] assert consts.MODE_KANJI == segment.mode assert 5 == segment.char_count def test_detect_kanji_encoder2(): qr = encoder.encode('漢字') assert 1 == len(qr.segments) segment = qr.segments[0] assert consts.MODE_KANJI == segment.mode assert 2 == segment.char_count def test_kanji_bytes(): qr = encoder.encode('続きを読む'.encode(consts.KANJI_ENCODING)) assert 1 == len(qr.segments) segment = qr.segments[0] assert consts.MODE_KANJI == segment.mode assert 5 == segment.char_count def test_encode_kanji_byte(): qr = encoder.encode('漢字'.encode(consts.KANJI_ENCODING)) assert 1 == len(qr.segments) segment = qr.segments[0] assert consts.MODE_KANJI == segment.mode assert 2 == segment.char_count def test_encode_kanji_byte2(): qr = encoder.encode('漢字'.encode(consts.KANJI_ENCODING), encoding=consts.KANJI_ENCODING) assert 1 == len(qr.segments) segment = qr.segments[0] assert consts.MODE_KANJI == segment.mode assert 2 == segment.char_count if __name__ == '__main__': pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_make.py����������������������������������������������������������������������0000664�0000000�0000000�00000007144�14764403223�0016342�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against the encoder module. """ import pytest import segno from segno import consts _DATA_AUTODETECT = ( # Input, expected version, expected mode ('123456', 'numeric'), (123456, 'numeric'), (+123456, 'numeric'), ('+123456', 'alphanumeric'), (-1234, 'alphanumeric'), ('-1234', 'alphanumeric'), ('123A', 'alphanumeric'), ('123a', 'byte'), (consts.ALPHANUMERIC_CHARS, 'alphanumeric'), ('HELLO WORLD', 'alphanumeric'), ('HELLO\nWORLD', 'byte'), ('MÄRCHENBUCH', 'byte'), ('ABCDEFGHIJ1234567890\n', 'byte'), ('®', 'byte'), ('http://www.example.org/', 'byte'), ('http://www.example.org/path/index.html', 'byte'), ('点', 'kanji'), ('茗', 'kanji'), ('漢字', 'kanji'), ('外来語', 'kanji'), ('外来語'.encode(), 'byte'), ) @pytest.mark.parametrize('data, expected_mode', _DATA_AUTODETECT) def test_valid_mode_autodetection(data, expected_mode): qr = segno.make_qr(data) assert expected_mode == qr.mode @pytest.mark.parametrize('data, expected_mode', _DATA_AUTODETECT) def test_valid_mode_autodetection_auto(data, expected_mode): qr = segno.make(data) assert expected_mode == qr.mode def test_default_encoding(): qr = segno.make('Märchenbücher', error='m', micro=False) # 1 since the data fits into version 1 if ISO/IEC 8859-1 (the default # encoding) is used assert 1 == qr.version assert 'byte' == qr.mode def test_encoding_latin1(): qr = segno.make('Märchenbücher', error='m', encoding='latin1', micro=False) assert 1 == qr.version assert 'byte' == qr.mode def test_encoding_utf8(): qr = segno.make('Märchenbücher', error='m', encoding='utf-8', micro=False) assert 2 == qr.version assert 'byte' == qr.mode def test_kanji_enforce_byte(): data = '点' qr = segno.make_qr(data) assert 'kanji' == qr.mode qr = segno.make_qr(data, encoding='utf-8') assert 'byte' == qr.mode def test_kanji_enforce_byte2(): data = '点' qr = segno.make_qr(data.encode('utf-8')) assert 'byte' == qr.mode def test_kanji_bytes(): data = '外来語' qr = segno.make_qr(data.encode('shift_jis')) assert 'kanji' == qr.mode def test_kanji_mode_byte(): data = '外来語' qr = segno.make_qr(data, mode='byte') assert 'byte' == qr.mode def test_kanji_mode_byte2(): data = '漢字'.encode('shift_jis') qr = segno.make_qr(data, mode='byte') assert 'byte' == qr.mode def test_create_micro(): qr = segno.make_micro('1') assert qr.is_micro assert 'M1' == qr.version def test_make_micro_overflow(): data = 'A' * 21 # Max. 21 alphanumeric chars (M4-L) qr = segno.make(data, micro=True) assert 'M4-L' == qr.designator data += 'A' with pytest.raises(segno.DataOverflowError) as ex: segno.make(data, micro=True) assert 'too large' in str(ex.value) def test_enforce_qrcode(): content = 'HELLO WORLD' qr = segno.make(content) assert qr.is_micro assert 'M3' == qr.version qr = segno.make_qr(content) assert not qr.is_micro assert 1 == qr.version qr = segno.make(content, micro=False) assert not qr.is_micro assert 1 == qr.version def test_m1_has_no_error_level(): qr = segno.make('1') assert qr.is_micro assert 'M1' == qr.version assert qr.error is None def test_micro_invalid_error(): with pytest.raises(ValueError) as ex: segno.make_micro(1, error='h') assert 'not available' in str(ex.value) if __name__ == '__main__': pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_output.py��������������������������������������������������������������������0000664�0000000�0000000�00000006402�14764403223�0016761�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Different output tests. """ import io import pytest import segno try: from .test_eps import eps_as_matrix from .test_png import png_as_matrix from .test_svg import svg_as_matrix from .test_txt import txt_as_matrix from .test_pdf import pdf_as_matrix from .test_terminal import terminal_as_matrix from .test_pbm import pbm_p1_as_matrix from .test_pam import pam_bw_as_matrix from .test_ppm import ppm_bw_as_matrix from .test_tex import tex_as_matrix from .test_xpm import xpm_as_matrix # Attempted relative import in non-package except (ValueError, SystemError, ImportError): from test_eps import eps_as_matrix from test_png import png_as_matrix from test_svg import svg_as_matrix from test_txt import txt_as_matrix from test_pdf import pdf_as_matrix from test_terminal import terminal_as_matrix from test_pbm import pbm_p1_as_matrix from test_pam import pam_bw_as_matrix from test_ppm import ppm_bw_as_matrix from test_tex import tex_as_matrix from test_xpm import xpm_as_matrix _DATA = ( # Input string, error level, border ('Märchenbuch', 'M', 4), (123, 'H', 0), ('http:/www.example.org/', 'L', 3), ('Hello\nWorld', 'Q', 2), ('HELLO WORLD', 'H', 2), ('外来語', 'L', 0), ) def _make_test_data_input(): for kind, buffer_factory, to_matrix_func, kw in ( ('eps', io.StringIO, eps_as_matrix, {}), ('png', io.BytesIO, png_as_matrix, {}), ('svg', io.BytesIO, svg_as_matrix, {}), ('txt', io.StringIO, txt_as_matrix, {}), ('pdf', io.BytesIO, pdf_as_matrix, {}), ('ans', io.StringIO, terminal_as_matrix, {}), ('tex', io.StringIO, tex_as_matrix, {}), ('xpm', io.StringIO, xpm_as_matrix, {}), ('pam', io.BytesIO, pam_bw_as_matrix, {}), ('pbm', io.BytesIO, pbm_p1_as_matrix, dict(plain=True)), ('ppm', io.BytesIO, ppm_bw_as_matrix, {}), ): for data, error, border in _DATA: yield kind, buffer_factory, to_matrix_func, data, error, border, kw @pytest.mark.parametrize('kind, buffer_factory, to_matrix_func, data, error, ' 'border, kw', _make_test_data_input()) def test_data(kind, buffer_factory, to_matrix_func, data, error, border, kw): # Creates a QR Code, serializes it and checks if the serialization # corresponds to the initial QR Code matrix. """\ :param str kind: "kind" parameter to serialize the QR code :param buffer_factory: Callable to construct the output buffer. :param to_matrix_func: Function to convert the buffer back to a matrix. :param data: The input to construct the QR code. :param error: ECC level :param int border: Border size. """ qr = segno.make_qr(data, error=error) out = buffer_factory() qr.save(out, kind=kind, border=border, **kw) matrix = to_matrix_func(out, border) assert len(qr.matrix) == len(matrix) for i, row in enumerate(qr.matrix): exptected_row = bytearray(matrix[i]) assert len(row) == len(exptected_row) assert exptected_row == row, f'Error in row {i}' if __name__ == '__main__': pytest.main([__file__]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_pam.py�����������������������������������������������������������������������0000664�0000000�0000000�00000004254�14764403223�0016201�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ PAM related tests. """ import re import io import pytest import segno def test_invalid_color(): qr = segno.make_qr('test') out = io.BytesIO() with pytest.raises(ValueError): qr.save(out, kind='pam', dark=None) def test_bw(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pam') assert b'BLACKANDWHITE' in out.getvalue() def test_grayscale(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pam', light=None) assert b'GRAYSCALE_ALPHA' in out.getvalue() def test_rgb(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pam', dark='red') assert b'RGB' in out.getvalue() assert b'RGB_ALPHA' not in out.getvalue() def test_rgba(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pam', dark='red', light=None) assert b'RGB' in out.getvalue() assert b'RGB_ALPHA' in out.getvalue() _size = re.compile(br'^WIDTH\s+([0-9]+)$').match def _image_data(buff): """\ Returns the image data and the size of the matrix. """ seen_size = False size = 0 code = buff.getvalue().splitlines() code_iter = iter(code) for line in code_iter: if line.startswith(b'ENDHDR'): break if seen_size: continue m = _size(line) if m: size = int(m.group(1)) seen_size = True return next(code_iter), size def pam_bw_as_matrix(buff, border): """\ Returns the QR code as list of [0, 1] lists. :param io.BytesIO buff: Buffer to read the matrix from. :param int border: The QR code border """ res = [] data, size = _image_data(buff) for i, offset in enumerate(range(0, len(data), size)): if i < border: continue if i >= size - border: break row_data = bytearray(data[offset + border:offset + size - border]) # Invert bytes since PAM uses 0x0 = black, 0x1 = white res.append([b ^ 0x1 for b in row_data]) return res if __name__ == '__main__': pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_pbm.py�����������������������������������������������������������������������0000664�0000000�0000000�00000003316�14764403223�0016200�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ PBM related tests. """ import re import io from itertools import islice import pytest import segno def test_p4(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pbm') assert out.getvalue().startswith(b'P4') def test_not_plain(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pbm', plain=False) assert out.getvalue().startswith(b'P4') def test_p1(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pbm', plain=True) assert out.getvalue().startswith(b'P1') _is_size = re.compile(br'^([0-9]+)\s+[0-9]+$').match def _move_to_raster(buff, border): """\ Returns an iterator and the si """ code = buff.getvalue().splitlines() len_without_border = 0 code_iter = iter(code) for line in code_iter: if line.startswith(b'P') or line.startswith(b'#'): continue m = _is_size(line) if m: len_without_border = int(m.group(1)) - border break return code_iter, len_without_border def pbm_p1_as_matrix(buff, border): """\ Returns the text QR code as list of [0, 1] lists. :param io.BytesIO buff: Buffer to read the matrix from. :param int border: The QR code border """ res = [] code_iter, len_without_border = _move_to_raster(buff, border) for line in islice(code_iter, border, len_without_border): row = [int(i) for i in islice(line.decode('ascii'), border, len_without_border)] res.append(row) return res if __name__ == '__main__': pytest.main([__file__]) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_pdf.py�����������������������������������������������������������������������0000664�0000000�0000000�00000006510�14764403223�0016172�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ PDF related tests. """ import re import io import zlib import pytest import segno def test_default_scale(): qr = segno.make_qr('test') out = io.BytesIO() scale = 1 scale_cmd = f'{scale} 0 0 {scale} 0 0 cm' qr.save(out, kind='pdf', compresslevel=0) assert scale_cmd not in _find_graphic(out) def test_scale(): qr = segno.make_qr('test') out = io.BytesIO() scale = 2 scale_cmd = f'{scale} 0 0 {scale} 0 0 cm' qr.save(out, kind='pdf', scale=scale, compresslevel=0) assert scale_cmd in _find_graphic(out) def test_scale_float(): qr = segno.make_qr('test') out = io.BytesIO() scale = 1.34 scale_cmd = f'{scale} 0 0 {scale} 0 0 cm' qr.save(out, kind='pdf', scale=scale, compresslevel=0) assert scale_cmd in _find_graphic(out) def test_background_none(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pdf') graphic = _find_graphic(out) assert 'rg' not in graphic assert 're' not in graphic def test_background_set(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pdf', light='yellow') graphic = _find_graphic(out) assert 'rg' in graphic assert 're' in graphic def test_stokecolor_default(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pdf') graphic = _find_graphic(out) assert 'RG' not in graphic def test_stokecolor_black(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pdf', dark='black') graphic = _find_graphic(out) assert 'RG' not in graphic def test_stokecolor_black2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pdf', dark='#000') graphic = _find_graphic(out) assert 'RG' not in graphic def test_stokecolor_set(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='pdf', dark='#EEE') graphic = _find_graphic(out) assert 'RG' in graphic def test_illegal_color_float(): color = (.1, 1.1, .1) qr = segno.make_qr('test') out = io.BytesIO() with pytest.raises(ValueError): qr.save(out, kind='pdf', dark=color) def _find_graphic(out): val = out.getvalue() start = b'stream\r\n' compressed_graphic = val[val.find(start) + len(start):val.find(b'\r\nendstream')] return zlib.decompress(compressed_graphic).decode('ascii') def pdf_as_matrix(buff, border): """\ Reads the path in the PDF and returns it as list of 0, 1 lists. :param io.BytesIO buff: Buffer to read the matrix from. :param int border: The QR code border """ pdf = buff.getvalue() h, w = re.search(br'/MediaBox \[0 0 ([0-9]+) ([0-9]+)]', pdf, flags=re.MULTILINE).groups() if h != w: raise ValueError(f'Expected equal height/width, got height="{h}" width="{w}"') size = int(w) - 2 * border graphic = _find_graphic(buff) res = [[0] * size for i in range(size)] for x1, y1, x2, y2 in re.findall(r'\s*(-?\d+)\s+(-?\d+)\s+m\s+' r'(-?\d+)\s+(-?\d+)\s+l', graphic): x1, y1, x2, y2 = (int(i) for i in (x1, y1, x2, y2)) y = abs(y1) res[y][x1:x2] = [1] * (x2 - x1) return res if __name__ == '__main__': pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_plugin.py��������������������������������������������������������������������0000664�0000000�0000000�00000000655�14764403223�0016723�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests plugin loading. """ import pytest import segno def test_noplugin(): qr = segno.make('The Beatles') with pytest.raises(AttributeError): qr.to_unknown_plugin() def test_plugin(): qr = segno.make('The Beatles') assert qr.to_pil() is not None if __name__ == '__main__': pytest.main([__file__]) �����������������������������������������������������������������������������������segno-1.6.6/tests/test_png.py�����������������������������������������������������������������������0000664�0000000�0000000�00000014641�14764403223�0016211�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ PNG related tests. """ import io import os import re import pytest import segno from png import Reader as PNGReader def test_hexcolor_too_short(): qr = segno.make_qr('test') with pytest.raises(ValueError): qr.save(io.BytesIO(), kind='png', dark='#FFFFF') def test_hexcolor_too_short_background(): qr = segno.make_qr('test') with pytest.raises(ValueError): qr.save(io.BytesIO(), kind='png', light='#FFFFF') def test_hexcolor_too_long(): qr = segno.make_qr('test') with pytest.raises(ValueError): qr.save(io.BytesIO(), kind='png', dark='#0000000') def test_hexcolor_too_long_background(): qr = segno.make_qr('test') with pytest.raises(ValueError): qr.save(io.BytesIO(), kind='png', light='#0000000') def test_dark_eq_light(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='#000', light='#000') assert out.getvalue() _has_palette = re.compile(br'PLTE').search _has_transparency = re.compile(br'tRNS').search def test_greyscale(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='#000', light='#fff') assert not _has_palette(out.getvalue()) assert not _has_transparency(out.getvalue()) def test_greyscale2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='white', light='black') assert not _has_palette(out.getvalue()) assert not _has_transparency(out.getvalue()) def test_greyscale_trans(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='#000', light=None) assert not _has_palette(out.getvalue()) assert _has_transparency(out.getvalue()) def test_greyscale_trans2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark=None, light='white') assert not _has_palette(out.getvalue()) assert _has_transparency(out.getvalue()) def test_color(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='blue', light='white') assert _has_palette(out.getvalue()) assert not _has_transparency(out.getvalue()) def test_color_trans(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='blue', light=None) assert _has_palette(out.getvalue()) assert _has_transparency(out.getvalue()) def test_color_trans2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark=None, light='green') assert _has_palette(out.getvalue()) assert _has_transparency(out.getvalue()) def test_color_rgba(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='#0000ffcc', light='white') assert _has_palette(out.getvalue()) assert _has_transparency(out.getvalue()) def test_color_rgba2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='#000', light='#0000ffcc') assert _has_palette(out.getvalue()) assert _has_transparency(out.getvalue()) def test_color_rgba_and_trans(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark='#0000ffcc', light=None) assert _has_palette(out.getvalue()) assert _has_transparency(out.getvalue()) def test_color_rgba_and_trans2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dark=None, light='#0000ffcc') assert _has_palette(out.getvalue()) assert _has_transparency(out.getvalue()) def test_scale(): qr = segno.make_qr('test') out = io.BytesIO() scale = 12 width, height = qr.symbol_size(scale=scale) qr.save(out, kind='png', scale=12) out.seek(0) png_width, png_height, matrix = _get_png_info(file=out) assert (width, height) == (png_width, png_height) def test_nodpi(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png') out.seek(0) assert b'pHYs' not in out.getvalue() def test_nodpi_zero(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dpi=0) out.seek(0) assert b'pHYs' not in out.getvalue() def test_dpi_negative(): qr = segno.make('test') out = io.BytesIO() with pytest.raises(ValueError): qr.save(out, kind='png', dpi=-3) def test_dpi(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png', dpi=300) out.seek(0) assert b'pHYs' in out.getvalue() # pHYs 11811 (11811 meters = 300 dpi / 0.0254) assert b'\x70\x48\x59\x73\x00\x00\x2E\x23\x00\x00\x2E\x23\x01\x78\xA5\x3F\x76' in out.getvalue() def png_as_matrix(buff, border): """\ Reads the PNG from the provided buffer and returns the code matrix (list of lists containing 0 .. 1 values). """ buff.seek(0) w, h, pixels = _get_png_info(file=buff) # PNG: white = 1, black = 0. QR code: white = 0, black = 1 from_idx, to_idx = border, -border if border == 0: from_idx = 0 to_idx = len(pixels) res = [] for row in pixels[from_idx:to_idx]: res.append([bit ^ 0x1 for bit in row[from_idx:to_idx]]) return res def _make_pixel_array(pixels, is_greyscale): """\ Returns a list of lists. Each list contains 0 and/or 1. 0 == black, 1 == white. :param bool is_greyscale: Indiciates if this function must convert RGB colors into black/white (supported values: (0, 0, 0) = black and (255, 255, 255) = white) """ def bw_color(r, g, b): rgb = r, g, b if rgb == (0, 0, 0): return 0 elif rgb == (255, 255, 255): return 1 else: raise ValueError(f'Unexpected RGB tuple: {rgb})') res = [] if is_greyscale: res = [list(row[:]) for row in pixels] else: for row in pixels: it = [iter(row)] * 3 res.append([bw_color(r, g, b) for r, g, b in zip(*it)]) return res def _get_reference_filename(filename): """\ Returns an absolute path to the "reference" filename. """ return os.path.join(os.path.dirname(__file__), f'ref/{filename}') def _get_png_info(**kw): """\ Returns the width, height and the pixels of the provided PNG file. """ reader = PNGReader(**kw) w, h, pixels, meta = reader.asDirect() return w, h, _make_pixel_array(pixels, meta['greyscale']) if __name__ == '__main__': pytest.main([__file__]) �����������������������������������������������������������������������������������������������segno-1.6.6/tests/test_png_colorful.py��������������������������������������������������������������0000664�0000000�0000000�00000004707�14764403223�0020120�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ PNG related tests. """ import io import pytest import segno from segno import writers as colors from png import Reader as PNGReader def test_greyscale(): qr = segno.make_qr('test') buff = io.BytesIO() qr.save(buff, kind='png', quiet_zone='white') buff.seek(0) reader = PNGReader(file=buff) reader.preamble() assert reader.greyscale def test_not_greyscale(): qr = segno.make_qr('test') buff = io.BytesIO() qr.save(buff, kind='png', quiet_zone=None) # Three "colors": white, black, transparent buff.seek(0) reader = PNGReader(file=buff) reader.preamble() assert not reader.greyscale palette = reader.palette() assert 3 == len(palette) assert 0 == palette[0][3] # Transparent color assert (0, 0, 0, 255) in palette # black assert (255, 255, 255, 255) in palette # white def test_plte(): qr = segno.make_qr('test') buff = io.BytesIO() dark = (0, 0, 139) qr.save(buff, kind='png', dark=dark, light=None) buff.seek(0) reader = PNGReader(file=buff) reader.preamble() assert not reader.greyscale palette = reader.palette() assert 2 == len(palette) assert 0 == palette[0][3] # Transparent color dark_with_alpha = dark + (255,) assert dark_with_alpha in palette def test_plte_no_transparency(): qr = segno.make_qr('test') buff = io.BytesIO() dark = (0, 0, 139) light = (255, 255, 255) qr.save(buff, kind='png', dark=dark, light=light) buff.seek(0) reader = PNGReader(file=buff) reader.preamble() assert not reader.greyscale palette = reader.palette() assert 2 == len(palette) assert dark in palette assert light in palette def test_plte_colors(): qr = segno.make_qr('test') buff = io.BytesIO() dark = (0, 0, 139) light = (255, 255, 255) qr.save(buff, kind='png', dark=dark, light=light, quiet_zone='green', finder_dark='purple', finder_light='yellow') buff.seek(0) reader = PNGReader(file=buff) reader.preamble() assert not reader.greyscale palette = reader.palette() assert 5 == len(palette) assert dark in palette assert light in palette assert colors._color_to_rgb('green') in palette assert colors._color_to_rgb('purple') in palette assert colors._color_to_rgb('yellow') in palette if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������segno-1.6.6/tests/test_png_plte.py������������������������������������������������������������������0000664�0000000�0000000�00000003551�14764403223�0017233�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests if the PNG serializer does not add more colors than needed. See also issue """ import io import pytest import segno def test_plte(): qr = segno.make_qr('test') assert qr.version < 7 dark = 'red' buff_1 = io.BytesIO() buff_2 = io.BytesIO() qr.save(buff_1, kind='png', dark=dark, finder_dark=dark, version_dark='green') qr.save(buff_2, kind='png', dark=dark) assert buff_1.getvalue() == buff_2.getvalue() def test_plte2(): qr = segno.make_qr('test') assert qr.version < 7 dark = 'red' buff_1 = io.BytesIO() buff_2 = io.BytesIO() qr.save(buff_1, kind='png', dark=dark, finder_dark=dark, version_dark='green') qr.save(buff_2, kind='png', dark=dark) assert buff_1.getvalue() == buff_2.getvalue() def test_plte3(): qr = segno.make_qr('test') assert qr.version < 7 dark = 'red' buff_1 = io.BytesIO() buff_2 = io.BytesIO() qr.save(buff_1, kind='png', dark=dark, finder_dark=dark, version_dark='green') qr.save(buff_2, kind='png', dark=dark) assert buff_1.getvalue() == buff_2.getvalue() def test_plte_micro(): qr = segno.make_micro('RAIN') dark = 'red' buff_1 = io.BytesIO() buff_2 = io.BytesIO() qr.save(buff_1, kind='png', dark=dark, finder_dark=dark, alignment_dark='green') qr.save(buff_2, kind='png', dark=dark) assert buff_1.getvalue() == buff_2.getvalue() def test_plte_micro2(): qr = segno.make_micro('RAIN') dark = 'red' buff_1 = io.BytesIO() buff_2 = io.BytesIO() qr.save(buff_1, kind='png', dark=dark, finder_dark=dark, dark_module='green') qr.save(buff_2, kind='png', dark=dark) assert buff_1.getvalue() == buff_2.getvalue() if __name__ == '__main__': pytest.main([__file__]) �������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_ppm.py�����������������������������������������������������������������������0000664�0000000�0000000�00000003006�14764403223�0016212�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ PPM related tests. """ import re import io from struct import unpack import pytest import segno def test_invalid_color(): qr = segno.make_qr('test') out = io.BytesIO() with pytest.raises(ValueError): qr.save(out, kind='ppm', dark=None) def test_not_plain(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='ppm') assert out.getvalue().startswith(b'P6') _size = re.compile(br'^P6\s+(?:#[^\n]+\s*)([0-9]+)\s+(?:[0-9]+\s+[0-9]+\n)').match def _image_data(buff): """\ Returns the image data and the size of the matrix. """ code = buff.getvalue() m = _size(code) if m: size = int(m.group(1)) else: raise Exception('Internal error: PPM header not found') return code[m.end():], size def ppm_bw_as_matrix(buff, border): """\ Returns the QR code as list of [0, 1] lists. :param io.BytesIO buff: Buffer to read the matrix from. """ res = [] data, size = _image_data(buff) rgb_data = [unpack('>3B', data[i:i + 3]) for i in range(0, len(data), 3)] for i, offset in enumerate(range(0, len(rgb_data), size)): if i < border: continue if i >= size - border: break row_data = rgb_data[offset + border:offset + size - border] res.append([(0x0, 0x1)[rgb == (0, 0, 0)] for rgb in row_data]) return res if __name__ == '__main__': pytest.main([__file__]) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_pyqrcode_issue10_17.py�������������������������������������������������������0000664�0000000�0000000�00000000744�14764403223�0021132�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue and """ import segno def test_issue_10_17(): qr = segno.make_qr('John’s Pizza') assert 1 == qr.version assert 'byte' == qr.mode assert 'M' == qr.error if __name__ == '__main__': import pytest pytest.main([__file__]) ����������������������������segno-1.6.6/tests/test_pyqrcode_issue50.py����������������������������������������������������������0000664�0000000�0000000�00000002145�14764403223�0020624�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# (c) Martijn van Rheenen # BSD License """\ Tests against This test was created by Martijn van Rheenen for PyQRCode. Adapted to Segno to check if it has the same problem. """ import pytest import segno class FakeString(str): """\ Create a mock class that *acts* like a string as far as needed for the QRCode constructor, but raises an exception in case shiftjis encoding is used on its value. This mimics the behaviour of Python on an environment where this codec is not installed. """ def __new__(cls, *args, **kw): return str.__new__(cls, *args, **kw) def encode(self, encoding=None, errors='strict'): if encoding == 'shiftjis': raise LookupError("unknown encoding: shiftjis") return super(FakeString, self).encode(encoding, errors) def test_constructing_without_shiftjis_encoding_available(): content = FakeString("t123456789") code = segno.make(content, error="Q") assert 'byte' == code.mode if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_pyqrcodeng_issue13.py��������������������������������������������������������0000664�0000000�0000000�00000001363�14764403223�0021151�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue . The initial test was created by Mathieu , see the above mentioned pull request. Adapted for Segno to check if it suffers from the same problem. """ import segno def test_autodetect(): data = 'Émetteur' qr = segno.make(data) assert qr.mode == 'byte' def test_encoding(): encoding = 'iso-8859-15' data = 'Émetteur' qr = segno.make(data.encode(encoding)) assert qr.mode == 'byte' qr2 = segno.make(data, encoding=encoding) assert qr2 == qr if __name__ == '__main__': import pytest pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_pyqrcodeng_issue15.py��������������������������������������������������������0000664�0000000�0000000�00000002335�14764403223�0021153�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Test against issue . Adapted for Segno to check if it suffers from the same problem. """ import pytest import segno def test_version_too_small(): with pytest.raises(segno.DataOverflowError) as ex: segno.make('A' * 26, version=1) assert 'does not fit' in str(ex.value) def test_version_and_error_provided(): # QR Code version 1-L: Max. 25 alphanumeric chars qr = segno.make('A' * 25, version=1, error='l') assert '1-L' == qr.designator assert 'alphanumeric' == qr.mode def test_version_and_error_provided2(): qr = segno.make('A' * 25, version=1) # No error level defined assert '1-L' == qr.designator assert 'alphanumeric' == qr.mode def test_numeric_defaults(): qr = segno.make('1' * 17, micro=False) # Capacity of a 1-H (numeric): 17 assert '1-H' == qr.designator assert 'numeric' == qr.mode def test_numeric_explicit_error(): qr = segno.make('1' * 41, error='l') # Capacity of a 1-L (numeric): 41 assert '1-L' == qr.designator assert 'numeric' == qr.mode if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_qrcode.py��������������������������������������������������������������������0000664�0000000�0000000�00000035034�14764403223�0016701�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ QR Code tests. """ import os import io from itertools import chain import gzip import tempfile import pytest import segno from segno import consts _LEGAL_MICRO_VERSIONS = tuple(chain(consts.MICRO_VERSION_MAPPING.keys(), [v.lower() for v in consts.MICRO_VERSION_MAPPING.keys()])) _LEGAL_VERSIONS = tuple(chain(range(1, 41), [str(v) for v in range(1, 41)])) _LEGAL_ERROR_LEVELS = tuple(chain(consts.ERROR_MAPPING.keys(), [e.lower() for e in consts.ERROR_MAPPING.keys()])) def test_eq(): qr = segno.make('Equals') assert qr != qr.matrix def test_eq2(): qr = segno.make('Equals') qr2 = segno.make('Equals') assert qr == qr2 @pytest.mark.parametrize('version, mode', [('M1', 'alphanumeric'), ('M1', 'byte'), ('M2', 'byte')]) def test_illegal_mode_micro(version, mode): with pytest.raises(ValueError) as ex: segno.make(1, version=version, mode=mode) assert 'is not available' in str(ex.value) with pytest.raises(ValueError) as ex: segno.make(1, version=version.lower(), mode=mode) @pytest.mark.parametrize('version', _LEGAL_MICRO_VERSIONS) def test_micro_version_contradicts_micro(version): with pytest.raises(ValueError) as ex: segno.make(1, version=version, micro=False) assert '"micro" is False' in str(ex.value) @pytest.mark.parametrize('version', _LEGAL_VERSIONS) def test_version_contradicts_micro(version): with pytest.raises(ValueError) as ex: segno.make(1, version=version, micro=True) assert 'version' in str(ex.value) @pytest.mark.parametrize('version', ['M0', 'M5', -1, 0, 41, 'M1 ', object()]) def test_illegal_version(version): with pytest.raises(ValueError) as ex: segno.make('a', version=version) assert 'version' in str(ex.value) @pytest.mark.parametrize('version', _LEGAL_MICRO_VERSIONS) def test_valid_mirco_versions(version): qr = segno.make(1, version=version) assert qr.is_micro assert version.upper() == qr.version @pytest.mark.parametrize('version', _LEGAL_VERSIONS) def test_valid_versions(version): qr = segno.make(1, version=version) assert not qr.is_micro assert int(version) == qr.version @pytest.mark.parametrize('error', _LEGAL_ERROR_LEVELS) def test_legal_error_levels(error): qr = segno.make(1, error=error, boost_error=False) assert error.upper() == qr.error @pytest.mark.parametrize('error', ['R', 'M ', ' L']) def test_illegal_error_level(error): with pytest.raises(ValueError) as ex: segno.make(1, error=error) assert 'illegal error correction' in str(ex.value).lower() assert 'L, M, Q, H' in str(ex.value) def test_illegal_error_level_micro(): with pytest.raises(ValueError) as ex: segno.make('test', error='H', micro=True) assert 'is not available' in str(ex.value) @pytest.mark.parametrize('data,version', [('abcdefghijklmnopqr', 1), (123456, 'M1')]) def test_data_too_large(data, version): with pytest.raises(segno.DataOverflowError) as ex: segno.make(data, version=version) assert 'does not fit' in str(ex.value) def test_eci_and_micro(): with pytest.raises(ValueError) as ex: segno.make('A', eci=True, micro=True) assert 'ECI mode' in str(ex.value) def test_eci_and_micro2(): with pytest.raises(ValueError) as ex: segno.make('A', eci=True, version='m4') assert 'ECI mode' in str(ex.value) def _calc_size(dim, border, scale=1): return (dim + 2 * border) * scale def test_symbol_size(): qr = segno.make('Hello world', micro=False) width, height = 21, 21 border = 0 assert (width, height) == qr.symbol_size(border=border) border = 1 assert (_calc_size(width, border) == _calc_size(width, border)), \ qr.symbol_size(border=border) border = 4 # (default border) assert (_calc_size(width, border) == _calc_size(width, border)), \ qr.symbol_size() assert (_calc_size(width, border) == _calc_size(width, border)), \ qr.symbol_size(scale=1) assert (_calc_size(width, border, 4), _calc_size(width, border, 4)) == \ qr.symbol_size(scale=4) border = 0 assert (_calc_size(width, border, 4), _calc_size(width, border, 4)) == \ qr.symbol_size(border=border, scale=4) def test_symbol_size_micro(): qr = segno.make('A', version='m2') width, height = 13, 13 # Micro QR Code Version M2 size border = 0 assert (width, height) == qr.symbol_size(border=border) border = 1 dim = _calc_size(width, border) assert (dim, dim) == qr.symbol_size(border=border) border = 2 # (default border) dim = _calc_size(width, border) assert (dim, dim) == qr.symbol_size() assert (dim, dim) == qr.symbol_size(scale=1) dim = _calc_size(width, border, 4) assert (dim, dim) == qr.symbol_size(scale=4) border = 0 dim = _calc_size(width, border, 4) assert (dim, dim) == qr.symbol_size(border=border, scale=4) def test_symbol_size_scale_int(): qr = segno.make_qr('test') assert (21, 21) == qr.symbol_size(border=0) def test_symbol_size_scale_int2(): qr = segno.make_qr('test') border = 2 dim = 21 + 2 * border assert (dim, dim) == qr.symbol_size(border=border) def test_symbol_size_scale_float(): qr = segno.make_qr('test') dim = 21 * 2.5 assert (dim, dim) == qr.symbol_size(scale=2.5, border=0) def test_symbol_size_scale_float2(): qr = segno.make_qr('test') border = 2 dim = (21 + 2 * border) * 1.5 assert (dim, dim) == qr.symbol_size(scale=1.5, border=border) def test_designator(): qr = segno.make('test', version=40, error='L', boost_error=False) assert '40-L' == qr.designator def test_designator2(): qr = segno.make('test', version=8, error='m', boost_error=False) assert '8-M' == qr.designator def test_designator_micro(): qr = segno.make('test', version='M4', error='L', boost_error=False) assert 'M4-L' == qr.designator def test_designator_micro2(): qr = segno.make('12', version='M1') assert 'M1' == qr.designator def test_error_m1(): qr = segno.make('12') assert 'M1' == qr.version assert qr.error is None def test_default_border(): qr = segno.make_qr(12) assert 4 == qr.default_border_size def test_default_border_mirco(): qr = segno.make_micro(12, version='m4') assert 2 == qr.default_border_size def test_neq(): qr = segno.make('Hello') qr2 = segno.make('hello') assert qr == qr assert qr2 == qr2 assert qr != qr2 @pytest.mark.parametrize('border', [.2, -1, 1.3]) def test_matrix_iter_invalid_border(border): qr = segno.make('A') with pytest.raises(ValueError): for row in qr.matrix_iter(border=border): pass def test_matrix_iter_border_zero(): qr = segno.make('No border') res = [bytearray(row) for row in qr.matrix_iter(border=0)] assert qr.matrix == tuple(res) def test_matrix_iter_border_default(): qr = segno.make('A', version=1) res = [bytearray(row) for row in qr.matrix_iter(border=None)] top_border = [bytearray([0x0] * 29)] * 4 seq = bytearray([0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0]) assert top_border == res[:4] assert seq == res[4][:len(seq)] def test_matrix_iter_border_3(): qr = segno.make('A', version=1) res = [bytearray(row) for row in qr.matrix_iter(border=3)] top_border = [bytearray([0x0] * 27)] * 3 seq = bytearray([0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0]) assert top_border == res[:3] assert seq == res[3][:len(seq)] @pytest.mark.parametrize('border', [.2, -1, 1.3]) def test_matrix_iter_verbose_invalid_border(border): qr = segno.make('A') with pytest.raises(ValueError): for row in qr.matrix_iter(border=border, verbose=True): pass def test_matrix_iter_verbose_border_zero(): qr = segno.make('No border') res = [bytearray([bool(v >> 8) for v in row]) for row in qr.matrix_iter( border=0, verbose=True)] assert qr.matrix == tuple(res) def test_matrix_iter_verbose_border_default(): qr = segno.make('A', version=1) res = [list(row) for row in qr.matrix_iter(border=None, verbose=True)] top_border = [[consts.TYPE_QUIET_ZONE] * 29] * 4 seq = [] seq.extend([consts.TYPE_QUIET_ZONE] * 4) seq.extend([consts.TYPE_FINDER_PATTERN_DARK] * 7) seq.extend([consts.TYPE_SEPARATOR, consts.TYPE_FORMAT_LIGHT]) assert top_border == res[:4] assert seq == res[4][:len(seq)] def test_matrix_iter_verbose_border_3(): qr = segno.make('A', version=1) res = [list(row) for row in qr.matrix_iter(border=3, verbose=True)] top_border = [[consts.TYPE_QUIET_ZONE] * 27] * 3 seq = [] seq.extend([consts.TYPE_QUIET_ZONE] * 3) seq.extend([consts.TYPE_FINDER_PATTERN_DARK] * 7) seq.extend([consts.TYPE_SEPARATOR, consts.TYPE_FORMAT_LIGHT]) assert top_border == res[:3] assert seq == res[3][:len(seq)] def test_save_png_buffer(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='png') out.seek(0) expected = b'\211PNG\r\n\032\n' # PNG magic number val = out.read(len(expected)) assert expected == val def test_save_png_filestream(): qr = segno.make_qr('test') with tempfile.NamedTemporaryFile('wb', suffix='.png', delete=False) as f: fn = f.name qr.save(f) expected = b'\211PNG\r\n\032\n' # PNG magic number with open(fn, mode='rb') as f: val = f.read(len(expected)) os.unlink(fn) assert expected == val def test_save_png_filename(): qr = segno.make_qr('test') with tempfile.NamedTemporaryFile('wb', suffix='.png', delete=False) as f: fn = f.name qr.save(fn) expected = b'\211PNG\r\n\032\n' # PNG magic number with open(fn, mode='rb') as f: val = f.read(len(expected)) os.unlink(fn) assert expected == val @pytest.mark.parametrize('ext', ['svg', 'SvG', 'SVG', 'Svg']) def test_save_svg_filestream(ext): qr = segno.make_qr('test') with tempfile.NamedTemporaryFile('wb', suffix='.' + ext, delete=False) as f: fn = f.name qr.save(f) with open(fn, mode='rb') as f: val = f.read(6) os.unlink(fn) assert b' """ import os import io import tempfile import shutil import pytest import segno from segno import encoder try: from .tutils import read_matrix # Attempted relative import in non-package except (ValueError, SystemError, ImportError): from tutils import read_matrix def test_seq_behave_like_qrcode(): qr = segno.make_qr('Something') sa = segno.QRCodeSequence([qr]) assert 1 == len(sa) assert not qr.is_micro assert qr.is_micro == sa.is_micro assert qr.version == sa.version assert qr.error == sa.error assert qr.default_border_size == sa.default_border_size assert qr.mask == sa.mask assert qr.symbol_size() == sa.symbol_size() assert qr.is_micro == sa.is_micro assert qr == sa[0] assert qr.png_data_uri() == sa.png_data_uri() def test_seq_dont_behave_like_qrcode(): qr = segno.make_qr('Something') seq = segno.QRCodeSequence([qr, qr]) assert 2 == len(seq) with pytest.raises(AttributeError): assert not seq.is_micro _DATA_PARITY = ( # Expected, Input # See ISO/IEC 18004:2015(E) page 61: # 30 ⊕ 31 ⊕ 32 ⊕ 33 ⊕ 34 ⊕ 35 ⊕ 36 ⊕ 37 ⊕ 38 ⊕ 39 ⊕ 93 ⊕ FA ⊕ 96 ⊕ 7B = 85 (int('85', 16), '0123456789日本'), (int('85', 16), '01234日本56789'), (49, '123456789'), (49, 123456789), (160, 'Mürrisch'), ) @pytest.mark.parametrize('expected, data', _DATA_PARITY) def test_calc_sa_parity(expected, data): assert expected == encoder.calc_structured_append_parity(data) def test_illegal_version(): with pytest.raises(ValueError): segno.make_sequence('ABCD', version='M4') def test_encode_single(): # ISO/IEC 18004:2015(E) - page 7 # 'QR Code Symbol' as 1-M symbol seq = segno.make_sequence('QR Code Symbol', version=1, error='M', boost_error=False) assert '1-M' == seq.designator ref_matrix = read_matrix('iso-fig-1')[0] assert ref_matrix == seq.matrix qr = seq[0] assert '1-M' == qr.designator ref_matrix = read_matrix('iso-fig-1')[0] assert ref_matrix == qr.matrix @pytest.mark.parametrize('version,symbol_count', [(None, 4), (1, None)]) def test_encode_multi_by_version_or_symbol_count(version, symbol_count): # ISO/IEC 18004:2015(E) - page 60 seq = segno.make_sequence('ABCDEFGHIJKLMN' 'OPQRSTUVWXYZ0123' '456789ABCDEFGHIJ' 'KLMNOPQRSTUVWXYZ', version=version, symbol_count=symbol_count, error='m', mask=4, boost_error=False) assert 4 == len(seq) ref_matrix = read_matrix('seq-iso-04-01')[0] assert ref_matrix == seq[0].matrix ref_matrix = read_matrix('seq-iso-04-02')[0] assert ref_matrix == seq[1].matrix ref_matrix = read_matrix('seq-iso-04-03')[0] assert ref_matrix == seq[2].matrix ref_matrix = read_matrix('seq-iso-04-04')[0] assert ref_matrix == seq[3].matrix def test_too_much_for_one_qrcode(): data = 'A' * 4296 # Version 40 supports max. 4296 alphanumeric chars (40-L) data += 'B' with pytest.raises(ValueError) as ex: segno.make(data) assert 'too large' in str(ex.value) def test_dataoverflow(): data = 'A' * 4296 # Version 40: max. 4296 alphanumeric chars seq = segno.make_sequence(data, version=40) assert 1 == len(seq) data += 'B' seq = segno.make_sequence(data, version=40) assert 2 == len(seq) def test_dataoverflow_error(): data = 'A' * 4296 * 16 # Version 40: max. 4296 alphanumeric chars * 16 symbols data = data[:-4] # Remove some chars taking some SA overhead into account seq = segno.make_sequence(data, version=40) assert 16 == len(seq) data += 'B' with pytest.raises(segno.DataOverflowError) as ex: segno.make_sequence(data, version=40) assert 'does not fit' in str(ex.value) def test_no_version_provided(): with pytest.raises(ValueError): segno.make_sequence('A') def test_int(): data = int('1' * 42) seq = segno.make_sequence(data, version=1) assert 2 == len(seq) def test_save_one(): directory = tempfile.mkdtemp() assert 0 == len(os.listdir(directory)) seq = segno.make_sequence('ABC', version=1) assert 1 == len(seq) seq.save(os.path.join(directory, 'test.svg')) number_of_files = len(os.listdir(directory)) shutil.rmtree(directory) assert 1 == number_of_files def test_save_multiple(): directory = tempfile.mkdtemp() assert 0 == len(os.listdir(directory)) seq = segno.make_sequence('ABCDEFGHIJKLMN' 'OPQRSTUVWXYZ0123' '456789ABCDEFGHIJ' 'KLMNOPQRSTUVWXYZ', version=1, error='m') assert 4 == len(seq) seq.save(os.path.join(directory, 'test.svg')) number_of_files = len(os.listdir(directory)) shutil.rmtree(directory) assert 4 == number_of_files def test_save_terminal_one(): out_multiple = io.StringIO() data = 'QR Code Symbol' seq = segno.make_sequence(data, version=1) assert 1 == len(seq) seq.terminal(out_multiple) qr = segno.make_qr(data, version=1) out_single = io.StringIO() qr.terminal(out_single) assert out_single.getvalue() == out_multiple.getvalue() def test_save_terminal_multiple(): out_multiple = io.StringIO() data = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' seq = segno.make_sequence(data, version=1, error='m') assert 4 == len(seq) seq.terminal(out_multiple) out_single = io.StringIO() for qr in seq: qr.terminal(out_single) assert out_single.getvalue() == out_multiple.getvalue() def test_boosterror_noop(): seq = segno.make_sequence('I read the news today oh boy', version=1) assert 2 == len(seq) assert 'L' == seq[0].error assert 'L' == seq[1].error def test_boosterror(): seq = segno.make_sequence('I read the news today oh boy / About a lucky man ' 'who made the grade', version=2) assert 3 == len(seq) assert 'M' == seq[0].error assert 'M' == seq[1].error assert 'M' == seq[2].error def test_boosterror2(): seq = segno.make_sequence('I read the news today oh boy / About a lucky man ' 'who made the grade', symbol_count=4) assert 4 == len(seq) assert '2-Q' == seq[0].designator assert '2-Q' == seq[1].designator assert '2-Q' == seq[2].designator assert '2-Q' == seq[3].designator def test_toomany_symbols(): with pytest.raises(ValueError): segno.make_sequence('ABCDEF', symbol_count=16) @pytest.mark.parametrize('symbol_count', [0, -1, 17]) def test_illegal_symbolcount(symbol_count): with pytest.raises(ValueError): segno.make_sequence('I read the news today oh boy / About a lucky man ' 'who made the grade', symbol_count=symbol_count) if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_svg.py�����������������������������������������������������������������������0000664�0000000�0000000�00000040605�14764403223�0016223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ SVG related tests. """ import os import re import io import tempfile import xml.etree.ElementTree as etree import pytest import segno _SVG_NS = 'http://www.w3.org/2000/svg' _CSS_CLASS = 'segno' _PATH_CLASS = 'qrline' def _get_svg_el(root, name): return root.find('{%s}%s' % (_SVG_NS, name)) def _get_group(root): return _get_svg_el(root, 'g') def _get_first_path(root): g = _get_group(root) return _get_svg_el(root if g is None else g, 'path') def _get_title(root): return _get_svg_el(root, 'title') def _get_desc(root): return _get_svg_el(root, 'desc') def _parse_xml(buff): """\ Parses XML and returns the root element. """ buff.seek(0) return etree.parse(buff).getroot() def test_write_svg(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg') xml_str = out.getvalue() assert xml_str.startswith(b' no group assert _get_group(root) is None assert 'viewBox' not in root.attrib assert 'height' in root.attrib assert 'width' in root.attrib css_class = root.attrib.get('class') assert css_class assert _CSS_CLASS == css_class path_el = _get_first_path(root) assert path_el is not None path_class = path_el.get('class') assert _PATH_CLASS == path_class stroke = path_el.get('stroke') assert stroke == '#000' title_el = _get_title(root) assert title_el is None desc_el = _get_desc(root) assert desc_el is None @pytest.mark.parametrize('dark', ['bLack', '#000000', (0, 0, 0)]) def test_write_svg_black(dark): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', dark=dark) xml_str = out.getvalue() assert xml_str.startswith(b' no group assert _get_group(root) is None assert 'viewBox' not in root.attrib assert 'height' in root.attrib assert 'width' in root.attrib css_class = root.attrib.get('class') assert css_class assert _CSS_CLASS == css_class path_el = _get_first_path(root) assert path_el is not None path_class = path_el.get('class') assert _PATH_CLASS == path_class stroke = path_el.get('stroke') assert stroke == '#000' title_el = _get_title(root) assert title_el is None desc_el = _get_desc(root) assert desc_el is None def test_write_svg_background_omitted(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg') xml_str = out.getvalue() assert xml_str.startswith(b' no group assert _get_group(root) is None # Background should be the first path in the doc path = _get_first_path(root) assert path is not None assert not path.attrib.get('fill') @pytest.mark.parametrize('light', ['wHitE', '#fff', (255, 255, 255), '#ffffff']) def test_write_svg_background_white(light): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', light=light) xml_str = out.getvalue() assert xml_str.startswith(b' no group assert _get_group(root) is None # Background should be the first path in the doc path = _get_first_path(root) assert path is not None assert '#fff' == path.attrib.get('fill') assert path.attrib.get('class') is None d = path.attrib.get('d') assert d expected = 'M0 0h{1}v{0}h-{1}z'.format(*qr.symbol_size()) assert expected == d g = _get_group(root) assert g is None def test_scale_background(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', dark='green', light='yellow', scale=10) root = _parse_xml(out) g = _get_group(root) assert g is not None assert 'scale(10)' == g.attrib.get('transform') def test_write_svg_color_rgb(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', dark=(76, 131, 205)) xml_str = out.getvalue() assert xml_str.startswith(b'&' qr.save(out, kind='svg', title=title) assert b'<title>&</title>' in out.getvalue() root = _parse_xml(out) title_el = _get_title(root) assert title_el is not None assert title == title_el.text def test_desc(): qr = segno.make_qr('test') out = io.BytesIO() desc = 'Test' qr.save(out, kind='svg', desc=desc) root = _parse_xml(out) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_desc2(): qr = segno.make_qr('test') out = io.BytesIO() desc = 'Määhhhh' qr.save(out, kind='svg', desc=desc) root = _parse_xml(out) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_desc3(): qr = segno.make_qr('test') out = io.BytesIO() desc = '点' qr.save(out, kind='svg', desc=desc) root = _parse_xml(out) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_desc4(): qr = segno.make_qr('test') out = io.BytesIO() encoding = 'ISO-8859-1' desc = 'áà' qr.save(out, kind='svg', desc='áà', encoding=encoding) root = _parse_xml(out) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_desc_escape(): qr = segno.make_qr('test') out = io.BytesIO() desc = '&' qr.save(out, kind='svg', desc=desc) assert b'<desc>&</desc>' in out.getvalue() root = _parse_xml(out) desc_el = _get_desc(root) assert desc_el is not None assert desc == desc_el.text def test_background(): qr = segno.make_qr('test') out = io.BytesIO() color = '#800080' qr.save(out, kind='svg', light=color) root = _parse_xml(out) # Background should be the first path in the doc rect = _get_first_path(root) assert rect is not None assert color == rect.attrib['fill'] def test_module_color(): qr = segno.make_qr('test') out = io.BytesIO() color = '#800080' qr.save(out, kind='svg', dark=color) root = _parse_xml(out) path = _get_first_path(root) assert path is not None assert color == path.attrib['stroke'] def test_scale(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', scale=2) root = _parse_xml(out) path = _get_first_path(root) assert path is not None assert 'scale(2)' in path.attrib['transform'] def test_scale_float(): qr = segno.make_qr('test') out = io.BytesIO() scale = 2.13 qr.save(out, kind='svg', scale=scale) root = _parse_xml(out) path = _get_first_path(root) assert path is not None assert f'scale({scale})' in path.attrib['transform'] def test_unit_omitsize(): qr = segno.make_qr('test') out = io.BytesIO() with pytest.raises(ValueError): qr.save(out, kind='svg', unit='cm', omitsize=True) def test_unit(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', unit='mm') width, height = qr.symbol_size() root = _parse_xml(out) assert 'width' in root.attrib assert '%dmm' % width == root.attrib['width'] assert 'height' in root.attrib assert '%dmm' % height == root.attrib['height'] assert 'viewBox' in root.attrib assert '0 0 %d %d' % (width, height) == root.attrib['viewBox'] def test_unit_none(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', unit=None) width, height = qr.symbol_size() root = _parse_xml(out) assert 'width' in root.attrib assert str(width) == root.attrib['width'] assert 'height' in root.attrib assert str(height) == root.attrib['height'] assert 'viewBox' not in root.attrib def test_write_unicode_filename(): qr = segno.make_qr('test') f = tempfile.NamedTemporaryFile('wt', suffix='.svg', delete=False) f.close() title = 'mürrische Mädchen' desc = '点' qr.save(f.name, title=title, desc=desc) f = open(f.name, mode='rb') root = _parse_xml(f) f.seek(0) val = f.read(6) f.close() os.unlink(f.name) assert b'' in buff.getvalue() def test_draw_transparent(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', dark='green', finder_dark='green', dark_module='blue', alignment_light='yellow', quiet_zone='yellow', draw_transparent=False) root = _parse_xml(out) paths = root.findall('.//{%s}path' % _SVG_NS) assert 3 == len(paths) out = io.BytesIO() qr.save(out, kind='svg', dark='green', finder_dark='green', dark_module='blue', alignment_light='yellow', quiet_zone='yellow', draw_transparent=True) root = _parse_xml(out) paths = root.findall('.//{%s}path' % _SVG_NS) assert 4 == len(paths) assert 1 == len([p for p in paths if p.attrib.get('stroke') is None]) def svg_as_matrix(buff, border): """\ Returns the QR code path as list of [0,1] lists. """ root = _parse_xml(buff) path = _get_first_path(root) h = root.attrib['height'] w = root.attrib['width'] if h != w: raise ValueError(f'Expected equal height/width, got height="{h}" width="{w}"') size = int(w) - 2 * border d = path.attrib['d'] res = [] res_row = None absolute_x = -border for op, x, y, length in re.findall(r'([Mm])(-?[0-9]+(?:\.[0-9]+)?) (-?[0-9]+(?:\.[0-9]+)?)h([0-9]+)', d): x = int(x) y = float(y) length = int(length) if y != 0.0: # New row if res_row is not None: res_row.extend([0] * (size - len(res_row))) res_row = [] res.append(res_row) if op == 'm': absolute_x += x if x < 0: res_row.extend([0] * absolute_x) else: res_row.extend([0] * x) absolute_x += length elif op == 'M': absolute_x = length if x != border: raise ValueError(f'Unexpected border width. Expected "{border}", got "{x}"') res_row.extend([1] * length) res_row.extend([0] * (size - len(res_row))) return res if __name__ == '__main__': pytest.main([__file__]) ���������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_svg_colorful.py��������������������������������������������������������������0000664�0000000�0000000�00000005136�14764403223�0020130�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ SVG related tests for multicolor support. """ import io import xml.etree.ElementTree as etree import pytest import segno from segno import writers as colors _SVG_NS = 'http://www.w3.org/2000/svg' def _get_svg_el(root, name): return root.find('{%s}%s' % (_SVG_NS, name)) def _get_group(root): return _get_svg_el(root, 'g') def _parse_xml(buff): """\ Parses XML and returns the root element. """ buff.seek(0) return etree.parse(buff).getroot() def test_merge_colors(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', dark='green', finder_dark='green', dark_module='green') green = colors._color_to_webcolor('green') assert green in out.getvalue().decode('utf-8') root = _parse_xml(out) paths = root.findall('.//{%s}path' % _SVG_NS) assert 1 == len(paths) def test_merge_colors2(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', dark='green', finder_dark='green', dark_module='blue', alignment_light='yellow', quiet_zone='yellow') green = colors._color_to_webcolor('green') yellow = colors._color_to_webcolor('yellow') blue = colors._color_to_webcolor('blue') res = out.getvalue().decode('utf-8') assert green in res assert yellow in res assert blue in res root = _parse_xml(out) paths = root.findall('.//{%s}path' % _SVG_NS) assert 3 == len(paths) assert not any(p.attrib.get('transform') for p in paths) def test_nogroup(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', dark='green', finder_dark='green', dark_module='blue', alignment_light='yellow', quiet_zone='yellow', scale=1.0) root = _parse_xml(out) paths = root.findall('.//{%s}path' % _SVG_NS) assert 3 == len(paths) assert all(p.attrib.get('transform') is None for p in paths) group = _get_group(root) assert not group def test_scale(): qr = segno.make_qr('test') out = io.BytesIO() qr.save(out, kind='svg', dark='green', finder_dark='green', dark_module='blue', alignment_light='yellow', quiet_zone='yellow', scale=1.5) root = _parse_xml(out) paths = root.findall('.//{%s}path' % _SVG_NS) assert 3 == len(paths) assert all(p.attrib.get('transform') is None for p in paths) group = _get_group(root) assert group is not None assert 'scale(1.5)' == group.attrib.get('transform') if __name__ == '__main__': pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_terminal.py������������������������������������������������������������������0000664�0000000�0000000�00000003774�14764403223�0017245�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Terminal output related tests. """ import io import re import pytest import segno def test_terminal(): # Test with default options qr = segno.make_qr('test') # Upper left finder pattern: 7 dark modules + 1 light module expected = '\033[49m' + ' ' * 7 + '\033[0m\033[7m ' out = io.StringIO() qr.terminal(out, border=0) val = out.getvalue() assert expected == val[:len(expected)] def test_terminal_compact(): # Test compact half-block terminal QR. qr = segno.make_qr('test') out = io.StringIO() qr.terminal(out, border=0, compact=True) val = out.getvalue() expected = """\ ▄▄▄▄▄ █ ▀ ▀▀█ ▄▄▄▄▄ █ █ █▄██ █ █ █ █▄▄▄█ █▀ ▀███ █▄▄▄█ ▄▄▄▄▄▄▄█ ▀ █ █▄▄▄▄▄▄▄ ▀▀▄ ▀▄▀ ▀█▄▄ ▄▄█▀ ▄ █ ▄▄ █▄ ▀▀ ▀▄█ ▄█ ▄█ ▄▄██▄█▄█▀▀ ▄██▀ █▄▀ ▀ ▄▄▄▄▄ ██ ▀▄ █▀▀ ▀▄█ █ █ █ ▀ ▀▀▀▄ ▀▄█ █▄▄▄█ █▄█▄▄ █▄ ██ ██ ▀▀ ▀▀ ▀ ▀▀ ▀ """ # noqa: W291 assert expected == val def terminal_as_matrix(buff, border): """\ Returns the text QR code as list of [0,1] lists. """ color_pattern = re.compile(r'(\033\[\d+m)(\s+)\033\[0m') res = [] colors = ('\033[7m', '\033[49m') code = buff.getvalue().splitlines() for line in code[border:len(code) - border]: row = [] for m in color_pattern.finditer(line): bit = colors.index(m.group(1)) bit_count = len(m.group(2)) // 2 # 2 chars for 1 module! if m.start() == 0 or m.end() == len(line): bit_count -= border row.extend([bit] * bit_count) res.append(row) return res if __name__ == '__main__': pytest.main([__file__]) ����segno-1.6.6/tests/test_tex.py�����������������������������������������������������������������������0000664�0000000�0000000�00000005034�14764403223�0016221�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ LaTex output related tests. """ import re import io import segno def test_write_tex(): # Test with default options qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='tex', border=4) assert r'\pgfpathmoveto{\pgfqpoint{4pt}{-4pt}}' in out.getvalue() def test_write_tex_url(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() url = 'http://www.example.org/~xxx#aaa' qr.save(out, kind='tex', border=4, url=url) assert r'\href{' + url + '}' in out.getvalue() def test_write_tex_omit_url(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() url = '' qr.save(out, kind='tex', border=4, url=url) assert r'\href' not in out.getvalue() def test_write_tex_omit_url2(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='tex', border=4) assert r'\href' not in out.getvalue() def test_write_tex_color(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='tex', border=4) assert r'\color' not in out.getvalue() def test_write_tex_color2(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='tex', border=4, dark='green') assert r'\color{green}' in out.getvalue() _COMMAND_PATTERN = re.compile(r'pgfpath(move|line)to{\\pgfqpoint{(-?[0-9]+)pt}{(-?[0-9]+)pt}') def tex_as_matrix(buff, border): """\ Returns the LaTeX QR code as list of [0,1] lists. :param io.StringIO buff: Buffer to read the matrix from. """ res = [] last_y = None res_row = None size = 0 prev_x = border for m in _COMMAND_PATTERN.finditer(buff.getvalue()): op, x, y = m.groups() x, y = int(x), int(y) length = x - prev_x prev_x = x if y != last_y: length = x - border if res_row is not None: res_row.extend([0] * (size - len(res_row))) if not size: size = len(res_row) last_y = y res_row = [] res.append(res_row) if op == 'move': res_row.extend([0] * length) elif op == 'line': res_row.extend([1] * length) res_row.extend([0] * (size - len(res_row))) return res if __name__ == '__main__': import pytest pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_txt.py�����������������������������������������������������������������������0000664�0000000�0000000�00000001751�14764403223�0016242�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Text output related tests. """ import io from itertools import islice import segno def test_write_txt(): # Test with default options qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='txt', border=0) expected = '11111110011' val = out.getvalue() assert expected == val[:len(expected)] def txt_as_matrix(buff, border): """\ Returns the text QR code as list of [0,1] lists. :param io.StringIO buff: Buffer to read the matrix from. """ res = [] code = buff.getvalue().splitlines() len_without_border = len(code) - border for line in islice(code, border, len_without_border): res.append([int(clr) for clr in islice(line, border, len_without_border)]) return res if __name__ == '__main__': import pytest pytest.main([__file__]) �����������������������segno-1.6.6/tests/test_utils.py���������������������������������������������������������������������0000664�0000000�0000000�00000004166�14764403223�0016566�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against the ``utils`` module. """ import pytest from segno import utils def test_get_border_qr(): matrix_size = 21, 21 # Version 1 border = utils.get_border(matrix_size, None) assert 4 == border border = utils.get_border(matrix_size, 3) assert 3 == border def test_get_border2(): matrix_size = 11, 11 # M1 border = utils.get_border(matrix_size, 1) assert 1 == border border = utils.get_border(matrix_size, None) assert 2 == border def test_get_border3(): matrix_size = 29, 29 # Version 3 border = utils.get_border(matrix_size, 0) assert 0 == border border = utils.get_border(matrix_size, None) assert 4 == border def test_get_symbol_size(): matrix_size = 21, 21 # QR Code version 1 border = 0 width, height = utils.get_symbol_size(matrix_size, border=border) assert matrix_size == (width, height) border = 4 width, height = utils.get_symbol_size(matrix_size) assert (matrix_size[0] + 2 * border, matrix_size[1] + 2 * border) == (width, height) def test_get_symbol_size_micro(): matrix_size = 13, 13 # M2 border = 0 width, height = utils.get_symbol_size(matrix_size, border=border) assert matrix_size == (width, height) border = 2 width, height = utils.get_symbol_size(matrix_size) assert (matrix_size[0] + 2 * border, matrix_size[1] + 2 * border) == (width, height) @pytest.mark.parametrize('scale', [1, 1.2, .8, 10]) def test_valid_scale(scale): assert utils.check_valid_scale(scale) is None @pytest.mark.parametrize('scale', (0.0, 0, -1, -.2, int(.8))) def test_invalid_scale(scale): with pytest.raises(ValueError): utils.check_valid_scale(scale) @pytest.mark.parametrize('border', (None, 0, 0.0, 1, 2)) def test_valid_border(border): assert utils.check_valid_border(border) is None @pytest.mark.parametrize('border', (.2, -1, 1.3)) def test_invalid_border(border): with pytest.raises(ValueError): utils.check_valid_border(border) if __name__ == '__main__': pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_utils_iterverbose.py���������������������������������������������������������0000664�0000000�0000000�00000033575�14764403223�0021205�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against the ``utils.matrix_iter_verboses`` function. """ import os import pytest from segno import encoder, utils, consts def read_matrix(name): """\ Helper function to read a matrix from /ref_matrix. The file extension .txt is added automatically. :return: A tuple of bytearrays """ matrix = [] with open(os.path.join(os.path.dirname(__file__), f'feature_decompose/{name}.txt')) as f: for row in f: matrix.append(bytearray([int(i) for i in row if i != '\n'])) return matrix def test_finder_pattern_dark_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v == consts.TYPE_FINDER_PATTERN_DARK] for v in row])) expected = read_matrix('v1-finder-dark') assert expected == res def test_finder_pattern_dark_light_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_FINDER_PATTERN_LIGHT] for v in row])) expected = read_matrix('v1-finder-light') assert expected == res def test_finder_pattern_dark_and_light_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v in (consts.TYPE_FINDER_PATTERN_DARK, consts.TYPE_FINDER_PATTERN_LIGHT)] for v in row])) expected = read_matrix('v1-finder-dark-and-light') assert expected == res def test_finder_pattern_dark_mqr(): code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v == consts.TYPE_FINDER_PATTERN_DARK] for v in row])) expected = read_matrix('m2-finder-dark') assert expected == res def test_finder_pattern_dark_light_mqr(): code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_FINDER_PATTERN_LIGHT] for v in row])) expected = read_matrix('m2-finder-light') assert expected == res def test_finder_pattern_dark_and_light_mqr(): code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v in (consts.TYPE_FINDER_PATTERN_DARK, consts.TYPE_FINDER_PATTERN_LIGHT)] for v in row])) expected = read_matrix('m2-finder-dark-and-light') assert expected == res def test_separator_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_SEPARATOR] for v in row])) expected = read_matrix('v1-separator') assert expected == res def test_separator_mqr(): code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_SEPARATOR] for v in row])) expected = read_matrix('m2-separator') assert expected == res def test_darkmodule_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v == consts.TYPE_DARKMODULE] for v in row])) expected = read_matrix('v1-darkmodule') assert expected == res def test_no_darkmodule_mqr(): # Micro QR Codes don't have a dark module. code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.extend([v == consts.TYPE_DARKMODULE for v in row]) assert True not in res def test_timing_dark_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v == consts.TYPE_TIMING_DARK] for v in row])) expected = read_matrix('v1-timing-dark') assert expected == res def test_timing_light_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_TIMING_LIGHT] for v in row])) expected = read_matrix('v1-timing-light') assert expected == res def test_timing_dark_mqr(): code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v == consts.TYPE_TIMING_DARK] for v in row])) expected = read_matrix('m2-timing-dark') assert expected == res def test_timing_light_mqr(): code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_TIMING_LIGHT] for v in row])) expected = read_matrix('m2-timing-light') assert expected == res def test_timing_dark_and_light_mqr(): code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v in (consts.TYPE_TIMING_DARK, consts.TYPE_TIMING_LIGHT)] for v in row])) expected = read_matrix('m2-timing-dark-and-light') assert expected == res def test_alignment_dark(): code = encoder.encode('A', version=12) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v == consts.TYPE_ALIGNMENT_PATTERN_DARK] for v in row])) expected = read_matrix('v12-alignment-dark') assert expected == res def test_alignment_light(): code = encoder.encode('A', version=12) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_ALIGNMENT_PATTERN_LIGHT] for v in row])) expected = read_matrix('v12-alignment-light') assert expected == res def test_alignment_dark_and_light(): code = encoder.encode('A', version=12) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v in (consts.TYPE_ALIGNMENT_PATTERN_LIGHT, consts.TYPE_ALIGNMENT_PATTERN_DARK)] for v in row])) expected = read_matrix('v12-alignment-dark-and-light') assert expected == res def test_version_dark(): code = encoder.encode('A', version=7) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v == consts.TYPE_VERSION_DARK] for v in row])) expected = read_matrix('v7-version-dark') assert expected == res def test_version_light(): code = encoder.encode('A', version=7) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_VERSION_LIGHT] for v in row])) expected = read_matrix('v7-version-light') assert expected == res def test_version_dark_and_light(): code = encoder.encode('A', version=7) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v in (consts.TYPE_VERSION_LIGHT, consts.TYPE_VERSION_DARK)] for v in row])) expected = read_matrix('v7-version-dark-and-light') assert expected == res def test_version_no_version(): # The version information is not available in QR Codes < 7 code = encoder.encode('A', version=6) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.extend([v in (consts.TYPE_VERSION_LIGHT, consts.TYPE_VERSION_DARK) for v in row]) assert True not in res def test_format_dark_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v == consts.TYPE_FORMAT_DARK] for v in row])) expected = read_matrix('v1-format-dark') assert expected == res def test_format_light_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_FORMAT_LIGHT] for v in row])) expected = read_matrix('v1-format-light') assert expected == res def test_format_dark_and_light_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=0): res.append(bytearray([(0x2, 0x1)[v in (consts.TYPE_FORMAT_DARK, consts.TYPE_FORMAT_LIGHT)] for v in row])) expected = read_matrix('v1-format-dark-and-light') assert expected == res def test_quietzone_default_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_QUIET_ZONE] for v in row])) expected = read_matrix('v1-quietzone-4') assert expected == res def test_quietzone_custom_qr(): code = encoder.encode('A', micro=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) border = 1 res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=border): res.append(bytearray([(0x2, 0x0)[v == consts.TYPE_QUIET_ZONE] for v in row])) expected = read_matrix('v1-quietzone-1') assert expected == res def test_quietzone_default_mqr(): code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size): res.append(bytearray([(0x1, 0x0)[v == consts.TYPE_QUIET_ZONE] for v in row])) expected = read_matrix('m2-quietzone-2') assert expected == res def test_quietzone_custom_mqr(): code = encoder.encode('A', micro=True) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) border = 5 res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size, border=border): res.append(bytearray([(0x1, 0x0)[v == consts.TYPE_QUIET_ZONE] for v in row])) expected = read_matrix('m2-quietzone-5') assert expected == res def test_convert_to_boolean_true(): code = encoder.encode('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', error='m', mask=4, boost_error=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size): res.append(bytearray([int(v >> 8 > 0) for v in row])) expected = read_matrix('iso-fig-29') assert expected == res def test_convert_to_boolean_false(): code = encoder.encode('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', error='m', mask=4, boost_error=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size): res.append(bytearray([not int(v >> 8 == 0) for v in row])) expected = read_matrix('iso-fig-29') assert expected == res def test_convert_to_boolean(): code = encoder.encode('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', error='m', mask=4, boost_error=False) matrix = code.matrix matrix_size = len(matrix[0]), len(matrix) res = [] for row in utils.matrix_iter_verbose(matrix, matrix_size): res.append(bytearray([bool(v >> 8) for v in row])) expected = read_matrix('iso-fig-29') assert expected == res if __name__ == '__main__': pytest.main([__file__]) �����������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_writers.py�������������������������������������������������������������������0000664�0000000�0000000�00000005144�14764403223�0017122�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Tests against the ``writers`` module. """ import os import io import tempfile import pytest import segno from segno import consts, writers def test_writable_stream(): buff = io.BytesIO() with writers.writable(buff, 'wb') as f: f.write(b'x') assert not buff.closed def test_writable_stream2(): buff = io.StringIO() with writers.writable(buff, 'wt') as f: f.write('x') assert not buff.closed def test_writable_stream3(): buff = io.StringIO() with pytest.raises(Exception): with writers.writable(buff, 'wt') as f: f.write('x') raise Exception() assert not f.closed def test_writable_not_stream(): fn = tempfile.NamedTemporaryFile() name = fn.name fn.close() try: with writers.writable(name, 'wb') as f: assert name == f.name f.write(b'Segno') finally: os.remove(name) def test_writable_not_stream2(): fn = tempfile.NamedTemporaryFile() name = fn.name fn.close() try: with writers.writable(name, 'wt') as f: assert name == f.name f.write('Segno') finally: os.remove(name) def test_writable_not_stream3(): fn = tempfile.NamedTemporaryFile() name = fn.name fn.close() with pytest.raises(Exception): with writers.writable(name, 'wb') as f: assert name == f.name f.write(b'Segno') raise Exception() assert f.closed def test_colormap_dark_light(): qr = segno.make('123', version=7) width, height = len(qr.matrix[0]), len(qr.matrix) cm = writers._make_colormap(width, height, dark='blue', light='white') assert 15 == len(cm) def test_colormap_lesser_version_7(): qr = segno.make('123', version=6) width, height = len(qr.matrix[0]), len(qr.matrix) cm = writers._make_colormap(width, height, dark='blue', light='white') assert 13 == len(cm) assert consts.TYPE_VERSION_DARK not in cm assert consts.TYPE_VERSION_LIGHT not in cm def test_colormap_micro(): qr = segno.make_micro('123') width, height = len(qr.matrix[0]), len(qr.matrix) cm = writers._make_colormap(width, height, dark='blue', light='white') assert 10 == len(cm) assert consts.TYPE_VERSION_DARK not in cm assert consts.TYPE_VERSION_LIGHT not in cm assert consts.TYPE_ALIGNMENT_PATTERN_DARK not in cm assert consts.TYPE_ALIGNMENT_PATTERN_LIGHT not in cm assert consts.TYPE_DARKMODULE not in cm if __name__ == '__main__': pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_xbm.py�����������������������������������������������������������������������0000664�0000000�0000000�00000031053�14764403223�0016207�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ XBM related tests. """ import io import re import pytest import segno def _decompose_xbm(s): # Inspired by test case PyQRCode (c) Michael Nooner, BSD License # See width = re.search(r'width ([0-9]+)', s).group(1) height = re.search(r'height ([0-9]+)', s).group(1) bits = re.findall(r'(0x[0-9][0-9])', s) return int(width), int(height), bits def test_defaults(): qr = segno.make_qr('test') out = io.StringIO() qr.save(out, kind='xbm') width, height = qr.symbol_size() assert f'#define img_width {width}' in out.getvalue() assert f'#define img_height {height}' in out.getvalue() assert 'static unsigned char img_bits[] = {' in out.getvalue() def test_name(): qr = segno.make_qr('test') out = io.StringIO() qr.save(out, kind='xbm', name='bla_bla') width, height = qr.symbol_size() assert f'#define bla_bla_width {width}' in out.getvalue() assert f'#define bla_bla_height {height}' in out.getvalue() assert 'static unsigned char bla_bla_bits[] = {' in out.getvalue() def test_scale(): expected = '''#define test_width 116 #define test_height 116 static unsigned char test_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0xff, 0x00, 0xf0, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xff, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xff, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xff, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0xf0, 0xff, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x0f, 0x0f, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x0f, 0x0f, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x0f, 0x0f, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0x0f, 0x0f, 0x00, 0xf0, 0xf0, 0x0f, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xf0, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xf0, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xf0, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xf0, 0xff, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0xf0, 0xff, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0xf0, 0xff, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0xf0, 0xff, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0xf0, 0xff, 0x0f, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0x00, 0xf0, 0x0f, 0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xf0, 0xff, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; ''' scale = 4 qr = segno.make('Test', error='H') out = io.StringIO() qr.save(out, kind='xbm', scale=scale) res = out.getvalue() width, height = qr.symbol_size(scale=scale) expected_width, expected_height, expected_bits = _decompose_xbm(expected) out_width, out_height, out_bits = _decompose_xbm(res) assert expected_width == width assert expected_height == height assert expected_width == out_width assert expected_height == out_height assert len(expected_bits) == len(out_bits) assert expected_bits == out_bits if __name__ == '__main__': pytest.main([__file__]) �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/test_xpm.py�����������������������������������������������������������������������0000664�0000000�0000000�00000004224�14764403223�0016225�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ XPM output related tests. """ import io import re import segno def test_write_xpm_indicator(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='xpm') expected = '/* XPM */\n' val = out.getvalue() assert expected == val[:len(expected)] def test_dark_transparent(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='xpm', dark=None, light='white') expected = '/* XPM */\n' val = out.getvalue() assert expected == val[:len(expected)] assert re.search(r'^"X c None"', val, flags=re.MULTILINE) def test_light_transparent(): qr = segno.make_qr('test', error='m', boost_error=False) out = io.StringIO() qr.save(out, kind='xpm', light=None) expected = '/* XPM */\n' val = out.getvalue() assert expected == val[:len(expected)] assert re.search(r'^" c None"', val, flags=re.MULTILINE) _DATA_PATTERN = re.compile(r'{([^}]+)};') def _img_data(s): m = _DATA_PATTERN.search(s) data = m.group(1).replace('"', '').replace('\n', '').split(',') return data def test_write_xpm_width_height(): scale = 5 border = 2 qr = segno.make_qr('test') width, height = qr.symbol_size(scale=scale, border=border) out = io.StringIO() qr.save(out, kind='xpm', border=border, scale=scale) img_data = _img_data(out.getvalue())[0] assert img_data.startswith(f'{width} {height}') def xpm_as_matrix(buff, border): """\ Returns the XPM QR code as list of [0, 1] lists. :param io.StringIO buff: Buffer to read the matrix from. """ res = [] img_data = _img_data(buff.getvalue()) height = int(img_data[0].split(' ')[0]) img_data = img_data[3:] for i, row in enumerate(img_data): if i < border: continue if i >= height - border: break r = row[border:-border] if border else row res.append([(1 if b == 'X' else 0) for b in r]) return res if __name__ == '__main__': import pytest pytest.main([__file__]) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������segno-1.6.6/tests/tutils.py�������������������������������������������������������������������������0000664�0000000�0000000�00000002267�14764403223�0015713�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # Copyright (c) 2016 - 2024 -- Lars Heuer # All rights reserved. # # License: BSD License # """\ Utility functions for test cases. """ import os def matrix_looks_valid(matrix): """\ Returns if the matrix contains just ``0x0`` and ``0x1`` values. Does not check if the matrix represents a valid (Micro) QR Code. :param matrix: tuple of bytearrays :return: """ invalid_values = [] for i, row in enumerate(matrix): for j, bit in enumerate(row): if bit not in (0x0, 0x1): invalid_values.append((i, j, bit)) if not invalid_values: return True, '' msg = 'Invalid values: ' for i, j, bit in invalid_values: msg += f'\nrow: {i}, col {j}, value: {bit}' return False, msg def read_matrix(name): """\ Helper function to read a matrix from /ref_matrix. The file extension .txt is added automatically. :return: A tuple of bytearrays """ matrix = [] with open(os.path.join(os.path.dirname(__file__), f'ref_matrix/{name}.txt')) as f: for row in f: matrix.append(bytearray([int(i) for i in row if i != '\n'])) return tuple(matrix), len(matrix[0]), len(matrix[1]) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������