From 92f110229e01babdf8b7477bed0ffd0144f2ec70 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Sun, 15 Nov 2015 15:05:18 -0700 Subject: Import binaryornot_0.4.0-1.debian.tar.xz [dgit import tarball binaryornot 0.4.0-1 binaryornot_0.4.0-1.debian.tar.xz] --- .git-dpm | 11 +++++++++++ changelog | 29 +++++++++++++++++++++++++++++ compat | 1 + control | 36 ++++++++++++++++++++++++++++++++++++ copyright | 43 +++++++++++++++++++++++++++++++++++++++++++ rules | 7 +++++++ source/format | 1 + watch | 3 +++ 8 files changed, 131 insertions(+) create mode 100644 .git-dpm create mode 100644 changelog create mode 100644 compat create mode 100644 control create mode 100644 copyright create mode 100755 rules create mode 100644 source/format create mode 100644 watch diff --git a/.git-dpm b/.git-dpm new file mode 100644 index 0000000..c7ed46a --- /dev/null +++ b/.git-dpm @@ -0,0 +1,11 @@ +# see git-dpm(1) from git-dpm package +85c8dab392bee2f68f8cf95d17efcc52b289099f +85c8dab392bee2f68f8cf95d17efcc52b289099f +85c8dab392bee2f68f8cf95d17efcc52b289099f +85c8dab392bee2f68f8cf95d17efcc52b289099f +binaryornot_0.4.0.orig.tar.gz +1e0c2f6fc351bd271b4dc3d12d3942703c7d4b31 +371339 +debianTag="debian/%e%v" +patchedTag="patched/%e%v" +upstreamTag="upstream/%e%u" diff --git a/changelog b/changelog new file mode 100644 index 0000000..a6a6f4b --- /dev/null +++ b/changelog @@ -0,0 +1,29 @@ +binaryornot (0.4.0-1) unstable; urgency=medium + + * New upstream release. + * Bump Standards-Version. + * Use PYBUILD_NAME in d/rules. + * Add missing Build-Depends on python-{chardet,hypothesis}. + + -- Vincent Bernat Sun, 15 Nov 2015 23:05:18 +0100 + +binaryornot (0.3.0-1) unstable; urgency=medium + + * New upstream release. + * Bump Standards-Version. + * Run unit tests. + + -- Vincent Bernat Mon, 26 May 2014 16:30:25 +0200 + +binaryornot (0.2.0-1) unstable; urgency=low + + * New upstream release. + + Codebase has been improved. Closes: #722502. + + -- Vincent Bernat Sun, 29 Sep 2013 12:29:42 +0200 + +binaryornot (0.1.1-1) unstable; urgency=low + + * Initial release. Closes: #722156. + + -- Vincent Bernat Sun, 08 Sep 2013 16:41:15 +0200 diff --git a/compat b/compat new file mode 100644 index 0000000..7f8f011 --- /dev/null +++ b/compat @@ -0,0 +1 @@ +7 diff --git a/control b/control new file mode 100644 index 0000000..d7fc234 --- /dev/null +++ b/control @@ -0,0 +1,36 @@ +Source: binaryornot +Section: python +Priority: optional +Maintainer: Vincent Bernat +Uploaders: Debian Python Modules Team +Build-Depends: debhelper (>= 7.0.50~), dh-python, + python-all, python3-all, + python-setuptools, python3-setuptools, + python-chardet, python3-chardet, + python-hypothesis, python3-hypothesis +Standards-Version: 3.9.6 +Homepage: https://github.com/audreyr/binaryornot +Vcs-Git: git://anonscm.debian.org/python-modules/packages/binaryornot.git +Vcs-Browser: https://anonscm.debian.org/cgit/python-modules/packages/binaryornot.git + +Package: python-binaryornot +Architecture: all +Depends: ${python:Depends}, ${misc:Depends} +Description: check if a file is binary or text (Python 2 module) + This Python package provides a function to check if a file is a text + file or a binary file. It uses the same heuristic as file(1) by + looking at the first 1024 bytes of the file and checks that all + characters are printable. + . + This package contains the Python 2 module. + +Package: python3-binaryornot +Architecture: all +Depends: ${python3:Depends}, ${misc:Depends} +Description: check if a file is binary or text (Python 3 module) + This Python package provides a function to check if a file is a text + file or a binary file. It uses the same heuristic as file(1) by + looking at the first 1024 bytes of the file and checks that all + characters are printable. + . + This package contains the Python 3 module. diff --git a/copyright b/copyright new file mode 100644 index 0000000..fcbb586 --- /dev/null +++ b/copyright @@ -0,0 +1,43 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: BinaryOrNot +Upstream-Contact: Audrey Roy +Source: https://github.com/audreyr/binaryornot + +Files: * +Copyright: 2013 Audrey Roy +License: BSD-3-clause + +Files: debian/* +Copyright: 2013 Vincent Bernat +License: BSD-3-clause + +License: BSD-3-clause + Redistribution and use in source and binary forms, with or + without modification, are permitted provided that the following + conditions are met: + . + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + . + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + . + * Neither the name of border 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. diff --git a/rules b/rules new file mode 100755 index 0000000..f5c11ce --- /dev/null +++ b/rules @@ -0,0 +1,7 @@ +#!/usr/bin/make -f +# -*- mode: makefile; coding: utf-8 -*- + +export PYBUILD_NAME = binaryornot + +%: + dh $@ --with python2,python3 --buildsystem=pybuild diff --git a/source/format b/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/watch b/watch new file mode 100644 index 0000000..0ff548b --- /dev/null +++ b/watch @@ -0,0 +1,3 @@ +version=3 +opts=filenamemangle=s/.+\/v?(\d\S*)\.tar\.gz/binaryornot-$1.tar.gz/ \ + https://github.com/audreyr/binaryornot/releases .*/v?(\d\S*)\.tar\.gz -- cgit v1.2.3 From 1d3685ee633c5a43ebb5de3ebea5179d707e7f93 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Sun, 15 Nov 2015 15:05:18 -0700 Subject: Import binaryornot_0.4.0.orig.tar.gz [dgit import orig binaryornot_0.4.0.orig.tar.gz] --- .gitignore | 52 ++++++ .travis.yml | 16 ++ AUTHORS.rst | 30 +++ CONTRIBUTING.rst | 112 +++++++++++ HISTORY.rst | 54 ++++++ LICENSE | 12 ++ MANIFEST.in | 11 ++ README.rst | 62 ++++++ appveyor.yml | 36 ++++ appveyor/install.ps1 | 88 +++++++++ appveyor/setup_build_env.cmd | 16 ++ binaryornot/__init__.py | 3 + binaryornot/check.py | 25 +++ binaryornot/helpers.py | 129 +++++++++++++ docs/Makefile | 177 ++++++++++++++++++ docs/authors.rst | 1 + docs/binaryornot.rst | 27 +++ docs/conf.py | 259 ++++++++++++++++++++++++++ docs/contributing.rst | 1 + docs/history.rst | 1 + docs/index.rst | 26 +++ docs/installation.rst | 11 ++ docs/make.bat | 242 ++++++++++++++++++++++++ docs/modules.rst | 7 + docs/quickstart.rst | 13 ++ docs/readme.rst | 1 + requirements_dev.txt | 7 + setup.cfg | 2 + setup.py | 56 ++++++ tasks.py | 54 ++++++ tests/__init__.py | 0 tests/files/.DS_Store | Bin 0 -> 6148 bytes tests/files/bootstrap-glyphicons.css | 2 + tests/files/cookiecutter.json | 11 ++ tests/files/decoding-error | 1 + tests/files/empty.txt | 0 tests/files/glyphiconshalflings-regular.eot | Bin 0 -> 33358 bytes tests/files/glyphiconshalflings-regular.otf | Bin 0 -> 18116 bytes tests/files/glyphiconshalflings-regular.svg | 175 +++++++++++++++++ tests/files/glyphiconshalflings-regular.ttf | Bin 0 -> 32896 bytes tests/files/glyphiconshalflings-regular.woff | Bin 0 -> 18944 bytes tests/files/lena.gif | Bin 0 -> 16336 bytes tests/files/lena.jpg | Bin 0 -> 4788 bytes tests/files/logo.png | Bin 0 -> 4381 bytes tests/files/lookup-error | 1 + tests/files/palette-1c-8b.tiff | Bin 0 -> 25548 bytes tests/files/pixelstream.rgb | 67 +++++++ tests/files/rgb-3c-8b.bmp | Bin 0 -> 71298 bytes tests/files/robots.txt | 2 + tests/files/unicode.txt | 3 + tests/isBinaryFile/README.md | 25 +++ tests/isBinaryFile/encodings/big5.txt | 1 + tests/isBinaryFile/encodings/big5_B.txt | 22 +++ tests/isBinaryFile/encodings/bom_utf-16.txt | Bin 0 -> 94 bytes tests/isBinaryFile/encodings/bom_utf-16le.txt | Bin 0 -> 92 bytes tests/isBinaryFile/encodings/bom_utf-32.txt | Bin 0 -> 184 bytes tests/isBinaryFile/encodings/bom_utf-32le.txt | Bin 0 -> 184 bytes tests/isBinaryFile/encodings/bom_utf-8.txt | 1 + tests/isBinaryFile/encodings/test-gb.txt | 1 + tests/isBinaryFile/encodings/test-gb2.txt | 1 + tests/isBinaryFile/encodings/test-kr.txt | 1 + tests/isBinaryFile/encodings/test-latin.txt | 18 ++ tests/isBinaryFile/encodings/test-shishi.txt | 2 + tests/isBinaryFile/encodings/test-utf16be.txt | Bin 0 -> 100 bytes tests/isBinaryFile/encodings/utf8cn.txt | 1 + tests/isBinaryFile/encodings/utf_8.txt | 1 + tests/isBinaryFile/grep | Bin 0 -> 29664 bytes tests/isBinaryFile/index.js | 156 ++++++++++++++++ tests/isBinaryFile/no.lua | 2 + tests/isBinaryFile/null_file.gif | 0 tests/isBinaryFile/pdf.pdf | Bin 0 -> 81879 bytes tests/isBinaryFile/perl_script | 2 + tests/isBinaryFile/russian_file.rst | 49 +++++ tests/isBinaryFile/trunks.gif | Bin 0 -> 40074 bytes tests/test_check.py | 186 ++++++++++++++++++ tox.ini | 7 + 76 files changed, 2269 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 AUTHORS.rst create mode 100644 CONTRIBUTING.rst create mode 100644 HISTORY.rst create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 README.rst create mode 100644 appveyor.yml create mode 100644 appveyor/install.ps1 create mode 100644 appveyor/setup_build_env.cmd create mode 100644 binaryornot/__init__.py create mode 100644 binaryornot/check.py create mode 100644 binaryornot/helpers.py create mode 100644 docs/Makefile create mode 100644 docs/authors.rst create mode 100644 docs/binaryornot.rst create mode 100644 docs/conf.py create mode 100644 docs/contributing.rst create mode 100644 docs/history.rst create mode 100644 docs/index.rst create mode 100644 docs/installation.rst create mode 100644 docs/make.bat create mode 100644 docs/modules.rst create mode 100644 docs/quickstart.rst create mode 100644 docs/readme.rst create mode 100644 requirements_dev.txt create mode 100644 setup.cfg create mode 100755 setup.py create mode 100644 tasks.py create mode 100644 tests/__init__.py create mode 100644 tests/files/.DS_Store create mode 100755 tests/files/bootstrap-glyphicons.css create mode 100644 tests/files/cookiecutter.json create mode 100644 tests/files/decoding-error create mode 100644 tests/files/empty.txt create mode 100755 tests/files/glyphiconshalflings-regular.eot create mode 100755 tests/files/glyphiconshalflings-regular.otf create mode 100755 tests/files/glyphiconshalflings-regular.svg create mode 100755 tests/files/glyphiconshalflings-regular.ttf create mode 100755 tests/files/glyphiconshalflings-regular.woff create mode 100644 tests/files/lena.gif create mode 100644 tests/files/lena.jpg create mode 100644 tests/files/logo.png create mode 100644 tests/files/lookup-error create mode 100644 tests/files/palette-1c-8b.tiff create mode 100644 tests/files/pixelstream.rgb create mode 100644 tests/files/rgb-3c-8b.bmp create mode 100644 tests/files/robots.txt create mode 100644 tests/files/unicode.txt create mode 100644 tests/isBinaryFile/README.md create mode 100644 tests/isBinaryFile/encodings/big5.txt create mode 100644 tests/isBinaryFile/encodings/big5_B.txt create mode 100644 tests/isBinaryFile/encodings/bom_utf-16.txt create mode 100644 tests/isBinaryFile/encodings/bom_utf-16le.txt create mode 100644 tests/isBinaryFile/encodings/bom_utf-32.txt create mode 100644 tests/isBinaryFile/encodings/bom_utf-32le.txt create mode 100644 tests/isBinaryFile/encodings/bom_utf-8.txt create mode 100644 tests/isBinaryFile/encodings/test-gb.txt create mode 100644 tests/isBinaryFile/encodings/test-gb2.txt create mode 100644 tests/isBinaryFile/encodings/test-kr.txt create mode 100644 tests/isBinaryFile/encodings/test-latin.txt create mode 100644 tests/isBinaryFile/encodings/test-shishi.txt create mode 100644 tests/isBinaryFile/encodings/test-utf16be.txt create mode 100644 tests/isBinaryFile/encodings/utf8cn.txt create mode 100644 tests/isBinaryFile/encodings/utf_8.txt create mode 100755 tests/isBinaryFile/grep create mode 100644 tests/isBinaryFile/index.js create mode 100644 tests/isBinaryFile/no.lua create mode 100644 tests/isBinaryFile/null_file.gif create mode 100644 tests/isBinaryFile/pdf.pdf create mode 100644 tests/isBinaryFile/perl_script create mode 100644 tests/isBinaryFile/russian_file.rst create mode 100644 tests/isBinaryFile/trunks.gif create mode 100755 tests/test_check.py create mode 100644 tox.ini diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..540b759 --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +*.py[cod] + +# C extensions +*.so + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +lib +lib64 +.eggs + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox +nosetests.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Complexity +output/*.html +output/*/index.html + +# Sphinx +docs/_build + +# Coverage +htmlcov/ + +# Profiling +binaryornot_profile + +# Hypothesis +.hypothesis \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3b7d14f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,16 @@ +# Config file for automatic testing at travis-ci.org + +sudo: false +language: python +python: 2.7 +env: + - TOX_ENV=py26 + - TOX_ENV=py27 + - TOX_ENV=py33 + - TOX_ENV=py34 + - TOX_ENV=pypy + +script: tox -e $TOX_ENV + +install: + - pip install tox diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 0000000..7eba27f --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,30 @@ +======= +Credits +======= + +Development Lead +---------------- + +* Audrey Roy Greenfeld (`@audreyr`_) + +Contributors +------------ + +* Nick Coghlan (`@ncoghlan`_) +* Ville SkyttУЄ (`@scop`_) +* Vincent Bernat (`@vincentbernat`_) +* Daniel Roy Greenfeld (`@pydanny`_) +* Philippe Ombredanne (`@pombredanne`_) +* Aaron Meurer (`@asmeurer`_) +* David R. MacIver (`@DRMacIver`_) +* Raphael Pierzina (`@hackebrot`_) + +.. _`@audreyr`: https://github.com/audreyr +.. _`@ncoghlan`: https://github.com/ncoghlan +.. _`@scop`: https://github.com/scop +.. _`@vincentbernat`: https://github.com/vincentbernat +.. _`@pydanny`: https://github.com/pydanny +.. _`@pombredanne`: https://github.com/pombredanne +.. _`@asmeurer`: https://github.com/asmeurer +.. _`@DRMacIver`: https://github.com/DRMacIver +.. _`@hackebrot`: https://github.com/hackebrot diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 0000000..3c37a33 --- /dev/null +++ b/CONTRIBUTING.rst @@ -0,0 +1,112 @@ +============ +Contributing +============ + +Contributions are welcome, and they are greatly appreciated! Every +little bit helps, and credit will always be given. + +You can contribute in many ways: + +Types of Contributions +---------------------- + +Report Bugs +~~~~~~~~~~~ + +Report bugs at https://github.com/audreyr/binaryornot/issues. + +If you are reporting a bug, please include: + +* Your operating system name and version. +* Any details about your local setup that might be helpful in troubleshooting. +* Detailed steps to reproduce the bug. + +Fix Bugs +~~~~~~~~ + +Look through the GitHub issues for bugs. Anything tagged with "bug" +is open to whoever wants to implement it. + +Implement Features +~~~~~~~~~~~~~~~~~~ + +Look through the GitHub issues for features. Anything tagged with "feature" +is open to whoever wants to implement it. + +Write Documentation +~~~~~~~~~~~~~~~~~~~ + +BinaryOrNot could always use more documentation, whether as part of the +official BinaryOrNot docs, in docstrings, or even on the web in blog posts, +articles, and such. + +Submit Feedback +~~~~~~~~~~~~~~~ + +The best way to send feedback is to file an issue at https://github.com/audreyr/binaryornot/issues. + +If you are proposing a feature: + +* Explain in detail how it would work. +* Keep the scope as narrow as possible, to make it easier to implement. +* Remember that this is a volunteer-driven project, and that contributions + are welcome :) + +Get Started! +------------ + +Ready to contribute? Here's how to set up `binaryornot` for local development. + +1. Fork the `binaryornot` repo on GitHub. +2. Clone your fork locally:: + + $ git clone git@github.com:your_name_here/binaryornot.git + +3. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up your fork for local development:: + + $ mkvirtualenv binaryornot + $ cd binaryornot/ + $ python setup.py develop + +4. Create a branch for local development:: + + $ git checkout -b name-of-your-bugfix-or-feature + +Now you can make your changes locally. + +5. When you're done making changes, check that your changes pass flake8 and the +tests, including testing other Python versions with tox:: + + $ flake8 binaryornot tests + $ python setup.py test + $ tox + +To get flake8 and tox, just pip install them into your virtualenv. + +6. Commit your changes and push your branch to GitHub:: + + $ git add . + $ git commit -m "Your detailed description of your changes." + $ git push origin name-of-your-bugfix-or-feature + +7. Submit a pull request through the GitHub website. + +Pull Request Guidelines +----------------------- + +Before you submit a pull request, check that it meets these guidelines: + +1. The pull request should include tests. +2. If the pull request adds functionality, the docs should be updated. Put + your new functionality into a function with a docstring, and add the + feature to the list in README.rst. +3. The pull request should work for Python 2.6, 2.7, and 3.3, and for PyPy. Check + https://travis-ci.org/audreyr/binaryornot/pull_requests + and make sure that the tests pass for all supported Python versions. + +Tips +---- + +To run a subset of tests:: + + $ python -m unittest tests.test_binaryornot \ No newline at end of file diff --git a/HISTORY.rst b/HISTORY.rst new file mode 100644 index 0000000..9d6858f --- /dev/null +++ b/HISTORY.rst @@ -0,0 +1,54 @@ +.. :changelog: + +History +------- + +0.4.0 (2015-08-21) +~~~~~~~~~~~~~~~~~~ + +* Enhanced detection for some binary streams and UTF texts. (#10, 11) Thanks `@pombredanne`_. +* Set up Appveyor for continuous testing on Windows. Thanks `@pydanny`_. +* Update link to Perl source implementation. (#9) Thanks `@asmeurer`_ `@pombredanne`_ `@audreyr`_. +* Handle UnicodeDecodeError in check. (#12) Thanks `@DRMacIver`_. +* Add very simple Hypothesis based tests. (#13) Thanks `@DRMacIver`_. +* Use setup to determine requirements and remove redundant requirements.txt. (#14) Thanks `@hackebrot`_. +* Add documentation status badge to README.rst. (#15) Thanks `@hackebrot`_. +* Run tox in travis.yml. Add pypy and Python 3.4 to tox enviroments. (#16) Thanks `@hackebrot`_ `@pydanny`_. +* Handle LookupError when detecting encoding. (#17) Thanks `@DRMacIver`_. + + +.. _`@pombredanne`: https://github.com/pombredanne +.. _`@pydanny`: https://github.com/pydanny +.. _`@asmeurer`: https://github.com/asmeurer +.. _`@audreyr`: https://github.com/audreyr +.. _`@DRMacIver`: https://github.com/DRMacIver +.. _`@hackebrot`: https://github.com/hackebrot + +0.3.0 (2014-05-05) +~~~~~~~~~~~~~~~~~~ + +* Include tests, docs in source package. (#6) Thanks `@vincentbernat`_. +* Drop unnecessary shebangs and executable bits. (#8) Thanks `@scop`_. +* Generate string of printable extended ASCII bytes only once. (#7) Thanks `@scop`_. +* Make number of bytes to read parametrizable. (#7) Thanks `@scop`_. + +.. _`@vincentbernat`: https://github.com/vincentbernat +.. _`@scop`: https://github.com/scop + +0.2.0 (2013-09-22) +~~~~~~~~~~~~~~~~~~ + +* Complete rewrite of everything. Thanks `@ncoghlan`_. + +.. _`@ncoghlan`: https://github.com/ncoghlan + +0.1.1 (2013-08-17) +~~~~~~~~~~~~~~~~~~ + +* Tests pass under Python 2.6, 2.7, 3.3, PyPy. + + +0.1.0 (2013-08-17) +~~~~~~~~~~~~~~~~~~ + +* First release on PyPI. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c5460c1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2013, Audrey Roy +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of BinaryOrNot 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. \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..2bb6bb1 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,11 @@ +include AUTHORS.rst +include CONTRIBUTING.rst +include HISTORY.rst +include LICENSE +include README.rst + +recursive-include tests * +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] + +recursive-include docs *.rst conf.py Makefile make.bat diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..b3afe2d --- /dev/null +++ b/README.rst @@ -0,0 +1,62 @@ +============================= +BinaryOrNot +============================= + +.. image:: https://badge.fury.io/py/binaryornot.png + :target: http://badge.fury.io/py/binaryornot + +.. image:: https://travis-ci.org/audreyr/binaryornot.png?branch=master + :target: https://travis-ci.org/audreyr/binaryornot + +.. image:: https://readthedocs.org/projects/binaryornot/badge/?version=latest + :target: https://readthedocs.org/projects/binaryornot/?badge=latest + :alt: Documentation Status + + +Ultra-lightweight pure Python package to guess whether a file is binary or text, +using a heuristic similar to Perl's `pp_fttext` and its analysis by @eliben. + +* Free software: BSD license +* Documentation: http://binaryornot.readthedocs.org + +Status +------ + +It works, and people are using this package in various places. But it doesn't cover all edge cases yet. + +The code could be improved. Pull requests welcome! As of now, it is based on these snippets, but that may change: + +* http://stackoverflow.com/questions/898669/how-can-i-detect-if-a-file-is-binary-non-text-in-python +* http://stackoverflow.com/questions/1446549/how-to-identify-binary-and-text-files-using-python +* http://code.activestate.com/recipes/173220/ +* http://eli.thegreenplace.net/2011/10/19/perls-guess-if-file-is-text-or-binary-implemented-in-python/ + +Features +-------- + +Has tests for these file types: + +* Text: .txt, .css, .json, .svg, .js, .lua, .pl, .rst +* Binary: .png, .gif, .jpg, .tiff, .bmp, .DS_Store, .eot, .otf, .ttf, .woff, .rgb + +Has tests for numerous encodings. + +Why? +---- + +You may be thinking, "I can write this in 2 lines of code?!" + +It's actually not that easy. Here's a great article about how *perldoc*'s +heuristic to guess file types works: http://eli.thegreenplace.net/2011/10/19/perls-guess-if-file-is-text-or-binary-implemented-in-python/ + +And that's just where we started. Over time, we've found more edge cases and +our heuristic has gotten more complex. + +Also, this package saves you from having to write and thoroughly test +your code with all sorts of weird file types and encodings, cross-platform. + +Credits +------- + +* Special thanks to Eli Bendersky (@eliben) for his writeup explaining the heuristic and his implementation, which this is largely based on. +* Source code from the portion of Perl's `pp_fttext` that checks for textiness: https://github.com/Perl/perl5/blob/v5.23.1/pp_sys.c#L3527-L3587 diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..54ff1d5 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,36 @@ +environment: + matrix: + - PYTHON: "C:\\Python27" + PYTHON_VERSION: "2.7.9" + PYTHON_ARCH: "32" + TOX_ENV: "py27" + + - PYTHON: "C:\\Python33" + PYTHON_VERSION: "3.3.5" + PYTHON_ARCH: "32" + TOX_ENV: "py33" + + - PYTHON: "C:\\Python34" + PYTHON_VERSION: "3.4.3" + PYTHON_ARCH: "32" + TOX_ENV: "py34" + + +init: + - "ECHO %PYTHON% %PYTHON_VERSION% %PYTHON_ARCH%" + +install: + - "appveyor/setup_build_env.cmd" + - "powershell appveyor/install.ps1" + +build: false # Not a C# project, build stuff at the test step instead. + +test_script: + - "%PYTHON%/python setup.py test" + +after_test: + - "%PYTHON%/python setup.py bdist_wheel" + - ps: "ls dist" + +artifacts: + - path: dist\* diff --git a/appveyor/install.ps1 b/appveyor/install.ps1 new file mode 100644 index 0000000..20ae59b --- /dev/null +++ b/appveyor/install.ps1 @@ -0,0 +1,88 @@ +# Sample script to install Python and pip under Windows +# Authors: Olivier Grisel and Kyle Kastner +# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ + +$BASE_URL = "https://www.python.org/ftp/python/" +$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py" +$GET_PIP_PATH = "C:\get-pip.py" + + +function DownloadPython ($python_version, $platform_suffix) { + $webclient = New-Object System.Net.WebClient + $filename = "python-" + $python_version + $platform_suffix + ".msi" + $url = $BASE_URL + $python_version + "/" + $filename + + $basedir = $pwd.Path + "\" + $filepath = $basedir + $filename + if (Test-Path $filename) { + Write-Host "Reusing" $filepath + return $filepath + } + + # Download and retry up to 5 times in case of network transient errors. + Write-Host "Downloading" $filename "from" $url + $retry_attempts = 3 + for($i=0; $i -lt $retry_attempts; $i++){ + try { + $webclient.DownloadFile($url, $filepath) + break + } + Catch [Exception]{ + Start-Sleep 1 + } + } + Write-Host "File saved at" $filepath + return $filepath +} + + +function InstallPython ($python_version, $architecture, $python_home) { + Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home + if (Test-Path $python_home) { + Write-Host $python_home "already exists, skipping." + return $false + } + if ($architecture -eq "32") { + $platform_suffix = "" + } else { + $platform_suffix = ".amd64" + } + $filepath = DownloadPython $python_version $platform_suffix + Write-Host "Installing" $filepath "to" $python_home + $args = "/qn /i $filepath TARGETDIR=$python_home" + Write-Host "msiexec.exe" $args + Start-Process -FilePath "msiexec.exe" -ArgumentList $args -Wait -Passthru + Write-Host "Python $python_version ($architecture) installation complete" + return $true +} + + +function InstallPip ($python_home) { + $pip_path = $python_home + "/Scripts/pip.exe" + $python_path = $python_home + "/python.exe" + if (-not(Test-Path $pip_path)) { + Write-Host "Installing pip..." + $webclient = New-Object System.Net.WebClient + $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH) + Write-Host "Executing:" $python_path $GET_PIP_PATH + Start-Process -FilePath "$python_path" -ArgumentList "$GET_PIP_PATH" -Wait -Passthru + } else { + Write-Host "pip already installed." + } +} + +function InstallPackage ($python_home, $pkg) { + $pip_path = $python_home + "/Scripts/pip.exe" + & $pip_path install $pkg +} + +function main () { + InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON + InstallPip $env:PYTHON + InstallPackage $env:PYTHON tox + InstallPackage $env:PYTHON wheel + InstallPackage $env:PYTHON setuptools + InstallPackage $env:PYTHON hypothesis +} + +main diff --git a/appveyor/setup_build_env.cmd b/appveyor/setup_build_env.cmd new file mode 100644 index 0000000..77fcbf6 --- /dev/null +++ b/appveyor/setup_build_env.cmd @@ -0,0 +1,16 @@ +:: To build extensions for 64 bit Python 3, we need to configure environment +:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of: +:: MS Windows SDK for Windows 7 and .NET Framework 4 +:: +:: More details at: +:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows + +IF "%PYTHON_ARCH%"=="64" ( + ECHO Configuring environment to build with MSVC on a 64bit architecture + ECHO Using Windows SDK %WINDOWS_SDK_VERSION% + "C:\Program Files\Microsoft SDKs\Windows\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release + SET DISTUTILS_USE_SDK=1 + SET MSSdk=1 +) ELSE ( + ECHO Using default MSVC build environment for 32bit architecture +) diff --git a/binaryornot/__init__.py b/binaryornot/__init__.py new file mode 100644 index 0000000..c3f85a4 --- /dev/null +++ b/binaryornot/__init__.py @@ -0,0 +1,3 @@ +__author__ = 'Audrey Roy' +__email__ = 'audreyr@gmail.com' +__version__ = '0.4.0' diff --git a/binaryornot/check.py b/binaryornot/check.py new file mode 100644 index 0000000..77da12c --- /dev/null +++ b/binaryornot/check.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- + +""" +binaryornot.check +----------------- + +Main code for checking if a file is binary or text. +""" + +import logging + +from .helpers import get_starting_chunk, is_binary_string + + +logger = logging.getLogger(__name__) + + +def is_binary(filename): + """ + :param filename: File to check. + :returns: True if it's a binary file, otherwise False. + """ + logger.debug('is_binary: %(filename)r' % locals()) + chunk = get_starting_chunk(filename) + return is_binary_string(chunk) diff --git a/binaryornot/helpers.py b/binaryornot/helpers.py new file mode 100644 index 0000000..ee45c1e --- /dev/null +++ b/binaryornot/helpers.py @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- + + +""" +binaryornot.helpers +------------------- + +Helper utilities used by BinaryOrNot. +""" + +import chardet +import logging + + +logger = logging.getLogger(__name__) + + +def print_as_hex(s): + """ + Print a string as hex bytes. + """ + print(":".join("{0:x}".format(ord(c)) for c in s)) + + +def get_starting_chunk(filename, length=1024): + """ + :param filename: File to open and get the first little chunk of. + :param length: Number of bytes to read, default 1024. + :returns: Starting chunk of bytes. + """ + # Ensure we open the file in binary mode + with open(filename, 'rb') as f: + chunk = f.read(length) + return chunk + + +_control_chars = b'\n\r\t\f\b' +if bytes is str: + # Python 2 means we need to invoke chr() explicitly + _printable_ascii = _control_chars + b''.join(map(chr, range(32, 127))) + _printable_high_ascii = b''.join(map(chr, range(127, 256))) +else: + # Python 3 means bytes accepts integer input directly + _printable_ascii = _control_chars + bytes(range(32, 127)) + _printable_high_ascii = bytes(range(127, 256)) + + +def is_binary_string(bytes_to_check): + """ + :param bytes: A chunk of bytes to check. + :returns: True if appears to be a binary, otherwise False. + """ + # Uses a simplified version of the Perl detection algorithm, + # based roughly on Eli Bendersky's translation to Python: + # http://eli.thegreenplace.net/2011/10/19/perls-guess-if-file-is-text-or-binary-implemented-in-python/ + + # This is biased slightly more in favour of deeming files as text + # files than the Perl algorithm, since all ASCII compatible character + # sets are accepted as text, not just utf-8 + + # Empty files are considered text files + if not bytes_to_check: + return False + + # Now check for a high percentage of ASCII control characters + # Binary if control chars are > 30% of the string + low_chars = bytes_to_check.translate(None, _printable_ascii) + nontext_ratio1 = float(len(low_chars)) / float(len(bytes_to_check)) + logger.debug('nontext_ratio1: %(nontext_ratio1)r' % locals()) + + # and check for a low percentage of high ASCII characters: + # Binary if high ASCII chars are < 5% of the string + # From: https://en.wikipedia.org/wiki/UTF-8 + # If the bytes are random, the chances of a byte with the high bit set + # starting a valid UTF-8 character is only 6.64%. The chances of finding 7 + # of these without finding an invalid sequence is actually lower than the + # chance of the first three bytes randomly being the UTF-8 BOM. + + high_chars = bytes_to_check.translate(None, _printable_high_ascii) + nontext_ratio2 = float(len(high_chars)) / float(len(bytes_to_check)) + logger.debug('nontext_ratio2: %(nontext_ratio2)r' % locals()) + + is_likely_binary = ( + (nontext_ratio1 > 0.3 and nontext_ratio2 < 0.05) + or + (nontext_ratio1 > 0.8 and nontext_ratio2 > 0.8) + ) + logger.debug('is_likely_binary: %(is_likely_binary)r' % locals()) + + # then check for binary for possible encoding detection with chardet + detected_encoding = chardet.detect(bytes_to_check) + logger.debug('detected_encoding: %(detected_encoding)r' % locals()) + + # finally use all the check to decide binary or text + decodable_as_unicode = False + if (detected_encoding['confidence'] > 0.9 + and detected_encoding['encoding'] != 'ascii'): + try: + try: + bytes_to_check.decode(encoding=detected_encoding['encoding']) + except TypeError: + # happens only on Python 2.6 + unicode(bytes_to_check, encoding=detected_encoding['encoding']) + decodable_as_unicode = True + logger.debug('success: decodable_as_unicode: ' + '%(decodable_as_unicode)r' % locals()) + except LookupError: + logger.debug('failure: could not look up encoding %(encoding)s' % + detected_encoding) + except UnicodeDecodeError: + logger.debug('failure: decodable_as_unicode: ' + '%(decodable_as_unicode)r' % locals()) + + logger.debug('failure: decodable_as_unicode: ' + '%(decodable_as_unicode)r' % locals()) + if is_likely_binary: + if decodable_as_unicode: + return False + else: + return True + else: + if decodable_as_unicode: + return False + else: + if b'\x00' in bytes_to_check or b'\xff' in bytes_to_check: + # Check for NULL bytes last + logger.debug('has nulls:' + repr(b'\x00' in bytes_to_check)) + return True + return False diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..1005e26 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/complexity.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/complexity.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/complexity" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/complexity" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." \ No newline at end of file diff --git a/docs/authors.rst b/docs/authors.rst new file mode 100644 index 0000000..94292d0 --- /dev/null +++ b/docs/authors.rst @@ -0,0 +1 @@ +.. include:: ../AUTHORS.rst \ No newline at end of file diff --git a/docs/binaryornot.rst b/docs/binaryornot.rst new file mode 100644 index 0000000..3e31edc --- /dev/null +++ b/docs/binaryornot.rst @@ -0,0 +1,27 @@ +binaryornot Package +=================== + +:mod:`binaryornot` Package +-------------------------- + +.. automodule:: binaryornot.__init__ + :members: + :undoc-members: + :show-inheritance: + +:mod:`check` Module +------------------- + +.. automodule:: binaryornot.check + :members: + :undoc-members: + :show-inheritance: + +:mod:`helpers` Module +--------------------- + +.. automodule:: binaryornot.helpers + :members: + :undoc-members: + :show-inheritance: + diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..2ffc56c --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,259 @@ +# -*- coding: utf-8 -*- +# +# complexity documentation build configuration file, created by +# sphinx-quickstart on Tue Jul 9 22:26:36 2013. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# Get the project root dir, which is the parent dir of this +cwd = os.getcwd() +project_root = os.path.dirname(cwd) + +# Insert the project root dir as the first element in the PYTHONPATH. +# This lets us ensure that the source package is imported, and that its +# version is used. +sys.path.insert(0, project_root) + +import binaryornot + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'BinaryOrNot' +copyright = u'2013, Audrey Roy' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = binaryornot.__version__ +# The full version, including alpha/beta/rc tags. +release = binaryornot.__version__ + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'binaryornotdoc' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'binaryornot.tex', u'BinaryOrNot Documentation', + u'Audrey Roy', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'binaryornot', u'BinaryOrNot Documentation', + [u'Audrey Roy'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'binaryornot', u'BinaryOrNot Documentation', + u'Audrey Roy', 'binaryornot', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False \ No newline at end of file diff --git a/docs/contributing.rst b/docs/contributing.rst new file mode 100644 index 0000000..3bdd7dc --- /dev/null +++ b/docs/contributing.rst @@ -0,0 +1 @@ +.. include:: ../CONTRIBUTING.rst \ No newline at end of file diff --git a/docs/history.rst b/docs/history.rst new file mode 100644 index 0000000..bec23d8 --- /dev/null +++ b/docs/history.rst @@ -0,0 +1 @@ +.. include:: ../HISTORY.rst \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..580f0b0 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,26 @@ +.. complexity documentation master file, created by + sphinx-quickstart on Tue Jul 9 22:26:36 2013. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to BinaryOrNot's documentation! +====================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + + readme + installation + quickstart + contributing + authors + history + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 0000000..078f1cb --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,11 @@ +============ +Installation +============ + +At the command line:: + + $ easy_install binaryornot + +Or, if you have `pip`:: + + $ pip install binaryornot diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..2b44764 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,242 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\complexity.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\complexity.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end \ No newline at end of file diff --git a/docs/modules.rst b/docs/modules.rst new file mode 100644 index 0000000..92254b7 --- /dev/null +++ b/docs/modules.rst @@ -0,0 +1,7 @@ +binaryornot +=========== + +.. toctree:: + :maxdepth: 4 + + binaryornot diff --git a/docs/quickstart.rst b/docs/quickstart.rst new file mode 100644 index 0000000..ff30c31 --- /dev/null +++ b/docs/quickstart.rst @@ -0,0 +1,13 @@ +========== +Quickstart +========== + +To use BinaryOrNot in a project, import it and use `is_binary()` to guess +whether a file is binary or text. + +For example:: + + >>> from binaryornot.check import is_binary + >>> is_binary('README.rst') + False + diff --git a/docs/readme.rst b/docs/readme.rst new file mode 100644 index 0000000..6b2b3ec --- /dev/null +++ b/docs/readme.rst @@ -0,0 +1 @@ +.. include:: ../README.rst \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt new file mode 100644 index 0000000..cecc5a6 --- /dev/null +++ b/requirements_dev.txt @@ -0,0 +1,7 @@ +# The following are for local development +invoke +flake8 +autopep8 +Sphinx +coverage +tox diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..0a8df87 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[wheel] +universal = 1 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..a0ee5e3 --- /dev/null +++ b/setup.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python + +import os +import sys + +import binaryornot + +try: + from setuptools import setup +except ImportError: + from distutils.core import setup + + +# Python 2.6 does not have expectedFailre, unittest2 is a backport +tests_require = ['hypothesis'] +try: + from unittest.case import expectedFailure +except ImportError: + tests_require.append('unittest2') + +readme = open('README.rst').read() +history = open('HISTORY.rst').read().replace('.. :changelog:', '') + +setup( + name='binaryornot', + version='0.4.0', + description='Ultra-lightweight pure Python package to check if a file is binary or text.', + long_description=readme + '\n\n' + history, + author='Audrey Roy', + author_email='audreyr@gmail.com', + url='https://github.com/audreyr/binaryornot', + packages=[ + 'binaryornot', + ], + package_dir={'binaryornot': 'binaryornot'}, + include_package_data=True, + install_requires=[ + 'chardet>=2.0.0', + ], + tests_require = tests_require, + license="BSD", + zip_safe=False, + keywords='binaryornot', + classifiers=[ + 'Development Status :: 4 - Beta', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: BSD License', + 'Natural Language :: English', + "Programming Language :: Python :: 2", + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + ], + test_suite='tests', +) diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..508071e --- /dev/null +++ b/tasks.py @@ -0,0 +1,54 @@ +from invoke import task, run + +@task +def clean_docs(): + run("rm -rf docs/_build") + run("rm -rf docs/binaryornot.rst") + run("rm -rf docs/modules.rst") + +@task('clean_docs') +def docs(): + run("sphinx-apidoc -o docs/ binaryornot/") + run("sphinx-build docs docs/_build") + run("open docs/_build/index.html") + +@task +def flake8(): + run("flake8 binaryornot tests") + +@task +def autopep8(): + run("autopep8 --in-place --aggressive -r binaryornot") + run("autopep8 --in-place --aggressive -r tests") + +@task +def test(): + run("python setup.py test") + +@task +def coverage(): + run("coverage run --source binaryornot setup.py test") + run("coverage report -m") + run("coverage html") + run("open htmlcov/index.html") + +@task +def clean_build(): + run("rm -fr build/") + run("rm -fr dist/") + run("rm -fr *.egg-info") + +@task +def clean_pyc(): + run("find . -name '*.pyc' -exec rm -f {} +") + run("find . -name '*.pyo' -exec rm -f {} +") + run("find . -name '*~' -exec rm -f {} +") + +@task('clean_build', 'clean_pyc') +def sdist(): + run("python setup.py sdist") + run("ls -l dist") + +@task('sdist') +def release(): + run("python setup.py upload") diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/.DS_Store b/tests/files/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/tests/files/.DS_Store differ diff --git a/tests/files/bootstrap-glyphicons.css b/tests/files/bootstrap-glyphicons.css new file mode 100755 index 0000000..34ba265 --- /dev/null +++ b/tests/files/bootstrap-glyphicons.css @@ -0,0 +1,2 @@ +@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphiconshalflings-regular.eot');src:url('../fonts/glyphiconshalflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphiconshalflings-regular.woff') format('woff'),url('../fonts/glyphiconshalflings-regular.ttf') format('truetype'),url('../fonts/glyphiconshalflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon:before{font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-plus:before{content:"\002b"}.glyphicon-minus:before{content:"\2212"}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse:before{content:"\e159"}.glyphicon-collapse-top:before{content:"\e160"} +/* This beautiful CSS-File has been crafted with LESS (lesscss.org) and compiled by simpLESS (wearekiss.com/simpless) */ diff --git a/tests/files/cookiecutter.json b/tests/files/cookiecutter.json new file mode 100644 index 0000000..43ed688 --- /dev/null +++ b/tests/files/cookiecutter.json @@ -0,0 +1,11 @@ +{ + "full_name": "Audrey Roy", + "email": "audreyr@gmail.com", + "github_username": "audreyr", + "project_name": "Python Boilerplate", + "repo_name": "boilerplate", + "project_short_description": "Python Boilerplate contains all the boilerplate you need to create a Python package.", + "release_date": "2013-08-11", + "year": "2013", + "version": "0.1.0" +} diff --git a/tests/files/decoding-error b/tests/files/decoding-error new file mode 100644 index 0000000..6b3a997 --- /dev/null +++ b/tests/files/decoding-error @@ -0,0 +1 @@ +ЎХм \ No newline at end of file diff --git a/tests/files/empty.txt b/tests/files/empty.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/files/glyphiconshalflings-regular.eot b/tests/files/glyphiconshalflings-regular.eot new file mode 100755 index 0000000..bd59ccd Binary files /dev/null and b/tests/files/glyphiconshalflings-regular.eot differ diff --git a/tests/files/glyphiconshalflings-regular.otf b/tests/files/glyphiconshalflings-regular.otf new file mode 100755 index 0000000..b058f1c Binary files /dev/null and b/tests/files/glyphiconshalflings-regular.otf differ diff --git a/tests/files/glyphiconshalflings-regular.svg b/tests/files/glyphiconshalflings-regular.svg new file mode 100755 index 0000000..0fb4587 --- /dev/null +++ b/tests/files/glyphiconshalflings-regular.svg @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/files/glyphiconshalflings-regular.ttf b/tests/files/glyphiconshalflings-regular.ttf new file mode 100755 index 0000000..c63c068 Binary files /dev/null and b/tests/files/glyphiconshalflings-regular.ttf differ diff --git a/tests/files/glyphiconshalflings-regular.woff b/tests/files/glyphiconshalflings-regular.woff new file mode 100755 index 0000000..4c778ff Binary files /dev/null and b/tests/files/glyphiconshalflings-regular.woff differ diff --git a/tests/files/lena.gif b/tests/files/lena.gif new file mode 100644 index 0000000..64a9b93 Binary files /dev/null and b/tests/files/lena.gif differ diff --git a/tests/files/lena.jpg b/tests/files/lena.jpg new file mode 100644 index 0000000..ed01c4e Binary files /dev/null and b/tests/files/lena.jpg differ diff --git a/tests/files/logo.png b/tests/files/logo.png new file mode 100644 index 0000000..e04d51e Binary files /dev/null and b/tests/files/logo.png differ diff --git a/tests/files/lookup-error b/tests/files/lookup-error new file mode 100644 index 0000000..0b47449 --- /dev/null +++ b/tests/files/lookup-error @@ -0,0 +1 @@ +ХАЦЦЦЦЦЦ \ No newline at end of file diff --git a/tests/files/palette-1c-8b.tiff b/tests/files/palette-1c-8b.tiff new file mode 100644 index 0000000..b87685a Binary files /dev/null and b/tests/files/palette-1c-8b.tiff differ diff --git a/tests/files/pixelstream.rgb b/tests/files/pixelstream.rgb new file mode 100644 index 0000000..b4183a3 --- /dev/null +++ b/tests/files/pixelstream.rgb @@ -0,0 +1,67 @@ +џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўў§§§ћћћњњњјјјїїїіііѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕѕїїїјјјљљљњњњћћћ§§§ўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§њњњїїїєєє№№№ьььщщщцццхххххххххххххххххххххххххххххххххффффффффффффффффффффффффффффффффффффхххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххшшшыыыяяяђђђѕѕѕљљљќќќўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўћћћіііёёёыыыхххпппкккеееггггггггггггггггггггггггвввббббббЯЯЯЮЮЮЮЮЮЭЭЭЭЭЭЭЭЭЮЮЮЮЮЮЮЮЮЮЮЮЯЯЯЯЯЯбббвввгггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггггввввввбббаааЯЯЯЯЯЯЮЮЮЯЯЯЯЯЯаааббббббввввввгггггггггггггггггггггггггггггггггдддииинннууушшшюююєєєњњњўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўњњњђђђъъъШШШІІІ   œœœ–––•••••••••••••••“““’’’’’’‘‘‘ŽŽŽŒŒŒ‹‹‹ŠŠŠŠŠŠŠŠŠ‹‹‹‹‹‹ŒŒŒŽŽŽ’’’“““”””•••–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––————————————–––•••””””””“““’’’’’’‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’’’“““””””””•••–––———————————————––––––—————————————————————––––––••••••””””””””””””””””””••••••––––––——————————————————————————————––––––––––––•••••••••••••••••••••••••••••••••••••••••••••••••••––––––––––––—————————————————————•••”””’’’‘‘‘ŽŽŽŒŒŒ‹‹‹ŒŒŒ’’’”””•••–––————————————————————————–––––––––™™™ŸŸŸЄЄЄгггчччяяяїїї§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўјјјюююфффoooЃЃЃррръъъѕѕѕ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўіііъъъоооkkkžžžкккхххђђђќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§єєєццциииggg'%# #" $" (&$*'%*(&+(&,)'*(')'% &$#(%#*'%+(&+(&,)' //////........./// +(&+)')'&)&%)&$'$"&#!$" %"!#!#! # $" %"!&$"(%#)'%*(&,)(-*(-*(-*(-+)-+).+),*(*)'*(&$" (&$(&$*(&+)&-*(-+),*(-+)-*(,*(+(&)&%'&$'$#(&$*(&+(&,)'-+)-+).+)-*(,)',)',*(+(')'%'%# ™™™гггррряяяћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ѓѓѓтттгггdddJA:nM3џџџўўўњњњѕѕѕёёёьььцццррркккдддЮЮЮЃЃЃVVV ИИИжжжмммууущщщT6Z:!0jG,qM0[=|U6d<f?!`;8)08)08)08*18*18*18*18*18*18*18*18*18*18*1=/5mK1wT8uQ4xR4†`AqJ+///™™™™™™˜˜˜–––™™™™™™,)'pH)|U8Z~V5‡_>tK+mD$nE%X8ƒ[;tL-a:3! nK0jF)hC%sK-‚Z:‰`@X8h?pG'kD#nG(qL/uR7џџџџџџ§§§ћћћљљљііієєєV4]:`;pI*xO/‡^>gGZ9|T4„]>oH)qK,kE)uR6mJ/%#!”””ЭЭЭмммюююћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ђђђррраааcccH>7iG.џџџ§§§јјјѓѓѓэээчччрррккк’’’ZZZ%%%''' ЙЙЙйййррршшшbF-\<#1 fC(‚^AhI’iIŽeE|T5wS55'.5'.5'.5'.5'.5'.5'.5'.6(/6(/6(/6(/6(/6(/:-3jI/vR7wR5zT6uM.mD$000ŸŸŸŸŸŸœœœ›››žžžŸŸŸ.+)tL,~W8zT7\@WC3T8#џџџџџџ§§§ћћћљљљііієєєgD(sN2{U6‚Y8~T2…[9|R0…[9cA˜mL˜nL’iIsL-;( +mJ/iE(qJ-yQ1–kKЃxV—mKcA†[:…[:tL,oI,uR6џџџџџџ§§§ћћћљљљііієєєtS9qL0{U7sJ+uJ(Œa?gE‰_>…\…]=ŽdB{R1   ЋЋЋЈЈЈЇЇЇЉЉЉЋЋЋ2/-†\9ˆ^<‹cBS;( џџџџџџ§§§ћћћљљљііієєєrN1xQ3ŒcC•jHšmI˜jFa=‹]8‰[6ƒU0ƒU1†Z8uL+3  oK/vO1‚Y8~S1‡Z6Œ]9‰[6S.}N*Š]:Œa?€W8|W:џџџџџџ§§§ћћћљљљііієєє`>"fA#sK*Š_<Ža=™kF™lH•iGŠ`>ˆ_>zQ1"'c@%cA'$#!‘‘‘ЪЪЪйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааdddE<5a="ўўўћћћѕѕѕюююцццпппlll 444<<lB Š]8†W1xK(sI)6(/6(/6(/6(/6(/6(/6(/6(/6(/6(/6(/6(/6(/ + EEEИИИДДДГГГЖЖЖИИИ41.xI$wI&pD#oF' џџџџџџ§§§ћћћљљљііієєє^9nF&qF#‚S.‡U/xF„R+ˆV/ˆV/ƒQ*…T-xJ%rF$6!`;lD%wL+|M)ƒR,€O(—e>Ž\5„R+ˆW1xK&qF$g?!џџџџџџ§§§ћћћљљљііієєєgB&kC$xM*~O*P)€O'Q*€P,{N+tI'C:+ЁІƒdgPV3`>$&#!’’’ЪЪЪйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааnnn^YThE(ўўўћћћѕѕѕэээхххннн666***>>>BBBGGGKKKOOOSSSWWWOOO666ˆˆˆрррччч^A*iJ24$ +nJ.‰aB–kHœmHЁqJ›mG‘fC8)08)08)08)06(/7(/8)08)07)07)08)08*19*1=/5yT6ƒ[:T2‘d@žnH›jDПППМММЙЙЙНННППП742”e>—hDb?{Q1>+џџџџџџ§§§ћћћљљљііієєєwR4Ša@d@Ž^7 mEЏ|Sšg>•b9ЌyPГWЋyPškE‘eAB- +}X:|T4†Z7‘b<ЌzRЏ|SЇtK­zQ­zQЄrIІvPa=‚Y8џџџџџџ§§§ћћћљљљііієєє€Z;‹a@–iEЅuN–c;ЃqH›jBŠ[5“fCmYA‘—zŠ’sŠ’seiU;*=<<ІІІЪЪЪйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааvqmxU8ўўўћћћєєєьььхххннн666555LLLPPPTTTYYYKKK*** OOOБББррршшш`C,eH0/ wT8…]>šoM—gBŸmFІvP›nJ }U5dB—jF_;ЂrLЅtMРРРМММЛЛЛПППРРР963›kD`:•iEŒcBmH,џџџџџџ§§§ћћћљљљііієєє€Y:~T2›mIЇvO–b:Б}TЇsJЋwNБ}TЗƒZЗ„[–e>™kGF1  ~X:ŽdC”gC pJВWК†]ЇsJЉuLВ~UЋxOЌzT‘c>‘fDџџџџџџ§§§ћћћљљљііієєєƒZ:—kIŸqLА~WЁnEЇtKІtLœmHŠ^;|r]лоНфшХфшХЪШЌ ИЗЗЌЌЌЪЪЪйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББІЁtP4ўўўћћћєєєьььхххннн666@@@ZZZ@@@%%% RRR“““ЪЪЪбббйййсссшшшeI1gH16& zW;„\=’gDЃuPЌ|UЁqJ›mI˜lJŠbBƒ]>qL0sP4wU:wU:;):(sQ6rP5xU;{Y>rP54$dG1‰aA“iG`=–iDЇxSЋ{TЌ{UРРРМММЛЛЛПППРРР963ЇwPЊ{U‘d@‰`>‹cD1"џџџџџџ§§§ћћћљљљііієєєŠaA›oLœmHЃqJВVЙ…\В~UЗƒZЖ‚YВ~UВV­|UЅvRG1 "gG”hFЈzVЎ}WД€XД€WЙ…\ЗƒZ­yPГ€WЎ|UЅvQšmJ—mK—jG qKА~WБ~UВVšiBškG–lJ__SвгЖфшХфшХЬШ­ ШЧЧЋЋЋЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЅЁsN3ўўўћћћєєєэээхххооо666 BBB{{{ИИИПППЧЧЧЮЮЮжжжнннуууъъъP2Y9!. kI-jD%vL,‡Y6Š[7Š\8yN,oF':'#tO3uP3rK.vP2yS5yS5jD&jD&tN0nG)sL.Y9 2 ƒX6ˆ[8”fA˜iC]8”d>ЁpIРРРМММЛЛЛПППРРР631“b;“c<•gC‹`>yQ0O6!*€U3‡Z6›kFЂoH mDЊvMЄpGЊvMšf=Y0•b9]6™jDvN/Z9Z;#T7 V;%T:%Q8#S:%P6"T;&L3D*J1H/O5!M4F-I/K1R7"[?(hG-†\:‹^;›lG—f?Y1—c:™e<œh?ЁmD]4‹Y2`:Œ^9Žb?†\:~U5xR3zU7uP3nG(tL+V5„W4_:‰X2‹Y1žjAœh@œkE’d@U4'$”œ{АЛ‘АЛ‘`aO+ЧЧЦЊЊЊЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББІЁZ>ўўўћћћѕѕѕюююцццрррDDD???zzzІІІИИИИИИЛЛЛСССШШШЮЮЮееемммтттшшшэээ]>$pN57' +M4!O4 [>'N7%K6&,3~Z=„]>‰`@{R1}S2€V5~T3€V5fE—mL”jIxM+)Š`>›lGЃsMЇwPЂrL`9—f?РРРМММЛЛЛПППРРР741lEЅuN™kE›nKdCtL- H0cB(pO4}[?‰cEV6}Q0“fCnIЃrKБW­yP›g>ŸkBœh?œh?œh?ЉvMБ~WВ[™jF„W3‘fD‰`@ŠcD‡`B|W9vP2rL.oJ,qK-lG){U7‚]?ŒfH~X:oJ,[=~X:‹dEgGeDdA‹]9`:œjC–c:ЊvMД€WРŒcД€W“_6ЉvNЂqJІvQЂtP™lI‘eC{Q0~U4‚X8€V4‹_=œoKЊ{WЇwRˆW0ЁnFЉuLЌyQЊyS›nJŠaA]XJлоНфшХфшХИЙ  ЧЧЦЊЊЊЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЅ oJ,  +[9]95# ++,, + +- NYyЁЉ† lI-~W7ƒW4”fBb>—iE•gC™lHžpLšlHa=~O+f?!0’a;˜f?˜f>˜g@ЂqJ™gAРРРМММЛЛЛПППРРР631€O(–e>‘b<‰Z6‡[8‰_?N5! uP4xT7yT6ƒZ:xM+}P,yJ%”c>—e>™f>ŸkBЌxOЅqHЇsJЋwNЏ{RЌxOЌzR oH‚R,R-vH$‡[8‚W5‚X6‚X8†\<‚X8‚X8ˆ_>‹a@‰`?”jIŠ`@pF%oE$nD$|R1„Y7ˆ\:c?Ž`;•e?žmF mFЉuL­yPЙ…\Д€W\3ŠV-‹X0’_8šiB—gA”e?‰[6b>`=c?•gCœmHЅuPЇvP’`9…S+ŠW/\3jA–e>b?|S2^TEЎГ•ЪвЋЪвЋŽyЧЦЦЉЉЉШШШйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЅ œpJ,oI+zT5zT5sN2eD)_@(V9!Q4Q4L1U:%M2P6 N4M3O4W;&Y<'Y='X;$X;#Z<$[;#\: fB%sM0oH*dB&W:#W:#V9"U:$Q8#S9%L3L2N4 K2H.I/M4 H.I/J1M4 K36$*Џ Д,,И76Й:9З54Д,,Б##­ЉЅkH,}S1–gAŸnFŸnFšhA•c<šhA•c<ŒZ3]5’_8Z2aA(/]7—e=ŸnFžmF›jDПППМММЙЙЙНННРРР631•d=•d=‹Z4`:‹^9Š_=†\< +iF,qJ+pH({Q0€S/ŠZ5Ž^8™g@”b:šf>™e<ЈtKЇsJІrIŸkBЁmDšf=]5]5‰X0—hA‰Z4Ž^:ˆZ7…W4…Y5b>Ž`=Ž`=‰[7…Y5ˆ[7ƒU2|P,T0Š]9‚U1ƒU1ˆZ5Œ]8Ž_:•e?šiCЃqJ—d=™f=žkB›g>“_6”`7ŸkB“_6“`8•b:œjBšhA—f?œkDЂqK”c<–e>™g@–d=]5’_6–c;\3œh?–c;”c<„X4‚Y8}t`вгЖфшХфшХЩЦЋ +ЧЦЦЉЉЉШШШйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЇЁžuN0zS4vN/„\<‡_@~Y$mK2sR7uS8xU:rO3sO3rM0sK,‹cCcCŠ`?Ša?€W6}T4sK,}W9‚]?„^A[>}X:}W9sN0pK-‡bD~X;}X:Y;tN0oL/a?%В('И76МDDМCCИ98Д--А""ЌЉ ЅqM1V4^7ІrIЖ‚YЗƒZГVЏ{RВ~U lCЃoFГVБ}TА|SwS7 kG+’`9˜g@ЅtMМММИИИЕЕЕКККМММ852ЅtNЂqKžmF‘b;a;ˆZ7Žc@I4#4$†]<‡]<…X4–gAЌ{SЋyQЅrJЅqIŸkBЄpGšf=ЋwNГVВ~UЖ‚YЈtKЃpG˜f>•c=ЄtMЅuOŸpJ—hC“d?“d?ŠZ5œkFЂsNЃsNЄuP›kF—iDŽ`;‰Z5ЃtOЁqLžmHnI•e@”c<Œ\6 pJЈxQЌ{TЋyRЇuNЉvNœiAšf>Мˆ_ЎzQ­yPЎzQЁnEŸlC–c:ЈuMВ~VЕYГ€WЎ{RА}TŸkBЁmDЙ…\­yPЌxOЉvMœkE†Y5xO.PH7І‚АЛ‘АЛ‘~gЧЦЦЉЉЉШШШйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЉЄ ‚\=Y:Š`?“iFŒb@„\<‡aBƒ]@€Z<‚]?}W;vR5[={W:[>}X;wQ4Y<‚\=„^?}W8„]>‡`@†_?‰_?ˆ]:a?—lH”gD™lJ›nKŠ];dCŒbAdCˆ^>Ša@ŽeD‹bA†]<|R2ŒbBŒbB‰`?dC”jJƒ[;xT6Г+*Й:9НEEЛ??З54Г))ЏЋЇ + ž[?Œa?žlEЄpGЇsJЎzQБ}TГVИ„[Д€WЁmDЖ‚YЊvM­yPЌxO—lK (aB*wR5ЛЛЛЖЖЖДДДИИИККК631ЁqKІvOЌ{UЃrKžmF˜iC–iEŠa@ gF™mJЄuQІvOЄrJБ}TВ~UЗƒZЏ{RЉuL­yPД€WЎzQЌxOЕXВ~VЌzR­{TЄsLšjEЃtOœnIЁsNŸpL•e@ŸoI qKЂrM™iDŸpJЁrMšlH˜jF‘c>˜iDЂsMžnIЄtOІvP•d?žoIšlGœnJ™jFnIЅuOЅtMЂpI–d<Ў{SЎzQЌxOВ~UЛ‡^ЋwNЊvMЈtKЉuL­yPА|SД€WД€WЎzQšf=П‹bЌxOЌxOЌyQАX”gC„Z:`YEСЧЄЪвЋЪвЋЄЇŠ ЧЧЦЉЉЉШШШйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЈЃŸƒ\<ŽeDžrP”fB˜jGІzWžrP’hF’gF€V4˜nM‹a@ƒY8ŒcBŽcCcAdCšoM‘eC‘fCŸsRœqNqN˜lIb?ЃuP˜iD”d@oJЃsOЂtN•fAІxTpL”gCЂuQЌ[ЄwS™lH•hD›nJŒ^;b>˜kGpLpL’eB‘hH…Е32И87Ж43Д,+А"!ЌЉЄ—yV:‘fDГZЖ‚YЊvMД€WЫ—nМˆ_Џ{RД€WЋwN lCЂnEЋwNЌxOА|SЎ{S|Y>8( +GGGМММЗЗЗДДДИИИККК631œkEЅuNЅtMЅtMЎ|UВ[™jF—jF@/"U<(pMŒ]9ЈxRЊxPЄpHА|SЏ{RЌxOГVОŠaЊvMЏ{RУfОŠaА}UЊyQ”d>­}X™kGŒ_<“gE”hF”hF—jFЄvR™kH—iFЈyUЄvRЁtQ•jGŠ_=˜mJ‘d@b?™lHpLžpL‘c?ЁtP˜lJŽc@qNЋ~[ІxTŸoJЁpJЋyR›h@ЄpGЏ{RД€WЕXЌxOК†]ЕXЉuLЗƒZбtК†]­yPА|SВ~Ui@ЂnE­yPЎ{RЉxQœnJ™oM__SлоНфшХфшХЮЮБЧЧЦЊЊЊЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЉЃ •mLœqPЅxT­|WЕ„^Д…_Ћ|V­~X™jE­~Y”d?^9•fAЁrMІwRЅvQБƒ_Џ“{Ћ‰lА”{ИkВ‚]Џ€[œlFВ[™iCšhA›jE­ŠlД–}Ў…eКˆaД‚[Њ~[Ř~Мž…ЛjЏ~W oHЗ†_mGЌzTlEЃrKЌ{UЊyRВ–|Ђe „В('Г+*В'&А! ­ЊІŸ’{W;žsQКˆaЖ‚YП‹bܘoЧ“jМˆ_Б}TЧ“jСdРŒcЏ{RЉuLД€W­yPОŠbОŒdВ€YŽfGXXXkkkhhhfffhhh... €X9ЊySЄsLКˆ`К‡`ВZЋ|WЋ~Z‹fJ +•iFЈ{W›lGЇvOЄqIГVГVП‹bСdРŒcМˆ_УfФgМˆ`Й‡_ŸnHЄwTH1! "$$%)G3#šnK™pOU?-*'!&  ! =)“gDœqNB/)'#&))O9'Œa?Б‚\lEГ€XЇsJ­yPЖ‚YЕXСdП‹bБ}TН‰`ЮšqЧ“jК†]­yPЩ•lЖ‚YОŠaЋwNЋwNВVЉwPЌ}XЃxUcYHЅЈЪвЋЪвЋ‰vШЧЧЊЊЊЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЉЄŸ…[;~S1†X3†T-‚O'’_7ЋxP•b9~K#„Q)\3Z1˜e=™f>ЁnFЁnFЏ—‚ЮТЖиШЛвФЖТЗЊНГІНГІНГІНДЇНДЇОДЈПЕЈаТЕжЧКЮРГРЖЉПЕЈСЗЊжЩНжЧЛФЙЌПЕЈПЕЈПЕЈПЕЈПЕЈПЕЈПЕЈПЕЈПЕЈвУЗЋЂ– ЎЎЎЋЉІЄl xT8‚V4[4–b9‚O&\3 mDІrI”`7„P'ŽZ1ŽZ1“_6™e<ЁmDБ}TžkB“`8˜f>ƒQ*y]G‚fP…jTx^HoU@tZE# ™iBЇvOЂoH—e<–d<|K%zL'„W3%O0wK'}O*†V0•b;žkBЌxOЈtK˜d;—c:[2‡S*•a8Ў{R“a9wG!cA%rrrrrrHHH tJ)[8rrriiiqqq€V4W7*% BBBrrrrrrc?"zL'„S-‰W/\3ЁmD lCЉuL™e<–b9\3„P'“_6ЇsJЇsJ”`7‡S*ŒX/‰U,’^5žjAŸlCЇuNŽ^8€S/q]BeiUŠ’seiUeiU.xww///рррџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЈЃŸ|S2„X6“e@ЉwOЕXН‰`Џ{RŸkBЊvMЄpGЏ{RЈtKЈtK›g>ЊvMŸkBЙЅ‘убУюкЭюиЫюкЭямаякЮякЬялЯякЭялЯялЭялЮ№ов№ог№пд№огямб№огямЯянбямаянб№огялЯялЯ№овёсжялЮялЯъиЬ­Є˜ ЊЊЈЃ + žœ˜l vR5…Y6ЄrJЇtL‘eBЊyRЉwPІsKjAЉuLД€W›g>ЃoFЁmDžjAЋwNœh?ІsKЄqIІtMЌzSЌ{TЂqJ`;—iDnI“b<ŸnGšh@œi@ЂoGЇvPЄuPЂuQ]A+%c@b?œmG oH–c;ЈtKi@žjAЄpGЏ{RЖ‚YН‰`­zQšhA™jDŒ_<$gD) mJ.…]=ŠbC$ ^@(/  '}T5‚Z:oK/  +_C. +‚X7‘eAЇwR™g@™f=ЄpGЇsJЇsJœh?ЅqHЌxOА|SЖ‚YЋwNЏ{RЂnEЌxOЖ‚YЁmDi@ЁmDЁmDІsK”c=™jF‘eBŒa@5- !sP5gE*ШШЧЌЌЌЪЪЪйййыыыњњњџџџџџџџџџ€€€€€€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЉЄ ‹bAŠ_=”e@“`9Y0”`7\3ŠV-—c:’^5ŒX/ŸkB›g>žjAЉuLЋwNКІ’тЯТюйЬюйЬякЬ№на№наякЭямЯялЯянбялЯялЯянбёогёог№нбёог№ма№пвёпг№пв№об№ма№ма№овёог№ов№маялЯыйЮЋЂ—ЄЅЂœ—”““‘z xS7’fD‘`:™hA;'|O+‚R,”b:ŽZ1“_6‹W.žjAœh?ЊvMВ~UЎzQ›h?ІsKˆV.“b:‡V.‚Q*‰X2‚S.‡X3ЃrKЈwPЊxQ mDЈuM‰W0†V0}O+zM* +hD'vI%b=`9žlDЋxOА|SІrIЃoFšf=ŽZ1”a8Y2O)ƒV2tJ);$  G1lG*rN0iD'Q5 nI+qL/{U8wQ4 +S6oH)pF$Q-’a;–c;ŸlCЎzQЇsJЏ{Ršf=œh?“_6œh?ŒX/’^5˜d;ŽZ1‘]4’^5šf=žjA­yPЉvNЅtM_9’d?zN*V4oF&e?!jE)ЩШЧ­­­ЪЪЪйййыыыњњњџџџџџџџџџ```џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЅ œtK*~R0}N)ƒQ)†R)…Q(‚N%„P'ŒX/\3‘]4•a8’^5“_6‰U,’^5ЖЁувХ№ма№на№ов№нв№обялЯялЮянвямаёог№ов№наёпгёпд№огёпе№нв№пд№нв№огёржёрж№нв№нвёређтзёпгёогьйЮЋЂ–ЄЂœ–‘Œ‰‰‰ˆb>"yN,ˆY4\:D(rE"ƒS,Z2\3“_6‘]4›g>‚N%Y0\3’_6Y1‚O'~L$L$M%€O(„T.‚S-}L&†U.ŠX1’_6ŒX/|I"yI"vG#sF"@'.~R/|O+…U0…T,ˆU-“_6—c:‹W.‰U,…R*€N&yH"tF"qG&iC%*ŽŽŽфффффффффŽŽŽ& U6X8W6$ ŽŽŽфффффффффффф]e=e?!ЩШШЎЎЎЫЫЫйййыыыњњњџџџџџџџџџ000РРРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЈЃŸzP0ƒW5–gB™f>•a8ЉuLЖ‚Y­yP­yPЊvMВ~U­yPЃoFЁmDЉuLšf=ЗЃŽфгЦямЯ№нбялЯялЯялЮюмбюмаюкЮьлЮькЮькащжЬщжЬщзЭъзЭъзЭыйаъиЮъзЭьлбьлаэлаянгянвянв№нгёпе№нвыйЬЋЂ–ЄŸ™’Œ†‚…W;$xN.d@  ‚^A™lHЈvO­zRД€WЇsJ›g>ЁmDЃoF–b9ЇsJЌxOi@]4И„\ВVЋyQЉxQ pI—f?œkE’`8ЂoFЊvM—d<Ž\5ЅuPŸqMŽdC +‘gF–hE_:—g@ЃpH™e<i@ЇsJjA^6žmFЅuP‘eBƒ\Б}TЋwNЗЃŽфвЦялЯялЮ№ов№огяпдэкЯыкацжЩфдЫсбЧнЭУлЪРйШОйЩПкЬФкЫТйЪСйЪРлЫСоЮФрвЧфдЫчиЮъкбэлаёржёогёреыиЮЌЄ˜ ž—‰‚|u|„,J4!zT53!  †`B•gCЋyRЏ|SИ„[ŸkBА|S­yPІrI•a8ЋwNЉuLД€WД€WД€WЖƒ[ЁoH“hFžmFЂqJЁoG•b9ЂnEЅrIЅsKЄsMžpK sP8'L6$›nK‘c?‘a;ЇuMІrJ™e<œh?ІrJ›iBŸoI ŽdC rN—gAЊxQЄqHІrI–b9Б}TВ~UД€WБ}TЛ‡^ГVЋwNД€WЎzQК†]ЁmDА|SЉuLЃoF“`7­zQЊwNБ~VЅuOšnK‘iHЪЩЩАААЫЫЫйййыыыњњњџџџџџџ€€€```џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааqqqhc_ŒcBdA™kFЊyQБ~VВ€Y­{TЅsLЂqJД‚\ЌzSЉwOЃpHЉvMЈtKД€WКЃчеЩямаялЮямб№овюлЯъйЮфдЫпЭУкЪРжЦНаСИЫНЕЧИЏЧЙАЧКАЧКАЧЛВШКБЪМДЯРЗдЦМкЫСпвШфзЮъкбюодёпдёпдьйЮБІ›fOKHEA><?35$I2  +‰_?ІwS nGД€XЌxOЅqHЂnEЇsJ­yPА|SЕXБ}TЛ‡^А|SЈuL‰^:ЅtM›iCЅsKЏ|S­yP­yPА}UБ€YЂrM–iEzS4 ˜lI”gC›lGlEЎ{SЌxOЌxOБ~U­|VЇxSŸx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\v[›tYštYštY›tYv[v[›tYštY™sXštYštYštYštY›uZv[v[žw[v[v[v[žw[Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\†]=˜lInIlEЄqIЇsJЅqH­yPЙ…\­yPГVА|SБ}TИ„[Й…\ЇsJЗƒZ­yPЅqHЃoFІrIІrIА|SЕX­zQЈxR—jG‰_>ЪЪЩАААЫЫЫйййыыыњњњџџџ№№№ №№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББІЁuK+wK*€S/Q+ƒS,xH#{M(…W3€R-‚T0|M(~N(„S-Ž\4‘^5’_6НБЂэлЯялЯялЯёогђржюмЯцдЩпЮХЯУЛзШОоаЦхйЯюодёсеђтиэлаКЏЃ-' ,-,*( +7"H.N4 +%#"$""$ e>pA†T-ŒX0•a8˜d;–b9ŠV-ŽZ1”`7ŽZ1ˆT+ŠV-“`8a>#‘`9‘`9‘^7ŠW.\3Y0ŠW.‚P(Q+…W3T1 +H,yL)…W3Œ\6]6\3”`7‰V.„T-tF"oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@a:rH&}O+‡W1”a9‘]4[2\3’^5’^5†R)‘]4—c:’^5‹W.‚N%Y0[2”`7—c:”`7Y0ŽZ1Y0\4~M'yL)yO.ЪЩЩАААЫЫЫйййыыыњњњџџџPPP   џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЈЂžzR3xN-€T2ˆZ7•hDŠ^;€U3mM4H2"‰aA…Y6‰\8‰Z5ЈxRЉwOžkCВ›…увХянб№ов№овёпгьйЮубШлЪРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЦКГЯСИиЪРфзЯэнг№ређтиюовРДЈvW=tP4|U7qK-ŠcD…^?Z<~W8kD%~V8[=cE- +--,10/+*)"!  + jC%”fBЄsL­zQЎzQ lC›g>—c:ЎzQЌxOЁmDЎzQЗƒ[ЊxQЏ~W oHšg?˜e<˜d;ЉuL­yP mE›jDІwRœoKiJ2#†Y6 rNœmG—f?“`8™e<–c;œmGŒ_<˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX™sYštYštYštYštYštYštYštYštYštYštY˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rXhC&„[:™mJškFЃpHЃoFЁmD\3ЈtKЈtKœh?Й…\ГV­yPЈtK[2ЉuLВ~UЋwNЎzQЂnEžjA‘]4ЉuLЇtK”c=›nK“iHЪЪЩАААЫЫЫйййыыыыыыPPP   џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББІЁrK-yR3~T4fDŒbAS:&!/ [<$b?$pD!Ž`;”c=“a9ЛЏЁ№овямЯёпд№обёржькасаХжЦОџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџКЏІЦКВгЧОргЩымгђуйђуйђтиХК­Ђz\“e@”gC‘dAšlGžpK˜iEa=…W4pD!jG- --,:98:98210'%%  X7ˆ[7_9˜e= lCœh?ЈtKЄpGЃoFЇsJЏ{RЇtKЇuNyT7Ž]6•d=—d=jA lCД€WЋwNЊwOЉwOœlFšlH’eB b>"…X5_:_8›iAžkBЋxPnIŽcAoS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@eB'b;‡\:Œ]8–c<ЈtK lCЉuLІrIЊvMЇsJЎzQВ~UЋwNЂnEšf=†R)ЁmD›g>›g>ЅqHžjAЉuLЄpGЁnE˜gA–iFŠ`?ЪЪЩАААЫЫЫйййнннOOOАААџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЄŸœrM0sN0X9R:&  }S2‚U2‹\7–e>МВІюма№мЯ№маёрд№нвыйЮпЮХаРЗџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџБЇЂОГЌЭТКлЮЦщлаёсзђтзётзПЕЈЃpHІtM•c<™g?jC•b:]5jB—e>J0 +$""654CBBA@@554)(' [<"U2•e?šh@­yP­yPЅqHžjA”`7 lC›h?–d=“b;‹Z3“b;œjBЄqH­yPЉuLЃoF–b9œjB•d=^9†Y5M4 1 T1‡Y5’b=˜f?ЇtKЇuM–gB‚W5˜rX›tYv[v[›uZ˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rXštYštYštYštYštYštYštYštY›tYv[v[Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\Ÿx\hF+oI*xM,‰Z6 mFЁmDЉuLЈtKЌxOi@ lCЁmD™e<•a8ЂnE lC’^5”`7˜d;ЅqHi@­yPЌxOЇsJ›h?Ž^8‰\9{Q0ЪЩЩАААЫЫЫˆˆˆЬЬЬџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЄŸ›iG,;)!!!###]?'…Z9Š]:—gAЙЏЃэла№ов№обёпе№пдъйЯлЪРЪМГџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџІ˜ЖЋЅШМЕзЫУчкаёуйђтзђуиСЗЊЏ{RА|SВ~UА|SД€WЋwN lC lCЅsL &%$765GGFCBB554(&% >+Š^:ŸnGІrJА|SД€WЏ{RЎzQЖ‚YЎ{RžmE–e>˜g@šhBžlDЇtKВ~UЏ{RЋwN­yPВ~VЈvO—hB‰[7U4 +U4Š]:‘b=ЁpJ­zRЂpH˜jEcAoS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@rP5~W9„Z8™kFšhAЈtK­yPЏ{RБ}TВ~UА|SД€WЌxOЁmDЁmDЌxOЌxOЂnEЈtK lCІrIЋwNЎzQЕXЎ{RЃrLpMŒbAЪЩЩ+++ ___нннњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЄŸœ8' """### + + + ‹cC‘fDžpKЕЌ ыйЯ№нв№обёрж№нвъзЭйЪСЧЙАџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ–‘ВЈЃУИБжЪТчкађфкђтзѓфкСЗЊА|SВ~UВ~UЏ{RГVГVЗƒZЂnEБX‰^<1"10/=<;;:90/.$"" + + ‘gFšjDЁnEЈtKЊvMЕXА|SЈtKЕYЋyRЃrKЈwPЈwPЂpHЅrIЈtKЌxOВ~UА|SЅqHА}VЈwQ›mI›nK4#M7%˜kH—iE›kFЂpIЉxQ qLdCštYštYštYštYštYštYštYštYštYštYštY›uZv[v[v[v[v[v[v[v[štYštYštY™sXštYštY›uZv[v[Ÿx\Ÿx\Ÿx\žw[tQ6zT6eCœmIВ€Y­yPЃoFЏ{RБ}TВ~UА|SВ~UД€WЖ‚YЃoFК†]ЇsJ­yPБ}TЗƒZЊvMЃoFЊvMЎzQБ~UЄsM”gD”jIЪЪЩWWW@@@)))“““њњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааАААЂž›[@+ + + +###### [?)Ša@–jGБЇœчжЫюлЯёпг№нв№пдъиЮкЫТШЛВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ–’ВЈЂУЗЏеШПчйЯёуйђуйђтзСЗЊМˆ_Х‘hГVТŽeЭ™pЉuLК†] lCЂpHЂrMeC 0/.0/.('&V:$ŽdCГ„^А}TЛ‡^Х‘hК†]К†]Ы—nИ„\ЊxQ™gA›iCІuNГ€YЖ‚ZЛ‡^Н‰`Л‡^Мˆ_СdК†^ЃqJ—hC›nJZ; •iFšlIЏ\­|VВ€ZЉzUœrPoS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@mK0„^?cB—iEЇuMХ‘h­yPЛ‡^Х‘hГVУfЭ™pЊvMЙ…\ЁmDЈtKБ}TВ~UЅqHЏ{RШ”kБ}TЛ‡^УfД€XАYБ„afEЪЪЩАААЫЫЫЬЬЬvvv^^^№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааААА—”’  ###############$ŒeF˜mLЋЂ—тбЦызЪ№нв№наёсзъиЮкЫТШКВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ–‘ВЈЂУИАеЪТшлбёсзђтзёсжСЗЊИ„[Л‡^Мˆ_Н‰`Й…\ЄpGСdЊvMВVlDŽ_;‹bA0# $"" + + N5 Y;›oLЌ{UК‡^СdЗƒZЗƒZТŽeУfЊwNЇuNЎ}VŸnGЌ{UЗ„]Зƒ[Мˆ_И„[Ж‚YЦ’iТŽeА}TЃpIЎ}W‰[6–iE$cG1ЄwSЈzUЌ|VЎ|W qMЁvU›uZv[štYštY™sY˜rX˜rX˜rX˜rX™sYv[v[v[œuZštYštY›uZ›tY˜rX™sY™sX˜rX˜rX˜rX™sYœuZœuZštYštYštYštYštY›uZuS8vP2‚X7oKГZЛ‡^Л‡^И„[Л‡^Л‡^Н‰`К†]ЄpGП‹bЋwNЕXЅqHŸkBЏ{RК†]ЗƒZОŠaСdЛ‡^ЕYБ€ZЅxU‡^=ЪЪЩАААЫЫЫйййыыыЬЬЬ@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааААА’!!!###"""###############bB(W6Ѕ’мЩОчеШюлЯ№наёпеъиайЪРШЛВџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџŸ–‘БЇ УИБеЩРчиЮёсжётзђсжСЗЊ lCi@šf=™e<ŽZ1“_6[2[2\3“`7™g@a<U47$  V8 pK-…Y7”d?›iA“_6ЇsJ›g>žjAŸkB•a8‰V.[4ŠY3›iC›jD nF–c:ЅqH–b9ЃoFžjAœh?‰U,ŠW/ŠY3‚S.‚T1\<$#‘dA…W3”d>•d>Œ]:~S2oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@a>#mG)‚X7‹]8”b;ŸkBšf=ŸkBœh?™e<™e<ŽZ1“_6\3[2\3•a8ŸkB lCžjAi@•a8ЃoF˜d;•b:`9{O+rH'ЪЩЩАААЫЫЫйййыыыњњњАААPPPџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааАААŸ›˜###  !!!################## ,„]>Ÿ—ŒжЦЛтЯХьйЭ№нв№пвщжЬкЫСЩЙАџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЃ™‘ДЉЁЦКВжЩРшка№ређтиёсеСЗЊН‰`А|Sšf=›g>Б}TЖ‚YРŒcК†]ЃoFЁmDžkBЁoHœmH’hGP9'$eE+wQ2‚V4™iCЄqIА|SВ~UК†]Д€W–b9–b9ЎzQА}TЊxQЈwP–e> oHЎ|TЃpGЗƒZП‹b˜d;\3Џ{RА|SГ€WЉwOœlF’c?Š]9 ~Y;‘b>ІvQ­}W‰[7rG%™sXštYštYštYštY˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX™sYštYštYv[v[v[v[v[v[v[v[v[v[hE*vP1‚X7—iEЈvNВ~UГVН‰`А|Sšf=›g>А|SЖ‚YОŠaЙ…\ЃoFЁmDŸkBЈtKЌxOД€WЕXМˆ_А|S”a9]7”gDgFЪЪЩАААЫЫЫйййыыыњњњџџџ€€€pppџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааААА œ™2"########################iG-›“ˆвУИрЯУъжЪ№огёогъйЭнЬТЮПЗџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЌЁ™ЛЏЇЫНДкЭФшйЯ№сжђтиёржСЗЊ–b9\3•a8ŽZ1™e<i@ŸkB”`7\3—c:žjAЄqH›h@—hBxM+F/ +W9!iB$T1_8 mEЈtKЇsJ\3ŸkB‡S*\3ŽZ1‘]4–c;’`9_8ЁpIžmFЃqI]4i@‡S*ŠV-Y0•a8‘]4—c:•c;†U.‹[6‚S.S9$9'‡X3‹[5‰Y2xK&wM+oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@`>"pJ,U4‘c>“b:ЇsJ—c:—c:[2•a8Y0˜d;žjAŸkB”`7[2—c:žjAЅqHЂnEІrI’^5i@ŠV-]5…T.}P-€V5ЪЩЩАААЫЫЫйййыыыњњњџџџџџџ000РРРџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЂš]?'### !!!################## -˜†ЮМБнЬСхбХшжЬъйЯхбЦмЫПбСЗИЌЅУЕ­аТИовЩщйа№огёреёреСЗЊšf=ЊvMЋwN—c: lC›g>\3–b9i@ЇsJГVЈtKЈtKЁnGœlF…Y7K3!V8!nG)‚V3–f?Б~UŸkBЎzQŸkBЉuLЄpGЉuLЂnEŸkBœh?]5’`9\5–e>ЅtM™f>ЇtKЅqHЄpG lCЂnEœh?’^5›g>“`8•c<\6œlFŠ^: 9&›kE˜gA”c>`<ƒX6v[štYštY›uZv[v[v[v[v[v[v[v[›uZv[v[v[v[žw\Ÿx\Ÿx\v[v[v[Ÿx\Ÿx\v[v[v[v[v[Ÿx\Ÿx\Ђz^hE*X:eC˜jFžlEЉuLЉuLšf=ЊvMЋwN—c:ŸkBšf=‘]4–b9œh?ІrIГVЇsJЊvMЄpGЉuLŸlCЄqHЂpG^7„Y6vM,ЪЩШАААЫЫЫйййыыыњњњџџџџџџААА@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЂžšdB)0  + + +###### ###### Ž‡}САЅЬКАбРЖбРДвУКбПДаПЕЮОВШКБТГЊИЊЂЏЁ™Є˜ž“ž”Žž”Žž’‹ž“ž“‹Ђ˜Ќ ™ЖЊЂСДЌЫНГеЦНсвЪъиЮ№нвёогёржЦЛЏДˆc–b9—c:ЉuLД€W­yPЌxOЌxOЎzQžjAœh?ЇsJ lCœh?ЈuMnHyO-*S:&{V9“hEЁqKjBœh?ІrIi@™e<ЎzQЇsJŸkBŸkBŸkBЖ‚YЇtKЈvOЈwPžmF˜g@–c<ЇtKЄpG lC›g> lCЛ‡^ЎzQЌxO­yPБWЁpI•d=—f@šjD•d>“b<–e>lF…V2‚W5oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@oS@vS7vO0„Y7”fAœjBЄpGЋwNБ}T–b9™e<ЈtKГVЌxO­yP­yPЎzQžjAšf=ЇsJjA™f>ЈuMЄrK]6•d=`<’hEƒ[;ЪЩЩАААЫЫЫйййыыыњњњџџџџџџџџџ№№№џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЃž›oM2[?(### @,yphˆЂ–Œš‡ + lc^Ÿ’ŠНЏЅФГЊФЖЌСВЈМЏІДЅАЄАЅАЂšАЃ›АЂšАЂšГЅžК­ЅУЕ­ЬНЕгУЙмЪРхзЯьмвёпе№нв№огиЪНД•zЄpGЎzQЙ…\РŒcИ„[ЋwNА|SА|SИ„[ЊvMЎzQЂnE­yPšf= mF—hC~V7 !…`BdCŸoJЌzRД€WЇsJГVžjAЎzQžjA™e<ЇsJЁmDГVК†]Мˆ`ЌzSzU7ЄsL”c<ЇuM mD\3ІrIЄpGЇsJЗƒZТŽeЛ‡^ЊvMЉvMЎ|TlDŸmF˜f?ЂqJžlEŠY1 nG”f@‹^;Ÿx\Ÿx\v[v[›tYštYštY˜rX˜rX™sX™sX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rX˜rXštYštYštYštYštYv[v[v[žw[v[v[}X;ŽfEc@šjEЂpHЏ{R›g>ЉuLЅqH­yPЙ…\РŒcИ„[ЌxOА|SА|SИ„[ЉuL­yPžkBЅsL’a:˜hB˜iC‘c>œpM“jJŠcEЩЩШЎЎЎЫЫЫйййыыыњњњџџџџџџџџџPPP   џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааЁЁЁ•ŒuR5iG,( """""" 2~@@% PJFЇ™‘СВЈШЙЏЪКБФЕЊСБЇСБЈСБЈСБЈСГЋСВЉУЖ­ЪМДЯОЕдХЛлЫСсаХцдЩэкЯёпг№на№нбиЩМВ“xЗƒZ­yPВ~UД€WЈtKЋwNМˆ_В~UБ}TЋwNЄpGВ~UЄpG—c:ЄqHЎ|TЂsN•jGfE‹`=“d?В€YГV­yPЎzQi@ЎzQЂnEŸkBЇsJГVЕXЙ…\Ж‚YЇtK›jBšhBЁpIžlDЃpGЄpG­yPВ~UК†]Мˆ_Б}TЅqHД€WК†^ЊwOА}U›iAЈuMЈuMšh@žkDІtMЂsMЃvR‡`A’gF’eAmGА}UЇsJ˜d;ЄpGЗƒZЎzQВ~UГVЇsJЊvMМˆ_В~UА|SЋwNЂnEЌzR›jCŒ\6”fAœoL—kHeD‚]>uP3ЩШШ­­­ЪЪЪйййыыыњњњџџџџџџџџџ€€€€€€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааqqqa]YX2Y5N."""2/ЯЦxБЈ[”‹B—WБZZКVV”00ˆ776БЄ›ЮОЕеХКеФКвСЕгУЙвУИгУЙвУИвТЖдУИиШМлЪОсвЧудЩцгЧьйЮюлЯ№маяовялЯиЩМЁ‚g†R)„P'{G€L#€L#‚N%vBxDK"xD}I ‚N%K"„P'€L#|H~L%xH"uEwG!‚P)s@uA‚N%xDyEM$M$M$€L#‚N%€L#ƒO&€L#}I!\:{J#yH"|I!~J!‚N%zF~J!~J!‡S*€L#‹W.xDs?|HxDƒP'{HzGL#N%s?vEm>oC b9X3J*ЉЉЉЈЈЈЈЈЈЈЈЈЈЈЈ?%=#?%ЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈ:">$:! “““ЈЈЈЈЈЈЈЈЈЈЈЈ<"D(Q0S-Z1j>n?uD}J"{G„P'M$„P'„P'{G€L#M$‚N%uAxD€L#xD{G|J"vFvG" %)]gK%)2+P/­­Ќ€€€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааЁЁЁ—’ŽyR5vP3wQ3, !!!\X4>;$31жЭЖ­a‹ƒ=LH%>ВNNЂ>>š66ЃDDНffЁ”‹дФКугШфвЧфбХфбЧфбЦфвЧфдШхвЦхдШчзЬшеШшзЬыйЮэлаюмвямаялЮялЮялЮиЩЛД”zВ~UЄpGžjAБ}TЉuLЋwNЂnE–b9›g>ЌxOŸkB­yPЎzQЈtKЄpGА|SЁnEЂoFЊwOЄqHЊwNІrIšf=˜d;ЈtKЉuLЎzQ­yPЄpGЅqH­yPЄpGЈtKЈtKЄqH}X:ЃrKЁpIЄrJЂoFІrIЉuLЌxOЅqHЋwNЊvMБ}TЂnE lCЅqHi@ЉuLЈtKЈtKЅqHЅqHЄpHЋyR•e?—iEŠ`?[=fD)ЄЄЄЛЛЛЛЛЛЛЛЛЛЛЛX<&Z>(^C- ˜˜˜ЛЛЛЛЛЛЛЛЛЛЛЛN4U:$Q6  €€€ЛЛЛЛЛЛЛЛЛЛЛЛ[?)eF-pL1yQ2€U3Œ]9œmG’`9ІsJЏ{RЊvMЇsJВ~UЄpGžjAБ}TЉuLЋwNЃoF•a8›g>ЌxOžkBЇuMŸoJc@8=-Œšp–Ѕx–Ѕx€‹d]]]АААЪЪЪйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББІЁuN/xQ3vO0nK1  РИpkf7+)ЋЂTŸ–J‰<ЄMMЎJJ™55‘--Ÿ;;W,,40.ЗЈйЦЛъеЩюйЬянаянвюкЭянбюкЮянбянвюмаянбюмаяма№овянбянаякЭ№нбякЭиШЛЕ–{ЈtKЇsJЈtKЉuLЏ{R­yPІrIŸkB‰U,žjAŸkB›g>ŸkBЅqHЈtKЈtKЁmDЅqHЉuLЇsJЕXЈtKŸkBŠV-›g>ЂnEЂnE lCЃoFЈtKЅqHЁmDЇsJЅqHЃpGЊxQxS6›iC›jD™f>ЁoF mDЊwNЅrIЈuLœi@ЉvMЋxOЈuLЂoF˜e<”a8 mDЈtKi@ЃoF lCІsJЂpHœkE‘a<’fC„[˜f>–c:ŸkBІrIЉuLЈtKІrIЉuLЉuLЎzQЎzQЇsJžjA‰U,žjAjA”c<Ž`;‰^;G@-y†a–Ѕx–Ѕx[aFШЧЧЋЋЋЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЅ œvO0{S5ƒZ;ˆ`@[ŽZ1—c:ЂnEi@ЎzQА|SЋwNЁmD™e<ŸkB™e<ЂnEЄpGŸkB•a8‹W.™e<ЃoFi@ЎzQБ}TЊvMЃoF’^5ŸkBžkB˜f?—f?Œ[4™hB˜e>ЂpGЌyPЉvMЈuL‘^6ŸlCŸlC›h?›h?ЃpGŒY1\4”a9ЂoFœi@ЃoFЊvMВ~UЎ{R˜e>•d=ˆZ5€V3pJ+C-hH.oN5nN4_@'5!_>%a?%eC(_@'G/ F/N5 nI+wN._<‡X1’`9[4•b9 lCŸkBЌxOЎzQА|S lC lC lC˜d;šf=ІrI™e<šf=Y0•a9™gA‰\8ŽdBYT=ƒi–Ѕx–Ѕx{‚^ ЧЧЦЊЊЊЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББІЁ…]>‹dD“iJŽeE‰aB‚\?5% +6$U:%ЗЎflg775!ПЖhЏІZ„=ic0 q22ЂDD8s_Mš}gБ’yЛœНžƒЙšМ‚РЁ†ОНžƒКš€К›€ЛœИ˜~Г“yД”zЙšОЏžСЗЊСЗЊСЗЊСЗЊРЇКiН‰`ЕXБ}TЗƒZБ}TЄpGІrIВ~UЄpGГVГVЏ{RД€WН‰`Ж‚YМˆ_ЗƒZВ~UК†]Д€WЅqHЅqHЋwN›g>ЕXЎzQЕXК†]И„[И„[Й…\Ж‚YЕYЛ‡_В€XžmF—g@ЄtMЉySЊySЏ|UЗ…]Ў|TА}VВ€XГZБXЄrJ—e> nG–d<ЈvNЊxPЎ{S­zRЕ‚YЛ‡_Д€XД€WД€XЋyPЋzT—jF€V5]@(nI-1!lL4B/bF/]B-dI2…`C„_@ ‡aCˆbC‹bA`>—hBЋyRЈuLБ~UИ„[ЎzQВ~UРŒcЗƒZН‰`ЕXБ}TИ„[В~UЄpGІrIБ}TЂnEГVЏ|SЅtMœoL•lKFA.ƒi–Ѕx–ЅxckNЧЦЦЉЉЉШШШйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааБББЄŸš~W8}V7X8V5}U5pO5 1 KZ# +  МГiys> ?+tQ2–hAЄrIГWЉvMЎ{RЅrI™f=ЉuLЋwNБ}TА|S­yPЏ{RЌxO­yPЃoFЊvMЕXЌxOА|SБ}Tœh?ЊvMЋwNГVГVЌxOА|SА|SЏ{RЇsJ­yPД€WЏ{RЏ{RБ}TŸkBЈtKЇsJЏ{RБ}TЉuLБ}TЉuLЉuLЂnEЋwNГVБ}TЏ{R­yPЁmDЅrI›h?ЈuMЌzRЃpHЋzSЁpJ—gAmHŸpJœkF›kClE–e>œkEІvOžmGЈwQІuO—f@œkElFЇvOІtMЅsLЄqJЁnGЂoGžkBЃpGЎzQЇtKЉwPЄtN”jH $ ƒZ9†]=F1 ;)’hFŠ`>G2! >+—jFnHЅsLŸlCЉuLЕXЌxOЏ{RГVi@ЊvMЋwNВ~UГVЋwNА|SЏ{RЎzQЇsJ­yPД€WЌyPЄsL˜kG~T4LH2Œšp–Ѕx–Ѕxv\ ЧЦЦЉЉЉШШШйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааАААЁœ™‡_AfG“jJ 8 E D0 +fb=OJ(><"!  +FB(<:852/+(E0zU7 rL­{TЉxQЖ„]ЌzSН‹dВYГZБWЙ†^Б~VЗ„\ДYІsKЃpHЌyQВWЋxPО‹c­zRО‹cВWЗ„\Е‚ZЙ†^ДYЗ„\Г€XЈuMЂoFЌyPЏ|T­zQП‹cЌxOХ‘hА|SМˆ_ЗƒZСdК†]Мˆ_Н‰`А|SЈtKІrIЎzQВ~UП‹bЌxOХ‘hЉvMЙ†^Й†^Л‰aБXГ‚ZДƒ]›lFŸoJЈyToIЌ|VЁqKЏYЌ|VЎYЋ{VЄtOЋ|W–gBЅvQ^9ŸpJЊzTЋ{UЈxQЌ{TЕ„\З„]И†^Й†^Ф‘hЊwNД‚ZЄsLЁsNH2 D1"›pN›pMЃxV“hF–lKgG…]=…\<’hF—lI–jGЁuR˜lIЃxV—lK’iIfF•lL”jH sPЂtPmGžmEЌyPД€WЏ{RСdБ}TСdЕXЛ‡^Й…\Н‰`И„[Л‡^ЗƒZЌxOЅqHЏ{RБ}TЏ{RО‹bЂqKЌ[ŠaA8=-Œšp–Ѕx–Ѕx‹dЧЦЦЈЈЈШШШйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёррраааЏЏЏ ›—ˆbE‹eFmO7=P B`6Њ€ХВЁЄА%H%& !& + + #_C+}W8b=a=_;ЅwSЄuQЃuQ rMškFЊ{V­}X­~YЃtN™iCžnHЂrLІvP™jD]7ІvQЋ{U­}WІvQЁqKЋ{UІvQИˆbЇwQ™iC›kEІuOЌ{TЂpJ]5ЊxPЕ‚ZЛˆ_Д€WЖ‚YА|SБ}TЧ“jМˆ_ЇsJЅqHД€WЉuLВ~U•a8ЎzQИ„[ОŠaА}TЖ„\А}VЎ|UПŽfЖ…^ЃsM“e@ЄuP" ™jEЇyTЊ{VЃtNЌ}XЇxSЂsOГ…a•mOpLˆ[7ŸqM†X4šlH‰Z5™jDЏYЏ~XВZДƒ[Ў|TЊxPХ’jОŠbЌyQ“b;ЅvP‘b>„W3ƒX6…[:˜oN—mK tRpM–iFšmIЌ~Z sO—jG‡\:‘fDeBc@`=‹]9ЄvQЂtQžqMšnJdBœqOžsPЄwTžpL˜iC pIЉwPГWЇsJ˜d;Д€WЛ‡^Н‰`ЕXА|SИ„[ГVШ”kЖ‚YІrIЈtKВ~UЗƒZЌxO•a8­zRЌ{UЄwTfEFA.y†a–Ѕx–Ѕx`eIЧЦЦЈЈЈШШШйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЯЯЯЏЏЏ›–“yT7sN0@,0 %<|niAU- Wz:Op"3X?\(K_=P`+/~77s11WId!!&" \>$kE&vM+}S1‰_=†[:†\;‡];bAcAŠ_=T1|Q.yN+ˆ\:„X5|P-€T1ƒW4Œ`=a>‰]:dBc@‘eBŠ^;S0|P-{O,‰\9|P-{N+ƒV2‰[6”d?›kE—e>ЄqIŸkCЌxOŸkB’^5’^5’^5›g>ЄpG‹W.–b9˜d; lCЅqHžjAЅrI™f>ЈvNkDngblfalf`jd_ga]f`[20. {S3”fB`=•gC`;šlG‘c?Š^:T1 @*ƒW5{O,vJ'ƒV3ˆ[7—iD”e@nH–e?ЁpIЄrJ›iA’_7–c:]5”b;Ž]6†V0‡X4…X4’eB‹_=‘dAŽ`<˜jEškG‘b=ˆY4‰Z6‚S.Œ^:‰\8ƒU0†W2‹]7™jE–gA—hB—hBœmH™kF’eA‡Y5†W2…U/˜hA“a:Ž[3–c:›g>ЅqHЇsJЂnEЌxOЈtKЌxOЂnE”`7‘]4‘]4ЁmD•a8ŽZ1•a8šf=ЂnEЄqH”c<‘dA~U5D?,ƒi–Ѕx–ЅxbjL +ЧЦЦЉЉЉШШШйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЯЯЯЎЎЎš•‘zV9Y;# +) *MиоРЅtNr"=kv˜Db~<~—YVy8Ut'_Of@  X""‰55‹77b'' 4%3"5#6"9&<(E1"C0 =*B.:'L1_?%„\=hIhIˆ_@{S3pH(yQ1{S3eEyV:hG-„\\3“_6А|SВ~UХ‘hК†]žjAi@™e<’^5К†]ЗƒZЈuLЁnG•c<…W2‡‡‡ŒŒŒˆˆˆˆˆˆ‰‰‰20.|N*œpKŸrN—jGˆ[7ˆ[8‰\9wL)pM1)˜mL}R0ƒX6‚V4}Q.“eAЄuQŸpK‘a;˜g@‘_8[3›h@ЌyPЛˆ_Ж„\–d=•d>Ž^9‹\7Ž`;ЃuP rM•e@mGŽ]7‹Z2“a;ІuMЕƒ\АXlE“b;ŒZ3”b;™g@А~WЊyQžlEЇvO’a:‹Z3‘`9ЅtMД‚[З…]­zRŸkC‘]4i@ŸkBЗƒZВ~UЅqHЋwNœh?’^5—c:А|SЗƒZСdЗƒZЃoFšf=›g>˜d;Ж‚ZЉxR’eA†\<80!ƒi–Ѕx–ЅxZ`FЧЧЦЉЉЉЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЯЯЯ­­­”Œ35!.+L’wЂ‡'Tg€T›i•Y"WY–b9•a8•a8ŸkBi@™e=xL)R6  +GGGМММИИИВВВЕЕЕДДД2/,zL)ƒV3„X5…Y6zO+hD(2\:4"!0 +uN1gE* I4xL)‚V3†Y5Ž_;‡W2Œ\6Œ[4†T,“`7jA™e<›g?˜e=“`9‡U.‘`9\5Ž]6‘`9ŒZ3–d=—e=ŠW/‘]5jAžkB—c;šf>–b:ˆU,ŸlC’^5•a8“_6]4ŸlC•a9’^6\4šg>ЁnEšf= lC˜d;Y0ЄpG•a8šf=’^5šf=—c:™e<’^5‘]4™e< lCŸkBЇsJšf=’^5i@˜d;œh@^7†X4sI(VQ9ƒi–Ѕx–Ѕx{‚^ ЧЧЦЊЊЊЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЮЮЮЌЌЌ“Œ .žjAЃoFЄpGЋwNІrIfD+ I4"Z>)ЛЛЛЗЗЗВВВДДДДДД30-`=Žb?”iFa?—lJxU: Hk?  V=)™kGЂsMЇwQ oHЁnGjBjA—c:ЂnEi@ЂnEЂoFЃpGЈuMЌyQЎ{SЏ|SА}TБ}TЊvMŸkBžjAœh? lC›g>ЄpGЂnEЅqH­yPЏ{RЏ{RА|SА|SЌxOЌxOЂnEšf=ŸkBœh?–b9ЁmDЊvMЅqHЋwNЎzQЎzQЕXБ}TЊvMЊvMЄpG—c:žjA +*S8$—iEЉvMЇvOЂsO–kH8=-ƒi–Ѕx–Ѕx|ƒ^ +ЗЗЗЋЋЋЩЩЩйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЮЮЮЌЌЌŒ‰2! +4D +fzU'Ty“mBwd”-E{n’RN0N…JpRR%Bkk†Jcx=;  M3АААЮЮЮ№№№љљљўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџППП???џџџџџџџџџџџџџџџџџџџџџџџџџџџvO/~R.Š^:qN31!(gF,ЗƒZЊvMЉuLЌxOЋwNЏ{R—c:gF, Y9 ›jBŸnGšiCМММЗЗЗГГГЕЕЕЕЕЕ31/‚V3‰^;ƒX6/"# 4M(Bc5   +1J&  ‡Z6ˆZ5oI™iC_8^5ЊxP­{S mF nGЈvO mF˜f>™g?šh@—e=ŠX1ЅsL mF™g?•c;œjBЎ|TЅsLЂoHЁnGЅsLœjBЁnG›iA•c;‹Y2ЃpIІtMЄqJ“a9“a9ГYЇuNЃpIœjBЇuNЁoHžlEœjB–c<’`8ЁnFЌyPŸkC™f=ŸkBМˆ_ЉuLІrI—iElL2&2"qK-†V1‹^; šž}CI5 +]@)653žžžЪЪЪйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЮЮЮЌЌЌ~zw "@­–ІДŸEn3‰Ѓ}2iFSyAˆšŠЃA|f–.˜ЎtLs)wˆYNk') ]A*ЛЛЛгггяяяјјјўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџППП???џџџџџџџџџџџџџџџџџџџџџџџџџџџшшшџџџ~V6™nL—iD“b;œi@„W2\B-0#ЈwPБ}TЏ{R­yP­yPŽdB(–e?ЕYŸnF_8’a:ПППКККЖЖЖИИИЗЗЗ30.’fB‹`=V4.!;W3Hk@ *- 2K+%'?'j—dDg=S8#–iF—iE^:™iE‘b=šjEЄuPЎZЂtOœnJ’d@˜iE“eA•gBa<šlHžpK’c?‘b>‰Z6›mIЂtPЊ{WoJžpK—iD•gB—iD˜iE_:šlHŸqL’d@‹]9‡Y4šlHЂsOЉzVЁrNŸqLšlH–hCœmI›mHŠ\7™jEЊzTœkE•c<™g?jBЗƒZП‹bГVЏ{RЌxOА|SБ}T~T31!K5%”fBƒW4€V5xX.$‚^BvT8'%$“““ЪЪЪйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЮЮЮЌЌЌRPNAVCOkCr‹TLq$ŽЇƒ3kI[‹5_€PCu-F=tƒЁ_Z:КФ“‰‚F!7 + I3#ПППдддюююјјјўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЏЏЏOOOџџџџџџџџџџџџџџџџџџџџџџџџџџџшшшџџџ„]?‚X7b>lEА}TЕXВ~UšlH6%bAЗƒZА|S˜kG,šiBГVjAŸnFЁpIІuNРРРМММЙЙЙЛЛЛИИИ41/šmJ‘eBŽdB~T3]A+Fk9;X2 +c’WOuF  ‘fD‡[8b>“fB”gBƒ[<•jI˜kH–jG‡\:‰^=˜nL’gF”jH…[9”jHˆ]<ƒX7Š`>Š`>ŽdB“iGeC”jHbAˆ]<—mKˆ]<’gF†\:–kJŽcB†\:Š`>…[9‘fEfDfD“iGfD‰^=–kJˆ]<‘fEˆ^<’gF{V:…[9•fB•e@ЊyRЌzRА}TВ~UЊvMЗƒZЋwNА|SЋwNЈtKЎ|SsN1/ ‹`>™lI–jH‹bB€Z=uQ4)'$“““ЪЪЪйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЮЮЮЌЌЌ…~* 9V-Ci 2\†Ђv3gW‹(J‚B}lš:b‘-BxŸДtQv1]~/u{XDK 2!СССдддэээјјјўўўџџџџџџџџџџџџџџџџџџ???ПППџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџъъъџџџoJ,zP0c@–e>—c;—c:—c:žjA“b<)‘`:\3:&sH'\3i@™f>lD˜g@˜g@РРРМММЙЙЙЛЛЛИИИ30-~P-zN,uM-?)4M'&9Pw=  +%7#MrD *wM+~R/‡Z7‹^:|O,Œ`=Œ^:”d>^7[3žjA˜d;•a8’^5˜d;ŒX/‘]4™f>•c;vQ47%Š\7…W3}R0xP1rL.*'&”””ЫЫЫйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЮЮЮnnn YURkJ0`C, "DЖž—}yšRЕХЂ—dƒ4:tL€ЁaТбš Д‚“šxŒ˜j.N .'!ZA.R6 ЧЧЧзззяяяјјјўўўџџџџџџџџџџџџџџџџџџ???ПППџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№№№џџџzU8‡^>—jGšjDЎ{R”`7i@™e<ŸkBbA)uK)8$—c:ГVЏ{RЉvMЄrK›iC oHРРРМММЙЙЙЛЛЛИИИ30-S/Š];    ' +$ + +;X2,B(^J sK+ŽcBc@•hE‹_<‡\9№№№ёёёѓѓѓѓѓѓєєєєєєѕѕѕѕѕѕіііііііііїїїїїїјјјјјјљљљљљљњњњњњњћћћћћћќќќќќќ§§§§§§ўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџdCdAЃtOŽ]6•b:›g>ЇsJi@‡S*™e<—c:ЌxOЌxOЉvMЉwOcD+I3"‰X3Š\8{Q0yQ1,*(•••ЫЫЫйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЯЯЯ^^^E?9mK0nL2 EvˆnNmˆ];ˆ_?№№№ёёёѓѓѓѓѓѓєєєєєєѕѕѕѕѕѕіііііііііїїїїїїјјјјјјљљљљљљњњњњњњћћћћћћќќќќќќ§§§§§§ўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџxR4ŠaA“gD“c> mFЃoFЁmDЁmD”`7–b9ŽZ1i@i@œh?ЉuLЏ{RЁpJ(•d>Œ_<V5.+)–––ЫЫЫйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЯЯЯcccE<5b?#X9!Ug.%> B-PaQ:p‰KhyESg<%Np‡fКУЖXrM'%%' ]<"OOO!!!ЯЯЯѓѓѓњњњўўўџџџџџџџџџџџџџџџџџџ???№№№џџџџџџџџџџџџџџџџџџџџџџџџYYYюююџџџџџџџџџџџџџџџџџџџџџџџџПППяяяiD'vL*†Y4]6•c:•b9’_6‘^5“`7…R)L#, Ž[2\3•b9’`8Œ[4Ž]7^8ПППЛЛЛЗЗЗИИИЗЗЗ0-,{N*T2|Q0J/    Ch>'"6 E,zO-|Q.}R.|R1vO/№№№ёёёѓѓѓѓѓѓєєєєєєѕѕѕѕѕѕіііііііііїїїїїїјјјјјјљљљљљљњњњњњњћћћћћћќќќќќќ§§§§§§ўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџiF)rK,€V4„V1Ž\4‘^5‡T+N%ŠW.{GŽ[2]4“`7\3—d;”a8—d;I0U7}P-wN-,*(–––ЫЫЫйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ёёёрррЯЯЯbbbI@9nL1sO4$ R t_FЙФДВО­–Ђ‘œ†?/ gH/fE+lK0iH.hG-8''...вввѕѕѕћћћўўўџџџџџџџџџџџџџџџџџџ???œœœ№№№џџџџџџџџџџџџџџџџџџџџџџџџfffюююџџџџџџџџџџџџџџџџџџџџџџџџџџџ///zT5Ša?‹];“b>mFŸnGЁpIЅtMЉxQЂqJlE EEEЗЗЗГГГЏЏЏАААЏЏЏ2/-’hFˆ^=‡^= /sM1 7&'?\9I1%*ŒbA‡\;Ša?|S4vP3№№№ђђђѓѓѓѓѓѓєєєєєєѕѕѕѕѕѕіііііііііїїїїїїјјјјјјљљљљљљњњњњњњћћћћћћќќќќќќ§§§§§§ўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџfE+uP3„[;Žb?ЃtNЇvOЅtMЂqJ™gAЅtMЄsLІuN›jDЃrK™gA™gAlE€X9/ ŽdBŠbB-+)•••ЫЫЫйййыыыњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§ђђђсссбббdddJB;€]B|Y=ƒ_CY@,@. V?-*079S E@ Sf$#0 iL6tUxV;|[?~\BvU:[A+дддїїїћћћўўўџџџџџџџџџџџџџџџџџџ???‚‚‚ёёёџџџџџџџџџџџџџџџџџџџџџџџџ???ГГГПППППППППППППППППППППППППППkM6ˆaC“jI•iGІyUЃuPЏ\ІwR›lGЅvQnI”e@‰Z5?-|X=Њ{VЂsNЇyU˜kGЄwTƒ^BŽŽŽЏЏЏЌЌЌЈЈЈЉЉЉЈЈЈ0.+fD–mMŠaB ‡`@ŽgH‡aCqS;„_B\A- zU9oI,**eE™pO’jIhJ‚]Aёёёђђђѓѓѓѓѓѓєєєєєєѕѕѕѕѕѕіііііііііїїїїїїјјјјјјљљљљљљњњњњњњћћћћћћќќќќќќ§§§§§§ўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџrR8€\@fGrQoK˜iD™jE—hC‹\7ЉzUЉzUЇxSЄuPЈyTЁrM­~YІwR­[ ‡^>ŠcD,)'•••ЭЭЭкккьььњњњџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§єєєхххжжжfffPF>}Y<~Y=~Y<}X:|X;vS7M5# (? + #6$$R;)kL2vU:wT8uQ6zW:wS7uR6xT9L5#/"  1$   +      2#cB(‰aAtR˜kI•gDžpK—iDЊ{WІxSЂtPЂsO rM’d@S<)<'žpKЂtPЈ{W˜kH—jG™mJ444ЎЎЎЎЎЎЋЋЋЈЈЈЉЉЉЈЈЈ1.,yO.‡^>bE/$†^>‡`Aƒ]>„]@€[=lN91#{U8pI,„^?rJ+\?‘fFfF‡`@~Y;ђђђђђђѓѓѓѓѓѓєєєєєєѕѕѕѕѕѕіііііііііїїїїїїјјјјјјљљљљљљњњњњњњћћћћћћќќќќќќ§§§§§§ўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџvT:vR4ŽgG‡];ЁtPfGškG rMЂsOžpKŠ[7ŸqL rM­Z rM™jFŸqL–hD)gI3ŒdE.+)™™™вввпппяяяћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўѕѕѕшшшмммkkk.,,VQLUOKVQNVQMTOKPLHOJG + @=:EB>1.+-*(IDBLGDNIFPLHRMIROJSOKTOKSNIOKHMIEKFCIFBIEAIEAIEAIEAIDBIDBIEAHDAHEAJFBIEAIDAHDAHCAHDAIDBIEBJFBIEBJFBJFBJFCIEBJFBJFCJFBJFBIFBLGDNJFRMITOKga\f`\c^Ye_[d^Yiiiiiigggfffffffff_ZV^XT_YU]XTZUQVRM PKGUPMXTO_YUd_[\VRŸŸŸйййуууёёёћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўїїїьььтттoooЅЅЅпппшшшєєєќќќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўљљљёёёшшштттоооииибббЬЬЬЬЬЬЬЬЬЫЫЫЩЩЩУУУПППЛЛЛЖЖЖВВВББББББГГГДДДЖЖЖЛЛЛРРРХХХЪЪЪЭЭЭЯЯЯЯЯЯЯЯЯЭЭЭЫЫЫЩЩЩЦЦЦУУУТТТТТТТТТУУУУУУУУУУУУУУУУУУУУУУУУУУУТТТТТТУУУУУУУУУФФФФФФХХХЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЧЧЧЪЪЪЭЭЭбббКККНННлллппптттуууууууууууууууууууууууууууеееЋЋЋуууууутттрррпппппппппппппппнннммммммлллкккииижжжЌЌЌИИИбббЯЯЯЭЭЭЫЫЫЪЪЪЩЩЩЩЩЩЪЪЪЪЪЪЫЫЫЬЬЬЯЯЯФФФЌЌЌееежжжвввЬЬЬЦЦЦТТТЛЛЛДДДЌЌЌЉЉЉЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЈЉЉЉЌЌЌДДДЛЛЛУУУЫЫЫвввккксссЙЙЙеееууууууууууууууууууууууууууууууууутттУУУБББееежжжйййнннрррхххэээііі§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўћћћѕѕѕююющщщцццрррлллжжждддгггвввЯЯЯЫЫЫШШШФФФСССНННММММММОООПППТТТЦЦЦЪЪЪЮЮЮвввдддииийййкккйййииизззжжждддггггггггггггггггггггггггггггггггггггггггггггггггддддддеееееежжжжжжжжжжжжжжжжжжзззиииккклллмммпппссстттуууууууууууууууууууууууууууууууууууууууууутттссссссссссссссссссрррпппппппппнннмммкккйййзззжжждддгггбббЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯбббвввгггддджжжииийййеееввваааЫЫЫЧЧЧТТТМММКККЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙКККМММТТТЧЧЧЬЬЬвввзззмммсссууууууууууууууууууууууууууууууууууууууутттрррнннмммнннрррфффшшшьььђђђјјјўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§§§јјјєєєёёёююющщщхххтттрррооонннйййееедддбббЭЭЭЫЫЫЪЪЪЫЫЫЫЫЫЬЬЬЯЯЯвввееейййлллнннррруууфффхххффффффуууттттттттттттттттттттттттттттттттттттттттттттттттттттттуууууууууууууууууууууууууууфффффффффхххххххххцццццццццццццццццццццццццццццццццццццццццццццццццццххххххххххххххххххххххххфффуууууусссрррпппннннннмммкккйййииизззззззззииийййккккккмммнннннноооооомммкккиииееевввЯЯЯЭЭЭЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЭЭЭЯЯЯгггжжжйййнннппптттхххццццццццццццццццццццццццццццццццццццццццццхххффффффцццщщщьььяяяђђђїїїћћћўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўў§§§ћћћљљљїїїѕѕѕєєєёёё№№№яяяьььъъъшшшцццфффтттррррррррррррссстттхххчччъъъыыыэээ№№№ёёёђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђёёёёёёёёёёёёёёёёёёёёёёёёёёё№№№№№№яяяяяяюююььььььыыыыыыъъъщщщшшшшшшшшшщщщъъъъъъъъъыыыыыыэээюююяяяюююююююююэээыыыъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъъыыыьььэээююю№№№ёёёёёёђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђђёёёёёёёёёђђђєєєіііјјјњњњћћћ§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўўўўўўў§§§§§§§§§§§§ќќќћћћљљљјјјїїїіііѕѕѕєєєєєєєєєєєєєєєѕѕѕіііјјјљљљњњњћћћќќќ§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ќќќћћћћћћњњњњњњљљљљљљљљљљљљљљљљљљљљљљљљљљљљљљњњњњњњћћћќќќќќќ§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўўўў§§§§§§§§§§§§ќќќќќќќќќќќќќќќ§§§§§§ўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ \ No newline at end of file diff --git a/tests/files/rgb-3c-8b.bmp b/tests/files/rgb-3c-8b.bmp new file mode 100644 index 0000000..e6a86dc Binary files /dev/null and b/tests/files/rgb-3c-8b.bmp differ diff --git a/tests/files/robots.txt b/tests/files/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/tests/files/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/tests/files/unicode.txt b/tests/files/unicode.txt new file mode 100644 index 0000000..642dd4f --- /dev/null +++ b/tests/files/unicode.txt @@ -0,0 +1,3 @@ +Polish: Ф„ Х ХЛ +Chinese: х€€ х€ х€‚ х€ƒ х€„ х€… х€† х€‡ х€ˆ +Musical Notes: т™Ќ т™Ћ т™Џ \ No newline at end of file diff --git a/tests/isBinaryFile/README.md b/tests/isBinaryFile/README.md new file mode 100644 index 0000000..5a10e89 --- /dev/null +++ b/tests/isBinaryFile/README.md @@ -0,0 +1,25 @@ +Test files borrowed from https://github.com/gjtorikian/isBinaryFile +by Garen J. Torikian + +Copyright (c) 2013 Garen Torikian + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/isBinaryFile/encodings/big5.txt b/tests/isBinaryFile/encodings/big5.txt new file mode 100644 index 0000000..1b35c0f --- /dev/null +++ b/tests/isBinaryFile/encodings/big5.txt @@ -0,0 +1 @@ +BIG5_TW ЂаЂзЂеЂДНsНXСcХщЄЄЄхДњИе diff --git a/tests/isBinaryFile/encodings/big5_B.txt b/tests/isBinaryFile/encodings/big5_B.txt new file mode 100644 index 0000000..a5d031c --- /dev/null +++ b/tests/isBinaryFile/encodings/big5_B.txt @@ -0,0 +1,22 @@ +OpenVPN HOWTO ЄЄЄхЊЉ +Ї@ЊЬЁGliyi ФЖ ЄхГЙЅXГBЁGopenvpn ЕoЅЌЎЩЖЁЁG2005-09-16 ТIРЛЁG3435 ІrХщЁG ЁiЄp ЄЄ ЄjЁj +OpenVPN HOWTO + +ЄЖВа +ІЙЄхРЩДy­zЄ@­гЈхЋЌЊКHomeЈьOfficeЊКГqЋHЄЄOpenVPNЊКАtИmЁCГoЅїHOWTOС|ЄFЄ@­гЇЙОуЊКАtИmЙъЈвЁAІbman pageЄтЅU­ЖЄЄІГЄ@­гЇѓЌАТВГцЊКЈвЄlЁC + +ІЙHOWTOЄхРЩСйІГІpЄUЎцІЁЁG + +PDF +PostScript + +ЊўЅ[ЊКЄхРЩ +ЈфЅLЊКЄ@ЈЧЋмІnЊКЄхРЩЄЮHOWTO ЌАЄЃІPРєЙвЄUАtИmOpenVPNІгЇ@ЁC + +АђЅЛЊКРGЙD(Tunnel)УўЋЌ +OpenVPNЅiЅHГаЋиЈтКиАђЅЛЊКРGЙDУўЋЌЁG + +Routed IP tunnels -- ОAЅЮЉѓЄЃЛнМsМНЊКТIЙяТIIP(point-to-point)ГqЋHЁCЄёА_ОєБЕКєЕИРGЙDЈгВЄХуБoЇѓІГЎФВvЈЧІгЅBЇѓЉіАtИmЁCІЙHOWTOЄхРЩВ[Л\ЄFRouted IP tunnelsЁC +Bridged Ethernet Tunnels(ОєБЕКєЕИРGЙD) -- ЏрЅЮЉѓIPЈѓФГЉЮЋDIPЈѓФГЊКРGЙDЁCГoКиУўЋЌЊКРGЙDЇѓОAІXЉѓЈЯЅЮМsМН(broadcast)ЊКРГЅЮЁAЄёІpЌYЈЧWindowsКєЕИДхРИЁCАtИmА_ЈгЕyЗLД_ТјЈЧЁCУіЉѓОєБЕКєЕИРGЙDЊКMini-HOWTOЁC +Routed IP tunnel HOWTO +Їк­ЬЗ|ЙСИеДy­zЄ@­гЇЙОуЊКЈtВЮАtИmЁAДСЖЁЏAЄЮЈьЈОЄѕР№ЁAVPNЁANATЅHЄЮЅL­ЬЉМІЙЖЁЊКЌлЄЌУіСpЁAЇк­ЬЄЃЗ|ЉtЅпЊКЄ@ГЁЄРЄ@ГЁЄРЊКБДАQVPNГ]ИmЁC diff --git a/tests/isBinaryFile/encodings/bom_utf-16.txt b/tests/isBinaryFile/encodings/bom_utf-16.txt new file mode 100644 index 0000000..83bd768 Binary files /dev/null and b/tests/isBinaryFile/encodings/bom_utf-16.txt differ diff --git a/tests/isBinaryFile/encodings/bom_utf-16le.txt b/tests/isBinaryFile/encodings/bom_utf-16le.txt new file mode 100644 index 0000000..0ac1e46 Binary files /dev/null and b/tests/isBinaryFile/encodings/bom_utf-16le.txt differ diff --git a/tests/isBinaryFile/encodings/bom_utf-32.txt b/tests/isBinaryFile/encodings/bom_utf-32.txt new file mode 100644 index 0000000..8804c33 Binary files /dev/null and b/tests/isBinaryFile/encodings/bom_utf-32.txt differ diff --git a/tests/isBinaryFile/encodings/bom_utf-32le.txt b/tests/isBinaryFile/encodings/bom_utf-32le.txt new file mode 100644 index 0000000..4950e14 Binary files /dev/null and b/tests/isBinaryFile/encodings/bom_utf-32le.txt differ diff --git a/tests/isBinaryFile/encodings/bom_utf-8.txt b/tests/isBinaryFile/encodings/bom_utf-8.txt new file mode 100644 index 0000000..da93914 --- /dev/null +++ b/tests/isBinaryFile/encodings/bom_utf-8.txt @@ -0,0 +1 @@ +яЛПUTF-8 chinese яМЕяМДяМІя̘ц МхМчš„фИ­ц–‡яМŒхŒ…хЋфИ­ц–‡ц ‡ч‚ЙчЌІхЗт€œт€у€‚чœ‹чœ‹шƒНфИшƒНчœ‹цИ…цЅš diff --git a/tests/isBinaryFile/encodings/test-gb.txt b/tests/isBinaryFile/encodings/test-gb.txt new file mode 100644 index 0000000..d48e3a9 --- /dev/null +++ b/tests/isBinaryFile/encodings/test-gb.txt @@ -0,0 +1 @@ +СЊЭЈ diff --git a/tests/isBinaryFile/encodings/test-gb2.txt b/tests/isBinaryFile/encodings/test-gb2.txt new file mode 100644 index 0000000..651769e --- /dev/null +++ b/tests/isBinaryFile/encodings/test-gb2.txt @@ -0,0 +1 @@ +СЊЭЈЭЈСЊЭЈЭЈСЌСЌ diff --git a/tests/isBinaryFile/encodings/test-kr.txt b/tests/isBinaryFile/encodings/test-kr.txt new file mode 100644 index 0000000..8d59bba --- /dev/null +++ b/tests/isBinaryFile/encodings/test-kr.txt @@ -0,0 +1 @@ +БзЗБЕЅ РЬЗИАд БЛРЬ БлРЛ ПУИЎАэРкЧЯДТ АЭРК diff --git a/tests/isBinaryFile/encodings/test-latin.txt b/tests/isBinaryFile/encodings/test-latin.txt new file mode 100644 index 0000000..688ea43 --- /dev/null +++ b/tests/isBinaryFile/encodings/test-latin.txt @@ -0,0 +1,18 @@ + +-*- coding: latin-1 -*- + +Mit freundlichen Grќпen +mit freundlichen Grќпen + +Das ist ein Фpfel. +Was kіnnen Sie jetzt machen? + +Machen wir eine мbung! +Worќber? +Darќber. + +Das ist euro: € +Euro: €! + +ЕClinux + diff --git a/tests/isBinaryFile/encodings/test-shishi.txt b/tests/isBinaryFile/encodings/test-shishi.txt new file mode 100644 index 0000000..f7afb0a --- /dev/null +++ b/tests/isBinaryFile/encodings/test-shishi.txt @@ -0,0 +1,2 @@ +ЪЉЪІЪЕЪЋЪП,ЪЖЪГЪЏЪЈЪЌЪЗ,ЪОЪЗЪЕ,ЪБЪАЪЎЪ­ЪКЪЊЪЏЪЈЪЌ,ЪМЪЙЪЏЪЈЪЌЪД,ЪЕЪЗЪЋ. +ЪЋЪІЪЇЪЈЪЉЪКЪЊЪЋЪПЪЋЪЌЪЎЪ­ЪЎЪЏЪАЪБЪВЪГЪДЪЕЪЖЪЗЪИЪЙЪКЪЛЪМЪНЪОЪЋЪП diff --git a/tests/isBinaryFile/encodings/test-utf16be.txt b/tests/isBinaryFile/encodings/test-utf16be.txt new file mode 100644 index 0000000..bc5cc2e Binary files /dev/null and b/tests/isBinaryFile/encodings/test-utf16be.txt differ diff --git a/tests/isBinaryFile/encodings/utf8cn.txt b/tests/isBinaryFile/encodings/utf8cn.txt new file mode 100644 index 0000000..3c0f00b --- /dev/null +++ b/tests/isBinaryFile/encodings/utf8cn.txt @@ -0,0 +1 @@ +UTF-8 chinese яМЕяМДяМІя̘ц МхМчš„фИ­ц–‡яМŒхŒ…хЋфИ­ц–‡ц ‡ч‚ЙчЌІхЗт€œт€у€‚чœ‹чœ‹шƒНфИшƒНчœ‹цИ…цЅš diff --git a/tests/isBinaryFile/encodings/utf_8.txt b/tests/isBinaryFile/encodings/utf_8.txt new file mode 100644 index 0000000..0c3dd90 --- /dev/null +++ b/tests/isBinaryFile/encodings/utf_8.txt @@ -0,0 +1 @@ +фИ­ц–‡ diff --git a/tests/isBinaryFile/grep b/tests/isBinaryFile/grep new file mode 100755 index 0000000..b66cf83 Binary files /dev/null and b/tests/isBinaryFile/grep differ diff --git a/tests/isBinaryFile/index.js b/tests/isBinaryFile/index.js new file mode 100644 index 0000000..2b468f8 --- /dev/null +++ b/tests/isBinaryFile/index.js @@ -0,0 +1,156 @@ +var assert = require("assert"); +var fs = require("fs"); +var path = require("path"); +var isBinaryFile = require("../index"); + +var FIXTURE_PATH = "./test/fixtures"; + +describe('isBinaryFile()', function() { + it('should return true on a binary program', function(cb) { + isBinaryFile(path.join(FIXTURE_PATH, "grep"), function (err, result) { + assert(result); + cb(); + }); + }); + + it('should return true on a binary program, accepting bytes & size', function(cb) { + var bytes = fs.readFileSync(path.join(FIXTURE_PATH, "grep")); + var size = fs.lstatSync(path.join(FIXTURE_PATH, "grep")).size; + + isBinaryFile(bytes, size, function (err, result) { + assert(result); + cb(); + }); + }); + + it('should return false on an extensionless script', function(cb) { + var bytes = fs.readFileSync(path.join(FIXTURE_PATH, "perl_script")); + var size = fs.lstatSync(path.join(FIXTURE_PATH, "perl_script")).size; + + isBinaryFile(bytes, size, function (err, result) { + assert(!result); + cb(); + }); + }); + + it('should return false on an extensionless script, accepting bytes & size', function(cb) { + isBinaryFile(path.join(FIXTURE_PATH, "perl_script"), function (err, result) { + assert(!result); + cb(); + }); + }); + + it('should return false on a russian text', function(cb) { + isBinaryFile(path.join(FIXTURE_PATH, "russian_file.rst"), function (err, result) { + assert(!result); + cb(); + }); + }); + + it('should return false on a zero-byte image file', function(cb) { + isBinaryFile(path.join(FIXTURE_PATH, "null_file.gif"), function (err, result) { + assert(!result); + cb(); + }); + }); + + it('should return true on a gif', function(cb) { + isBinaryFile(path.join(FIXTURE_PATH, "trunks.gif"), function (err, result) { + assert(result); + cb(); + }); + }); + + it('should return false on some UTF8 lua file', function(cb) { + isBinaryFile(path.join(FIXTURE_PATH, "no.lua"), function (err, result) { + assert(!result); + cb(); + }); + }); + + it('should return false on a directory', function(cb) { + isBinaryFile(path.join(FIXTURE_PATH, "dir"), function (err, result) { + assert(!err); + assert(!result); + cb(); + }); + }); + + it('should return true on a PDF', function(cb) { + isBinaryFile(path.join(FIXTURE_PATH, "pdf.pdf"), function (err, result) { + assert(result); + cb(); + }); + }); +}); + +describe('isBinaryFile.sync()', function() { + it('should return true on a binary program', function() { + assert(isBinaryFile.sync(path.join(FIXTURE_PATH, "grep"))); + + var bytes = fs.readFileSync(path.join(FIXTURE_PATH, "grep")); + var size = fs.lstatSync(path.join(FIXTURE_PATH, "grep")).size; + assert(isBinaryFile.sync(bytes, size)); + }); + + it('should return false on an extensionless text script', function() { + assert(!isBinaryFile.sync(path.join(FIXTURE_PATH, "perl_script"))); + + var bytes = fs.readFileSync(path.join(FIXTURE_PATH, "perl_script")); + var size = fs.lstatSync(path.join(FIXTURE_PATH, "perl_script")).size; + assert(!isBinaryFile.sync(bytes, size)); + }); + + it('should return false on a russian text', function() { + assert(!isBinaryFile.sync(path.join(FIXTURE_PATH, "russian_file.rst"))); + + var bytes = fs.readFileSync(path.join(FIXTURE_PATH, "russian_file.rst")); + var size = fs.lstatSync(path.join(FIXTURE_PATH, "russian_file.rst")).size; + assert(!isBinaryFile.sync(bytes, size)); + }); + + it('should return false on a zero-byte image file', function() { + assert(!isBinaryFile.sync(path.join(FIXTURE_PATH, "null_file.gif"))); + + var bytes = fs.readFileSync(path.join(FIXTURE_PATH, "null_file.gif")); + var size = fs.lstatSync(path.join(FIXTURE_PATH, "null_file.gif")).size; + assert(!isBinaryFile.sync(bytes, size)); + }); + + it('should return true on a gif', function() { + assert(isBinaryFile.sync(path.join(FIXTURE_PATH, "trunks.gif"))); + + var bytes = fs.readFileSync(path.join(FIXTURE_PATH, "trunks.gif")); + var size = fs.lstatSync(path.join(FIXTURE_PATH, "trunks.gif")).size; + assert(isBinaryFile.sync(bytes, size)); + }); + + it('should return false on some UTF8 lua file', function() { + assert(!isBinaryFile.sync(path.join(FIXTURE_PATH, "no.lua"))); + + var bytes = fs.readFileSync(path.join(FIXTURE_PATH, "no.lua")); + var size = fs.lstatSync(path.join(FIXTURE_PATH, "no.lua")).size; + assert(!isBinaryFile.sync(bytes, size)); + }); + + it('should return false on a directory', function() { + assert(!isBinaryFile.sync(path.join(FIXTURE_PATH, "dir"))); + }); + + it('should return true on a PDF', function() { + assert(isBinaryFile.sync(path.join(FIXTURE_PATH, "pdf.pdf"))); + + var bytes = fs.readFileSync(path.join(FIXTURE_PATH, "pdf.pdf")); + var size = fs.lstatSync(path.join(FIXTURE_PATH, "pdf.pdf")).size; + assert(isBinaryFile.sync(bytes, size)); + }); + + it('should return false for non-UTF8 files', function() { + encoding_dir = path.join(FIXTURE_PATH, "encodings") + files = fs.readdirSync(encoding_dir); + files.forEach(function(file) { + if (!/big5/.test(file) && !/gb/.test(file) && !/kr/.test(file)) + assert(!isBinaryFile.sync(path.join(encoding_dir, file))); + }); + }); +}); diff --git a/tests/isBinaryFile/no.lua b/tests/isBinaryFile/no.lua new file mode 100644 index 0000000..d44660b --- /dev/null +++ b/tests/isBinaryFile/no.lua @@ -0,0 +1,2 @@ +яМяМяМ +if table.get_length(baseObj.item_tbl) < 1 then return end diff --git a/tests/isBinaryFile/null_file.gif b/tests/isBinaryFile/null_file.gif new file mode 100644 index 0000000..e69de29 diff --git a/tests/isBinaryFile/pdf.pdf b/tests/isBinaryFile/pdf.pdf new file mode 100644 index 0000000..1a326b1 Binary files /dev/null and b/tests/isBinaryFile/pdf.pdf differ diff --git a/tests/isBinaryFile/perl_script b/tests/isBinaryFile/perl_script new file mode 100644 index 0000000..e861601 --- /dev/null +++ b/tests/isBinaryFile/perl_script @@ -0,0 +1,2 @@ +#!/usr/bin/perl + print "Hello World.\n"; \ No newline at end of file diff --git a/tests/isBinaryFile/russian_file.rst b/tests/isBinaryFile/russian_file.rst new file mode 100644 index 0000000..1e7cce4 --- /dev/null +++ b/tests/isBinaryFile/russian_file.rst @@ -0,0 +1,49 @@ +аžаБб‰аИаЕ баВаЕаДаЕаНаИб аО аПб€аОаГб€аАаМаМаНаОаМ аКаОаМаПаЛаЕаКбаЕ +************************************** +test + +ааАаЗаНаАб‡аЕаНаИаЕ аПб€аОаГб€аАаМаМаНаОаГаО аКаОаМаПаЛаЕаКбаА +================================= + +аЄбƒаНаКб†аИаИ аПб€аОаГб€аАаМаМаНаОаГаО аКаОаМаПаЛаЕаКбаА +============================== + +аЂб€аЕаБаОаВаАаНаИб аК аМаИаНаИаМаАаЛбŒаНаОаМбƒ баОбб‚аАаВбƒ аАаПаПаАб€аАб‚аНб‹б… бб€аЕаДбб‚аВ +==================================================== +.. аЁаВаЕаДаЕаНаИб аО бб€аЕаДбб‚аВаАб…, аОаБаЕбаПаЕб‡аИаВаАбŽб‰аИб… аВб‹аПаОаЛаНаЕаНаИаЕ аПб€аОаГб€аАаМаМб‹. + +аЂб€аЕаБаОаВаАаНаИб аК аМаИаНаИаМаАаЛбŒаНаОаМбƒ баОбб‚аАаВбƒ аПб€аОаГб€аАаМаМаНб‹б… бб€аЕаДбб‚аВ +===================================================== +.. аЁаВаЕаДаЕаНаИб аО бб€аЕаДбб‚аВаАб…, аОаБаЕбаПаЕб‡аИаВаАбŽб‰аИб… аВб‹аПаОаЛаНаЕаНаИаЕ аПб€аОаГб€аАаМаМб‹. + +аЂб€аЕаБаОаВаАаНаИб аК аПаЕб€баОаНаАаЛбƒ (баИбб‚аЕаМаНаОаМбƒ аПб€аОаГб€аАаМаМаИбб‚бƒ) +================================================ + +аЁб‚б€бƒаКб‚бƒб€аА аПб€аОаГб€аАаМаМаНаОаГаО аКаОаМаПаЛаЕаКбаА +******************************** +.. аЁаВаЕаДаЕаНаИб аО бб‚б€бƒаКб‚бƒб€аЕ аПб€аОаГб€аАаМаМб‹, аЕаЕ баОбб‚аАаВаНб‹б… б‡аАбб‚бб…, аО баВбаЗбб… аМаЕаЖаДбƒ +.. баОбб‚аАаВаНб‹аМаИ б‡аАбб‚баМаИ аИ аО баВбаЗбб… б аДб€бƒаГаИаМаИ аПб€аОаГб€аАаМаМаАаМаИ. + +ааАбб‚б€аОаЙаКаА аПб€аОаГб€аАаМаМаНаОаГаО аКаОаМаПаЛаЕаКбаА +******************************** + +ааАбб‚б€аОаЙаКаА аНаА баОбб‚аАаВ б‚аЕб…аНаИб‡аЕбаКаИб… бб€аЕаДбб‚аВ +======================================= +.. аžаПаИбаАаНаИаЕ аДаЕаЙбб‚аВаИаЙ аПаО аНаАбб‚б€аОаЙаКаЕ аПб€аОаГб€аАаМаМаНаОаГаО аКаОаМаПаЛаЕаКбаА аНаА бƒбаЛаОаВаИб аКаОаНаКб€аЕб‚аНаОаГаО аПб€аИаМаЕаНаЕаНаИб. + +ааАбб‚б€аОаЙаКаА аНаА баОбб‚аАаВ аПб€аОаГб€аАаМаМаНб‹б… бб€аЕаДбб‚аВ +======================================= +.. аžаПаИбаАаНаИаЕ аДаЕаЙбб‚аВаИаЙ аПаО аНаАбб‚б€аОаЙаКаЕ аПб€аОаГб€аАаМаМаНаОаГаО аКаОаМаПаЛаЕаКбаА аНаА бƒбаЛаОаВаИб аКаОаНаКб€аЕб‚аНаОаГаО +.. аПб€аИаМаЕаНаЕаНаИб. + +аŸб€аОаВаЕб€аКаА аПб€аОаГб€аАаМаМаНаОаГаО аКаОаМаПаЛаЕаКбаА +******************************* +.. аžаПаИбаАаНаИаЕ баПаОбаОаБаОаВ аПб€аОаВаЕб€аКаИ, аПаОаЗаВаОаЛббŽб‰аИб… аДаАб‚бŒ аОаБб‰аЕаЕ аЗаАаКаЛбŽб‡аЕаНаИаЕ аО +.. б€аАаБаОб‚аОбаПаОбаОаБаНаОбб‚аИ аПб€аОаГб€аАаМаМаНаОаГаО аКаОаМаПаЛаЕаКбаА (аКаОаНб‚б€аОаЛбŒаНб‹аЕ аПб€аИаМаЕб€б‹, аМаЕб‚аОаДб‹ аПб€аОаГаОаНаА, +.. б€аЕаЗбƒаЛбŒб‚аАб‚б‹). + +аЁаОаОаБб‰аЕаНаИб баИбб‚аЕаМаНаОаМбƒ аПб€аОаГб€аАаМаМаИбб‚бƒ +********************************* +.. аЂаЕаКбб‚б‹ баОаОаБб‰аЕаНаИаЙ, аВб‹аДаАаВаАаЕаМб‹б… аВ б…аОаДаЕ аВб‹аПаОаЛаНаЕаНаИб аНаАбб‚б€аОаЙаКаИ, аПб€аОаВаЕб€аКаИ +.. аПб€аОаГб€аАаМаМб‹, аА б‚аАаКаЖаЕ аВ б…аОаДаЕ аВб‹аПаОаЛаНаЕаНаИб аПб€аОаГб€аАаМаМб‹, аОаПаИбаАаНаИаЕ аИб… баОаДаЕб€аЖаАаНаИб аИ +.. аДаЕаЙбб‚аВаИаЙ, аКаОб‚аОб€б‹аЕ аНаЕаОаБб…аОаДаИаМаО аПб€аЕаДаПб€аИаНбб‚бŒ аПаО бб‚аИаМ баОаОаБб‰аЕаНаИбаМ. diff --git a/tests/isBinaryFile/trunks.gif b/tests/isBinaryFile/trunks.gif new file mode 100644 index 0000000..32d004c Binary files /dev/null and b/tests/isBinaryFile/trunks.gif differ diff --git a/tests/test_check.py b/tests/test_check.py new file mode 100755 index 0000000..338119e --- /dev/null +++ b/tests/test_check.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +test_binaryornot +------------------ + +Tests for `binaryornot` module. +""" + +import logging +try: + from unittest.case import expectedFailure + import unittest +except ImportError: + from unittest2.case import expectedFailure + import unittest2 as unittest + +import os +from contextlib import contextmanager +from tempfile import mkstemp + +from hypothesis import given +from hypothesis.strategies import binary + +from binaryornot.check import is_binary + + +logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO) + + +class TestIsBinary(unittest.TestCase): + + def test_empty(self): + self.assertFalse(is_binary('tests/files/empty.txt')) + + def test_css(self): + self.assertFalse(is_binary('tests/files/bootstrap-glyphicons.css')) + + def test_json(self): + self.assertFalse(is_binary('tests/files/cookiecutter.json')) + + def test_triggers_decoding_error(self): + self.assertTrue(is_binary('tests/files/decoding-error')) + + def test_triggers_lookup_error(self): + self.assertTrue(is_binary('tests/files/lookup-error')) + + def test_png(self): + self.assertTrue(is_binary('tests/files/logo.png')) + + def test_gif(self): + self.assertTrue(is_binary('tests/files/lena.gif')) + + def test_jpg(self): + self.assertTrue(is_binary('tests/files/lena.jpg')) + + def test_tiff(self): + self.assertTrue(is_binary('tests/files/palette-1c-8b.tiff')) + + def test_bmp(self): + self.assertTrue(is_binary('tests/files/rgb-3c-8b.bmp')) + + def test_ds_store(self): + self.assertTrue(is_binary('tests/files/.DS_Store')) + + def test_eot(self): + self.assertTrue( + is_binary('tests/files/glyphiconshalflings-regular.eot')) + + def test_otf(self): + self.assertTrue( + is_binary('tests/files/glyphiconshalflings-regular.otf')) + + def test_svg(self): + self.assertFalse( + is_binary('tests/files/glyphiconshalflings-regular.svg')) + + def test_ttf(self): + self.assertTrue( + is_binary('tests/files/glyphiconshalflings-regular.ttf')) + + def test_woff(self): + self.assertTrue( + is_binary('tests/files/glyphiconshalflings-regular.woff')) + + def test_txt(self): + self.assertFalse(is_binary('tests/files/robots.txt')) + + def test_txt_unicode(self): + self.assertFalse(is_binary('tests/files/unicode.txt')) + + def test_text_js(self): + self.assertFalse(is_binary('tests/isBinaryFile/index.js')) + + def test_binary_gif2(self): + self.assertFalse(is_binary('tests/isBinaryFile/null_file.gif')) + + def test_binary_gif3(self): + self.assertTrue(is_binary('tests/isBinaryFile/trunks.gif')) + + def test_text_lua(self): + self.assertFalse(is_binary('tests/isBinaryFile/no.lua')) + + @expectedFailure + def test_binary_pdf2(self): + self.assertTrue(is_binary('tests/isBinaryFile/pdf.pdf')) + + def test_text_perl2(self): + self.assertFalse(is_binary('tests/isBinaryFile/perl_script')) + + def test_text_russian2(self): + self.assertFalse(is_binary('tests/isBinaryFile/russian_file.rst')) + + def test_binary_exe2(self): + self.assertTrue(is_binary('tests/isBinaryFile/grep')) + + def test_text_utf16(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/bom_utf-16.txt')) + + def test_text_utf16le(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/bom_utf-16le.txt')) + + def test_text_utf16be(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/test-utf16be.txt')) + + def test_text_utf32le(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/bom_utf-32le.txt')) + + def test_text_utf82(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/utf_8.txt')) + + def test_text_gb2(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/test-gb2.txt')) + + def test_text_kr(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/test-kr.txt')) + + def test_text_latin(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/test-latin.txt')) + + def test_text_big5(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/big5.txt')) + + def test_text_gb(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/test-gb.txt')) + + def test_text_utf32(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/bom_utf-32.txt')) + + def test_text_utf8(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/bom_utf-8.txt')) + + def test_text_big5b(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/big5_B.txt')) + + def test_text_shishi(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/test-shishi.txt')) + + def test_text_utfcn(self): + self.assertFalse(is_binary('tests/isBinaryFile/encodings/utf8cn.txt')) + + def test_binary_rgb_stream(self): + self.assertTrue(is_binary('tests/files/pixelstream.rgb')) + + +@contextmanager +def bytes_in_file(data): + o, f = mkstemp() + try: + os.write(o, data) + os.close(o) + yield f + finally: + os.unlink(f) + + +class TestDetectionProperties(unittest.TestCase): + @given(binary(average_size=512)) + def test_never_crashes(self, data): + with bytes_in_file(data) as f: + is_binary(f) + + +if __name__ == '__main__': + unittest.main() diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..5c8318a --- /dev/null +++ b/tox.ini @@ -0,0 +1,7 @@ +[tox] +envlist = py26, py27, py33, py34, pypy + +[testenv] +setenv = + PYTHONPATH = {toxinidir}:{toxinidir}/binaryornot +commands = python setup.py test -- cgit v1.2.3